From 098426c76f01e2e870c473a6f95577f3ee4fc978 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 5 Feb 2025 14:02:53 +0200 Subject: [PATCH 1/5] export tree shaked from index --- src/index.ts | 670 ++++++++++++++++++++++++++++----------------------- 1 file changed, 367 insertions(+), 303 deletions(-) diff --git a/src/index.ts b/src/index.ts index 9a47049..9296f0e 100755 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,17 @@ "use strict"; -import * as util from "./util"; -// import CSSMatrix from "@thednp/dommatrix"; +import CSSMatrix from "@thednp/dommatrix"; +import * as arcTools from "./math/arcTools"; +import * as bezierTools from "./math/bezier"; +import * as cubicTools from "./math/cubicTools"; +import * as lineTools from "./math/lineTools"; +import * as quadTools from "./math/quadTools"; +import * as polygonTools from "./math/polygonTools"; + +import distanceSquareRoot from "./math/distanceSquareRoot"; +import midPoint from "./math/midPoint"; +import rotateVector from "./math/rotateVector"; +import roundTo from "./math/roundTo"; + import type { PathArray, PointTuple, TransformObjectValues } from "./types"; import type { Options, TransformEntries, TransformObject } from "./interface"; export * from "./types"; @@ -11,80 +22,65 @@ import pathToAbsolute from "./convert/pathToAbsolute"; import pathToRelative from "./convert/pathToRelative"; import pathToCurve from "./convert/pathToCurve"; import pathToString from "./convert/pathToString"; -// import * as arcTools from "./math/arcTools"; -// import * as bezierTools from "./math/bezier"; -// import * as cubicTools from "./math/cubicTools"; -// import * as lineTools from "./math/lineTools"; -// import * as quadTools from "./math/quadTools"; -// import * as polygonTools from "./math/polygonTools"; - -// import distanceSquareRoot from "./math/distanceSquareRoot"; -// import midPoint from "./math/midPoint"; -// import rotateVector from "./math/rotateVector"; -// import roundTo from "./math/roundTo"; import error from "./parser/error"; import parsePathString from "./parser/parsePathString"; -// import finalizeSegment from "./parser/finalizeSegment"; -// import invalidPathValue from "./parser/invalidPathValue"; -// import isArcCommand from "./parser/isArcCommand"; -// import isDigit from "./parser/isDigit"; -// import isDigitStart from "./parser/isDigitStart"; -// import isMoveCommand from "./parser/isMoveCommand"; -// import isPathCommand from "./parser/isPathCommand"; -// import isSpace from "./parser/isSpace"; -// import paramsCount from "./parser/paramsCount"; -// import paramsParser from "./parser/paramsParser"; -// import pathParser from "./parser/pathParser"; -// import scanFlag from "./parser/scanFlag"; -// import scanParam from "./parser/scanParam"; -// import scanSegment from "./parser/scanSegment"; -// import skipSpaces from "./parser/skipSpaces"; - -// import distanceEpsilon from "./util/distanceEpsilon"; -// import getClosestPoint from "./util/getClosestPoint"; -// import getDrawDirection from "./util/getDrawDirection"; -// import getPathArea from "./util/getPathArea"; +import finalizeSegment from "./parser/finalizeSegment"; +import invalidPathValue from "./parser/invalidPathValue"; +import isArcCommand from "./parser/isArcCommand"; +import isDigit from "./parser/isDigit"; +import isDigitStart from "./parser/isDigitStart"; +import isMoveCommand from "./parser/isMoveCommand"; +import isPathCommand from "./parser/isPathCommand"; +import isSpace from "./parser/isSpace"; +import paramsCount from "./parser/paramsCount"; +import paramsParser from "./parser/paramsParser"; +import pathParser from "./parser/pathParser"; +import scanFlag from "./parser/scanFlag"; +import scanParam from "./parser/scanParam"; +import scanSegment from "./parser/scanSegment"; +import skipSpaces from "./parser/skipSpaces"; import getPathBBox from "./util/getPathBBox"; -import getPointAtLength from "./util/getPointAtLength"; -// import getPropertiesAtLength from "./util/getPropertiesAtLength"; -// import getPropertiesAtPoint from "./util/getPropertiesAtPoint"; -// import getSegmentAtLength from "./util/getSegmentAtLength"; -// import getSegmentOfPoint from "./util/getSegmentOfPoint"; import getTotalLength from "./util/getTotalLength"; - -// import isAbsoluteArray from "./util/isAbsoluteArray"; -// import isCurveArray from "./util/isCurveArray"; -// import isNormalizedArray from "./util/isNormalizedArray"; -// import isPathArray from "./util/isPathArray"; -// import isPointInStroke from "./util/isPointInStroke"; -// import isRelativeArray from "./util/isRelativeArray"; -// import isValidPath from "./util/isValidPath"; -// import shapeParams from "./util/shapeParams"; -// import shapeToPath from "./util/shapeToPath"; -// import shapeToPathArray from "./util/shapeToPathArray"; - -// import absolutizeSegment from "./process/absolutizeSegment"; -// import arcToCubic from "./process/arcToCubic"; -// import getSVGMatrix from "./process/getSVGMatrix"; -// import iterate from "./process/iterate"; -// import lineToCubic from "./process/lineToCubic"; +import distanceEpsilon from "./util/distanceEpsilon"; +import getClosestPoint from "./util/getClosestPoint"; +import getDrawDirection from "./util/getDrawDirection"; +import getPathArea from "./util/getPathArea"; +import getPointAtLength from "./util/getPointAtLength"; +import getPropertiesAtLength from "./util/getPropertiesAtLength"; +import getPropertiesAtPoint from "./util/getPropertiesAtPoint"; +import getSegmentAtLength from "./util/getSegmentAtLength"; +import getSegmentOfPoint from "./util/getSegmentOfPoint"; +import isAbsoluteArray from "./util/isAbsoluteArray"; +import isCurveArray from "./util/isCurveArray"; +import isNormalizedArray from "./util/isNormalizedArray"; +import isPathArray from "./util/isPathArray"; +import isPointInStroke from "./util/isPointInStroke"; +import isRelativeArray from "./util/isRelativeArray"; +import isValidPath from "./util/isValidPath"; +import shapeParams from "./util/shapeParams"; +import shapeToPath from "./util/shapeToPath"; +import shapeToPathArray from "./util/shapeToPathArray"; import normalizePath from "./process/normalizePath"; -// import normalizeSegment from "./process/normalizeSegment"; import optimizePath from "./process/optimizePath"; -// import projection2d from "./process/projection2d"; -// import quadToCubic from "./process/quadToCubic"; -// import relativizeSegment from "./process/relativizeSegment"; -// import reverseCurve from "./process/reverseCurve"; import reversePath from "./process/reversePath"; -// import roundPath from "./process/roundPath"; -// import roundSegment from "./process/roundSegment"; -// import segmentToCubic from "./process/segmentToCubic"; -// import shortenSegment from "./process/shortenSegment"; -// import splitCubic from "./process/splitCubic"; import splitPath from "./process/splitPath"; import transformPath from "./process/transformPath"; - +import absolutizeSegment from "./process/absolutizeSegment"; +import arcToCubic from "./process/arcToCubic"; +import getSVGMatrix from "./process/getSVGMatrix"; +import iterate from "./process/iterate"; +import lineToCubic from "./process/lineToCubic"; +import normalizeSegment from "./process/normalizeSegment"; +import projection2d from "./process/projection2d"; +import quadToCubic from "./process/quadToCubic"; +import relativizeSegment from "./process/relativizeSegment"; +import reverseCurve from "./process/reverseCurve"; +import roundPath from "./process/roundPath"; +import roundSegment from "./process/roundSegment"; +import segmentToCubic from "./process/segmentToCubic"; +import shortenSegment from "./process/shortenSegment"; +import splitCubic from "./process/splitCubic"; /** * Creates a new SVGPathCommander instance with the following properties: * * segments: `pathArray` @@ -112,7 +108,7 @@ class SVGPathCommander { if (undefPath || !pathValue.length) { throw TypeError( - `${error}: "pathValue" is ${undefPath ? "undefined" : "empty"}`, + `${error}: "pathValue" is ${undefPath ? "undefined" : "empty"}` ); } @@ -232,11 +228,11 @@ class SVGPathCommander { const absoluteMultiPath = subPath ? subPath.map((x, i) => { - if (onlySubpath) { - return i ? reversePath(x) : x.slice(0); - } - return reversePath(x); - }) + if (onlySubpath) { + return i ? reversePath(x) : x.slice(0); + } + return reversePath(x); + }) : segments.slice(0); let path = [] as unknown as PathArray; @@ -307,8 +303,11 @@ class SVGPathCommander { if (k === "skew" && Array.isArray(v)) { transform[k] = v.map(Number) as PointTuple; } else if ( - (k === "rotate" || k === "translate" || k === "origin" || - k === "scale") && Array.isArray(v) + (k === "rotate" || + k === "translate" || + k === "origin" || + k === "scale") && + Array.isArray(v) ) { transform[k] = v.map(Number) as [number, number, number]; } else if (k !== "origin" && typeof Number(v) === "number") { @@ -377,234 +376,299 @@ class SVGPathCommander { dispose() { Object.keys(this).forEach((key) => delete this[key as keyof typeof this]); } + + static get CSSMatrix() { + return CSSMatrix; + } + static get arcTools() { + return arcTools; + } + static get bezierTools() { + return bezierTools; + } + + static get cubicTools() { + return cubicTools; + } + static get lineTools() { + return lineTools; + } + static get polygonTools() { + return polygonTools; + } + static get quadTools() { + return quadTools; + } + static get pathToAbsolute() { + return pathToAbsolute; + } + static get pathToRelative() { + return pathToRelative; + } + static get pathToCurve() { + return pathToCurve; + } + static get pathToString() { + return pathToString; + } + static get distanceSquareRoot() { + return distanceSquareRoot; + } + static get midPoint() { + return midPoint; + } + static get rotateVector() { + return rotateVector; + } + static get roundTo() { + return roundTo; + } + static get parsePathString() { + return parsePathString; + } + static get finalizeSegment() { + return finalizeSegment; + } + static get invalidPathValue() { + return invalidPathValue; + } + static get isArcCommand() { + return isArcCommand; + } + static get isDigit() { + return isDigit; + } + static get isDigitStart() { + return isDigitStart; + } + static get isMoveCommand() { + return isMoveCommand; + } + static get isPathCommand() { + return isPathCommand; + } + static get isSpace() { + return isSpace; + } + static get paramsCount() { + return paramsCount; + } + static get paramsParser() { + return paramsParser; + } + static get pathParser() { + return pathParser; + } + static get scanFlag() { + return scanFlag; + } + static get scanParam() { + return scanParam; + } + static get scanSegment() { + return scanSegment; + } + static get skipSpaces() { + return skipSpaces; + } + static get distanceEpsilon() { + return distanceEpsilon; + } + static get getClosestPoint() { + return getClosestPoint; + } + static get getDrawDirection() { + return getDrawDirection; + } + static get getPathArea() { + return getPathArea; + } + static get getPathBBox() { + return getPathBBox; + } + static get getPointAtLength() { + return getPointAtLength; + } + static get getPropertiesAtLength() { + return getPropertiesAtLength; + } + static get getPropertiesAtPoint() { + return getPropertiesAtPoint; + } + static get getSegmentAtLength() { + return getSegmentAtLength; + } + static get getSegmentOfPoint() { + return getSegmentOfPoint; + } + static get getTotalLength() { + return getTotalLength; + } + static get isAbsoluteArray() { + return isAbsoluteArray; + } + static get isCurveArray() { + return isCurveArray; + } + static get isNormalizedArray() { + return isNormalizedArray; + } + static get isPathArray() { + return isPathArray; + } + static get isPointInStroke() { + return isPointInStroke; + } + static get isRelativeArray() { + return isRelativeArray; + } + static get isValidPath() { + return isValidPath; + } + static get shapeParams() { + return shapeParams; + } + static get shapeToPath() { + return shapeToPath; + } + static get shapeToPathArray() { + return shapeToPathArray; + } + static get absolutizeSegment() { + return absolutizeSegment; + } + static get arcToCubic() { + return arcToCubic; + } + static get getSVGMatrix() { + return getSVGMatrix; + } + static get iterate() { + return iterate; + } + static get lineToCubic() { + return lineToCubic; + } + static get normalizePath() { + return normalizePath; + } + static get normalizeSegment() { + return normalizeSegment; + } + static get optimizePath() { + return optimizePath; + } + static get projection2d() { + return projection2d; + } + static get quadToCubic() { + return quadToCubic; + } + static get relativizeSegment() { + return relativizeSegment; + } + static get reverseCurve() { + return reverseCurve; + } + static get reversePath() { + return reversePath; + } + static get roundPath() { + return roundPath; + } + static get roundSegment() { + return roundSegment; + } + static get segmentToCubic() { + return segmentToCubic; + } + static get shortenSegment() { + return shortenSegment; + } + static get splitCubic() { + return splitCubic; + } + static get splitPath() { + return splitPath; + } + static get transformPath() { + return transformPath; + } } -// export { -// absolutizeSegment, -// arcToCubic, -// arcTools, -// bezierTools, -// CSSMatrix, -// cubicTools, -// distanceEpsilon, -// distanceSquareRoot, -// finalizeSegment, -// getClosestPoint, -// getDrawDirection, -// getPathArea, -// getPathBBox, -// getPointAtLength, -// getPropertiesAtLength, -// getPropertiesAtPoint, -// getSegmentAtLength, -// getSegmentOfPoint, -// getSVGMatrix, -// getTotalLength, -// invalidPathValue, -// isAbsoluteArray, -// isArcCommand, -// isCurveArray, -// isDigit, -// isDigitStart, -// isMoveCommand, -// isNormalizedArray, -// isPathArray, -// isPathCommand, -// isPointInStroke, -// isRelativeArray, -// isSpace, -// isValidPath, -// iterate, -// lineToCubic, -// lineTools, -// midPoint, -// normalizePath, -// normalizeSegment, -// optimizePath, -// paramsCount, -// paramsParser, -// parsePathString, -// pathParser, -// pathToAbsolute, -// pathToCurve, -// pathToRelative, -// pathToString, -// polygonTools, -// projection2d, -// quadToCubic, -// quadTools, -// relativizeSegment, -// reverseCurve, -// reversePath, -// rotateVector, -// roundPath, -// roundSegment, -// roundTo, -// scanFlag, -// scanParam, -// scanSegment, -// segmentToCubic, -// shapeParams, -// shapeToPath, -// shapeToPathArray, -// shortenSegment, -// skipSpaces, -// splitCubic, -// splitPath, -// // SVGPathCommander as default, -// transformPath, -// }; - -// const index = { -// absolutizeSegment, -// arcToCubic, -// arcTools, -// bezierTools, -// CSSMatrix, -// cubicTools, -// distanceEpsilon, -// distanceSquareRoot, -// finalizeSegment, -// getClosestPoint, -// getDrawDirection, -// getPathArea, -// getPathBBox, -// getPointAtLength, -// getPropertiesAtLength, -// getPropertiesAtPoint, -// getSegmentAtLength, -// getSegmentOfPoint, -// getSVGMatrix, -// getTotalLength, -// invalidPathValue, -// isAbsoluteArray, -// isArcCommand, -// isCurveArray, -// isDigit, -// isDigitStart, -// isMoveCommand, -// isNormalizedArray, -// isPathArray, -// isPathCommand, -// isPointInStroke, -// isRelativeArray, -// isSpace, -// isValidPath, -// iterate, -// lineToCubic, -// lineTools, -// midPoint, -// normalizePath, -// normalizeSegment, -// optimizePath, -// paramsCount, -// paramsParser, -// parsePathString, -// pathParser, -// pathToAbsolute, -// pathToCurve, -// pathToRelative, -// pathToString, -// polygonTools, -// projection2d, -// quadToCubic, -// quadTools, -// relativizeSegment, -// reverseCurve, -// reversePath, -// rotateVector, -// roundPath, -// roundSegment, -// roundTo, -// scanFlag, -// scanParam, -// scanSegment, -// segmentToCubic, -// shapeParams, -// shapeToPath, -// shapeToPathArray, -// shortenSegment, -// skipSpaces, -// splitCubic, -// splitPath, -// transformPath, -// }; - -// export { absolutizeSegment } -// export { arcToCubic } -// export { arcTools } -// export { bezierTools } -// export { CSSMatrix } -// export { cubicTools } -// export { distanceEpsilon } -// export { distanceSquareRoot } -// export { finalizeSegment } -// export { getClosestPoint } -// export { getDrawDirection } -// export { getPathArea } -// export { getPathBBox } -// export { getPointAtLength } -// export { getPropertiesAtLength } -// export { getPropertiesAtPoint } -// export { getSegmentAtLength } -// export { getSegmentOfPoint } -// export { getSVGMatrix } -// export { getTotalLength } -// export { invalidPathValue } -// export { isAbsoluteArray } -// export { isArcCommand } -// export { isCurveArray } -// export { isDigit } -// export { isDigitStart } -// export { isMoveCommand } -// export { isNormalizedArray } -// export { isPathArray } -// export { isPathCommand } -// export { isPointInStroke } -// export { isRelativeArray } -// export { isSpace } -// export { isValidPath } -// export { iterate } -// export { lineToCubic } -// export { lineTools } -// export { midPoint } -// export { normalizePath } -// export { normalizeSegment } -// export { optimizePath } -// export { paramsCount } -// export { paramsParser } -// export { parsePathString } -// export { pathParser } -// export { pathToAbsolute } -// export { pathToCurve } -// export { pathToRelative } -// export { pathToString } -// export { polygonTools } -// export { projection2d } -// export { quadToCubic } -// export { quadTools } -// export { relativizeSegment } -// export { reverseCurve } -// export { reversePath } -// export { rotateVector } -// export { roundPath } -// export { roundSegment } -// export { roundTo } -// export { scanFlag } -// export { scanParam } -// export { scanSegment } -// export { segmentToCubic } -// export { shapeParams } -// export { shapeToPath } -// export { shapeToPathArray } -// export { shortenSegment } -// export { skipSpaces } -// export { splitCubic } -// export { splitPath } -// export { transformPath } -// export { SVGPathCommander as default } -// export default SVGPathCommander; -const defaultExport = Object.assign(SVGPathCommander, util); - -export { defaultExport as default }; -// export default Object.assign(SVGPathCommander, index); +export default SVGPathCommander; + +export { + CSSMatrix, + arcTools, + bezierTools, + cubicTools, + lineTools, + polygonTools, + quadTools, + pathToAbsolute, + pathToRelative, + pathToCurve, + pathToString, + distanceSquareRoot, + midPoint, + rotateVector, + roundTo, + parsePathString, + finalizeSegment, + invalidPathValue, + isArcCommand, + isDigit, + isDigitStart, + isMoveCommand, + isPathCommand, + isSpace, + paramsCount, + paramsParser, + pathParser, + scanFlag, + scanParam, + scanSegment, + skipSpaces, + distanceEpsilon, + getClosestPoint, + getDrawDirection, + getPathArea, + getPathBBox, + getPointAtLength, + getPropertiesAtLength, + getPropertiesAtPoint, + getSegmentAtLength, + getSegmentOfPoint, + getTotalLength, + isAbsoluteArray, + isCurveArray, + isNormalizedArray, + isPathArray, + isPointInStroke, + isRelativeArray, + isValidPath, + shapeParams, + shapeToPath, + shapeToPathArray, + absolutizeSegment, + arcToCubic, + getSVGMatrix, + iterate, + lineToCubic, + normalizePath, + normalizeSegment, + optimizePath, + projection2d, + quadToCubic, + relativizeSegment, + reverseCurve, + reversePath, + roundPath, + roundSegment, + segmentToCubic, + shortenSegment, + splitCubic, + splitPath, + transformPath, +}; From 95b1df4208354033c7a9a394efea5b8467d16e01 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 5 Feb 2025 14:03:24 +0200 Subject: [PATCH 2/5] remove util bundle --- package.json | 5 --- src/util.ts | 98 -------------------------------------------------- tsup.config.ts | 23 ------------ 3 files changed, 126 deletions(-) delete mode 100644 src/util.ts diff --git a/package.json b/package.json index 393f739..16e6035 100755 --- a/package.json +++ b/package.json @@ -15,11 +15,6 @@ "types": "./dist/svg-path-commander.d.ts", "require": "./dist/svg-path-commander.cjs", "import": "./dist/svg-path-commander.mjs" - }, - "./util": { - "types": "./dist/util/util.d.ts", - "require": "./dist/util/util.cjs", - "import": "./dist/util/util.mjs" } }, "scripts": { diff --git a/src/util.ts b/src/util.ts deleted file mode 100644 index 434592d..0000000 --- a/src/util.ts +++ /dev/null @@ -1,98 +0,0 @@ -export { default as CSSMatrix } from "@thednp/dommatrix"; -// export type { PathArray, PointTuple, TransformObjectValues } from "./types"; -// export type { Options, TransformEntries, TransformObject } from "./interface"; -// export * from "./types"; -// export * from "./interface"; - -import * as arcTools from "./math/arcTools"; -import * as bezierTools from "./math/bezier"; -import * as cubicTools from "./math/cubicTools"; -import * as lineTools from "./math/lineTools"; -import * as quadTools from "./math/quadTools"; -import * as polygonTools from "./math/polygonTools"; -export { - arcTools, - bezierTools, - cubicTools, - lineTools, - polygonTools, - quadTools, -}; - -// export * from "./math/arcTools"; -// export * from "./math/bezier"; -// export * from "./math/cubicTools"; -// export * from "./math/lineTools"; -// export * from "./math/quadTools"; -// export * from "./math/polygonTools"; - -export { default as pathToAbsolute } from "./convert/pathToAbsolute"; -export { default as pathToRelative } from "./convert/pathToRelative"; -export { default as pathToCurve } from "./convert/pathToCurve"; -export { default as pathToString } from "./convert/pathToString"; - -export { default as distanceSquareRoot } from "./math/distanceSquareRoot"; -export { default as midPoint } from "./math/midPoint"; -export { default as rotateVector } from "./math/rotateVector"; -export { default as roundTo } from "./math/roundTo"; - -export { default as parsePathString } from "./parser/parsePathString"; -export { default as finalizeSegment } from "./parser/finalizeSegment"; -export { default as invalidPathValue } from "./parser/invalidPathValue"; -export { default as isArcCommand } from "./parser/isArcCommand"; -export { default as isDigit } from "./parser/isDigit"; -export { default as isDigitStart } from "./parser/isDigitStart"; -export { default as isMoveCommand } from "./parser/isMoveCommand"; -export { default as isPathCommand } from "./parser/isPathCommand"; -export { default as isSpace } from "./parser/isSpace"; -export { default as paramsCount } from "./parser/paramsCount"; -export { default as paramsParser } from "./parser/paramsParser"; -export { default as pathParser } from "./parser/pathParser"; -export { default as scanFlag } from "./parser/scanFlag"; -export { default as scanParam } from "./parser/scanParam"; -export { default as scanSegment } from "./parser/scanSegment"; -export { default as skipSpaces } from "./parser/skipSpaces"; - -export { default as distanceEpsilon } from "./util/distanceEpsilon"; -export { default as getClosestPoint } from "./util/getClosestPoint"; -export { default as getDrawDirection } from "./util/getDrawDirection"; -export { default as getPathArea } from "./util/getPathArea"; -export { default as getPathBBox } from "./util/getPathBBox"; -export { default as getPointAtLength } from "./util/getPointAtLength"; -export { default as getPropertiesAtLength } from "./util/getPropertiesAtLength"; -export { default as getPropertiesAtPoint } from "./util/getPropertiesAtPoint"; -export { default as getSegmentAtLength } from "./util/getSegmentAtLength"; -export { default as getSegmentOfPoint } from "./util/getSegmentOfPoint"; -export { default as getTotalLength } from "./util/getTotalLength"; - -export { default as isAbsoluteArray } from "./util/isAbsoluteArray"; -export { default as isCurveArray } from "./util/isCurveArray"; -export { default as isNormalizedArray } from "./util/isNormalizedArray"; -export { default as isPathArray } from "./util/isPathArray"; -export { default as isPointInStroke } from "./util/isPointInStroke"; -export { default as isRelativeArray } from "./util/isRelativeArray"; -export { default as isValidPath } from "./util/isValidPath"; -export { default as shapeParams } from "./util/shapeParams"; -export { default as shapeToPath } from "./util/shapeToPath"; -export { default as shapeToPathArray } from "./util/shapeToPathArray"; - -export { default as absolutizeSegment } from "./process/absolutizeSegment"; -export { default as arcToCubic } from "./process/arcToCubic"; -export { default as getSVGMatrix } from "./process/getSVGMatrix"; -export { default as iterate } from "./process/iterate"; -export { default as lineToCubic } from "./process/lineToCubic"; -export { default as normalizePath } from "./process/normalizePath"; -export { default as normalizeSegment } from "./process/normalizeSegment"; -export { default as optimizePath } from "./process/optimizePath"; -export { default as projection2d } from "./process/projection2d"; -export { default as quadToCubic } from "./process/quadToCubic"; -export { default as relativizeSegment } from "./process/relativizeSegment"; -export { default as reverseCurve } from "./process/reverseCurve"; -export { default as reversePath } from "./process/reversePath"; -export { default as roundPath } from "./process/roundPath"; -export { default as roundSegment } from "./process/roundSegment"; -export { default as segmentToCubic } from "./process/segmentToCubic"; -export { default as shortenSegment } from "./process/shortenSegment"; -export { default as splitCubic } from "./process/splitCubic"; -export { default as splitPath } from "./process/splitPath"; -export { default as transformPath } from "./process/transformPath"; diff --git a/tsup.config.ts b/tsup.config.ts index 0d71538..ac5958b 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -26,27 +26,4 @@ export default defineConfig([ options.legalComments = 'none' } }, - // Util bundle configuration - { - entry: ['src/util.ts'], - format: ['esm', 'cjs'], - dts: true, - clean: true, - sourcemap: true, - minify: true, - splitting: false, - outDir: 'dist/util', - target: 'es2020', - treeshake: true, - globalName: 'SVGPathCommanderUtil', - outExtension: ({ format }) => ({ - js: { - esm: '.mjs', - cjs: '.cjs' - }[format] - }), - esbuildOptions(options) { - options.legalComments = 'none' - } - } ]) \ No newline at end of file From 988424495cf645256567534d51891e594799f498 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 5 Feb 2025 14:03:36 +0200 Subject: [PATCH 3/5] build --- dist/svg-path-commander.cjs | 2 +- dist/svg-path-commander.cjs.map | 2 +- dist/svg-path-commander.d.cts | 703 +++++++++-------- dist/svg-path-commander.d.ts | 703 +++++++++-------- dist/svg-path-commander.js | 2 +- dist/svg-path-commander.js.map | 2 +- dist/svg-path-commander.mjs | 2 +- dist/svg-path-commander.mjs.map | 2 +- dist/util/util.cjs | 3 - dist/util/util.cjs.map | 1 - dist/util/util.d.cts | 1255 ------------------------------- dist/util/util.d.ts | 1255 ------------------------------- dist/util/util.mjs | 3 - dist/util/util.mjs.map | 1 - docs/svg-path-commander.js | 2 +- docs/svg-path-commander.js.map | 2 +- 16 files changed, 750 insertions(+), 3190 deletions(-) delete mode 100644 dist/util/util.cjs delete mode 100644 dist/util/util.cjs.map delete mode 100644 dist/util/util.d.cts delete mode 100644 dist/util/util.d.ts delete mode 100644 dist/util/util.mjs delete mode 100644 dist/util/util.mjs.map diff --git a/dist/svg-path-commander.cjs b/dist/svg-path-commander.cjs index ae5f29c..f231a5a 100644 --- a/dist/svg-path-commander.cjs +++ b/dist/svg-path-commander.cjs @@ -1,2 +1,2 @@ -"use strict";var Ut=Object.create;var Re=Object.defineProperty;var Kt=Object.getOwnPropertyDescriptor;var Ft=Object.getOwnPropertyNames;var Jt=Object.getPrototypeOf,Wt=Object.prototype.hasOwnProperty;var X=(t,e)=>{for(var n in e)Re(t,n,{get:e[n],enumerable:!0})},Ct=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ft(e))!Wt.call(t,r)&&r!==n&&Re(t,r,{get:()=>e[r],enumerable:!(o=Kt(e,r))||o.enumerable});return t};var st=(t,e,n)=>(n=t!=null?Ut(Jt(t)):{},Ct(e||!t||!t.__esModule?Re(n,"default",{value:t,enumerable:!0}):n,t)),Xt=t=>Ct(Re({},"__esModule",{value:!0}),t);var Sn={};X(Sn,{default:()=>Pn});module.exports=Xt(Sn);var Pt={};X(Pt,{CSSMatrix:()=>_t.default,absolutizeSegment:()=>_,arcToCubic:()=>Pe,arcTools:()=>ct,bezierTools:()=>ht,cubicTools:()=>gt,distanceEpsilon:()=>fe,distanceSquareRoot:()=>ie,finalizeSegment:()=>ve,getClosestPoint:()=>Vt,getDrawDirection:()=>Qt,getPathArea:()=>_e,getPathBBox:()=>Ue,getPointAtLength:()=>re,getPropertiesAtLength:()=>Ae,getPropertiesAtPoint:()=>ne,getSVGMatrix:()=>Ye,getSegmentAtLength:()=>qt,getSegmentOfPoint:()=>Et,getTotalLength:()=>F,invalidPathValue:()=>H,isAbsoluteArray:()=>Ke,isArcCommand:()=>je,isCurveArray:()=>Dt,isDigit:()=>B,isDigitStart:()=>$e,isMoveCommand:()=>Be,isNormalizedArray:()=>Fe,isPathArray:()=>oe,isPathCommand:()=>Ie,isPointInStroke:()=>Ot,isRelativeArray:()=>It,isSpace:()=>Oe,isValidPath:()=>Je,iterate:()=>M,lineToCubic:()=>Ne,lineTools:()=>mt,midPoint:()=>D,normalizePath:()=>K,normalizeSegment:()=>ee,optimizePath:()=>tt,paramsCount:()=>Z,paramsParser:()=>U,parsePathString:()=>T,pathParser:()=>W,pathToAbsolute:()=>Y,pathToCurve:()=>te,pathToRelative:()=>He,pathToString:()=>Se,polygonTools:()=>xt,projection2d:()=>we,quadToCubic:()=>Ze,quadTools:()=>dt,relativizeSegment:()=>xe,reverseCurve:()=>Ht,reversePath:()=>Ce,rotateVector:()=>ce,roundPath:()=>Zt,roundSegment:()=>he,roundTo:()=>L,scanFlag:()=>Ee,scanParam:()=>De,scanSegment:()=>de,segmentToCubic:()=>Ge,shapeParams:()=>ae,shapeToPath:()=>$t,shapeToPathArray:()=>Xe,shortenSegment:()=>et,skipSpaces:()=>G,splitCubic:()=>Gt,splitPath:()=>rt,transformPath:()=>nt});var _t=st(require("@thednp/dommatrix"),1);var ct={};X(ct,{angleBetween:()=>it,arcLength:()=>ut,arcPoint:()=>le,getArcBBox:()=>pt,getArcLength:()=>Me,getArcProps:()=>ze,getPointAtArcLength:()=>lt});var mt={};X(mt,{getLineBBox:()=>ke,getLineLength:()=>ue,getPointAtLineLength:()=>Te});var Yt=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},D=Yt;var er=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),ie=er;var ue=(t,e,n,o)=>ie([t,e],[n,o]),Te=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=ie([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=D([t,e],[n,o],r/a);s={x:i,y:m}}}return s},ke=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]};var ut=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},le=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),l=n*i(s),p=o*a(s);return[t+m*l-u*p,e+u*l+m*p]},it=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},ze=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:l,cos:p,sqrt:f,PI:h}=Math,c=u(n),b=u(o),S=(r%360+360)%360*(h/180);if(t===i&&e===m)return{rx:c,ry:b,startAngle:0,endAngle:0,center:{x:i,y:m}};if(c===0||b===0)return{rx:c,ry:b,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,g={x:p(S)*A+l(S)*y,y:-l(S)*A+p(S)*y},x=g.x**2/c**2+g.y**2/b**2;x>1&&(c*=f(x),b*=f(x));let C=c**2*b**2-c**2*g.y**2-b**2*g.x**2,k=c**2*g.y**2+b**2*g.x**2,V=C/k;V=V<0?0:V;let w=(s!==a?1:-1)*f(V),v={x:w*(c*g.y/b),y:w*(-(b*g.x)/c)},$={x:p(S)*v.x-l(S)*v.y+(t+i)/2,y:l(S)*v.x+p(S)*v.y+(e+m)/2},se={x:(g.x-v.x)/c,y:(g.y-v.y)/b},Q=it({x:1,y:0},se),P={x:(-g.x-v.x)/c,y:(-g.y-v.y)/b},q=it(se,P);!a&&q>0?q-=2*h:a&&q<0&&(q+=2*h),q%=2*h;let j=Q+q;return{center:$,startAngle:Q,endAngle:j,rx:c,ry:b}},Me=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:l,startAngle:p,endAngle:f}=ze(t,e,n,o,r,s,a,i,m);return ut(u,l,f-p)},lt=(t,e,n,o,r,s,a,i,m,u)=>{let l={x:t,y:e},{center:p,rx:f,ry:h,startAngle:c,endAngle:b}=ze(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let d=ut(f,h,b-c);if(u<=0)l={x:t,y:e};else if(u>=d)l={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||h===0)return Te(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,g=b-c,C=(r%360+360)%360*(S/180),k=c+g*(u/d),V=f*A(k),w=h*y(k);l={x:A(C)*V-y(C)*w+p.x,y:y(C)*V+A(C)*w+p.y}}}return l},pt=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:l,ry:p,startAngle:f,endAngle:h}=ze(t,e,n,o,r,s,a,i,m),c=h-f,{min:b,max:d,tan:S,atan2:A,PI:y}=Math,{x:g,y:x}=u,C=r*y/180,k=S(C),V=A(-p*k,l),w=V,v=V+y,$=A(p,l*k),se=$+y,Q=[i],P=[m],q=b(t,i),j=d(t,i),O=b(e,m),J=d(e,m),be=h-c*1e-5,me=le(g,x,l,p,C,be),N=h-c*.99999,E=le(g,x,l,p,C,N);if(me[0]>j||E[0]>j){let R=le(g,x,l,p,C,w);Q.push(R[0]),P.push(R[1])}if(me[0]J||E[1]>J){let R=le(g,x,l,p,C,$);Q.push(R[0]),P.push(R[1])}return q=b.apply([],Q),O=b.apply([],P),j=d.apply([],Q),J=d.apply([],P),[q,O,j,J]};var ht={};X(ht,{CBEZIER_MINMAX_EPSILON:()=>wt,Cvalues:()=>Tt,Tvalues:()=>ft,bezierLength:()=>Nt,calculateBezier:()=>vt,computeBezier:()=>Lt,deriveBezier:()=>Mt,getBezierLength:()=>pe,minmaxC:()=>Ve,minmaxQ:()=>Le});var ft=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Tt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Mt=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,l=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,l=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+l*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+l*r[3].y,t:e}},vt=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},Nt=t=>{let n=ft.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oLt(n[0],o))},wt=1e-8,Le=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&l<1){let f=t*(1-l)*(1-l)*(1-l)+e*3*(1-l)*(1-l)*l+n*3*(1-l)*l*l+o*l*l*l;fm&&(m=f)}}return[i,m]};var gt={};X(gt,{getCubicBBox:()=>Qe,getCubicLength:()=>ge,getPointAtCubicLength:()=>bt,getPointAtCubicSegmentLength:()=>Rt});var Rt=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},ge=(t,e,n,o,r,s,a,i)=>pe([t,e,n,o,r,s,a,i]),bt=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",l={x:t,y:e};if(u){let p=pe([t,e,n,o,r,s,a,i]);m<=0||(m>=p?l={x:a,y:i}:l=Rt([t,e,n,o,r,s,a,i],m/p))}return l},Qe=(t,e,n,o,r,s,a,i)=>{let m=Ve([t,n,r,a]),u=Ve([e,o,s,i]);return[m[0],u[0],m[1],u[1]]};var dt={};X(dt,{getPointAtQuadLength:()=>yt,getPointAtQuadSegmentLength:()=>kt,getQuadBBox:()=>qe,getQuadLength:()=>ye});var kt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},ye=(t,e,n,o,r,s)=>pe([t,e,n,o,r,s]),yt=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=pe([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=kt([t,e,n,o,r,s],a/u))}return m},qe=(t,e,n,o,r,s)=>{let a=Le([t,n,r]),i=Le([e,o,s]);return[a[0],i[0],a[1],i[1]]};var xt={};X(xt,{polygonArea:()=>tr,polygonLength:()=>rr});var tr=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+ie(t[o-1],n):0,0);var nr={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=nr;var or=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},ve=or;var ar="SVGPathCommander Error",z=ar;var sr=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${z}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},Ee=sr;var mr=t=>t>=48&&t<=57,B=mr;var ir="Invalid path value",H=ir;var ur=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${z}: ${H} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!B(u)&&u!==46){t.err=`${z}: ${H} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Oe=lr;var pr=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Ie=cr;var fr=t=>B(t)||t===43||t===45||t===46,$e=fr;var hr=t=>(t|32)===97,je=hr;var br=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Be=br;var gr=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!Ie(s)){t.err=`${z}: ${H} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!Be(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${z}: ${H} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){ve(t);return}for(;;){for(let m=a;m>0;m-=1){if(je(s)&&(m===3||m===4)?Ee(t):De(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!$e(n.charCodeAt(t.index)))break}ve(t)},de=gr;var W=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var yr=t=>{if(typeof t!="string")return t.slice(0);let e=new W(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,l=0,p=0;for(let f=0;f{let e=T(t);return M(e,_)},Y=Pr;var Sr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=T(t);return M(e,xe)},He=Ar;var Cr=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ce=Cr;var zt=(t,e,n,o,r,s,a,i,m,u)=>{let l=t,p=e,f=n,h=o,c=i,b=m,d=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,g,x,C,k;if(u)[g,x,C,k]=u;else{y=ce(l,p,-S),l=y.x,p=y.y,y=ce(c,b,-S),c=y.x,b=y.y;let N=(l-c)/2,E=(p-b)/2,R=N*N/(f*f)+E*E/(h*h);R>1&&(R=Math.sqrt(R),f*=R,h*=R);let ot=f*f,at=h*h,At=(s===a?-1:1)*Math.sqrt(Math.abs((ot*at-ot*E*E-at*N*N)/(ot*E*E+at*N*N)));C=At*f*E/h+(l+c)/2,k=At*-h*N/f+(p+b)/2,g=Math.asin(((p-k)/h*10**9>>0)/10**9),x=Math.asin(((b-k)/h*10**9>>0)/10**9),g=lx&&(g-=Math.PI*2),!a&&x>g&&(x-=Math.PI*2)}let V=x-g;if(Math.abs(V)>d){let N=x,E=c,R=b;x=g+d*(a&&x>g?1:-1),c=C+f*Math.cos(x),b=k+h*Math.sin(x),A=zt(c,b,f,h,r,0,a,E,R,[x,N,C,k])}V=x-g;let w=Math.cos(g),v=Math.sin(g),$=Math.cos(x),se=Math.sin(x),Q=Math.tan(V/4),P=4/3*f*Q,q=4/3*h*Q,j=[l,p],O=[l+P*v,p-q*w],J=[c+P*se,b-q*$],be=[c,b];if(O[0]=2*j[0]-O[0],O[1]=2*j[1]-O[1],u)return[O[0],O[1],J[0],J[1],be[0],be[1]].concat(A);A=[O[0],O[1],J[0],J[1],be[0],be[1]].concat(A);let me=[];for(let N=0,E=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},Ze=Tr;var Mr=(t,e,n,o)=>{let r=D([t,e],[n,o],.3333333333333333),s=D([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Ne=Mr;var Lr=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(Pe(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(Ze(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Ne(a,i,r,s)):n==="Z"?["C"].concat(Ne(a,i,m,u)):t},Ge=Lr;var vr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:l}=e,p=t.slice(1),f=p.map((h,c)=>h+(r?c%2?l:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=p.slice(0,-2).concat(p[5]+(r?u:0),p[6]+(r?l:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?l:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let h=s*2-i,c=a*2-m;return e.x1=h,e.y1=c,["C",h,c].concat(f)}else if(o==="T"){let h=s*2-(e.qx?e.qx:0),c=a*2-(e.qy?e.qy:0);return e.qx=h,e.qy=c,["Q",h,c].concat(f)}else if(o==="Q"){let[h,c]=f;return e.qx=h,e.qy=c,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},ee=vr;var Nr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=Nr;var wr=t=>{let e={...U},n=T(t);return M(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=ee(o,e),m=Ge(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let l=m.length;return e.x1=+m[l-2],e.y1=+m[l-1],e.x2=+m[l-4]||e.x1,e.y2=+m[l-3]||e.y1,m})},te=wr;var Rr={origin:[0,0,0],round:4},I=Rr;var kr=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},L=kr;var zr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{let e=T(t),n={...U};return M(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=ee(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},K=Vr;var Qr=(t,e)=>{let n=K(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),l=typeof e=="number",p={x:m,y:u},f=0,h=p,c=0;return!l||e{[s]=b,o=s==="M",r=o?r:[S,A].concat(b.slice(1));if(o?([,m,u]=b,p={x:m,y:u},f=0):s==="L"?(p=Te(r[0],r[1],r[2],r[3],e-c),f=ue(r[0],r[1],r[2],r[3])):s==="A"?(p=lt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-c),f=Me(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(p=bt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-c),f=ge(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(p=yt(r[0],r[1],r[2],r[3],r[4],r[5],e-c),f=ye(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],p={x:m,y:u},f=ue(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),cc-fe?{x:a,y:i}:h)},re=Qr;var qr=t=>{let e=T(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,l=0,p=0;return M(e,(f,h,c,b)=>{[m]=f;let d=m.toUpperCase(),A=d!==m?_(f,h,c,b):f.slice(0),y=d==="V"?["L",c,A[1]]:d==="H"?["L",A[1],b]:A;[m]=y,"TQ".includes(d)||(a=0,i=0);if(m==="M")[,u,l]=y;else if(m==="L")p+=ue(c,b,y[1],y[2]);else if(m==="A")p+=Me(c,b,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let g=n*2-r,x=o*2-s;p+=ge(c,b,g,x,y[1],y[2],y[3],y[4])}else m==="C"?p+=ge(c,b,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,p+=ye(c,b,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],p+=ye(c,b,y[1],y[2],y[3],y[4])):m==="Z"&&(p+=ue(c,b,u,l));[n,o]=m==="Z"?[u,l]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),p},F=qr;var Er=(t,e)=>{let n=T(t),o=n.slice(0),r=F(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=F(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=F(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:l})=>l<=e)},Ae=Er;var Dr=(t,e)=>{let n=T(t),o=K(n),r=F(o),s=g=>{let x=g.x-e.x,C=g.y-e.y;return x*x+C*C},a=8,i,m={x:0,y:0},u=0,l=0,p=1/0;for(let g=0;g<=r;g+=a)i=re(o,g),u=s(i),u1e-6&&(c=l-a,f=re(o,c),d=s(f),b=l+a,h=re(o,b),S=s(h),c>=0&&dne(t,e).closest,Vt=Or;var Ir=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,$r=t=>{let e=0,n=0,o=0;return te(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=Ir(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},_e=$r;var jr=t=>_e(te(t))>=0,Qt=jr;var Br=t=>{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=T(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,l=-1/0,p=0,f=0,h=0,c=0,b=0,d=0,S=0,A=0,y=0,g=0;M(e,(k,V,w,v)=>{[n]=k;let $=n.toUpperCase(),Q=$!==n?_(k,V,w,v):k.slice(0),P=$==="V"?["L",w,Q[1]]:$==="H"?["L",Q[1],v]:Q;[n]=P,"TQ".includes($)||(y=0,g=0);if(n==="M")[,o,r]=P,p=o,f=r,h=o,c=r;else if(n==="L")[p,f,h,c]=ke(w,v,P[1],P[2]);else if(n==="A")[p,f,h,c]=pt(w,v,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(n==="S"){let q=b*2-S,j=d*2-A;[p,f,h,c]=Qe(w,v,q,j,P[1],P[2],P[3],P[4])}else n==="C"?[p,f,h,c]=Qe(w,v,P[1],P[2],P[3],P[4],P[5],P[6]):n==="T"?(y=b*2-y,g=d*2-g,[p,f,h,c]=qe(w,v,y,g,P[1],P[2])):n==="Q"?(y=P[1],g=P[2],[p,f,h,c]=qe(w,v,P[1],P[2],P[3],P[4])):n==="Z"&&([p,f,h,c]=ke(w,v,o,r));i=a(p,i),m=a(f,m),u=s(h,u),l=s(c,l),[b,d]=n==="Z"?[o,r]:P.slice(-2),[S,A]=n==="C"?[P[3],P[4]]:n==="S"?[P[1],P[2]]:[b,d]});let x=u-i,C=l-m;return{width:x,height:C,x:i,y:m,x2:u,y2:l,cx:i+x/2,cy:m+C/2,cz:Math.max(x,C)+Math.min(x,C)/2}},Ue=Br;var Hr=(t,e)=>Ae(t,e).segment,qt=Hr;var Zr=(t,e)=>ne(t,e).segment,Et=Zr;var Gr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,oe=Gr;var _r=t=>oe(t)&&t.every(([e])=>e===e.toUpperCase()),Ke=_r;var Ur=t=>Ke(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Fe=Ur;var Kr=t=>Fe(t)&&t.every(([e])=>"MC".includes(e)),Dt=Kr;var Fr=(t,e)=>{let{distance:n}=ne(t,e);return Math.abs(n)oe(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),It=Jr;var Wr=t=>{if(typeof t!="string"||!t.length)return!1;let e=new W(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,We=Yr;var en=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},tn=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},nn=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},on=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},an=t=>{let e=Object.keys(ae),n=We(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${z}: "${o}" is not SVGElement`);let r=n?o:t.type,s=ae[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=rn(a):r==="ellipse"?i=nn(a):["polyline","polygon"].includes(r)?i=tn(a):r==="rect"?i=on(a):r==="line"?i=en(a):["glyph","path"].includes(r)&&(i=T(n?t.getAttribute("d")||"":t.d||"")),oe(i)&&i.length?i:!1},Xe=an;var sn=(t,e,n)=>{let o=n||document,r=Object.keys(ae),s=We(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${z}: "${a}" is already SVGPathElement`);if(a&&r.every(c=>a!==c))throw TypeError(`${z}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=ae[m],l={type:m},p=I.round,f=Xe(t),h=f&&f.length?Se(f,p):"";return s?(u.forEach(c=>{l[c]=t.getAttribute(c)}),Object.values(t.attributes).forEach(({name:c,value:b})=>{u.includes(c)||i.setAttribute(c,b)})):(Object.assign(l,t),Object.keys(l).forEach(c=>{!u.includes(c)&&c!=="type"&&i.setAttribute(c.replace(/[A-Z]/g,b=>`-${b.toLowerCase()}`),l[c])})),Je(h)?(i.setAttribute("d",h),e&&s&&(t.before(i,t),t.remove()),i):!1},$t=sn;var jt=st(require("@thednp/dommatrix"),1),mn=t=>{let e=new jt.default,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},Ye=mn;var un=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:l,y2:p,x:f,y:h}=n,[c,b]=i.slice(-2),d=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(L(f,a)===L(c,a))return["V",b];if(L(h,a)===L(b,a))return["H",c]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(L(S,a)===L(m*2-l,a)&&L(A,a)===L(u*2-p,a)||L(m,a)===L(l*2-f,a)&&L(u,a)===L(p*2-h,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&L(S,a)===L(m*2-l,a)&&L(A,a)===L(u*2-p,a))return["T",i[2],i[3]]}return d},et=un;var ln=(t,e)=>{let n=t.slice(1).map(o=>L(o,e));return[t[0]].concat(n)},he=ln;var pn=(t,e)=>{let n=Y(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return M(n,(m,u,l,p)=>{r.x=l,r.y=p;let f=ee(m,r),h=m;if([a]=m,s[u]=a,u){i=s[u-1];let b=et(m,f,r,i),d=he(b,o),S=d.join(""),A=xe(b,u,l,p),y=he(A,o),g=y.join("");h=S.length{let n=Bt.default.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},fn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=cn(t,[e[0],e[1],0,1]),u=a-o,l=i-r,p=m-s;return[u*(Math.abs(s)/Math.abs(p)||1)+o,l*(Math.abs(s)/Math.abs(p)||1)+r]},we=fn;var hn=t=>{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},Ht=hn;var bn=t=>{let e=Y(t),n=K(e),o=e.length,r=e[o-1][0]==="Z",s=M(e,(a,i)=>{let m=n[i],u=i&&e[i-1],l=u&&u[0],p=e[i+1],f=p&&p[0],[h]=a,[c,b]=n[i?i-1:o-1].slice(-2),d=a;switch(h){case"M":d=r?["Z"]:[h,c,b];break;case"A":d=[h,a[1],a[2],a[3],a[4],a[5]===1?0:1,c,b];break;case"C":p&&f==="S"?d=["S",a[1],a[2],c,b]:d=[h,a[3],a[4],a[1],a[2],c,b];break;case"S":l&&"CS".includes(l)&&(!p||f!=="S")?d=["C",m[3],m[4],m[1],m[2],c,b]:d=[h,m[1],m[2],c,b];break;case"Q":p&&f==="T"?d=["T",c,b]:d=[h,a[1],a[2],c,b];break;case"T":l&&"QT".includes(l)&&(!p||f!=="T")?d=["Q",m[1],m[2],c,b]:d=[h,c,b];break;case"Z":d=["M",c,b];break;case"H":d=[h,c];break;case"V":d=[h,b];break;default:d=[h].concat(a.slice(1,-2),c,b)}return d});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Ce=bn;var gn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):M(t,o=>he(o,n))},Zt=gn;var yn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=D(o,r,n),m=D(r,s,n),u=D(s,a,n),l=D(i,m,n),p=D(m,u,n),f=D(l,p,n);return[["C",i[0],i[1],l[0],l[1],f[0],f[1]],["C",p[0],p[1],u[0],u[1],a[0],a[1]]]},Gt=yn;var dn=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[l]=u,p=l.toUpperCase(),f=l.toLowerCase(),h=l===f,c=u.slice(1);p==="M"?(o+=1,[r,s]=c,r+=h?m.x:0,s+=h?m.y:0,a=r,i=s,n=[h?[p,a,i]:u]):(p==="Z"?(r=a,s=i):p==="H"?([,r]=u,r+=h?m.x:0):p==="V"?([,s]=u,s+=h?m.y:0):([r,s]=u.slice(-2),r+=h?m.x:0,s+=h?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},rt=dn;var xn=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=T(t),l=e&&Object.keys(e);if(!e||l&&!l.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let p=e.origin,f=Ye(e);return f.isIdentity?u.slice(0):M(u,(h,c,b,d)=>{[m]=h;let S=m.toUpperCase(),y=S!==m?_(h,c,b,d):h.slice(0),g=S==="A"?["C"].concat(Pe(b,d,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",b,y[1]]:S==="H"?["L",y[1],d]:y;m=g[0];let x=m==="C"&&g.length>7,C=x?g.slice(0,7):g.slice(0);if(x&&(u.splice(c+1,0,["C"].concat(g.slice(7))),g=C),m==="L"){[r,s]=we(f,[g[1],g[2]],p);n!==r&&o!==s?g=["L",r,s]:o===s?g=["H",r]:n===r&&(g=["V",s])}else for(a=1,i=g.length;a"u";if(r||!e.length)throw TypeError(`${z}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=T(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,l,p]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(l)?0:l,Number.isNaN(p)?0:p]}return this.round=i,this.origin=m,this}get bbox(){return Ue(this.segments)}get length(){return F(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return re(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=Y(e),this}toRelative(){let{segments:e}=this;return this.segments=He(e),this}toCurve(){let{segments:e}=this;return this.segments=te(e),this}reverse(e){let{segments:n}=this,o=rt(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Ce(i):i.slice(0):Ce(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Ce(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=K(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=tt(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,l]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,l||s]}else a.origin=[o,r,s];return this.segments=nt(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return Se(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}},Pn=Object.assign(St,Pt); +"use strict";var _t=Object.create;var _e=Object.defineProperty;var Ut=Object.getOwnPropertyDescriptor;var Ft=Object.getOwnPropertyNames;var Kt=Object.getPrototypeOf,Jt=Object.prototype.hasOwnProperty;var le=(t,e)=>{for(var n in e)_e(t,n,{get:e[n],enumerable:!0})},Qt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ft(e))!Jt.call(t,r)&&r!==n&&_e(t,r,{get:()=>e[r],enumerable:!(o=Ut(e,r))||o.enumerable});return t};var pt=(t,e,n)=>(n=t!=null?_t(Kt(t)):{},Qt(e||!t||!t.__esModule?_e(n,"default",{value:t,enumerable:!0}):n,t)),Wt=t=>Qt(_e({},"__esModule",{value:!0}),t);var xn={};le(xn,{CSSMatrix:()=>Vt.default,absolutizeSegment:()=>_,arcToCubic:()=>ye,arcTools:()=>Je,bezierTools:()=>Xe,cubicTools:()=>et,default:()=>dn,distanceEpsilon:()=>se,distanceSquareRoot:()=>re,finalizeSegment:()=>Ae,getClosestPoint:()=>xt,getDrawDirection:()=>St,getPathArea:()=>Ie,getPathBBox:()=>at,getPointAtLength:()=>me,getPropertiesAtLength:()=>Pe,getPropertiesAtPoint:()=>Y,getSVGMatrix:()=>Ge,getSegmentAtLength:()=>At,getSegmentOfPoint:()=>Ct,getTotalLength:()=>K,invalidPathValue:()=>j,isAbsoluteArray:()=>$e,isArcCommand:()=>qe,isCurveArray:()=>Tt,isDigit:()=>$,isDigitStart:()=>Qe,isMoveCommand:()=>De,isNormalizedArray:()=>je,isPathArray:()=>ee,isPathCommand:()=>ke,isPointInStroke:()=>Mt,isRelativeArray:()=>Lt,isSpace:()=>Ve,isValidPath:()=>Be,iterate:()=>T,lineToCubic:()=>Ce,lineTools:()=>Fe,midPoint:()=>E,normalizePath:()=>J,normalizeSegment:()=>X,optimizePath:()=>mt,paramsCount:()=>Z,paramsParser:()=>U,parsePathString:()=>L,pathParser:()=>F,pathToAbsolute:()=>oe,pathToCurve:()=>ae,pathToRelative:()=>ot,pathToString:()=>Te,polygonTools:()=>nt,projection2d:()=>Le,quadToCubic:()=>Ee,quadTools:()=>rt,relativizeSegment:()=>be,reverseCurve:()=>Nt,reversePath:()=>Me,rotateVector:()=>ne,roundPath:()=>wt,roundSegment:()=>ie,roundTo:()=>M,scanFlag:()=>ze,scanParam:()=>Re,scanSegment:()=>he,segmentToCubic:()=>Oe,shapeParams:()=>te,shapeToPath:()=>vt,shapeToPathArray:()=>He,shortenSegment:()=>Ze,skipSpaces:()=>G,splitCubic:()=>zt,splitPath:()=>it,transformPath:()=>ut});module.exports=Wt(xn);var Vt=pt(require("@thednp/dommatrix"),1);var Je={};le(Je,{angleBetween:()=>ft,arcLength:()=>gt,arcPoint:()=>fe,getArcBBox:()=>bt,getArcLength:()=>Ne,getArcProps:()=>Ke,getPointAtArcLength:()=>ht});var Fe={};le(Fe,{getLineBBox:()=>Ue,getLineLength:()=>pe,getPointAtLineLength:()=>ve});var Xt=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=Xt;var Yt=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),re=Yt;var pe=(t,e,n,o)=>re([t,e],[n,o]),ve=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=re([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},Ue=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]};var gt=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},fe=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),c=n*i(s),l=o*a(s);return[t+m*c-u*l,e+u*c+m*l]},ft=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},Ke=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:c,cos:l,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,b={x:l(S)*A+c(S)*y,y:-c(S)*A+l(S)*y},d=b.x**2/p**2+b.y**2/h**2;d>1&&(p*=f(d),h*=f(d));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,R=p**2*b.y**2+h**2*b.x**2,k=C/R;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},B={x:l(S)*v.x-c(S)*v.y+(t+i)/2,y:c(S)*v.x+l(S)*v.y+(e+m)/2},ue={x:(b.x-v.x)/p,y:(b.y-v.y)/h},Q=ft({x:1,y:0},ue),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},q=ft(ue,x);!a&&q>0?q-=2*g:a&&q<0&&(q+=2*g),q%=2*g;let H=Q+q;return{center:B,startAngle:Q,endAngle:H,rx:p,ry:h}},Ne=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:c,startAngle:l,endAngle:f}=Ke(t,e,n,o,r,s,a,i,m);return gt(u,c,f-l)},ht=(t,e,n,o,r,s,a,i,m,u)=>{let c={x:t,y:e},{center:l,rx:f,ry:g,startAngle:p,endAngle:h}=Ke(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let P=gt(f,g,h-p);if(u<=0)c={x:t,y:e};else if(u>=P)c={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return ve(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,b=h-p,C=(r%360+360)%360*(S/180),R=p+b*(u/P),k=f*A(R),w=g*y(R);c={x:A(C)*k-y(C)*w+l.x,y:y(C)*k+A(C)*w+l.y}}}return c},bt=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:c,ry:l,startAngle:f,endAngle:g}=Ke(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:P,tan:S,atan2:A,PI:y}=Math,{x:b,y:d}=u,C=r*y/180,R=S(C),k=A(-l*R,c),w=k,v=k+y,B=A(l,c*R),ue=B+y,Q=[i],x=[m],q=h(t,i),H=P(t,i),O=h(e,m),W=P(e,m),de=g-p*1e-5,ce=fe(b,d,c,l,C,de),N=g-p*.99999,D=fe(b,d,c,l,C,N);if(ce[0]>H||D[0]>H){let z=fe(b,d,c,l,C,w);Q.push(z[0]),x.push(z[1])}if(ce[0]W||D[1]>W){let z=fe(b,d,c,l,C,B);Q.push(z[0]),x.push(z[1])}return q=h.apply([],Q),O=h.apply([],x),H=P.apply([],Q),W=P.apply([],x),[q,O,H,W]};var Xe={};le(Xe,{CBEZIER_MINMAX_EPSILON:()=>$t,Cvalues:()=>qt,Tvalues:()=>yt,bezierLength:()=>It,calculateBezier:()=>Ot,computeBezier:()=>Et,deriveBezier:()=>Dt,getBezierLength:()=>ge,minmaxC:()=>We,minmaxQ:()=>we});var yt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],qt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Dt=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,c=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,c=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+c*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+c*r[3].y,t:e}},Ot=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},It=t=>{let n=yt.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oEt(n[0],o))},$t=1e-8,we=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)<$t)return t===o&&t===e?[t,o]:we([t,-.5*t+1.5*e,t-3*e+3*n]);let s=-t*n+t*o-e*n-e*o+e*e+n*n;if(s<=0)return[Math.min(t,o),Math.max(t,o)];let a=Math.sqrt(s),i=Math.min(t,o),m=Math.max(t,o),u=t-2*e+n;for(let c=(u+a)/r,l=1;l<=2;c=(u-a)/r,l++){if(c>0&&c<1){let f=t*(1-c)*(1-c)*(1-c)+e*3*(1-c)*(1-c)*c+n*3*(1-c)*c*c+o*c*c*c;fm&&(m=f)}}return[i,m]};var et={};le(et,{getCubicBBox:()=>Ye,getCubicLength:()=>xe,getPointAtCubicLength:()=>Pt,getPointAtCubicSegmentLength:()=>jt});var jt=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},xe=(t,e,n,o,r,s,a,i)=>ge([t,e,n,o,r,s,a,i]),Pt=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",c={x:t,y:e};if(u){let l=ge([t,e,n,o,r,s,a,i]);m<=0||(m>=l?c={x:a,y:i}:c=jt([t,e,n,o,r,s,a,i],m/l))}return c},Ye=(t,e,n,o,r,s,a,i)=>{let m=We([t,n,r,a]),u=We([e,o,s,i]);return[m[0],u[0],m[1],u[1]]};var rt={};le(rt,{getPointAtQuadLength:()=>dt,getPointAtQuadSegmentLength:()=>Bt,getQuadBBox:()=>tt,getQuadLength:()=>Se});var Bt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},Se=(t,e,n,o,r,s)=>ge([t,e,n,o,r,s]),dt=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=ge([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=Bt([t,e,n,o,r,s],a/u))}return m},tt=(t,e,n,o,r,s)=>{let a=we([t,n,r]),i=we([e,o,s]);return[a[0],i[0],a[1],i[1]]};var nt={};le(nt,{polygonArea:()=>er,polygonLength:()=>tr});var er=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+re(t[o-1],n):0,0);var rr=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ne=rr;var nr=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=nr;var or={origin:[0,0,0],round:4},I=or;var ar={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=ar;var sr=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},Ae=sr;var mr="SVGPathCommander Error",V=mr;var ir=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${V}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},ze=ir;var ur=t=>t>=48&&t<=57,$=ur;var cr="Invalid path value",j=cr;var lr=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${V}: ${j} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!$(u)&&u!==46){t.err=`${V}: ${j} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Ve=pr;var fr=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},ke=gr;var hr=t=>$(t)||t===43||t===45||t===46,Qe=hr;var br=t=>(t|32)===97,qe=br;var yr=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},De=yr;var Pr=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!ke(s)){t.err=`${V}: ${j} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!De(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${V}: ${j} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){Ae(t);return}for(;;){for(let m=a;m>0;m-=1){if(qe(s)&&(m===3||m===4)?ze(t):Re(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!Qe(n.charCodeAt(t.index)))break}Ae(t)},he=Pr;var F=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var dr=t=>{if(typeof t!="string")return t.slice(0);let e=new F(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,c=0,l=0;for(let f=0;f{let e=L(t);return T(e,_)},oe=Ar;var Cr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,be)},ot=Tr;var Ht=(t,e,n,o,r,s,a,i,m,u)=>{let c=t,l=e,f=n,g=o,p=i,h=m,P=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,b,d,C,R;if(u)[b,d,C,R]=u;else{y=ne(c,l,-S),c=y.x,l=y.y,y=ne(p,h,-S),p=y.x,h=y.y;let N=(c-p)/2,D=(l-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let ct=f*f,lt=g*g,kt=(s===a?-1:1)*Math.sqrt(Math.abs((ct*lt-ct*D*D-lt*N*N)/(ct*D*D+lt*N*N)));C=kt*f*D/g+(c+p)/2,R=kt*-g*N/f+(l+h)/2,b=Math.asin(((l-R)/g*10**9>>0)/10**9),d=Math.asin(((h-R)/g*10**9>>0)/10**9),b=cd&&(b-=Math.PI*2),!a&&d>b&&(d-=Math.PI*2)}let k=d-b;if(Math.abs(k)>P){let N=d,D=p,z=h;d=b+P*(a&&d>b?1:-1),p=C+f*Math.cos(d),h=R+g*Math.sin(d),A=Ht(p,h,f,g,r,0,a,D,z,[d,N,C,R])}k=d-b;let w=Math.cos(b),v=Math.sin(b),B=Math.cos(d),ue=Math.sin(d),Q=Math.tan(k/4),x=4/3*f*Q,q=4/3*g*Q,H=[c,l],O=[c+x*v,l-q*w],W=[p+x*ue,h-q*B],de=[p,h];if(O[0]=2*H[0]-O[0],O[1]=2*H[1]-O[1],u)return[O[0],O[1],W[0],W[1],de[0],de[1]].concat(A);A=[O[0],O[1],W[0],W[1],de[0],de[1]].concat(A);let ce=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},Ee=Mr;var Lr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Ce=Lr;var vr=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(ye(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(Ee(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Ce(a,i,r,s)):n==="Z"?["C"].concat(Ce(a,i,m,u)):t},Oe=vr;var Nr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:c}=e,l=t.slice(1),f=l.map((g,p)=>g+(r?p%2?c:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=l.slice(0,-2).concat(l[5]+(r?u:0),l[6]+(r?c:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?c:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},X=Nr;var wr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=wr;var zr=t=>{let e={...U},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=X(o,e),m=Oe(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let c=m.length;return e.x1=+m[c-2],e.y1=+m[c-1],e.x2=+m[c-4]||e.x1,e.y2=+m[c-3]||e.y1,m})},ae=zr;var Rr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,c=-1/0,l=0,f=0,g=0,p=0,h=0,P=0,S=0,A=0,y=0,b=0;T(e,(R,k,w,v)=>{[n]=R;let B=n.toUpperCase(),Q=B!==n?_(R,k,w,v):R.slice(0),x=B==="V"?["L",w,Q[1]]:B==="H"?["L",Q[1],v]:Q;[n]=x,"TQ".includes(B)||(y=0,b=0);if(n==="M")[,o,r]=x,l=o,f=r,g=o,p=r;else if(n==="L")[l,f,g,p]=Ue(w,v,x[1],x[2]);else if(n==="A")[l,f,g,p]=bt(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let q=h*2-S,H=P*2-A;[l,f,g,p]=Ye(w,v,q,H,x[1],x[2],x[3],x[4])}else n==="C"?[l,f,g,p]=Ye(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(y=h*2-y,b=P*2-b,[l,f,g,p]=tt(w,v,y,b,x[1],x[2])):n==="Q"?(y=x[1],b=x[2],[l,f,g,p]=tt(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([l,f,g,p]=Ue(w,v,o,r));i=a(l,i),m=a(f,m),u=s(g,u),c=s(p,c),[h,P]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,P]});let d=u-i,C=c-m;return{width:d,height:C,x:i,y:m,x2:u,y2:c,cx:i+d/2,cy:m+C/2,cz:Math.max(d,C)+Math.min(d,C)/2}},at=Vr;var kr=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,c=0,l=0;return T(e,(f,g,p,h)=>{[m]=f;let P=m.toUpperCase(),A=P!==m?_(f,g,p,h):f.slice(0),y=P==="V"?["L",p,A[1]]:P==="H"?["L",A[1],h]:A;[m]=y,"TQ".includes(P)||(a=0,i=0);if(m==="M")[,u,c]=y;else if(m==="L")l+=pe(p,h,y[1],y[2]);else if(m==="A")l+=Ne(p,h,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let b=n*2-r,d=o*2-s;l+=xe(p,h,b,d,y[1],y[2],y[3],y[4])}else m==="C"?l+=xe(p,h,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,l+=Se(p,h,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],l+=Se(p,h,y[1],y[2],y[3],y[4])):m==="Z"&&(l+=pe(p,h,u,c));[n,o]=m==="Z"?[u,c]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),l},K=kr;var se=1e-5;var Qr=t=>{let e=L(t),n={...U};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=X(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},J=Qr;var qr=(t,e)=>{let n=J(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),c=typeof e=="number",l={x:m,y:u},f=0,g=l,p=0;return!c||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,l={x:m,y:u},f=0):s==="L"?(l=ve(r[0],r[1],r[2],r[3],e-p),f=pe(r[0],r[1],r[2],r[3])):s==="A"?(l=ht(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=Ne(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(l=Pt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=xe(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(l=dt(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=Se(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],l={x:m,y:u},f=pe(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-se?{x:a,y:i}:g)},me=qr;var Dr=(t,e)=>{let n=L(t),o=n.slice(0),r=K(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=K(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=K(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:c})=>c<=e)},Pe=Dr;var Er=(t,e)=>{let n=L(t),o=J(n),r=K(o),s=b=>{let d=b.x-e.x,C=b.y-e.y;return d*d+C*C},a=8,i,m={x:0,y:0},u=0,c=0,l=1/0;for(let b=0;b<=r;b+=a)i=me(o,b),u=s(i),u1e-6&&(p=c-a,f=me(o,p),P=s(f),h=c+a,g=me(o,h),S=s(g),p>=0&&PY(t,e).closest,xt=Or;var Ir=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,$r=t=>{let e=0,n=0,o=0;return ae(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=Ir(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Ie=$r;var jr=t=>Ie(ae(t))>=0,St=jr;var Br=(t,e)=>Pe(t,e).segment,At=Br;var Hr=(t,e)=>Y(t,e).segment,Ct=Hr;var Zr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ee=Zr;var Gr=t=>ee(t)&&t.every(([e])=>e===e.toUpperCase()),$e=Gr;var _r=t=>$e(t)&&t.every(([e])=>"ACLMQZ".includes(e)),je=_r;var Ur=t=>je(t)&&t.every(([e])=>"MC".includes(e)),Tt=Ur;var Fr=(t,e)=>{let{distance:n}=Y(t,e);return Math.abs(n)ee(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Lt=Kr;var Jr=t=>{if(typeof t!="string"||!t.length)return!1;let e=new F(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,st=Xr;var Yr=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},en=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},rn=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},nn=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},on=t=>{let e=Object.keys(te),n=st(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${V}: "${o}" is not SVGElement`);let r=n?o:t.type,s=te[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=tn(a):r==="ellipse"?i=rn(a):["polyline","polygon"].includes(r)?i=en(a):r==="rect"?i=nn(a):r==="line"?i=Yr(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),ee(i)&&i.length?i:!1},He=on;var an=(t,e,n)=>{let o=n||document,r=Object.keys(te),s=st(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${V}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${V}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=te[m],c={type:m},l=I.round,f=He(t),g=f&&f.length?Te(f,l):"";return s?(u.forEach(p=>{c[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(c,t),Object.keys(c).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),c[p])})),Be(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},vt=an;var sn=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:c,y2:l,x:f,y:g}=n,[p,h]=i.slice(-2),P=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a)||M(m,a)===M(c*2-f,a)&&M(u,a)===M(l*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a))return["T",i[2],i[3]]}return P},Ze=sn;var mn=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},ie=mn;var un=(t,e)=>{let n=oe(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return T(n,(m,u,c,l)=>{r.x=c,r.y=l;let f=X(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=Ze(m,f,r,i),P=ie(h,o),S=P.join(""),A=be(h,u,c,l),y=ie(A,o),b=y.join("");g=S.length{let e=oe(t),n=J(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],c=u&&u[0],l=e[i+1],f=l&&l[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),P=a;switch(g){case"M":P=r?["Z"]:[g,p,h];break;case"A":P=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":l&&f==="S"?P=["S",a[1],a[2],p,h]:P=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":c&&"CS".includes(c)&&(!l||f!=="S")?P=["C",m[3],m[4],m[1],m[2],p,h]:P=[g,m[1],m[2],p,h];break;case"Q":l&&f==="T"?P=["T",p,h]:P=[g,a[1],a[2],p,h];break;case"T":c&&"QT".includes(c)&&(!l||f!=="T")?P=["Q",m[1],m[2],p,h]:P=[g,p,h];break;case"Z":P=["M",p,h];break;case"H":P=[g,p];break;case"V":P=[g,h];break;default:P=[g].concat(a.slice(1,-2),p,h)}return P});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Me=cn;var ln=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[c]=u,l=c.toUpperCase(),f=c.toLowerCase(),g=c===f,p=u.slice(1);l==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[l,a,i]:u]):(l==="Z"?(r=a,s=i):l==="H"?([,r]=u,r+=g?m.x:0):l==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},it=ln;var Zt=pt(require("@thednp/dommatrix"),1),pn=t=>{let e=new Zt.default,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},Ge=pn;var Gt=pt(require("@thednp/dommatrix"),1),fn=(t,e)=>{let n=Gt.default.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},gn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=fn(t,[e[0],e[1],0,1]),u=a-o,c=i-r,l=m-s;return[u*(Math.abs(s)/Math.abs(l)||1)+o,c*(Math.abs(s)/Math.abs(l)||1)+r]},Le=gn;var hn=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),c=e&&Object.keys(e);if(!e||c&&!c.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let l=e.origin,f=Ge(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,P)=>{[m]=g;let S=m.toUpperCase(),y=S!==m?_(g,p,h,P):g.slice(0),b=S==="A"?["C"].concat(ye(h,P,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",h,y[1]]:S==="H"?["L",y[1],P]:y;m=b[0];let d=m==="C"&&b.length>7,C=d?b.slice(0,7):b.slice(0);if(d&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=Le(f,[b[1],b[2]],l);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},Nt=bn;var yn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>ie(o,n))},wt=yn;var Pn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),c=E(i,m,n),l=E(m,u,n),f=E(c,l,n);return[["C",i[0],i[1],c[0],c[1],f[0],f[1]],["C",l[0],l[1],u[0],u[1],a[0],a[1]]]},zt=Pn;var Rt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${V}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,c,l]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(c)?0:c,Number.isNaN(l)?0:l]}return this.round=i,this.origin=m,this}get bbox(){return at(this.segments)}get length(){return K(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return me(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=oe(e),this}toRelative(){let{segments:e}=this;return this.segments=ot(e),this}toCurve(){let{segments:e}=this;return this.segments=ae(e),this}reverse(e){let{segments:n}=this,o=it(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Me(i):i.slice(0):Me(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Me(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=J(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=mt(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,c]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,c||s]}else a.origin=[o,r,s];return this.segments=ut(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return Te(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return Vt.default}static get arcTools(){return Je}static get bezierTools(){return Xe}static get cubicTools(){return et}static get lineTools(){return Fe}static get polygonTools(){return nt}static get quadTools(){return rt}static get pathToAbsolute(){return oe}static get pathToRelative(){return ot}static get pathToCurve(){return ae}static get pathToString(){return Te}static get distanceSquareRoot(){return re}static get midPoint(){return E}static get rotateVector(){return ne}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return Ae}static get invalidPathValue(){return j}static get isArcCommand(){return qe}static get isDigit(){return $}static get isDigitStart(){return Qe}static get isMoveCommand(){return De}static get isPathCommand(){return ke}static get isSpace(){return Ve}static get paramsCount(){return Z}static get paramsParser(){return U}static get pathParser(){return F}static get scanFlag(){return ze}static get scanParam(){return Re}static get scanSegment(){return he}static get skipSpaces(){return G}static get distanceEpsilon(){return se}static get getClosestPoint(){return xt}static get getDrawDirection(){return St}static get getPathArea(){return Ie}static get getPathBBox(){return at}static get getPointAtLength(){return me}static get getPropertiesAtLength(){return Pe}static get getPropertiesAtPoint(){return Y}static get getSegmentAtLength(){return At}static get getSegmentOfPoint(){return Ct}static get getTotalLength(){return K}static get isAbsoluteArray(){return $e}static get isCurveArray(){return Tt}static get isNormalizedArray(){return je}static get isPathArray(){return ee}static get isPointInStroke(){return Mt}static get isRelativeArray(){return Lt}static get isValidPath(){return Be}static get shapeParams(){return te}static get shapeToPath(){return vt}static get shapeToPathArray(){return He}static get absolutizeSegment(){return _}static get arcToCubic(){return ye}static get getSVGMatrix(){return Ge}static get iterate(){return T}static get lineToCubic(){return Ce}static get normalizePath(){return J}static get normalizeSegment(){return X}static get optimizePath(){return mt}static get projection2d(){return Le}static get quadToCubic(){return Ee}static get relativizeSegment(){return be}static get reverseCurve(){return Nt}static get reversePath(){return Me}static get roundPath(){return wt}static get roundSegment(){return ie}static get segmentToCubic(){return Oe}static get shortenSegment(){return Ze}static get splitCubic(){return zt}static get splitPath(){return it}static get transformPath(){return ut}},dn=Rt;0&&(module.exports={CSSMatrix,absolutizeSegment,arcToCubic,arcTools,bezierTools,cubicTools,distanceEpsilon,distanceSquareRoot,finalizeSegment,getClosestPoint,getDrawDirection,getPathArea,getPathBBox,getPointAtLength,getPropertiesAtLength,getPropertiesAtPoint,getSVGMatrix,getSegmentAtLength,getSegmentOfPoint,getTotalLength,invalidPathValue,isAbsoluteArray,isArcCommand,isCurveArray,isDigit,isDigitStart,isMoveCommand,isNormalizedArray,isPathArray,isPathCommand,isPointInStroke,isRelativeArray,isSpace,isValidPath,iterate,lineToCubic,lineTools,midPoint,normalizePath,normalizeSegment,optimizePath,paramsCount,paramsParser,parsePathString,pathParser,pathToAbsolute,pathToCurve,pathToRelative,pathToString,polygonTools,projection2d,quadToCubic,quadTools,relativizeSegment,reverseCurve,reversePath,rotateVector,roundPath,roundSegment,roundTo,scanFlag,scanParam,scanSegment,segmentToCubic,shapeParams,shapeToPath,shapeToPathArray,shortenSegment,skipSpaces,splitCubic,splitPath,transformPath}); //# sourceMappingURL=svg-path-commander.cjs.map \ No newline at end of file diff --git a/dist/svg-path-commander.cjs.map b/dist/svg-path-commander.cjs.map index b857577..866838a 100644 --- a/dist/svg-path-commander.cjs.map +++ b/dist/svg-path-commander.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/util.ts","../src/math/arcTools.ts","../src/math/lineTools.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/math/rotateVector.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/options/options.ts","../src/math/roundTo.ts","../src/convert/pathToString.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getTotalLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getPathBBox.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/getSVGMatrix.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/projection2d.ts","../src/process/reverseCurve.ts","../src/process/reversePath.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/process/splitPath.ts","../src/process/transformPath.ts"],"sourcesContent":["\"use strict\";\nimport * as util from \"./util\";\n// import CSSMatrix from \"@thednp/dommatrix\";\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n// import * as arcTools from \"./math/arcTools\";\n// import * as bezierTools from \"./math/bezier\";\n// import * as cubicTools from \"./math/cubicTools\";\n// import * as lineTools from \"./math/lineTools\";\n// import * as quadTools from \"./math/quadTools\";\n// import * as polygonTools from \"./math/polygonTools\";\n\n// import distanceSquareRoot from \"./math/distanceSquareRoot\";\n// import midPoint from \"./math/midPoint\";\n// import rotateVector from \"./math/rotateVector\";\n// import roundTo from \"./math/roundTo\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\n// import finalizeSegment from \"./parser/finalizeSegment\";\n// import invalidPathValue from \"./parser/invalidPathValue\";\n// import isArcCommand from \"./parser/isArcCommand\";\n// import isDigit from \"./parser/isDigit\";\n// import isDigitStart from \"./parser/isDigitStart\";\n// import isMoveCommand from \"./parser/isMoveCommand\";\n// import isPathCommand from \"./parser/isPathCommand\";\n// import isSpace from \"./parser/isSpace\";\n// import paramsCount from \"./parser/paramsCount\";\n// import paramsParser from \"./parser/paramsParser\";\n// import pathParser from \"./parser/pathParser\";\n// import scanFlag from \"./parser/scanFlag\";\n// import scanParam from \"./parser/scanParam\";\n// import scanSegment from \"./parser/scanSegment\";\n// import skipSpaces from \"./parser/skipSpaces\";\n\n// import distanceEpsilon from \"./util/distanceEpsilon\";\n// import getClosestPoint from \"./util/getClosestPoint\";\n// import getDrawDirection from \"./util/getDrawDirection\";\n// import getPathArea from \"./util/getPathArea\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getPointAtLength from \"./util/getPointAtLength\";\n// import getPropertiesAtLength from \"./util/getPropertiesAtLength\";\n// import getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\n// import getSegmentAtLength from \"./util/getSegmentAtLength\";\n// import getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport getTotalLength from \"./util/getTotalLength\";\n\n// import isAbsoluteArray from \"./util/isAbsoluteArray\";\n// import isCurveArray from \"./util/isCurveArray\";\n// import isNormalizedArray from \"./util/isNormalizedArray\";\n// import isPathArray from \"./util/isPathArray\";\n// import isPointInStroke from \"./util/isPointInStroke\";\n// import isRelativeArray from \"./util/isRelativeArray\";\n// import isValidPath from \"./util/isValidPath\";\n// import shapeParams from \"./util/shapeParams\";\n// import shapeToPath from \"./util/shapeToPath\";\n// import shapeToPathArray from \"./util/shapeToPathArray\";\n\n// import absolutizeSegment from \"./process/absolutizeSegment\";\n// import arcToCubic from \"./process/arcToCubic\";\n// import getSVGMatrix from \"./process/getSVGMatrix\";\n// import iterate from \"./process/iterate\";\n// import lineToCubic from \"./process/lineToCubic\";\nimport normalizePath from \"./process/normalizePath\";\n// import normalizeSegment from \"./process/normalizeSegment\";\nimport optimizePath from \"./process/optimizePath\";\n// import projection2d from \"./process/projection2d\";\n// import quadToCubic from \"./process/quadToCubic\";\n// import relativizeSegment from \"./process/relativizeSegment\";\n// import reverseCurve from \"./process/reverseCurve\";\nimport reversePath from \"./process/reversePath\";\n// import roundPath from \"./process/roundPath\";\n// import roundSegment from \"./process/roundSegment\";\n// import segmentToCubic from \"./process/segmentToCubic\";\n// import shortenSegment from \"./process/shortenSegment\";\n// import splitCubic from \"./process/splitCubic\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\n\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`,\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" || k === \"translate\" || k === \"origin\" ||\n k === \"scale\") && Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n}\n\n// export {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// // SVGPathCommander as default,\n// transformPath,\n// };\n\n// const index = {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// transformPath,\n// };\n\n// export { absolutizeSegment }\n// export { arcToCubic }\n// export { arcTools }\n// export { bezierTools }\n// export { CSSMatrix }\n// export { cubicTools }\n// export { distanceEpsilon }\n// export { distanceSquareRoot }\n// export { finalizeSegment }\n// export { getClosestPoint }\n// export { getDrawDirection }\n// export { getPathArea }\n// export { getPathBBox }\n// export { getPointAtLength }\n// export { getPropertiesAtLength }\n// export { getPropertiesAtPoint }\n// export { getSegmentAtLength }\n// export { getSegmentOfPoint }\n// export { getSVGMatrix }\n// export { getTotalLength }\n// export { invalidPathValue }\n// export { isAbsoluteArray }\n// export { isArcCommand }\n// export { isCurveArray }\n// export { isDigit }\n// export { isDigitStart }\n// export { isMoveCommand }\n// export { isNormalizedArray }\n// export { isPathArray }\n// export { isPathCommand }\n// export { isPointInStroke }\n// export { isRelativeArray }\n// export { isSpace }\n// export { isValidPath }\n// export { iterate }\n// export { lineToCubic }\n// export { lineTools }\n// export { midPoint }\n// export { normalizePath }\n// export { normalizeSegment }\n// export { optimizePath }\n// export { paramsCount }\n// export { paramsParser }\n// export { parsePathString }\n// export { pathParser }\n// export { pathToAbsolute }\n// export { pathToCurve }\n// export { pathToRelative }\n// export { pathToString }\n// export { polygonTools }\n// export { projection2d }\n// export { quadToCubic }\n// export { quadTools }\n// export { relativizeSegment }\n// export { reverseCurve }\n// export { reversePath }\n// export { rotateVector }\n// export { roundPath }\n// export { roundSegment }\n// export { roundTo }\n// export { scanFlag }\n// export { scanParam }\n// export { scanSegment }\n// export { segmentToCubic }\n// export { shapeParams }\n// export { shapeToPath }\n// export { shapeToPathArray }\n// export { shortenSegment }\n// export { skipSpaces }\n// export { splitCubic }\n// export { splitPath }\n// export { transformPath }\n// export { SVGPathCommander as default }\n// export default SVGPathCommander;\nconst defaultExport = Object.assign(SVGPathCommander, util);\n\nexport { defaultExport as default };\n// export default Object.assign(SVGPathCommander, index);\n","export { default as CSSMatrix } from \"@thednp/dommatrix\";\n// export type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\n// export type { Options, TransformEntries, TransformObject } from \"./interface\";\n// export * from \"./types\";\n// export * from \"./interface\";\n\nimport * as arcTools from \"./math/arcTools\";\nimport * as bezierTools from \"./math/bezier\";\nimport * as cubicTools from \"./math/cubicTools\";\nimport * as lineTools from \"./math/lineTools\";\nimport * as quadTools from \"./math/quadTools\";\nimport * as polygonTools from \"./math/polygonTools\";\nexport {\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n};\n\n// export * from \"./math/arcTools\";\n// export * from \"./math/bezier\";\n// export * from \"./math/cubicTools\";\n// export * from \"./math/lineTools\";\n// export * from \"./math/quadTools\";\n// export * from \"./math/polygonTools\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\n\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\n\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\n\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n"],"mappings":"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","names":["src_exports","__export","defaultExport","__toCommonJS","util_exports","__export","absolutizeSegment_default","arcToCubic_default","arcTools_exports","bezier_exports","cubicTools_exports","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools_exports","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools_exports","projection2d_default","quadToCubic_default","quadTools_exports","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","import_dommatrix","arcTools_exports","__export","angleBetween","arcLength","arcPoint","getArcBBox","getArcLength","getArcProps","getPointAtArcLength","lineTools_exports","__export","getLineBBox","getLineLength","getPointAtLineLength","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","bezier_exports","__export","CBEZIER_MINMAX_EPSILON","Cvalues","Tvalues","bezierLength","calculateBezier","computeBezier","deriveBezier","getBezierLength","minmaxC","minmaxQ","points","dpoints","p","d","c","list","j","t","order","mt","mt2","t2","a","b","derivativeFn","l","len","sum","i","curve","idx","step","v1","cp","v2","min","max","E","cp1","cp2","K","T","S","L","R","Q","cubicTools_exports","__export","getCubicBBox","getCubicLength","getPointAtCubicLength","getPointAtCubicSegmentLength","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","quadTools_exports","__export","getPointAtQuadLength","getPointAtQuadSegmentLength","getQuadBBox","getQuadLength","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","polygonTools_exports","__export","polygonArea","polygonLength","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","defaultOptions","options_default","roundTo","n","round","pow","roundTo_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","p","name","value","k","m","isValidPath_default","shapeToPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","defaultExport","util_exports"]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/math/arcTools.ts","../src/math/lineTools.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport * as arcTools from \"./math/arcTools\";\nimport * as bezierTools from \"./math/bezier\";\nimport * as cubicTools from \"./math/cubicTools\";\nimport * as lineTools from \"./math/lineTools\";\nimport * as quadTools from \"./math/quadTools\";\nimport * as polygonTools from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["src_exports","__export","CSSMatrix","absolutizeSegment_default","arcToCubic_default","arcTools_exports","bezier_exports","cubicTools_exports","src_default","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools_exports","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools_exports","projection2d_default","quadToCubic_default","quadTools_exports","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","__toCommonJS","import_dommatrix","arcTools_exports","__export","angleBetween","arcLength","arcPoint","getArcBBox","getArcLength","getArcProps","getPointAtArcLength","lineTools_exports","__export","getLineBBox","getLineLength","getPointAtLineLength","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","bezier_exports","__export","CBEZIER_MINMAX_EPSILON","Cvalues","Tvalues","bezierLength","calculateBezier","computeBezier","deriveBezier","getBezierLength","minmaxC","minmaxQ","points","dpoints","p","d","c","list","j","t","order","mt","mt2","t2","a","b","derivativeFn","l","len","sum","i","curve","idx","step","v1","cp","v2","min","max","E","cp1","cp2","K","T","S","L","R","Q","cubicTools_exports","__export","getCubicBBox","getCubicLength","getPointAtCubicLength","getPointAtCubicSegmentLength","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","quadTools_exports","__export","getPointAtQuadLength","getPointAtQuadSegmentLength","getQuadBBox","getQuadLength","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","polygonTools_exports","__export","polygonArea","polygonLength","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","l","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools_exports","bezier_exports","cubicTools_exports","lineTools_exports","polygonTools_exports","quadTools_exports","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","src_default"]} \ No newline at end of file diff --git a/dist/svg-path-commander.d.cts b/dist/svg-path-commander.d.cts index bd36475..851cadb 100644 --- a/dist/svg-path-commander.d.cts +++ b/dist/svg-path-commander.d.cts @@ -1,139 +1,5 @@ import CSSMatrix from '@thednp/dommatrix'; - -type SegmentProperties = { - segment: PathSegment; - index: number; - length: number; - lengthAtSegment: number; -}; -type PointProperties = { - closest: { - x: number; - y: number; - }; - distance: number; - segment?: SegmentProperties; -}; -type LineAttr = { - type: "line"; - x1: number; - y1: number; - x2: number; - y2: number; - [key: string]: string | number; -}; -type PolyAttr = { - type: "polygon" | "polyline"; - points: string; - [key: string]: string | number; -}; -type CircleAttr = { - type: "circle"; - cx: number; - cy: number; - r: number; - [key: string]: string | number; -}; -type EllipseAttr = { - type: "ellipse"; - cx: number; - cy: number; - rx: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type RectAttr = { - type: "rect"; - width: number; - height: number; - x: number; - y: number; - rx?: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type GlyphAttr = { - type: "glyph"; - d: string; - [key: string]: string | number; -}; -type ShapeParams = { - line: ["x1", "y1", "x2", "y2"]; - circle: ["cx", "cy", "r"]; - ellipse: ["cx", "cy", "rx", "ry"]; - rect: ["width", "height", "x", "y", "rx", "ry"]; - polygon: ["points"]; - polyline: ["points"]; - glyph: ["d"]; -}; -type PathBBox = { - width: number; - height: number; - x: number; - y: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; -}; -type SegmentLimits = { - min: { - x: number; - y: number; - }; - max: { - x: number; - y: number; - }; -}; -type ParserParams = { - x1: number; - y1: number; - x2: number; - y2: number; - x: number; - y: number; - qx: number | null; - qy: number | null; -}; -type LengthFactory = { - length: number; - point: { - x: number; - y: number; - }; - min: { - x: number; - y: number; - }; - max: { - x: number; - y: number; - }; -}; -type Options = { - round: "off" | number; - origin: number[]; -}; -type PathTransform = { - s: PathSegment; - c: string; - x: number; - y: number; -}; -type TransformObject = { - translate: number | number[]; - rotate: number | number[]; - scale: number | number[]; - skew: number | number[]; - origin: number[]; -}; -type TransformProps = keyof TransformObject; -type TransformEntries = [ - TransformProps, - TransformObject[TransformProps] -][]; +export { default as CSSMatrix } from '@thednp/dommatrix'; type SpaceNumber = 0x1680 | 0x180e | 0x2000 | 0x2001 | 0x2002 | 0x2003 | 0x2004 | 0x2005 | 0x2006 | 0x2007 | 0x2008 | 0x2009 | 0x200a | 0x202f | 0x205f | 0x3000 | 0xfeff | 0x0a | 0x0d | 0x2028 | 0x2029 | 0x20 | 0x09 | 0x0b | 0x0c | 0xa0 | 0x1680; type PathCommandNumber = 0x6d | 0x7a | 0x6c | 0x68 | 0x76 | 0x63 | 0x73 | 0x71 | 0x74 | 0x61; @@ -306,6 +172,141 @@ type LineCoordinates = [number, number, number, number]; type DeriveCallback = (t: number) => Point; type IteratorCallback = (segment: PathSegment, index: number, lastX: number, lastY: number) => PathSegment | false | void | undefined; +type SegmentProperties = { + segment: PathSegment; + index: number; + length: number; + lengthAtSegment: number; +}; +type PointProperties = { + closest: { + x: number; + y: number; + }; + distance: number; + segment?: SegmentProperties; +}; +type LineAttr = { + type: "line"; + x1: number; + y1: number; + x2: number; + y2: number; + [key: string]: string | number; +}; +type PolyAttr = { + type: "polygon" | "polyline"; + points: string; + [key: string]: string | number; +}; +type CircleAttr = { + type: "circle"; + cx: number; + cy: number; + r: number; + [key: string]: string | number; +}; +type EllipseAttr = { + type: "ellipse"; + cx: number; + cy: number; + rx: number; + ry?: number; + [key: string]: string | number | undefined; +}; +type RectAttr = { + type: "rect"; + width: number; + height: number; + x: number; + y: number; + rx?: number; + ry?: number; + [key: string]: string | number | undefined; +}; +type GlyphAttr = { + type: "glyph"; + d: string; + [key: string]: string | number; +}; +type ShapeParams = { + line: ["x1", "y1", "x2", "y2"]; + circle: ["cx", "cy", "r"]; + ellipse: ["cx", "cy", "rx", "ry"]; + rect: ["width", "height", "x", "y", "rx", "ry"]; + polygon: ["points"]; + polyline: ["points"]; + glyph: ["d"]; +}; +type PathBBox = { + width: number; + height: number; + x: number; + y: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; +}; +type SegmentLimits = { + min: { + x: number; + y: number; + }; + max: { + x: number; + y: number; + }; +}; +type ParserParams = { + x1: number; + y1: number; + x2: number; + y2: number; + x: number; + y: number; + qx: number | null; + qy: number | null; +}; +type LengthFactory = { + length: number; + point: { + x: number; + y: number; + }; + min: { + x: number; + y: number; + }; + max: { + x: number; + y: number; + }; +}; +type Options = { + round: "off" | number; + origin: number[]; +}; +type PathTransform = { + s: PathSegment; + c: string; + x: number; + y: number; +}; +type TransformObject = { + translate: number | number[]; + rotate: number | number[]; + scale: number | number[]; + skew: number | number[]; + origin: number[]; +}; +type TransformProps = keyof TransformObject; +type TransformEntries = [ + TransformProps, + TransformObject[TransformProps] +][]; + /** * Returns the Arc segment length. * @param rx radius along X axis @@ -456,18 +457,18 @@ declare const minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; */ declare const minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; -declare const bezier_CBEZIER_MINMAX_EPSILON: typeof CBEZIER_MINMAX_EPSILON; -declare const bezier_Cvalues: typeof Cvalues; -declare const bezier_Tvalues: typeof Tvalues; -declare const bezier_bezierLength: typeof bezierLength; -declare const bezier_calculateBezier: typeof calculateBezier; -declare const bezier_computeBezier: typeof computeBezier; -declare const bezier_deriveBezier: typeof deriveBezier; -declare const bezier_getBezierLength: typeof getBezierLength; -declare const bezier_minmaxC: typeof minmaxC; -declare const bezier_minmaxQ: typeof minmaxQ; -declare namespace bezier { - export { bezier_CBEZIER_MINMAX_EPSILON as CBEZIER_MINMAX_EPSILON, bezier_Cvalues as Cvalues, bezier_Tvalues as Tvalues, bezier_bezierLength as bezierLength, bezier_calculateBezier as calculateBezier, bezier_computeBezier as computeBezier, bezier_deriveBezier as deriveBezier, bezier_getBezierLength as getBezierLength, bezier_minmaxC as minmaxC, bezier_minmaxQ as minmaxQ }; +declare const bezierTools_CBEZIER_MINMAX_EPSILON: typeof CBEZIER_MINMAX_EPSILON; +declare const bezierTools_Cvalues: typeof Cvalues; +declare const bezierTools_Tvalues: typeof Tvalues; +declare const bezierTools_bezierLength: typeof bezierLength; +declare const bezierTools_calculateBezier: typeof calculateBezier; +declare const bezierTools_computeBezier: typeof computeBezier; +declare const bezierTools_deriveBezier: typeof deriveBezier; +declare const bezierTools_getBezierLength: typeof getBezierLength; +declare const bezierTools_minmaxC: typeof minmaxC; +declare const bezierTools_minmaxQ: typeof minmaxQ; +declare namespace bezierTools { + export { bezierTools_CBEZIER_MINMAX_EPSILON as CBEZIER_MINMAX_EPSILON, bezierTools_Cvalues as Cvalues, bezierTools_Tvalues as Tvalues, bezierTools_bezierLength as bezierLength, bezierTools_calculateBezier as calculateBezier, bezierTools_computeBezier as computeBezier, bezierTools_deriveBezier as deriveBezier, bezierTools_getBezierLength as getBezierLength, bezierTools_minmaxC as minmaxC, bezierTools_minmaxQ as minmaxQ }; } /** @@ -683,6 +684,43 @@ declare namespace polygonTools { export { polygonTools_polygonArea as polygonArea, polygonTools_polygonLength as polygonLength }; } +/** + * Returns the square root of the distance + * between two given points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @returns the distance value + */ +declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; + +/** + * Returns the coordinates of a specified distance + * ratio between two points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @param t the ratio + * @returns the midpoint coordinates + */ +declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; + +/** + * Returns an {x,y} vector rotated by a given + * angle in radian. + * + * @param x the initial vector x + * @param y the initial vector y + * @param rad the radian vector angle + * @returns the rotated vector + */ +declare const rotateVector: (x: number, y: number, rad: number) => { + x: number; + y: number; +}; + +declare const roundTo: (n: number, round: number) => number; + /** * Parses a path string value or object and returns an array * of segments, all converted to absolute values. @@ -723,43 +761,6 @@ declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; */ declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; -/** - * Returns the square root of the distance - * between two given points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @returns the distance value - */ -declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; - -/** - * Returns the coordinates of a specified distance - * ratio between two points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @param t the ratio - * @returns the midpoint coordinates - */ -declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; - -/** - * Returns an {x,y} vector rotated by a given - * angle in radian. - * - * @param x the initial vector x - * @param y the initial vector y - * @param rad the radian vector angle - * @returns the rotated vector - */ -declare const rotateVector: (x: number, y: number, rad: number) => { - x: number; - y: number; -}; - -declare const roundTo: (n: number, round: number) => number; - /** * Parses a path string value and returns an array * of segments we like to call `pathArray`. @@ -895,6 +896,26 @@ declare const scanSegment: (path: PathParser) => void; */ declare const skipSpaces: (path: PathParser) => void; +declare const getPathBBox: (pathInput: PathArray | string) => { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; +}; + +/** + * Returns the shape total length, or the equivalent to `shape.getTotalLength()`. + * + * @param pathInput the target `pathArray` + * @returns the shape total length + */ +declare const getTotalLength: (pathInput: string | PathArray) => number; + declare const DISTANCE_EPSILON = 0.00001; /** @@ -933,18 +954,6 @@ declare const getDrawDirection: (path: string | PathArray) => boolean; */ declare const getPathArea: (path: PathArray) => number; -declare const getPathBBox: (pathInput: PathArray | string) => { - x: number; - y: number; - width: number; - height: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; -}; - /** * Returns [x,y] coordinates of a point at a given length of a shape. * @@ -1000,14 +1009,6 @@ declare const getSegmentOfPoint: (path: string | PathArray, point: { y: number; }) => SegmentProperties | undefined; -/** - * Returns the shape total length, or the equivalent to `shape.getTotalLength()`. - * - * @param pathInput the target `pathArray` - * @returns the shape total length - */ -declare const getTotalLength: (pathInput: string | PathArray) => number; - /** * Iterates an array to check if it's a `pathArray` * with all absolute values. @@ -1111,6 +1112,59 @@ declare const shapeToPath: (element: ShapeTypes | ShapeOps, replace?: boolean, o */ declare const shapeToPathArray: (element: ShapeTypes | ShapeOps) => false | PathArray; +/** + * Normalizes a `pathArray` object for further processing: + * * convert segments to absolute values + * * convert shorthand path commands to their non-shorthand notation + * + * @param pathInput the string to be parsed or 'pathArray' + * @returns the normalized `pathArray` + */ +declare const normalizePath: (pathInput: string | PathArray) => NormalArray; + +/** + * Optimizes a `pathArray` object: + * * convert segments to shorthand if possible + * * select shortest segments from absolute and relative `pathArray`s + * + * @param pathInput a string or `pathArray` + * @param roundOption the amount of decimals to round values to + * @returns the optimized `pathArray` + */ +declare const optimizePath: (pathInput: PathArray, roundOption?: number) => PathArray; + +/** + * Reverses all segments of a `pathArray` and returns a new `pathArray` instance + * with absolute values. + * + * @param pathInput the source `pathArray` + * @returns the reversed `pathArray` + */ +declare const reversePath: (pathInput: PathArray) => PathArray; + +/** + * Split a path into an `Array` of sub-path strings. + * + * In the process, values are converted to absolute + * for visual consistency. + * + * @param pathInput the source `pathArray` + * @return an array with all sub-path strings + */ +declare const splitPath: (pathInput: PathArray) => PathArray[]; + +/** + * Apply a 2D / 3D transformation to a `pathArray` instance. + * + * Since *SVGElement* doesn't support 3D transformation, this function + * creates a 2D projection of the element. + * + * @param path the `pathArray` to apply transformation + * @param transform the transform functions `Object` + * @returns the resulted `pathArray` + */ +declare const transformPath: (pathInput: PathArray | string, transform?: Partial) => PathArray; + /** * Returns an absolute segment of a `PathArray` object. * @@ -1165,16 +1219,6 @@ declare const iterate: (path: PathArray, iterator: Iterator */ declare const lineToCubic: (x1: number, y1: number, x2: number, y2: number) => number[]; -/** - * Normalizes a `pathArray` object for further processing: - * * convert segments to absolute values - * * convert shorthand path commands to their non-shorthand notation - * - * @param pathInput the string to be parsed or 'pathArray' - * @returns the normalized `pathArray` - */ -declare const normalizePath: (pathInput: string | PathArray) => NormalArray; - /** * Normalizes a single segment of a `pathArray` object. * @@ -1184,17 +1228,6 @@ declare const normalizePath: (pathInput: string | PathArray) => NormalArray; */ declare const normalizeSegment: (segment: PathSegment, params: ParserParams) => NormalSegment; -/** - * Optimizes a `pathArray` object: - * * convert segments to shorthand if possible - * * select shortest segments from absolute and relative `pathArray`s - * - * @param pathInput a string or `pathArray` - * @param roundOption the amount of decimals to round values to - * @returns the optimized `pathArray` - */ -declare const optimizePath: (pathInput: PathArray, roundOption?: number) => PathArray; - /** * Returns the [x,y] projected coordinates for a given an [x,y] point * and an [x,y,z] perspective origin point. @@ -1244,15 +1277,6 @@ declare const relativizeSegment: (segment: PathSegment, index: number, lastX: nu */ declare const reverseCurve: (path: CurveArray) => CurveArray; -/** - * Reverses all segments of a `pathArray` and returns a new `pathArray` instance - * with absolute values. - * - * @param pathInput the source `pathArray` - * @returns the reversed `pathArray` - */ -declare const reversePath: (pathInput: PathArray) => PathArray; - /** * Rounds the values of a `pathArray` instance to * a specified amount of decimals and returns it. @@ -1294,102 +1318,6 @@ declare const shortenSegment: (segment: AbsoluteSegment, normalSegment: NormalSe */ declare const splitCubic: (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; -/** - * Split a path into an `Array` of sub-path strings. - * - * In the process, values are converted to absolute - * for visual consistency. - * - * @param pathInput the source `pathArray` - * @return an array with all sub-path strings - */ -declare const splitPath: (pathInput: PathArray) => PathArray[]; - -/** - * Apply a 2D / 3D transformation to a `pathArray` instance. - * - * Since *SVGElement* doesn't support 3D transformation, this function - * creates a 2D projection of the element. - * - * @param path the `pathArray` to apply transformation - * @param transform the transform functions `Object` - * @returns the resulted `pathArray` - */ -declare const transformPath: (pathInput: PathArray | string, transform?: Partial) => PathArray; - -declare const util_CSSMatrix: typeof CSSMatrix; -declare const util_absolutizeSegment: typeof absolutizeSegment; -declare const util_arcToCubic: typeof arcToCubic; -declare const util_arcTools: typeof arcTools; -declare const util_cubicTools: typeof cubicTools; -declare const util_distanceSquareRoot: typeof distanceSquareRoot; -declare const util_finalizeSegment: typeof finalizeSegment; -declare const util_getClosestPoint: typeof getClosestPoint; -declare const util_getDrawDirection: typeof getDrawDirection; -declare const util_getPathArea: typeof getPathArea; -declare const util_getPathBBox: typeof getPathBBox; -declare const util_getPointAtLength: typeof getPointAtLength; -declare const util_getPropertiesAtLength: typeof getPropertiesAtLength; -declare const util_getPropertiesAtPoint: typeof getPropertiesAtPoint; -declare const util_getSVGMatrix: typeof getSVGMatrix; -declare const util_getSegmentAtLength: typeof getSegmentAtLength; -declare const util_getSegmentOfPoint: typeof getSegmentOfPoint; -declare const util_getTotalLength: typeof getTotalLength; -declare const util_invalidPathValue: typeof invalidPathValue; -declare const util_isAbsoluteArray: typeof isAbsoluteArray; -declare const util_isArcCommand: typeof isArcCommand; -declare const util_isCurveArray: typeof isCurveArray; -declare const util_isDigit: typeof isDigit; -declare const util_isDigitStart: typeof isDigitStart; -declare const util_isMoveCommand: typeof isMoveCommand; -declare const util_isNormalizedArray: typeof isNormalizedArray; -declare const util_isPathArray: typeof isPathArray; -declare const util_isPathCommand: typeof isPathCommand; -declare const util_isPointInStroke: typeof isPointInStroke; -declare const util_isRelativeArray: typeof isRelativeArray; -declare const util_isSpace: typeof isSpace; -declare const util_isValidPath: typeof isValidPath; -declare const util_iterate: typeof iterate; -declare const util_lineToCubic: typeof lineToCubic; -declare const util_lineTools: typeof lineTools; -declare const util_midPoint: typeof midPoint; -declare const util_normalizePath: typeof normalizePath; -declare const util_normalizeSegment: typeof normalizeSegment; -declare const util_optimizePath: typeof optimizePath; -declare const util_paramsCount: typeof paramsCount; -declare const util_paramsParser: typeof paramsParser; -declare const util_parsePathString: typeof parsePathString; -declare const util_pathToAbsolute: typeof pathToAbsolute; -declare const util_pathToCurve: typeof pathToCurve; -declare const util_pathToRelative: typeof pathToRelative; -declare const util_pathToString: typeof pathToString; -declare const util_polygonTools: typeof polygonTools; -declare const util_projection2d: typeof projection2d; -declare const util_quadToCubic: typeof quadToCubic; -declare const util_quadTools: typeof quadTools; -declare const util_relativizeSegment: typeof relativizeSegment; -declare const util_reverseCurve: typeof reverseCurve; -declare const util_reversePath: typeof reversePath; -declare const util_rotateVector: typeof rotateVector; -declare const util_roundPath: typeof roundPath; -declare const util_roundSegment: typeof roundSegment; -declare const util_roundTo: typeof roundTo; -declare const util_scanFlag: typeof scanFlag; -declare const util_scanParam: typeof scanParam; -declare const util_scanSegment: typeof scanSegment; -declare const util_segmentToCubic: typeof segmentToCubic; -declare const util_shapeParams: typeof shapeParams; -declare const util_shapeToPath: typeof shapeToPath; -declare const util_shapeToPathArray: typeof shapeToPathArray; -declare const util_shortenSegment: typeof shortenSegment; -declare const util_skipSpaces: typeof skipSpaces; -declare const util_splitCubic: typeof splitCubic; -declare const util_splitPath: typeof splitPath; -declare const util_transformPath: typeof transformPath; -declare namespace util { - export { util_CSSMatrix as CSSMatrix, util_absolutizeSegment as absolutizeSegment, util_arcToCubic as arcToCubic, util_arcTools as arcTools, bezier as bezierTools, util_cubicTools as cubicTools, DISTANCE_EPSILON as distanceEpsilon, util_distanceSquareRoot as distanceSquareRoot, util_finalizeSegment as finalizeSegment, util_getClosestPoint as getClosestPoint, util_getDrawDirection as getDrawDirection, util_getPathArea as getPathArea, util_getPathBBox as getPathBBox, util_getPointAtLength as getPointAtLength, util_getPropertiesAtLength as getPropertiesAtLength, util_getPropertiesAtPoint as getPropertiesAtPoint, util_getSVGMatrix as getSVGMatrix, util_getSegmentAtLength as getSegmentAtLength, util_getSegmentOfPoint as getSegmentOfPoint, util_getTotalLength as getTotalLength, util_invalidPathValue as invalidPathValue, util_isAbsoluteArray as isAbsoluteArray, util_isArcCommand as isArcCommand, util_isCurveArray as isCurveArray, util_isDigit as isDigit, util_isDigitStart as isDigitStart, util_isMoveCommand as isMoveCommand, util_isNormalizedArray as isNormalizedArray, util_isPathArray as isPathArray, util_isPathCommand as isPathCommand, util_isPointInStroke as isPointInStroke, util_isRelativeArray as isRelativeArray, util_isSpace as isSpace, util_isValidPath as isValidPath, util_iterate as iterate, util_lineToCubic as lineToCubic, util_lineTools as lineTools, util_midPoint as midPoint, util_normalizePath as normalizePath, util_normalizeSegment as normalizeSegment, util_optimizePath as optimizePath, util_paramsCount as paramsCount, util_paramsParser as paramsParser, util_parsePathString as parsePathString, PathParser as pathParser, util_pathToAbsolute as pathToAbsolute, util_pathToCurve as pathToCurve, util_pathToRelative as pathToRelative, util_pathToString as pathToString, util_polygonTools as polygonTools, util_projection2d as projection2d, util_quadToCubic as quadToCubic, util_quadTools as quadTools, util_relativizeSegment as relativizeSegment, util_reverseCurve as reverseCurve, util_reversePath as reversePath, util_rotateVector as rotateVector, util_roundPath as roundPath, util_roundSegment as roundSegment, util_roundTo as roundTo, util_scanFlag as scanFlag, util_scanParam as scanParam, util_scanSegment as scanSegment, util_segmentToCubic as segmentToCubic, util_shapeParams as shapeParams, util_shapeToPath as shapeToPath, util_shapeToPathArray as shapeToPathArray, util_shortenSegment as shortenSegment, util_skipSpaces as skipSpaces, util_splitCubic as splitCubic, util_splitPath as splitPath, util_transformPath as transformPath }; -} - /** * Creates a new SVGPathCommander instance with the following properties: * * segments: `pathArray` @@ -1537,7 +1465,118 @@ declare class SVGPathCommander { * @return void */ dispose(): void; + static get CSSMatrix(): typeof CSSMatrix; + static get arcTools(): typeof arcTools; + static get bezierTools(): typeof bezierTools; + static get cubicTools(): typeof cubicTools; + static get lineTools(): typeof lineTools; + static get polygonTools(): typeof polygonTools; + static get quadTools(): typeof quadTools; + static get pathToAbsolute(): (pathInput: string | PathArray) => AbsoluteArray; + static get pathToRelative(): (pathInput: string | PathArray) => RelativeArray; + static get pathToCurve(): (pathInput: string | PathArray) => CurveArray; + static get pathToString(): (path: PathArray, roundOption?: number | "off") => string; + static get distanceSquareRoot(): (a: PointTuple, b: PointTuple) => number; + static get midPoint(): (a: PointTuple, b: PointTuple, t: number) => PointTuple; + static get rotateVector(): (x: number, y: number, rad: number) => { + x: number; + y: number; + }; + static get roundTo(): (n: number, round: number) => number; + static get parsePathString(): (pathInput: string | T) => PathArray; + static get finalizeSegment(): (path: PathParser) => void; + static get invalidPathValue(): string; + static get isArcCommand(): (code: number) => code is 97; + static get isDigit(): (code: number) => code is DigitNumber; + static get isDigitStart(): (code: number) => code is DigitNumber | 43 | 45 | 46; + static get isMoveCommand(): (code: number) => code is 109 | 77; + static get isPathCommand(): (code: number) => code is PathCommandNumber; + static get isSpace(): (ch: number) => ch is SpaceNumber; + static get paramsCount(): { + a: number; + c: number; + h: number; + l: number; + m: number; + r: number; + q: number; + s: number; + t: number; + v: number; + z: number; + }; + static get paramsParser(): ParserParams; + static get pathParser(): typeof PathParser; + static get scanFlag(): (path: PathParser) => void; + static get scanParam(): (path: PathParser) => void; + static get scanSegment(): (path: PathParser) => void; + static get skipSpaces(): (path: PathParser) => void; + static get distanceEpsilon(): number; + static get getClosestPoint(): (pathInput: string | PathArray, point: { + x: number; + y: number; + }) => { + x: number; + y: number; + }; + static get getDrawDirection(): (path: string | PathArray) => boolean; + static get getPathArea(): (path: PathArray) => number; + static get getPathBBox(): (pathInput: PathArray | string) => { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; + }; + static get getPointAtLength(): (pathInput: string | PathArray, distance?: number) => { + x: number; + y: number; + }; + static get getPropertiesAtLength(): (pathInput: string | PathArray, distance?: number) => SegmentProperties; + static get getPropertiesAtPoint(): (pathInput: string | PathArray, point: Point) => PointProperties; + static get getSegmentAtLength(): (pathInput: string | PathArray, distance?: number) => PathSegment | undefined; + static get getSegmentOfPoint(): (path: string | PathArray, point: { + x: number; + y: number; + }) => SegmentProperties | undefined; + static get getTotalLength(): (pathInput: string | PathArray) => number; + static get isAbsoluteArray(): (path: unknown) => path is AbsoluteArray; + static get isCurveArray(): (path: unknown) => path is CurveArray; + static get isNormalizedArray(): (path: unknown) => path is NormalArray; + static get isPathArray(): (path: unknown) => path is PathArray; + static get isPointInStroke(): (pathInput: string | PathArray, point: { + x: number; + y: number; + }) => boolean; + static get isRelativeArray(): (path: unknown) => path is RelativeArray; + static get isValidPath(): (pathString: string) => boolean; + static get shapeParams(): ShapeParams; + static get shapeToPath(): (element: ShapeTypes | ShapeOps, replace?: boolean, ownerDocument?: Document) => SVGPathElement | false; + static get shapeToPathArray(): (element: ShapeTypes | ShapeOps) => false | PathArray; + static get absolutizeSegment(): (segment: PathSegment, index: number, lastX: number, lastY: number) => AbsoluteSegment; + static get arcToCubic(): (X1: number, Y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, X2: number, Y2: number, recursive?: [number, number, number, number]) => number[]; + static get getSVGMatrix(): (transform: TransformObjectValues) => CSSMatrix; + static get iterate(): (path: PathArray, iterator: IteratorCallback) => T; + static get lineToCubic(): (x1: number, y1: number, x2: number, y2: number) => number[]; + static get normalizePath(): (pathInput: string | PathArray) => NormalArray; + static get normalizeSegment(): (segment: PathSegment, params: ParserParams) => NormalSegment; + static get optimizePath(): (pathInput: PathArray, roundOption?: number) => PathArray; + static get projection2d(): (m: CSSMatrix, point2D: PointTuple, origin: [number, number, number]) => PointTuple; + static get quadToCubic(): (x1: number, y1: number, qx: number, qy: number, x2: number, y2: number) => [number, number, number, number, number, number]; + static get relativizeSegment(): (segment: PathSegment, index: number, lastX: number, lastY: number) => MSegment | RelativeSegment; + static get reverseCurve(): (path: CurveArray) => CurveArray; + static get reversePath(): (pathInput: PathArray) => PathArray; + static get roundPath(): (path: PathArray, roundOption?: number | "off") => PathArray; + static get roundSegment(): (segment: T, roundOption: number) => T; + static get segmentToCubic(): (segment: PathSegment, params: ParserParams) => MSegment | CSegment; + static get shortenSegment(): (segment: AbsoluteSegment, normalSegment: NormalSegment, params: ParserParams, prevCommand: PathCommand) => ShortSegment; + static get splitCubic(): (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; + static get splitPath(): (pathInput: PathArray) => PathArray[]; + static get transformPath(): (pathInput: PathArray | string, transform?: Partial) => PathArray; } -declare const defaultExport: typeof SVGPathCommander & typeof util; -export { type ACommand, type ASegment, type AbsoluteArray, type AbsoluteCommand, type AbsoluteSegment, type ArcCoordinates, type ArcSegment, type CCommand, type CSegment, type CircleAttr, type CloseSegment, type CubicCoordinates, type CubicPoints, type CubicSegment, type CurveArray, type DeriveCallback, type DerivedCubicPoints, type DerivedPoint, type DerivedQuadPoints, type DigitNumber, type EllipseAttr, type GlyphAttr, type HCommand, type HSegment, type HorLineSegment, type IteratorCallback, type LCommand, type LSegment, type LengthFactory, type LineAttr, type LineCoordinates, type LineSegment, type MCommand, type MSegment, type MoveSegment, type NormalArray, type NormalSegment, type Options, type ParserParams, type PathArray, type PathBBox, type PathCommand, type PathCommandNumber, type PathSegment, type PathTransform, type Point, type PointProperties, type PointTuple, type PolyAttr, type PolygonArray, type PolylineArray, type QCommand, type QSegment, type QuadCoordinates, type QuadPoints, type QuadSegment, type RectAttr, type RelativeArray, type RelativeCommand, type RelativeSegment, type SCommand, type SSegment, type SegmentLimits, type SegmentProperties, type ShapeOps, type ShapeParams, type ShapeTags, type ShapeTypes, type ShortCubicSegment, type ShortQuadSegment, type ShortSegment, type SpaceNumber, type TCommand, type TSegment, type TransformEntries, type TransformObject, type TransformObjectValues, type TransformProps, type VCommand, type VSegment, type VertLineSegment, type ZCommand, type ZSegment, type aCommand, type aSegment, type cCommand, type cSegment, defaultExport as default, type hCommand, type hSegment, type lCommand, type lSegment, type mCommand, type mSegment, type qCommand, type qSegment, type sCommand, type sSegment, type tCommand, type tSegment, type vCommand, type vSegment, type zCommand, type zSegment }; +export { type ACommand, type ASegment, type AbsoluteArray, type AbsoluteCommand, type AbsoluteSegment, type ArcCoordinates, type ArcSegment, type CCommand, type CSegment, type CircleAttr, type CloseSegment, type CubicCoordinates, type CubicPoints, type CubicSegment, type CurveArray, type DeriveCallback, type DerivedCubicPoints, type DerivedPoint, type DerivedQuadPoints, type DigitNumber, type EllipseAttr, type GlyphAttr, type HCommand, type HSegment, type HorLineSegment, type IteratorCallback, type LCommand, type LSegment, type LengthFactory, type LineAttr, type LineCoordinates, type LineSegment, type MCommand, type MSegment, type MoveSegment, type NormalArray, type NormalSegment, type Options, type ParserParams, type PathArray, type PathBBox, type PathCommand, type PathCommandNumber, type PathSegment, type PathTransform, type Point, type PointProperties, type PointTuple, type PolyAttr, type PolygonArray, type PolylineArray, type QCommand, type QSegment, type QuadCoordinates, type QuadPoints, type QuadSegment, type RectAttr, type RelativeArray, type RelativeCommand, type RelativeSegment, type SCommand, type SSegment, type SegmentLimits, type SegmentProperties, type ShapeOps, type ShapeParams, type ShapeTags, type ShapeTypes, type ShortCubicSegment, type ShortQuadSegment, type ShortSegment, type SpaceNumber, type TCommand, type TSegment, type TransformEntries, type TransformObject, type TransformObjectValues, type TransformProps, type VCommand, type VSegment, type VertLineSegment, type ZCommand, type ZSegment, type aCommand, type aSegment, absolutizeSegment, arcToCubic, arcTools, bezierTools, type cCommand, type cSegment, cubicTools, SVGPathCommander as default, DISTANCE_EPSILON as distanceEpsilon, distanceSquareRoot, finalizeSegment, getClosestPoint, getDrawDirection, getPathArea, getPathBBox, getPointAtLength, getPropertiesAtLength, getPropertiesAtPoint, getSVGMatrix, getSegmentAtLength, getSegmentOfPoint, getTotalLength, type hCommand, type hSegment, invalidPathValue, isAbsoluteArray, isArcCommand, isCurveArray, isDigit, isDigitStart, isMoveCommand, isNormalizedArray, isPathArray, isPathCommand, isPointInStroke, isRelativeArray, isSpace, isValidPath, iterate, type lCommand, type lSegment, lineToCubic, lineTools, type mCommand, type mSegment, midPoint, normalizePath, normalizeSegment, optimizePath, paramsCount, paramsParser, parsePathString, PathParser as pathParser, pathToAbsolute, pathToCurve, pathToRelative, pathToString, polygonTools, projection2d, type qCommand, type qSegment, quadToCubic, quadTools, relativizeSegment, reverseCurve, reversePath, rotateVector, roundPath, roundSegment, roundTo, type sCommand, type sSegment, scanFlag, scanParam, scanSegment, segmentToCubic, shapeParams, shapeToPath, shapeToPathArray, shortenSegment, skipSpaces, splitCubic, splitPath, type tCommand, type tSegment, transformPath, type vCommand, type vSegment, type zCommand, type zSegment }; diff --git a/dist/svg-path-commander.d.ts b/dist/svg-path-commander.d.ts index bd36475..851cadb 100644 --- a/dist/svg-path-commander.d.ts +++ b/dist/svg-path-commander.d.ts @@ -1,139 +1,5 @@ import CSSMatrix from '@thednp/dommatrix'; - -type SegmentProperties = { - segment: PathSegment; - index: number; - length: number; - lengthAtSegment: number; -}; -type PointProperties = { - closest: { - x: number; - y: number; - }; - distance: number; - segment?: SegmentProperties; -}; -type LineAttr = { - type: "line"; - x1: number; - y1: number; - x2: number; - y2: number; - [key: string]: string | number; -}; -type PolyAttr = { - type: "polygon" | "polyline"; - points: string; - [key: string]: string | number; -}; -type CircleAttr = { - type: "circle"; - cx: number; - cy: number; - r: number; - [key: string]: string | number; -}; -type EllipseAttr = { - type: "ellipse"; - cx: number; - cy: number; - rx: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type RectAttr = { - type: "rect"; - width: number; - height: number; - x: number; - y: number; - rx?: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type GlyphAttr = { - type: "glyph"; - d: string; - [key: string]: string | number; -}; -type ShapeParams = { - line: ["x1", "y1", "x2", "y2"]; - circle: ["cx", "cy", "r"]; - ellipse: ["cx", "cy", "rx", "ry"]; - rect: ["width", "height", "x", "y", "rx", "ry"]; - polygon: ["points"]; - polyline: ["points"]; - glyph: ["d"]; -}; -type PathBBox = { - width: number; - height: number; - x: number; - y: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; -}; -type SegmentLimits = { - min: { - x: number; - y: number; - }; - max: { - x: number; - y: number; - }; -}; -type ParserParams = { - x1: number; - y1: number; - x2: number; - y2: number; - x: number; - y: number; - qx: number | null; - qy: number | null; -}; -type LengthFactory = { - length: number; - point: { - x: number; - y: number; - }; - min: { - x: number; - y: number; - }; - max: { - x: number; - y: number; - }; -}; -type Options = { - round: "off" | number; - origin: number[]; -}; -type PathTransform = { - s: PathSegment; - c: string; - x: number; - y: number; -}; -type TransformObject = { - translate: number | number[]; - rotate: number | number[]; - scale: number | number[]; - skew: number | number[]; - origin: number[]; -}; -type TransformProps = keyof TransformObject; -type TransformEntries = [ - TransformProps, - TransformObject[TransformProps] -][]; +export { default as CSSMatrix } from '@thednp/dommatrix'; type SpaceNumber = 0x1680 | 0x180e | 0x2000 | 0x2001 | 0x2002 | 0x2003 | 0x2004 | 0x2005 | 0x2006 | 0x2007 | 0x2008 | 0x2009 | 0x200a | 0x202f | 0x205f | 0x3000 | 0xfeff | 0x0a | 0x0d | 0x2028 | 0x2029 | 0x20 | 0x09 | 0x0b | 0x0c | 0xa0 | 0x1680; type PathCommandNumber = 0x6d | 0x7a | 0x6c | 0x68 | 0x76 | 0x63 | 0x73 | 0x71 | 0x74 | 0x61; @@ -306,6 +172,141 @@ type LineCoordinates = [number, number, number, number]; type DeriveCallback = (t: number) => Point; type IteratorCallback = (segment: PathSegment, index: number, lastX: number, lastY: number) => PathSegment | false | void | undefined; +type SegmentProperties = { + segment: PathSegment; + index: number; + length: number; + lengthAtSegment: number; +}; +type PointProperties = { + closest: { + x: number; + y: number; + }; + distance: number; + segment?: SegmentProperties; +}; +type LineAttr = { + type: "line"; + x1: number; + y1: number; + x2: number; + y2: number; + [key: string]: string | number; +}; +type PolyAttr = { + type: "polygon" | "polyline"; + points: string; + [key: string]: string | number; +}; +type CircleAttr = { + type: "circle"; + cx: number; + cy: number; + r: number; + [key: string]: string | number; +}; +type EllipseAttr = { + type: "ellipse"; + cx: number; + cy: number; + rx: number; + ry?: number; + [key: string]: string | number | undefined; +}; +type RectAttr = { + type: "rect"; + width: number; + height: number; + x: number; + y: number; + rx?: number; + ry?: number; + [key: string]: string | number | undefined; +}; +type GlyphAttr = { + type: "glyph"; + d: string; + [key: string]: string | number; +}; +type ShapeParams = { + line: ["x1", "y1", "x2", "y2"]; + circle: ["cx", "cy", "r"]; + ellipse: ["cx", "cy", "rx", "ry"]; + rect: ["width", "height", "x", "y", "rx", "ry"]; + polygon: ["points"]; + polyline: ["points"]; + glyph: ["d"]; +}; +type PathBBox = { + width: number; + height: number; + x: number; + y: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; +}; +type SegmentLimits = { + min: { + x: number; + y: number; + }; + max: { + x: number; + y: number; + }; +}; +type ParserParams = { + x1: number; + y1: number; + x2: number; + y2: number; + x: number; + y: number; + qx: number | null; + qy: number | null; +}; +type LengthFactory = { + length: number; + point: { + x: number; + y: number; + }; + min: { + x: number; + y: number; + }; + max: { + x: number; + y: number; + }; +}; +type Options = { + round: "off" | number; + origin: number[]; +}; +type PathTransform = { + s: PathSegment; + c: string; + x: number; + y: number; +}; +type TransformObject = { + translate: number | number[]; + rotate: number | number[]; + scale: number | number[]; + skew: number | number[]; + origin: number[]; +}; +type TransformProps = keyof TransformObject; +type TransformEntries = [ + TransformProps, + TransformObject[TransformProps] +][]; + /** * Returns the Arc segment length. * @param rx radius along X axis @@ -456,18 +457,18 @@ declare const minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; */ declare const minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; -declare const bezier_CBEZIER_MINMAX_EPSILON: typeof CBEZIER_MINMAX_EPSILON; -declare const bezier_Cvalues: typeof Cvalues; -declare const bezier_Tvalues: typeof Tvalues; -declare const bezier_bezierLength: typeof bezierLength; -declare const bezier_calculateBezier: typeof calculateBezier; -declare const bezier_computeBezier: typeof computeBezier; -declare const bezier_deriveBezier: typeof deriveBezier; -declare const bezier_getBezierLength: typeof getBezierLength; -declare const bezier_minmaxC: typeof minmaxC; -declare const bezier_minmaxQ: typeof minmaxQ; -declare namespace bezier { - export { bezier_CBEZIER_MINMAX_EPSILON as CBEZIER_MINMAX_EPSILON, bezier_Cvalues as Cvalues, bezier_Tvalues as Tvalues, bezier_bezierLength as bezierLength, bezier_calculateBezier as calculateBezier, bezier_computeBezier as computeBezier, bezier_deriveBezier as deriveBezier, bezier_getBezierLength as getBezierLength, bezier_minmaxC as minmaxC, bezier_minmaxQ as minmaxQ }; +declare const bezierTools_CBEZIER_MINMAX_EPSILON: typeof CBEZIER_MINMAX_EPSILON; +declare const bezierTools_Cvalues: typeof Cvalues; +declare const bezierTools_Tvalues: typeof Tvalues; +declare const bezierTools_bezierLength: typeof bezierLength; +declare const bezierTools_calculateBezier: typeof calculateBezier; +declare const bezierTools_computeBezier: typeof computeBezier; +declare const bezierTools_deriveBezier: typeof deriveBezier; +declare const bezierTools_getBezierLength: typeof getBezierLength; +declare const bezierTools_minmaxC: typeof minmaxC; +declare const bezierTools_minmaxQ: typeof minmaxQ; +declare namespace bezierTools { + export { bezierTools_CBEZIER_MINMAX_EPSILON as CBEZIER_MINMAX_EPSILON, bezierTools_Cvalues as Cvalues, bezierTools_Tvalues as Tvalues, bezierTools_bezierLength as bezierLength, bezierTools_calculateBezier as calculateBezier, bezierTools_computeBezier as computeBezier, bezierTools_deriveBezier as deriveBezier, bezierTools_getBezierLength as getBezierLength, bezierTools_minmaxC as minmaxC, bezierTools_minmaxQ as minmaxQ }; } /** @@ -683,6 +684,43 @@ declare namespace polygonTools { export { polygonTools_polygonArea as polygonArea, polygonTools_polygonLength as polygonLength }; } +/** + * Returns the square root of the distance + * between two given points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @returns the distance value + */ +declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; + +/** + * Returns the coordinates of a specified distance + * ratio between two points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @param t the ratio + * @returns the midpoint coordinates + */ +declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; + +/** + * Returns an {x,y} vector rotated by a given + * angle in radian. + * + * @param x the initial vector x + * @param y the initial vector y + * @param rad the radian vector angle + * @returns the rotated vector + */ +declare const rotateVector: (x: number, y: number, rad: number) => { + x: number; + y: number; +}; + +declare const roundTo: (n: number, round: number) => number; + /** * Parses a path string value or object and returns an array * of segments, all converted to absolute values. @@ -723,43 +761,6 @@ declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; */ declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; -/** - * Returns the square root of the distance - * between two given points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @returns the distance value - */ -declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; - -/** - * Returns the coordinates of a specified distance - * ratio between two points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @param t the ratio - * @returns the midpoint coordinates - */ -declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; - -/** - * Returns an {x,y} vector rotated by a given - * angle in radian. - * - * @param x the initial vector x - * @param y the initial vector y - * @param rad the radian vector angle - * @returns the rotated vector - */ -declare const rotateVector: (x: number, y: number, rad: number) => { - x: number; - y: number; -}; - -declare const roundTo: (n: number, round: number) => number; - /** * Parses a path string value and returns an array * of segments we like to call `pathArray`. @@ -895,6 +896,26 @@ declare const scanSegment: (path: PathParser) => void; */ declare const skipSpaces: (path: PathParser) => void; +declare const getPathBBox: (pathInput: PathArray | string) => { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; +}; + +/** + * Returns the shape total length, or the equivalent to `shape.getTotalLength()`. + * + * @param pathInput the target `pathArray` + * @returns the shape total length + */ +declare const getTotalLength: (pathInput: string | PathArray) => number; + declare const DISTANCE_EPSILON = 0.00001; /** @@ -933,18 +954,6 @@ declare const getDrawDirection: (path: string | PathArray) => boolean; */ declare const getPathArea: (path: PathArray) => number; -declare const getPathBBox: (pathInput: PathArray | string) => { - x: number; - y: number; - width: number; - height: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; -}; - /** * Returns [x,y] coordinates of a point at a given length of a shape. * @@ -1000,14 +1009,6 @@ declare const getSegmentOfPoint: (path: string | PathArray, point: { y: number; }) => SegmentProperties | undefined; -/** - * Returns the shape total length, or the equivalent to `shape.getTotalLength()`. - * - * @param pathInput the target `pathArray` - * @returns the shape total length - */ -declare const getTotalLength: (pathInput: string | PathArray) => number; - /** * Iterates an array to check if it's a `pathArray` * with all absolute values. @@ -1111,6 +1112,59 @@ declare const shapeToPath: (element: ShapeTypes | ShapeOps, replace?: boolean, o */ declare const shapeToPathArray: (element: ShapeTypes | ShapeOps) => false | PathArray; +/** + * Normalizes a `pathArray` object for further processing: + * * convert segments to absolute values + * * convert shorthand path commands to their non-shorthand notation + * + * @param pathInput the string to be parsed or 'pathArray' + * @returns the normalized `pathArray` + */ +declare const normalizePath: (pathInput: string | PathArray) => NormalArray; + +/** + * Optimizes a `pathArray` object: + * * convert segments to shorthand if possible + * * select shortest segments from absolute and relative `pathArray`s + * + * @param pathInput a string or `pathArray` + * @param roundOption the amount of decimals to round values to + * @returns the optimized `pathArray` + */ +declare const optimizePath: (pathInput: PathArray, roundOption?: number) => PathArray; + +/** + * Reverses all segments of a `pathArray` and returns a new `pathArray` instance + * with absolute values. + * + * @param pathInput the source `pathArray` + * @returns the reversed `pathArray` + */ +declare const reversePath: (pathInput: PathArray) => PathArray; + +/** + * Split a path into an `Array` of sub-path strings. + * + * In the process, values are converted to absolute + * for visual consistency. + * + * @param pathInput the source `pathArray` + * @return an array with all sub-path strings + */ +declare const splitPath: (pathInput: PathArray) => PathArray[]; + +/** + * Apply a 2D / 3D transformation to a `pathArray` instance. + * + * Since *SVGElement* doesn't support 3D transformation, this function + * creates a 2D projection of the element. + * + * @param path the `pathArray` to apply transformation + * @param transform the transform functions `Object` + * @returns the resulted `pathArray` + */ +declare const transformPath: (pathInput: PathArray | string, transform?: Partial) => PathArray; + /** * Returns an absolute segment of a `PathArray` object. * @@ -1165,16 +1219,6 @@ declare const iterate: (path: PathArray, iterator: Iterator */ declare const lineToCubic: (x1: number, y1: number, x2: number, y2: number) => number[]; -/** - * Normalizes a `pathArray` object for further processing: - * * convert segments to absolute values - * * convert shorthand path commands to their non-shorthand notation - * - * @param pathInput the string to be parsed or 'pathArray' - * @returns the normalized `pathArray` - */ -declare const normalizePath: (pathInput: string | PathArray) => NormalArray; - /** * Normalizes a single segment of a `pathArray` object. * @@ -1184,17 +1228,6 @@ declare const normalizePath: (pathInput: string | PathArray) => NormalArray; */ declare const normalizeSegment: (segment: PathSegment, params: ParserParams) => NormalSegment; -/** - * Optimizes a `pathArray` object: - * * convert segments to shorthand if possible - * * select shortest segments from absolute and relative `pathArray`s - * - * @param pathInput a string or `pathArray` - * @param roundOption the amount of decimals to round values to - * @returns the optimized `pathArray` - */ -declare const optimizePath: (pathInput: PathArray, roundOption?: number) => PathArray; - /** * Returns the [x,y] projected coordinates for a given an [x,y] point * and an [x,y,z] perspective origin point. @@ -1244,15 +1277,6 @@ declare const relativizeSegment: (segment: PathSegment, index: number, lastX: nu */ declare const reverseCurve: (path: CurveArray) => CurveArray; -/** - * Reverses all segments of a `pathArray` and returns a new `pathArray` instance - * with absolute values. - * - * @param pathInput the source `pathArray` - * @returns the reversed `pathArray` - */ -declare const reversePath: (pathInput: PathArray) => PathArray; - /** * Rounds the values of a `pathArray` instance to * a specified amount of decimals and returns it. @@ -1294,102 +1318,6 @@ declare const shortenSegment: (segment: AbsoluteSegment, normalSegment: NormalSe */ declare const splitCubic: (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; -/** - * Split a path into an `Array` of sub-path strings. - * - * In the process, values are converted to absolute - * for visual consistency. - * - * @param pathInput the source `pathArray` - * @return an array with all sub-path strings - */ -declare const splitPath: (pathInput: PathArray) => PathArray[]; - -/** - * Apply a 2D / 3D transformation to a `pathArray` instance. - * - * Since *SVGElement* doesn't support 3D transformation, this function - * creates a 2D projection of the element. - * - * @param path the `pathArray` to apply transformation - * @param transform the transform functions `Object` - * @returns the resulted `pathArray` - */ -declare const transformPath: (pathInput: PathArray | string, transform?: Partial) => PathArray; - -declare const util_CSSMatrix: typeof CSSMatrix; -declare const util_absolutizeSegment: typeof absolutizeSegment; -declare const util_arcToCubic: typeof arcToCubic; -declare const util_arcTools: typeof arcTools; -declare const util_cubicTools: typeof cubicTools; -declare const util_distanceSquareRoot: typeof distanceSquareRoot; -declare const util_finalizeSegment: typeof finalizeSegment; -declare const util_getClosestPoint: typeof getClosestPoint; -declare const util_getDrawDirection: typeof getDrawDirection; -declare const util_getPathArea: typeof getPathArea; -declare const util_getPathBBox: typeof getPathBBox; -declare const util_getPointAtLength: typeof getPointAtLength; -declare const util_getPropertiesAtLength: typeof getPropertiesAtLength; -declare const util_getPropertiesAtPoint: typeof getPropertiesAtPoint; -declare const util_getSVGMatrix: typeof getSVGMatrix; -declare const util_getSegmentAtLength: typeof getSegmentAtLength; -declare const util_getSegmentOfPoint: typeof getSegmentOfPoint; -declare const util_getTotalLength: typeof getTotalLength; -declare const util_invalidPathValue: typeof invalidPathValue; -declare const util_isAbsoluteArray: typeof isAbsoluteArray; -declare const util_isArcCommand: typeof isArcCommand; -declare const util_isCurveArray: typeof isCurveArray; -declare const util_isDigit: typeof isDigit; -declare const util_isDigitStart: typeof isDigitStart; -declare const util_isMoveCommand: typeof isMoveCommand; -declare const util_isNormalizedArray: typeof isNormalizedArray; -declare const util_isPathArray: typeof isPathArray; -declare const util_isPathCommand: typeof isPathCommand; -declare const util_isPointInStroke: typeof isPointInStroke; -declare const util_isRelativeArray: typeof isRelativeArray; -declare const util_isSpace: typeof isSpace; -declare const util_isValidPath: typeof isValidPath; -declare const util_iterate: typeof iterate; -declare const util_lineToCubic: typeof lineToCubic; -declare const util_lineTools: typeof lineTools; -declare const util_midPoint: typeof midPoint; -declare const util_normalizePath: typeof normalizePath; -declare const util_normalizeSegment: typeof normalizeSegment; -declare const util_optimizePath: typeof optimizePath; -declare const util_paramsCount: typeof paramsCount; -declare const util_paramsParser: typeof paramsParser; -declare const util_parsePathString: typeof parsePathString; -declare const util_pathToAbsolute: typeof pathToAbsolute; -declare const util_pathToCurve: typeof pathToCurve; -declare const util_pathToRelative: typeof pathToRelative; -declare const util_pathToString: typeof pathToString; -declare const util_polygonTools: typeof polygonTools; -declare const util_projection2d: typeof projection2d; -declare const util_quadToCubic: typeof quadToCubic; -declare const util_quadTools: typeof quadTools; -declare const util_relativizeSegment: typeof relativizeSegment; -declare const util_reverseCurve: typeof reverseCurve; -declare const util_reversePath: typeof reversePath; -declare const util_rotateVector: typeof rotateVector; -declare const util_roundPath: typeof roundPath; -declare const util_roundSegment: typeof roundSegment; -declare const util_roundTo: typeof roundTo; -declare const util_scanFlag: typeof scanFlag; -declare const util_scanParam: typeof scanParam; -declare const util_scanSegment: typeof scanSegment; -declare const util_segmentToCubic: typeof segmentToCubic; -declare const util_shapeParams: typeof shapeParams; -declare const util_shapeToPath: typeof shapeToPath; -declare const util_shapeToPathArray: typeof shapeToPathArray; -declare const util_shortenSegment: typeof shortenSegment; -declare const util_skipSpaces: typeof skipSpaces; -declare const util_splitCubic: typeof splitCubic; -declare const util_splitPath: typeof splitPath; -declare const util_transformPath: typeof transformPath; -declare namespace util { - export { util_CSSMatrix as CSSMatrix, util_absolutizeSegment as absolutizeSegment, util_arcToCubic as arcToCubic, util_arcTools as arcTools, bezier as bezierTools, util_cubicTools as cubicTools, DISTANCE_EPSILON as distanceEpsilon, util_distanceSquareRoot as distanceSquareRoot, util_finalizeSegment as finalizeSegment, util_getClosestPoint as getClosestPoint, util_getDrawDirection as getDrawDirection, util_getPathArea as getPathArea, util_getPathBBox as getPathBBox, util_getPointAtLength as getPointAtLength, util_getPropertiesAtLength as getPropertiesAtLength, util_getPropertiesAtPoint as getPropertiesAtPoint, util_getSVGMatrix as getSVGMatrix, util_getSegmentAtLength as getSegmentAtLength, util_getSegmentOfPoint as getSegmentOfPoint, util_getTotalLength as getTotalLength, util_invalidPathValue as invalidPathValue, util_isAbsoluteArray as isAbsoluteArray, util_isArcCommand as isArcCommand, util_isCurveArray as isCurveArray, util_isDigit as isDigit, util_isDigitStart as isDigitStart, util_isMoveCommand as isMoveCommand, util_isNormalizedArray as isNormalizedArray, util_isPathArray as isPathArray, util_isPathCommand as isPathCommand, util_isPointInStroke as isPointInStroke, util_isRelativeArray as isRelativeArray, util_isSpace as isSpace, util_isValidPath as isValidPath, util_iterate as iterate, util_lineToCubic as lineToCubic, util_lineTools as lineTools, util_midPoint as midPoint, util_normalizePath as normalizePath, util_normalizeSegment as normalizeSegment, util_optimizePath as optimizePath, util_paramsCount as paramsCount, util_paramsParser as paramsParser, util_parsePathString as parsePathString, PathParser as pathParser, util_pathToAbsolute as pathToAbsolute, util_pathToCurve as pathToCurve, util_pathToRelative as pathToRelative, util_pathToString as pathToString, util_polygonTools as polygonTools, util_projection2d as projection2d, util_quadToCubic as quadToCubic, util_quadTools as quadTools, util_relativizeSegment as relativizeSegment, util_reverseCurve as reverseCurve, util_reversePath as reversePath, util_rotateVector as rotateVector, util_roundPath as roundPath, util_roundSegment as roundSegment, util_roundTo as roundTo, util_scanFlag as scanFlag, util_scanParam as scanParam, util_scanSegment as scanSegment, util_segmentToCubic as segmentToCubic, util_shapeParams as shapeParams, util_shapeToPath as shapeToPath, util_shapeToPathArray as shapeToPathArray, util_shortenSegment as shortenSegment, util_skipSpaces as skipSpaces, util_splitCubic as splitCubic, util_splitPath as splitPath, util_transformPath as transformPath }; -} - /** * Creates a new SVGPathCommander instance with the following properties: * * segments: `pathArray` @@ -1537,7 +1465,118 @@ declare class SVGPathCommander { * @return void */ dispose(): void; + static get CSSMatrix(): typeof CSSMatrix; + static get arcTools(): typeof arcTools; + static get bezierTools(): typeof bezierTools; + static get cubicTools(): typeof cubicTools; + static get lineTools(): typeof lineTools; + static get polygonTools(): typeof polygonTools; + static get quadTools(): typeof quadTools; + static get pathToAbsolute(): (pathInput: string | PathArray) => AbsoluteArray; + static get pathToRelative(): (pathInput: string | PathArray) => RelativeArray; + static get pathToCurve(): (pathInput: string | PathArray) => CurveArray; + static get pathToString(): (path: PathArray, roundOption?: number | "off") => string; + static get distanceSquareRoot(): (a: PointTuple, b: PointTuple) => number; + static get midPoint(): (a: PointTuple, b: PointTuple, t: number) => PointTuple; + static get rotateVector(): (x: number, y: number, rad: number) => { + x: number; + y: number; + }; + static get roundTo(): (n: number, round: number) => number; + static get parsePathString(): (pathInput: string | T) => PathArray; + static get finalizeSegment(): (path: PathParser) => void; + static get invalidPathValue(): string; + static get isArcCommand(): (code: number) => code is 97; + static get isDigit(): (code: number) => code is DigitNumber; + static get isDigitStart(): (code: number) => code is DigitNumber | 43 | 45 | 46; + static get isMoveCommand(): (code: number) => code is 109 | 77; + static get isPathCommand(): (code: number) => code is PathCommandNumber; + static get isSpace(): (ch: number) => ch is SpaceNumber; + static get paramsCount(): { + a: number; + c: number; + h: number; + l: number; + m: number; + r: number; + q: number; + s: number; + t: number; + v: number; + z: number; + }; + static get paramsParser(): ParserParams; + static get pathParser(): typeof PathParser; + static get scanFlag(): (path: PathParser) => void; + static get scanParam(): (path: PathParser) => void; + static get scanSegment(): (path: PathParser) => void; + static get skipSpaces(): (path: PathParser) => void; + static get distanceEpsilon(): number; + static get getClosestPoint(): (pathInput: string | PathArray, point: { + x: number; + y: number; + }) => { + x: number; + y: number; + }; + static get getDrawDirection(): (path: string | PathArray) => boolean; + static get getPathArea(): (path: PathArray) => number; + static get getPathBBox(): (pathInput: PathArray | string) => { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; + }; + static get getPointAtLength(): (pathInput: string | PathArray, distance?: number) => { + x: number; + y: number; + }; + static get getPropertiesAtLength(): (pathInput: string | PathArray, distance?: number) => SegmentProperties; + static get getPropertiesAtPoint(): (pathInput: string | PathArray, point: Point) => PointProperties; + static get getSegmentAtLength(): (pathInput: string | PathArray, distance?: number) => PathSegment | undefined; + static get getSegmentOfPoint(): (path: string | PathArray, point: { + x: number; + y: number; + }) => SegmentProperties | undefined; + static get getTotalLength(): (pathInput: string | PathArray) => number; + static get isAbsoluteArray(): (path: unknown) => path is AbsoluteArray; + static get isCurveArray(): (path: unknown) => path is CurveArray; + static get isNormalizedArray(): (path: unknown) => path is NormalArray; + static get isPathArray(): (path: unknown) => path is PathArray; + static get isPointInStroke(): (pathInput: string | PathArray, point: { + x: number; + y: number; + }) => boolean; + static get isRelativeArray(): (path: unknown) => path is RelativeArray; + static get isValidPath(): (pathString: string) => boolean; + static get shapeParams(): ShapeParams; + static get shapeToPath(): (element: ShapeTypes | ShapeOps, replace?: boolean, ownerDocument?: Document) => SVGPathElement | false; + static get shapeToPathArray(): (element: ShapeTypes | ShapeOps) => false | PathArray; + static get absolutizeSegment(): (segment: PathSegment, index: number, lastX: number, lastY: number) => AbsoluteSegment; + static get arcToCubic(): (X1: number, Y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, X2: number, Y2: number, recursive?: [number, number, number, number]) => number[]; + static get getSVGMatrix(): (transform: TransformObjectValues) => CSSMatrix; + static get iterate(): (path: PathArray, iterator: IteratorCallback) => T; + static get lineToCubic(): (x1: number, y1: number, x2: number, y2: number) => number[]; + static get normalizePath(): (pathInput: string | PathArray) => NormalArray; + static get normalizeSegment(): (segment: PathSegment, params: ParserParams) => NormalSegment; + static get optimizePath(): (pathInput: PathArray, roundOption?: number) => PathArray; + static get projection2d(): (m: CSSMatrix, point2D: PointTuple, origin: [number, number, number]) => PointTuple; + static get quadToCubic(): (x1: number, y1: number, qx: number, qy: number, x2: number, y2: number) => [number, number, number, number, number, number]; + static get relativizeSegment(): (segment: PathSegment, index: number, lastX: number, lastY: number) => MSegment | RelativeSegment; + static get reverseCurve(): (path: CurveArray) => CurveArray; + static get reversePath(): (pathInput: PathArray) => PathArray; + static get roundPath(): (path: PathArray, roundOption?: number | "off") => PathArray; + static get roundSegment(): (segment: T, roundOption: number) => T; + static get segmentToCubic(): (segment: PathSegment, params: ParserParams) => MSegment | CSegment; + static get shortenSegment(): (segment: AbsoluteSegment, normalSegment: NormalSegment, params: ParserParams, prevCommand: PathCommand) => ShortSegment; + static get splitCubic(): (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; + static get splitPath(): (pathInput: PathArray) => PathArray[]; + static get transformPath(): (pathInput: PathArray | string, transform?: Partial) => PathArray; } -declare const defaultExport: typeof SVGPathCommander & typeof util; -export { type ACommand, type ASegment, type AbsoluteArray, type AbsoluteCommand, type AbsoluteSegment, type ArcCoordinates, type ArcSegment, type CCommand, type CSegment, type CircleAttr, type CloseSegment, type CubicCoordinates, type CubicPoints, type CubicSegment, type CurveArray, type DeriveCallback, type DerivedCubicPoints, type DerivedPoint, type DerivedQuadPoints, type DigitNumber, type EllipseAttr, type GlyphAttr, type HCommand, type HSegment, type HorLineSegment, type IteratorCallback, type LCommand, type LSegment, type LengthFactory, type LineAttr, type LineCoordinates, type LineSegment, type MCommand, type MSegment, type MoveSegment, type NormalArray, type NormalSegment, type Options, type ParserParams, type PathArray, type PathBBox, type PathCommand, type PathCommandNumber, type PathSegment, type PathTransform, type Point, type PointProperties, type PointTuple, type PolyAttr, type PolygonArray, type PolylineArray, type QCommand, type QSegment, type QuadCoordinates, type QuadPoints, type QuadSegment, type RectAttr, type RelativeArray, type RelativeCommand, type RelativeSegment, type SCommand, type SSegment, type SegmentLimits, type SegmentProperties, type ShapeOps, type ShapeParams, type ShapeTags, type ShapeTypes, type ShortCubicSegment, type ShortQuadSegment, type ShortSegment, type SpaceNumber, type TCommand, type TSegment, type TransformEntries, type TransformObject, type TransformObjectValues, type TransformProps, type VCommand, type VSegment, type VertLineSegment, type ZCommand, type ZSegment, type aCommand, type aSegment, type cCommand, type cSegment, defaultExport as default, type hCommand, type hSegment, type lCommand, type lSegment, type mCommand, type mSegment, type qCommand, type qSegment, type sCommand, type sSegment, type tCommand, type tSegment, type vCommand, type vSegment, type zCommand, type zSegment }; +export { type ACommand, type ASegment, type AbsoluteArray, type AbsoluteCommand, type AbsoluteSegment, type ArcCoordinates, type ArcSegment, type CCommand, type CSegment, type CircleAttr, type CloseSegment, type CubicCoordinates, type CubicPoints, type CubicSegment, type CurveArray, type DeriveCallback, type DerivedCubicPoints, type DerivedPoint, type DerivedQuadPoints, type DigitNumber, type EllipseAttr, type GlyphAttr, type HCommand, type HSegment, type HorLineSegment, type IteratorCallback, type LCommand, type LSegment, type LengthFactory, type LineAttr, type LineCoordinates, type LineSegment, type MCommand, type MSegment, type MoveSegment, type NormalArray, type NormalSegment, type Options, type ParserParams, type PathArray, type PathBBox, type PathCommand, type PathCommandNumber, type PathSegment, type PathTransform, type Point, type PointProperties, type PointTuple, type PolyAttr, type PolygonArray, type PolylineArray, type QCommand, type QSegment, type QuadCoordinates, type QuadPoints, type QuadSegment, type RectAttr, type RelativeArray, type RelativeCommand, type RelativeSegment, type SCommand, type SSegment, type SegmentLimits, type SegmentProperties, type ShapeOps, type ShapeParams, type ShapeTags, type ShapeTypes, type ShortCubicSegment, type ShortQuadSegment, type ShortSegment, type SpaceNumber, type TCommand, type TSegment, type TransformEntries, type TransformObject, type TransformObjectValues, type TransformProps, type VCommand, type VSegment, type VertLineSegment, type ZCommand, type ZSegment, type aCommand, type aSegment, absolutizeSegment, arcToCubic, arcTools, bezierTools, type cCommand, type cSegment, cubicTools, SVGPathCommander as default, DISTANCE_EPSILON as distanceEpsilon, distanceSquareRoot, finalizeSegment, getClosestPoint, getDrawDirection, getPathArea, getPathBBox, getPointAtLength, getPropertiesAtLength, getPropertiesAtPoint, getSVGMatrix, getSegmentAtLength, getSegmentOfPoint, getTotalLength, type hCommand, type hSegment, invalidPathValue, isAbsoluteArray, isArcCommand, isCurveArray, isDigit, isDigitStart, isMoveCommand, isNormalizedArray, isPathArray, isPathCommand, isPointInStroke, isRelativeArray, isSpace, isValidPath, iterate, type lCommand, type lSegment, lineToCubic, lineTools, type mCommand, type mSegment, midPoint, normalizePath, normalizeSegment, optimizePath, paramsCount, paramsParser, parsePathString, PathParser as pathParser, pathToAbsolute, pathToCurve, pathToRelative, pathToString, polygonTools, projection2d, type qCommand, type qSegment, quadToCubic, quadTools, relativizeSegment, reverseCurve, reversePath, rotateVector, roundPath, roundSegment, roundTo, type sCommand, type sSegment, scanFlag, scanParam, scanSegment, segmentToCubic, shapeParams, shapeToPath, shapeToPathArray, shortenSegment, skipSpaces, splitCubic, splitPath, type tCommand, type tSegment, transformPath, type vCommand, type vSegment, type zCommand, type zSegment }; diff --git a/dist/svg-path-commander.js b/dist/svg-path-commander.js index 5a0b62c..53c9289 100644 --- a/dist/svg-path-commander.js +++ b/dist/svg-path-commander.js @@ -1,2 +1,2 @@ -var SVGPathCommander=function(){"use strict";var Et=Object.defineProperty,Ot=(t,e,r)=>e in t?Et(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,I=(t,e,r)=>Ot(t,typeof e!="symbol"?e+"":e,r);const Vt={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},He=t=>(t instanceof Float64Array||t instanceof Float32Array||Array.isArray(t)&&t.every(e=>typeof e=="number"))&&[6,16].some(e=>t.length===e),Fe=t=>t instanceof DOMMatrix||t instanceof P||typeof t=="object"&&Object.keys(Vt).every(e=>t&&e in t),te=t=>{const e=new P,r=Array.from(t);if(!He(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,o,i,l,c,a,m,h,f,y,u,g,p,b,M]=r;e.m11=s,e.a=s,e.m21=l,e.c=l,e.m31=h,e.m41=g,e.e=g,e.m12=n,e.b=n,e.m22=c,e.d=c,e.m32=f,e.m42=p,e.f=p,e.m13=o,e.m23=a,e.m33=y,e.m43=b,e.m14=i,e.m24=m,e.m34=u,e.m44=M}else if(r.length===6){const[s,n,o,i,l,c]=r;e.m11=s,e.a=s,e.m12=n,e.b=n,e.m21=o,e.c=o,e.m22=i,e.d=i,e.m41=l,e.e=l,e.m42=c,e.f=c}return e},Ue=t=>{if(Fe(t))return te([t.m11,t.m12,t.m13,t.m14,t.m21,t.m22,t.m23,t.m24,t.m31,t.m32,t.m33,t.m34,t.m41,t.m42,t.m43,t.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(t)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},Ge=t=>{if(typeof t!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(t)}" is not a string.`);const e=String(t).replace(/\s/g,"");let r=new P;const s=`CSSMatrix: invalid transform string "${t}"`;return e.split(")").filter(n=>n).forEach(n=>{const[o,i]=n.split("(");if(!i)throw TypeError(s);const l=i.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[c,a,m,h]=l,f=[c,a,m],y=[c,a,m,h];if(o==="perspective"&&c&&[a,m].every(u=>u===void 0))r.m34=-1/c;else if(o.includes("matrix")&&[6,16].includes(l.length)&&l.every(u=>!Number.isNaN(+u))){const u=l.map(g=>Math.abs(g)<1e-6?0:g);r=r.multiply(te(u))}else if(o==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(c,a,m);else if(o==="translate"&&c&&m===void 0)r=r.translate(c,a||0,0);else if(o==="rotate3d"&&y.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(c,a,m,h);else if(o==="rotate"&&c&&[a,m].every(u=>u===void 0))r=r.rotate(0,0,c);else if(o==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(c,a,m);else if(o==="scale"&&!Number.isNaN(c)&&(c!==1||a!==1)&&m===void 0){const u=Number.isNaN(+a)?c:a;r=r.scale(c,u,1)}else if(o==="skew"&&(c||!Number.isNaN(c)&&a)&&m===void 0)r=r.skew(c,a||0);else if(["translate","rotate","scale","skew"].some(u=>o.includes(u))&&/[XYZ]/.test(o)&&c&&[a,m].every(u=>u===void 0))if(o==="skewX"||o==="skewY")r=r[o](c);else{const u=o.replace(/[XYZ]/,""),g=o.replace(u,""),p=["X","Y","Z"].indexOf(g),b=u==="scale"?1:0,M=[p===0?c:b,p===1?c:b,p===2?c:b];r=r[u](...M)}else throw TypeError(s)}),r},Ne=(t,e)=>e?[t.a,t.b,t.c,t.d,t.e,t.f]:[t.m11,t.m12,t.m13,t.m14,t.m21,t.m22,t.m23,t.m24,t.m31,t.m32,t.m33,t.m34,t.m41,t.m42,t.m43,t.m44],Je=(t,e,r)=>{const s=new P;return s.m41=t,s.e=t,s.m42=e,s.f=e,s.m43=r,s},Ke=(t,e,r)=>{const s=new P,n=Math.PI/180,o=t*n,i=e*n,l=r*n,c=Math.cos(o),a=-Math.sin(o),m=Math.cos(i),h=-Math.sin(i),f=Math.cos(l),y=-Math.sin(l),u=m*f,g=-m*y;s.m11=u,s.a=u,s.m12=g,s.b=g,s.m13=h;const p=a*h*f+c*y;s.m21=p,s.c=p;const b=c*f-a*h*y;return s.m22=b,s.d=b,s.m23=-a*m,s.m31=a*y-c*h*f,s.m32=a*f+c*h*y,s.m33=c*m,s},We=(t,e,r,s)=>{const n=new P,o=Math.sqrt(t*t+e*e+r*r);if(o===0)return n;const i=t/o,l=e/o,c=r/o,a=s*(Math.PI/360),m=Math.sin(a),h=Math.cos(a),f=m*m,y=i*i,u=l*l,g=c*c,p=1-2*(u+g)*f;n.m11=p,n.a=p;const b=2*(i*l*f+c*m*h);n.m12=b,n.b=b,n.m13=2*(i*c*f-l*m*h);const M=2*(l*i*f-c*m*h);n.m21=M,n.c=M;const d=1-2*(g+y)*f;return n.m22=d,n.d=d,n.m23=2*(l*c*f+i*m*h),n.m31=2*(c*i*f+l*m*h),n.m32=2*(c*l*f-i*m*h),n.m33=1-2*(y+u)*f,n},Xe=(t,e,r)=>{const s=new P;return s.m11=t,s.a=t,s.m22=e,s.d=e,s.m33=r,s},me=(t,e)=>{const r=new P;if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},Ye=t=>me(t,0),et=t=>me(0,t),D=(t,e)=>{const r=e.m11*t.m11+e.m12*t.m21+e.m13*t.m31+e.m14*t.m41,s=e.m11*t.m12+e.m12*t.m22+e.m13*t.m32+e.m14*t.m42,n=e.m11*t.m13+e.m12*t.m23+e.m13*t.m33+e.m14*t.m43,o=e.m11*t.m14+e.m12*t.m24+e.m13*t.m34+e.m14*t.m44,i=e.m21*t.m11+e.m22*t.m21+e.m23*t.m31+e.m24*t.m41,l=e.m21*t.m12+e.m22*t.m22+e.m23*t.m32+e.m24*t.m42,c=e.m21*t.m13+e.m22*t.m23+e.m23*t.m33+e.m24*t.m43,a=e.m21*t.m14+e.m22*t.m24+e.m23*t.m34+e.m24*t.m44,m=e.m31*t.m11+e.m32*t.m21+e.m33*t.m31+e.m34*t.m41,h=e.m31*t.m12+e.m32*t.m22+e.m33*t.m32+e.m34*t.m42,f=e.m31*t.m13+e.m32*t.m23+e.m33*t.m33+e.m34*t.m43,y=e.m31*t.m14+e.m32*t.m24+e.m33*t.m34+e.m34*t.m44,u=e.m41*t.m11+e.m42*t.m21+e.m43*t.m31+e.m44*t.m41,g=e.m41*t.m12+e.m42*t.m22+e.m43*t.m32+e.m44*t.m42,p=e.m41*t.m13+e.m42*t.m23+e.m43*t.m33+e.m44*t.m43,b=e.m41*t.m14+e.m42*t.m24+e.m43*t.m34+e.m44*t.m44;return te([r,s,n,o,i,l,c,a,m,h,f,y,u,g,p,b])};class P{constructor(e){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,e?this.setMatrixValue(e):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(e){return typeof e=="string"&&e.length&&e!=="none"?Ge(e):Array.isArray(e)||e instanceof Float64Array||e instanceof Float32Array?te(e):typeof e=="object"?Ue(e):this}toFloat32Array(e){return Float32Array.from(Ne(this,e))}toFloat64Array(e){return Float64Array.from(Ne(this,e))}toString(){const{is2D:e}=this,r=this.toFloat64Array(e).join(", ");return`${e?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:e,isIdentity:r}=this;return{...this,is2D:e,isIdentity:r}}multiply(e){return D(this,e)}translate(e,r,s){const n=e;let o=r,i=s;return typeof o>"u"&&(o=0),typeof i>"u"&&(i=0),D(this,Je(n,o,i))}scale(e,r,s){const n=e;let o=r,i=s;return typeof o>"u"&&(o=e),typeof i>"u"&&(i=1),D(this,Xe(n,o,i))}rotate(e,r,s){let n=e,o=r||0,i=s||0;return typeof e=="number"&&typeof r>"u"&&typeof s>"u"&&(i=n,n=0,o=0),D(this,Ke(n,o,i))}rotateAxisAngle(e,r,s,n){if([e,r,s,n].some(o=>Number.isNaN(+o)))throw new TypeError("CSSMatrix: expecting 4 values");return D(this,We(e,r,s,n))}skewX(e){return D(this,Ye(e))}skewY(e){return D(this,et(e))}skew(e,r){return D(this,me(e,r))}transformPoint(e){const r=this.m11*e.x+this.m21*e.y+this.m31*e.z+this.m41*e.w,s=this.m12*e.x+this.m22*e.y+this.m32*e.z+this.m42*e.w,n=this.m13*e.x+this.m23*e.y+this.m33*e.z+this.m43*e.w,o=this.m14*e.x+this.m24*e.y+this.m34*e.z+this.m44*e.w;return e instanceof DOMPoint?new DOMPoint(r,s,n,o):{x:r,y:s,z:n,w:o}}}I(P,"Translate",Je),I(P,"Rotate",Ke),I(P,"RotateAxisAngle",We),I(P,"Scale",Xe),I(P,"SkewX",Ye),I(P,"SkewY",et),I(P,"Skew",me),I(P,"Multiply",D),I(P,"fromArray",te),I(P,"fromMatrix",Ue),I(P,"fromString",Ge),I(P,"toArray",Ne),I(P,"isCompatibleArray",He),I(P,"isCompatibleObject",Fe);const Z=(t,e,r)=>{const[s,n]=t,[o,i]=e;return[s+(o-s)*r,n+(i-n)*r]},ue=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),ne=(t,e,r,s)=>ue([t,e],[r,s]),we=(t,e,r,s,n)=>{let o={x:t,y:e};if(typeof n=="number"){const i=ue([t,e],[r,s]);if(n<=0)o={x:t,y:e};else if(n>=i)o={x:r,y:s};else{const[l,c]=Z([t,e],[r,s],n/i);o={x:l,y:c}}}return o},Le=(t,e,r,s)=>{const{min:n,max:o}=Math;return[n(t,r),n(e,s),o(t,r),o(e,s)]},_t=Object.freeze(Object.defineProperty({__proto__:null,getLineBBox:Le,getLineLength:ne,getPointAtLineLength:we},Symbol.toStringTag,{value:"Module"})),Te=(t,e,r)=>{const s=r/2,n=Math.sin(s),o=Math.cos(s),i=t**2*n**2,l=e**2*o**2,c=Math.sqrt(i+l)*r;return Math.abs(c)},U=(t,e,r,s,n,o)=>{const{sin:i,cos:l}=Math,c=l(n),a=i(n),m=r*l(o),h=s*i(o);return[t+c*m-a*h,e+a*m+c*h]},ve=(t,e)=>{const{x:r,y:s}=t,{x:n,y:o}=e,i=r*n+s*o,l=Math.sqrt((r**2+s**2)*(n**2+o**2));return(r*o-s*n<0?-1:1)*Math.acos(i/l)},he=(t,e,r,s,n,o,i,l,c)=>{const{abs:a,sin:m,cos:h,sqrt:f,PI:y}=Math;let u=a(r),g=a(s);const b=(n%360+360)%360*(y/180);if(t===l&&e===c)return{rx:u,ry:g,startAngle:0,endAngle:0,center:{x:l,y:c}};if(u===0||g===0)return{rx:u,ry:g,startAngle:0,endAngle:0,center:{x:(l+t)/2,y:(c+e)/2}};const M=(t-l)/2,d=(e-c)/2,x={x:h(b)*M+m(b)*d,y:-m(b)*M+h(b)*d},A=x.x**2/u**2+x.y**2/g**2;A>1&&(u*=f(A),g*=f(A));const S=u**2*g**2-u**2*x.y**2-g**2*x.x**2,j=u**2*x.y**2+g**2*x.x**2;let $=S/j;$=$<0?0:$;const T=(o!==i?1:-1)*f($),N={x:T*(u*x.y/g),y:T*(-(g*x.x)/u)},R={x:h(b)*N.x-m(b)*N.y+(t+l)/2,y:m(b)*N.x+h(b)*N.y+(e+c)/2},J={x:(x.x-N.x)/u,y:(x.y-N.y)/g},z=ve({x:1,y:0},J),C={x:(-x.x-N.x)/u,y:(-x.y-N.y)/g};let q=ve(J,C);!i&&q>0?q-=2*y:i&&q<0&&(q+=2*y),q%=2*y;const Q=z+q;return{center:R,startAngle:z,endAngle:Q,rx:u,ry:g}},je=(t,e,r,s,n,o,i,l,c)=>{const{rx:a,ry:m,startAngle:h,endAngle:f}=he(t,e,r,s,n,o,i,l,c);return Te(a,m,f-h)},tt=(t,e,r,s,n,o,i,l,c,a)=>{let m={x:t,y:e};const{center:h,rx:f,ry:y,startAngle:u,endAngle:g}=he(t,e,r,s,n,o,i,l,c);if(typeof a=="number"){const p=Te(f,y,g-u);if(a<=0)m={x:t,y:e};else if(a>=p)m={x:l,y:c};else{if(t===l&&e===c)return{x:l,y:c};if(f===0||y===0)return we(t,e,l,c,a);const{PI:b,cos:M,sin:d}=Math,x=g-u,S=(n%360+360)%360*(b/180),j=u+x*(a/p),$=f*M(j),T=y*d(j);m={x:M(S)*$-d(S)*T+h.x,y:d(S)*$+M(S)*T+h.y}}}return m},nt=(t,e,r,s,n,o,i,l,c)=>{const{center:a,rx:m,ry:h,startAngle:f,endAngle:y}=he(t,e,r,s,n,o,i,l,c),u=y-f,{min:g,max:p,tan:b,atan2:M,PI:d}=Math,{x,y:A}=a,S=n*d/180,j=b(S),$=M(-h*j,m),T=$,N=$+d,R=M(h,m*j),J=R+d,z=[l],C=[c];let q=g(t,l),Q=p(t,l),E=g(e,c),B=p(e,c);const ee=y-u*1e-5,K=U(x,A,m,h,S,ee),w=y-u*.99999,k=U(x,A,m,h,S,w);if(K[0]>Q||k[0]>Q){const v=U(x,A,m,h,S,T);z.push(v[0]),C.push(v[1])}if(K[0]B||k[1]>B){const v=U(x,A,m,h,S,R);z.push(v[0]),C.push(v[1])}return q=g.apply([],z),E=g.apply([],C),Q=p.apply([],z),B=p.apply([],C),[q,E,Q,B]},Rt=Object.freeze(Object.defineProperty({__proto__:null,angleBetween:ve,arcLength:Te,arcPoint:U,getArcBBox:nt,getArcLength:je,getArcProps:he,getPointAtArcLength:tt},Symbol.toStringTag,{value:"Module"})),$e=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],rt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],st=t=>{const e=[];for(let r=t,s=r.length,n=s-1;s>1;s-=1,n-=1){const o=[];for(let i=0;i{if(e===0)return t[0].t=0,t[0];const r=t.length-1;if(e===1)return t[r].t=1,t[r];const s=1-e;let n=t;if(r===0)return t[0].t=e,t[0];if(r===1)return{x:s*n[0].x+e*n[1].x,y:s*n[0].y+e*n[1].y,t:e};const o=s*s,i=e*e;let l=0,c=0,a=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],l=o,c=s*e*2,a=i):r===3&&(l=o*s,c=o*e*3,a=s*i*3,m=e*i),{x:l*n[0].x+c*n[1].x+a*n[2].x+m*n[3].x,y:l*n[0].y+c*n[1].y+a*n[2].y+m*n[3].y,t:e}},it=(t,e)=>{const r=t(e),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},ct=t=>{const r=$e.length;let s=0;for(let n=0,o;n{const e=[];for(let s=0,n=t.length,o=2;sot(r[0],s))},lt=1e-8,fe=([t,e,r])=>{const s=Math.min(t,r),n=Math.max(t,r);if(e>=t?r>=e:r<=e)return[s,n];const o=(t*r-e*e)/(t-2*e+r);return o{const n=t-3*e+3*r-s;if(Math.abs(n)0&&m<1){const f=t*(1-m)*(1-m)*(1-m)+e*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fc&&(c=f)}return[l,c]},Qt=Object.freeze(Object.defineProperty({__proto__:null,CBEZIER_MINMAX_EPSILON:lt,Cvalues:rt,Tvalues:$e,bezierLength:ct,calculateBezier:it,computeBezier:ot,deriveBezier:st,getBezierLength:re,minmaxC:ze,minmaxQ:fe},Symbol.toStringTag,{value:"Module"})),at=([t,e,r,s,n,o,i,l],c)=>{const a=1-c;return{x:a**3*t+3*a**2*c*r+3*a*c**2*n+c**3*i,y:a**3*e+3*a**2*c*s+3*a*c**2*o+c**3*l}},ye=(t,e,r,s,n,o,i,l)=>re([t,e,r,s,n,o,i,l]),mt=(t,e,r,s,n,o,i,l,c)=>{const a=typeof c=="number";let m={x:t,y:e};if(a){const h=re([t,e,r,s,n,o,i,l]);c<=0||(c>=h?m={x:i,y:l}:m=at([t,e,r,s,n,o,i,l],c/h))}return m},qe=(t,e,r,s,n,o,i,l)=>{const c=ze([t,r,n,i]),a=ze([e,s,o,l]);return[c[0],a[0],c[1],a[1]]},Zt=Object.freeze(Object.defineProperty({__proto__:null,getCubicBBox:qe,getCubicLength:ye,getPointAtCubicLength:mt,getPointAtCubicSegmentLength:at},Symbol.toStringTag,{value:"Module"})),ut=([t,e,r,s,n,o],i)=>{const l=1-i;return{x:l**2*t+2*l*i*r+i**2*n,y:l**2*e+2*l*i*s+i**2*o}},ge=(t,e,r,s,n,o)=>re([t,e,r,s,n,o]),ht=(t,e,r,s,n,o,i)=>{const l=typeof i=="number";let c={x:t,y:e};if(l){const a=re([t,e,r,s,n,o]);i<=0||(i>=a?c={x:n,y:o}:c=ut([t,e,r,s,n,o],i/a))}return c},ke=(t,e,r,s,n,o)=>{const i=fe([t,r,n]),l=fe([e,s,o]);return[i[0],l[0],i[1],l[1]]},Dt=Object.freeze(Object.defineProperty({__proto__:null,getPointAtQuadLength:ht,getPointAtQuadSegmentLength:ut,getQuadBBox:ke,getQuadLength:ge},Symbol.toStringTag,{value:"Module"})),Bt=Object.freeze(Object.defineProperty({__proto__:null,polygonArea:t=>{const e=t.length;let r=-1,s,n=t[e-1],o=0;for(;++rt.reduce((e,r,s)=>s?e+ue(t[s-1],r):0,0)},Symbol.toStringTag,{value:"Module"})),W={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Ie=t=>{let e=t.pathValue[t.segmentStart],r=e.toLowerCase();const{data:s}=t;for(;s.length>=W[r]&&(r==="m"&&s.length>2?(t.segments.push([e].concat(s.splice(0,2))),r="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(s.splice(0,W[r]))),!!W[r]););},O="SVGPathCommander Error",ft=t=>{const{index:e,pathValue:r}=t,s=r.charCodeAt(e);if(s===48){t.param=0,t.index+=1;return}if(s===49){t.param=1,t.index+=1;return}t.err=`${O}: invalid Arc flag "${r[e]}", expecting 0 or 1 at index ${e}`},H=t=>t>=48&&t<=57,F="Invalid path value",yt=t=>{const{max:e,pathValue:r,index:s}=t;let n=s,o=!1,i=!1,l=!1,c=!1,a;if(n>=e){t.err=`${O}: ${F} at index ${n}, "pathValue" is missing param`;return}if(a=r.charCodeAt(n),(a===43||a===45)&&(n+=1,a=r.charCodeAt(n)),!H(a)&&a!==46){t.err=`${O}: ${F} at index ${n}, "${r[n]}" is not a number`;return}if(a!==46){if(o=a===48,n+=1,a=r.charCodeAt(n),o&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),X=t=>{const{pathValue:e,max:r}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},xt=t=>H(t)||t===43||t===45||t===46,pt=t=>(t|32)===97,bt=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Ee=t=>{var c;const{max:e,pathValue:r,index:s,segments:n}=t,o=r.charCodeAt(s),i=W[r[s].toLowerCase()];if(t.segmentStart=s,!dt(o)){t.err=`${O}: ${F} "${r[s]}" is not a path command at index ${s}`;return}const l=n[n.length-1];if(!bt(o)&&((c=l==null?void 0:l[0])==null?void 0:c.toLocaleLowerCase())==="z"){t.err=`${O}: ${F} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(t.index+=1,X(t),t.data=[],!i){Ie(t);return}for(;;){for(let a=i;a>0;a-=1){if(pt(o)&&(a===3||a===4)?ft(t):yt(t),t.err.length)return;t.data.push(t.param),X(t),t.index=t.max||!xt(r.charCodeAt(t.index)))break}Ie(t)};class Oe{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const V=t=>{if(typeof t!="string")return t.slice(0);const e=new Oe(t);for(X(e);e.index{const[n]=t,o=n.toUpperCase();if(e===0||o===n)return t;if(o==="A")return[o,t[1],t[2],t[3],t[4],t[5],t[6]+r,t[7]+s];if(o==="V")return[o,t[1]+s];if(o==="H")return[o,t[1]+r];if(o==="L")return[o,t[1]+r,t[2]+s];{const l=[],c=t.length;for(let a=1;a{let r=t.length,s,n="M",o="M",i=!1,l=0,c=0,a=0,m=0,h=0;for(let f=0;f{const e=V(t);return _(e,se)},Ve=(t,e,r,s)=>{const[n]=t,o=n.toLowerCase();if(e===0||n===o)return t;if(o==="a")return[o,t[1],t[2],t[3],t[4],t[5],t[6]-r,t[7]-s];if(o==="v")return[o,t[1]-s];if(o==="h")return[o,t[1]-r];if(o==="l")return[o,t[1]-r,t[2]-s];{const l=[],c=t.length;for(let a=1;a{const e=V(t);return _(e,Ve)},oe=(t,e,r)=>{const{sin:s,cos:n}=Math,o=t*n(r)-e*s(r),i=t*s(r)+e*n(r);return{x:o,y:i}},xe=(t,e,r,s,n,o,i,l,c,a)=>{let m=t,h=e,f=r,y=s,u=l,g=c;const p=Math.PI*120/180,b=Math.PI/180*(+n||0);let M=[],d,x,A,S,j;if(a)[x,A,S,j]=a;else{d=oe(m,h,-b),m=d.x,h=d.y,d=oe(u,g,-b),u=d.x,g=d.y;const w=(m-u)/2,k=(h-g)/2;let v=w*w/(f*f)+k*k/(y*y);v>1&&(v=Math.sqrt(v),f*=v,y*=v);const De=f*f,Be=y*y,It=(o===i?-1:1)*Math.sqrt(Math.abs((De*Be-De*k*k-Be*w*w)/(De*k*k+Be*w*w)));S=It*f*k/y+(m+u)/2,j=It*-y*w/f+(h+g)/2,x=Math.asin(((h-j)/y*10**9>>0)/10**9),A=Math.asin(((g-j)/y*10**9>>0)/10**9),x=mA&&(x-=Math.PI*2),!i&&A>x&&(A-=Math.PI*2)}let $=A-x;if(Math.abs($)>p){const w=A,k=u,v=g;A=x+p*(i&&A>x?1:-1),u=S+f*Math.cos(A),g=j+y*Math.sin(A),M=xe(u,g,f,y,n,0,i,k,v,[A,w,S,j])}$=A-x;const T=Math.cos(x),N=Math.sin(x),R=Math.cos(A),J=Math.sin(A),z=Math.tan($/4),C=4/3*f*z,q=4/3*y*z,Q=[m,h],E=[m+C*N,h-q*T],B=[u+C*J,g-q*R],ee=[u,g];if(E[0]=2*Q[0]-E[0],E[1]=2*Q[1]-E[1],a)return[E[0],E[1],B[0],B[1],ee[0],ee[1]].concat(M);M=[E[0],E[1],B[0],B[1],ee[0],ee[1]].concat(M);const K=[];for(let w=0,k=M.length;w{const i=.3333333333333333,l=2/3;return[i*t+l*r,i*e+l*s,i*n+l*r,i*o+l*s,n,o]},_e=(t,e,r,s)=>{const n=Z([t,e],[r,s],.3333333333333333),o=Z([t,e],[r,s],2/3);return[n[0],n[1],o[0],o[1],r,s]},Ct=(t,e)=>{const[r]=t,s=t.slice(1).map(Number),[n,o]=s,{x1:i,y1:l,x:c,y:a}=e;return"TQ".includes(r)||(e.qx=null,e.qy=null),r==="M"?(e.x=n,e.y=o,t):r==="A"?["C"].concat(xe(i,l,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(e.qx=n,e.qy=o,["C"].concat(At(i,l,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(_e(i,l,n,o)):r==="Z"?["C"].concat(_e(i,l,c,a)):t},pe=(t,e)=>{const[r]=t,s=r.toUpperCase(),n=r!==s,{x1:o,y1:i,x2:l,y2:c,x:a,y:m}=e,h=t.slice(1);let f=h.map((y,u)=>y+(n?u%2?m:a:0));if("TQ".includes(s)||(e.qx=null,e.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?a:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",t[1]+(n?a:0),i];if(s==="V")return["L",o,t[1]+(n?m:0)];if(s==="L")return["L",t[1]+(n?a:0),t[2]+(n?m:0)];if(s==="M")return["M",t[1]+(n?a:0),t[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const y=o*2-l,u=i*2-c;return e.x1=y,e.y1=u,["C",y,u].concat(f)}else if(s==="T"){const y=o*2-(e.qx?e.qx:0),u=i*2-(e.qy?e.qy:0);return e.qx=y,e.qy=u,["Q",y,u].concat(f)}else if(s==="Q"){const[y,u]=f;return e.qx=y,e.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return t},ie={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},be=t=>{const e={...ie},r=V(t);return _(r,(s,n,o,i)=>{e.x=o,e.y=i;const l=pe(s,e);let c=Ct(l,e);c[0]==="C"&&c.length>7&&(r.splice(n+1,0,["C"].concat(c.slice(7))),c=c.slice(0,7));const m=c.length;return e.x1=+c[m-2],e.y1=+c[m-1],e.x2=+c[m-4]||e.x1,e.y2=+c[m-3]||e.y1,c})},G={origin:[0,0,0],round:4},L=(t,e)=>{const r=e>=1?10**e:1;return e>0?Math.round(t*r)/r:Math.round(t)},Re=(t,e)=>{const r=t.length;let{round:s}=G,n=t[0],o="";s=e==="off"||typeof e=="number"&&e>=0?e:typeof s=="number"&&s>=0?s:"off";for(let i=0;i{const e=V(t),r={...ie};return _(e,(s,n,o,i)=>{r.x=o,r.y=i;const l=pe(s,r),c=l.length;return r.x1=+l[c-2],r.y1=+l[c-1],r.x2=+l[c-4]||r.x1,r.y2=+l[c-3]||r.y1,l})},le=(t,e)=>{const r=ce(t);let s=!1,n=[],o="M",i=0,l=0,[c,a]=r[0].slice(1);const m=typeof e=="number";let h={x:c,y:a},f=0,y=h,u=0;return!m||e{if([o]=g,s=o==="M",n=s?n:[b,M].concat(g.slice(1)),s?([,c,a]=g,h={x:c,y:a},f=0):o==="L"?(h=we(n[0],n[1],n[2],n[3],e-u),f=ne(n[0],n[1],n[2],n[3])):o==="A"?(h=tt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],e-u),f=je(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):o==="C"?(h=mt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],e-u),f=ye(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):o==="Q"?(h=ht(n[0],n[1],n[2],n[3],n[4],n[5],e-u),f=ge(n[0],n[1],n[2],n[3],n[4],n[5])):o==="Z"&&(n=[b,M,c,a],h={x:c,y:a},f=ne(n[0],n[1],n[2],n[3])),[i,l]=n.slice(-2),uu-Me?{x:i,y:l}:y)},Y=t=>{const e=V(t);let r=0,s=0,n=0,o=0,i=0,l=0,c="M",a=0,m=0,h=0;return _(e,(f,y,u,g)=>{[c]=f;const p=c.toUpperCase(),M=p!==c?se(f,y,u,g):f.slice(0),d=p==="V"?["L",u,M[1]]:p==="H"?["L",M[1],g]:M;if([c]=d,"TQ".includes(p)||(i=0,l=0),c==="M")[,a,m]=d;else if(c==="L")h+=ne(u,g,d[1],d[2]);else if(c==="A")h+=je(u,g,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(c==="S"){const x=r*2-n,A=s*2-o;h+=ye(u,g,x,A,d[1],d[2],d[3],d[4])}else c==="C"?h+=ye(u,g,d[1],d[2],d[3],d[4],d[5],d[6]):c==="T"?(i=r*2-i,l=s*2-l,h+=ge(u,g,i,l,d[1],d[2])):c==="Q"?(i=d[1],l=d[2],h+=ge(u,g,d[1],d[2],d[3],d[4])):c==="Z"&&(h+=ne(u,g,a,m));[r,s]=c==="Z"?[a,m]:d.slice(-2),[n,o]=c==="C"?[d[3],d[4]]:c==="S"?[d[1],d[2]]:[r,s]}),h},Qe=(t,e)=>{const r=V(t);let s=r.slice(0),n=Y(s),o=s.length-1,i=0,l=0,c=r[0];if(o<=0||!e||!Number.isFinite(e))return{segment:c,index:0,length:l,lengthAtSegment:i};if(e>=n)return s=r.slice(0,-1),i=Y(s),l=n-i,c=r[o],{segment:c,index:o,length:l,lengthAtSegment:i};const a=[];for(;o>0;)c=s[o],s=s.slice(0,-1),i=Y(s),l=n-i,n=i,a.push({segment:c,index:o,length:l,lengthAtSegment:i}),o-=1;return a.find(({lengthAtSegment:m})=>m<=e)},Ae=(t,e)=>{const r=V(t),s=ce(r),n=Y(s),o=x=>{const A=x.x-e.x,S=x.y-e.y;return A*A+S*S};let i=8,l,c={x:0,y:0},a=0,m=0,h=1/0;for(let x=0;x<=n;x+=i)l=le(s,x),a=o(l),a1e-6&&(u=m-i,f=le(s,u),p=o(f),g=m+i,y=le(s,g),b=o(y),u>=0&&pAe(t,e).closest,Ft=(t,e,r,s,n,o,i,l)=>3*((l-e)*(r+n)-(i-t)*(s+o)+s*(t-n)-r*(e-o)+l*(n+t/3)-i*(o+e/3))/20,St=t=>{let e=0,r=0,s=0;return be(t).map(n=>{switch(n[0]){case"M":return[,e,r]=n,0;default:return s=Ft(e,r,n[1],n[2],n[3],n[4],n[5],n[6]),[e,r]=n.slice(-2),s}}).reduce((n,o)=>n+o,0)},Ut=t=>St(be(t))>=0,Pt=t=>{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const e=V(t);let r="M",s=0,n=0;const{max:o,min:i}=Math;let l=1/0,c=1/0,a=-1/0,m=-1/0,h=0,f=0,y=0,u=0,g=0,p=0,b=0,M=0,d=0,x=0;_(e,(j,$,T,N)=>{[r]=j;const R=r.toUpperCase(),z=R!==r?se(j,$,T,N):j.slice(0),C=R==="V"?["L",T,z[1]]:R==="H"?["L",z[1],N]:z;if([r]=C,"TQ".includes(R)||(d=0,x=0),r==="M")[,s,n]=C,h=s,f=n,y=s,u=n;else if(r==="L")[h,f,y,u]=Le(T,N,C[1],C[2]);else if(r==="A")[h,f,y,u]=nt(T,N,C[1],C[2],C[3],C[4],C[5],C[6],C[7]);else if(r==="S"){const q=g*2-b,Q=p*2-M;[h,f,y,u]=qe(T,N,q,Q,C[1],C[2],C[3],C[4])}else r==="C"?[h,f,y,u]=qe(T,N,C[1],C[2],C[3],C[4],C[5],C[6]):r==="T"?(d=g*2-d,x=p*2-x,[h,f,y,u]=ke(T,N,d,x,C[1],C[2])):r==="Q"?(d=C[1],x=C[2],[h,f,y,u]=ke(T,N,C[1],C[2],C[3],C[4])):r==="Z"&&([h,f,y,u]=Le(T,N,s,n));l=i(h,l),c=i(f,c),a=o(y,a),m=o(u,m),[g,p]=r==="Z"?[s,n]:C.slice(-2),[b,M]=r==="C"?[C[3],C[4]]:r==="S"?[C[1],C[2]]:[g,p]});const A=a-l,S=m-c;return{width:A,height:S,x:l,y:c,x2:a,y2:m,cx:l+A/2,cy:c+S/2,cz:Math.max(A,S)+Math.min(A,S)/2}},Gt=(t,e)=>Qe(t,e).segment,Jt=(t,e)=>Ae(t,e).segment,Ce=t=>Array.isArray(t)&&t.every(e=>{const r=e[0].toLowerCase();return W[r]===e.length-1&&"achlmqstvz".includes(r)&&e.slice(1).every(Number.isFinite)})&&t.length>0,Nt=t=>Ce(t)&&t.every(([e])=>e===e.toUpperCase()),wt=t=>Nt(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Kt=t=>wt(t)&&t.every(([e])=>"MC".includes(e)),Wt=(t,e)=>{const{distance:r}=Ae(t,e);return Math.abs(r)Ce(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Lt=t=>{if(typeof t!="string"||!t.length)return!1;const e=new Oe(t);for(X(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Yt=t=>{let{x1:e,y1:r,x2:s,y2:n}=t;return[e,r,s,n]=[e,r,s,n].map(o=>+o),[["M",e,r],["L",s,n]]},en=t=>{const e=[],r=(t.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:e,cy:r,r:s}=t;return[e,r,s]=[e,r,s].map(n=>+n),[["M",e-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},nn=t=>{let{cx:e,cy:r}=t,s=t.rx||0,n=t.ry||s;return[e,r,s,n]=[e,r,s,n].map(o=>+o),[["M",e-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},rn=t=>{const e=+t.x||0,r=+t.y||0,s=+t.width,n=+t.height;let o=+(t.rx||0),i=+(t.ry||o);return o||i?(o*2>s&&(o-=(o*2-s)/2),i*2>n&&(i-=(i*2-n)/2),[["M",e+o,r],["h",s-o*2],["s",o,0,o,i],["v",n-i*2],["s",0,i,-o,i],["h",-s+o*2],["s",-o,0,-o,-i],["v",-n+i*2],["s",0,-i,o,-i]]):[["M",e,r],["h",s],["v",n],["H",e],["Z"]]},vt=t=>{const e=Object.keys(ae),r=Tt(t),s=r?t.tagName:null;if(s&&[...e,"path"].every(c=>s!==c))throw TypeError(`${O}: "${s}" is not SVGElement`);const n=r?s:t.type,o=ae[n],i={type:n};r?o.forEach(c=>{i[c]=t.getAttribute(c)}):Object.assign(i,t);let l=[];return n==="circle"?l=tn(i):n==="ellipse"?l=nn(i):["polyline","polygon"].includes(n)?l=en(i):n==="rect"?l=rn(i):n==="line"?l=Yt(i):["glyph","path"].includes(n)&&(l=V(r?t.getAttribute("d")||"":t.d||"")),Ce(l)&&l.length?l:!1},sn=(t,e,r)=>{const s=r||document,n=Object.keys(ae),o=Tt(t),i=o?t.tagName:null;if(i==="path")throw TypeError(`${O}: "${i}" is already SVGPathElement`);if(i&&n.every(u=>i!==u))throw TypeError(`${O}: "${i}" is not SVGElement`);const l=s.createElementNS("http://www.w3.org/2000/svg","path"),c=o?i:t.type,a=ae[c],m={type:c},h=G.round,f=vt(t),y=f&&f.length?Re(f,h):"";return o?(a.forEach(u=>{m[u]=t.getAttribute(u)}),Object.values(t.attributes).forEach(({name:u,value:g})=>{a.includes(u)||l.setAttribute(u,g)})):(Object.assign(m,t),Object.keys(m).forEach(u=>{!a.includes(u)&&u!=="type"&&l.setAttribute(u.replace(/[A-Z]/g,g=>`-${g.toLowerCase()}`),m[u])})),Lt(y)?(l.setAttribute("d",y),e&&o&&(t.before(l,t),t.remove()),l):!1},jt=t=>{let e=new P;const{origin:r}=t,[s,n]=r,{translate:o}=t,{rotate:i}=t,{skew:l}=t,{scale:c}=t;return Array.isArray(o)&&o.length>=2&&o.every(a=>!Number.isNaN(+a))&&o.some(a=>a!==0)?e=e.translate(...o):typeof o=="number"&&!Number.isNaN(o)&&(e=e.translate(o)),(i||l||c)&&(e=e.translate(s,n),Array.isArray(i)&&i.length>=2&&i.every(a=>!Number.isNaN(+a))&&i.some(a=>a!==0)?e=e.rotate(...i):typeof i=="number"&&!Number.isNaN(i)&&(e=e.rotate(i)),Array.isArray(l)&&l.length===2&&l.every(a=>!Number.isNaN(+a))&&l.some(a=>a!==0)?(e=l[0]?e.skewX(l[0]):e,e=l[1]?e.skewY(l[1]):e):typeof l=="number"&&!Number.isNaN(l)&&(e=e.skewX(l)),Array.isArray(c)&&c.length>=2&&c.every(a=>!Number.isNaN(+a))&&c.some(a=>a!==1)?e=e.scale(...c):typeof c=="number"&&!Number.isNaN(c)&&(e=e.scale(c)),e=e.translate(-s,-n)),e},$t=(t,e,r,s)=>{const[n]=t,{round:o}=G,i=o,l=e.slice(1),{x1:c,y1:a,x2:m,y2:h,x:f,y}=r,[u,g]=l.slice(-2),p=t;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(L(f,i)===L(u,i))return["V",g];if(L(y,i)===L(g,i))return["H",u]}else if(n==="C"){const[b,M]=l;if(r.x1=b,r.y1=M,"CS".includes(s)&&(L(b,i)===L(c*2-m,i)&&L(M,i)===L(a*2-h,i)||L(c,i)===L(m*2-f,i)&&L(a,i)===L(h*2-y,i)))return["S",l[2],l[3],l[4],l[5]]}else if(n==="Q"){const[b,M]=l;if(r.qx=b,r.qy=M,"QT".includes(s)&&L(b,i)===L(c*2-m,i)&&L(M,i)===L(a*2-h,i))return["T",l[2],l[3]]}return p},Se=(t,e)=>{const r=t.slice(1).map(s=>L(s,e));return[t[0]].concat(r)},zt=(t,e)=>{const r=de(t),s=typeof e=="number"&&e>=0?e:2,n={...ie},o=[];let i="M",l="Z";return _(r,(c,a,m,h)=>{n.x=m,n.y=h;const f=pe(c,n);let y=c;if([i]=c,o[a]=i,a){l=o[a-1];const g=$t(c,f,n,l),p=Se(g,s),b=p.join(""),M=Ve(g,a,m,h),d=Se(M,s),x=d.join("");y=b.length{let r=P.Translate(e[0],e[1],e[2]);return[,,,r.m44]=e,r=t.multiply(r),[r.m41,r.m42,r.m43,r.m44]},Ze=(t,e,r)=>{const[s,n,o]=r,[i,l,c]=on(t,[e[0],e[1],0,1]),a=i-s,m=l-n,h=c-o;return[a*(Math.abs(o)/Math.abs(h)||1)+s,m*(Math.abs(o)/Math.abs(h)||1)+n]},cn=t=>{const e=t.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):t[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(r=>["C"].concat(r.slice(2))))},Pe=t=>{const e=de(t),r=ce(e),s=e.length,n=e[s-1][0]==="Z",o=_(e,(i,l)=>{const c=r[l],a=l&&e[l-1],m=a&&a[0],h=e[l+1],f=h&&h[0],[y]=i,[u,g]=r[l?l-1:s-1].slice(-2);let p=i;switch(y){case"M":p=n?["Z"]:[y,u,g];break;case"A":p=[y,i[1],i[2],i[3],i[4],i[5]===1?0:1,u,g];break;case"C":h&&f==="S"?p=["S",i[1],i[2],u,g]:p=[y,i[3],i[4],i[1],i[2],u,g];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?p=["C",c[3],c[4],c[1],c[2],u,g]:p=[y,c[1],c[2],u,g];break;case"Q":h&&f==="T"?p=["T",u,g]:p=[y,i[1],i[2],u,g];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?p=["Q",c[1],c[2],u,g]:p=[y,u,g];break;case"Z":p=["M",u,g];break;case"H":p=[y,u];break;case"V":p=[y,g];break;default:p=[y].concat(i.slice(1,-2),u,g)}return p});return n?o.reverse():[o[0]].concat(o.slice(1).reverse())},ln=(t,e)=>{let{round:r}=G;return r=e==="off"||typeof e=="number"&&e>=0?e:typeof r=="number"&&r>=0?r:"off",r==="off"?t.slice(0):_(t,s=>Se(s,r))},an=(t,e=.5)=>{const r=e,s=t.slice(0,2),n=t.slice(2,4),o=t.slice(4,6),i=t.slice(6,8),l=Z(s,n,r),c=Z(n,o,r),a=Z(o,i,r),m=Z(l,c,r),h=Z(c,a,r),f=Z(m,h,r);return[["C",l[0],l[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],a[0],a[1],i[0],i[1]]]},qt=t=>{const e=[];let r,s=-1,n=0,o=0,i=0,l=0;const c={...ie};return t.forEach(a=>{const[m]=a,h=m.toUpperCase(),f=m.toLowerCase(),y=m===f,u=a.slice(1);h==="M"?(s+=1,[n,o]=u,n+=y?c.x:0,o+=y?c.y:0,i=n,l=o,r=[y?[h,i,l]:a]):(h==="Z"?(n=i,o=l):h==="H"?([,n]=a,n+=y?c.x:0):h==="V"?([,o]=a,o+=y?c.y:0):([n,o]=a.slice(-2),n+=y?c.x:0,o+=y?c.y:0),r.push(a)),c.x=n,c.y=o,e[s]=r}),e},kt=(t,e)=>{let r=0,s=0,n=0,o=0,i=0,l=0,c="M";const a=V(t),m=e&&Object.keys(e);if(!e||m&&!m.length)return a.slice(0);e.origin||Object.assign(e,{origin:G.origin});const h=e.origin,f=jt(e);return f.isIdentity?a.slice(0):_(a,(y,u,g,p)=>{[c]=y;const b=c.toUpperCase(),d=b!==c?se(y,u,g,p):y.slice(0);let x=b==="A"?["C"].concat(xe(g,p,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):b==="V"?["L",g,d[1]]:b==="H"?["L",d[1],p]:d;c=x[0];const A=c==="C"&&x.length>7,S=A?x.slice(0,7):x.slice(0);if(A&&(a.splice(u+1,0,["C"].concat(x.slice(7))),x=S),c==="L")[n,o]=Ze(f,[x[1],x[2]],h),r!==n&&s!==o?x=["L",n,o]:s===o?x=["H",n]:r===n&&(x=["V",o]);else for(i=1,l=x.length;i"u";if(n||!e.length)throw TypeError(`${O}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=V(e);const{round:o,origin:i}=s;let l;Number.isInteger(o)||o==="off"?l=o:l=G.round;let c=G.origin;if(Array.isArray(i)&&i.length>=2){const[a,m,h]=i.map(Number);c=[Number.isNaN(a)?0:a,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=l,this.origin=c,this}get bbox(){return Pt(this.segments)}get length(){return Y(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return le(this.segments,e)}toAbsolute(){const{segments:e}=this;return this.segments=de(e),this}toRelative(){const{segments:e}=this;return this.segments=Mt(e),this}toCurve(){const{segments:e}=this;return this.segments=be(e),this}reverse(e){const{segments:r}=this,s=qt(r),n=s.length>1?s:!1,o=n?n.map((l,c)=>e?c?Pe(l):l.slice(0):Pe(l)):r.slice(0);let i=[];return n?i=o.flat(1):i=e?r:Pe(r),this.segments=i.slice(0),this}normalize(){const{segments:e}=this;return this.segments=ce(e),this}optimize(){const{segments:e}=this,r=this.round==="off"?2:this.round;return this.segments=zt(e,r),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(c=>c in e))return this;const{segments:r,origin:[s,n,o]}=this,i={};for(const[c,a]of Object.entries(e))c==="skew"&&Array.isArray(a)||(c==="rotate"||c==="translate"||c==="origin"||c==="scale")&&Array.isArray(a)?i[c]=a.map(Number):c!=="origin"&&typeof Number(a)=="number"&&(i[c]=Number(a));const{origin:l}=i;if(Array.isArray(l)&&l.length>=2){const[c,a,m]=l.map(Number);i.origin=[Number.isNaN(c)?s:c,Number.isNaN(a)?n:a,m||o]}else i.origin=[s,n,o];return this.segments=kt(r,i),this}flipX(){const{cx:e,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,r,0]}),this}flipY(){const{cx:e,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,r,0]}),this}toString(){return Re(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}}return Object.assign(un,mn)}(); +var SVGPathCommander=function(b){"use strict";var tn=Object.defineProperty,en=(e,t,r)=>t in e?tn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,I=(e,t,r)=>en(e,typeof t!="symbol"?t+"":t,r);const nn={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},fe=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),ge=e=>e instanceof DOMMatrix||e instanceof T||typeof e=="object"&&Object.keys(nn).every(t=>e&&t in e),ct=e=>{const t=new T,r=Array.from(e);if(!fe(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[i,n,s,o,c,a,l,m,h,f,g,u,y,A,x,C]=r;t.m11=i,t.a=i,t.m21=c,t.c=c,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=a,t.d=a,t.m32=f,t.m42=A,t.f=A,t.m13=s,t.m23=l,t.m33=g,t.m43=x,t.m14=o,t.m24=m,t.m34=u,t.m44=C}else if(r.length===6){const[i,n,s,o,c,a]=r;t.m11=i,t.a=i,t.m12=n,t.b=n,t.m21=s,t.c=s,t.m22=o,t.d=o,t.m41=c,t.e=c,t.m42=a,t.f=a}return t},ye=e=>{if(ge(e))return ct([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},de=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new T;const i=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[s,o]=n.split("(");if(!o)throw TypeError(i);const c=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[a,l,m,h]=c,f=[a,l,m],g=[a,l,m,h];if(s==="perspective"&&a&&[l,m].every(u=>u===void 0))r.m34=-1/a;else if(s.includes("matrix")&&[6,16].includes(c.length)&&c.every(u=>!Number.isNaN(+u))){const u=c.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(ct(u))}else if(s==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(a,l,m);else if(s==="translate"&&a&&m===void 0)r=r.translate(a,l||0,0);else if(s==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(a,l,m,h);else if(s==="rotate"&&a&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,a);else if(s==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(a,l,m);else if(s==="scale"&&!Number.isNaN(a)&&(a!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?a:l;r=r.scale(a,u,1)}else if(s==="skew"&&(a||!Number.isNaN(a)&&l)&&m===void 0)r=r.skew(a,l||0);else if(["translate","rotate","scale","skew"].some(u=>s.includes(u))&&/[XYZ]/.test(s)&&a&&[l,m].every(u=>u===void 0))if(s==="skewX"||s==="skewY")r=r[s](a);else{const u=s.replace(/[XYZ]/,""),y=s.replace(u,""),A=["X","Y","Z"].indexOf(y),x=u==="scale"?1:0,C=[A===0?a:x,A===1?a:x,A===2?a:x];r=r[u](...C)}else throw TypeError(i)}),r},kt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],be=(e,t,r)=>{const i=new T;return i.m41=e,i.e=e,i.m42=t,i.f=t,i.m43=r,i},pe=(e,t,r)=>{const i=new T,n=Math.PI/180,s=e*n,o=t*n,c=r*n,a=Math.cos(s),l=-Math.sin(s),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(c),g=-Math.sin(c),u=m*f,y=-m*g;i.m11=u,i.a=u,i.m12=y,i.b=y,i.m13=h;const A=l*h*f+a*g;i.m21=A,i.c=A;const x=a*f-l*h*g;return i.m22=x,i.d=x,i.m23=-l*m,i.m31=l*g-a*h*f,i.m32=l*f+a*h*g,i.m33=a*m,i},Ae=(e,t,r,i)=>{const n=new T,s=Math.sqrt(e*e+t*t+r*r);if(s===0)return n;const o=e/s,c=t/s,a=r/s,l=i*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=c*c,y=a*a,A=1-2*(u+y)*f;n.m11=A,n.a=A;const x=2*(o*c*f+a*m*h);n.m12=x,n.b=x,n.m13=2*(o*a*f-c*m*h);const C=2*(c*o*f-a*m*h);n.m21=C,n.c=C;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(c*a*f+o*m*h),n.m31=2*(a*o*f+c*m*h),n.m32=2*(a*c*f-o*m*h),n.m33=1-2*(g+u)*f,n},xe=(e,t,r)=>{const i=new T;return i.m11=e,i.a=e,i.m22=t,i.d=t,i.m33=r,i},Ct=(e,t)=>{const r=new T;if(e){const i=e*Math.PI/180,n=Math.tan(i);r.m21=n,r.c=n}if(t){const i=t*Math.PI/180,n=Math.tan(i);r.m12=n,r.b=n}return r},Ce=e=>Ct(e,0),Me=e=>Ct(0,e),B=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,i=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,s=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,c=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,a=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,A=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,x=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return ct([r,i,n,s,o,c,a,l,m,h,f,g,u,y,A,x])};class T{constructor(t){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,t?this.setMatrixValue(t):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?de(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?ct(t):typeof t=="object"?ye(t):this}toFloat32Array(t){return Float32Array.from(kt(this,t))}toFloat64Array(t){return Float64Array.from(kt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return B(this,t)}translate(t,r,i){const n=t;let s=r,o=i;return typeof s>"u"&&(s=0),typeof o>"u"&&(o=0),B(this,be(n,s,o))}scale(t,r,i){const n=t;let s=r,o=i;return typeof s>"u"&&(s=t),typeof o>"u"&&(o=1),B(this,xe(n,s,o))}rotate(t,r,i){let n=t,s=r||0,o=i||0;return typeof t=="number"&&typeof r>"u"&&typeof i>"u"&&(o=n,n=0,s=0),B(this,pe(n,s,o))}rotateAxisAngle(t,r,i,n){if([t,r,i,n].some(s=>Number.isNaN(+s)))throw new TypeError("CSSMatrix: expecting 4 values");return B(this,Ae(t,r,i,n))}skewX(t){return B(this,Ce(t))}skewY(t){return B(this,Me(t))}skew(t,r){return B(this,Ct(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,i=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,s=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,i,n,s):{x:r,y:i,z:n,w:s}}}I(T,"Translate",be),I(T,"Rotate",pe),I(T,"RotateAxisAngle",Ae),I(T,"Scale",xe),I(T,"SkewX",Ce),I(T,"SkewY",Me),I(T,"Skew",Ct),I(T,"Multiply",B),I(T,"fromArray",ct),I(T,"fromMatrix",ye),I(T,"fromString",de),I(T,"toArray",kt),I(T,"isCompatibleArray",fe),I(T,"isCompatibleObject",ge);const D=(e,t,r)=>{const[i,n]=e,[s,o]=t;return[i+(s-i)*r,n+(o-n)*r]},lt=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),mt=(e,t,r,i)=>lt([e,t],[r,i]),Vt=(e,t,r,i,n)=>{let s={x:e,y:t};if(typeof n=="number"){const o=lt([e,t],[r,i]);if(n<=0)s={x:e,y:t};else if(n>=o)s={x:r,y:i};else{const[c,a]=D([e,t],[r,i],n/o);s={x:c,y:a}}}return s},It=(e,t,r,i)=>{const{min:n,max:s}=Math;return[n(e,r),n(t,i),s(e,r),s(t,i)]},Pe=Object.freeze(Object.defineProperty({__proto__:null,getLineBBox:It,getLineLength:mt,getPointAtLineLength:Vt},Symbol.toStringTag,{value:"Module"})),Rt=(e,t,r)=>{const i=r/2,n=Math.sin(i),s=Math.cos(i),o=e**2*n**2,c=t**2*s**2,a=Math.sqrt(o+c)*r;return Math.abs(a)},U=(e,t,r,i,n,s)=>{const{sin:o,cos:c}=Math,a=c(n),l=o(n),m=r*c(s),h=i*o(s);return[e+a*m-l*h,t+l*m+a*h]},Et=(e,t)=>{const{x:r,y:i}=e,{x:n,y:s}=t,o=r*n+i*s,c=Math.sqrt((r**2+i**2)*(n**2+s**2));return(r*s-i*n<0?-1:1)*Math.acos(o/c)},Mt=(e,t,r,i,n,s,o,c,a)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(i);const x=(n%360+360)%360*(g/180);if(e===c&&t===a)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:c,y:a}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(c+e)/2,y:(a+t)/2}};const C=(e-c)/2,d=(t-a)/2,p={x:h(x)*C+m(x)*d,y:-m(x)*C+h(x)*d},M=p.x**2/u**2+p.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const S=u**2*y**2-u**2*p.y**2-y**2*p.x**2,q=u**2*p.y**2+y**2*p.x**2;let j=S/q;j=j<0?0:j;const v=(s!==o?1:-1)*f(j),N={x:v*(u*p.y/y),y:v*(-(y*p.x)/u)},Q={x:h(x)*N.x-m(x)*N.y+(e+c)/2,y:m(x)*N.x+h(x)*N.y+(t+a)/2},Y={x:(p.x-N.x)/u,y:(p.y-N.y)/y},$=Et({x:1,y:0},Y),P={x:(-p.x-N.x)/u,y:(-p.y-N.y)/y};let k=Et(Y,P);!o&&k>0?k-=2*g:o&&k<0&&(k+=2*g),k%=2*g;const Z=$+k;return{center:Q,startAngle:$,endAngle:Z,rx:u,ry:y}},Ot=(e,t,r,i,n,s,o,c,a)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=Mt(e,t,r,i,n,s,o,c,a);return Rt(l,m,f-h)},Se=(e,t,r,i,n,s,o,c,a,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=Mt(e,t,r,i,n,s,o,c,a);if(typeof l=="number"){const A=Rt(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=A)m={x:c,y:a};else{if(e===c&&t===a)return{x:c,y:a};if(f===0||g===0)return Vt(e,t,c,a,l);const{PI:x,cos:C,sin:d}=Math,p=y-u,S=(n%360+360)%360*(x/180),q=u+p*(l/A),j=f*C(q),v=g*d(q);m={x:C(S)*j-d(S)*v+h.x,y:d(S)*j+C(S)*v+h.y}}}return m},Te=(e,t,r,i,n,s,o,c,a)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=Mt(e,t,r,i,n,s,o,c,a),u=g-f,{min:y,max:A,tan:x,atan2:C,PI:d}=Math,{x:p,y:M}=l,S=n*d/180,q=x(S),j=C(-h*q,m),v=j,N=j+d,Q=C(h,m*q),Y=Q+d,$=[c],P=[a];let k=y(e,c),Z=A(e,c),O=y(t,a),G=A(t,a);const at=g-u*1e-5,tt=U(p,M,m,h,S,at),L=g-u*.99999,V=U(p,M,m,h,S,L);if(tt[0]>Z||V[0]>Z){const z=U(p,M,m,h,S,v);$.push(z[0]),P.push(z[1])}if(tt[0]G||V[1]>G){const z=U(p,M,m,h,S,Q);$.push(z[0]),P.push(z[1])}return k=y.apply([],$),O=y.apply([],P),Z=A.apply([],$),G=A.apply([],P),[k,O,Z,G]},Ne=Object.freeze(Object.defineProperty({__proto__:null,angleBetween:Et,arcLength:Rt,arcPoint:U,getArcBBox:Te,getArcLength:Ot,getArcProps:Mt,getPointAtArcLength:Se},Symbol.toStringTag,{value:"Module"})),_t=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],we=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Le=e=>{const t=[];for(let r=e,i=r.length,n=i-1;i>1;i-=1,n-=1){const s=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const i=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:i*n[0].x+t*n[1].x,y:i*n[0].y+t*n[1].y,t};const s=i*i,o=t*t;let c=0,a=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],c=s,a=i*t*2,l=o):r===3&&(c=s*i,a=s*t*3,l=i*o*3,m=t*o),{x:c*n[0].x+a*n[1].x+l*n[2].x+m*n[3].x,y:c*n[0].y+a*n[1].y+l*n[2].y+m*n[3].y,t}},ze=(e,t)=>{const r=e(t),i=r.x*r.x+r.y*r.y;return Math.sqrt(i)},qe=e=>{const r=_t.length;let i=0;for(let n=0,s;n{const t=[];for(let i=0,n=e.length,s=2;ive(r[0],i))},je=1e-8,Pt=([e,t,r])=>{const i=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[i,n];const s=(e*r-t*t)/(e-2*t+r);return s{const n=e-3*t+3*r-i;if(Math.abs(n)0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+i*m*m*m;fa&&(a=f)}return[c,a]},$e=Object.freeze(Object.defineProperty({__proto__:null,CBEZIER_MINMAX_EPSILON:je,Cvalues:we,Tvalues:_t,bezierLength:qe,calculateBezier:ze,computeBezier:ve,deriveBezier:Le,getBezierLength:ut,minmaxC:Dt,minmaxQ:Pt},Symbol.toStringTag,{value:"Module"})),ke=([e,t,r,i,n,s,o,c],a)=>{const l=1-a;return{x:l**3*e+3*l**2*a*r+3*l*a**2*n+a**3*o,y:l**3*t+3*l**2*a*i+3*l*a**2*s+a**3*c}},St=(e,t,r,i,n,s,o,c)=>ut([e,t,r,i,n,s,o,c]),Ve=(e,t,r,i,n,s,o,c,a)=>{const l=typeof a=="number";let m={x:e,y:t};if(l){const h=ut([e,t,r,i,n,s,o,c]);a<=0||(a>=h?m={x:o,y:c}:m=ke([e,t,r,i,n,s,o,c],a/h))}return m},Qt=(e,t,r,i,n,s,o,c)=>{const a=Dt([e,r,n,o]),l=Dt([t,i,s,c]);return[a[0],l[0],a[1],l[1]]},Ie=Object.freeze(Object.defineProperty({__proto__:null,getCubicBBox:Qt,getCubicLength:St,getPointAtCubicLength:Ve,getPointAtCubicSegmentLength:ke},Symbol.toStringTag,{value:"Module"})),Re=([e,t,r,i,n,s],o)=>{const c=1-o;return{x:c**2*e+2*c*o*r+o**2*n,y:c**2*t+2*c*o*i+o**2*s}},Tt=(e,t,r,i,n,s)=>ut([e,t,r,i,n,s]),Ee=(e,t,r,i,n,s,o)=>{const c=typeof o=="number";let a={x:e,y:t};if(c){const l=ut([e,t,r,i,n,s]);o<=0||(o>=l?a={x:n,y:s}:a=Re([e,t,r,i,n,s],o/l))}return a},Zt=(e,t,r,i,n,s)=>{const o=Pt([e,r,n]),c=Pt([t,i,s]);return[o[0],c[0],o[1],c[1]]},Oe=Object.freeze(Object.defineProperty({__proto__:null,getPointAtQuadLength:Ee,getPointAtQuadSegmentLength:Re,getQuadBBox:Zt,getQuadLength:Tt},Symbol.toStringTag,{value:"Module"})),_e=Object.freeze(Object.defineProperty({__proto__:null,polygonArea:e=>{const t=e.length;let r=-1,i,n=e[t-1],s=0;for(;++re.reduce((t,r,i)=>i?t+lt(e[i-1],r):0,0)},Symbol.toStringTag,{value:"Module"})),et=(e,t,r)=>{const{sin:i,cos:n}=Math,s=e*n(r)-t*i(r),o=e*i(r)+t*n(r);return{x:s,y:o}},w=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},J={origin:[0,0,0],round:4},K={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Nt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:i}=e;for(;i.length>=K[r]&&(r==="m"&&i.length>2?(e.segments.push([t].concat(i.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(i.splice(0,K[r]))),!!K[r]););},_="SVGPathCommander Error",Bt=e=>{const{index:t,pathValue:r}=e,i=r.charCodeAt(t);if(i===48){e.param=0,e.index+=1;return}if(i===49){e.param=1,e.index+=1;return}e.err=`${_}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},H=e=>e>=48&&e<=57,F="Invalid path value",Ht=e=>{const{max:t,pathValue:r,index:i}=e;let n=i,s=!1,o=!1,c=!1,a=!1,l;if(n>=t){e.err=`${_}: ${F} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!H(l)&&l!==46){e.err=`${_}: ${F} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(s=l===48,n+=1,l=r.charCodeAt(n),s&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),W=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Ut=e=>H(e)||e===43||e===45||e===46,Jt=e=>(e|32)===97,Kt=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},wt=e=>{var a;const{max:t,pathValue:r,index:i,segments:n}=e,s=r.charCodeAt(i),o=K[r[i].toLowerCase()];if(e.segmentStart=i,!Gt(s)){e.err=`${_}: ${F} "${r[i]}" is not a path command at index ${i}`;return}const c=n[n.length-1];if(!Kt(s)&&((a=c==null?void 0:c[0])==null?void 0:a.toLocaleLowerCase())==="z"){e.err=`${_}: ${F} "${r[i]}" is not a MoveTo path command at index ${i}`;return}if(e.index+=1,W(e),e.data=[],!o){Nt(e);return}for(;;){for(let l=o;l>0;l-=1){if(Jt(s)&&(l===3||l===4)?Bt(e):Ht(e),e.err.length)return;e.data.push(e.param),W(e),e.index=e.max||!Ut(r.charCodeAt(e.index)))break}Nt(e)};class Lt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const R=e=>{if(typeof e!="string")return e.slice(0);const t=new Lt(e);for(W(t);t.index{const[n]=e,s=n.toUpperCase();if(t===0||s===n)return e;if(s==="A")return[s,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+i];if(s==="V")return[s,e[1]+i];if(s==="H")return[s,e[1]+r];if(s==="L")return[s,e[1]+r,e[2]+i];{const c=[],a=e.length;for(let l=1;l{let r=e.length,i,n="M",s="M",o=!1,c=0,a=0,l=0,m=0,h=0;for(let f=0;f{const t=R(e);return E(t,nt)},vt=(e,t,r,i)=>{const[n]=e,s=n.toLowerCase();if(t===0||n===s)return e;if(s==="a")return[s,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-i];if(s==="v")return[s,e[1]-i];if(s==="h")return[s,e[1]-r];if(s==="l")return[s,e[1]-r,e[2]-i];{const c=[],a=e.length;for(let l=1;l{const t=R(e);return E(t,vt)},ft=(e,t,r,i,n,s,o,c,a,l)=>{let m=e,h=t,f=r,g=i,u=c,y=a;const A=Math.PI*120/180,x=Math.PI/180*(+n||0);let C=[],d,p,M,S,q;if(l)[p,M,S,q]=l;else{d=et(m,h,-x),m=d.x,h=d.y,d=et(u,y,-x),u=d.x,y=d.y;const L=(m-u)/2,V=(h-y)/2;let z=L*L/(f*f)+V*V/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);const ue=f*f,he=g*g,Ye=(s===o?-1:1)*Math.sqrt(Math.abs((ue*he-ue*V*V-he*L*L)/(ue*V*V+he*L*L)));S=Ye*f*V/g+(m+u)/2,q=Ye*-g*L/f+(h+y)/2,p=Math.asin(((h-q)/g*10**9>>0)/10**9),M=Math.asin(((y-q)/g*10**9>>0)/10**9),p=mM&&(p-=Math.PI*2),!o&&M>p&&(M-=Math.PI*2)}let j=M-p;if(Math.abs(j)>A){const L=M,V=u,z=y;M=p+A*(o&&M>p?1:-1),u=S+f*Math.cos(M),y=q+g*Math.sin(M),C=ft(u,y,f,g,n,0,o,V,z,[M,L,S,q])}j=M-p;const v=Math.cos(p),N=Math.sin(p),Q=Math.cos(M),Y=Math.sin(M),$=Math.tan(j/4),P=4/3*f*$,k=4/3*g*$,Z=[m,h],O=[m+P*N,h-k*v],G=[u+P*Y,y-k*Q],at=[u,y];if(O[0]=2*Z[0]-O[0],O[1]=2*Z[1]-O[1],l)return[O[0],O[1],G[0],G[1],at[0],at[1]].concat(C);C=[O[0],O[1],G[0],G[1],at[0],at[1]].concat(C);const tt=[];for(let L=0,V=C.length;L{const o=.3333333333333333,c=2/3;return[o*e+c*r,o*t+c*i,o*n+c*r,o*s+c*i,n,s]},zt=(e,t,r,i)=>{const n=D([e,t],[r,i],.3333333333333333),s=D([e,t],[r,i],2/3);return[n[0],n[1],s[0],s[1],r,i]},Yt=(e,t)=>{const[r]=e,i=e.slice(1).map(Number),[n,s]=i,{x1:o,y1:c,x:a,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=s,e):r==="A"?["C"].concat(ft(o,c,i[0],i[1],i[2],i[3],i[4],i[5],i[6])):r==="Q"?(t.qx=n,t.qy=s,["C"].concat(Xt(o,c,i[0],i[1],i[2],i[3]))):r==="L"?["C"].concat(zt(o,c,n,s)):r==="Z"?["C"].concat(zt(o,c,a,l)):e},gt=(e,t)=>{const[r]=e,i=r.toUpperCase(),n=r!==i,{x1:s,y1:o,x2:c,y2:a,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(i)||(t.qx=null,t.qy=null),i==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(i==="H")return["L",e[1]+(n?l:0),o];if(i==="V")return["L",s,e[1]+(n?m:0)];if(i==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(i==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(i==="C")return["C"].concat(f);if(i==="S"){const g=s*2-c,u=o*2-a;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(i==="T"){const g=s*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(i==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(i==="Z")return["Z"];return e},rt={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},yt=e=>{const t={...rt},r=R(e);return E(r,(i,n,s,o)=>{t.x=s,t.y=o;const c=gt(i,t);let a=Yt(c,t);a[0]==="C"&&a.length>7&&(r.splice(n+1,0,["C"].concat(a.slice(7))),a=a.slice(0,7));const m=a.length;return t.x1=+a[m-2],t.y1=+a[m-1],t.x2=+a[m-4]||t.x1,t.y2=+a[m-3]||t.y1,a})},qt=(e,t)=>{const r=e.length;let{round:i}=J,n=e[0],s="";i=t==="off"||typeof t=="number"&&t>=0?t:typeof i=="number"&&i>=0?i:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=R(e);let r="M",i=0,n=0;const{max:s,min:o}=Math;let c=1/0,a=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,A=0,x=0,C=0,d=0,p=0;E(t,(q,j,v,N)=>{[r]=q;const Q=r.toUpperCase(),$=Q!==r?nt(q,j,v,N):q.slice(0),P=Q==="V"?["L",v,$[1]]:Q==="H"?["L",$[1],N]:$;if([r]=P,"TQ".includes(Q)||(d=0,p=0),r==="M")[,i,n]=P,h=i,f=n,g=i,u=n;else if(r==="L")[h,f,g,u]=It(v,N,P[1],P[2]);else if(r==="A")[h,f,g,u]=Te(v,N,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(r==="S"){const k=y*2-x,Z=A*2-C;[h,f,g,u]=Qt(v,N,k,Z,P[1],P[2],P[3],P[4])}else r==="C"?[h,f,g,u]=Qt(v,N,P[1],P[2],P[3],P[4],P[5],P[6]):r==="T"?(d=y*2-d,p=A*2-p,[h,f,g,u]=Zt(v,N,d,p,P[1],P[2])):r==="Q"?(d=P[1],p=P[2],[h,f,g,u]=Zt(v,N,P[1],P[2],P[3],P[4])):r==="Z"&&([h,f,g,u]=It(v,N,i,n));c=o(h,c),a=o(f,a),l=s(g,l),m=s(u,m),[y,A]=r==="Z"?[i,n]:P.slice(-2),[x,C]=r==="C"?[P[3],P[4]]:r==="S"?[P[1],P[2]]:[y,A]});const M=l-c,S=m-a;return{width:M,height:S,x:c,y:a,x2:l,y2:m,cx:c+M/2,cy:a+S/2,cz:Math.max(M,S)+Math.min(M,S)/2}},X=e=>{const t=R(e);let r=0,i=0,n=0,s=0,o=0,c=0,a="M",l=0,m=0,h=0;return E(t,(f,g,u,y)=>{[a]=f;const A=a.toUpperCase(),C=A!==a?nt(f,g,u,y):f.slice(0),d=A==="V"?["L",u,C[1]]:A==="H"?["L",C[1],y]:C;if([a]=d,"TQ".includes(A)||(o=0,c=0),a==="M")[,l,m]=d;else if(a==="L")h+=mt(u,y,d[1],d[2]);else if(a==="A")h+=Ot(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(a==="S"){const p=r*2-n,M=i*2-s;h+=St(u,y,p,M,d[1],d[2],d[3],d[4])}else a==="C"?h+=St(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):a==="T"?(o=r*2-o,c=i*2-c,h+=Tt(u,y,o,c,d[1],d[2])):a==="Q"?(o=d[1],c=d[2],h+=Tt(u,y,d[1],d[2],d[3],d[4])):a==="Z"&&(h+=mt(u,y,l,m));[r,i]=a==="Z"?[l,m]:d.slice(-2),[n,s]=a==="C"?[d[3],d[4]]:a==="S"?[d[1],d[2]]:[r,i]}),h},dt=1e-5,it=e=>{const t=R(e),r={...rt};return E(t,(i,n,s,o)=>{r.x=s,r.y=o;const c=gt(i,r),a=c.length;return r.x1=+c[a-2],r.y1=+c[a-1],r.x2=+c[a-4]||r.x1,r.y2=+c[a-3]||r.y1,c})},st=(e,t)=>{const r=it(e);let i=!1,n=[],s="M",o=0,c=0,[a,l]=r[0].slice(1);const m=typeof t=="number";let h={x:a,y:l},f=0,g=h,u=0;return!m||t{if([s]=y,i=s==="M",n=i?n:[x,C].concat(y.slice(1)),i?([,a,l]=y,h={x:a,y:l},f=0):s==="L"?(h=Vt(n[0],n[1],n[2],n[3],t-u),f=mt(n[0],n[1],n[2],n[3])):s==="A"?(h=Se(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=Ot(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):s==="C"?(h=Ve(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=St(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):s==="Q"?(h=Ee(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=Tt(n[0],n[1],n[2],n[3],n[4],n[5])):s==="Z"&&(n=[x,C,a,l],h={x:a,y:l},f=mt(n[0],n[1],n[2],n[3])),[o,c]=n.slice(-2),uu-dt?{x:o,y:c}:g)},jt=(e,t)=>{const r=R(e);let i=r.slice(0),n=X(i),s=i.length-1,o=0,c=0,a=r[0];if(s<=0||!t||!Number.isFinite(t))return{segment:a,index:0,length:c,lengthAtSegment:o};if(t>=n)return i=r.slice(0,-1),o=X(i),c=n-o,a=r[s],{segment:a,index:s,length:c,lengthAtSegment:o};const l=[];for(;s>0;)a=i[s],i=i.slice(0,-1),o=X(i),c=n-o,n=o,l.push({segment:a,index:s,length:c,lengthAtSegment:o}),s-=1;return l.find(({lengthAtSegment:m})=>m<=t)},bt=(e,t)=>{const r=R(e),i=it(r),n=X(i),s=p=>{const M=p.x-t.x,S=p.y-t.y;return M*M+S*S};let o=8,c,a={x:0,y:0},l=0,m=0,h=1/0;for(let p=0;p<=n;p+=o)c=st(i,p),l=s(c),l1e-6&&(u=m-o,f=st(i,u),A=s(f),y=m+o,g=st(i,y),x=s(g),u>=0&&Abt(e,t).closest,rn=(e,t,r,i,n,s,o,c)=>3*((c-t)*(r+n)-(o-e)*(i+s)+i*(e-n)-r*(t-s)+c*(n+e/3)-o*(s+t/3))/20,ee=e=>{let t=0,r=0,i=0;return yt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return i=rn(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),i}}).reduce((n,s)=>n+s,0)},Qe=e=>ee(yt(e))>=0,Ze=(e,t)=>jt(e,t).segment,Be=(e,t)=>bt(e,t).segment,pt=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return K[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,ne=e=>pt(e)&&e.every(([t])=>t===t.toUpperCase()),re=e=>ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),He=e=>re(e)&&e.every(([t])=>"MC".includes(t)),Fe=(e,t)=>{const{distance:r}=bt(e,t);return Math.abs(r)pt(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),ie=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Lt(e);for(W(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,sn=e=>{let{x1:t,y1:r,x2:i,y2:n}=e;return[t,r,i,n]=[t,r,i,n].map(s=>+s),[["M",t,r],["L",i,n]]},on=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let i=0;for(;i{let{cx:t,cy:r,r:i}=e;return[t,r,i]=[t,r,i].map(n=>+n),[["M",t-i,r],["a",i,i,0,1,0,2*i,0],["a",i,i,0,1,0,-2*i,0]]},cn=e=>{let{cx:t,cy:r}=e,i=e.rx||0,n=e.ry||i;return[t,r,i,n]=[t,r,i,n].map(s=>+s),[["M",t-i,r],["a",i,n,0,1,0,2*i,0],["a",i,n,0,1,0,-2*i,0]]},ln=e=>{const t=+e.x||0,r=+e.y||0,i=+e.width,n=+e.height;let s=+(e.rx||0),o=+(e.ry||s);return s||o?(s*2>i&&(s-=(s*2-i)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+s,r],["h",i-s*2],["s",s,0,s,o],["v",n-o*2],["s",0,o,-s,o],["h",-i+s*2],["s",-s,0,-s,-o],["v",-n+o*2],["s",0,-o,s,-o]]):[["M",t,r],["h",i],["v",n],["H",t],["Z"]]},se=e=>{const t=Object.keys(ot),r=Ue(e),i=r?e.tagName:null;if(i&&[...t,"path"].every(a=>i!==a))throw TypeError(`${_}: "${i}" is not SVGElement`);const n=r?i:e.type,s=ot[n],o={type:n};r?s.forEach(a=>{o[a]=e.getAttribute(a)}):Object.assign(o,e);let c=[];return n==="circle"?c=an(o):n==="ellipse"?c=cn(o):["polyline","polygon"].includes(n)?c=on(o):n==="rect"?c=ln(o):n==="line"?c=sn(o):["glyph","path"].includes(n)&&(c=R(r?e.getAttribute("d")||"":e.d||"")),pt(c)&&c.length?c:!1},Je=(e,t,r)=>{const i=r||document,n=Object.keys(ot),s=Ue(e),o=s?e.tagName:null;if(o==="path")throw TypeError(`${_}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${_}: "${o}" is not SVGElement`);const c=i.createElementNS("http://www.w3.org/2000/svg","path"),a=s?o:e.type,l=ot[a],m={type:a},h=J.round,f=se(e),g=f&&f.length?qt(f,h):"";return s?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||c.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&c.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),ie(g)?(c.setAttribute("d",g),t&&s&&(e.before(c,e),e.remove()),c):!1},oe=(e,t,r,i)=>{const[n]=e,{round:s}=J,o=s,c=t.slice(1),{x1:a,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=c.slice(-2),A=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(w(f,o)===w(u,o))return["V",y];if(w(g,o)===w(y,o))return["H",u]}else if(n==="C"){const[x,C]=c;if(r.x1=x,r.y1=C,"CS".includes(i)&&(w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o)||w(a,o)===w(m*2-f,o)&&w(l,o)===w(h*2-g,o)))return["S",c[2],c[3],c[4],c[5]]}else if(n==="Q"){const[x,C]=c;if(r.qx=x,r.qy=C,"QT".includes(i)&&w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o))return["T",c[2],c[3]]}return A},At=(e,t)=>{const r=e.slice(1).map(i=>w(i,t));return[e[0]].concat(r)},ae=(e,t)=>{const r=ht(e),i=typeof t=="number"&&t>=0?t:2,n={...rt},s=[];let o="M",c="Z";return E(r,(a,l,m,h)=>{n.x=m,n.y=h;const f=gt(a,n);let g=a;if([o]=a,s[l]=o,l){c=s[l-1];const y=oe(a,f,n,c),A=At(y,i),x=A.join(""),C=vt(y,l,m,h),d=At(C,i),p=d.join("");g=x.length{const t=ht(e),r=it(t),i=t.length,n=t[i-1][0]==="Z",s=E(t,(o,c)=>{const a=r[c],l=c&&t[c-1],m=l&&l[0],h=t[c+1],f=h&&h[0],[g]=o,[u,y]=r[c?c-1:i-1].slice(-2);let A=o;switch(g){case"M":A=n?["Z"]:[g,u,y];break;case"A":A=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?A=["S",o[1],o[2],u,y]:A=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?A=["C",a[3],a[4],a[1],a[2],u,y]:A=[g,a[1],a[2],u,y];break;case"Q":h&&f==="T"?A=["T",u,y]:A=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?A=["Q",a[1],a[2],u,y]:A=[g,u,y];break;case"Z":A=["M",u,y];break;case"H":A=[g,u];break;case"V":A=[g,y];break;default:A=[g].concat(o.slice(1,-2),u,y)}return A});return n?s.reverse():[s[0]].concat(s.slice(1).reverse())},ce=e=>{const t=[];let r,i=-1,n=0,s=0,o=0,c=0;const a={...rt};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(i+=1,[n,s]=u,n+=g?a.x:0,s+=g?a.y:0,o=n,c=s,r=[g?[h,o,c]:l]):(h==="Z"?(n=o,s=c):h==="H"?([,n]=l,n+=g?a.x:0):h==="V"?([,s]=l,s+=g?a.y:0):([n,s]=l.slice(-2),n+=g?a.x:0,s+=g?a.y:0),r.push(l)),a.x=n,a.y=s,t[i]=r}),t},le=e=>{let t=new T;const{origin:r}=e,[i,n]=r,{translate:s}=e,{rotate:o}=e,{skew:c}=e,{scale:a}=e;return Array.isArray(s)&&s.length>=2&&s.every(l=>!Number.isNaN(+l))&&s.some(l=>l!==0)?t=t.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(t=t.translate(s)),(o||c||a)&&(t=t.translate(i,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(c)&&c.length===2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==0)?(t=c[0]?t.skewX(c[0]):t,t=c[1]?t.skewY(c[1]):t):typeof c=="number"&&!Number.isNaN(c)&&(t=t.skewX(c)),Array.isArray(a)&&a.length>=2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==1)?t=t.scale(...a):typeof a=="number"&&!Number.isNaN(a)&&(t=t.scale(a)),t=t.translate(-i,-n)),t},mn=(e,t)=>{let r=T.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},$t=(e,t,r)=>{const[i,n,s]=r,[o,c,a]=mn(e,[t[0],t[1],0,1]),l=o-i,m=c-n,h=a-s;return[l*(Math.abs(s)/Math.abs(h)||1)+i,m*(Math.abs(s)/Math.abs(h)||1)+n]},me=(e,t)=>{let r=0,i=0,n=0,s=0,o=0,c=0,a="M";const l=R(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:J.origin});const h=t.origin,f=le(t);return f.isIdentity?l.slice(0):E(l,(g,u,y,A)=>{[a]=g;const x=a.toUpperCase(),d=x!==a?nt(g,u,y,A):g.slice(0);let p=x==="A"?["C"].concat(ft(y,A,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):x==="V"?["L",y,d[1]]:x==="H"?["L",d[1],A]:d;a=p[0];const M=a==="C"&&p.length>7,S=M?p.slice(0,7):p.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(p.slice(7))),p=S),a==="L")[n,s]=$t(f,[p[1],p[2]],h),r!==n&&i!==s?p=["L",n,s]:i===s?p=["H",n]:r===n&&(p=["V",s]);else for(o=1,c=p.length;o{const t=e.slice(1).map((r,i,n)=>i?n[i-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((i,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},We=(e,t)=>{let{round:r}=J;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):E(e,i=>At(i,r))},Xe=(e,t=.5)=>{const r=t,i=e.slice(0,2),n=e.slice(2,4),s=e.slice(4,6),o=e.slice(6,8),c=D(i,n,r),a=D(n,s,r),l=D(s,o,r),m=D(c,a,r),h=D(a,l,r),f=D(m,h,r);return[["C",c[0],c[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class un{constructor(t,r){const i=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${_}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=R(t);const{round:s,origin:o}=i;let c;Number.isInteger(s)||s==="off"?c=s:c=J.round;let a=J.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);a=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=c,this.origin=a,this}get bbox(){return te(this.segments)}get length(){return X(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return st(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=ht(t),this}toRelative(){const{segments:t}=this;return this.segments=Wt(t),this}toCurve(){const{segments:t}=this;return this.segments=yt(t),this}reverse(t){const{segments:r}=this,i=ce(r),n=i.length>1?i:!1,s=n?n.map((c,a)=>t?a?xt(c):c.slice(0):xt(c)):r.slice(0);let o=[];return n?o=s.flat(1):o=t?r:xt(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=it(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=ae(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(a=>a in t))return this;const{segments:r,origin:[i,n,s]}=this,o={};for(const[a,l]of Object.entries(t))a==="skew"&&Array.isArray(l)||(a==="rotate"||a==="translate"||a==="origin"||a==="scale")&&Array.isArray(l)?o[a]=l.map(Number):a!=="origin"&&typeof Number(l)=="number"&&(o[a]=Number(l));const{origin:c}=o;if(Array.isArray(c)&&c.length>=2){const[a,l,m]=c.map(Number);o.origin=[Number.isNaN(a)?i:a,Number.isNaN(l)?n:l,m||s]}else o.origin=[i,n,s];return this.segments=me(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return qt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return T}static get arcTools(){return Ne}static get bezierTools(){return $e}static get cubicTools(){return Ie}static get lineTools(){return Pe}static get polygonTools(){return _e}static get quadTools(){return Oe}static get pathToAbsolute(){return ht}static get pathToRelative(){return Wt}static get pathToCurve(){return yt}static get pathToString(){return qt}static get distanceSquareRoot(){return lt}static get midPoint(){return D}static get rotateVector(){return et}static get roundTo(){return w}static get parsePathString(){return R}static get finalizeSegment(){return Nt}static get invalidPathValue(){return F}static get isArcCommand(){return Jt}static get isDigit(){return H}static get isDigitStart(){return Ut}static get isMoveCommand(){return Kt}static get isPathCommand(){return Gt}static get isSpace(){return Ft}static get paramsCount(){return K}static get paramsParser(){return rt}static get pathParser(){return Lt}static get scanFlag(){return Bt}static get scanParam(){return Ht}static get scanSegment(){return wt}static get skipSpaces(){return W}static get distanceEpsilon(){return dt}static get getClosestPoint(){return De}static get getDrawDirection(){return Qe}static get getPathArea(){return ee}static get getPathBBox(){return te}static get getPointAtLength(){return st}static get getPropertiesAtLength(){return jt}static get getPropertiesAtPoint(){return bt}static get getSegmentAtLength(){return Ze}static get getSegmentOfPoint(){return Be}static get getTotalLength(){return X}static get isAbsoluteArray(){return ne}static get isCurveArray(){return He}static get isNormalizedArray(){return re}static get isPathArray(){return pt}static get isPointInStroke(){return Fe}static get isRelativeArray(){return Ge}static get isValidPath(){return ie}static get shapeParams(){return ot}static get shapeToPath(){return Je}static get shapeToPathArray(){return se}static get absolutizeSegment(){return nt}static get arcToCubic(){return ft}static get getSVGMatrix(){return le}static get iterate(){return E}static get lineToCubic(){return zt}static get normalizePath(){return it}static get normalizeSegment(){return gt}static get optimizePath(){return ae}static get projection2d(){return $t}static get quadToCubic(){return Xt}static get relativizeSegment(){return vt}static get reverseCurve(){return Ke}static get reversePath(){return xt}static get roundPath(){return We}static get roundSegment(){return At}static get segmentToCubic(){return Yt}static get shortenSegment(){return oe}static get splitCubic(){return Xe}static get splitPath(){return ce}static get transformPath(){return me}}return b.CSSMatrix=T,b.absolutizeSegment=nt,b.arcToCubic=ft,b.arcTools=Ne,b.bezierTools=$e,b.cubicTools=Ie,b.default=un,b.distanceEpsilon=dt,b.distanceSquareRoot=lt,b.finalizeSegment=Nt,b.getClosestPoint=De,b.getDrawDirection=Qe,b.getPathArea=ee,b.getPathBBox=te,b.getPointAtLength=st,b.getPropertiesAtLength=jt,b.getPropertiesAtPoint=bt,b.getSVGMatrix=le,b.getSegmentAtLength=Ze,b.getSegmentOfPoint=Be,b.getTotalLength=X,b.invalidPathValue=F,b.isAbsoluteArray=ne,b.isArcCommand=Jt,b.isCurveArray=He,b.isDigit=H,b.isDigitStart=Ut,b.isMoveCommand=Kt,b.isNormalizedArray=re,b.isPathArray=pt,b.isPathCommand=Gt,b.isPointInStroke=Fe,b.isRelativeArray=Ge,b.isSpace=Ft,b.isValidPath=ie,b.iterate=E,b.lineToCubic=zt,b.lineTools=Pe,b.midPoint=D,b.normalizePath=it,b.normalizeSegment=gt,b.optimizePath=ae,b.paramsCount=K,b.paramsParser=rt,b.parsePathString=R,b.pathParser=Lt,b.pathToAbsolute=ht,b.pathToCurve=yt,b.pathToRelative=Wt,b.pathToString=qt,b.polygonTools=_e,b.projection2d=$t,b.quadToCubic=Xt,b.quadTools=Oe,b.relativizeSegment=vt,b.reverseCurve=Ke,b.reversePath=xt,b.rotateVector=et,b.roundPath=We,b.roundSegment=At,b.roundTo=w,b.scanFlag=Bt,b.scanParam=Ht,b.scanSegment=wt,b.segmentToCubic=Yt,b.shapeParams=ot,b.shapeToPath=Je,b.shapeToPathArray=se,b.shortenSegment=oe,b.skipSpaces=W,b.splitCubic=Xe,b.splitPath=ce,b.transformPath=me,Object.defineProperties(b,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),b}({}); //# sourceMappingURL=svg-path-commander.js.map diff --git a/dist/svg-path-commander.js.map b/dist/svg-path-commander.js.map index 08bc8c9..20e9acd 100644 --- a/dist/svg-path-commander.js.map +++ b/dist/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/math/rotateVector.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/options/options.ts","../src/math/roundTo.ts","../src/convert/pathToString.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getTotalLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getPathBBox.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/getSVGMatrix.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/projection2d.ts","../src/process/reverseCurve.ts","../src/process/reversePath.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/process/splitPath.ts","../src/process/transformPath.ts","../src/index.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","\"use strict\";\nimport * as util from \"./util\";\n// import CSSMatrix from \"@thednp/dommatrix\";\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n// import * as arcTools from \"./math/arcTools\";\n// import * as bezierTools from \"./math/bezier\";\n// import * as cubicTools from \"./math/cubicTools\";\n// import * as lineTools from \"./math/lineTools\";\n// import * as quadTools from \"./math/quadTools\";\n// import * as polygonTools from \"./math/polygonTools\";\n\n// import distanceSquareRoot from \"./math/distanceSquareRoot\";\n// import midPoint from \"./math/midPoint\";\n// import rotateVector from \"./math/rotateVector\";\n// import roundTo from \"./math/roundTo\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\n// import finalizeSegment from \"./parser/finalizeSegment\";\n// import invalidPathValue from \"./parser/invalidPathValue\";\n// import isArcCommand from \"./parser/isArcCommand\";\n// import isDigit from \"./parser/isDigit\";\n// import isDigitStart from \"./parser/isDigitStart\";\n// import isMoveCommand from \"./parser/isMoveCommand\";\n// import isPathCommand from \"./parser/isPathCommand\";\n// import isSpace from \"./parser/isSpace\";\n// import paramsCount from \"./parser/paramsCount\";\n// import paramsParser from \"./parser/paramsParser\";\n// import pathParser from \"./parser/pathParser\";\n// import scanFlag from \"./parser/scanFlag\";\n// import scanParam from \"./parser/scanParam\";\n// import scanSegment from \"./parser/scanSegment\";\n// import skipSpaces from \"./parser/skipSpaces\";\n\n// import distanceEpsilon from \"./util/distanceEpsilon\";\n// import getClosestPoint from \"./util/getClosestPoint\";\n// import getDrawDirection from \"./util/getDrawDirection\";\n// import getPathArea from \"./util/getPathArea\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getPointAtLength from \"./util/getPointAtLength\";\n// import getPropertiesAtLength from \"./util/getPropertiesAtLength\";\n// import getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\n// import getSegmentAtLength from \"./util/getSegmentAtLength\";\n// import getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport getTotalLength from \"./util/getTotalLength\";\n\n// import isAbsoluteArray from \"./util/isAbsoluteArray\";\n// import isCurveArray from \"./util/isCurveArray\";\n// import isNormalizedArray from \"./util/isNormalizedArray\";\n// import isPathArray from \"./util/isPathArray\";\n// import isPointInStroke from \"./util/isPointInStroke\";\n// import isRelativeArray from \"./util/isRelativeArray\";\n// import isValidPath from \"./util/isValidPath\";\n// import shapeParams from \"./util/shapeParams\";\n// import shapeToPath from \"./util/shapeToPath\";\n// import shapeToPathArray from \"./util/shapeToPathArray\";\n\n// import absolutizeSegment from \"./process/absolutizeSegment\";\n// import arcToCubic from \"./process/arcToCubic\";\n// import getSVGMatrix from \"./process/getSVGMatrix\";\n// import iterate from \"./process/iterate\";\n// import lineToCubic from \"./process/lineToCubic\";\nimport normalizePath from \"./process/normalizePath\";\n// import normalizeSegment from \"./process/normalizeSegment\";\nimport optimizePath from \"./process/optimizePath\";\n// import projection2d from \"./process/projection2d\";\n// import quadToCubic from \"./process/quadToCubic\";\n// import relativizeSegment from \"./process/relativizeSegment\";\n// import reverseCurve from \"./process/reverseCurve\";\nimport reversePath from \"./process/reversePath\";\n// import roundPath from \"./process/roundPath\";\n// import roundSegment from \"./process/roundSegment\";\n// import segmentToCubic from \"./process/segmentToCubic\";\n// import shortenSegment from \"./process/shortenSegment\";\n// import splitCubic from \"./process/splitCubic\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\n\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`,\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" || k === \"translate\" || k === \"origin\" ||\n k === \"scale\") && Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n}\n\n// export {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// // SVGPathCommander as default,\n// transformPath,\n// };\n\n// const index = {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// transformPath,\n// };\n\n// export { absolutizeSegment }\n// export { arcToCubic }\n// export { arcTools }\n// export { bezierTools }\n// export { CSSMatrix }\n// export { cubicTools }\n// export { distanceEpsilon }\n// export { distanceSquareRoot }\n// export { finalizeSegment }\n// export { getClosestPoint }\n// export { getDrawDirection }\n// export { getPathArea }\n// export { getPathBBox }\n// export { getPointAtLength }\n// export { getPropertiesAtLength }\n// export { getPropertiesAtPoint }\n// export { getSegmentAtLength }\n// export { getSegmentOfPoint }\n// export { getSVGMatrix }\n// export { getTotalLength }\n// export { invalidPathValue }\n// export { isAbsoluteArray }\n// export { isArcCommand }\n// export { isCurveArray }\n// export { isDigit }\n// export { isDigitStart }\n// export { isMoveCommand }\n// export { isNormalizedArray }\n// export { isPathArray }\n// export { isPathCommand }\n// export { isPointInStroke }\n// export { isRelativeArray }\n// export { isSpace }\n// export { isValidPath }\n// export { iterate }\n// export { lineToCubic }\n// export { lineTools }\n// export { midPoint }\n// export { normalizePath }\n// export { normalizeSegment }\n// export { optimizePath }\n// export { paramsCount }\n// export { paramsParser }\n// export { parsePathString }\n// export { pathParser }\n// export { pathToAbsolute }\n// export { pathToCurve }\n// export { pathToRelative }\n// export { pathToString }\n// export { polygonTools }\n// export { projection2d }\n// export { quadToCubic }\n// export { quadTools }\n// export { relativizeSegment }\n// export { reverseCurve }\n// export { reversePath }\n// export { rotateVector }\n// export { roundPath }\n// export { roundSegment }\n// export { roundTo }\n// export { scanFlag }\n// export { scanParam }\n// export { scanSegment }\n// export { segmentToCubic }\n// export { shapeParams }\n// export { shapeToPath }\n// export { shapeToPathArray }\n// export { shortenSegment }\n// export { skipSpaces }\n// export { splitCubic }\n// export { splitPath }\n// export { transformPath }\n// export { SVGPathCommander as default }\n// export default SVGPathCommander;\nconst defaultExport = Object.assign(SVGPathCommander, util);\n\nexport { defaultExport as default };\n// export default Object.assign(SVGPathCommander, index);\n"],"names":["Z","z","s","t","e","p","$","E","P","y","g","n","i","r","a","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","l","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","polygon","area","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","rotateVector","rad","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","defaultOptions","roundTo","round","pow","pathToString","roundOption","valLen","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","totalLength","getTotalLength","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getPathBBox","minX","minY","maxX","maxY","width","height","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","reverseCurve","rotatedCurve","curveOnly","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","splitPath","composite","pi","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","util"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport * as arcTools from \"./math/arcTools\";\nimport * as bezierTools from \"./math/bezier\";\nimport * as cubicTools from \"./math/cubicTools\";\nimport * as lineTools from \"./math/lineTools\";\nimport * as quadTools from \"./math/quadTools\";\nimport * as polygonTools from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file diff --git a/dist/svg-path-commander.mjs b/dist/svg-path-commander.mjs index 4cb7366..b6c335e 100644 --- a/dist/svg-path-commander.mjs +++ b/dist/svg-path-commander.mjs @@ -1,2 +1,2 @@ -var jt=Object.defineProperty;var me=(t,e)=>{for(var n in e)jt(t,n,{get:e[n],enumerable:!0})};var dt={};me(dt,{CSSMatrix:()=>pn,absolutizeSegment:()=>_,arcToCubic:()=>Pe,arcTools:()=>lt,bezierTools:()=>ct,cubicTools:()=>ht,distanceEpsilon:()=>fe,distanceSquareRoot:()=>ie,finalizeSegment:()=>ve,getClosestPoint:()=>Rt,getDrawDirection:()=>kt,getPathArea:()=>Ge,getPathBBox:()=>_e,getPointAtLength:()=>te,getPropertiesAtLength:()=>Ae,getPropertiesAtPoint:()=>re,getSVGMatrix:()=>Xe,getSegmentAtLength:()=>zt,getSegmentOfPoint:()=>Vt,getTotalLength:()=>F,invalidPathValue:()=>H,isAbsoluteArray:()=>Ue,isArcCommand:()=>$e,isCurveArray:()=>Qt,isDigit:()=>B,isDigitStart:()=>Ie,isMoveCommand:()=>je,isNormalizedArray:()=>Ke,isPathArray:()=>ne,isPathCommand:()=>Oe,isPointInStroke:()=>qt,isRelativeArray:()=>Et,isSpace:()=>De,isValidPath:()=>Fe,iterate:()=>M,lineToCubic:()=>Ne,lineTools:()=>at,midPoint:()=>D,normalizePath:()=>K,normalizeSegment:()=>Y,optimizePath:()=>et,paramsCount:()=>Z,paramsParser:()=>U,parsePathString:()=>T,pathParser:()=>W,pathToAbsolute:()=>X,pathToCurve:()=>ee,pathToRelative:()=>Be,pathToString:()=>Se,polygonTools:()=>yt,projection2d:()=>we,quadToCubic:()=>He,quadTools:()=>gt,relativizeSegment:()=>xe,reverseCurve:()=>Ot,reversePath:()=>Ce,rotateVector:()=>ce,roundPath:()=>It,roundSegment:()=>he,roundTo:()=>L,scanFlag:()=>qe,scanParam:()=>Ee,scanSegment:()=>de,segmentToCubic:()=>Ze,shapeParams:()=>oe,shapeToPath:()=>Dt,shapeToPathArray:()=>We,shortenSegment:()=>Ye,skipSpaces:()=>G,splitCubic:()=>$t,splitPath:()=>tt,transformPath:()=>rt});import{default as pn}from"@thednp/dommatrix";var lt={};me(lt,{angleBetween:()=>st,arcLength:()=>mt,arcPoint:()=>le,getArcBBox:()=>ut,getArcLength:()=>Me,getArcProps:()=>ke,getPointAtArcLength:()=>it});var at={};me(at,{getLineBBox:()=>Re,getLineLength:()=>ue,getPointAtLineLength:()=>Te});var Bt=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},D=Bt;var Ht=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),ie=Ht;var ue=(t,e,n,o)=>ie([t,e],[n,o]),Te=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=ie([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=D([t,e],[n,o],r/a);s={x:i,y:m}}}return s},Re=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]};var mt=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},le=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),l=n*i(s),p=o*a(s);return[t+m*l-u*p,e+u*l+m*p]},st=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},ke=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:l,cos:p,sqrt:f,PI:h}=Math,c=u(n),b=u(o),S=(r%360+360)%360*(h/180);if(t===i&&e===m)return{rx:c,ry:b,startAngle:0,endAngle:0,center:{x:i,y:m}};if(c===0||b===0)return{rx:c,ry:b,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,g={x:p(S)*A+l(S)*y,y:-l(S)*A+p(S)*y},x=g.x**2/c**2+g.y**2/b**2;x>1&&(c*=f(x),b*=f(x));let C=c**2*b**2-c**2*g.y**2-b**2*g.x**2,k=c**2*g.y**2+b**2*g.x**2,V=C/k;V=V<0?0:V;let w=(s!==a?1:-1)*f(V),v={x:w*(c*g.y/b),y:w*(-(b*g.x)/c)},$={x:p(S)*v.x-l(S)*v.y+(t+i)/2,y:l(S)*v.x+p(S)*v.y+(e+m)/2},ae={x:(g.x-v.x)/c,y:(g.y-v.y)/b},Q=st({x:1,y:0},ae),P={x:(-g.x-v.x)/c,y:(-g.y-v.y)/b},q=st(ae,P);!a&&q>0?q-=2*h:a&&q<0&&(q+=2*h),q%=2*h;let j=Q+q;return{center:$,startAngle:Q,endAngle:j,rx:c,ry:b}},Me=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:l,startAngle:p,endAngle:f}=ke(t,e,n,o,r,s,a,i,m);return mt(u,l,f-p)},it=(t,e,n,o,r,s,a,i,m,u)=>{let l={x:t,y:e},{center:p,rx:f,ry:h,startAngle:c,endAngle:b}=ke(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let d=mt(f,h,b-c);if(u<=0)l={x:t,y:e};else if(u>=d)l={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||h===0)return Te(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,g=b-c,C=(r%360+360)%360*(S/180),k=c+g*(u/d),V=f*A(k),w=h*y(k);l={x:A(C)*V-y(C)*w+p.x,y:y(C)*V+A(C)*w+p.y}}}return l},ut=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:l,ry:p,startAngle:f,endAngle:h}=ke(t,e,n,o,r,s,a,i,m),c=h-f,{min:b,max:d,tan:S,atan2:A,PI:y}=Math,{x:g,y:x}=u,C=r*y/180,k=S(C),V=A(-p*k,l),w=V,v=V+y,$=A(p,l*k),ae=$+y,Q=[i],P=[m],q=b(t,i),j=d(t,i),O=b(e,m),J=d(e,m),be=h-c*1e-5,se=le(g,x,l,p,C,be),N=h-c*.99999,E=le(g,x,l,p,C,N);if(se[0]>j||E[0]>j){let R=le(g,x,l,p,C,w);Q.push(R[0]),P.push(R[1])}if(se[0]J||E[1]>J){let R=le(g,x,l,p,C,$);Q.push(R[0]),P.push(R[1])}return q=b.apply([],Q),O=b.apply([],P),j=d.apply([],Q),J=d.apply([],P),[q,O,j,J]};var ct={};me(ct,{CBEZIER_MINMAX_EPSILON:()=>Lt,Cvalues:()=>St,Tvalues:()=>pt,bezierLength:()=>Mt,calculateBezier:()=>Tt,computeBezier:()=>Ct,deriveBezier:()=>At,getBezierLength:()=>pe,minmaxC:()=>ze,minmaxQ:()=>Le});var pt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],St=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],At=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,l=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,l=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+l*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+l*r[3].y,t:e}},Tt=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},Mt=t=>{let n=pt.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oCt(n[0],o))},Lt=1e-8,Le=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&l<1){let f=t*(1-l)*(1-l)*(1-l)+e*3*(1-l)*(1-l)*l+n*3*(1-l)*l*l+o*l*l*l;fm&&(m=f)}}return[i,m]};var ht={};me(ht,{getCubicBBox:()=>Ve,getCubicLength:()=>ge,getPointAtCubicLength:()=>ft,getPointAtCubicSegmentLength:()=>vt});var vt=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},ge=(t,e,n,o,r,s,a,i)=>pe([t,e,n,o,r,s,a,i]),ft=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",l={x:t,y:e};if(u){let p=pe([t,e,n,o,r,s,a,i]);m<=0||(m>=p?l={x:a,y:i}:l=vt([t,e,n,o,r,s,a,i],m/p))}return l},Ve=(t,e,n,o,r,s,a,i)=>{let m=ze([t,n,r,a]),u=ze([e,o,s,i]);return[m[0],u[0],m[1],u[1]]};var gt={};me(gt,{getPointAtQuadLength:()=>bt,getPointAtQuadSegmentLength:()=>Nt,getQuadBBox:()=>Qe,getQuadLength:()=>ye});var Nt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},ye=(t,e,n,o,r,s)=>pe([t,e,n,o,r,s]),bt=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=pe([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=Nt([t,e,n,o,r,s],a/u))}return m},Qe=(t,e,n,o,r,s)=>{let a=Le([t,n,r]),i=Le([e,o,s]);return[a[0],i[0],a[1],i[1]]};var yt={};me(yt,{polygonArea:()=>Zt,polygonLength:()=>Gt});var Zt=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+ie(t[o-1],n):0,0);var _t={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=_t;var Ut=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},ve=Ut;var Kt="SVGPathCommander Error",z=Kt;var Ft=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${z}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},qe=Ft;var Jt=t=>t>=48&&t<=57,B=Jt;var Wt="Invalid path value",H=Wt;var Xt=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${z}: ${H} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!B(u)&&u!==46){t.err=`${z}: ${H} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),De=Yt;var er=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Oe=tr;var rr=t=>B(t)||t===43||t===45||t===46,Ie=rr;var nr=t=>(t|32)===97,$e=nr;var or=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},je=or;var ar=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!Oe(s)){t.err=`${z}: ${H} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!je(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${z}: ${H} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){ve(t);return}for(;;){for(let m=a;m>0;m-=1){if($e(s)&&(m===3||m===4)?qe(t):Ee(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!Ie(n.charCodeAt(t.index)))break}ve(t)},de=ar;var W=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var sr=t=>{if(typeof t!="string")return t.slice(0);let e=new W(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,l=0,p=0;for(let f=0;f{let e=T(t);return M(e,_)},X=ur;var lr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=T(t);return M(e,xe)},Be=pr;var cr=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ce=cr;var wt=(t,e,n,o,r,s,a,i,m,u)=>{let l=t,p=e,f=n,h=o,c=i,b=m,d=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,g,x,C,k;if(u)[g,x,C,k]=u;else{y=ce(l,p,-S),l=y.x,p=y.y,y=ce(c,b,-S),c=y.x,b=y.y;let N=(l-c)/2,E=(p-b)/2,R=N*N/(f*f)+E*E/(h*h);R>1&&(R=Math.sqrt(R),f*=R,h*=R);let nt=f*f,ot=h*h,Pt=(s===a?-1:1)*Math.sqrt(Math.abs((nt*ot-nt*E*E-ot*N*N)/(nt*E*E+ot*N*N)));C=Pt*f*E/h+(l+c)/2,k=Pt*-h*N/f+(p+b)/2,g=Math.asin(((p-k)/h*10**9>>0)/10**9),x=Math.asin(((b-k)/h*10**9>>0)/10**9),g=lx&&(g-=Math.PI*2),!a&&x>g&&(x-=Math.PI*2)}let V=x-g;if(Math.abs(V)>d){let N=x,E=c,R=b;x=g+d*(a&&x>g?1:-1),c=C+f*Math.cos(x),b=k+h*Math.sin(x),A=wt(c,b,f,h,r,0,a,E,R,[x,N,C,k])}V=x-g;let w=Math.cos(g),v=Math.sin(g),$=Math.cos(x),ae=Math.sin(x),Q=Math.tan(V/4),P=4/3*f*Q,q=4/3*h*Q,j=[l,p],O=[l+P*v,p-q*w],J=[c+P*ae,b-q*$],be=[c,b];if(O[0]=2*j[0]-O[0],O[1]=2*j[1]-O[1],u)return[O[0],O[1],J[0],J[1],be[0],be[1]].concat(A);A=[O[0],O[1],J[0],J[1],be[0],be[1]].concat(A);let se=[];for(let N=0,E=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},He=fr;var hr=(t,e,n,o)=>{let r=D([t,e],[n,o],.3333333333333333),s=D([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Ne=hr;var br=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(Pe(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(He(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Ne(a,i,r,s)):n==="Z"?["C"].concat(Ne(a,i,m,u)):t},Ze=br;var gr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:l}=e,p=t.slice(1),f=p.map((h,c)=>h+(r?c%2?l:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=p.slice(0,-2).concat(p[5]+(r?u:0),p[6]+(r?l:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?l:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let h=s*2-i,c=a*2-m;return e.x1=h,e.y1=c,["C",h,c].concat(f)}else if(o==="T"){let h=s*2-(e.qx?e.qx:0),c=a*2-(e.qy?e.qy:0);return e.qx=h,e.qy=c,["Q",h,c].concat(f)}else if(o==="Q"){let[h,c]=f;return e.qx=h,e.qy=c,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},Y=gr;var yr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=yr;var dr=t=>{let e={...U},n=T(t);return M(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=Y(o,e),m=Ze(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let l=m.length;return e.x1=+m[l-2],e.y1=+m[l-1],e.x2=+m[l-4]||e.x1,e.y2=+m[l-3]||e.y1,m})},ee=dr;var xr={origin:[0,0,0],round:4},I=xr;var Pr=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},L=Pr;var Sr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{let e=T(t),n={...U};return M(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=Y(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},K=Ar;var Cr=(t,e)=>{let n=K(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),l=typeof e=="number",p={x:m,y:u},f=0,h=p,c=0;return!l||e{[s]=b,o=s==="M",r=o?r:[S,A].concat(b.slice(1));if(o?([,m,u]=b,p={x:m,y:u},f=0):s==="L"?(p=Te(r[0],r[1],r[2],r[3],e-c),f=ue(r[0],r[1],r[2],r[3])):s==="A"?(p=it(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-c),f=Me(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(p=ft(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-c),f=ge(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(p=bt(r[0],r[1],r[2],r[3],r[4],r[5],e-c),f=ye(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],p={x:m,y:u},f=ue(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),cc-fe?{x:a,y:i}:h)},te=Cr;var Tr=t=>{let e=T(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,l=0,p=0;return M(e,(f,h,c,b)=>{[m]=f;let d=m.toUpperCase(),A=d!==m?_(f,h,c,b):f.slice(0),y=d==="V"?["L",c,A[1]]:d==="H"?["L",A[1],b]:A;[m]=y,"TQ".includes(d)||(a=0,i=0);if(m==="M")[,u,l]=y;else if(m==="L")p+=ue(c,b,y[1],y[2]);else if(m==="A")p+=Me(c,b,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let g=n*2-r,x=o*2-s;p+=ge(c,b,g,x,y[1],y[2],y[3],y[4])}else m==="C"?p+=ge(c,b,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,p+=ye(c,b,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],p+=ye(c,b,y[1],y[2],y[3],y[4])):m==="Z"&&(p+=ue(c,b,u,l));[n,o]=m==="Z"?[u,l]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),p},F=Tr;var Mr=(t,e)=>{let n=T(t),o=n.slice(0),r=F(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=F(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=F(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:l})=>l<=e)},Ae=Mr;var Lr=(t,e)=>{let n=T(t),o=K(n),r=F(o),s=g=>{let x=g.x-e.x,C=g.y-e.y;return x*x+C*C},a=8,i,m={x:0,y:0},u=0,l=0,p=1/0;for(let g=0;g<=r;g+=a)i=te(o,g),u=s(i),u1e-6&&(c=l-a,f=te(o,c),d=s(f),b=l+a,h=te(o,b),S=s(h),c>=0&&dre(t,e).closest,Rt=vr;var Nr=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,wr=t=>{let e=0,n=0,o=0;return ee(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=Nr(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Ge=wr;var Rr=t=>Ge(ee(t))>=0,kt=Rr;var kr=t=>{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=T(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,l=-1/0,p=0,f=0,h=0,c=0,b=0,d=0,S=0,A=0,y=0,g=0;M(e,(k,V,w,v)=>{[n]=k;let $=n.toUpperCase(),Q=$!==n?_(k,V,w,v):k.slice(0),P=$==="V"?["L",w,Q[1]]:$==="H"?["L",Q[1],v]:Q;[n]=P,"TQ".includes($)||(y=0,g=0);if(n==="M")[,o,r]=P,p=o,f=r,h=o,c=r;else if(n==="L")[p,f,h,c]=Re(w,v,P[1],P[2]);else if(n==="A")[p,f,h,c]=ut(w,v,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(n==="S"){let q=b*2-S,j=d*2-A;[p,f,h,c]=Ve(w,v,q,j,P[1],P[2],P[3],P[4])}else n==="C"?[p,f,h,c]=Ve(w,v,P[1],P[2],P[3],P[4],P[5],P[6]):n==="T"?(y=b*2-y,g=d*2-g,[p,f,h,c]=Qe(w,v,y,g,P[1],P[2])):n==="Q"?(y=P[1],g=P[2],[p,f,h,c]=Qe(w,v,P[1],P[2],P[3],P[4])):n==="Z"&&([p,f,h,c]=Re(w,v,o,r));i=a(p,i),m=a(f,m),u=s(h,u),l=s(c,l),[b,d]=n==="Z"?[o,r]:P.slice(-2),[S,A]=n==="C"?[P[3],P[4]]:n==="S"?[P[1],P[2]]:[b,d]});let x=u-i,C=l-m;return{width:x,height:C,x:i,y:m,x2:u,y2:l,cx:i+x/2,cy:m+C/2,cz:Math.max(x,C)+Math.min(x,C)/2}},_e=kr;var zr=(t,e)=>Ae(t,e).segment,zt=zr;var Vr=(t,e)=>re(t,e).segment,Vt=Vr;var Qr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ne=Qr;var qr=t=>ne(t)&&t.every(([e])=>e===e.toUpperCase()),Ue=qr;var Er=t=>Ue(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Ke=Er;var Dr=t=>Ke(t)&&t.every(([e])=>"MC".includes(e)),Qt=Dr;var Or=(t,e)=>{let{distance:n}=re(t,e);return Math.abs(n)ne(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Et=Ir;var $r=t=>{if(typeof t!="string"||!t.length)return!1;let e=new W(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Je=Br;var Hr=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},Zr=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},_r=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},Ur=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},Kr=t=>{let e=Object.keys(oe),n=Je(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${z}: "${o}" is not SVGElement`);let r=n?o:t.type,s=oe[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=Gr(a):r==="ellipse"?i=_r(a):["polyline","polygon"].includes(r)?i=Zr(a):r==="rect"?i=Ur(a):r==="line"?i=Hr(a):["glyph","path"].includes(r)&&(i=T(n?t.getAttribute("d")||"":t.d||"")),ne(i)&&i.length?i:!1},We=Kr;var Fr=(t,e,n)=>{let o=n||document,r=Object.keys(oe),s=Je(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${z}: "${a}" is already SVGPathElement`);if(a&&r.every(c=>a!==c))throw TypeError(`${z}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=oe[m],l={type:m},p=I.round,f=We(t),h=f&&f.length?Se(f,p):"";return s?(u.forEach(c=>{l[c]=t.getAttribute(c)}),Object.values(t.attributes).forEach(({name:c,value:b})=>{u.includes(c)||i.setAttribute(c,b)})):(Object.assign(l,t),Object.keys(l).forEach(c=>{!u.includes(c)&&c!=="type"&&i.setAttribute(c.replace(/[A-Z]/g,b=>`-${b.toLowerCase()}`),l[c])})),Fe(h)?(i.setAttribute("d",h),e&&s&&(t.before(i,t),t.remove()),i):!1},Dt=Fr;import Jr from"@thednp/dommatrix";var Wr=t=>{let e=new Jr,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},Xe=Wr;var Xr=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:l,y2:p,x:f,y:h}=n,[c,b]=i.slice(-2),d=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(L(f,a)===L(c,a))return["V",b];if(L(h,a)===L(b,a))return["H",c]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(L(S,a)===L(m*2-l,a)&&L(A,a)===L(u*2-p,a)||L(m,a)===L(l*2-f,a)&&L(u,a)===L(p*2-h,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&L(S,a)===L(m*2-l,a)&&L(A,a)===L(u*2-p,a))return["T",i[2],i[3]]}return d},Ye=Xr;var Yr=(t,e)=>{let n=t.slice(1).map(o=>L(o,e));return[t[0]].concat(n)},he=Yr;var en=(t,e)=>{let n=X(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return M(n,(m,u,l,p)=>{r.x=l,r.y=p;let f=Y(m,r),h=m;if([a]=m,s[u]=a,u){i=s[u-1];let b=Ye(m,f,r,i),d=he(b,o),S=d.join(""),A=xe(b,u,l,p),y=he(A,o),g=y.join("");h=S.length{let n=tn.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},nn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=rn(t,[e[0],e[1],0,1]),u=a-o,l=i-r,p=m-s;return[u*(Math.abs(s)/Math.abs(p)||1)+o,l*(Math.abs(s)/Math.abs(p)||1)+r]},we=nn;var on=t=>{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},Ot=on;var an=t=>{let e=X(t),n=K(e),o=e.length,r=e[o-1][0]==="Z",s=M(e,(a,i)=>{let m=n[i],u=i&&e[i-1],l=u&&u[0],p=e[i+1],f=p&&p[0],[h]=a,[c,b]=n[i?i-1:o-1].slice(-2),d=a;switch(h){case"M":d=r?["Z"]:[h,c,b];break;case"A":d=[h,a[1],a[2],a[3],a[4],a[5]===1?0:1,c,b];break;case"C":p&&f==="S"?d=["S",a[1],a[2],c,b]:d=[h,a[3],a[4],a[1],a[2],c,b];break;case"S":l&&"CS".includes(l)&&(!p||f!=="S")?d=["C",m[3],m[4],m[1],m[2],c,b]:d=[h,m[1],m[2],c,b];break;case"Q":p&&f==="T"?d=["T",c,b]:d=[h,a[1],a[2],c,b];break;case"T":l&&"QT".includes(l)&&(!p||f!=="T")?d=["Q",m[1],m[2],c,b]:d=[h,c,b];break;case"Z":d=["M",c,b];break;case"H":d=[h,c];break;case"V":d=[h,b];break;default:d=[h].concat(a.slice(1,-2),c,b)}return d});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Ce=an;var sn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):M(t,o=>he(o,n))},It=sn;var mn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=D(o,r,n),m=D(r,s,n),u=D(s,a,n),l=D(i,m,n),p=D(m,u,n),f=D(l,p,n);return[["C",i[0],i[1],l[0],l[1],f[0],f[1]],["C",p[0],p[1],u[0],u[1],a[0],a[1]]]},$t=mn;var un=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[l]=u,p=l.toUpperCase(),f=l.toLowerCase(),h=l===f,c=u.slice(1);p==="M"?(o+=1,[r,s]=c,r+=h?m.x:0,s+=h?m.y:0,a=r,i=s,n=[h?[p,a,i]:u]):(p==="Z"?(r=a,s=i):p==="H"?([,r]=u,r+=h?m.x:0):p==="V"?([,s]=u,s+=h?m.y:0):([r,s]=u.slice(-2),r+=h?m.x:0,s+=h?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},tt=un;var ln=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=T(t),l=e&&Object.keys(e);if(!e||l&&!l.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let p=e.origin,f=Xe(e);return f.isIdentity?u.slice(0):M(u,(h,c,b,d)=>{[m]=h;let S=m.toUpperCase(),y=S!==m?_(h,c,b,d):h.slice(0),g=S==="A"?["C"].concat(Pe(b,d,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",b,y[1]]:S==="H"?["L",y[1],d]:y;m=g[0];let x=m==="C"&&g.length>7,C=x?g.slice(0,7):g.slice(0);if(x&&(u.splice(c+1,0,["C"].concat(g.slice(7))),g=C),m==="L"){[r,s]=we(f,[g[1],g[2]],p);n!==r&&o!==s?g=["L",r,s]:o===s?g=["H",r]:n===r&&(g=["V",s])}else for(a=1,i=g.length;a"u";if(r||!e.length)throw TypeError(`${z}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=T(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,l,p]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(l)?0:l,Number.isNaN(p)?0:p]}return this.round=i,this.origin=m,this}get bbox(){return _e(this.segments)}get length(){return F(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return te(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=X(e),this}toRelative(){let{segments:e}=this;return this.segments=Be(e),this}toCurve(){let{segments:e}=this;return this.segments=ee(e),this}reverse(e){let{segments:n}=this,o=tt(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Ce(i):i.slice(0):Ce(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Ce(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=K(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=et(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,l]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,l||s]}else a.origin=[o,r,s];return this.segments=rt(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return Se(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}},Mi=Object.assign(xt,dt);export{Mi as default}; +var $t=Object.defineProperty;var he=(t,e)=>{for(var n in e)$t(t,n,{get:e[n],enumerable:!0})};import cn from"@thednp/dommatrix";var at={};he(at,{angleBetween:()=>tt,arcLength:()=>rt,arcPoint:()=>se,getArcBBox:()=>ot,getArcLength:()=>Ce,getArcProps:()=>Re,getPointAtArcLength:()=>nt});var et={};he(et,{getLineBBox:()=>ze,getLineLength:()=>ae,getPointAtLineLength:()=>Ae});var jt=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=jt;var Bt=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),oe=Bt;var ae=(t,e,n,o)=>oe([t,e],[n,o]),Ae=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=oe([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},ze=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]};var rt=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},se=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),c=n*i(s),l=o*a(s);return[t+m*c-u*l,e+u*c+m*l]},tt=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},Re=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:c,cos:l,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,b={x:l(S)*A+c(S)*y,y:-c(S)*A+l(S)*y},d=b.x**2/p**2+b.y**2/h**2;d>1&&(p*=f(d),h*=f(d));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,R=p**2*b.y**2+h**2*b.x**2,k=C/R;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},$={x:l(S)*v.x-c(S)*v.y+(t+i)/2,y:c(S)*v.x+l(S)*v.y+(e+m)/2},re={x:(b.x-v.x)/p,y:(b.y-v.y)/h},Q=tt({x:1,y:0},re),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},q=tt(re,x);!a&&q>0?q-=2*g:a&&q<0&&(q+=2*g),q%=2*g;let j=Q+q;return{center:$,startAngle:Q,endAngle:j,rx:p,ry:h}},Ce=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:c,startAngle:l,endAngle:f}=Re(t,e,n,o,r,s,a,i,m);return rt(u,c,f-l)},nt=(t,e,n,o,r,s,a,i,m,u)=>{let c={x:t,y:e},{center:l,rx:f,ry:g,startAngle:p,endAngle:h}=Re(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let P=rt(f,g,h-p);if(u<=0)c={x:t,y:e};else if(u>=P)c={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return Ae(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,b=h-p,C=(r%360+360)%360*(S/180),R=p+b*(u/P),k=f*A(R),w=g*y(R);c={x:A(C)*k-y(C)*w+l.x,y:y(C)*k+A(C)*w+l.y}}}return c},ot=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:c,ry:l,startAngle:f,endAngle:g}=Re(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:P,tan:S,atan2:A,PI:y}=Math,{x:b,y:d}=u,C=r*y/180,R=S(C),k=A(-l*R,c),w=k,v=k+y,$=A(l,c*R),re=$+y,Q=[i],x=[m],q=h(t,i),j=P(t,i),O=h(e,m),F=P(e,m),ge=g-p*1e-5,ne=se(b,d,c,l,C,ge),N=g-p*.99999,D=se(b,d,c,l,C,N);if(ne[0]>j||D[0]>j){let z=se(b,d,c,l,C,w);Q.push(z[0]),x.push(z[1])}if(ne[0]F||D[1]>F){let z=se(b,d,c,l,C,$);Q.push(z[0]),x.push(z[1])}return q=h.apply([],Q),O=h.apply([],x),j=P.apply([],Q),F=P.apply([],x),[q,O,j,F]};var mt={};he(mt,{CBEZIER_MINMAX_EPSILON:()=>Mt,Cvalues:()=>xt,Tvalues:()=>st,bezierLength:()=>Tt,calculateBezier:()=>Ct,computeBezier:()=>At,deriveBezier:()=>St,getBezierLength:()=>me,minmaxC:()=>Ve,minmaxQ:()=>Te});var st=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],xt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],St=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,c=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,c=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+c*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+c*r[3].y,t:e}},Ct=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},Tt=t=>{let n=st.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oAt(n[0],o))},Mt=1e-8,Te=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&c<1){let f=t*(1-c)*(1-c)*(1-c)+e*3*(1-c)*(1-c)*c+n*3*(1-c)*c*c+o*c*c*c;fm&&(m=f)}}return[i,m]};var ut={};he(ut,{getCubicBBox:()=>ke,getCubicLength:()=>be,getPointAtCubicLength:()=>it,getPointAtCubicSegmentLength:()=>Lt});var Lt=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},be=(t,e,n,o,r,s,a,i)=>me([t,e,n,o,r,s,a,i]),it=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",c={x:t,y:e};if(u){let l=me([t,e,n,o,r,s,a,i]);m<=0||(m>=l?c={x:a,y:i}:c=Lt([t,e,n,o,r,s,a,i],m/l))}return c},ke=(t,e,n,o,r,s,a,i)=>{let m=Ve([t,n,r,a]),u=Ve([e,o,s,i]);return[m[0],u[0],m[1],u[1]]};var lt={};he(lt,{getPointAtQuadLength:()=>ct,getPointAtQuadSegmentLength:()=>vt,getQuadBBox:()=>Qe,getQuadLength:()=>ye});var vt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},ye=(t,e,n,o,r,s)=>me([t,e,n,o,r,s]),ct=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=me([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=vt([t,e,n,o,r,s],a/u))}return m},Qe=(t,e,n,o,r,s)=>{let a=Te([t,n,r]),i=Te([e,o,s]);return[a[0],i[0],a[1],i[1]]};var pt={};he(pt,{polygonArea:()=>Ht,polygonLength:()=>Zt});var Ht=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+oe(t[o-1],n):0,0);var Gt=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ie=Gt;var _t=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=_t;var Ut={origin:[0,0,0],round:4},I=Ut;var Ft={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=Ft;var Kt=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},Me=Kt;var Jt="SVGPathCommander Error",V=Jt;var Wt=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${V}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},qe=Wt;var Xt=t=>t>=48&&t<=57,B=Xt;var Yt="Invalid path value",H=Yt;var er=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${V}: ${H} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!B(u)&&u!==46){t.err=`${V}: ${H} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Ee=tr;var rr=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Oe=nr;var or=t=>B(t)||t===43||t===45||t===46,Ie=or;var ar=t=>(t|32)===97,$e=ar;var sr=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},je=sr;var mr=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!Oe(s)){t.err=`${V}: ${H} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!je(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${V}: ${H} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){Me(t);return}for(;;){for(let m=a;m>0;m-=1){if($e(s)&&(m===3||m===4)?qe(t):De(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!Ie(n.charCodeAt(t.index)))break}Me(t)},Pe=mr;var K=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var ir=t=>{if(typeof t!="string")return t.slice(0);let e=new K(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,c=0,l=0;for(let f=0;f{let e=L(t);return T(e,_)},ue=lr;var pr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,de)},ft=fr;var Nt=(t,e,n,o,r,s,a,i,m,u)=>{let c=t,l=e,f=n,g=o,p=i,h=m,P=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,b,d,C,R;if(u)[b,d,C,R]=u;else{y=ie(c,l,-S),c=y.x,l=y.y,y=ie(p,h,-S),p=y.x,h=y.y;let N=(c-p)/2,D=(l-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let Xe=f*f,Ye=g*g,dt=(s===a?-1:1)*Math.sqrt(Math.abs((Xe*Ye-Xe*D*D-Ye*N*N)/(Xe*D*D+Ye*N*N)));C=dt*f*D/g+(c+p)/2,R=dt*-g*N/f+(l+h)/2,b=Math.asin(((l-R)/g*10**9>>0)/10**9),d=Math.asin(((h-R)/g*10**9>>0)/10**9),b=cd&&(b-=Math.PI*2),!a&&d>b&&(d-=Math.PI*2)}let k=d-b;if(Math.abs(k)>P){let N=d,D=p,z=h;d=b+P*(a&&d>b?1:-1),p=C+f*Math.cos(d),h=R+g*Math.sin(d),A=Nt(p,h,f,g,r,0,a,D,z,[d,N,C,R])}k=d-b;let w=Math.cos(b),v=Math.sin(b),$=Math.cos(d),re=Math.sin(d),Q=Math.tan(k/4),x=4/3*f*Q,q=4/3*g*Q,j=[c,l],O=[c+x*v,l-q*w],F=[p+x*re,h-q*$],ge=[p,h];if(O[0]=2*j[0]-O[0],O[1]=2*j[1]-O[1],u)return[O[0],O[1],F[0],F[1],ge[0],ge[1]].concat(A);A=[O[0],O[1],F[0],F[1],ge[0],ge[1]].concat(A);let ne=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},Be=gr;var hr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Le=hr;var br=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(xe(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(Be(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Le(a,i,r,s)):n==="Z"?["C"].concat(Le(a,i,m,u)):t},He=br;var yr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:c}=e,l=t.slice(1),f=l.map((g,p)=>g+(r?p%2?c:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=l.slice(0,-2).concat(l[5]+(r?u:0),l[6]+(r?c:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?c:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},X=yr;var Pr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=Pr;var dr=t=>{let e={...U},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=X(o,e),m=He(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let c=m.length;return e.x1=+m[c-2],e.y1=+m[c-1],e.x2=+m[c-4]||e.x1,e.y2=+m[c-3]||e.y1,m})},ce=dr;var xr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,c=-1/0,l=0,f=0,g=0,p=0,h=0,P=0,S=0,A=0,y=0,b=0;T(e,(R,k,w,v)=>{[n]=R;let $=n.toUpperCase(),Q=$!==n?_(R,k,w,v):R.slice(0),x=$==="V"?["L",w,Q[1]]:$==="H"?["L",Q[1],v]:Q;[n]=x,"TQ".includes($)||(y=0,b=0);if(n==="M")[,o,r]=x,l=o,f=r,g=o,p=r;else if(n==="L")[l,f,g,p]=ze(w,v,x[1],x[2]);else if(n==="A")[l,f,g,p]=ot(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let q=h*2-S,j=P*2-A;[l,f,g,p]=ke(w,v,q,j,x[1],x[2],x[3],x[4])}else n==="C"?[l,f,g,p]=ke(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(y=h*2-y,b=P*2-b,[l,f,g,p]=Qe(w,v,y,b,x[1],x[2])):n==="Q"?(y=x[1],b=x[2],[l,f,g,p]=Qe(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([l,f,g,p]=ze(w,v,o,r));i=a(l,i),m=a(f,m),u=s(g,u),c=s(p,c),[h,P]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,P]});let d=u-i,C=c-m;return{width:d,height:C,x:i,y:m,x2:u,y2:c,cx:i+d/2,cy:m+C/2,cz:Math.max(d,C)+Math.min(d,C)/2}},gt=Sr;var Ar=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,c=0,l=0;return T(e,(f,g,p,h)=>{[m]=f;let P=m.toUpperCase(),A=P!==m?_(f,g,p,h):f.slice(0),y=P==="V"?["L",p,A[1]]:P==="H"?["L",A[1],h]:A;[m]=y,"TQ".includes(P)||(a=0,i=0);if(m==="M")[,u,c]=y;else if(m==="L")l+=ae(p,h,y[1],y[2]);else if(m==="A")l+=Ce(p,h,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let b=n*2-r,d=o*2-s;l+=be(p,h,b,d,y[1],y[2],y[3],y[4])}else m==="C"?l+=be(p,h,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,l+=ye(p,h,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],l+=ye(p,h,y[1],y[2],y[3],y[4])):m==="Z"&&(l+=ae(p,h,u,c));[n,o]=m==="Z"?[u,c]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),l},J=Ar;var le=1e-5;var Cr=t=>{let e=L(t),n={...U};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=X(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},W=Cr;var Tr=(t,e)=>{let n=W(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),c=typeof e=="number",l={x:m,y:u},f=0,g=l,p=0;return!c||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,l={x:m,y:u},f=0):s==="L"?(l=Ae(r[0],r[1],r[2],r[3],e-p),f=ae(r[0],r[1],r[2],r[3])):s==="A"?(l=nt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=Ce(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(l=it(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=be(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(l=ct(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=ye(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],l={x:m,y:u},f=ae(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-le?{x:a,y:i}:g)},pe=Tr;var Mr=(t,e)=>{let n=L(t),o=n.slice(0),r=J(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=J(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=J(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:c})=>c<=e)},Se=Mr;var Lr=(t,e)=>{let n=L(t),o=W(n),r=J(o),s=b=>{let d=b.x-e.x,C=b.y-e.y;return d*d+C*C},a=8,i,m={x:0,y:0},u=0,c=0,l=1/0;for(let b=0;b<=r;b+=a)i=pe(o,b),u=s(i),u1e-6&&(p=c-a,f=pe(o,p),P=s(f),h=c+a,g=pe(o,h),S=s(g),p>=0&&PY(t,e).closest,wt=vr;var Nr=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,wr=t=>{let e=0,n=0,o=0;return ce(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=Nr(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Ze=wr;var zr=t=>Ze(ce(t))>=0,zt=zr;var Rr=(t,e)=>Se(t,e).segment,Rt=Rr;var Vr=(t,e)=>Y(t,e).segment,Vt=Vr;var kr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ee=kr;var Qr=t=>ee(t)&&t.every(([e])=>e===e.toUpperCase()),Ge=Qr;var qr=t=>Ge(t)&&t.every(([e])=>"ACLMQZ".includes(e)),_e=qr;var Dr=t=>_e(t)&&t.every(([e])=>"MC".includes(e)),kt=Dr;var Er=(t,e)=>{let{distance:n}=Y(t,e);return Math.abs(n)ee(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),qt=Or;var Ir=t=>{if(typeof t!="string"||!t.length)return!1;let e=new K(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Fe=jr;var Br=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},Hr=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},Gr=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},_r=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},Ur=t=>{let e=Object.keys(te),n=Fe(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${V}: "${o}" is not SVGElement`);let r=n?o:t.type,s=te[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=Zr(a):r==="ellipse"?i=Gr(a):["polyline","polygon"].includes(r)?i=Hr(a):r==="rect"?i=_r(a):r==="line"?i=Br(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),ee(i)&&i.length?i:!1},Ke=Ur;var Fr=(t,e,n)=>{let o=n||document,r=Object.keys(te),s=Fe(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${V}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${V}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=te[m],c={type:m},l=I.round,f=Ke(t),g=f&&f.length?ve(f,l):"";return s?(u.forEach(p=>{c[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(c,t),Object.keys(c).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),c[p])})),Ue(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},Dt=Fr;var Kr=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:c,y2:l,x:f,y:g}=n,[p,h]=i.slice(-2),P=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a)||M(m,a)===M(c*2-f,a)&&M(u,a)===M(l*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a))return["T",i[2],i[3]]}return P},Je=Kr;var Jr=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},fe=Jr;var Wr=(t,e)=>{let n=ue(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return T(n,(m,u,c,l)=>{r.x=c,r.y=l;let f=X(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=Je(m,f,r,i),P=fe(h,o),S=P.join(""),A=de(h,u,c,l),y=fe(A,o),b=y.join("");g=S.length{let e=ue(t),n=W(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],c=u&&u[0],l=e[i+1],f=l&&l[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),P=a;switch(g){case"M":P=r?["Z"]:[g,p,h];break;case"A":P=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":l&&f==="S"?P=["S",a[1],a[2],p,h]:P=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":c&&"CS".includes(c)&&(!l||f!=="S")?P=["C",m[3],m[4],m[1],m[2],p,h]:P=[g,m[1],m[2],p,h];break;case"Q":l&&f==="T"?P=["T",p,h]:P=[g,a[1],a[2],p,h];break;case"T":c&&"QT".includes(c)&&(!l||f!=="T")?P=["Q",m[1],m[2],p,h]:P=[g,p,h];break;case"Z":P=["M",p,h];break;case"H":P=[g,p];break;case"V":P=[g,h];break;default:P=[g].concat(a.slice(1,-2),p,h)}return P});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Ne=Xr;var Yr=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[c]=u,l=c.toUpperCase(),f=c.toLowerCase(),g=c===f,p=u.slice(1);l==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[l,a,i]:u]):(l==="Z"?(r=a,s=i):l==="H"?([,r]=u,r+=g?m.x:0):l==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},bt=Yr;import en from"@thednp/dommatrix";var tn=t=>{let e=new en,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},We=tn;import rn from"@thednp/dommatrix";var nn=(t,e)=>{let n=rn.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},on=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=nn(t,[e[0],e[1],0,1]),u=a-o,c=i-r,l=m-s;return[u*(Math.abs(s)/Math.abs(l)||1)+o,c*(Math.abs(s)/Math.abs(l)||1)+r]},we=on;var an=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),c=e&&Object.keys(e);if(!e||c&&!c.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let l=e.origin,f=We(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,P)=>{[m]=g;let S=m.toUpperCase(),y=S!==m?_(g,p,h,P):g.slice(0),b=S==="A"?["C"].concat(xe(h,P,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",h,y[1]]:S==="H"?["L",y[1],P]:y;m=b[0];let d=m==="C"&&b.length>7,C=d?b.slice(0,7):b.slice(0);if(d&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=we(f,[b[1],b[2]],l);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},Et=sn;var mn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>fe(o,n))},Ot=mn;var un=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),c=E(i,m,n),l=E(m,u,n),f=E(c,l,n);return[["C",i[0],i[1],c[0],c[1],f[0],f[1]],["C",l[0],l[1],u[0],u[1],a[0],a[1]]]},It=un;var Pt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${V}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,c,l]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(c)?0:c,Number.isNaN(l)?0:l]}return this.round=i,this.origin=m,this}get bbox(){return gt(this.segments)}get length(){return J(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return pe(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=ue(e),this}toRelative(){let{segments:e}=this;return this.segments=ft(e),this}toCurve(){let{segments:e}=this;return this.segments=ce(e),this}reverse(e){let{segments:n}=this,o=bt(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Ne(i):i.slice(0):Ne(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Ne(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=W(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=ht(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,c]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,c||s]}else a.origin=[o,r,s];return this.segments=yt(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return ve(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return cn}static get arcTools(){return at}static get bezierTools(){return mt}static get cubicTools(){return ut}static get lineTools(){return et}static get polygonTools(){return pt}static get quadTools(){return lt}static get pathToAbsolute(){return ue}static get pathToRelative(){return ft}static get pathToCurve(){return ce}static get pathToString(){return ve}static get distanceSquareRoot(){return oe}static get midPoint(){return E}static get rotateVector(){return ie}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return Me}static get invalidPathValue(){return H}static get isArcCommand(){return $e}static get isDigit(){return B}static get isDigitStart(){return Ie}static get isMoveCommand(){return je}static get isPathCommand(){return Oe}static get isSpace(){return Ee}static get paramsCount(){return Z}static get paramsParser(){return U}static get pathParser(){return K}static get scanFlag(){return qe}static get scanParam(){return De}static get scanSegment(){return Pe}static get skipSpaces(){return G}static get distanceEpsilon(){return le}static get getClosestPoint(){return wt}static get getDrawDirection(){return zt}static get getPathArea(){return Ze}static get getPathBBox(){return gt}static get getPointAtLength(){return pe}static get getPropertiesAtLength(){return Se}static get getPropertiesAtPoint(){return Y}static get getSegmentAtLength(){return Rt}static get getSegmentOfPoint(){return Vt}static get getTotalLength(){return J}static get isAbsoluteArray(){return Ge}static get isCurveArray(){return kt}static get isNormalizedArray(){return _e}static get isPathArray(){return ee}static get isPointInStroke(){return Qt}static get isRelativeArray(){return qt}static get isValidPath(){return Ue}static get shapeParams(){return te}static get shapeToPath(){return Dt}static get shapeToPathArray(){return Ke}static get absolutizeSegment(){return _}static get arcToCubic(){return xe}static get getSVGMatrix(){return We}static get iterate(){return T}static get lineToCubic(){return Le}static get normalizePath(){return W}static get normalizeSegment(){return X}static get optimizePath(){return ht}static get projection2d(){return we}static get quadToCubic(){return Be}static get relativizeSegment(){return de}static get reverseCurve(){return Et}static get reversePath(){return Ne}static get roundPath(){return Ot}static get roundSegment(){return fe}static get segmentToCubic(){return He}static get shortenSegment(){return Je}static get splitCubic(){return It}static get splitPath(){return bt}static get transformPath(){return yt}},li=Pt;export{cn as CSSMatrix,_ as absolutizeSegment,xe as arcToCubic,at as arcTools,mt as bezierTools,ut as cubicTools,li as default,le as distanceEpsilon,oe as distanceSquareRoot,Me as finalizeSegment,wt as getClosestPoint,zt as getDrawDirection,Ze as getPathArea,gt as getPathBBox,pe as getPointAtLength,Se as getPropertiesAtLength,Y as getPropertiesAtPoint,We as getSVGMatrix,Rt as getSegmentAtLength,Vt as getSegmentOfPoint,J as getTotalLength,H as invalidPathValue,Ge as isAbsoluteArray,$e as isArcCommand,kt as isCurveArray,B as isDigit,Ie as isDigitStart,je as isMoveCommand,_e as isNormalizedArray,ee as isPathArray,Oe as isPathCommand,Qt as isPointInStroke,qt as isRelativeArray,Ee as isSpace,Ue as isValidPath,T as iterate,Le as lineToCubic,et as lineTools,E as midPoint,W as normalizePath,X as normalizeSegment,ht as optimizePath,Z as paramsCount,U as paramsParser,L as parsePathString,K as pathParser,ue as pathToAbsolute,ce as pathToCurve,ft as pathToRelative,ve as pathToString,pt as polygonTools,we as projection2d,Be as quadToCubic,lt as quadTools,de as relativizeSegment,Et as reverseCurve,Ne as reversePath,ie as rotateVector,Ot as roundPath,fe as roundSegment,M as roundTo,qe as scanFlag,De as scanParam,Pe as scanSegment,He as segmentToCubic,te as shapeParams,Dt as shapeToPath,Ke as shapeToPathArray,Je as shortenSegment,G as skipSpaces,It as splitCubic,bt as splitPath,yt as transformPath}; //# sourceMappingURL=svg-path-commander.mjs.map \ No newline at end of file diff --git a/dist/svg-path-commander.mjs.map b/dist/svg-path-commander.mjs.map index ac2b8e3..7ead948 100644 --- a/dist/svg-path-commander.mjs.map +++ b/dist/svg-path-commander.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/util.ts","../src/math/arcTools.ts","../src/math/lineTools.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/math/rotateVector.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/options/options.ts","../src/math/roundTo.ts","../src/convert/pathToString.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getTotalLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getPathBBox.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/getSVGMatrix.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/projection2d.ts","../src/process/reverseCurve.ts","../src/process/reversePath.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/process/splitPath.ts","../src/process/transformPath.ts","../src/index.ts"],"sourcesContent":["export { default as CSSMatrix } from \"@thednp/dommatrix\";\n// export type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\n// export type { Options, TransformEntries, TransformObject } from \"./interface\";\n// export * from \"./types\";\n// export * from \"./interface\";\n\nimport * as arcTools from \"./math/arcTools\";\nimport * as bezierTools from \"./math/bezier\";\nimport * as cubicTools from \"./math/cubicTools\";\nimport * as lineTools from \"./math/lineTools\";\nimport * as quadTools from \"./math/quadTools\";\nimport * as polygonTools from \"./math/polygonTools\";\nexport {\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n};\n\n// export * from \"./math/arcTools\";\n// export * from \"./math/bezier\";\n// export * from \"./math/cubicTools\";\n// export * from \"./math/lineTools\";\n// export * from \"./math/quadTools\";\n// export * from \"./math/polygonTools\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\n\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\n\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\n\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","\"use strict\";\nimport * as util from \"./util\";\n// import CSSMatrix from \"@thednp/dommatrix\";\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n// import * as arcTools from \"./math/arcTools\";\n// import * as bezierTools from \"./math/bezier\";\n// import * as cubicTools from \"./math/cubicTools\";\n// import * as lineTools from \"./math/lineTools\";\n// import * as quadTools from \"./math/quadTools\";\n// import * as polygonTools from \"./math/polygonTools\";\n\n// import distanceSquareRoot from \"./math/distanceSquareRoot\";\n// import midPoint from \"./math/midPoint\";\n// import rotateVector from \"./math/rotateVector\";\n// import roundTo from \"./math/roundTo\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\n// import finalizeSegment from \"./parser/finalizeSegment\";\n// import invalidPathValue from \"./parser/invalidPathValue\";\n// import isArcCommand from \"./parser/isArcCommand\";\n// import isDigit from \"./parser/isDigit\";\n// import isDigitStart from \"./parser/isDigitStart\";\n// import isMoveCommand from \"./parser/isMoveCommand\";\n// import isPathCommand from \"./parser/isPathCommand\";\n// import isSpace from \"./parser/isSpace\";\n// import paramsCount from \"./parser/paramsCount\";\n// import paramsParser from \"./parser/paramsParser\";\n// import pathParser from \"./parser/pathParser\";\n// import scanFlag from \"./parser/scanFlag\";\n// import scanParam from \"./parser/scanParam\";\n// import scanSegment from \"./parser/scanSegment\";\n// import skipSpaces from \"./parser/skipSpaces\";\n\n// import distanceEpsilon from \"./util/distanceEpsilon\";\n// import getClosestPoint from \"./util/getClosestPoint\";\n// import getDrawDirection from \"./util/getDrawDirection\";\n// import getPathArea from \"./util/getPathArea\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getPointAtLength from \"./util/getPointAtLength\";\n// import getPropertiesAtLength from \"./util/getPropertiesAtLength\";\n// import getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\n// import getSegmentAtLength from \"./util/getSegmentAtLength\";\n// import getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport getTotalLength from \"./util/getTotalLength\";\n\n// import isAbsoluteArray from \"./util/isAbsoluteArray\";\n// import isCurveArray from \"./util/isCurveArray\";\n// import isNormalizedArray from \"./util/isNormalizedArray\";\n// import isPathArray from \"./util/isPathArray\";\n// import isPointInStroke from \"./util/isPointInStroke\";\n// import isRelativeArray from \"./util/isRelativeArray\";\n// import isValidPath from \"./util/isValidPath\";\n// import shapeParams from \"./util/shapeParams\";\n// import shapeToPath from \"./util/shapeToPath\";\n// import shapeToPathArray from \"./util/shapeToPathArray\";\n\n// import absolutizeSegment from \"./process/absolutizeSegment\";\n// import arcToCubic from \"./process/arcToCubic\";\n// import getSVGMatrix from \"./process/getSVGMatrix\";\n// import iterate from \"./process/iterate\";\n// import lineToCubic from \"./process/lineToCubic\";\nimport normalizePath from \"./process/normalizePath\";\n// import normalizeSegment from \"./process/normalizeSegment\";\nimport optimizePath from \"./process/optimizePath\";\n// import projection2d from \"./process/projection2d\";\n// import quadToCubic from \"./process/quadToCubic\";\n// import relativizeSegment from \"./process/relativizeSegment\";\n// import reverseCurve from \"./process/reverseCurve\";\nimport reversePath from \"./process/reversePath\";\n// import roundPath from \"./process/roundPath\";\n// import roundSegment from \"./process/roundSegment\";\n// import segmentToCubic from \"./process/segmentToCubic\";\n// import shortenSegment from \"./process/shortenSegment\";\n// import splitCubic from \"./process/splitCubic\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\n\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`,\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" || k === \"translate\" || k === \"origin\" ||\n k === \"scale\") && Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n}\n\n// export {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// // SVGPathCommander as default,\n// transformPath,\n// };\n\n// const index = {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// transformPath,\n// };\n\n// export { absolutizeSegment }\n// export { arcToCubic }\n// export { arcTools }\n// export { bezierTools }\n// export { CSSMatrix }\n// export { cubicTools }\n// export { distanceEpsilon }\n// export { distanceSquareRoot }\n// export { finalizeSegment }\n// export { getClosestPoint }\n// export { getDrawDirection }\n// export { getPathArea }\n// export { getPathBBox }\n// export { getPointAtLength }\n// export { getPropertiesAtLength }\n// export { getPropertiesAtPoint }\n// export { getSegmentAtLength }\n// export { getSegmentOfPoint }\n// export { getSVGMatrix }\n// export { getTotalLength }\n// export { invalidPathValue }\n// export { isAbsoluteArray }\n// export { isArcCommand }\n// export { isCurveArray }\n// export { isDigit }\n// export { isDigitStart }\n// export { isMoveCommand }\n// export { isNormalizedArray }\n// export { isPathArray }\n// export { isPathCommand }\n// export { isPointInStroke }\n// export { isRelativeArray }\n// export { isSpace }\n// export { isValidPath }\n// export { iterate }\n// export { lineToCubic }\n// export { lineTools }\n// export { midPoint }\n// export { normalizePath }\n// export { normalizeSegment }\n// export { optimizePath }\n// export { paramsCount }\n// export { paramsParser }\n// export { parsePathString }\n// export { pathParser }\n// export { pathToAbsolute }\n// export { pathToCurve }\n// export { pathToRelative }\n// export { pathToString }\n// export { polygonTools }\n// export { projection2d }\n// export { quadToCubic }\n// export { quadTools }\n// export { relativizeSegment }\n// export { reverseCurve }\n// export { reversePath }\n// export { rotateVector }\n// export { roundPath }\n// export { roundSegment }\n// export { roundTo }\n// export { scanFlag }\n// export { scanParam }\n// export { scanSegment }\n// export { segmentToCubic }\n// export { shapeParams }\n// export { shapeToPath }\n// export { shapeToPathArray }\n// export { shortenSegment }\n// export { skipSpaces }\n// export { splitCubic }\n// export { splitPath }\n// export { transformPath }\n// export { SVGPathCommander as default }\n// export default SVGPathCommander;\nconst defaultExport = Object.assign(SVGPathCommander, util);\n\nexport { defaultExport as default };\n// export default Object.assign(SVGPathCommander, index);\n"],"mappings":"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","names":["util_exports","__export","default","absolutizeSegment_default","arcToCubic_default","arcTools_exports","bezier_exports","cubicTools_exports","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools_exports","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools_exports","projection2d_default","quadToCubic_default","quadTools_exports","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","arcTools_exports","__export","angleBetween","arcLength","arcPoint","getArcBBox","getArcLength","getArcProps","getPointAtArcLength","lineTools_exports","__export","getLineBBox","getLineLength","getPointAtLineLength","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","bezier_exports","__export","CBEZIER_MINMAX_EPSILON","Cvalues","Tvalues","bezierLength","calculateBezier","computeBezier","deriveBezier","getBezierLength","minmaxC","minmaxQ","points","dpoints","p","d","c","list","j","t","order","mt","mt2","t2","a","b","derivativeFn","l","len","sum","i","curve","idx","step","v1","cp","v2","min","max","E","cp1","cp2","K","T","S","L","R","Q","cubicTools_exports","__export","getCubicBBox","getCubicLength","getPointAtCubicLength","getPointAtCubicSegmentLength","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","quadTools_exports","__export","getPointAtQuadLength","getPointAtQuadSegmentLength","getQuadBBox","getQuadLength","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","polygonTools_exports","__export","polygonArea","polygonLength","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","defaultOptions","options_default","roundTo","n","round","pow","roundTo_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","p","name","value","k","m","isValidPath_default","shapeToPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","defaultExport","util_exports"]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/math/arcTools.ts","../src/math/lineTools.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport * as arcTools from \"./math/arcTools\";\nimport * as bezierTools from \"./math/bezier\";\nimport * as cubicTools from \"./math/cubicTools\";\nimport * as lineTools from \"./math/lineTools\";\nimport * as quadTools from \"./math/quadTools\";\nimport * as polygonTools from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["CSSMatrix","arcTools_exports","__export","angleBetween","arcLength","arcPoint","getArcBBox","getArcLength","getArcProps","getPointAtArcLength","lineTools_exports","__export","getLineBBox","getLineLength","getPointAtLineLength","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","bezier_exports","__export","CBEZIER_MINMAX_EPSILON","Cvalues","Tvalues","bezierLength","calculateBezier","computeBezier","deriveBezier","getBezierLength","minmaxC","minmaxQ","points","dpoints","p","d","c","list","j","t","order","mt","mt2","t2","a","b","derivativeFn","l","len","sum","i","curve","idx","step","v1","cp","v2","min","max","E","cp1","cp2","K","T","S","L","R","Q","cubicTools_exports","__export","getCubicBBox","getCubicLength","getPointAtCubicLength","getPointAtCubicSegmentLength","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","quadTools_exports","__export","getPointAtQuadLength","getPointAtQuadSegmentLength","getQuadBBox","getQuadLength","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","polygonTools_exports","__export","polygonArea","polygonLength","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","l","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools_exports","bezier_exports","cubicTools_exports","lineTools_exports","polygonTools_exports","quadTools_exports","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","src_default"]} \ No newline at end of file diff --git a/dist/util/util.cjs b/dist/util/util.cjs deleted file mode 100644 index 6977362..0000000 --- a/dist/util/util.cjs +++ /dev/null @@ -1,3 +0,0 @@ -'use strict';var jr=require('@thednp/dommatrix');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var jr__default=/*#__PURE__*/_interopDefault(jr);var At=Object.defineProperty;var ie=(e,t)=>{for(var n in t)At(e,n,{get:t[n],enumerable:true});};var it={};ie(it,{angleBetween:()=>De,arcLength:()=>Ee,arcPoint:()=>Y,getArcBBox:()=>$e,getArcLength:()=>ge,getArcProps:()=>Le,getPointAtArcLength:()=>Ie});var mt={};ie(mt,{getLineBBox:()=>Me,getLineLength:()=>X,getPointAtLineLength:()=>he});var Ct=(e,t,n)=>{let[o,r]=e,[a,s]=t;return [o+(a-o)*n,r+(s-r)*n]},I=Ct;var Tt=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),ue=Tt;var X=(e,t,n,o)=>ue([e,t],[n,o]),he=(e,t,n,o,r)=>{let a={x:e,y:t};if(typeof r=="number"){let s=ue([e,t],[n,o]);if(r<=0)a={x:e,y:t};else if(r>=s)a={x:n,y:o};else {let[i,m]=I([e,t],[n,o],r/s);a={x:i,y:m};}}return a},Me=(e,t,n,o)=>{let{min:r,max:a}=Math;return [r(e,n),r(t,o),a(e,n),a(t,o)]};var Ee=(e,t,n)=>{let o=n/2,r=Math.sin(o),a=Math.cos(o),s=e**2*r**2,i=t**2*a**2,m=Math.sqrt(s+i)*n;return Math.abs(m)},Y=(e,t,n,o,r,a)=>{let{sin:s,cos:i}=Math,m=i(r),u=s(r),l=n*i(a),c=o*s(a);return [e+m*l-u*c,t+u*l+m*c]},De=(e,t)=>{let{x:n,y:o}=e,{x:r,y:a}=t,s=n*r+o*a,i=Math.sqrt((n**2+o**2)*(r**2+a**2));return (n*a-o*r<0?-1:1)*Math.acos(s/i)},Le=(e,t,n,o,r,a,s,i,m)=>{let{abs:u,sin:l,cos:c,sqrt:f,PI:b}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(b/180);if(e===i&&t===m)return {rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return {rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+e)/2,y:(m+t)/2}};let A=(e-i)/2,d=(t-m)/2,g={x:c(S)*A+l(S)*d,y:-l(S)*A+c(S)*d},x=g.x**2/p**2+g.y**2/h**2;x>1&&(p*=f(x),h*=f(x));let C=p**2*h**2-p**2*g.y**2-h**2*g.x**2,V=p**2*g.y**2+h**2*g.x**2,Q=C/V;Q=Q<0?0:Q;let w=(a!==s?1:-1)*f(Q),M={x:w*(p*g.y/h),y:w*(-(h*g.x)/p)},$={x:c(S)*M.x-l(S)*M.y+(e+i)/2,y:l(S)*M.x+c(S)*M.y+(t+m)/2},J={x:(g.x-M.x)/p,y:(g.y-M.y)/h},k=De({x:1,y:0},J),P={x:(-g.x-M.x)/p,y:(-g.y-M.y)/h},z=De(J,P);!s&&z>0?z-=2*b:s&&z<0&&(z+=2*b),z%=2*b;let B=k+z;return {center:$,startAngle:k,endAngle:B,rx:p,ry:h}},ge=(e,t,n,o,r,a,s,i,m)=>{let{rx:u,ry:l,startAngle:c,endAngle:f}=Le(e,t,n,o,r,a,s,i,m);return Ee(u,l,f-c)},Ie=(e,t,n,o,r,a,s,i,m,u)=>{let l={x:e,y:t},{center:c,rx:f,ry:b,startAngle:p,endAngle:h}=Le(e,t,n,o,r,a,s,i,m);if(typeof u=="number"){let y=Ee(f,b,h-p);if(u<=0)l={x:e,y:t};else if(u>=y)l={x:i,y:m};else {if(e===i&&t===m)return {x:i,y:m};if(f===0||b===0)return he(e,t,i,m,u);let{PI:S,cos:A,sin:d}=Math,g=h-p,C=(r%360+360)%360*(S/180),V=p+g*(u/y),Q=f*A(V),w=b*d(V);l={x:A(C)*Q-d(C)*w+c.x,y:d(C)*Q+A(C)*w+c.y};}}return l},$e=(e,t,n,o,r,a,s,i,m)=>{let{center:u,rx:l,ry:c,startAngle:f,endAngle:b}=Le(e,t,n,o,r,a,s,i,m),p=b-f,{min:h,max:y,tan:S,atan2:A,PI:d}=Math,{x:g,y:x}=u,C=r*d/180,V=S(C),Q=A(-c*V,l),w=Q,M=Q+d,$=A(c,l*V),J=$+d,k=[i],P=[m],z=h(e,i),B=y(e,i),E=h(t,m),Z=y(t,m),me=b-p*1e-5,W=Y(g,x,l,c,C,me),N=b-p*.99999,q=Y(g,x,l,c,C,N);if(W[0]>B||q[0]>B){let R=Y(g,x,l,c,C,w);k.push(R[0]),P.push(R[1]);}if(W[0]Z||q[1]>Z){let R=Y(g,x,l,c,C,$);k.push(R[0]),P.push(R[1]);}return z=h.apply([],k),E=h.apply([],P),B=y.apply([],k),Z=y.apply([],P),[z,E,B,Z]};var ht={};ie(ht,{CBEZIER_MINMAX_EPSILON:()=>bt,Cvalues:()=>ut,Tvalues:()=>Be,bezierLength:()=>ft,calculateBezier:()=>ct,computeBezier:()=>pt,deriveBezier:()=>lt,getBezierLength:()=>ee,minmaxC:()=>ve,minmaxQ:()=>de});var Be=[-0.06405689286260563,.06405689286260563,-0.1911188674736163,.1911188674736163,-0.3150426796961634,.3150426796961634,-0.4337935076260451,.4337935076260451,-0.5454214713888396,.5454214713888396,-0.6480936519369755,.6480936519369755,-0.7401241915785544,.7401241915785544,-0.820001985973903,.820001985973903,-0.8864155270044011,.8864155270044011,-0.9382745520027328,.9382745520027328,-0.9747285559713095,.9747285559713095,-0.9951872199970213,.9951872199970213],ut=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],lt=e=>{let t=[];for(let n=e,o=n.length,r=o-1;o>1;o-=1,r-=1){let a=[];for(let s=0;s{if(t===0)return e[0].t=0,e[0];let n=e.length-1;if(t===1)return e[n].t=1,e[n];let o=1-t,r=e;if(n===0)return e[0].t=t,e[0];if(n===1)return {x:o*r[0].x+t*r[1].x,y:o*r[0].y+t*r[1].y,t};let a=o*o,s=t*t,i=0,m=0,u=0,l=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=a,m=o*t*2,u=s):n===3&&(i=a*o,m=a*t*3,u=o*s*3,l=t*s),{x:i*r[0].x+m*r[1].x+u*r[2].x+l*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+l*r[3].y,t}},ct=(e,t)=>{let n=e(t),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},ft=e=>{let n=Be.length,o=0;for(let r=0,a;r{let t=[];for(let o=0,r=e.length,a=2;opt(n[0],o))},bt=1e-8,de=([e,t,n])=>{let o=Math.min(e,n),r=Math.max(e,n);if(t>=e?n>=t:n<=t)return [o,r];let a=(e*n-t*t)/(e-2*t+n);return a{let r=e-3*t+3*n-o;if(Math.abs(r)0&&l<1){let f=e*(1-l)*(1-l)*(1-l)+t*3*(1-l)*(1-l)*l+n*3*(1-l)*l*l+o*l*l*l;fm&&(m=f);}}return [i,m]};var dt={};ie(dt,{getCubicBBox:()=>Ne,getCubicLength:()=>le,getPointAtCubicLength:()=>je,getPointAtCubicSegmentLength:()=>gt});var gt=([e,t,n,o,r,a,s,i],m)=>{let u=1-m;return {x:u**3*e+3*u**2*m*n+3*u*m**2*r+m**3*s,y:u**3*t+3*u**2*m*o+3*u*m**2*a+m**3*i}},le=(e,t,n,o,r,a,s,i)=>ee([e,t,n,o,r,a,s,i]),je=(e,t,n,o,r,a,s,i,m)=>{let u=typeof m=="number",l={x:e,y:t};if(u){let c=ee([e,t,n,o,r,a,s,i]);m<=0||(m>=c?l={x:s,y:i}:l=gt([e,t,n,o,r,a,s,i],m/c));}return l},Ne=(e,t,n,o,r,a,s,i)=>{let m=ve([e,n,r,s]),u=ve([t,o,a,i]);return [m[0],u[0],m[1],u[1]]};var xt={};ie(xt,{getPointAtQuadLength:()=>Oe,getPointAtQuadSegmentLength:()=>yt,getQuadBBox:()=>we,getQuadLength:()=>pe});var yt=([e,t,n,o,r,a],s)=>{let i=1-s;return {x:i**2*e+2*i*s*n+s**2*r,y:i**2*t+2*i*s*o+s**2*a}},pe=(e,t,n,o,r,a)=>ee([e,t,n,o,r,a]),Oe=(e,t,n,o,r,a,s)=>{let i=typeof s=="number",m={x:e,y:t};if(i){let u=ee([e,t,n,o,r,a]);s<=0||(s>=u?m={x:r,y:a}:m=yt([e,t,n,o,r,a],s/u));}return m},we=(e,t,n,o,r,a)=>{let s=de([e,n,r]),i=de([t,o,a]);return [s[0],i[0],s[1],i[1]]};var Pt={};ie(Pt,{polygonArea:()=>Mt,polygonLength:()=>Lt});var Mt=e=>{let t=e.length,n=-1,o,r=e[t-1],a=0;for(;++ne.reduce((t,n,o)=>o?t+ue(e[o-1],n):0,0);var vt={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},G=vt;var Nt=e=>{let t=e.pathValue[e.segmentStart],n=t.toLowerCase(),{data:o}=e;for(;o.length>=G[n]&&(n==="m"&&o.length>2?(e.segments.push([t].concat(o.splice(0,2))),n="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(o.splice(0,G[n]))),!!G[n]););},Re=Nt;var wt="SVGPathCommander Error",D=wt;var Rt=e=>{let{index:t,pathValue:n}=e,o=n.charCodeAt(t);if(o===48){e.param=0,e.index+=1;return}if(o===49){e.param=1,e.index+=1;return}e.err=`${D}: invalid Arc flag "${n[t]}", expecting 0 or 1 at index ${t}`;},He=Rt;var Vt=e=>e>=48&&e<=57,j=Vt;var Qt="Invalid path value",O=Qt;var kt=e=>{let{max:t,pathValue:n,index:o}=e,r=o,a=false,s=false,i=false,m=false,u;if(r>=t){e.err=`${D}: ${O} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!j(u)&&u!==46){e.err=`${D}: ${O} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(a=u===48,r+=1,u=n.charCodeAt(r),a&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),Ge=zt;var qt=e=>{let{pathValue:t,max:n}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return true;default:return false}},_e=Dt;var Et=e=>j(e)||e===43||e===45||e===46,Ue=Et;var It=e=>(e|32)===97,Ke=It;var $t=e=>{switch(e|32){case 109:case 77:return true;default:return false}},Fe=$t;var Bt=e=>{let{max:t,pathValue:n,index:o,segments:r}=e,a=n.charCodeAt(o),s=G[n[o].toLowerCase()];if(e.segmentStart=o,!_e(a)){e.err=`${D}: ${O} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!Fe(a)&&i?.[0]?.toLocaleLowerCase()==="z"){e.err=`${D}: ${O} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(e.index+=1,_(e),e.data=[],!s){Re(e);return}for(;;){for(let m=s;m>0;m-=1){if(Ke(a)&&(m===3||m===4)?He(e):Ze(e),e.err.length)return;e.data.push(e.param),_(e),e.index=e.max||!Ue(n.charCodeAt(e.index)))break}Re(e);},ye=Bt;var F=class{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err="";}};var jt=e=>{if(typeof e!="string")return e.slice(0);let t=new F(e);for(_(t);t.index{let[r]=e,a=r.toUpperCase(),s=a===r;if(t===0||s)return e;if(a==="A")return [a,e[1],e[2],e[3],e[4],e[5],e[6]+n,e[7]+o];if(a==="V")return [a,e[1]+o];if(a==="H")return [a,e[1]+n];if(a==="L")return [a,e[1]+n,e[2]+o];{let i=[],m=e.length;for(let u=1;u{let n=e.length,o,r="M",a="M",s=false,i=0,m=0,u=0,l=0,c=0;for(let f=0;f{let t=v(e);return T(t,U)},xe=Zt;var Gt=(e,t,n,o)=>{let[r]=e,a=r.toLowerCase(),s=r===a;if(t===0||s)return e;if(a==="a")return [a,e[1],e[2],e[3],e[4],e[5],e[6]-n,e[7]-o];if(a==="v")return [a,e[1]-o];if(a==="h")return [a,e[1]-n];if(a==="l")return [a,e[1]-n,e[2]-o];{let i=[],m=e.length;for(let u=1;u{let t=v(e);return T(t,Pe)},Ut=_t;var Kt=(e,t,n)=>{let{sin:o,cos:r}=Math,a=e*r(n)-t*o(n),s=e*o(n)+t*r(n);return {x:a,y:s}},ce=Kt;var St=(e,t,n,o,r,a,s,i,m,u)=>{let l=e,c=t,f=n,b=o,p=i,h=m,y=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],d,g,x,C,V;if(u)[g,x,C,V]=u;else {d=ce(l,c,-S),l=d.x,c=d.y,d=ce(p,h,-S),p=d.x,h=d.y;let N=(l-p)/2,q=(c-h)/2,R=N*N/(f*f)+q*q/(b*b);R>1&&(R=Math.sqrt(R),f*=R,b*=R);let ze=f*f,qe=b*b,st=(a===s?-1:1)*Math.sqrt(Math.abs((ze*qe-ze*q*q-qe*N*N)/(ze*q*q+qe*N*N)));C=st*f*q/b+(l+p)/2,V=st*-b*N/f+(c+h)/2,g=Math.asin(((c-V)/b*10**9>>0)/10**9),x=Math.asin(((h-V)/b*10**9>>0)/10**9),g=lx&&(g-=Math.PI*2),!s&&x>g&&(x-=Math.PI*2);}let Q=x-g;if(Math.abs(Q)>y){let N=x,q=p,R=h;x=g+y*(s&&x>g?1:-1),p=C+f*Math.cos(x),h=V+b*Math.sin(x),A=St(p,h,f,b,r,0,s,q,R,[x,N,C,V]);}Q=x-g;let w=Math.cos(g),M=Math.sin(g),$=Math.cos(x),J=Math.sin(x),k=Math.tan(Q/4),P=4/3*f*k,z=4/3*b*k,B=[l,c],E=[l+P*M,c-z*w],Z=[p+P*J,h-z*$],me=[p,h];if(E[0]=2*B[0]-E[0],E[1]=2*B[1]-E[1],u)return [E[0],E[1],Z[0],Z[1],me[0],me[1]].concat(A);A=[E[0],E[1],Z[0],Z[1],me[0],me[1]].concat(A);let W=[];for(let N=0,q=A.length;N{let s=.3333333333333333,i=2/3;return [s*e+i*n,s*t+i*o,s*r+i*n,s*a+i*o,r,a]},Je=Ft;var Jt=(e,t,n,o)=>{let r=I([e,t],[n,o],.3333333333333333),a=I([e,t],[n,o],2/3);return [r[0],r[1],a[0],a[1],n,o]},Ve=Jt;var Wt=(e,t)=>{let[n]=e,o=e.slice(1).map(Number),[r,a]=o,{x1:s,y1:i,x:m,y:u}=t;return "TQ".includes(n)||(t.qx=null,t.qy=null),n==="M"?(t.x=r,t.y=a,e):n==="A"?["C"].concat(Se(s,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(t.qx=r,t.qy=a,["C"].concat(Je(s,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Ve(s,i,r,a)):n==="Z"?["C"].concat(Ve(s,i,m,u)):e},We=Wt;var Xt=(e,t)=>{let[n]=e,o=n.toUpperCase(),r=n!==o,{x1:a,y1:s,x2:i,y2:m,x:u,y:l}=t,c=e.slice(1),f=c.map((b,p)=>b+(r?p%2?l:u:0));"TQ".includes(o)||(t.qx=null,t.qy=null);if(o==="A")return f=c.slice(0,-2).concat(c[5]+(r?u:0),c[6]+(r?l:0)),["A"].concat(f);if(o==="H")return ["L",e[1]+(r?u:0),s];if(o==="V")return ["L",a,e[1]+(r?l:0)];if(o==="L")return ["L",e[1]+(r?u:0),e[2]+(r?l:0)];if(o==="M")return ["M",e[1]+(r?u:0),e[2]+(r?l:0)];if(o==="C")return ["C"].concat(f);if(o==="S"){let b=a*2-i,p=s*2-m;return t.x1=b,t.y1=p,["C",b,p].concat(f)}else if(o==="T"){let b=a*2-(t.qx?t.qx:0),p=s*2-(t.qy?t.qy:0);return t.qx=b,t.qy=p,["Q",b,p].concat(f)}else if(o==="Q"){let[b,p]=f;return t.qx=b,t.qy=p,["Q"].concat(f)}else if(o==="Z")return ["Z"];return e},te=Xt;var Yt={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},K=Yt;var er=e=>{let t={...K},n=v(e);return T(n,(o,r,a,s)=>{t.x=a,t.y=s;let i=te(o,t),m=We(i,t);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let l=m.length;return t.x1=+m[l-2],t.y1=+m[l-1],t.x2=+m[l-4]||t.x1,t.y2=+m[l-3]||t.y1,m})},Ae=er;var tr={origin:[0,0,0],round:4},H=tr;var rr=(e,t)=>{let n=t>=1?10**t:1;return t>0?Math.round(e*n)/n:Math.round(e)},L=rr;var nr=(e,t)=>{let n=e.length,{round:o}=H,r=e[0],a="";o=t==="off"||typeof t=="number"&&t>=0?t:typeof o=="number"&&o>=0?o:"off";for(let s=0;s{let t=v(e),n={...K};return T(t,(o,r,a,s)=>{n.x=a,n.y=s;let i=te(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},re=or;var ar=(e,t)=>{let n=re(e),o=false,r=[],a="M",s=0,i=0,[m,u]=n[0].slice(1),l=typeof t=="number",c={x:m,y:u},f=0,b=c,p=0;return !l||t{[a]=h,o=a==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,c={x:m,y:u},f=0):a==="L"?(c=he(r[0],r[1],r[2],r[3],t-p),f=X(r[0],r[1],r[2],r[3])):a==="A"?(c=Ie(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],t-p),f=ge(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):a==="C"?(c=je(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],t-p),f=le(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):a==="Q"?(c=Oe(r[0],r[1],r[2],r[3],r[4],r[5],t-p),f=pe(r[0],r[1],r[2],r[3],r[4],r[5])):a==="Z"&&(r=[S,A,m,u],c={x:m,y:u},f=X(r[0],r[1],r[2],r[3])),[s,i]=r.slice(-2),pp-fe?{x:s,y:i}:b)},Ce=ar;var sr=e=>{let t=v(e),n=0,o=0,r=0,a=0,s=0,i=0,m="M",u=0,l=0,c=0;return T(t,(f,b,p,h)=>{[m]=f;let y=m.toUpperCase(),A=y!==m?U(f,b,p,h):f.slice(0),d=y==="V"?["L",p,A[1]]:y==="H"?["L",A[1],h]:A;[m]=d,"TQ".includes(y)||(s=0,i=0);if(m==="M")[,u,l]=d;else if(m==="L")c+=X(p,h,d[1],d[2]);else if(m==="A")c+=ge(p,h,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(m==="S"){let g=n*2-r,x=o*2-a;c+=le(p,h,g,x,d[1],d[2],d[3],d[4]);}else m==="C"?c+=le(p,h,d[1],d[2],d[3],d[4],d[5],d[6]):m==="T"?(s=n*2-s,i=o*2-i,c+=pe(p,h,s,i,d[1],d[2])):m==="Q"?(s=d[1],i=d[2],c+=pe(p,h,d[1],d[2],d[3],d[4])):m==="Z"&&(c+=X(p,h,u,l));[n,o]=m==="Z"?[u,l]:d.slice(-2),[r,a]=m==="C"?[d[3],d[4]]:m==="S"?[d[1],d[2]]:[n,o];}),c},ne=sr;var mr=(e,t)=>{let n=v(e),o=n.slice(0),r=ne(o),a=o.length-1,s=0,i=0,m=n[0];if(a<=0||!t||!Number.isFinite(t))return {segment:m,index:0,length:i,lengthAtSegment:s};if(t>=r)return o=n.slice(0,-1),s=ne(o),i=r-s,m=n[a],{segment:m,index:a,length:i,lengthAtSegment:s};let u=[];for(;a>0;)m=o[a],o=o.slice(0,-1),s=ne(o),i=r-s,r=s,u.push({segment:m,index:a,length:i,lengthAtSegment:s}),a-=1;return u.find(({lengthAtSegment:l})=>l<=t)},Te=mr;var ir=(e,t)=>{let n=v(e),o=re(n),r=ne(o),a=g=>{let x=g.x-t.x,C=g.y-t.y;return x*x+C*C},s=8,i,m={x:0,y:0},u=0,l=0,c=1/0;for(let g=0;g<=r;g+=s)i=Ce(o,g),u=a(i),u1e-6&&(p=l-s,f=Ce(o,p),y=a(f),h=l+s,b=Ce(o,h),S=a(b),p>=0&&yoe(e,t).closest,lr=ur;var pr=(e,t,n,o,r,a,s,i)=>3*((i-t)*(n+r)-(s-e)*(o+a)+o*(e-r)-n*(t-a)+i*(r+e/3)-s*(a+t/3))/20,cr=e=>{let t=0,n=0,o=0;return Ae(e).map(r=>{switch(r[0]){case "M":return [,t,n]=r,0;default:return o=pr(t,n,r[1],r[2],r[3],r[4],r[5],r[6]),[t,n]=r.slice(-2),o}}).reduce((r,a)=>r+a,0)},Ye=cr;var fr=e=>Ye(Ae(e))>=0,br=fr;var hr=e=>{if(!e)return {x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let t=v(e),n="M",o=0,r=0,{max:a,min:s}=Math,i=1/0,m=1/0,u=-1/0,l=-1/0,c=0,f=0,b=0,p=0,h=0,y=0,S=0,A=0,d=0,g=0;T(t,(V,Q,w,M)=>{[n]=V;let $=n.toUpperCase(),k=$!==n?U(V,Q,w,M):V.slice(0),P=$==="V"?["L",w,k[1]]:$==="H"?["L",k[1],M]:k;[n]=P,"TQ".includes($)||(d=0,g=0);if(n==="M")[,o,r]=P,c=o,f=r,b=o,p=r;else if(n==="L")[c,f,b,p]=Me(w,M,P[1],P[2]);else if(n==="A")[c,f,b,p]=$e(w,M,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(n==="S"){let z=h*2-S,B=y*2-A;[c,f,b,p]=Ne(w,M,z,B,P[1],P[2],P[3],P[4]);}else n==="C"?[c,f,b,p]=Ne(w,M,P[1],P[2],P[3],P[4],P[5],P[6]):n==="T"?(d=h*2-d,g=y*2-g,[c,f,b,p]=we(w,M,d,g,P[1],P[2])):n==="Q"?(d=P[1],g=P[2],[c,f,b,p]=we(w,M,P[1],P[2],P[3],P[4])):n==="Z"&&([c,f,b,p]=Me(w,M,o,r));i=s(c,i),m=s(f,m),u=a(b,u),l=a(p,l),[h,y]=n==="Z"?[o,r]:P.slice(-2),[S,A]=n==="C"?[P[3],P[4]]:n==="S"?[P[1],P[2]]:[h,y];});let x=u-i,C=l-m;return {width:x,height:C,x:i,y:m,x2:u,y2:l,cx:i+x/2,cy:m+C/2,cz:Math.max(x,C)+Math.min(x,C)/2}},gr=hr;var dr=(e,t)=>Te(e,t).segment,yr=dr;var xr=(e,t)=>oe(e,t).segment,Pr=xr;var Sr=e=>Array.isArray(e)&&e.every(t=>{let n=t[0].toLowerCase();return G[n]===t.length-1&&"achlmqstvz".includes(n)&&t.slice(1).every(Number.isFinite)})&&e.length>0,ae=Sr;var Ar=e=>ae(e)&&e.every(([t])=>t===t.toUpperCase()),et=Ar;var Cr=e=>et(e)&&e.every(([t])=>"ACLMQZ".includes(t)),tt=Cr;var Tr=e=>tt(e)&&e.every(([t])=>"MC".includes(t)),Mr=Tr;var Lr=(e,t)=>{let{distance:n}=oe(e,t);return Math.abs(n)ae(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),wr=Nr;var Rr=e=>{if(typeof e!="string"||!e.length)return false;let t=new F(e);for(_(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,Qe=Qr;var kr=e=>{let{x1:t,y1:n,x2:o,y2:r}=e;return [t,n,o,r]=[t,n,o,r].map(a=>+a),[["M",t,n],["L",o,r]]},zr=e=>{let t=[],n=(e.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:t,cy:n,r:o}=e;return [t,n,o]=[t,n,o].map(r=>+r),[["M",t-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},Dr=e=>{let{cx:t,cy:n}=e,o=e.rx||0,r=e.ry||o;return [t,n,o,r]=[t,n,o,r].map(a=>+a),[["M",t-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},Er=e=>{let t=+e.x||0,n=+e.y||0,o=+e.width,r=+e.height,a=+(e.rx||0),s=+(e.ry||a);if(a||s){a*2>o&&(a-=(a*2-o)/2);return s*2>r&&(s-=(s*2-r)/2),[["M",t+a,n],["h",o-a*2],["s",a,0,a,s],["v",r-s*2],["s",0,s,-a,s],["h",-o+a*2],["s",-a,0,-a,-s],["v",-r+s*2],["s",0,-s,a,-s]]}return [["M",t,n],["h",o],["v",r],["H",t],["Z"]]},Ir=e=>{let t=Object.keys(se),n=Qe(e),o=n?e.tagName:null;if(o&&[...t,"path"].every(m=>o!==m))throw TypeError(`${D}: "${o}" is not SVGElement`);let r=n?o:e.type,a=se[r],s={type:r};n?a.forEach(m=>{s[m]=e.getAttribute(m);}):Object.assign(s,e);let i=[];return r==="circle"?i=qr(s):r==="ellipse"?i=Dr(s):["polyline","polygon"].includes(r)?i=zr(s):r==="rect"?i=Er(s):r==="line"?i=kr(s):["glyph","path"].includes(r)&&(i=v(n?e.getAttribute("d")||"":e.d||"")),ae(i)&&i.length?i:false},nt=Ir;var $r=(e,t,n)=>{let o=n||document,r=Object.keys(se),a=Qe(e),s=a?e.tagName:null;if(s==="path")throw TypeError(`${D}: "${s}" is already SVGPathElement`);if(s&&r.every(p=>s!==p))throw TypeError(`${D}: "${s}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=a?s:e.type,u=se[m],l={type:m},c=H.round,f=nt(e),b=f&&f.length?Xe(f,c):"";return a?(u.forEach(p=>{l[p]=e.getAttribute(p);}),Object.values(e.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h);})):(Object.assign(l,e),Object.keys(l).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),l[p]);})),rt(b)?(i.setAttribute("d",b),t&&a&&(e.before(i,e),e.remove()),i):false},Br=$r;var Or=e=>{let t=new jr__default.default,{origin:n}=e,[o,r]=n,{translate:a}=e,{rotate:s}=e,{skew:i}=e,{scale:m}=e;return Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?t=t.translate(...a):typeof a=="number"&&!Number.isNaN(a)&&(t=t.translate(a)),(s||i||m)&&(t=t.translate(o,r),Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?t=t.rotate(...s):typeof s=="number"&&!Number.isNaN(s)&&(t=t.rotate(s)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(t=i[0]?t.skewX(i[0]):t,t=i[1]?t.skewY(i[1]):t):typeof i=="number"&&!Number.isNaN(i)&&(t=t.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?t=t.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(t=t.scale(m)),t=t.translate(-o,-r)),t},ot=Or;var Hr=(e,t,n,o)=>{let[r]=e,{round:a}=H,s=a,i=t.slice(1),{x1:m,y1:u,x2:l,y2:c,x:f,y:b}=n,[p,h]=i.slice(-2),y=e;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(L(f,s)===L(p,s))return ["V",h];if(L(b,s)===L(h,s))return ["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(L(S,s)===L(m*2-l,s)&&L(A,s)===L(u*2-c,s)||L(m,s)===L(l*2-f,s)&&L(u,s)===L(c*2-b,s)))return ["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&L(S,s)===L(m*2-l,s)&&L(A,s)===L(u*2-c,s))return ["T",i[2],i[3]]}return y},at=Hr;var Zr=(e,t)=>{let n=e.slice(1).map(o=>L(o,t));return [e[0]].concat(n)},be=Zr;var Gr=(e,t)=>{let n=xe(e),o=typeof t=="number"&&t>=0?t:2,r={...K},a=[],s="M",i="Z";return T(n,(m,u,l,c)=>{r.x=l,r.y=c;let f=te(m,r),b=m;if([s]=m,a[u]=s,u){i=a[u-1];let h=at(m,f,r,i),y=be(h,o),S=y.join(""),A=Pe(h,u,l,c),d=be(A,o),g=d.join("");b=S.length{let n=jr__default.default.Translate(t[0],t[1],t[2]);return [,,,n.m44]=t,n=e.multiply(n),[n.m41,n.m42,n.m43,n.m44]},Fr=(e,t,n)=>{let[o,r,a]=n,[s,i,m]=Kr(e,[t[0],t[1],0,1]),u=s-o,l=i-r,c=m-a;return [u*(Math.abs(a)/Math.abs(c)||1)+o,l*(Math.abs(a)/Math.abs(c)||1)+r]},ke=Fr;var Jr=e=>{let t=e.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):e[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return [["M"].concat(t[0].slice(0,2))].concat(t.map(n=>["C"].concat(n.slice(2))))},Wr=Jr;var Xr=e=>{let t=xe(e),n=re(t),o=t.length,r=t[o-1][0]==="Z",a=T(t,(s,i)=>{let m=n[i],u=i&&t[i-1],l=u&&u[0],c=t[i+1],f=c&&c[0],[b]=s,[p,h]=n[i?i-1:o-1].slice(-2),y=s;switch(b){case "M":y=r?["Z"]:[b,p,h];break;case "A":y=[b,s[1],s[2],s[3],s[4],s[5]===1?0:1,p,h];break;case "C":c&&f==="S"?y=["S",s[1],s[2],p,h]:y=[b,s[3],s[4],s[1],s[2],p,h];break;case "S":l&&"CS".includes(l)&&(!c||f!=="S")?y=["C",m[3],m[4],m[1],m[2],p,h]:y=[b,m[1],m[2],p,h];break;case "Q":c&&f==="T"?y=["T",p,h]:y=[b,s[1],s[2],p,h];break;case "T":l&&"QT".includes(l)&&(!c||f!=="T")?y=["Q",m[1],m[2],p,h]:y=[b,p,h];break;case "Z":y=["M",p,h];break;case "H":y=[b,p];break;case "V":y=[b,h];break;default:y=[b].concat(s.slice(1,-2),p,h);}return y});return r?a.reverse():[a[0]].concat(a.slice(1).reverse())},Yr=Xr;var en=(e,t)=>{let{round:n}=H;n=t==="off"||typeof t=="number"&&t>=0?t:typeof n=="number"&&n>=0?n:"off";return n==="off"?e.slice(0):T(e,o=>be(o,n))},tn=en;var rn=(e,t=.5)=>{let n=t,o=e.slice(0,2),r=e.slice(2,4),a=e.slice(4,6),s=e.slice(6,8),i=I(o,r,n),m=I(r,a,n),u=I(a,s,n),l=I(i,m,n),c=I(m,u,n),f=I(l,c,n);return [["C",i[0],i[1],l[0],l[1],f[0],f[1]],["C",c[0],c[1],u[0],u[1],s[0],s[1]]]},nn=rn;var on=e=>{let t=[],n,o=-1,r=0,a=0,s=0,i=0,m={...K};return e.forEach(u=>{let[l]=u,c=l.toUpperCase(),f=l.toLowerCase(),b=l===f,p=u.slice(1);c==="M"?(o+=1,[r,a]=p,r+=b?m.x:0,a+=b?m.y:0,s=r,i=a,n=[b?[c,s,i]:u]):(c==="Z"?(r=s,a=i):c==="H"?([,r]=u,r+=b?m.x:0):c==="V"?([,a]=u,a+=b?m.y:0):([r,a]=u.slice(-2),r+=b?m.x:0,a+=b?m.y:0),n.push(u)),m.x=r,m.y=a,t[o]=n;}),t},an=on;var sn=(e,t)=>{let n=0,o=0,r=0,a=0,s=0,i=0,m="M",u=v(e),l=t&&Object.keys(t);if(!t||l&&!l.length)return u.slice(0);t.origin||Object.assign(t,{origin:H.origin});let c=t.origin,f=ot(t);return f.isIdentity?u.slice(0):T(u,(b,p,h,y)=>{[m]=b;let S=m.toUpperCase(),d=S!==m?U(b,p,h,y):b.slice(0),g=S==="A"?["C"].concat(Se(h,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):S==="V"?["L",h,d[1]]:S==="H"?["L",d[1],y]:d;m=g[0];let x=m==="C"&&g.length>7,C=x?g.slice(0,7):g.slice(0);if(x&&(u.splice(p+1,0,["C"].concat(g.slice(7))),g=C),m==="L"){[r,a]=ke(f,[g[1],g[2]],c);n!==r&&o!==a?g=["L",r,a]:o===a?g=["H",r]:n===r&&(g=["V",a]);}else for(s=1,i=g.length;s {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n"]} \ No newline at end of file diff --git a/dist/util/util.d.cts b/dist/util/util.d.cts deleted file mode 100644 index 7d522ae..0000000 --- a/dist/util/util.d.cts +++ /dev/null @@ -1,1255 +0,0 @@ -import CSSMatrix from '@thednp/dommatrix'; -export { default as CSSMatrix } from '@thednp/dommatrix'; - -type SegmentProperties = { - segment: PathSegment; - index: number; - length: number; - lengthAtSegment: number; -}; -type PointProperties = { - closest: { - x: number; - y: number; - }; - distance: number; - segment?: SegmentProperties; -}; -type LineAttr = { - type: "line"; - x1: number; - y1: number; - x2: number; - y2: number; - [key: string]: string | number; -}; -type PolyAttr = { - type: "polygon" | "polyline"; - points: string; - [key: string]: string | number; -}; -type CircleAttr = { - type: "circle"; - cx: number; - cy: number; - r: number; - [key: string]: string | number; -}; -type EllipseAttr = { - type: "ellipse"; - cx: number; - cy: number; - rx: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type RectAttr = { - type: "rect"; - width: number; - height: number; - x: number; - y: number; - rx?: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type GlyphAttr = { - type: "glyph"; - d: string; - [key: string]: string | number; -}; -type ShapeParams = { - line: ["x1", "y1", "x2", "y2"]; - circle: ["cx", "cy", "r"]; - ellipse: ["cx", "cy", "rx", "ry"]; - rect: ["width", "height", "x", "y", "rx", "ry"]; - polygon: ["points"]; - polyline: ["points"]; - glyph: ["d"]; -}; -type ParserParams = { - x1: number; - y1: number; - x2: number; - y2: number; - x: number; - y: number; - qx: number | null; - qy: number | null; -}; -type TransformObject = { - translate: number | number[]; - rotate: number | number[]; - scale: number | number[]; - skew: number | number[]; - origin: number[]; -}; - -type SpaceNumber = 0x1680 | 0x180e | 0x2000 | 0x2001 | 0x2002 | 0x2003 | 0x2004 | 0x2005 | 0x2006 | 0x2007 | 0x2008 | 0x2009 | 0x200a | 0x202f | 0x205f | 0x3000 | 0xfeff | 0x0a | 0x0d | 0x2028 | 0x2029 | 0x20 | 0x09 | 0x0b | 0x0c | 0xa0 | 0x1680; -type PathCommandNumber = 0x6d | 0x7a | 0x6c | 0x68 | 0x76 | 0x63 | 0x73 | 0x71 | 0x74 | 0x61; -type DigitNumber = 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39; -type MCommand = "M"; -type mCommand = "m"; -type LCommand = "L"; -type lCommand = "l"; -type VCommand = "V"; -type vCommand = "v"; -type HCommand = "H"; -type hCommand = "h"; -type ZCommand = "Z"; -type zCommand = "z"; -type CCommand = "C"; -type cCommand = "c"; -type SCommand = "S"; -type sCommand = "s"; -type QCommand = "Q"; -type qCommand = "q"; -type TCommand = "T"; -type tCommand = "t"; -type ACommand = "A"; -type aCommand = "a"; -type AbsoluteCommand = MCommand | LCommand | VCommand | HCommand | ZCommand | CCommand | SCommand | QCommand | TCommand | ACommand; -type RelativeCommand = mCommand | lCommand | vCommand | hCommand | zCommand | cCommand | sCommand | qCommand | tCommand | aCommand; -type PathCommand = AbsoluteCommand | RelativeCommand; -type MSegment = [MCommand, number, number]; -type mSegment = [mCommand, number, number]; -type MoveSegment = MSegment | mSegment; -type LSegment = [LCommand, number, number]; -type lSegment = [lCommand, number, number]; -type LineSegment = LSegment | lSegment; -type VSegment = [VCommand, number]; -type vSegment = [vCommand, number]; -type VertLineSegment = vSegment | VSegment; -type HSegment = [HCommand, number]; -type hSegment = [hCommand, number]; -type HorLineSegment = HSegment | hSegment; -type ZSegment = [ZCommand]; -type zSegment = [zCommand]; -type CloseSegment = ZSegment | zSegment; -type CSegment = [ - CCommand, - number, - number, - number, - number, - number, - number -]; -type cSegment = [ - cCommand, - number, - number, - number, - number, - number, - number -]; -type CubicSegment = CSegment | cSegment; -type SSegment = [SCommand, number, number, number, number]; -type sSegment = [sCommand, number, number, number, number]; -type ShortCubicSegment = SSegment | sSegment; -type QSegment = [QCommand, number, number, number, number]; -type qSegment = [qCommand, number, number, number, number]; -type QuadSegment = QSegment | qSegment; -type TSegment = [TCommand, number, number]; -type tSegment = [tCommand, number, number]; -type ShortQuadSegment = TSegment | tSegment; -type ASegment = [ - ACommand, - number, - number, - number, - number, - number, - number, - number -]; -type aSegment = [ - aCommand, - number, - number, - number, - number, - number, - number, - number -]; -type ArcSegment = ASegment | aSegment; -type PathSegment = MoveSegment | LineSegment | VertLineSegment | HorLineSegment | CloseSegment | CubicSegment | ShortCubicSegment | QuadSegment | ShortQuadSegment | ArcSegment; -type ShortSegment = VertLineSegment | HorLineSegment | ShortCubicSegment | ShortQuadSegment | CloseSegment; -type AbsoluteSegment = MSegment | LSegment | VSegment | HSegment | CSegment | SSegment | QSegment | TSegment | ASegment | ZSegment; -type RelativeSegment = mSegment | lSegment | vSegment | hSegment | cSegment | sSegment | qSegment | tSegment | aSegment | zSegment; -type NormalSegment = MSegment | LSegment | CSegment | QSegment | ASegment | ZSegment; -type PathArray = [MSegment | mSegment, ...PathSegment[]]; -type AbsoluteArray = [MSegment, ...AbsoluteSegment[]]; -type RelativeArray = [MSegment, ...RelativeSegment[]]; -type NormalArray = [MSegment, ...NormalSegment[]]; -type CurveArray = [MSegment, ...CSegment[]]; -type ShapeTypes = SVGPolylineElement | SVGPolygonElement | SVGLineElement | SVGEllipseElement | SVGCircleElement | SVGRectElement; -type ShapeOps = LineAttr | PolyAttr | PolyAttr | EllipseAttr | CircleAttr | RectAttr | GlyphAttr; -type TransformObjectValues = Partial & { - origin: [number, number, number]; -}; -type Point = { - x: number; - y: number; -}; -type PointTuple = [number, number]; -type DerivedPoint = Point & { - t: number; -}; -type QuadPoints = [Point, Point, Point, Point, Point, Point]; -type CubicPoints = [ - Point, - Point, - Point, - Point, - Point, - Point, - Point, - Point -]; -type DerivedQuadPoints = [ - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint -]; -type DerivedCubicPoints = [ - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint -]; -type QuadCoordinates = [number, number, number, number, number, number]; -type CubicCoordinates = [ - number, - number, - number, - number, - number, - number, - number, - number -]; -type DeriveCallback = (t: number) => Point; -type IteratorCallback = (segment: PathSegment, index: number, lastX: number, lastY: number) => PathSegment | false | void | undefined; - -/** - * Returns the Arc segment length. - * @param rx radius along X axis - * @param ry radius along Y axis - * @param theta the angle in radians - * @returns the arc length - */ -declare const arcLength: (rx: number, ry: number, theta: number) => number; -/** - * Find point on ellipse at given angle around ellipse (theta); - * @param cx the center X - * @param cy the center Y - * @param rx the radius X - * @param ry the radius Y - * @param alpha the arc rotation angle in radians - * @param theta the arc sweep angle in radians - * @returns a point around ellipse at given angle - */ -declare const arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; -/** - * Returns the angle between two points. - * @param v0 starting point - * @param v1 ending point - * @returns the angle in radian - */ -declare const angleBetween: (v0: Point, v1: Point) => number; -/** - * Returns the following properties for an Arc segment: center, start angle, - * end angle, and radiuses on X and Y axis. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns properties specific to Arc segments - */ -declare const getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { - rx: number; - ry: number; - startAngle: number; - endAngle: number; - center: { - x: number; - y: number; - }; -}; -/** - * Returns the length of an Arc segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the length of the Arc segment - */ -declare const getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; -/** - * Returns a point along an Arc segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance a [0-1] ratio - * @returns a point along the Arc segment - */ -declare const getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { - x: number; - y: number; -}; -/** - * Returns the extrema for an Arc segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @see https://github.com/herrstrietzel/svg-pathdata-getbbox - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the Arc segment - */ -declare const getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; - -declare const arcTools_angleBetween: typeof angleBetween; -declare const arcTools_arcLength: typeof arcLength; -declare const arcTools_arcPoint: typeof arcPoint; -declare const arcTools_getArcBBox: typeof getArcBBox; -declare const arcTools_getArcLength: typeof getArcLength; -declare const arcTools_getArcProps: typeof getArcProps; -declare const arcTools_getPointAtArcLength: typeof getPointAtArcLength; -declare namespace arcTools { - export { arcTools_angleBetween as angleBetween, arcTools_arcLength as arcLength, arcTools_arcPoint as arcPoint, arcTools_getArcBBox as getArcBBox, arcTools_getArcLength as getArcLength, arcTools_getArcProps as getArcProps, arcTools_getPointAtArcLength as getPointAtArcLength }; -} - -/** - * Tools from bezier.js by Mike 'Pomax' Kamermans - * @see https://github.com/Pomax/bezierjs - */ -declare const Tvalues: number[]; -declare const Cvalues: number[]; -/** - * @param points - * @returns - */ -declare const deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; -/** - * @param points - * @param t - */ -declare const computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; -declare const calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; -declare const bezierLength: (derivativeFn: DeriveCallback) => number; -/** - * Returns the length of CubicBezier / Quad segment. - * @param curve cubic / quad bezier segment - */ -declare const getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; -declare const CBEZIER_MINMAX_EPSILON = 1e-8; -/** - * Returns the most extreme points in a Quad Bezier segment. - * @param A an array which consist of X/Y values - */ -declare const minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; -/** - * Returns the most extreme points in a Cubic Bezier segment. - * @param A an array which consist of X/Y values - * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127 - */ -declare const minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; - -declare const bezier_CBEZIER_MINMAX_EPSILON: typeof CBEZIER_MINMAX_EPSILON; -declare const bezier_Cvalues: typeof Cvalues; -declare const bezier_Tvalues: typeof Tvalues; -declare const bezier_bezierLength: typeof bezierLength; -declare const bezier_calculateBezier: typeof calculateBezier; -declare const bezier_computeBezier: typeof computeBezier; -declare const bezier_deriveBezier: typeof deriveBezier; -declare const bezier_getBezierLength: typeof getBezierLength; -declare const bezier_minmaxC: typeof minmaxC; -declare const bezier_minmaxQ: typeof minmaxQ; -declare namespace bezier { - export { bezier_CBEZIER_MINMAX_EPSILON as CBEZIER_MINMAX_EPSILON, bezier_Cvalues as Cvalues, bezier_Tvalues as Tvalues, bezier_bezierLength as bezierLength, bezier_calculateBezier as calculateBezier, bezier_computeBezier as computeBezier, bezier_deriveBezier as deriveBezier, bezier_getBezierLength as getBezierLength, bezier_minmaxC as minmaxC, bezier_minmaxQ as minmaxQ }; -} - -/** - * Returns a point at a given length of a CubicBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param t a [0-1] ratio - * @returns the point at cubic-bezier segment length - */ -declare const getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { - x: number; - y: number; -}; -/** - * Returns the length of a CubicBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the CubicBezier segment length - */ -declare const getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; -/** - * Returns the point along a CubicBezier segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to look at - * @returns the point at CubicBezier length - */ -declare const getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; -}; -/** - * Returns the boundig box of a CubicBezier segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the CubicBezier segment - */ -declare const getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; - -declare const cubicTools_getCubicBBox: typeof getCubicBBox; -declare const cubicTools_getCubicLength: typeof getCubicLength; -declare const cubicTools_getPointAtCubicLength: typeof getPointAtCubicLength; -declare const cubicTools_getPointAtCubicSegmentLength: typeof getPointAtCubicSegmentLength; -declare namespace cubicTools { - export { cubicTools_getCubicBBox as getCubicBBox, cubicTools_getCubicLength as getCubicLength, cubicTools_getPointAtCubicLength as getPointAtCubicLength, cubicTools_getPointAtCubicSegmentLength as getPointAtCubicSegmentLength }; -} - -/** - * Returns length for line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the line segment length - */ -declare const getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; -/** - * Returns a point along the line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to point in [0-1] range - * @returns the point at length - */ -declare const getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; -}; -/** - * Returns bounding box for line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to point in [0-1] range - * @returns the extrema for line segments - */ -declare const getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; - -declare const lineTools_getLineBBox: typeof getLineBBox; -declare const lineTools_getLineLength: typeof getLineLength; -declare const lineTools_getPointAtLineLength: typeof getPointAtLineLength; -declare namespace lineTools { - export { lineTools_getLineBBox as getLineBBox, lineTools_getLineLength as getLineLength, lineTools_getPointAtLineLength as getPointAtLineLength }; -} - -/** - * Returns the {x,y} coordinates of a point at a - * given length of a quadratic-bezier segment. - * - * @see https://github.com/substack/point-at-length - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param t a [0-1] ratio - * @returns the requested {x,y} coordinates - */ -declare const getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { - x: number; - y: number; -}; -/** - * Returns the length of a QuadraticBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the QuadraticBezier segment length - */ -declare const getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; -/** - * Returns the point along a QuadraticBezier segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to look at - * @returns the point at QuadraticBezier length - */ -declare const getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; -}; -/** - * Returns the boundig box of a QuadraticBezier segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the QuadraticBezier segment - */ -declare const getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; - -declare const quadTools_getPointAtQuadLength: typeof getPointAtQuadLength; -declare const quadTools_getPointAtQuadSegmentLength: typeof getPointAtQuadSegmentLength; -declare const quadTools_getQuadBBox: typeof getQuadBBox; -declare const quadTools_getQuadLength: typeof getQuadLength; -declare namespace quadTools { - export { quadTools_getPointAtQuadLength as getPointAtQuadLength, quadTools_getPointAtQuadSegmentLength as getPointAtQuadSegmentLength, quadTools_getQuadBBox as getQuadBBox, quadTools_getQuadLength as getQuadLength }; -} - -/** - * d3-polygon-area - * https://github.com/d3/d3-polygon - * - * Returns the area of a polygon. - * - * @param polygon an array of coordinates - * @returns the polygon area - */ -declare const polygonArea: (polygon: PointTuple[]) => number; -/** - * d3-polygon-length - * https://github.com/d3/d3-polygon - * - * Returns the perimeter of a polygon. - * - * @param polygon an array of coordinates - * @returns the polygon length - */ -declare const polygonLength: (polygon: PointTuple[]) => number; - -declare const polygonTools_polygonArea: typeof polygonArea; -declare const polygonTools_polygonLength: typeof polygonLength; -declare namespace polygonTools { - export { polygonTools_polygonArea as polygonArea, polygonTools_polygonLength as polygonLength }; -} - -/** - * Parses a path string value or object and returns an array - * of segments, all converted to absolute values. - * - * @param pathInput the path string | object - * @returns the resulted `pathArray` with absolute values - */ -declare const pathToAbsolute: (pathInput: string | PathArray) => AbsoluteArray; - -/** - * Parses a path string value or object and returns an array - * of segments, all converted to relative values. - * - * @param pathInput the path string | object - * @returns the resulted `pathArray` with relative values - */ -declare const pathToRelative: (pathInput: string | PathArray) => RelativeArray; - -/** - * Parses a path string value or 'pathArray' and returns a new one - * in which all segments are converted to cubic-bezier. - * - * In addition, un-necessary `Z` segment is removed if previous segment - * extends to the `M` segment. - * - * @param pathInput the string to be parsed or 'pathArray' - * @returns the resulted `pathArray` converted to cubic-bezier - */ -declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; - -/** - * Returns a valid `d` attribute string value created - * by rounding values and concatenating the `pathArray` segments. - * - * @param path the `pathArray` object - * @param roundOption amount of decimals to round values to - * @returns the concatenated path string - */ -declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; - -/** - * Returns the square root of the distance - * between two given points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @returns the distance value - */ -declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; - -/** - * Returns the coordinates of a specified distance - * ratio between two points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @param t the ratio - * @returns the midpoint coordinates - */ -declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; - -/** - * Returns an {x,y} vector rotated by a given - * angle in radian. - * - * @param x the initial vector x - * @param y the initial vector y - * @param rad the radian vector angle - * @returns the rotated vector - */ -declare const rotateVector: (x: number, y: number, rad: number) => { - x: number; - y: number; -}; - -declare const roundTo: (n: number, round: number) => number; - -/** - * Parses a path string value and returns an array - * of segments we like to call `pathArray`. - * - * @param pathInput the string to be parsed - * @returns the resulted `pathArray` or error string - */ -declare const parsePathString: (pathInput: string | T) => PathArray; - -/** - * The `PathParser` is used by the `parsePathString` static method - * to generate a `pathArray`. - * - * @param pathString - */ -declare class PathParser { - segments: PathArray | PathSegment[]; - pathValue: string; - max: number; - index: number; - param: number; - segmentStart: number; - data: (string | number)[]; - err: string; - constructor(pathString: string); -} - -/** - * Breaks the parsing of a pathString once a segment is finalized. - * - * @param path the `PathParser` instance - */ -declare const finalizeSegment: (path: PathParser) => void; - -declare const invalidPathValue = "Invalid path value"; - -/** - * Checks if the character is an A (arc-to) path command. - * - * @param code the character to check - * @returns check result - */ -declare const isArcCommand: (code: number) => code is 97; - -/** - * Checks if a character is a digit. - * - * @param code the character to check - * @returns check result - */ -declare const isDigit: (code: number) => code is DigitNumber; - -/** - * Checks if the character is or belongs to a number. - * [0-9]|+|-|. - * - * @param code the character to check - * @returns check result - */ -declare const isDigitStart: (code: number) => code is DigitNumber | 43 | 45 | 46; - -/** - * Checks if the character is a MoveTo command. - * - * @param code the character to check - * @returns check result - */ -declare const isMoveCommand: (code: number) => code is 109 | 77; - -/** - * Checks if the character is a path command. - * - * @param code the character to check - * @returns check result - */ -declare const isPathCommand: (code: number) => code is PathCommandNumber; - -/** - * Checks if the character is a space. - * - * @param ch the character to check - * @returns check result - */ -declare const isSpace: (ch: number) => ch is SpaceNumber; - -/** Segment params length */ -declare const paramsCount: { - a: number; - c: number; - h: number; - l: number; - m: number; - r: number; - q: number; - s: number; - t: number; - v: number; - z: number; -}; - -declare const paramsParser: ParserParams; - -/** - * Validates an A (arc-to) specific path command value. - * Usually a `large-arc-flag` or `sweep-flag`. - * - * @param path the `PathParser` instance - */ -declare const scanFlag: (path: PathParser) => void; - -/** - * Validates every character of the path string, - * every path command, negative numbers or floating point numbers. - * - * @param path the `PathParser` instance - */ -declare const scanParam: (path: PathParser) => void; - -/** - * Scans every character in the path string to determine - * where a segment starts and where it ends. - * - * @param path the `PathParser` instance - */ -declare const scanSegment: (path: PathParser) => void; - -/** - * Points the parser to the next character in the - * path string every time it encounters any kind of - * space character. - * - * @param path the `PathParser` instance - */ -declare const skipSpaces: (path: PathParser) => void; - -declare const DISTANCE_EPSILON = 0.00001; - -/** - * Returns the point in path closest to a given point. - * - * @param pathInput target `pathArray` - * @param point the given point - * @returns the best match - */ -declare const getClosestPoint: (pathInput: string | PathArray, point: { - x: number; - y: number; -}) => { - x: number; - y: number; -}; - -/** - * Check if a path is drawn clockwise and returns true if so, - * false otherwise. - * - * @param path the path string or `pathArray` - * @returns true when clockwise or false if not - */ -declare const getDrawDirection: (path: string | PathArray) => boolean; - -/** - * Returns the area of a shape. - * - * @author Jürg Lehni & Jonathan Puckey - * - * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js - * - * @param path the shape `pathArray` - * @returns the length of the cubic-bezier segment - */ -declare const getPathArea: (path: PathArray) => number; - -declare const getPathBBox: (pathInput: PathArray | string) => { - x: number; - y: number; - width: number; - height: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; -}; - -/** - * Returns [x,y] coordinates of a point at a given length of a shape. - * - * @param pathInput the `pathArray` to look into - * @param distance the length of the shape to look at - * @returns the requested {x, y} point coordinates - */ -declare const getPointAtLength: (pathInput: string | PathArray, distance?: number) => { - x: number; - y: number; -}; - -/** - * Returns the segment, its index and length as well as - * the length to that segment at a given length in a path. - * - * @param pathInput target `pathArray` - * @param distance the given length - * @returns the requested properties - */ -declare const getPropertiesAtLength: (pathInput: string | PathArray, distance?: number) => SegmentProperties; - -/** - * Returns the point and segment in path closest to a given point as well as - * the distance to the path stroke. - * - * @see https://bl.ocks.org/mbostock/8027637 - * - * @param pathInput target `pathArray` - * @param point the given point - * @returns the requested properties - */ -declare const getPropertiesAtPoint: (pathInput: string | PathArray, point: Point) => PointProperties; - -/** - * Returns the segment at a given length. - * - * @param pathInput the target `pathArray` - * @param distance the distance in path to look at - * @returns the requested segment - */ -declare const getSegmentAtLength: (pathInput: string | PathArray, distance?: number) => PathSegment | undefined; - -/** - * Returns the path segment which contains a given point. - * - * @param path the `pathArray` to look into - * @param point the point of the shape to look for - * @returns the requested segment - */ -declare const getSegmentOfPoint: (path: string | PathArray, point: { - x: number; - y: number; -}) => SegmentProperties | undefined; - -/** - * Returns the shape total length, or the equivalent to `shape.getTotalLength()`. - * - * @param pathInput the target `pathArray` - * @returns the shape total length - */ -declare const getTotalLength: (pathInput: string | PathArray) => number; - -/** - * Iterates an array to check if it's a `pathArray` - * with all absolute values. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isAbsoluteArray: (path: unknown) => path is AbsoluteArray; - -/** - * Iterates an array to check if it's a `pathArray` - * with all C (cubic bezier) segments. - * - * @param path the `Array` to be checked - * @returns iteration result - */ -declare const isCurveArray: (path: unknown) => path is CurveArray; - -/** - * Iterates an array to check if it's a `pathArray` - * with all segments are in non-shorthand notation - * with absolute values. - * - * @param {string | SVGPath.pathArray} path the `pathArray` to be checked - * @returns {boolean} iteration result - */ -declare const isNormalizedArray: (path: unknown) => path is NormalArray; - -/** - * Iterates an array to check if it's an actual `pathArray`. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isPathArray: (path: unknown) => path is PathArray; - -/** - * Checks if a given point is in the stroke of a path. - * - * @param pathInput target path - * @param point the given `{x,y}` point - * @returns the query result - */ -declare const isPointInStroke: (pathInput: string | PathArray, point: { - x: number; - y: number; -}) => boolean; - -/** - * Iterates an array to check if it's a `pathArray` - * with relative values. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isRelativeArray: (path: unknown) => path is RelativeArray; - -/** - * Parses a path string value to determine its validity - * then returns true if it's valid or false otherwise. - * - * @param pathString the path string to be parsed - * @returns the path string validity - */ -declare const isValidPath: (pathString: string) => boolean; - -/** - * Supported shapes and their specific parameters. - */ -declare const shapeParams: ShapeParams; - -/** - * Returns a new `` element created from attributes of a ``, ``, - * ``, ``, ``, `` or ``. If `replace` parameter - * is `true`, it will replace the target. The default `ownerDocument` is your current - * `document` browser page, if you want to use in server-side using `jsdom`, you can - * pass the `jsdom` `document` to `ownDocument`. - * - * It can also work with an options object, see the type below - * @see ShapeOps - * - * The newly created `` element keeps all non-specific - * attributes like `class`, `fill`, etc. - * - * @param element target shape - * @param replace option to replace target - * @param ownerDocument document for create element - * @return the newly created `` element - */ -declare const shapeToPath: (element: ShapeTypes | ShapeOps, replace?: boolean, ownerDocument?: Document) => SVGPathElement | false; - -/** - * Returns a new `pathArray` created from attributes of a ``, ``, - * ``, ``, ``, ``, or ``. - * - * It can also work with an options object, see the type below - * @see ShapeOps - * - * @param element target shape - * @return the newly created `` element - */ -declare const shapeToPathArray: (element: ShapeTypes | ShapeOps) => false | PathArray; - -/** - * Returns an absolute segment of a `PathArray` object. - * - * @param segment the segment object - * @param index the segment index - * @param lastX the last known X value - * @param lastY the last known Y value - * @returns the absolute segment - */ -declare const absolutizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => AbsoluteSegment; - -/** - * Converts A (arc-to) segments to C (cubic-bezier-to). - * - * For more information of where this math came from visit: - * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes - * - * @param X1 the starting x position - * @param Y1 the starting y position - * @param RX x-radius of the arc - * @param RY y-radius of the arc - * @param angle x-axis-rotation of the arc - * @param LAF large-arc-flag of the arc - * @param SF sweep-flag of the arc - * @param X2 the ending x position - * @param Y2 the ending y position - * @param recursive the parameters needed to split arc into 2 segments - * @return the resulting cubic-bezier segment(s) - */ -declare const arcToCubic: (X1: number, Y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, X2: number, Y2: number, recursive?: [number, number, number, number]) => number[]; - -/** - * Returns a transformation matrix to apply to `` elements. - * - * @see TransformObjectValues - * - * @param transform the `transformObject` - * @returns a new transformation matrix - */ -declare const getSVGMatrix: (transform: TransformObjectValues) => CSSMatrix; - -declare const iterate: (path: PathArray, iterator: IteratorCallback) => T; - -/** - * Converts an L (line-to) segment to C (cubic-bezier). - * - * @param x1 line start x - * @param y1 line start y - * @param x2 line end x - * @param y2 line end y - * @returns the cubic-bezier segment - */ -declare const lineToCubic: (x1: number, y1: number, x2: number, y2: number) => number[]; - -/** - * Normalizes a `pathArray` object for further processing: - * * convert segments to absolute values - * * convert shorthand path commands to their non-shorthand notation - * - * @param pathInput the string to be parsed or 'pathArray' - * @returns the normalized `pathArray` - */ -declare const normalizePath: (pathInput: string | PathArray) => NormalArray; - -/** - * Normalizes a single segment of a `pathArray` object. - * - * @param segment the segment object - * @param params the normalization parameters - * @returns the normalized segment - */ -declare const normalizeSegment: (segment: PathSegment, params: ParserParams) => NormalSegment; - -/** - * Optimizes a `pathArray` object: - * * convert segments to shorthand if possible - * * select shortest segments from absolute and relative `pathArray`s - * - * @param pathInput a string or `pathArray` - * @param roundOption the amount of decimals to round values to - * @returns the optimized `pathArray` - */ -declare const optimizePath: (pathInput: PathArray, roundOption?: number) => PathArray; - -/** - * Returns the [x,y] projected coordinates for a given an [x,y] point - * and an [x,y,z] perspective origin point. - * - * Equation found here => - * http://en.wikipedia.org/wiki/3D_projection#Diagram - * Details => - * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel - * - * @param m the transformation matrix - * @param point2D the initial [x,y] coordinates - * @param origin the [x,y,z] transform origin - * @returns the projected [x,y] coordinates - */ -declare const projection2d: (m: CSSMatrix, point2D: PointTuple, origin: [number, number, number]) => PointTuple; - -/** - * Converts a Q (quadratic-bezier) segment to C (cubic-bezier). - * - * @param x1 curve start x - * @param y1 curve start y - * @param qx control point x - * @param qy control point y - * @param x2 curve end x - * @param y2 curve end y - * @returns the cubic-bezier segment - */ -declare const quadToCubic: (x1: number, y1: number, qx: number, qy: number, x2: number, y2: number) => [number, number, number, number, number, number]; - -/** - * Returns a relative segment of a `PathArray` object. - * - * @param segment the segment object - * @param index the segment index - * @param lastX the last known X value - * @param lastY the last known Y value - * @returns the relative segment - */ -declare const relativizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => MSegment | RelativeSegment; - -/** - * Reverses all segments of a `pathArray` - * which consists of only C (cubic-bezier) path commands. - * - * @param path the source `pathArray` - * @returns the reversed `pathArray` - */ -declare const reverseCurve: (path: CurveArray) => CurveArray; - -/** - * Reverses all segments of a `pathArray` and returns a new `pathArray` instance - * with absolute values. - * - * @param pathInput the source `pathArray` - * @returns the reversed `pathArray` - */ -declare const reversePath: (pathInput: PathArray) => PathArray; - -/** - * Rounds the values of a `pathArray` instance to - * a specified amount of decimals and returns it. - * - * @param path the source `pathArray` - * @param roundOption the amount of decimals to round numbers to - * @returns the resulted `pathArray` with rounded values - */ -declare const roundPath: (path: PathArray, roundOption?: number | "off") => PathArray; - -declare const roundSegment: (segment: T, roundOption: number) => T; - -/** - * Converts any segment to C (cubic-bezier). - * - * @param segment the source segment - * @param params the source segment parameters - * @returns the cubic-bezier segment - */ -declare const segmentToCubic: (segment: PathSegment, params: ParserParams) => MSegment | CSegment; - -/** - * Shorten a single segment of a `pathArray` object. - * - * @param segment the `absoluteSegment` object - * @param normalSegment the `normalSegment` object - * @param params the coordinates of the previous segment - * @param prevCommand the path command of the previous segment - * @returns the shortened segment - */ -declare const shortenSegment: (segment: AbsoluteSegment, normalSegment: NormalSegment, params: ParserParams, prevCommand: PathCommand) => ShortSegment; - -/** - * Split a cubic-bezier segment into two. - * - * @param pts the cubic-bezier parameters - * @param ratio the cubic-bezier parameters - * @return two new cubic-bezier segments - */ -declare const splitCubic: (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; - -/** - * Split a path into an `Array` of sub-path strings. - * - * In the process, values are converted to absolute - * for visual consistency. - * - * @param pathInput the source `pathArray` - * @return an array with all sub-path strings - */ -declare const splitPath: (pathInput: PathArray) => PathArray[]; - -/** - * Apply a 2D / 3D transformation to a `pathArray` instance. - * - * Since *SVGElement* doesn't support 3D transformation, this function - * creates a 2D projection of the element. - * - * @param path the `pathArray` to apply transformation - * @param transform the transform functions `Object` - * @returns the resulted `pathArray` - */ -declare const transformPath: (pathInput: PathArray | string, transform?: Partial) => PathArray; - -export { absolutizeSegment, arcToCubic, arcTools, bezier as bezierTools, cubicTools, DISTANCE_EPSILON as distanceEpsilon, distanceSquareRoot, finalizeSegment, getClosestPoint, getDrawDirection, getPathArea, getPathBBox, getPointAtLength, getPropertiesAtLength, getPropertiesAtPoint, getSVGMatrix, getSegmentAtLength, getSegmentOfPoint, getTotalLength, invalidPathValue, isAbsoluteArray, isArcCommand, isCurveArray, isDigit, isDigitStart, isMoveCommand, isNormalizedArray, isPathArray, isPathCommand, isPointInStroke, isRelativeArray, isSpace, isValidPath, iterate, lineToCubic, lineTools, midPoint, normalizePath, normalizeSegment, optimizePath, paramsCount, paramsParser, parsePathString, PathParser as pathParser, pathToAbsolute, pathToCurve, pathToRelative, pathToString, polygonTools, projection2d, quadToCubic, quadTools, relativizeSegment, reverseCurve, reversePath, rotateVector, roundPath, roundSegment, roundTo, scanFlag, scanParam, scanSegment, segmentToCubic, shapeParams, shapeToPath, shapeToPathArray, shortenSegment, skipSpaces, splitCubic, splitPath, transformPath }; diff --git a/dist/util/util.d.ts b/dist/util/util.d.ts deleted file mode 100644 index 7d522ae..0000000 --- a/dist/util/util.d.ts +++ /dev/null @@ -1,1255 +0,0 @@ -import CSSMatrix from '@thednp/dommatrix'; -export { default as CSSMatrix } from '@thednp/dommatrix'; - -type SegmentProperties = { - segment: PathSegment; - index: number; - length: number; - lengthAtSegment: number; -}; -type PointProperties = { - closest: { - x: number; - y: number; - }; - distance: number; - segment?: SegmentProperties; -}; -type LineAttr = { - type: "line"; - x1: number; - y1: number; - x2: number; - y2: number; - [key: string]: string | number; -}; -type PolyAttr = { - type: "polygon" | "polyline"; - points: string; - [key: string]: string | number; -}; -type CircleAttr = { - type: "circle"; - cx: number; - cy: number; - r: number; - [key: string]: string | number; -}; -type EllipseAttr = { - type: "ellipse"; - cx: number; - cy: number; - rx: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type RectAttr = { - type: "rect"; - width: number; - height: number; - x: number; - y: number; - rx?: number; - ry?: number; - [key: string]: string | number | undefined; -}; -type GlyphAttr = { - type: "glyph"; - d: string; - [key: string]: string | number; -}; -type ShapeParams = { - line: ["x1", "y1", "x2", "y2"]; - circle: ["cx", "cy", "r"]; - ellipse: ["cx", "cy", "rx", "ry"]; - rect: ["width", "height", "x", "y", "rx", "ry"]; - polygon: ["points"]; - polyline: ["points"]; - glyph: ["d"]; -}; -type ParserParams = { - x1: number; - y1: number; - x2: number; - y2: number; - x: number; - y: number; - qx: number | null; - qy: number | null; -}; -type TransformObject = { - translate: number | number[]; - rotate: number | number[]; - scale: number | number[]; - skew: number | number[]; - origin: number[]; -}; - -type SpaceNumber = 0x1680 | 0x180e | 0x2000 | 0x2001 | 0x2002 | 0x2003 | 0x2004 | 0x2005 | 0x2006 | 0x2007 | 0x2008 | 0x2009 | 0x200a | 0x202f | 0x205f | 0x3000 | 0xfeff | 0x0a | 0x0d | 0x2028 | 0x2029 | 0x20 | 0x09 | 0x0b | 0x0c | 0xa0 | 0x1680; -type PathCommandNumber = 0x6d | 0x7a | 0x6c | 0x68 | 0x76 | 0x63 | 0x73 | 0x71 | 0x74 | 0x61; -type DigitNumber = 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39; -type MCommand = "M"; -type mCommand = "m"; -type LCommand = "L"; -type lCommand = "l"; -type VCommand = "V"; -type vCommand = "v"; -type HCommand = "H"; -type hCommand = "h"; -type ZCommand = "Z"; -type zCommand = "z"; -type CCommand = "C"; -type cCommand = "c"; -type SCommand = "S"; -type sCommand = "s"; -type QCommand = "Q"; -type qCommand = "q"; -type TCommand = "T"; -type tCommand = "t"; -type ACommand = "A"; -type aCommand = "a"; -type AbsoluteCommand = MCommand | LCommand | VCommand | HCommand | ZCommand | CCommand | SCommand | QCommand | TCommand | ACommand; -type RelativeCommand = mCommand | lCommand | vCommand | hCommand | zCommand | cCommand | sCommand | qCommand | tCommand | aCommand; -type PathCommand = AbsoluteCommand | RelativeCommand; -type MSegment = [MCommand, number, number]; -type mSegment = [mCommand, number, number]; -type MoveSegment = MSegment | mSegment; -type LSegment = [LCommand, number, number]; -type lSegment = [lCommand, number, number]; -type LineSegment = LSegment | lSegment; -type VSegment = [VCommand, number]; -type vSegment = [vCommand, number]; -type VertLineSegment = vSegment | VSegment; -type HSegment = [HCommand, number]; -type hSegment = [hCommand, number]; -type HorLineSegment = HSegment | hSegment; -type ZSegment = [ZCommand]; -type zSegment = [zCommand]; -type CloseSegment = ZSegment | zSegment; -type CSegment = [ - CCommand, - number, - number, - number, - number, - number, - number -]; -type cSegment = [ - cCommand, - number, - number, - number, - number, - number, - number -]; -type CubicSegment = CSegment | cSegment; -type SSegment = [SCommand, number, number, number, number]; -type sSegment = [sCommand, number, number, number, number]; -type ShortCubicSegment = SSegment | sSegment; -type QSegment = [QCommand, number, number, number, number]; -type qSegment = [qCommand, number, number, number, number]; -type QuadSegment = QSegment | qSegment; -type TSegment = [TCommand, number, number]; -type tSegment = [tCommand, number, number]; -type ShortQuadSegment = TSegment | tSegment; -type ASegment = [ - ACommand, - number, - number, - number, - number, - number, - number, - number -]; -type aSegment = [ - aCommand, - number, - number, - number, - number, - number, - number, - number -]; -type ArcSegment = ASegment | aSegment; -type PathSegment = MoveSegment | LineSegment | VertLineSegment | HorLineSegment | CloseSegment | CubicSegment | ShortCubicSegment | QuadSegment | ShortQuadSegment | ArcSegment; -type ShortSegment = VertLineSegment | HorLineSegment | ShortCubicSegment | ShortQuadSegment | CloseSegment; -type AbsoluteSegment = MSegment | LSegment | VSegment | HSegment | CSegment | SSegment | QSegment | TSegment | ASegment | ZSegment; -type RelativeSegment = mSegment | lSegment | vSegment | hSegment | cSegment | sSegment | qSegment | tSegment | aSegment | zSegment; -type NormalSegment = MSegment | LSegment | CSegment | QSegment | ASegment | ZSegment; -type PathArray = [MSegment | mSegment, ...PathSegment[]]; -type AbsoluteArray = [MSegment, ...AbsoluteSegment[]]; -type RelativeArray = [MSegment, ...RelativeSegment[]]; -type NormalArray = [MSegment, ...NormalSegment[]]; -type CurveArray = [MSegment, ...CSegment[]]; -type ShapeTypes = SVGPolylineElement | SVGPolygonElement | SVGLineElement | SVGEllipseElement | SVGCircleElement | SVGRectElement; -type ShapeOps = LineAttr | PolyAttr | PolyAttr | EllipseAttr | CircleAttr | RectAttr | GlyphAttr; -type TransformObjectValues = Partial & { - origin: [number, number, number]; -}; -type Point = { - x: number; - y: number; -}; -type PointTuple = [number, number]; -type DerivedPoint = Point & { - t: number; -}; -type QuadPoints = [Point, Point, Point, Point, Point, Point]; -type CubicPoints = [ - Point, - Point, - Point, - Point, - Point, - Point, - Point, - Point -]; -type DerivedQuadPoints = [ - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint -]; -type DerivedCubicPoints = [ - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint -]; -type QuadCoordinates = [number, number, number, number, number, number]; -type CubicCoordinates = [ - number, - number, - number, - number, - number, - number, - number, - number -]; -type DeriveCallback = (t: number) => Point; -type IteratorCallback = (segment: PathSegment, index: number, lastX: number, lastY: number) => PathSegment | false | void | undefined; - -/** - * Returns the Arc segment length. - * @param rx radius along X axis - * @param ry radius along Y axis - * @param theta the angle in radians - * @returns the arc length - */ -declare const arcLength: (rx: number, ry: number, theta: number) => number; -/** - * Find point on ellipse at given angle around ellipse (theta); - * @param cx the center X - * @param cy the center Y - * @param rx the radius X - * @param ry the radius Y - * @param alpha the arc rotation angle in radians - * @param theta the arc sweep angle in radians - * @returns a point around ellipse at given angle - */ -declare const arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; -/** - * Returns the angle between two points. - * @param v0 starting point - * @param v1 ending point - * @returns the angle in radian - */ -declare const angleBetween: (v0: Point, v1: Point) => number; -/** - * Returns the following properties for an Arc segment: center, start angle, - * end angle, and radiuses on X and Y axis. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns properties specific to Arc segments - */ -declare const getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { - rx: number; - ry: number; - startAngle: number; - endAngle: number; - center: { - x: number; - y: number; - }; -}; -/** - * Returns the length of an Arc segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the length of the Arc segment - */ -declare const getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; -/** - * Returns a point along an Arc segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance a [0-1] ratio - * @returns a point along the Arc segment - */ -declare const getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { - x: number; - y: number; -}; -/** - * Returns the extrema for an Arc segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @see https://github.com/herrstrietzel/svg-pathdata-getbbox - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the Arc segment - */ -declare const getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; - -declare const arcTools_angleBetween: typeof angleBetween; -declare const arcTools_arcLength: typeof arcLength; -declare const arcTools_arcPoint: typeof arcPoint; -declare const arcTools_getArcBBox: typeof getArcBBox; -declare const arcTools_getArcLength: typeof getArcLength; -declare const arcTools_getArcProps: typeof getArcProps; -declare const arcTools_getPointAtArcLength: typeof getPointAtArcLength; -declare namespace arcTools { - export { arcTools_angleBetween as angleBetween, arcTools_arcLength as arcLength, arcTools_arcPoint as arcPoint, arcTools_getArcBBox as getArcBBox, arcTools_getArcLength as getArcLength, arcTools_getArcProps as getArcProps, arcTools_getPointAtArcLength as getPointAtArcLength }; -} - -/** - * Tools from bezier.js by Mike 'Pomax' Kamermans - * @see https://github.com/Pomax/bezierjs - */ -declare const Tvalues: number[]; -declare const Cvalues: number[]; -/** - * @param points - * @returns - */ -declare const deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; -/** - * @param points - * @param t - */ -declare const computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; -declare const calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; -declare const bezierLength: (derivativeFn: DeriveCallback) => number; -/** - * Returns the length of CubicBezier / Quad segment. - * @param curve cubic / quad bezier segment - */ -declare const getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; -declare const CBEZIER_MINMAX_EPSILON = 1e-8; -/** - * Returns the most extreme points in a Quad Bezier segment. - * @param A an array which consist of X/Y values - */ -declare const minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; -/** - * Returns the most extreme points in a Cubic Bezier segment. - * @param A an array which consist of X/Y values - * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127 - */ -declare const minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; - -declare const bezier_CBEZIER_MINMAX_EPSILON: typeof CBEZIER_MINMAX_EPSILON; -declare const bezier_Cvalues: typeof Cvalues; -declare const bezier_Tvalues: typeof Tvalues; -declare const bezier_bezierLength: typeof bezierLength; -declare const bezier_calculateBezier: typeof calculateBezier; -declare const bezier_computeBezier: typeof computeBezier; -declare const bezier_deriveBezier: typeof deriveBezier; -declare const bezier_getBezierLength: typeof getBezierLength; -declare const bezier_minmaxC: typeof minmaxC; -declare const bezier_minmaxQ: typeof minmaxQ; -declare namespace bezier { - export { bezier_CBEZIER_MINMAX_EPSILON as CBEZIER_MINMAX_EPSILON, bezier_Cvalues as Cvalues, bezier_Tvalues as Tvalues, bezier_bezierLength as bezierLength, bezier_calculateBezier as calculateBezier, bezier_computeBezier as computeBezier, bezier_deriveBezier as deriveBezier, bezier_getBezierLength as getBezierLength, bezier_minmaxC as minmaxC, bezier_minmaxQ as minmaxQ }; -} - -/** - * Returns a point at a given length of a CubicBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param t a [0-1] ratio - * @returns the point at cubic-bezier segment length - */ -declare const getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { - x: number; - y: number; -}; -/** - * Returns the length of a CubicBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the CubicBezier segment length - */ -declare const getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; -/** - * Returns the point along a CubicBezier segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to look at - * @returns the point at CubicBezier length - */ -declare const getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; -}; -/** - * Returns the boundig box of a CubicBezier segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the CubicBezier segment - */ -declare const getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; - -declare const cubicTools_getCubicBBox: typeof getCubicBBox; -declare const cubicTools_getCubicLength: typeof getCubicLength; -declare const cubicTools_getPointAtCubicLength: typeof getPointAtCubicLength; -declare const cubicTools_getPointAtCubicSegmentLength: typeof getPointAtCubicSegmentLength; -declare namespace cubicTools { - export { cubicTools_getCubicBBox as getCubicBBox, cubicTools_getCubicLength as getCubicLength, cubicTools_getPointAtCubicLength as getPointAtCubicLength, cubicTools_getPointAtCubicSegmentLength as getPointAtCubicSegmentLength }; -} - -/** - * Returns length for line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the line segment length - */ -declare const getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; -/** - * Returns a point along the line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to point in [0-1] range - * @returns the point at length - */ -declare const getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; -}; -/** - * Returns bounding box for line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to point in [0-1] range - * @returns the extrema for line segments - */ -declare const getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; - -declare const lineTools_getLineBBox: typeof getLineBBox; -declare const lineTools_getLineLength: typeof getLineLength; -declare const lineTools_getPointAtLineLength: typeof getPointAtLineLength; -declare namespace lineTools { - export { lineTools_getLineBBox as getLineBBox, lineTools_getLineLength as getLineLength, lineTools_getPointAtLineLength as getPointAtLineLength }; -} - -/** - * Returns the {x,y} coordinates of a point at a - * given length of a quadratic-bezier segment. - * - * @see https://github.com/substack/point-at-length - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param t a [0-1] ratio - * @returns the requested {x,y} coordinates - */ -declare const getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { - x: number; - y: number; -}; -/** - * Returns the length of a QuadraticBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the QuadraticBezier segment length - */ -declare const getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; -/** - * Returns the point along a QuadraticBezier segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to look at - * @returns the point at QuadraticBezier length - */ -declare const getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; -}; -/** - * Returns the boundig box of a QuadraticBezier segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the QuadraticBezier segment - */ -declare const getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; - -declare const quadTools_getPointAtQuadLength: typeof getPointAtQuadLength; -declare const quadTools_getPointAtQuadSegmentLength: typeof getPointAtQuadSegmentLength; -declare const quadTools_getQuadBBox: typeof getQuadBBox; -declare const quadTools_getQuadLength: typeof getQuadLength; -declare namespace quadTools { - export { quadTools_getPointAtQuadLength as getPointAtQuadLength, quadTools_getPointAtQuadSegmentLength as getPointAtQuadSegmentLength, quadTools_getQuadBBox as getQuadBBox, quadTools_getQuadLength as getQuadLength }; -} - -/** - * d3-polygon-area - * https://github.com/d3/d3-polygon - * - * Returns the area of a polygon. - * - * @param polygon an array of coordinates - * @returns the polygon area - */ -declare const polygonArea: (polygon: PointTuple[]) => number; -/** - * d3-polygon-length - * https://github.com/d3/d3-polygon - * - * Returns the perimeter of a polygon. - * - * @param polygon an array of coordinates - * @returns the polygon length - */ -declare const polygonLength: (polygon: PointTuple[]) => number; - -declare const polygonTools_polygonArea: typeof polygonArea; -declare const polygonTools_polygonLength: typeof polygonLength; -declare namespace polygonTools { - export { polygonTools_polygonArea as polygonArea, polygonTools_polygonLength as polygonLength }; -} - -/** - * Parses a path string value or object and returns an array - * of segments, all converted to absolute values. - * - * @param pathInput the path string | object - * @returns the resulted `pathArray` with absolute values - */ -declare const pathToAbsolute: (pathInput: string | PathArray) => AbsoluteArray; - -/** - * Parses a path string value or object and returns an array - * of segments, all converted to relative values. - * - * @param pathInput the path string | object - * @returns the resulted `pathArray` with relative values - */ -declare const pathToRelative: (pathInput: string | PathArray) => RelativeArray; - -/** - * Parses a path string value or 'pathArray' and returns a new one - * in which all segments are converted to cubic-bezier. - * - * In addition, un-necessary `Z` segment is removed if previous segment - * extends to the `M` segment. - * - * @param pathInput the string to be parsed or 'pathArray' - * @returns the resulted `pathArray` converted to cubic-bezier - */ -declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; - -/** - * Returns a valid `d` attribute string value created - * by rounding values and concatenating the `pathArray` segments. - * - * @param path the `pathArray` object - * @param roundOption amount of decimals to round values to - * @returns the concatenated path string - */ -declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; - -/** - * Returns the square root of the distance - * between two given points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @returns the distance value - */ -declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; - -/** - * Returns the coordinates of a specified distance - * ratio between two points. - * - * @param a the first point coordinates - * @param b the second point coordinates - * @param t the ratio - * @returns the midpoint coordinates - */ -declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; - -/** - * Returns an {x,y} vector rotated by a given - * angle in radian. - * - * @param x the initial vector x - * @param y the initial vector y - * @param rad the radian vector angle - * @returns the rotated vector - */ -declare const rotateVector: (x: number, y: number, rad: number) => { - x: number; - y: number; -}; - -declare const roundTo: (n: number, round: number) => number; - -/** - * Parses a path string value and returns an array - * of segments we like to call `pathArray`. - * - * @param pathInput the string to be parsed - * @returns the resulted `pathArray` or error string - */ -declare const parsePathString: (pathInput: string | T) => PathArray; - -/** - * The `PathParser` is used by the `parsePathString` static method - * to generate a `pathArray`. - * - * @param pathString - */ -declare class PathParser { - segments: PathArray | PathSegment[]; - pathValue: string; - max: number; - index: number; - param: number; - segmentStart: number; - data: (string | number)[]; - err: string; - constructor(pathString: string); -} - -/** - * Breaks the parsing of a pathString once a segment is finalized. - * - * @param path the `PathParser` instance - */ -declare const finalizeSegment: (path: PathParser) => void; - -declare const invalidPathValue = "Invalid path value"; - -/** - * Checks if the character is an A (arc-to) path command. - * - * @param code the character to check - * @returns check result - */ -declare const isArcCommand: (code: number) => code is 97; - -/** - * Checks if a character is a digit. - * - * @param code the character to check - * @returns check result - */ -declare const isDigit: (code: number) => code is DigitNumber; - -/** - * Checks if the character is or belongs to a number. - * [0-9]|+|-|. - * - * @param code the character to check - * @returns check result - */ -declare const isDigitStart: (code: number) => code is DigitNumber | 43 | 45 | 46; - -/** - * Checks if the character is a MoveTo command. - * - * @param code the character to check - * @returns check result - */ -declare const isMoveCommand: (code: number) => code is 109 | 77; - -/** - * Checks if the character is a path command. - * - * @param code the character to check - * @returns check result - */ -declare const isPathCommand: (code: number) => code is PathCommandNumber; - -/** - * Checks if the character is a space. - * - * @param ch the character to check - * @returns check result - */ -declare const isSpace: (ch: number) => ch is SpaceNumber; - -/** Segment params length */ -declare const paramsCount: { - a: number; - c: number; - h: number; - l: number; - m: number; - r: number; - q: number; - s: number; - t: number; - v: number; - z: number; -}; - -declare const paramsParser: ParserParams; - -/** - * Validates an A (arc-to) specific path command value. - * Usually a `large-arc-flag` or `sweep-flag`. - * - * @param path the `PathParser` instance - */ -declare const scanFlag: (path: PathParser) => void; - -/** - * Validates every character of the path string, - * every path command, negative numbers or floating point numbers. - * - * @param path the `PathParser` instance - */ -declare const scanParam: (path: PathParser) => void; - -/** - * Scans every character in the path string to determine - * where a segment starts and where it ends. - * - * @param path the `PathParser` instance - */ -declare const scanSegment: (path: PathParser) => void; - -/** - * Points the parser to the next character in the - * path string every time it encounters any kind of - * space character. - * - * @param path the `PathParser` instance - */ -declare const skipSpaces: (path: PathParser) => void; - -declare const DISTANCE_EPSILON = 0.00001; - -/** - * Returns the point in path closest to a given point. - * - * @param pathInput target `pathArray` - * @param point the given point - * @returns the best match - */ -declare const getClosestPoint: (pathInput: string | PathArray, point: { - x: number; - y: number; -}) => { - x: number; - y: number; -}; - -/** - * Check if a path is drawn clockwise and returns true if so, - * false otherwise. - * - * @param path the path string or `pathArray` - * @returns true when clockwise or false if not - */ -declare const getDrawDirection: (path: string | PathArray) => boolean; - -/** - * Returns the area of a shape. - * - * @author Jürg Lehni & Jonathan Puckey - * - * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js - * - * @param path the shape `pathArray` - * @returns the length of the cubic-bezier segment - */ -declare const getPathArea: (path: PathArray) => number; - -declare const getPathBBox: (pathInput: PathArray | string) => { - x: number; - y: number; - width: number; - height: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; -}; - -/** - * Returns [x,y] coordinates of a point at a given length of a shape. - * - * @param pathInput the `pathArray` to look into - * @param distance the length of the shape to look at - * @returns the requested {x, y} point coordinates - */ -declare const getPointAtLength: (pathInput: string | PathArray, distance?: number) => { - x: number; - y: number; -}; - -/** - * Returns the segment, its index and length as well as - * the length to that segment at a given length in a path. - * - * @param pathInput target `pathArray` - * @param distance the given length - * @returns the requested properties - */ -declare const getPropertiesAtLength: (pathInput: string | PathArray, distance?: number) => SegmentProperties; - -/** - * Returns the point and segment in path closest to a given point as well as - * the distance to the path stroke. - * - * @see https://bl.ocks.org/mbostock/8027637 - * - * @param pathInput target `pathArray` - * @param point the given point - * @returns the requested properties - */ -declare const getPropertiesAtPoint: (pathInput: string | PathArray, point: Point) => PointProperties; - -/** - * Returns the segment at a given length. - * - * @param pathInput the target `pathArray` - * @param distance the distance in path to look at - * @returns the requested segment - */ -declare const getSegmentAtLength: (pathInput: string | PathArray, distance?: number) => PathSegment | undefined; - -/** - * Returns the path segment which contains a given point. - * - * @param path the `pathArray` to look into - * @param point the point of the shape to look for - * @returns the requested segment - */ -declare const getSegmentOfPoint: (path: string | PathArray, point: { - x: number; - y: number; -}) => SegmentProperties | undefined; - -/** - * Returns the shape total length, or the equivalent to `shape.getTotalLength()`. - * - * @param pathInput the target `pathArray` - * @returns the shape total length - */ -declare const getTotalLength: (pathInput: string | PathArray) => number; - -/** - * Iterates an array to check if it's a `pathArray` - * with all absolute values. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isAbsoluteArray: (path: unknown) => path is AbsoluteArray; - -/** - * Iterates an array to check if it's a `pathArray` - * with all C (cubic bezier) segments. - * - * @param path the `Array` to be checked - * @returns iteration result - */ -declare const isCurveArray: (path: unknown) => path is CurveArray; - -/** - * Iterates an array to check if it's a `pathArray` - * with all segments are in non-shorthand notation - * with absolute values. - * - * @param {string | SVGPath.pathArray} path the `pathArray` to be checked - * @returns {boolean} iteration result - */ -declare const isNormalizedArray: (path: unknown) => path is NormalArray; - -/** - * Iterates an array to check if it's an actual `pathArray`. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isPathArray: (path: unknown) => path is PathArray; - -/** - * Checks if a given point is in the stroke of a path. - * - * @param pathInput target path - * @param point the given `{x,y}` point - * @returns the query result - */ -declare const isPointInStroke: (pathInput: string | PathArray, point: { - x: number; - y: number; -}) => boolean; - -/** - * Iterates an array to check if it's a `pathArray` - * with relative values. - * - * @param path the `pathArray` to be checked - * @returns iteration result - */ -declare const isRelativeArray: (path: unknown) => path is RelativeArray; - -/** - * Parses a path string value to determine its validity - * then returns true if it's valid or false otherwise. - * - * @param pathString the path string to be parsed - * @returns the path string validity - */ -declare const isValidPath: (pathString: string) => boolean; - -/** - * Supported shapes and their specific parameters. - */ -declare const shapeParams: ShapeParams; - -/** - * Returns a new `` element created from attributes of a ``, ``, - * ``, ``, ``, `` or ``. If `replace` parameter - * is `true`, it will replace the target. The default `ownerDocument` is your current - * `document` browser page, if you want to use in server-side using `jsdom`, you can - * pass the `jsdom` `document` to `ownDocument`. - * - * It can also work with an options object, see the type below - * @see ShapeOps - * - * The newly created `` element keeps all non-specific - * attributes like `class`, `fill`, etc. - * - * @param element target shape - * @param replace option to replace target - * @param ownerDocument document for create element - * @return the newly created `` element - */ -declare const shapeToPath: (element: ShapeTypes | ShapeOps, replace?: boolean, ownerDocument?: Document) => SVGPathElement | false; - -/** - * Returns a new `pathArray` created from attributes of a ``, ``, - * ``, ``, ``, ``, or ``. - * - * It can also work with an options object, see the type below - * @see ShapeOps - * - * @param element target shape - * @return the newly created `` element - */ -declare const shapeToPathArray: (element: ShapeTypes | ShapeOps) => false | PathArray; - -/** - * Returns an absolute segment of a `PathArray` object. - * - * @param segment the segment object - * @param index the segment index - * @param lastX the last known X value - * @param lastY the last known Y value - * @returns the absolute segment - */ -declare const absolutizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => AbsoluteSegment; - -/** - * Converts A (arc-to) segments to C (cubic-bezier-to). - * - * For more information of where this math came from visit: - * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes - * - * @param X1 the starting x position - * @param Y1 the starting y position - * @param RX x-radius of the arc - * @param RY y-radius of the arc - * @param angle x-axis-rotation of the arc - * @param LAF large-arc-flag of the arc - * @param SF sweep-flag of the arc - * @param X2 the ending x position - * @param Y2 the ending y position - * @param recursive the parameters needed to split arc into 2 segments - * @return the resulting cubic-bezier segment(s) - */ -declare const arcToCubic: (X1: number, Y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, X2: number, Y2: number, recursive?: [number, number, number, number]) => number[]; - -/** - * Returns a transformation matrix to apply to `` elements. - * - * @see TransformObjectValues - * - * @param transform the `transformObject` - * @returns a new transformation matrix - */ -declare const getSVGMatrix: (transform: TransformObjectValues) => CSSMatrix; - -declare const iterate: (path: PathArray, iterator: IteratorCallback) => T; - -/** - * Converts an L (line-to) segment to C (cubic-bezier). - * - * @param x1 line start x - * @param y1 line start y - * @param x2 line end x - * @param y2 line end y - * @returns the cubic-bezier segment - */ -declare const lineToCubic: (x1: number, y1: number, x2: number, y2: number) => number[]; - -/** - * Normalizes a `pathArray` object for further processing: - * * convert segments to absolute values - * * convert shorthand path commands to their non-shorthand notation - * - * @param pathInput the string to be parsed or 'pathArray' - * @returns the normalized `pathArray` - */ -declare const normalizePath: (pathInput: string | PathArray) => NormalArray; - -/** - * Normalizes a single segment of a `pathArray` object. - * - * @param segment the segment object - * @param params the normalization parameters - * @returns the normalized segment - */ -declare const normalizeSegment: (segment: PathSegment, params: ParserParams) => NormalSegment; - -/** - * Optimizes a `pathArray` object: - * * convert segments to shorthand if possible - * * select shortest segments from absolute and relative `pathArray`s - * - * @param pathInput a string or `pathArray` - * @param roundOption the amount of decimals to round values to - * @returns the optimized `pathArray` - */ -declare const optimizePath: (pathInput: PathArray, roundOption?: number) => PathArray; - -/** - * Returns the [x,y] projected coordinates for a given an [x,y] point - * and an [x,y,z] perspective origin point. - * - * Equation found here => - * http://en.wikipedia.org/wiki/3D_projection#Diagram - * Details => - * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel - * - * @param m the transformation matrix - * @param point2D the initial [x,y] coordinates - * @param origin the [x,y,z] transform origin - * @returns the projected [x,y] coordinates - */ -declare const projection2d: (m: CSSMatrix, point2D: PointTuple, origin: [number, number, number]) => PointTuple; - -/** - * Converts a Q (quadratic-bezier) segment to C (cubic-bezier). - * - * @param x1 curve start x - * @param y1 curve start y - * @param qx control point x - * @param qy control point y - * @param x2 curve end x - * @param y2 curve end y - * @returns the cubic-bezier segment - */ -declare const quadToCubic: (x1: number, y1: number, qx: number, qy: number, x2: number, y2: number) => [number, number, number, number, number, number]; - -/** - * Returns a relative segment of a `PathArray` object. - * - * @param segment the segment object - * @param index the segment index - * @param lastX the last known X value - * @param lastY the last known Y value - * @returns the relative segment - */ -declare const relativizeSegment: (segment: PathSegment, index: number, lastX: number, lastY: number) => MSegment | RelativeSegment; - -/** - * Reverses all segments of a `pathArray` - * which consists of only C (cubic-bezier) path commands. - * - * @param path the source `pathArray` - * @returns the reversed `pathArray` - */ -declare const reverseCurve: (path: CurveArray) => CurveArray; - -/** - * Reverses all segments of a `pathArray` and returns a new `pathArray` instance - * with absolute values. - * - * @param pathInput the source `pathArray` - * @returns the reversed `pathArray` - */ -declare const reversePath: (pathInput: PathArray) => PathArray; - -/** - * Rounds the values of a `pathArray` instance to - * a specified amount of decimals and returns it. - * - * @param path the source `pathArray` - * @param roundOption the amount of decimals to round numbers to - * @returns the resulted `pathArray` with rounded values - */ -declare const roundPath: (path: PathArray, roundOption?: number | "off") => PathArray; - -declare const roundSegment: (segment: T, roundOption: number) => T; - -/** - * Converts any segment to C (cubic-bezier). - * - * @param segment the source segment - * @param params the source segment parameters - * @returns the cubic-bezier segment - */ -declare const segmentToCubic: (segment: PathSegment, params: ParserParams) => MSegment | CSegment; - -/** - * Shorten a single segment of a `pathArray` object. - * - * @param segment the `absoluteSegment` object - * @param normalSegment the `normalSegment` object - * @param params the coordinates of the previous segment - * @param prevCommand the path command of the previous segment - * @returns the shortened segment - */ -declare const shortenSegment: (segment: AbsoluteSegment, normalSegment: NormalSegment, params: ParserParams, prevCommand: PathCommand) => ShortSegment; - -/** - * Split a cubic-bezier segment into two. - * - * @param pts the cubic-bezier parameters - * @param ratio the cubic-bezier parameters - * @return two new cubic-bezier segments - */ -declare const splitCubic: (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; - -/** - * Split a path into an `Array` of sub-path strings. - * - * In the process, values are converted to absolute - * for visual consistency. - * - * @param pathInput the source `pathArray` - * @return an array with all sub-path strings - */ -declare const splitPath: (pathInput: PathArray) => PathArray[]; - -/** - * Apply a 2D / 3D transformation to a `pathArray` instance. - * - * Since *SVGElement* doesn't support 3D transformation, this function - * creates a 2D projection of the element. - * - * @param path the `pathArray` to apply transformation - * @param transform the transform functions `Object` - * @returns the resulted `pathArray` - */ -declare const transformPath: (pathInput: PathArray | string, transform?: Partial) => PathArray; - -export { absolutizeSegment, arcToCubic, arcTools, bezier as bezierTools, cubicTools, DISTANCE_EPSILON as distanceEpsilon, distanceSquareRoot, finalizeSegment, getClosestPoint, getDrawDirection, getPathArea, getPathBBox, getPointAtLength, getPropertiesAtLength, getPropertiesAtPoint, getSVGMatrix, getSegmentAtLength, getSegmentOfPoint, getTotalLength, invalidPathValue, isAbsoluteArray, isArcCommand, isCurveArray, isDigit, isDigitStart, isMoveCommand, isNormalizedArray, isPathArray, isPathCommand, isPointInStroke, isRelativeArray, isSpace, isValidPath, iterate, lineToCubic, lineTools, midPoint, normalizePath, normalizeSegment, optimizePath, paramsCount, paramsParser, parsePathString, PathParser as pathParser, pathToAbsolute, pathToCurve, pathToRelative, pathToString, polygonTools, projection2d, quadToCubic, quadTools, relativizeSegment, reverseCurve, reversePath, rotateVector, roundPath, roundSegment, roundTo, scanFlag, scanParam, scanSegment, segmentToCubic, shapeParams, shapeToPath, shapeToPathArray, shortenSegment, skipSpaces, splitCubic, splitPath, transformPath }; diff --git a/dist/util/util.mjs b/dist/util/util.mjs deleted file mode 100644 index ee7c517..0000000 --- a/dist/util/util.mjs +++ /dev/null @@ -1,3 +0,0 @@ -import jr from'@thednp/dommatrix';export{default as CSSMatrix}from'@thednp/dommatrix';var At=Object.defineProperty;var ie=(e,t)=>{for(var n in t)At(e,n,{get:t[n],enumerable:true});};var it={};ie(it,{angleBetween:()=>De,arcLength:()=>Ee,arcPoint:()=>Y,getArcBBox:()=>$e,getArcLength:()=>ge,getArcProps:()=>Le,getPointAtArcLength:()=>Ie});var mt={};ie(mt,{getLineBBox:()=>Me,getLineLength:()=>X,getPointAtLineLength:()=>he});var Ct=(e,t,n)=>{let[o,r]=e,[a,s]=t;return [o+(a-o)*n,r+(s-r)*n]},I=Ct;var Tt=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),ue=Tt;var X=(e,t,n,o)=>ue([e,t],[n,o]),he=(e,t,n,o,r)=>{let a={x:e,y:t};if(typeof r=="number"){let s=ue([e,t],[n,o]);if(r<=0)a={x:e,y:t};else if(r>=s)a={x:n,y:o};else {let[i,m]=I([e,t],[n,o],r/s);a={x:i,y:m};}}return a},Me=(e,t,n,o)=>{let{min:r,max:a}=Math;return [r(e,n),r(t,o),a(e,n),a(t,o)]};var Ee=(e,t,n)=>{let o=n/2,r=Math.sin(o),a=Math.cos(o),s=e**2*r**2,i=t**2*a**2,m=Math.sqrt(s+i)*n;return Math.abs(m)},Y=(e,t,n,o,r,a)=>{let{sin:s,cos:i}=Math,m=i(r),u=s(r),l=n*i(a),c=o*s(a);return [e+m*l-u*c,t+u*l+m*c]},De=(e,t)=>{let{x:n,y:o}=e,{x:r,y:a}=t,s=n*r+o*a,i=Math.sqrt((n**2+o**2)*(r**2+a**2));return (n*a-o*r<0?-1:1)*Math.acos(s/i)},Le=(e,t,n,o,r,a,s,i,m)=>{let{abs:u,sin:l,cos:c,sqrt:f,PI:b}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(b/180);if(e===i&&t===m)return {rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return {rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+e)/2,y:(m+t)/2}};let A=(e-i)/2,d=(t-m)/2,g={x:c(S)*A+l(S)*d,y:-l(S)*A+c(S)*d},x=g.x**2/p**2+g.y**2/h**2;x>1&&(p*=f(x),h*=f(x));let C=p**2*h**2-p**2*g.y**2-h**2*g.x**2,V=p**2*g.y**2+h**2*g.x**2,Q=C/V;Q=Q<0?0:Q;let w=(a!==s?1:-1)*f(Q),M={x:w*(p*g.y/h),y:w*(-(h*g.x)/p)},$={x:c(S)*M.x-l(S)*M.y+(e+i)/2,y:l(S)*M.x+c(S)*M.y+(t+m)/2},J={x:(g.x-M.x)/p,y:(g.y-M.y)/h},k=De({x:1,y:0},J),P={x:(-g.x-M.x)/p,y:(-g.y-M.y)/h},z=De(J,P);!s&&z>0?z-=2*b:s&&z<0&&(z+=2*b),z%=2*b;let B=k+z;return {center:$,startAngle:k,endAngle:B,rx:p,ry:h}},ge=(e,t,n,o,r,a,s,i,m)=>{let{rx:u,ry:l,startAngle:c,endAngle:f}=Le(e,t,n,o,r,a,s,i,m);return Ee(u,l,f-c)},Ie=(e,t,n,o,r,a,s,i,m,u)=>{let l={x:e,y:t},{center:c,rx:f,ry:b,startAngle:p,endAngle:h}=Le(e,t,n,o,r,a,s,i,m);if(typeof u=="number"){let y=Ee(f,b,h-p);if(u<=0)l={x:e,y:t};else if(u>=y)l={x:i,y:m};else {if(e===i&&t===m)return {x:i,y:m};if(f===0||b===0)return he(e,t,i,m,u);let{PI:S,cos:A,sin:d}=Math,g=h-p,C=(r%360+360)%360*(S/180),V=p+g*(u/y),Q=f*A(V),w=b*d(V);l={x:A(C)*Q-d(C)*w+c.x,y:d(C)*Q+A(C)*w+c.y};}}return l},$e=(e,t,n,o,r,a,s,i,m)=>{let{center:u,rx:l,ry:c,startAngle:f,endAngle:b}=Le(e,t,n,o,r,a,s,i,m),p=b-f,{min:h,max:y,tan:S,atan2:A,PI:d}=Math,{x:g,y:x}=u,C=r*d/180,V=S(C),Q=A(-c*V,l),w=Q,M=Q+d,$=A(c,l*V),J=$+d,k=[i],P=[m],z=h(e,i),B=y(e,i),E=h(t,m),Z=y(t,m),me=b-p*1e-5,W=Y(g,x,l,c,C,me),N=b-p*.99999,q=Y(g,x,l,c,C,N);if(W[0]>B||q[0]>B){let R=Y(g,x,l,c,C,w);k.push(R[0]),P.push(R[1]);}if(W[0]Z||q[1]>Z){let R=Y(g,x,l,c,C,$);k.push(R[0]),P.push(R[1]);}return z=h.apply([],k),E=h.apply([],P),B=y.apply([],k),Z=y.apply([],P),[z,E,B,Z]};var ht={};ie(ht,{CBEZIER_MINMAX_EPSILON:()=>bt,Cvalues:()=>ut,Tvalues:()=>Be,bezierLength:()=>ft,calculateBezier:()=>ct,computeBezier:()=>pt,deriveBezier:()=>lt,getBezierLength:()=>ee,minmaxC:()=>ve,minmaxQ:()=>de});var Be=[-0.06405689286260563,.06405689286260563,-0.1911188674736163,.1911188674736163,-0.3150426796961634,.3150426796961634,-0.4337935076260451,.4337935076260451,-0.5454214713888396,.5454214713888396,-0.6480936519369755,.6480936519369755,-0.7401241915785544,.7401241915785544,-0.820001985973903,.820001985973903,-0.8864155270044011,.8864155270044011,-0.9382745520027328,.9382745520027328,-0.9747285559713095,.9747285559713095,-0.9951872199970213,.9951872199970213],ut=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],lt=e=>{let t=[];for(let n=e,o=n.length,r=o-1;o>1;o-=1,r-=1){let a=[];for(let s=0;s{if(t===0)return e[0].t=0,e[0];let n=e.length-1;if(t===1)return e[n].t=1,e[n];let o=1-t,r=e;if(n===0)return e[0].t=t,e[0];if(n===1)return {x:o*r[0].x+t*r[1].x,y:o*r[0].y+t*r[1].y,t};let a=o*o,s=t*t,i=0,m=0,u=0,l=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=a,m=o*t*2,u=s):n===3&&(i=a*o,m=a*t*3,u=o*s*3,l=t*s),{x:i*r[0].x+m*r[1].x+u*r[2].x+l*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+l*r[3].y,t}},ct=(e,t)=>{let n=e(t),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},ft=e=>{let n=Be.length,o=0;for(let r=0,a;r{let t=[];for(let o=0,r=e.length,a=2;opt(n[0],o))},bt=1e-8,de=([e,t,n])=>{let o=Math.min(e,n),r=Math.max(e,n);if(t>=e?n>=t:n<=t)return [o,r];let a=(e*n-t*t)/(e-2*t+n);return a{let r=e-3*t+3*n-o;if(Math.abs(r)0&&l<1){let f=e*(1-l)*(1-l)*(1-l)+t*3*(1-l)*(1-l)*l+n*3*(1-l)*l*l+o*l*l*l;fm&&(m=f);}}return [i,m]};var dt={};ie(dt,{getCubicBBox:()=>Ne,getCubicLength:()=>le,getPointAtCubicLength:()=>je,getPointAtCubicSegmentLength:()=>gt});var gt=([e,t,n,o,r,a,s,i],m)=>{let u=1-m;return {x:u**3*e+3*u**2*m*n+3*u*m**2*r+m**3*s,y:u**3*t+3*u**2*m*o+3*u*m**2*a+m**3*i}},le=(e,t,n,o,r,a,s,i)=>ee([e,t,n,o,r,a,s,i]),je=(e,t,n,o,r,a,s,i,m)=>{let u=typeof m=="number",l={x:e,y:t};if(u){let c=ee([e,t,n,o,r,a,s,i]);m<=0||(m>=c?l={x:s,y:i}:l=gt([e,t,n,o,r,a,s,i],m/c));}return l},Ne=(e,t,n,o,r,a,s,i)=>{let m=ve([e,n,r,s]),u=ve([t,o,a,i]);return [m[0],u[0],m[1],u[1]]};var xt={};ie(xt,{getPointAtQuadLength:()=>Oe,getPointAtQuadSegmentLength:()=>yt,getQuadBBox:()=>we,getQuadLength:()=>pe});var yt=([e,t,n,o,r,a],s)=>{let i=1-s;return {x:i**2*e+2*i*s*n+s**2*r,y:i**2*t+2*i*s*o+s**2*a}},pe=(e,t,n,o,r,a)=>ee([e,t,n,o,r,a]),Oe=(e,t,n,o,r,a,s)=>{let i=typeof s=="number",m={x:e,y:t};if(i){let u=ee([e,t,n,o,r,a]);s<=0||(s>=u?m={x:r,y:a}:m=yt([e,t,n,o,r,a],s/u));}return m},we=(e,t,n,o,r,a)=>{let s=de([e,n,r]),i=de([t,o,a]);return [s[0],i[0],s[1],i[1]]};var Pt={};ie(Pt,{polygonArea:()=>Mt,polygonLength:()=>Lt});var Mt=e=>{let t=e.length,n=-1,o,r=e[t-1],a=0;for(;++ne.reduce((t,n,o)=>o?t+ue(e[o-1],n):0,0);var vt={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},G=vt;var Nt=e=>{let t=e.pathValue[e.segmentStart],n=t.toLowerCase(),{data:o}=e;for(;o.length>=G[n]&&(n==="m"&&o.length>2?(e.segments.push([t].concat(o.splice(0,2))),n="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(o.splice(0,G[n]))),!!G[n]););},Re=Nt;var wt="SVGPathCommander Error",D=wt;var Rt=e=>{let{index:t,pathValue:n}=e,o=n.charCodeAt(t);if(o===48){e.param=0,e.index+=1;return}if(o===49){e.param=1,e.index+=1;return}e.err=`${D}: invalid Arc flag "${n[t]}", expecting 0 or 1 at index ${t}`;},He=Rt;var Vt=e=>e>=48&&e<=57,j=Vt;var Qt="Invalid path value",O=Qt;var kt=e=>{let{max:t,pathValue:n,index:o}=e,r=o,a=false,s=false,i=false,m=false,u;if(r>=t){e.err=`${D}: ${O} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!j(u)&&u!==46){e.err=`${D}: ${O} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(a=u===48,r+=1,u=n.charCodeAt(r),a&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),Ge=zt;var qt=e=>{let{pathValue:t,max:n}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return true;default:return false}},_e=Dt;var Et=e=>j(e)||e===43||e===45||e===46,Ue=Et;var It=e=>(e|32)===97,Ke=It;var $t=e=>{switch(e|32){case 109:case 77:return true;default:return false}},Fe=$t;var Bt=e=>{let{max:t,pathValue:n,index:o,segments:r}=e,a=n.charCodeAt(o),s=G[n[o].toLowerCase()];if(e.segmentStart=o,!_e(a)){e.err=`${D}: ${O} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!Fe(a)&&i?.[0]?.toLocaleLowerCase()==="z"){e.err=`${D}: ${O} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(e.index+=1,_(e),e.data=[],!s){Re(e);return}for(;;){for(let m=s;m>0;m-=1){if(Ke(a)&&(m===3||m===4)?He(e):Ze(e),e.err.length)return;e.data.push(e.param),_(e),e.index=e.max||!Ue(n.charCodeAt(e.index)))break}Re(e);},ye=Bt;var F=class{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err="";}};var jt=e=>{if(typeof e!="string")return e.slice(0);let t=new F(e);for(_(t);t.index{let[r]=e,a=r.toUpperCase(),s=a===r;if(t===0||s)return e;if(a==="A")return [a,e[1],e[2],e[3],e[4],e[5],e[6]+n,e[7]+o];if(a==="V")return [a,e[1]+o];if(a==="H")return [a,e[1]+n];if(a==="L")return [a,e[1]+n,e[2]+o];{let i=[],m=e.length;for(let u=1;u{let n=e.length,o,r="M",a="M",s=false,i=0,m=0,u=0,l=0,c=0;for(let f=0;f{let t=v(e);return T(t,U)},xe=Zt;var Gt=(e,t,n,o)=>{let[r]=e,a=r.toLowerCase(),s=r===a;if(t===0||s)return e;if(a==="a")return [a,e[1],e[2],e[3],e[4],e[5],e[6]-n,e[7]-o];if(a==="v")return [a,e[1]-o];if(a==="h")return [a,e[1]-n];if(a==="l")return [a,e[1]-n,e[2]-o];{let i=[],m=e.length;for(let u=1;u{let t=v(e);return T(t,Pe)},Ut=_t;var Kt=(e,t,n)=>{let{sin:o,cos:r}=Math,a=e*r(n)-t*o(n),s=e*o(n)+t*r(n);return {x:a,y:s}},ce=Kt;var St=(e,t,n,o,r,a,s,i,m,u)=>{let l=e,c=t,f=n,b=o,p=i,h=m,y=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],d,g,x,C,V;if(u)[g,x,C,V]=u;else {d=ce(l,c,-S),l=d.x,c=d.y,d=ce(p,h,-S),p=d.x,h=d.y;let N=(l-p)/2,q=(c-h)/2,R=N*N/(f*f)+q*q/(b*b);R>1&&(R=Math.sqrt(R),f*=R,b*=R);let ze=f*f,qe=b*b,st=(a===s?-1:1)*Math.sqrt(Math.abs((ze*qe-ze*q*q-qe*N*N)/(ze*q*q+qe*N*N)));C=st*f*q/b+(l+p)/2,V=st*-b*N/f+(c+h)/2,g=Math.asin(((c-V)/b*10**9>>0)/10**9),x=Math.asin(((h-V)/b*10**9>>0)/10**9),g=lx&&(g-=Math.PI*2),!s&&x>g&&(x-=Math.PI*2);}let Q=x-g;if(Math.abs(Q)>y){let N=x,q=p,R=h;x=g+y*(s&&x>g?1:-1),p=C+f*Math.cos(x),h=V+b*Math.sin(x),A=St(p,h,f,b,r,0,s,q,R,[x,N,C,V]);}Q=x-g;let w=Math.cos(g),M=Math.sin(g),$=Math.cos(x),J=Math.sin(x),k=Math.tan(Q/4),P=4/3*f*k,z=4/3*b*k,B=[l,c],E=[l+P*M,c-z*w],Z=[p+P*J,h-z*$],me=[p,h];if(E[0]=2*B[0]-E[0],E[1]=2*B[1]-E[1],u)return [E[0],E[1],Z[0],Z[1],me[0],me[1]].concat(A);A=[E[0],E[1],Z[0],Z[1],me[0],me[1]].concat(A);let W=[];for(let N=0,q=A.length;N{let s=.3333333333333333,i=2/3;return [s*e+i*n,s*t+i*o,s*r+i*n,s*a+i*o,r,a]},Je=Ft;var Jt=(e,t,n,o)=>{let r=I([e,t],[n,o],.3333333333333333),a=I([e,t],[n,o],2/3);return [r[0],r[1],a[0],a[1],n,o]},Ve=Jt;var Wt=(e,t)=>{let[n]=e,o=e.slice(1).map(Number),[r,a]=o,{x1:s,y1:i,x:m,y:u}=t;return "TQ".includes(n)||(t.qx=null,t.qy=null),n==="M"?(t.x=r,t.y=a,e):n==="A"?["C"].concat(Se(s,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(t.qx=r,t.qy=a,["C"].concat(Je(s,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Ve(s,i,r,a)):n==="Z"?["C"].concat(Ve(s,i,m,u)):e},We=Wt;var Xt=(e,t)=>{let[n]=e,o=n.toUpperCase(),r=n!==o,{x1:a,y1:s,x2:i,y2:m,x:u,y:l}=t,c=e.slice(1),f=c.map((b,p)=>b+(r?p%2?l:u:0));"TQ".includes(o)||(t.qx=null,t.qy=null);if(o==="A")return f=c.slice(0,-2).concat(c[5]+(r?u:0),c[6]+(r?l:0)),["A"].concat(f);if(o==="H")return ["L",e[1]+(r?u:0),s];if(o==="V")return ["L",a,e[1]+(r?l:0)];if(o==="L")return ["L",e[1]+(r?u:0),e[2]+(r?l:0)];if(o==="M")return ["M",e[1]+(r?u:0),e[2]+(r?l:0)];if(o==="C")return ["C"].concat(f);if(o==="S"){let b=a*2-i,p=s*2-m;return t.x1=b,t.y1=p,["C",b,p].concat(f)}else if(o==="T"){let b=a*2-(t.qx?t.qx:0),p=s*2-(t.qy?t.qy:0);return t.qx=b,t.qy=p,["Q",b,p].concat(f)}else if(o==="Q"){let[b,p]=f;return t.qx=b,t.qy=p,["Q"].concat(f)}else if(o==="Z")return ["Z"];return e},te=Xt;var Yt={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},K=Yt;var er=e=>{let t={...K},n=v(e);return T(n,(o,r,a,s)=>{t.x=a,t.y=s;let i=te(o,t),m=We(i,t);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let l=m.length;return t.x1=+m[l-2],t.y1=+m[l-1],t.x2=+m[l-4]||t.x1,t.y2=+m[l-3]||t.y1,m})},Ae=er;var tr={origin:[0,0,0],round:4},H=tr;var rr=(e,t)=>{let n=t>=1?10**t:1;return t>0?Math.round(e*n)/n:Math.round(e)},L=rr;var nr=(e,t)=>{let n=e.length,{round:o}=H,r=e[0],a="";o=t==="off"||typeof t=="number"&&t>=0?t:typeof o=="number"&&o>=0?o:"off";for(let s=0;s{let t=v(e),n={...K};return T(t,(o,r,a,s)=>{n.x=a,n.y=s;let i=te(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},re=or;var ar=(e,t)=>{let n=re(e),o=false,r=[],a="M",s=0,i=0,[m,u]=n[0].slice(1),l=typeof t=="number",c={x:m,y:u},f=0,b=c,p=0;return !l||t{[a]=h,o=a==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,c={x:m,y:u},f=0):a==="L"?(c=he(r[0],r[1],r[2],r[3],t-p),f=X(r[0],r[1],r[2],r[3])):a==="A"?(c=Ie(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],t-p),f=ge(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):a==="C"?(c=je(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],t-p),f=le(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):a==="Q"?(c=Oe(r[0],r[1],r[2],r[3],r[4],r[5],t-p),f=pe(r[0],r[1],r[2],r[3],r[4],r[5])):a==="Z"&&(r=[S,A,m,u],c={x:m,y:u},f=X(r[0],r[1],r[2],r[3])),[s,i]=r.slice(-2),pp-fe?{x:s,y:i}:b)},Ce=ar;var sr=e=>{let t=v(e),n=0,o=0,r=0,a=0,s=0,i=0,m="M",u=0,l=0,c=0;return T(t,(f,b,p,h)=>{[m]=f;let y=m.toUpperCase(),A=y!==m?U(f,b,p,h):f.slice(0),d=y==="V"?["L",p,A[1]]:y==="H"?["L",A[1],h]:A;[m]=d,"TQ".includes(y)||(s=0,i=0);if(m==="M")[,u,l]=d;else if(m==="L")c+=X(p,h,d[1],d[2]);else if(m==="A")c+=ge(p,h,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(m==="S"){let g=n*2-r,x=o*2-a;c+=le(p,h,g,x,d[1],d[2],d[3],d[4]);}else m==="C"?c+=le(p,h,d[1],d[2],d[3],d[4],d[5],d[6]):m==="T"?(s=n*2-s,i=o*2-i,c+=pe(p,h,s,i,d[1],d[2])):m==="Q"?(s=d[1],i=d[2],c+=pe(p,h,d[1],d[2],d[3],d[4])):m==="Z"&&(c+=X(p,h,u,l));[n,o]=m==="Z"?[u,l]:d.slice(-2),[r,a]=m==="C"?[d[3],d[4]]:m==="S"?[d[1],d[2]]:[n,o];}),c},ne=sr;var mr=(e,t)=>{let n=v(e),o=n.slice(0),r=ne(o),a=o.length-1,s=0,i=0,m=n[0];if(a<=0||!t||!Number.isFinite(t))return {segment:m,index:0,length:i,lengthAtSegment:s};if(t>=r)return o=n.slice(0,-1),s=ne(o),i=r-s,m=n[a],{segment:m,index:a,length:i,lengthAtSegment:s};let u=[];for(;a>0;)m=o[a],o=o.slice(0,-1),s=ne(o),i=r-s,r=s,u.push({segment:m,index:a,length:i,lengthAtSegment:s}),a-=1;return u.find(({lengthAtSegment:l})=>l<=t)},Te=mr;var ir=(e,t)=>{let n=v(e),o=re(n),r=ne(o),a=g=>{let x=g.x-t.x,C=g.y-t.y;return x*x+C*C},s=8,i,m={x:0,y:0},u=0,l=0,c=1/0;for(let g=0;g<=r;g+=s)i=Ce(o,g),u=a(i),u1e-6&&(p=l-s,f=Ce(o,p),y=a(f),h=l+s,b=Ce(o,h),S=a(b),p>=0&&yoe(e,t).closest,lr=ur;var pr=(e,t,n,o,r,a,s,i)=>3*((i-t)*(n+r)-(s-e)*(o+a)+o*(e-r)-n*(t-a)+i*(r+e/3)-s*(a+t/3))/20,cr=e=>{let t=0,n=0,o=0;return Ae(e).map(r=>{switch(r[0]){case "M":return [,t,n]=r,0;default:return o=pr(t,n,r[1],r[2],r[3],r[4],r[5],r[6]),[t,n]=r.slice(-2),o}}).reduce((r,a)=>r+a,0)},Ye=cr;var fr=e=>Ye(Ae(e))>=0,br=fr;var hr=e=>{if(!e)return {x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let t=v(e),n="M",o=0,r=0,{max:a,min:s}=Math,i=1/0,m=1/0,u=-1/0,l=-1/0,c=0,f=0,b=0,p=0,h=0,y=0,S=0,A=0,d=0,g=0;T(t,(V,Q,w,M)=>{[n]=V;let $=n.toUpperCase(),k=$!==n?U(V,Q,w,M):V.slice(0),P=$==="V"?["L",w,k[1]]:$==="H"?["L",k[1],M]:k;[n]=P,"TQ".includes($)||(d=0,g=0);if(n==="M")[,o,r]=P,c=o,f=r,b=o,p=r;else if(n==="L")[c,f,b,p]=Me(w,M,P[1],P[2]);else if(n==="A")[c,f,b,p]=$e(w,M,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(n==="S"){let z=h*2-S,B=y*2-A;[c,f,b,p]=Ne(w,M,z,B,P[1],P[2],P[3],P[4]);}else n==="C"?[c,f,b,p]=Ne(w,M,P[1],P[2],P[3],P[4],P[5],P[6]):n==="T"?(d=h*2-d,g=y*2-g,[c,f,b,p]=we(w,M,d,g,P[1],P[2])):n==="Q"?(d=P[1],g=P[2],[c,f,b,p]=we(w,M,P[1],P[2],P[3],P[4])):n==="Z"&&([c,f,b,p]=Me(w,M,o,r));i=s(c,i),m=s(f,m),u=a(b,u),l=a(p,l),[h,y]=n==="Z"?[o,r]:P.slice(-2),[S,A]=n==="C"?[P[3],P[4]]:n==="S"?[P[1],P[2]]:[h,y];});let x=u-i,C=l-m;return {width:x,height:C,x:i,y:m,x2:u,y2:l,cx:i+x/2,cy:m+C/2,cz:Math.max(x,C)+Math.min(x,C)/2}},gr=hr;var dr=(e,t)=>Te(e,t).segment,yr=dr;var xr=(e,t)=>oe(e,t).segment,Pr=xr;var Sr=e=>Array.isArray(e)&&e.every(t=>{let n=t[0].toLowerCase();return G[n]===t.length-1&&"achlmqstvz".includes(n)&&t.slice(1).every(Number.isFinite)})&&e.length>0,ae=Sr;var Ar=e=>ae(e)&&e.every(([t])=>t===t.toUpperCase()),et=Ar;var Cr=e=>et(e)&&e.every(([t])=>"ACLMQZ".includes(t)),tt=Cr;var Tr=e=>tt(e)&&e.every(([t])=>"MC".includes(t)),Mr=Tr;var Lr=(e,t)=>{let{distance:n}=oe(e,t);return Math.abs(n)ae(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),wr=Nr;var Rr=e=>{if(typeof e!="string"||!e.length)return false;let t=new F(e);for(_(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,Qe=Qr;var kr=e=>{let{x1:t,y1:n,x2:o,y2:r}=e;return [t,n,o,r]=[t,n,o,r].map(a=>+a),[["M",t,n],["L",o,r]]},zr=e=>{let t=[],n=(e.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:t,cy:n,r:o}=e;return [t,n,o]=[t,n,o].map(r=>+r),[["M",t-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},Dr=e=>{let{cx:t,cy:n}=e,o=e.rx||0,r=e.ry||o;return [t,n,o,r]=[t,n,o,r].map(a=>+a),[["M",t-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},Er=e=>{let t=+e.x||0,n=+e.y||0,o=+e.width,r=+e.height,a=+(e.rx||0),s=+(e.ry||a);if(a||s){a*2>o&&(a-=(a*2-o)/2);return s*2>r&&(s-=(s*2-r)/2),[["M",t+a,n],["h",o-a*2],["s",a,0,a,s],["v",r-s*2],["s",0,s,-a,s],["h",-o+a*2],["s",-a,0,-a,-s],["v",-r+s*2],["s",0,-s,a,-s]]}return [["M",t,n],["h",o],["v",r],["H",t],["Z"]]},Ir=e=>{let t=Object.keys(se),n=Qe(e),o=n?e.tagName:null;if(o&&[...t,"path"].every(m=>o!==m))throw TypeError(`${D}: "${o}" is not SVGElement`);let r=n?o:e.type,a=se[r],s={type:r};n?a.forEach(m=>{s[m]=e.getAttribute(m);}):Object.assign(s,e);let i=[];return r==="circle"?i=qr(s):r==="ellipse"?i=Dr(s):["polyline","polygon"].includes(r)?i=zr(s):r==="rect"?i=Er(s):r==="line"?i=kr(s):["glyph","path"].includes(r)&&(i=v(n?e.getAttribute("d")||"":e.d||"")),ae(i)&&i.length?i:false},nt=Ir;var $r=(e,t,n)=>{let o=n||document,r=Object.keys(se),a=Qe(e),s=a?e.tagName:null;if(s==="path")throw TypeError(`${D}: "${s}" is already SVGPathElement`);if(s&&r.every(p=>s!==p))throw TypeError(`${D}: "${s}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=a?s:e.type,u=se[m],l={type:m},c=H.round,f=nt(e),b=f&&f.length?Xe(f,c):"";return a?(u.forEach(p=>{l[p]=e.getAttribute(p);}),Object.values(e.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h);})):(Object.assign(l,e),Object.keys(l).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),l[p]);})),rt(b)?(i.setAttribute("d",b),t&&a&&(e.before(i,e),e.remove()),i):false},Br=$r;var Or=e=>{let t=new jr,{origin:n}=e,[o,r]=n,{translate:a}=e,{rotate:s}=e,{skew:i}=e,{scale:m}=e;return Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?t=t.translate(...a):typeof a=="number"&&!Number.isNaN(a)&&(t=t.translate(a)),(s||i||m)&&(t=t.translate(o,r),Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?t=t.rotate(...s):typeof s=="number"&&!Number.isNaN(s)&&(t=t.rotate(s)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(t=i[0]?t.skewX(i[0]):t,t=i[1]?t.skewY(i[1]):t):typeof i=="number"&&!Number.isNaN(i)&&(t=t.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?t=t.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(t=t.scale(m)),t=t.translate(-o,-r)),t},ot=Or;var Hr=(e,t,n,o)=>{let[r]=e,{round:a}=H,s=a,i=t.slice(1),{x1:m,y1:u,x2:l,y2:c,x:f,y:b}=n,[p,h]=i.slice(-2),y=e;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(L(f,s)===L(p,s))return ["V",h];if(L(b,s)===L(h,s))return ["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(L(S,s)===L(m*2-l,s)&&L(A,s)===L(u*2-c,s)||L(m,s)===L(l*2-f,s)&&L(u,s)===L(c*2-b,s)))return ["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&L(S,s)===L(m*2-l,s)&&L(A,s)===L(u*2-c,s))return ["T",i[2],i[3]]}return y},at=Hr;var Zr=(e,t)=>{let n=e.slice(1).map(o=>L(o,t));return [e[0]].concat(n)},be=Zr;var Gr=(e,t)=>{let n=xe(e),o=typeof t=="number"&&t>=0?t:2,r={...K},a=[],s="M",i="Z";return T(n,(m,u,l,c)=>{r.x=l,r.y=c;let f=te(m,r),b=m;if([s]=m,a[u]=s,u){i=a[u-1];let h=at(m,f,r,i),y=be(h,o),S=y.join(""),A=Pe(h,u,l,c),d=be(A,o),g=d.join("");b=S.length{let n=jr.Translate(t[0],t[1],t[2]);return [,,,n.m44]=t,n=e.multiply(n),[n.m41,n.m42,n.m43,n.m44]},Fr=(e,t,n)=>{let[o,r,a]=n,[s,i,m]=Kr(e,[t[0],t[1],0,1]),u=s-o,l=i-r,c=m-a;return [u*(Math.abs(a)/Math.abs(c)||1)+o,l*(Math.abs(a)/Math.abs(c)||1)+r]},ke=Fr;var Jr=e=>{let t=e.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):e[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return [["M"].concat(t[0].slice(0,2))].concat(t.map(n=>["C"].concat(n.slice(2))))},Wr=Jr;var Xr=e=>{let t=xe(e),n=re(t),o=t.length,r=t[o-1][0]==="Z",a=T(t,(s,i)=>{let m=n[i],u=i&&t[i-1],l=u&&u[0],c=t[i+1],f=c&&c[0],[b]=s,[p,h]=n[i?i-1:o-1].slice(-2),y=s;switch(b){case "M":y=r?["Z"]:[b,p,h];break;case "A":y=[b,s[1],s[2],s[3],s[4],s[5]===1?0:1,p,h];break;case "C":c&&f==="S"?y=["S",s[1],s[2],p,h]:y=[b,s[3],s[4],s[1],s[2],p,h];break;case "S":l&&"CS".includes(l)&&(!c||f!=="S")?y=["C",m[3],m[4],m[1],m[2],p,h]:y=[b,m[1],m[2],p,h];break;case "Q":c&&f==="T"?y=["T",p,h]:y=[b,s[1],s[2],p,h];break;case "T":l&&"QT".includes(l)&&(!c||f!=="T")?y=["Q",m[1],m[2],p,h]:y=[b,p,h];break;case "Z":y=["M",p,h];break;case "H":y=[b,p];break;case "V":y=[b,h];break;default:y=[b].concat(s.slice(1,-2),p,h);}return y});return r?a.reverse():[a[0]].concat(a.slice(1).reverse())},Yr=Xr;var en=(e,t)=>{let{round:n}=H;n=t==="off"||typeof t=="number"&&t>=0?t:typeof n=="number"&&n>=0?n:"off";return n==="off"?e.slice(0):T(e,o=>be(o,n))},tn=en;var rn=(e,t=.5)=>{let n=t,o=e.slice(0,2),r=e.slice(2,4),a=e.slice(4,6),s=e.slice(6,8),i=I(o,r,n),m=I(r,a,n),u=I(a,s,n),l=I(i,m,n),c=I(m,u,n),f=I(l,c,n);return [["C",i[0],i[1],l[0],l[1],f[0],f[1]],["C",c[0],c[1],u[0],u[1],s[0],s[1]]]},nn=rn;var on=e=>{let t=[],n,o=-1,r=0,a=0,s=0,i=0,m={...K};return e.forEach(u=>{let[l]=u,c=l.toUpperCase(),f=l.toLowerCase(),b=l===f,p=u.slice(1);c==="M"?(o+=1,[r,a]=p,r+=b?m.x:0,a+=b?m.y:0,s=r,i=a,n=[b?[c,s,i]:u]):(c==="Z"?(r=s,a=i):c==="H"?([,r]=u,r+=b?m.x:0):c==="V"?([,a]=u,a+=b?m.y:0):([r,a]=u.slice(-2),r+=b?m.x:0,a+=b?m.y:0),n.push(u)),m.x=r,m.y=a,t[o]=n;}),t},an=on;var sn=(e,t)=>{let n=0,o=0,r=0,a=0,s=0,i=0,m="M",u=v(e),l=t&&Object.keys(t);if(!t||l&&!l.length)return u.slice(0);t.origin||Object.assign(t,{origin:H.origin});let c=t.origin,f=ot(t);return f.isIdentity?u.slice(0):T(u,(b,p,h,y)=>{[m]=b;let S=m.toUpperCase(),d=S!==m?U(b,p,h,y):b.slice(0),g=S==="A"?["C"].concat(Se(h,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):S==="V"?["L",h,d[1]]:S==="H"?["L",d[1],y]:d;m=g[0];let x=m==="C"&&g.length>7,C=x?g.slice(0,7):g.slice(0);if(x&&(u.splice(p+1,0,["C"].concat(g.slice(7))),g=C),m==="L"){[r,a]=ke(f,[g[1],g[2]],c);n!==r&&o!==a?g=["L",r,a]:o===a?g=["H",r]:n===r&&(g=["V",a]);}else for(s=1,i=g.length;s {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n"]} \ No newline at end of file diff --git a/docs/svg-path-commander.js b/docs/svg-path-commander.js index 5a0b62c..53c9289 100755 --- a/docs/svg-path-commander.js +++ b/docs/svg-path-commander.js @@ -1,2 +1,2 @@ -var SVGPathCommander=function(){"use strict";var Et=Object.defineProperty,Ot=(t,e,r)=>e in t?Et(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,I=(t,e,r)=>Ot(t,typeof e!="symbol"?e+"":e,r);const Vt={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},He=t=>(t instanceof Float64Array||t instanceof Float32Array||Array.isArray(t)&&t.every(e=>typeof e=="number"))&&[6,16].some(e=>t.length===e),Fe=t=>t instanceof DOMMatrix||t instanceof P||typeof t=="object"&&Object.keys(Vt).every(e=>t&&e in t),te=t=>{const e=new P,r=Array.from(t);if(!He(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,o,i,l,c,a,m,h,f,y,u,g,p,b,M]=r;e.m11=s,e.a=s,e.m21=l,e.c=l,e.m31=h,e.m41=g,e.e=g,e.m12=n,e.b=n,e.m22=c,e.d=c,e.m32=f,e.m42=p,e.f=p,e.m13=o,e.m23=a,e.m33=y,e.m43=b,e.m14=i,e.m24=m,e.m34=u,e.m44=M}else if(r.length===6){const[s,n,o,i,l,c]=r;e.m11=s,e.a=s,e.m12=n,e.b=n,e.m21=o,e.c=o,e.m22=i,e.d=i,e.m41=l,e.e=l,e.m42=c,e.f=c}return e},Ue=t=>{if(Fe(t))return te([t.m11,t.m12,t.m13,t.m14,t.m21,t.m22,t.m23,t.m24,t.m31,t.m32,t.m33,t.m34,t.m41,t.m42,t.m43,t.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(t)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},Ge=t=>{if(typeof t!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(t)}" is not a string.`);const e=String(t).replace(/\s/g,"");let r=new P;const s=`CSSMatrix: invalid transform string "${t}"`;return e.split(")").filter(n=>n).forEach(n=>{const[o,i]=n.split("(");if(!i)throw TypeError(s);const l=i.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[c,a,m,h]=l,f=[c,a,m],y=[c,a,m,h];if(o==="perspective"&&c&&[a,m].every(u=>u===void 0))r.m34=-1/c;else if(o.includes("matrix")&&[6,16].includes(l.length)&&l.every(u=>!Number.isNaN(+u))){const u=l.map(g=>Math.abs(g)<1e-6?0:g);r=r.multiply(te(u))}else if(o==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(c,a,m);else if(o==="translate"&&c&&m===void 0)r=r.translate(c,a||0,0);else if(o==="rotate3d"&&y.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(c,a,m,h);else if(o==="rotate"&&c&&[a,m].every(u=>u===void 0))r=r.rotate(0,0,c);else if(o==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(c,a,m);else if(o==="scale"&&!Number.isNaN(c)&&(c!==1||a!==1)&&m===void 0){const u=Number.isNaN(+a)?c:a;r=r.scale(c,u,1)}else if(o==="skew"&&(c||!Number.isNaN(c)&&a)&&m===void 0)r=r.skew(c,a||0);else if(["translate","rotate","scale","skew"].some(u=>o.includes(u))&&/[XYZ]/.test(o)&&c&&[a,m].every(u=>u===void 0))if(o==="skewX"||o==="skewY")r=r[o](c);else{const u=o.replace(/[XYZ]/,""),g=o.replace(u,""),p=["X","Y","Z"].indexOf(g),b=u==="scale"?1:0,M=[p===0?c:b,p===1?c:b,p===2?c:b];r=r[u](...M)}else throw TypeError(s)}),r},Ne=(t,e)=>e?[t.a,t.b,t.c,t.d,t.e,t.f]:[t.m11,t.m12,t.m13,t.m14,t.m21,t.m22,t.m23,t.m24,t.m31,t.m32,t.m33,t.m34,t.m41,t.m42,t.m43,t.m44],Je=(t,e,r)=>{const s=new P;return s.m41=t,s.e=t,s.m42=e,s.f=e,s.m43=r,s},Ke=(t,e,r)=>{const s=new P,n=Math.PI/180,o=t*n,i=e*n,l=r*n,c=Math.cos(o),a=-Math.sin(o),m=Math.cos(i),h=-Math.sin(i),f=Math.cos(l),y=-Math.sin(l),u=m*f,g=-m*y;s.m11=u,s.a=u,s.m12=g,s.b=g,s.m13=h;const p=a*h*f+c*y;s.m21=p,s.c=p;const b=c*f-a*h*y;return s.m22=b,s.d=b,s.m23=-a*m,s.m31=a*y-c*h*f,s.m32=a*f+c*h*y,s.m33=c*m,s},We=(t,e,r,s)=>{const n=new P,o=Math.sqrt(t*t+e*e+r*r);if(o===0)return n;const i=t/o,l=e/o,c=r/o,a=s*(Math.PI/360),m=Math.sin(a),h=Math.cos(a),f=m*m,y=i*i,u=l*l,g=c*c,p=1-2*(u+g)*f;n.m11=p,n.a=p;const b=2*(i*l*f+c*m*h);n.m12=b,n.b=b,n.m13=2*(i*c*f-l*m*h);const M=2*(l*i*f-c*m*h);n.m21=M,n.c=M;const d=1-2*(g+y)*f;return n.m22=d,n.d=d,n.m23=2*(l*c*f+i*m*h),n.m31=2*(c*i*f+l*m*h),n.m32=2*(c*l*f-i*m*h),n.m33=1-2*(y+u)*f,n},Xe=(t,e,r)=>{const s=new P;return s.m11=t,s.a=t,s.m22=e,s.d=e,s.m33=r,s},me=(t,e)=>{const r=new P;if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},Ye=t=>me(t,0),et=t=>me(0,t),D=(t,e)=>{const r=e.m11*t.m11+e.m12*t.m21+e.m13*t.m31+e.m14*t.m41,s=e.m11*t.m12+e.m12*t.m22+e.m13*t.m32+e.m14*t.m42,n=e.m11*t.m13+e.m12*t.m23+e.m13*t.m33+e.m14*t.m43,o=e.m11*t.m14+e.m12*t.m24+e.m13*t.m34+e.m14*t.m44,i=e.m21*t.m11+e.m22*t.m21+e.m23*t.m31+e.m24*t.m41,l=e.m21*t.m12+e.m22*t.m22+e.m23*t.m32+e.m24*t.m42,c=e.m21*t.m13+e.m22*t.m23+e.m23*t.m33+e.m24*t.m43,a=e.m21*t.m14+e.m22*t.m24+e.m23*t.m34+e.m24*t.m44,m=e.m31*t.m11+e.m32*t.m21+e.m33*t.m31+e.m34*t.m41,h=e.m31*t.m12+e.m32*t.m22+e.m33*t.m32+e.m34*t.m42,f=e.m31*t.m13+e.m32*t.m23+e.m33*t.m33+e.m34*t.m43,y=e.m31*t.m14+e.m32*t.m24+e.m33*t.m34+e.m34*t.m44,u=e.m41*t.m11+e.m42*t.m21+e.m43*t.m31+e.m44*t.m41,g=e.m41*t.m12+e.m42*t.m22+e.m43*t.m32+e.m44*t.m42,p=e.m41*t.m13+e.m42*t.m23+e.m43*t.m33+e.m44*t.m43,b=e.m41*t.m14+e.m42*t.m24+e.m43*t.m34+e.m44*t.m44;return te([r,s,n,o,i,l,c,a,m,h,f,y,u,g,p,b])};class P{constructor(e){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,e?this.setMatrixValue(e):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(e){return typeof e=="string"&&e.length&&e!=="none"?Ge(e):Array.isArray(e)||e instanceof Float64Array||e instanceof Float32Array?te(e):typeof e=="object"?Ue(e):this}toFloat32Array(e){return Float32Array.from(Ne(this,e))}toFloat64Array(e){return Float64Array.from(Ne(this,e))}toString(){const{is2D:e}=this,r=this.toFloat64Array(e).join(", ");return`${e?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:e,isIdentity:r}=this;return{...this,is2D:e,isIdentity:r}}multiply(e){return D(this,e)}translate(e,r,s){const n=e;let o=r,i=s;return typeof o>"u"&&(o=0),typeof i>"u"&&(i=0),D(this,Je(n,o,i))}scale(e,r,s){const n=e;let o=r,i=s;return typeof o>"u"&&(o=e),typeof i>"u"&&(i=1),D(this,Xe(n,o,i))}rotate(e,r,s){let n=e,o=r||0,i=s||0;return typeof e=="number"&&typeof r>"u"&&typeof s>"u"&&(i=n,n=0,o=0),D(this,Ke(n,o,i))}rotateAxisAngle(e,r,s,n){if([e,r,s,n].some(o=>Number.isNaN(+o)))throw new TypeError("CSSMatrix: expecting 4 values");return D(this,We(e,r,s,n))}skewX(e){return D(this,Ye(e))}skewY(e){return D(this,et(e))}skew(e,r){return D(this,me(e,r))}transformPoint(e){const r=this.m11*e.x+this.m21*e.y+this.m31*e.z+this.m41*e.w,s=this.m12*e.x+this.m22*e.y+this.m32*e.z+this.m42*e.w,n=this.m13*e.x+this.m23*e.y+this.m33*e.z+this.m43*e.w,o=this.m14*e.x+this.m24*e.y+this.m34*e.z+this.m44*e.w;return e instanceof DOMPoint?new DOMPoint(r,s,n,o):{x:r,y:s,z:n,w:o}}}I(P,"Translate",Je),I(P,"Rotate",Ke),I(P,"RotateAxisAngle",We),I(P,"Scale",Xe),I(P,"SkewX",Ye),I(P,"SkewY",et),I(P,"Skew",me),I(P,"Multiply",D),I(P,"fromArray",te),I(P,"fromMatrix",Ue),I(P,"fromString",Ge),I(P,"toArray",Ne),I(P,"isCompatibleArray",He),I(P,"isCompatibleObject",Fe);const Z=(t,e,r)=>{const[s,n]=t,[o,i]=e;return[s+(o-s)*r,n+(i-n)*r]},ue=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),ne=(t,e,r,s)=>ue([t,e],[r,s]),we=(t,e,r,s,n)=>{let o={x:t,y:e};if(typeof n=="number"){const i=ue([t,e],[r,s]);if(n<=0)o={x:t,y:e};else if(n>=i)o={x:r,y:s};else{const[l,c]=Z([t,e],[r,s],n/i);o={x:l,y:c}}}return o},Le=(t,e,r,s)=>{const{min:n,max:o}=Math;return[n(t,r),n(e,s),o(t,r),o(e,s)]},_t=Object.freeze(Object.defineProperty({__proto__:null,getLineBBox:Le,getLineLength:ne,getPointAtLineLength:we},Symbol.toStringTag,{value:"Module"})),Te=(t,e,r)=>{const s=r/2,n=Math.sin(s),o=Math.cos(s),i=t**2*n**2,l=e**2*o**2,c=Math.sqrt(i+l)*r;return Math.abs(c)},U=(t,e,r,s,n,o)=>{const{sin:i,cos:l}=Math,c=l(n),a=i(n),m=r*l(o),h=s*i(o);return[t+c*m-a*h,e+a*m+c*h]},ve=(t,e)=>{const{x:r,y:s}=t,{x:n,y:o}=e,i=r*n+s*o,l=Math.sqrt((r**2+s**2)*(n**2+o**2));return(r*o-s*n<0?-1:1)*Math.acos(i/l)},he=(t,e,r,s,n,o,i,l,c)=>{const{abs:a,sin:m,cos:h,sqrt:f,PI:y}=Math;let u=a(r),g=a(s);const b=(n%360+360)%360*(y/180);if(t===l&&e===c)return{rx:u,ry:g,startAngle:0,endAngle:0,center:{x:l,y:c}};if(u===0||g===0)return{rx:u,ry:g,startAngle:0,endAngle:0,center:{x:(l+t)/2,y:(c+e)/2}};const M=(t-l)/2,d=(e-c)/2,x={x:h(b)*M+m(b)*d,y:-m(b)*M+h(b)*d},A=x.x**2/u**2+x.y**2/g**2;A>1&&(u*=f(A),g*=f(A));const S=u**2*g**2-u**2*x.y**2-g**2*x.x**2,j=u**2*x.y**2+g**2*x.x**2;let $=S/j;$=$<0?0:$;const T=(o!==i?1:-1)*f($),N={x:T*(u*x.y/g),y:T*(-(g*x.x)/u)},R={x:h(b)*N.x-m(b)*N.y+(t+l)/2,y:m(b)*N.x+h(b)*N.y+(e+c)/2},J={x:(x.x-N.x)/u,y:(x.y-N.y)/g},z=ve({x:1,y:0},J),C={x:(-x.x-N.x)/u,y:(-x.y-N.y)/g};let q=ve(J,C);!i&&q>0?q-=2*y:i&&q<0&&(q+=2*y),q%=2*y;const Q=z+q;return{center:R,startAngle:z,endAngle:Q,rx:u,ry:g}},je=(t,e,r,s,n,o,i,l,c)=>{const{rx:a,ry:m,startAngle:h,endAngle:f}=he(t,e,r,s,n,o,i,l,c);return Te(a,m,f-h)},tt=(t,e,r,s,n,o,i,l,c,a)=>{let m={x:t,y:e};const{center:h,rx:f,ry:y,startAngle:u,endAngle:g}=he(t,e,r,s,n,o,i,l,c);if(typeof a=="number"){const p=Te(f,y,g-u);if(a<=0)m={x:t,y:e};else if(a>=p)m={x:l,y:c};else{if(t===l&&e===c)return{x:l,y:c};if(f===0||y===0)return we(t,e,l,c,a);const{PI:b,cos:M,sin:d}=Math,x=g-u,S=(n%360+360)%360*(b/180),j=u+x*(a/p),$=f*M(j),T=y*d(j);m={x:M(S)*$-d(S)*T+h.x,y:d(S)*$+M(S)*T+h.y}}}return m},nt=(t,e,r,s,n,o,i,l,c)=>{const{center:a,rx:m,ry:h,startAngle:f,endAngle:y}=he(t,e,r,s,n,o,i,l,c),u=y-f,{min:g,max:p,tan:b,atan2:M,PI:d}=Math,{x,y:A}=a,S=n*d/180,j=b(S),$=M(-h*j,m),T=$,N=$+d,R=M(h,m*j),J=R+d,z=[l],C=[c];let q=g(t,l),Q=p(t,l),E=g(e,c),B=p(e,c);const ee=y-u*1e-5,K=U(x,A,m,h,S,ee),w=y-u*.99999,k=U(x,A,m,h,S,w);if(K[0]>Q||k[0]>Q){const v=U(x,A,m,h,S,T);z.push(v[0]),C.push(v[1])}if(K[0]B||k[1]>B){const v=U(x,A,m,h,S,R);z.push(v[0]),C.push(v[1])}return q=g.apply([],z),E=g.apply([],C),Q=p.apply([],z),B=p.apply([],C),[q,E,Q,B]},Rt=Object.freeze(Object.defineProperty({__proto__:null,angleBetween:ve,arcLength:Te,arcPoint:U,getArcBBox:nt,getArcLength:je,getArcProps:he,getPointAtArcLength:tt},Symbol.toStringTag,{value:"Module"})),$e=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],rt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],st=t=>{const e=[];for(let r=t,s=r.length,n=s-1;s>1;s-=1,n-=1){const o=[];for(let i=0;i{if(e===0)return t[0].t=0,t[0];const r=t.length-1;if(e===1)return t[r].t=1,t[r];const s=1-e;let n=t;if(r===0)return t[0].t=e,t[0];if(r===1)return{x:s*n[0].x+e*n[1].x,y:s*n[0].y+e*n[1].y,t:e};const o=s*s,i=e*e;let l=0,c=0,a=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],l=o,c=s*e*2,a=i):r===3&&(l=o*s,c=o*e*3,a=s*i*3,m=e*i),{x:l*n[0].x+c*n[1].x+a*n[2].x+m*n[3].x,y:l*n[0].y+c*n[1].y+a*n[2].y+m*n[3].y,t:e}},it=(t,e)=>{const r=t(e),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},ct=t=>{const r=$e.length;let s=0;for(let n=0,o;n{const e=[];for(let s=0,n=t.length,o=2;sot(r[0],s))},lt=1e-8,fe=([t,e,r])=>{const s=Math.min(t,r),n=Math.max(t,r);if(e>=t?r>=e:r<=e)return[s,n];const o=(t*r-e*e)/(t-2*e+r);return o{const n=t-3*e+3*r-s;if(Math.abs(n)0&&m<1){const f=t*(1-m)*(1-m)*(1-m)+e*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fc&&(c=f)}return[l,c]},Qt=Object.freeze(Object.defineProperty({__proto__:null,CBEZIER_MINMAX_EPSILON:lt,Cvalues:rt,Tvalues:$e,bezierLength:ct,calculateBezier:it,computeBezier:ot,deriveBezier:st,getBezierLength:re,minmaxC:ze,minmaxQ:fe},Symbol.toStringTag,{value:"Module"})),at=([t,e,r,s,n,o,i,l],c)=>{const a=1-c;return{x:a**3*t+3*a**2*c*r+3*a*c**2*n+c**3*i,y:a**3*e+3*a**2*c*s+3*a*c**2*o+c**3*l}},ye=(t,e,r,s,n,o,i,l)=>re([t,e,r,s,n,o,i,l]),mt=(t,e,r,s,n,o,i,l,c)=>{const a=typeof c=="number";let m={x:t,y:e};if(a){const h=re([t,e,r,s,n,o,i,l]);c<=0||(c>=h?m={x:i,y:l}:m=at([t,e,r,s,n,o,i,l],c/h))}return m},qe=(t,e,r,s,n,o,i,l)=>{const c=ze([t,r,n,i]),a=ze([e,s,o,l]);return[c[0],a[0],c[1],a[1]]},Zt=Object.freeze(Object.defineProperty({__proto__:null,getCubicBBox:qe,getCubicLength:ye,getPointAtCubicLength:mt,getPointAtCubicSegmentLength:at},Symbol.toStringTag,{value:"Module"})),ut=([t,e,r,s,n,o],i)=>{const l=1-i;return{x:l**2*t+2*l*i*r+i**2*n,y:l**2*e+2*l*i*s+i**2*o}},ge=(t,e,r,s,n,o)=>re([t,e,r,s,n,o]),ht=(t,e,r,s,n,o,i)=>{const l=typeof i=="number";let c={x:t,y:e};if(l){const a=re([t,e,r,s,n,o]);i<=0||(i>=a?c={x:n,y:o}:c=ut([t,e,r,s,n,o],i/a))}return c},ke=(t,e,r,s,n,o)=>{const i=fe([t,r,n]),l=fe([e,s,o]);return[i[0],l[0],i[1],l[1]]},Dt=Object.freeze(Object.defineProperty({__proto__:null,getPointAtQuadLength:ht,getPointAtQuadSegmentLength:ut,getQuadBBox:ke,getQuadLength:ge},Symbol.toStringTag,{value:"Module"})),Bt=Object.freeze(Object.defineProperty({__proto__:null,polygonArea:t=>{const e=t.length;let r=-1,s,n=t[e-1],o=0;for(;++rt.reduce((e,r,s)=>s?e+ue(t[s-1],r):0,0)},Symbol.toStringTag,{value:"Module"})),W={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Ie=t=>{let e=t.pathValue[t.segmentStart],r=e.toLowerCase();const{data:s}=t;for(;s.length>=W[r]&&(r==="m"&&s.length>2?(t.segments.push([e].concat(s.splice(0,2))),r="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(s.splice(0,W[r]))),!!W[r]););},O="SVGPathCommander Error",ft=t=>{const{index:e,pathValue:r}=t,s=r.charCodeAt(e);if(s===48){t.param=0,t.index+=1;return}if(s===49){t.param=1,t.index+=1;return}t.err=`${O}: invalid Arc flag "${r[e]}", expecting 0 or 1 at index ${e}`},H=t=>t>=48&&t<=57,F="Invalid path value",yt=t=>{const{max:e,pathValue:r,index:s}=t;let n=s,o=!1,i=!1,l=!1,c=!1,a;if(n>=e){t.err=`${O}: ${F} at index ${n}, "pathValue" is missing param`;return}if(a=r.charCodeAt(n),(a===43||a===45)&&(n+=1,a=r.charCodeAt(n)),!H(a)&&a!==46){t.err=`${O}: ${F} at index ${n}, "${r[n]}" is not a number`;return}if(a!==46){if(o=a===48,n+=1,a=r.charCodeAt(n),o&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),X=t=>{const{pathValue:e,max:r}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},xt=t=>H(t)||t===43||t===45||t===46,pt=t=>(t|32)===97,bt=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Ee=t=>{var c;const{max:e,pathValue:r,index:s,segments:n}=t,o=r.charCodeAt(s),i=W[r[s].toLowerCase()];if(t.segmentStart=s,!dt(o)){t.err=`${O}: ${F} "${r[s]}" is not a path command at index ${s}`;return}const l=n[n.length-1];if(!bt(o)&&((c=l==null?void 0:l[0])==null?void 0:c.toLocaleLowerCase())==="z"){t.err=`${O}: ${F} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(t.index+=1,X(t),t.data=[],!i){Ie(t);return}for(;;){for(let a=i;a>0;a-=1){if(pt(o)&&(a===3||a===4)?ft(t):yt(t),t.err.length)return;t.data.push(t.param),X(t),t.index=t.max||!xt(r.charCodeAt(t.index)))break}Ie(t)};class Oe{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const V=t=>{if(typeof t!="string")return t.slice(0);const e=new Oe(t);for(X(e);e.index{const[n]=t,o=n.toUpperCase();if(e===0||o===n)return t;if(o==="A")return[o,t[1],t[2],t[3],t[4],t[5],t[6]+r,t[7]+s];if(o==="V")return[o,t[1]+s];if(o==="H")return[o,t[1]+r];if(o==="L")return[o,t[1]+r,t[2]+s];{const l=[],c=t.length;for(let a=1;a{let r=t.length,s,n="M",o="M",i=!1,l=0,c=0,a=0,m=0,h=0;for(let f=0;f{const e=V(t);return _(e,se)},Ve=(t,e,r,s)=>{const[n]=t,o=n.toLowerCase();if(e===0||n===o)return t;if(o==="a")return[o,t[1],t[2],t[3],t[4],t[5],t[6]-r,t[7]-s];if(o==="v")return[o,t[1]-s];if(o==="h")return[o,t[1]-r];if(o==="l")return[o,t[1]-r,t[2]-s];{const l=[],c=t.length;for(let a=1;a{const e=V(t);return _(e,Ve)},oe=(t,e,r)=>{const{sin:s,cos:n}=Math,o=t*n(r)-e*s(r),i=t*s(r)+e*n(r);return{x:o,y:i}},xe=(t,e,r,s,n,o,i,l,c,a)=>{let m=t,h=e,f=r,y=s,u=l,g=c;const p=Math.PI*120/180,b=Math.PI/180*(+n||0);let M=[],d,x,A,S,j;if(a)[x,A,S,j]=a;else{d=oe(m,h,-b),m=d.x,h=d.y,d=oe(u,g,-b),u=d.x,g=d.y;const w=(m-u)/2,k=(h-g)/2;let v=w*w/(f*f)+k*k/(y*y);v>1&&(v=Math.sqrt(v),f*=v,y*=v);const De=f*f,Be=y*y,It=(o===i?-1:1)*Math.sqrt(Math.abs((De*Be-De*k*k-Be*w*w)/(De*k*k+Be*w*w)));S=It*f*k/y+(m+u)/2,j=It*-y*w/f+(h+g)/2,x=Math.asin(((h-j)/y*10**9>>0)/10**9),A=Math.asin(((g-j)/y*10**9>>0)/10**9),x=mA&&(x-=Math.PI*2),!i&&A>x&&(A-=Math.PI*2)}let $=A-x;if(Math.abs($)>p){const w=A,k=u,v=g;A=x+p*(i&&A>x?1:-1),u=S+f*Math.cos(A),g=j+y*Math.sin(A),M=xe(u,g,f,y,n,0,i,k,v,[A,w,S,j])}$=A-x;const T=Math.cos(x),N=Math.sin(x),R=Math.cos(A),J=Math.sin(A),z=Math.tan($/4),C=4/3*f*z,q=4/3*y*z,Q=[m,h],E=[m+C*N,h-q*T],B=[u+C*J,g-q*R],ee=[u,g];if(E[0]=2*Q[0]-E[0],E[1]=2*Q[1]-E[1],a)return[E[0],E[1],B[0],B[1],ee[0],ee[1]].concat(M);M=[E[0],E[1],B[0],B[1],ee[0],ee[1]].concat(M);const K=[];for(let w=0,k=M.length;w{const i=.3333333333333333,l=2/3;return[i*t+l*r,i*e+l*s,i*n+l*r,i*o+l*s,n,o]},_e=(t,e,r,s)=>{const n=Z([t,e],[r,s],.3333333333333333),o=Z([t,e],[r,s],2/3);return[n[0],n[1],o[0],o[1],r,s]},Ct=(t,e)=>{const[r]=t,s=t.slice(1).map(Number),[n,o]=s,{x1:i,y1:l,x:c,y:a}=e;return"TQ".includes(r)||(e.qx=null,e.qy=null),r==="M"?(e.x=n,e.y=o,t):r==="A"?["C"].concat(xe(i,l,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(e.qx=n,e.qy=o,["C"].concat(At(i,l,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(_e(i,l,n,o)):r==="Z"?["C"].concat(_e(i,l,c,a)):t},pe=(t,e)=>{const[r]=t,s=r.toUpperCase(),n=r!==s,{x1:o,y1:i,x2:l,y2:c,x:a,y:m}=e,h=t.slice(1);let f=h.map((y,u)=>y+(n?u%2?m:a:0));if("TQ".includes(s)||(e.qx=null,e.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?a:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",t[1]+(n?a:0),i];if(s==="V")return["L",o,t[1]+(n?m:0)];if(s==="L")return["L",t[1]+(n?a:0),t[2]+(n?m:0)];if(s==="M")return["M",t[1]+(n?a:0),t[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const y=o*2-l,u=i*2-c;return e.x1=y,e.y1=u,["C",y,u].concat(f)}else if(s==="T"){const y=o*2-(e.qx?e.qx:0),u=i*2-(e.qy?e.qy:0);return e.qx=y,e.qy=u,["Q",y,u].concat(f)}else if(s==="Q"){const[y,u]=f;return e.qx=y,e.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return t},ie={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},be=t=>{const e={...ie},r=V(t);return _(r,(s,n,o,i)=>{e.x=o,e.y=i;const l=pe(s,e);let c=Ct(l,e);c[0]==="C"&&c.length>7&&(r.splice(n+1,0,["C"].concat(c.slice(7))),c=c.slice(0,7));const m=c.length;return e.x1=+c[m-2],e.y1=+c[m-1],e.x2=+c[m-4]||e.x1,e.y2=+c[m-3]||e.y1,c})},G={origin:[0,0,0],round:4},L=(t,e)=>{const r=e>=1?10**e:1;return e>0?Math.round(t*r)/r:Math.round(t)},Re=(t,e)=>{const r=t.length;let{round:s}=G,n=t[0],o="";s=e==="off"||typeof e=="number"&&e>=0?e:typeof s=="number"&&s>=0?s:"off";for(let i=0;i{const e=V(t),r={...ie};return _(e,(s,n,o,i)=>{r.x=o,r.y=i;const l=pe(s,r),c=l.length;return r.x1=+l[c-2],r.y1=+l[c-1],r.x2=+l[c-4]||r.x1,r.y2=+l[c-3]||r.y1,l})},le=(t,e)=>{const r=ce(t);let s=!1,n=[],o="M",i=0,l=0,[c,a]=r[0].slice(1);const m=typeof e=="number";let h={x:c,y:a},f=0,y=h,u=0;return!m||e{if([o]=g,s=o==="M",n=s?n:[b,M].concat(g.slice(1)),s?([,c,a]=g,h={x:c,y:a},f=0):o==="L"?(h=we(n[0],n[1],n[2],n[3],e-u),f=ne(n[0],n[1],n[2],n[3])):o==="A"?(h=tt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],e-u),f=je(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):o==="C"?(h=mt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],e-u),f=ye(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):o==="Q"?(h=ht(n[0],n[1],n[2],n[3],n[4],n[5],e-u),f=ge(n[0],n[1],n[2],n[3],n[4],n[5])):o==="Z"&&(n=[b,M,c,a],h={x:c,y:a},f=ne(n[0],n[1],n[2],n[3])),[i,l]=n.slice(-2),uu-Me?{x:i,y:l}:y)},Y=t=>{const e=V(t);let r=0,s=0,n=0,o=0,i=0,l=0,c="M",a=0,m=0,h=0;return _(e,(f,y,u,g)=>{[c]=f;const p=c.toUpperCase(),M=p!==c?se(f,y,u,g):f.slice(0),d=p==="V"?["L",u,M[1]]:p==="H"?["L",M[1],g]:M;if([c]=d,"TQ".includes(p)||(i=0,l=0),c==="M")[,a,m]=d;else if(c==="L")h+=ne(u,g,d[1],d[2]);else if(c==="A")h+=je(u,g,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(c==="S"){const x=r*2-n,A=s*2-o;h+=ye(u,g,x,A,d[1],d[2],d[3],d[4])}else c==="C"?h+=ye(u,g,d[1],d[2],d[3],d[4],d[5],d[6]):c==="T"?(i=r*2-i,l=s*2-l,h+=ge(u,g,i,l,d[1],d[2])):c==="Q"?(i=d[1],l=d[2],h+=ge(u,g,d[1],d[2],d[3],d[4])):c==="Z"&&(h+=ne(u,g,a,m));[r,s]=c==="Z"?[a,m]:d.slice(-2),[n,o]=c==="C"?[d[3],d[4]]:c==="S"?[d[1],d[2]]:[r,s]}),h},Qe=(t,e)=>{const r=V(t);let s=r.slice(0),n=Y(s),o=s.length-1,i=0,l=0,c=r[0];if(o<=0||!e||!Number.isFinite(e))return{segment:c,index:0,length:l,lengthAtSegment:i};if(e>=n)return s=r.slice(0,-1),i=Y(s),l=n-i,c=r[o],{segment:c,index:o,length:l,lengthAtSegment:i};const a=[];for(;o>0;)c=s[o],s=s.slice(0,-1),i=Y(s),l=n-i,n=i,a.push({segment:c,index:o,length:l,lengthAtSegment:i}),o-=1;return a.find(({lengthAtSegment:m})=>m<=e)},Ae=(t,e)=>{const r=V(t),s=ce(r),n=Y(s),o=x=>{const A=x.x-e.x,S=x.y-e.y;return A*A+S*S};let i=8,l,c={x:0,y:0},a=0,m=0,h=1/0;for(let x=0;x<=n;x+=i)l=le(s,x),a=o(l),a1e-6&&(u=m-i,f=le(s,u),p=o(f),g=m+i,y=le(s,g),b=o(y),u>=0&&pAe(t,e).closest,Ft=(t,e,r,s,n,o,i,l)=>3*((l-e)*(r+n)-(i-t)*(s+o)+s*(t-n)-r*(e-o)+l*(n+t/3)-i*(o+e/3))/20,St=t=>{let e=0,r=0,s=0;return be(t).map(n=>{switch(n[0]){case"M":return[,e,r]=n,0;default:return s=Ft(e,r,n[1],n[2],n[3],n[4],n[5],n[6]),[e,r]=n.slice(-2),s}}).reduce((n,o)=>n+o,0)},Ut=t=>St(be(t))>=0,Pt=t=>{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const e=V(t);let r="M",s=0,n=0;const{max:o,min:i}=Math;let l=1/0,c=1/0,a=-1/0,m=-1/0,h=0,f=0,y=0,u=0,g=0,p=0,b=0,M=0,d=0,x=0;_(e,(j,$,T,N)=>{[r]=j;const R=r.toUpperCase(),z=R!==r?se(j,$,T,N):j.slice(0),C=R==="V"?["L",T,z[1]]:R==="H"?["L",z[1],N]:z;if([r]=C,"TQ".includes(R)||(d=0,x=0),r==="M")[,s,n]=C,h=s,f=n,y=s,u=n;else if(r==="L")[h,f,y,u]=Le(T,N,C[1],C[2]);else if(r==="A")[h,f,y,u]=nt(T,N,C[1],C[2],C[3],C[4],C[5],C[6],C[7]);else if(r==="S"){const q=g*2-b,Q=p*2-M;[h,f,y,u]=qe(T,N,q,Q,C[1],C[2],C[3],C[4])}else r==="C"?[h,f,y,u]=qe(T,N,C[1],C[2],C[3],C[4],C[5],C[6]):r==="T"?(d=g*2-d,x=p*2-x,[h,f,y,u]=ke(T,N,d,x,C[1],C[2])):r==="Q"?(d=C[1],x=C[2],[h,f,y,u]=ke(T,N,C[1],C[2],C[3],C[4])):r==="Z"&&([h,f,y,u]=Le(T,N,s,n));l=i(h,l),c=i(f,c),a=o(y,a),m=o(u,m),[g,p]=r==="Z"?[s,n]:C.slice(-2),[b,M]=r==="C"?[C[3],C[4]]:r==="S"?[C[1],C[2]]:[g,p]});const A=a-l,S=m-c;return{width:A,height:S,x:l,y:c,x2:a,y2:m,cx:l+A/2,cy:c+S/2,cz:Math.max(A,S)+Math.min(A,S)/2}},Gt=(t,e)=>Qe(t,e).segment,Jt=(t,e)=>Ae(t,e).segment,Ce=t=>Array.isArray(t)&&t.every(e=>{const r=e[0].toLowerCase();return W[r]===e.length-1&&"achlmqstvz".includes(r)&&e.slice(1).every(Number.isFinite)})&&t.length>0,Nt=t=>Ce(t)&&t.every(([e])=>e===e.toUpperCase()),wt=t=>Nt(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Kt=t=>wt(t)&&t.every(([e])=>"MC".includes(e)),Wt=(t,e)=>{const{distance:r}=Ae(t,e);return Math.abs(r)Ce(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Lt=t=>{if(typeof t!="string"||!t.length)return!1;const e=new Oe(t);for(X(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Yt=t=>{let{x1:e,y1:r,x2:s,y2:n}=t;return[e,r,s,n]=[e,r,s,n].map(o=>+o),[["M",e,r],["L",s,n]]},en=t=>{const e=[],r=(t.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:e,cy:r,r:s}=t;return[e,r,s]=[e,r,s].map(n=>+n),[["M",e-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},nn=t=>{let{cx:e,cy:r}=t,s=t.rx||0,n=t.ry||s;return[e,r,s,n]=[e,r,s,n].map(o=>+o),[["M",e-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},rn=t=>{const e=+t.x||0,r=+t.y||0,s=+t.width,n=+t.height;let o=+(t.rx||0),i=+(t.ry||o);return o||i?(o*2>s&&(o-=(o*2-s)/2),i*2>n&&(i-=(i*2-n)/2),[["M",e+o,r],["h",s-o*2],["s",o,0,o,i],["v",n-i*2],["s",0,i,-o,i],["h",-s+o*2],["s",-o,0,-o,-i],["v",-n+i*2],["s",0,-i,o,-i]]):[["M",e,r],["h",s],["v",n],["H",e],["Z"]]},vt=t=>{const e=Object.keys(ae),r=Tt(t),s=r?t.tagName:null;if(s&&[...e,"path"].every(c=>s!==c))throw TypeError(`${O}: "${s}" is not SVGElement`);const n=r?s:t.type,o=ae[n],i={type:n};r?o.forEach(c=>{i[c]=t.getAttribute(c)}):Object.assign(i,t);let l=[];return n==="circle"?l=tn(i):n==="ellipse"?l=nn(i):["polyline","polygon"].includes(n)?l=en(i):n==="rect"?l=rn(i):n==="line"?l=Yt(i):["glyph","path"].includes(n)&&(l=V(r?t.getAttribute("d")||"":t.d||"")),Ce(l)&&l.length?l:!1},sn=(t,e,r)=>{const s=r||document,n=Object.keys(ae),o=Tt(t),i=o?t.tagName:null;if(i==="path")throw TypeError(`${O}: "${i}" is already SVGPathElement`);if(i&&n.every(u=>i!==u))throw TypeError(`${O}: "${i}" is not SVGElement`);const l=s.createElementNS("http://www.w3.org/2000/svg","path"),c=o?i:t.type,a=ae[c],m={type:c},h=G.round,f=vt(t),y=f&&f.length?Re(f,h):"";return o?(a.forEach(u=>{m[u]=t.getAttribute(u)}),Object.values(t.attributes).forEach(({name:u,value:g})=>{a.includes(u)||l.setAttribute(u,g)})):(Object.assign(m,t),Object.keys(m).forEach(u=>{!a.includes(u)&&u!=="type"&&l.setAttribute(u.replace(/[A-Z]/g,g=>`-${g.toLowerCase()}`),m[u])})),Lt(y)?(l.setAttribute("d",y),e&&o&&(t.before(l,t),t.remove()),l):!1},jt=t=>{let e=new P;const{origin:r}=t,[s,n]=r,{translate:o}=t,{rotate:i}=t,{skew:l}=t,{scale:c}=t;return Array.isArray(o)&&o.length>=2&&o.every(a=>!Number.isNaN(+a))&&o.some(a=>a!==0)?e=e.translate(...o):typeof o=="number"&&!Number.isNaN(o)&&(e=e.translate(o)),(i||l||c)&&(e=e.translate(s,n),Array.isArray(i)&&i.length>=2&&i.every(a=>!Number.isNaN(+a))&&i.some(a=>a!==0)?e=e.rotate(...i):typeof i=="number"&&!Number.isNaN(i)&&(e=e.rotate(i)),Array.isArray(l)&&l.length===2&&l.every(a=>!Number.isNaN(+a))&&l.some(a=>a!==0)?(e=l[0]?e.skewX(l[0]):e,e=l[1]?e.skewY(l[1]):e):typeof l=="number"&&!Number.isNaN(l)&&(e=e.skewX(l)),Array.isArray(c)&&c.length>=2&&c.every(a=>!Number.isNaN(+a))&&c.some(a=>a!==1)?e=e.scale(...c):typeof c=="number"&&!Number.isNaN(c)&&(e=e.scale(c)),e=e.translate(-s,-n)),e},$t=(t,e,r,s)=>{const[n]=t,{round:o}=G,i=o,l=e.slice(1),{x1:c,y1:a,x2:m,y2:h,x:f,y}=r,[u,g]=l.slice(-2),p=t;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(L(f,i)===L(u,i))return["V",g];if(L(y,i)===L(g,i))return["H",u]}else if(n==="C"){const[b,M]=l;if(r.x1=b,r.y1=M,"CS".includes(s)&&(L(b,i)===L(c*2-m,i)&&L(M,i)===L(a*2-h,i)||L(c,i)===L(m*2-f,i)&&L(a,i)===L(h*2-y,i)))return["S",l[2],l[3],l[4],l[5]]}else if(n==="Q"){const[b,M]=l;if(r.qx=b,r.qy=M,"QT".includes(s)&&L(b,i)===L(c*2-m,i)&&L(M,i)===L(a*2-h,i))return["T",l[2],l[3]]}return p},Se=(t,e)=>{const r=t.slice(1).map(s=>L(s,e));return[t[0]].concat(r)},zt=(t,e)=>{const r=de(t),s=typeof e=="number"&&e>=0?e:2,n={...ie},o=[];let i="M",l="Z";return _(r,(c,a,m,h)=>{n.x=m,n.y=h;const f=pe(c,n);let y=c;if([i]=c,o[a]=i,a){l=o[a-1];const g=$t(c,f,n,l),p=Se(g,s),b=p.join(""),M=Ve(g,a,m,h),d=Se(M,s),x=d.join("");y=b.length{let r=P.Translate(e[0],e[1],e[2]);return[,,,r.m44]=e,r=t.multiply(r),[r.m41,r.m42,r.m43,r.m44]},Ze=(t,e,r)=>{const[s,n,o]=r,[i,l,c]=on(t,[e[0],e[1],0,1]),a=i-s,m=l-n,h=c-o;return[a*(Math.abs(o)/Math.abs(h)||1)+s,m*(Math.abs(o)/Math.abs(h)||1)+n]},cn=t=>{const e=t.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):t[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(r=>["C"].concat(r.slice(2))))},Pe=t=>{const e=de(t),r=ce(e),s=e.length,n=e[s-1][0]==="Z",o=_(e,(i,l)=>{const c=r[l],a=l&&e[l-1],m=a&&a[0],h=e[l+1],f=h&&h[0],[y]=i,[u,g]=r[l?l-1:s-1].slice(-2);let p=i;switch(y){case"M":p=n?["Z"]:[y,u,g];break;case"A":p=[y,i[1],i[2],i[3],i[4],i[5]===1?0:1,u,g];break;case"C":h&&f==="S"?p=["S",i[1],i[2],u,g]:p=[y,i[3],i[4],i[1],i[2],u,g];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?p=["C",c[3],c[4],c[1],c[2],u,g]:p=[y,c[1],c[2],u,g];break;case"Q":h&&f==="T"?p=["T",u,g]:p=[y,i[1],i[2],u,g];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?p=["Q",c[1],c[2],u,g]:p=[y,u,g];break;case"Z":p=["M",u,g];break;case"H":p=[y,u];break;case"V":p=[y,g];break;default:p=[y].concat(i.slice(1,-2),u,g)}return p});return n?o.reverse():[o[0]].concat(o.slice(1).reverse())},ln=(t,e)=>{let{round:r}=G;return r=e==="off"||typeof e=="number"&&e>=0?e:typeof r=="number"&&r>=0?r:"off",r==="off"?t.slice(0):_(t,s=>Se(s,r))},an=(t,e=.5)=>{const r=e,s=t.slice(0,2),n=t.slice(2,4),o=t.slice(4,6),i=t.slice(6,8),l=Z(s,n,r),c=Z(n,o,r),a=Z(o,i,r),m=Z(l,c,r),h=Z(c,a,r),f=Z(m,h,r);return[["C",l[0],l[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],a[0],a[1],i[0],i[1]]]},qt=t=>{const e=[];let r,s=-1,n=0,o=0,i=0,l=0;const c={...ie};return t.forEach(a=>{const[m]=a,h=m.toUpperCase(),f=m.toLowerCase(),y=m===f,u=a.slice(1);h==="M"?(s+=1,[n,o]=u,n+=y?c.x:0,o+=y?c.y:0,i=n,l=o,r=[y?[h,i,l]:a]):(h==="Z"?(n=i,o=l):h==="H"?([,n]=a,n+=y?c.x:0):h==="V"?([,o]=a,o+=y?c.y:0):([n,o]=a.slice(-2),n+=y?c.x:0,o+=y?c.y:0),r.push(a)),c.x=n,c.y=o,e[s]=r}),e},kt=(t,e)=>{let r=0,s=0,n=0,o=0,i=0,l=0,c="M";const a=V(t),m=e&&Object.keys(e);if(!e||m&&!m.length)return a.slice(0);e.origin||Object.assign(e,{origin:G.origin});const h=e.origin,f=jt(e);return f.isIdentity?a.slice(0):_(a,(y,u,g,p)=>{[c]=y;const b=c.toUpperCase(),d=b!==c?se(y,u,g,p):y.slice(0);let x=b==="A"?["C"].concat(xe(g,p,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):b==="V"?["L",g,d[1]]:b==="H"?["L",d[1],p]:d;c=x[0];const A=c==="C"&&x.length>7,S=A?x.slice(0,7):x.slice(0);if(A&&(a.splice(u+1,0,["C"].concat(x.slice(7))),x=S),c==="L")[n,o]=Ze(f,[x[1],x[2]],h),r!==n&&s!==o?x=["L",n,o]:s===o?x=["H",n]:r===n&&(x=["V",o]);else for(i=1,l=x.length;i"u";if(n||!e.length)throw TypeError(`${O}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=V(e);const{round:o,origin:i}=s;let l;Number.isInteger(o)||o==="off"?l=o:l=G.round;let c=G.origin;if(Array.isArray(i)&&i.length>=2){const[a,m,h]=i.map(Number);c=[Number.isNaN(a)?0:a,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=l,this.origin=c,this}get bbox(){return Pt(this.segments)}get length(){return Y(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return le(this.segments,e)}toAbsolute(){const{segments:e}=this;return this.segments=de(e),this}toRelative(){const{segments:e}=this;return this.segments=Mt(e),this}toCurve(){const{segments:e}=this;return this.segments=be(e),this}reverse(e){const{segments:r}=this,s=qt(r),n=s.length>1?s:!1,o=n?n.map((l,c)=>e?c?Pe(l):l.slice(0):Pe(l)):r.slice(0);let i=[];return n?i=o.flat(1):i=e?r:Pe(r),this.segments=i.slice(0),this}normalize(){const{segments:e}=this;return this.segments=ce(e),this}optimize(){const{segments:e}=this,r=this.round==="off"?2:this.round;return this.segments=zt(e,r),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(c=>c in e))return this;const{segments:r,origin:[s,n,o]}=this,i={};for(const[c,a]of Object.entries(e))c==="skew"&&Array.isArray(a)||(c==="rotate"||c==="translate"||c==="origin"||c==="scale")&&Array.isArray(a)?i[c]=a.map(Number):c!=="origin"&&typeof Number(a)=="number"&&(i[c]=Number(a));const{origin:l}=i;if(Array.isArray(l)&&l.length>=2){const[c,a,m]=l.map(Number);i.origin=[Number.isNaN(c)?s:c,Number.isNaN(a)?n:a,m||o]}else i.origin=[s,n,o];return this.segments=kt(r,i),this}flipX(){const{cx:e,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,r,0]}),this}flipY(){const{cx:e,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,r,0]}),this}toString(){return Re(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}}return Object.assign(un,mn)}(); +var SVGPathCommander=function(b){"use strict";var tn=Object.defineProperty,en=(e,t,r)=>t in e?tn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,I=(e,t,r)=>en(e,typeof t!="symbol"?t+"":t,r);const nn={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},fe=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),ge=e=>e instanceof DOMMatrix||e instanceof T||typeof e=="object"&&Object.keys(nn).every(t=>e&&t in e),ct=e=>{const t=new T,r=Array.from(e);if(!fe(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[i,n,s,o,c,a,l,m,h,f,g,u,y,A,x,C]=r;t.m11=i,t.a=i,t.m21=c,t.c=c,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=a,t.d=a,t.m32=f,t.m42=A,t.f=A,t.m13=s,t.m23=l,t.m33=g,t.m43=x,t.m14=o,t.m24=m,t.m34=u,t.m44=C}else if(r.length===6){const[i,n,s,o,c,a]=r;t.m11=i,t.a=i,t.m12=n,t.b=n,t.m21=s,t.c=s,t.m22=o,t.d=o,t.m41=c,t.e=c,t.m42=a,t.f=a}return t},ye=e=>{if(ge(e))return ct([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},de=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new T;const i=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[s,o]=n.split("(");if(!o)throw TypeError(i);const c=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[a,l,m,h]=c,f=[a,l,m],g=[a,l,m,h];if(s==="perspective"&&a&&[l,m].every(u=>u===void 0))r.m34=-1/a;else if(s.includes("matrix")&&[6,16].includes(c.length)&&c.every(u=>!Number.isNaN(+u))){const u=c.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(ct(u))}else if(s==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(a,l,m);else if(s==="translate"&&a&&m===void 0)r=r.translate(a,l||0,0);else if(s==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(a,l,m,h);else if(s==="rotate"&&a&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,a);else if(s==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(a,l,m);else if(s==="scale"&&!Number.isNaN(a)&&(a!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?a:l;r=r.scale(a,u,1)}else if(s==="skew"&&(a||!Number.isNaN(a)&&l)&&m===void 0)r=r.skew(a,l||0);else if(["translate","rotate","scale","skew"].some(u=>s.includes(u))&&/[XYZ]/.test(s)&&a&&[l,m].every(u=>u===void 0))if(s==="skewX"||s==="skewY")r=r[s](a);else{const u=s.replace(/[XYZ]/,""),y=s.replace(u,""),A=["X","Y","Z"].indexOf(y),x=u==="scale"?1:0,C=[A===0?a:x,A===1?a:x,A===2?a:x];r=r[u](...C)}else throw TypeError(i)}),r},kt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],be=(e,t,r)=>{const i=new T;return i.m41=e,i.e=e,i.m42=t,i.f=t,i.m43=r,i},pe=(e,t,r)=>{const i=new T,n=Math.PI/180,s=e*n,o=t*n,c=r*n,a=Math.cos(s),l=-Math.sin(s),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(c),g=-Math.sin(c),u=m*f,y=-m*g;i.m11=u,i.a=u,i.m12=y,i.b=y,i.m13=h;const A=l*h*f+a*g;i.m21=A,i.c=A;const x=a*f-l*h*g;return i.m22=x,i.d=x,i.m23=-l*m,i.m31=l*g-a*h*f,i.m32=l*f+a*h*g,i.m33=a*m,i},Ae=(e,t,r,i)=>{const n=new T,s=Math.sqrt(e*e+t*t+r*r);if(s===0)return n;const o=e/s,c=t/s,a=r/s,l=i*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=c*c,y=a*a,A=1-2*(u+y)*f;n.m11=A,n.a=A;const x=2*(o*c*f+a*m*h);n.m12=x,n.b=x,n.m13=2*(o*a*f-c*m*h);const C=2*(c*o*f-a*m*h);n.m21=C,n.c=C;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(c*a*f+o*m*h),n.m31=2*(a*o*f+c*m*h),n.m32=2*(a*c*f-o*m*h),n.m33=1-2*(g+u)*f,n},xe=(e,t,r)=>{const i=new T;return i.m11=e,i.a=e,i.m22=t,i.d=t,i.m33=r,i},Ct=(e,t)=>{const r=new T;if(e){const i=e*Math.PI/180,n=Math.tan(i);r.m21=n,r.c=n}if(t){const i=t*Math.PI/180,n=Math.tan(i);r.m12=n,r.b=n}return r},Ce=e=>Ct(e,0),Me=e=>Ct(0,e),B=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,i=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,s=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,c=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,a=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,A=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,x=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return ct([r,i,n,s,o,c,a,l,m,h,f,g,u,y,A,x])};class T{constructor(t){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,t?this.setMatrixValue(t):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?de(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?ct(t):typeof t=="object"?ye(t):this}toFloat32Array(t){return Float32Array.from(kt(this,t))}toFloat64Array(t){return Float64Array.from(kt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return B(this,t)}translate(t,r,i){const n=t;let s=r,o=i;return typeof s>"u"&&(s=0),typeof o>"u"&&(o=0),B(this,be(n,s,o))}scale(t,r,i){const n=t;let s=r,o=i;return typeof s>"u"&&(s=t),typeof o>"u"&&(o=1),B(this,xe(n,s,o))}rotate(t,r,i){let n=t,s=r||0,o=i||0;return typeof t=="number"&&typeof r>"u"&&typeof i>"u"&&(o=n,n=0,s=0),B(this,pe(n,s,o))}rotateAxisAngle(t,r,i,n){if([t,r,i,n].some(s=>Number.isNaN(+s)))throw new TypeError("CSSMatrix: expecting 4 values");return B(this,Ae(t,r,i,n))}skewX(t){return B(this,Ce(t))}skewY(t){return B(this,Me(t))}skew(t,r){return B(this,Ct(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,i=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,s=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,i,n,s):{x:r,y:i,z:n,w:s}}}I(T,"Translate",be),I(T,"Rotate",pe),I(T,"RotateAxisAngle",Ae),I(T,"Scale",xe),I(T,"SkewX",Ce),I(T,"SkewY",Me),I(T,"Skew",Ct),I(T,"Multiply",B),I(T,"fromArray",ct),I(T,"fromMatrix",ye),I(T,"fromString",de),I(T,"toArray",kt),I(T,"isCompatibleArray",fe),I(T,"isCompatibleObject",ge);const D=(e,t,r)=>{const[i,n]=e,[s,o]=t;return[i+(s-i)*r,n+(o-n)*r]},lt=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),mt=(e,t,r,i)=>lt([e,t],[r,i]),Vt=(e,t,r,i,n)=>{let s={x:e,y:t};if(typeof n=="number"){const o=lt([e,t],[r,i]);if(n<=0)s={x:e,y:t};else if(n>=o)s={x:r,y:i};else{const[c,a]=D([e,t],[r,i],n/o);s={x:c,y:a}}}return s},It=(e,t,r,i)=>{const{min:n,max:s}=Math;return[n(e,r),n(t,i),s(e,r),s(t,i)]},Pe=Object.freeze(Object.defineProperty({__proto__:null,getLineBBox:It,getLineLength:mt,getPointAtLineLength:Vt},Symbol.toStringTag,{value:"Module"})),Rt=(e,t,r)=>{const i=r/2,n=Math.sin(i),s=Math.cos(i),o=e**2*n**2,c=t**2*s**2,a=Math.sqrt(o+c)*r;return Math.abs(a)},U=(e,t,r,i,n,s)=>{const{sin:o,cos:c}=Math,a=c(n),l=o(n),m=r*c(s),h=i*o(s);return[e+a*m-l*h,t+l*m+a*h]},Et=(e,t)=>{const{x:r,y:i}=e,{x:n,y:s}=t,o=r*n+i*s,c=Math.sqrt((r**2+i**2)*(n**2+s**2));return(r*s-i*n<0?-1:1)*Math.acos(o/c)},Mt=(e,t,r,i,n,s,o,c,a)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(i);const x=(n%360+360)%360*(g/180);if(e===c&&t===a)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:c,y:a}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(c+e)/2,y:(a+t)/2}};const C=(e-c)/2,d=(t-a)/2,p={x:h(x)*C+m(x)*d,y:-m(x)*C+h(x)*d},M=p.x**2/u**2+p.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const S=u**2*y**2-u**2*p.y**2-y**2*p.x**2,q=u**2*p.y**2+y**2*p.x**2;let j=S/q;j=j<0?0:j;const v=(s!==o?1:-1)*f(j),N={x:v*(u*p.y/y),y:v*(-(y*p.x)/u)},Q={x:h(x)*N.x-m(x)*N.y+(e+c)/2,y:m(x)*N.x+h(x)*N.y+(t+a)/2},Y={x:(p.x-N.x)/u,y:(p.y-N.y)/y},$=Et({x:1,y:0},Y),P={x:(-p.x-N.x)/u,y:(-p.y-N.y)/y};let k=Et(Y,P);!o&&k>0?k-=2*g:o&&k<0&&(k+=2*g),k%=2*g;const Z=$+k;return{center:Q,startAngle:$,endAngle:Z,rx:u,ry:y}},Ot=(e,t,r,i,n,s,o,c,a)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=Mt(e,t,r,i,n,s,o,c,a);return Rt(l,m,f-h)},Se=(e,t,r,i,n,s,o,c,a,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=Mt(e,t,r,i,n,s,o,c,a);if(typeof l=="number"){const A=Rt(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=A)m={x:c,y:a};else{if(e===c&&t===a)return{x:c,y:a};if(f===0||g===0)return Vt(e,t,c,a,l);const{PI:x,cos:C,sin:d}=Math,p=y-u,S=(n%360+360)%360*(x/180),q=u+p*(l/A),j=f*C(q),v=g*d(q);m={x:C(S)*j-d(S)*v+h.x,y:d(S)*j+C(S)*v+h.y}}}return m},Te=(e,t,r,i,n,s,o,c,a)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=Mt(e,t,r,i,n,s,o,c,a),u=g-f,{min:y,max:A,tan:x,atan2:C,PI:d}=Math,{x:p,y:M}=l,S=n*d/180,q=x(S),j=C(-h*q,m),v=j,N=j+d,Q=C(h,m*q),Y=Q+d,$=[c],P=[a];let k=y(e,c),Z=A(e,c),O=y(t,a),G=A(t,a);const at=g-u*1e-5,tt=U(p,M,m,h,S,at),L=g-u*.99999,V=U(p,M,m,h,S,L);if(tt[0]>Z||V[0]>Z){const z=U(p,M,m,h,S,v);$.push(z[0]),P.push(z[1])}if(tt[0]G||V[1]>G){const z=U(p,M,m,h,S,Q);$.push(z[0]),P.push(z[1])}return k=y.apply([],$),O=y.apply([],P),Z=A.apply([],$),G=A.apply([],P),[k,O,Z,G]},Ne=Object.freeze(Object.defineProperty({__proto__:null,angleBetween:Et,arcLength:Rt,arcPoint:U,getArcBBox:Te,getArcLength:Ot,getArcProps:Mt,getPointAtArcLength:Se},Symbol.toStringTag,{value:"Module"})),_t=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],we=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Le=e=>{const t=[];for(let r=e,i=r.length,n=i-1;i>1;i-=1,n-=1){const s=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const i=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:i*n[0].x+t*n[1].x,y:i*n[0].y+t*n[1].y,t};const s=i*i,o=t*t;let c=0,a=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],c=s,a=i*t*2,l=o):r===3&&(c=s*i,a=s*t*3,l=i*o*3,m=t*o),{x:c*n[0].x+a*n[1].x+l*n[2].x+m*n[3].x,y:c*n[0].y+a*n[1].y+l*n[2].y+m*n[3].y,t}},ze=(e,t)=>{const r=e(t),i=r.x*r.x+r.y*r.y;return Math.sqrt(i)},qe=e=>{const r=_t.length;let i=0;for(let n=0,s;n{const t=[];for(let i=0,n=e.length,s=2;ive(r[0],i))},je=1e-8,Pt=([e,t,r])=>{const i=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[i,n];const s=(e*r-t*t)/(e-2*t+r);return s{const n=e-3*t+3*r-i;if(Math.abs(n)0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+i*m*m*m;fa&&(a=f)}return[c,a]},$e=Object.freeze(Object.defineProperty({__proto__:null,CBEZIER_MINMAX_EPSILON:je,Cvalues:we,Tvalues:_t,bezierLength:qe,calculateBezier:ze,computeBezier:ve,deriveBezier:Le,getBezierLength:ut,minmaxC:Dt,minmaxQ:Pt},Symbol.toStringTag,{value:"Module"})),ke=([e,t,r,i,n,s,o,c],a)=>{const l=1-a;return{x:l**3*e+3*l**2*a*r+3*l*a**2*n+a**3*o,y:l**3*t+3*l**2*a*i+3*l*a**2*s+a**3*c}},St=(e,t,r,i,n,s,o,c)=>ut([e,t,r,i,n,s,o,c]),Ve=(e,t,r,i,n,s,o,c,a)=>{const l=typeof a=="number";let m={x:e,y:t};if(l){const h=ut([e,t,r,i,n,s,o,c]);a<=0||(a>=h?m={x:o,y:c}:m=ke([e,t,r,i,n,s,o,c],a/h))}return m},Qt=(e,t,r,i,n,s,o,c)=>{const a=Dt([e,r,n,o]),l=Dt([t,i,s,c]);return[a[0],l[0],a[1],l[1]]},Ie=Object.freeze(Object.defineProperty({__proto__:null,getCubicBBox:Qt,getCubicLength:St,getPointAtCubicLength:Ve,getPointAtCubicSegmentLength:ke},Symbol.toStringTag,{value:"Module"})),Re=([e,t,r,i,n,s],o)=>{const c=1-o;return{x:c**2*e+2*c*o*r+o**2*n,y:c**2*t+2*c*o*i+o**2*s}},Tt=(e,t,r,i,n,s)=>ut([e,t,r,i,n,s]),Ee=(e,t,r,i,n,s,o)=>{const c=typeof o=="number";let a={x:e,y:t};if(c){const l=ut([e,t,r,i,n,s]);o<=0||(o>=l?a={x:n,y:s}:a=Re([e,t,r,i,n,s],o/l))}return a},Zt=(e,t,r,i,n,s)=>{const o=Pt([e,r,n]),c=Pt([t,i,s]);return[o[0],c[0],o[1],c[1]]},Oe=Object.freeze(Object.defineProperty({__proto__:null,getPointAtQuadLength:Ee,getPointAtQuadSegmentLength:Re,getQuadBBox:Zt,getQuadLength:Tt},Symbol.toStringTag,{value:"Module"})),_e=Object.freeze(Object.defineProperty({__proto__:null,polygonArea:e=>{const t=e.length;let r=-1,i,n=e[t-1],s=0;for(;++re.reduce((t,r,i)=>i?t+lt(e[i-1],r):0,0)},Symbol.toStringTag,{value:"Module"})),et=(e,t,r)=>{const{sin:i,cos:n}=Math,s=e*n(r)-t*i(r),o=e*i(r)+t*n(r);return{x:s,y:o}},w=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},J={origin:[0,0,0],round:4},K={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Nt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:i}=e;for(;i.length>=K[r]&&(r==="m"&&i.length>2?(e.segments.push([t].concat(i.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(i.splice(0,K[r]))),!!K[r]););},_="SVGPathCommander Error",Bt=e=>{const{index:t,pathValue:r}=e,i=r.charCodeAt(t);if(i===48){e.param=0,e.index+=1;return}if(i===49){e.param=1,e.index+=1;return}e.err=`${_}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},H=e=>e>=48&&e<=57,F="Invalid path value",Ht=e=>{const{max:t,pathValue:r,index:i}=e;let n=i,s=!1,o=!1,c=!1,a=!1,l;if(n>=t){e.err=`${_}: ${F} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!H(l)&&l!==46){e.err=`${_}: ${F} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(s=l===48,n+=1,l=r.charCodeAt(n),s&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),W=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Ut=e=>H(e)||e===43||e===45||e===46,Jt=e=>(e|32)===97,Kt=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},wt=e=>{var a;const{max:t,pathValue:r,index:i,segments:n}=e,s=r.charCodeAt(i),o=K[r[i].toLowerCase()];if(e.segmentStart=i,!Gt(s)){e.err=`${_}: ${F} "${r[i]}" is not a path command at index ${i}`;return}const c=n[n.length-1];if(!Kt(s)&&((a=c==null?void 0:c[0])==null?void 0:a.toLocaleLowerCase())==="z"){e.err=`${_}: ${F} "${r[i]}" is not a MoveTo path command at index ${i}`;return}if(e.index+=1,W(e),e.data=[],!o){Nt(e);return}for(;;){for(let l=o;l>0;l-=1){if(Jt(s)&&(l===3||l===4)?Bt(e):Ht(e),e.err.length)return;e.data.push(e.param),W(e),e.index=e.max||!Ut(r.charCodeAt(e.index)))break}Nt(e)};class Lt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const R=e=>{if(typeof e!="string")return e.slice(0);const t=new Lt(e);for(W(t);t.index{const[n]=e,s=n.toUpperCase();if(t===0||s===n)return e;if(s==="A")return[s,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+i];if(s==="V")return[s,e[1]+i];if(s==="H")return[s,e[1]+r];if(s==="L")return[s,e[1]+r,e[2]+i];{const c=[],a=e.length;for(let l=1;l{let r=e.length,i,n="M",s="M",o=!1,c=0,a=0,l=0,m=0,h=0;for(let f=0;f{const t=R(e);return E(t,nt)},vt=(e,t,r,i)=>{const[n]=e,s=n.toLowerCase();if(t===0||n===s)return e;if(s==="a")return[s,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-i];if(s==="v")return[s,e[1]-i];if(s==="h")return[s,e[1]-r];if(s==="l")return[s,e[1]-r,e[2]-i];{const c=[],a=e.length;for(let l=1;l{const t=R(e);return E(t,vt)},ft=(e,t,r,i,n,s,o,c,a,l)=>{let m=e,h=t,f=r,g=i,u=c,y=a;const A=Math.PI*120/180,x=Math.PI/180*(+n||0);let C=[],d,p,M,S,q;if(l)[p,M,S,q]=l;else{d=et(m,h,-x),m=d.x,h=d.y,d=et(u,y,-x),u=d.x,y=d.y;const L=(m-u)/2,V=(h-y)/2;let z=L*L/(f*f)+V*V/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);const ue=f*f,he=g*g,Ye=(s===o?-1:1)*Math.sqrt(Math.abs((ue*he-ue*V*V-he*L*L)/(ue*V*V+he*L*L)));S=Ye*f*V/g+(m+u)/2,q=Ye*-g*L/f+(h+y)/2,p=Math.asin(((h-q)/g*10**9>>0)/10**9),M=Math.asin(((y-q)/g*10**9>>0)/10**9),p=mM&&(p-=Math.PI*2),!o&&M>p&&(M-=Math.PI*2)}let j=M-p;if(Math.abs(j)>A){const L=M,V=u,z=y;M=p+A*(o&&M>p?1:-1),u=S+f*Math.cos(M),y=q+g*Math.sin(M),C=ft(u,y,f,g,n,0,o,V,z,[M,L,S,q])}j=M-p;const v=Math.cos(p),N=Math.sin(p),Q=Math.cos(M),Y=Math.sin(M),$=Math.tan(j/4),P=4/3*f*$,k=4/3*g*$,Z=[m,h],O=[m+P*N,h-k*v],G=[u+P*Y,y-k*Q],at=[u,y];if(O[0]=2*Z[0]-O[0],O[1]=2*Z[1]-O[1],l)return[O[0],O[1],G[0],G[1],at[0],at[1]].concat(C);C=[O[0],O[1],G[0],G[1],at[0],at[1]].concat(C);const tt=[];for(let L=0,V=C.length;L{const o=.3333333333333333,c=2/3;return[o*e+c*r,o*t+c*i,o*n+c*r,o*s+c*i,n,s]},zt=(e,t,r,i)=>{const n=D([e,t],[r,i],.3333333333333333),s=D([e,t],[r,i],2/3);return[n[0],n[1],s[0],s[1],r,i]},Yt=(e,t)=>{const[r]=e,i=e.slice(1).map(Number),[n,s]=i,{x1:o,y1:c,x:a,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=s,e):r==="A"?["C"].concat(ft(o,c,i[0],i[1],i[2],i[3],i[4],i[5],i[6])):r==="Q"?(t.qx=n,t.qy=s,["C"].concat(Xt(o,c,i[0],i[1],i[2],i[3]))):r==="L"?["C"].concat(zt(o,c,n,s)):r==="Z"?["C"].concat(zt(o,c,a,l)):e},gt=(e,t)=>{const[r]=e,i=r.toUpperCase(),n=r!==i,{x1:s,y1:o,x2:c,y2:a,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(i)||(t.qx=null,t.qy=null),i==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(i==="H")return["L",e[1]+(n?l:0),o];if(i==="V")return["L",s,e[1]+(n?m:0)];if(i==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(i==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(i==="C")return["C"].concat(f);if(i==="S"){const g=s*2-c,u=o*2-a;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(i==="T"){const g=s*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(i==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(i==="Z")return["Z"];return e},rt={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},yt=e=>{const t={...rt},r=R(e);return E(r,(i,n,s,o)=>{t.x=s,t.y=o;const c=gt(i,t);let a=Yt(c,t);a[0]==="C"&&a.length>7&&(r.splice(n+1,0,["C"].concat(a.slice(7))),a=a.slice(0,7));const m=a.length;return t.x1=+a[m-2],t.y1=+a[m-1],t.x2=+a[m-4]||t.x1,t.y2=+a[m-3]||t.y1,a})},qt=(e,t)=>{const r=e.length;let{round:i}=J,n=e[0],s="";i=t==="off"||typeof t=="number"&&t>=0?t:typeof i=="number"&&i>=0?i:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=R(e);let r="M",i=0,n=0;const{max:s,min:o}=Math;let c=1/0,a=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,A=0,x=0,C=0,d=0,p=0;E(t,(q,j,v,N)=>{[r]=q;const Q=r.toUpperCase(),$=Q!==r?nt(q,j,v,N):q.slice(0),P=Q==="V"?["L",v,$[1]]:Q==="H"?["L",$[1],N]:$;if([r]=P,"TQ".includes(Q)||(d=0,p=0),r==="M")[,i,n]=P,h=i,f=n,g=i,u=n;else if(r==="L")[h,f,g,u]=It(v,N,P[1],P[2]);else if(r==="A")[h,f,g,u]=Te(v,N,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(r==="S"){const k=y*2-x,Z=A*2-C;[h,f,g,u]=Qt(v,N,k,Z,P[1],P[2],P[3],P[4])}else r==="C"?[h,f,g,u]=Qt(v,N,P[1],P[2],P[3],P[4],P[5],P[6]):r==="T"?(d=y*2-d,p=A*2-p,[h,f,g,u]=Zt(v,N,d,p,P[1],P[2])):r==="Q"?(d=P[1],p=P[2],[h,f,g,u]=Zt(v,N,P[1],P[2],P[3],P[4])):r==="Z"&&([h,f,g,u]=It(v,N,i,n));c=o(h,c),a=o(f,a),l=s(g,l),m=s(u,m),[y,A]=r==="Z"?[i,n]:P.slice(-2),[x,C]=r==="C"?[P[3],P[4]]:r==="S"?[P[1],P[2]]:[y,A]});const M=l-c,S=m-a;return{width:M,height:S,x:c,y:a,x2:l,y2:m,cx:c+M/2,cy:a+S/2,cz:Math.max(M,S)+Math.min(M,S)/2}},X=e=>{const t=R(e);let r=0,i=0,n=0,s=0,o=0,c=0,a="M",l=0,m=0,h=0;return E(t,(f,g,u,y)=>{[a]=f;const A=a.toUpperCase(),C=A!==a?nt(f,g,u,y):f.slice(0),d=A==="V"?["L",u,C[1]]:A==="H"?["L",C[1],y]:C;if([a]=d,"TQ".includes(A)||(o=0,c=0),a==="M")[,l,m]=d;else if(a==="L")h+=mt(u,y,d[1],d[2]);else if(a==="A")h+=Ot(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(a==="S"){const p=r*2-n,M=i*2-s;h+=St(u,y,p,M,d[1],d[2],d[3],d[4])}else a==="C"?h+=St(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):a==="T"?(o=r*2-o,c=i*2-c,h+=Tt(u,y,o,c,d[1],d[2])):a==="Q"?(o=d[1],c=d[2],h+=Tt(u,y,d[1],d[2],d[3],d[4])):a==="Z"&&(h+=mt(u,y,l,m));[r,i]=a==="Z"?[l,m]:d.slice(-2),[n,s]=a==="C"?[d[3],d[4]]:a==="S"?[d[1],d[2]]:[r,i]}),h},dt=1e-5,it=e=>{const t=R(e),r={...rt};return E(t,(i,n,s,o)=>{r.x=s,r.y=o;const c=gt(i,r),a=c.length;return r.x1=+c[a-2],r.y1=+c[a-1],r.x2=+c[a-4]||r.x1,r.y2=+c[a-3]||r.y1,c})},st=(e,t)=>{const r=it(e);let i=!1,n=[],s="M",o=0,c=0,[a,l]=r[0].slice(1);const m=typeof t=="number";let h={x:a,y:l},f=0,g=h,u=0;return!m||t{if([s]=y,i=s==="M",n=i?n:[x,C].concat(y.slice(1)),i?([,a,l]=y,h={x:a,y:l},f=0):s==="L"?(h=Vt(n[0],n[1],n[2],n[3],t-u),f=mt(n[0],n[1],n[2],n[3])):s==="A"?(h=Se(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=Ot(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):s==="C"?(h=Ve(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=St(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):s==="Q"?(h=Ee(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=Tt(n[0],n[1],n[2],n[3],n[4],n[5])):s==="Z"&&(n=[x,C,a,l],h={x:a,y:l},f=mt(n[0],n[1],n[2],n[3])),[o,c]=n.slice(-2),uu-dt?{x:o,y:c}:g)},jt=(e,t)=>{const r=R(e);let i=r.slice(0),n=X(i),s=i.length-1,o=0,c=0,a=r[0];if(s<=0||!t||!Number.isFinite(t))return{segment:a,index:0,length:c,lengthAtSegment:o};if(t>=n)return i=r.slice(0,-1),o=X(i),c=n-o,a=r[s],{segment:a,index:s,length:c,lengthAtSegment:o};const l=[];for(;s>0;)a=i[s],i=i.slice(0,-1),o=X(i),c=n-o,n=o,l.push({segment:a,index:s,length:c,lengthAtSegment:o}),s-=1;return l.find(({lengthAtSegment:m})=>m<=t)},bt=(e,t)=>{const r=R(e),i=it(r),n=X(i),s=p=>{const M=p.x-t.x,S=p.y-t.y;return M*M+S*S};let o=8,c,a={x:0,y:0},l=0,m=0,h=1/0;for(let p=0;p<=n;p+=o)c=st(i,p),l=s(c),l1e-6&&(u=m-o,f=st(i,u),A=s(f),y=m+o,g=st(i,y),x=s(g),u>=0&&Abt(e,t).closest,rn=(e,t,r,i,n,s,o,c)=>3*((c-t)*(r+n)-(o-e)*(i+s)+i*(e-n)-r*(t-s)+c*(n+e/3)-o*(s+t/3))/20,ee=e=>{let t=0,r=0,i=0;return yt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return i=rn(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),i}}).reduce((n,s)=>n+s,0)},Qe=e=>ee(yt(e))>=0,Ze=(e,t)=>jt(e,t).segment,Be=(e,t)=>bt(e,t).segment,pt=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return K[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,ne=e=>pt(e)&&e.every(([t])=>t===t.toUpperCase()),re=e=>ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),He=e=>re(e)&&e.every(([t])=>"MC".includes(t)),Fe=(e,t)=>{const{distance:r}=bt(e,t);return Math.abs(r)pt(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),ie=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Lt(e);for(W(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,sn=e=>{let{x1:t,y1:r,x2:i,y2:n}=e;return[t,r,i,n]=[t,r,i,n].map(s=>+s),[["M",t,r],["L",i,n]]},on=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let i=0;for(;i{let{cx:t,cy:r,r:i}=e;return[t,r,i]=[t,r,i].map(n=>+n),[["M",t-i,r],["a",i,i,0,1,0,2*i,0],["a",i,i,0,1,0,-2*i,0]]},cn=e=>{let{cx:t,cy:r}=e,i=e.rx||0,n=e.ry||i;return[t,r,i,n]=[t,r,i,n].map(s=>+s),[["M",t-i,r],["a",i,n,0,1,0,2*i,0],["a",i,n,0,1,0,-2*i,0]]},ln=e=>{const t=+e.x||0,r=+e.y||0,i=+e.width,n=+e.height;let s=+(e.rx||0),o=+(e.ry||s);return s||o?(s*2>i&&(s-=(s*2-i)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+s,r],["h",i-s*2],["s",s,0,s,o],["v",n-o*2],["s",0,o,-s,o],["h",-i+s*2],["s",-s,0,-s,-o],["v",-n+o*2],["s",0,-o,s,-o]]):[["M",t,r],["h",i],["v",n],["H",t],["Z"]]},se=e=>{const t=Object.keys(ot),r=Ue(e),i=r?e.tagName:null;if(i&&[...t,"path"].every(a=>i!==a))throw TypeError(`${_}: "${i}" is not SVGElement`);const n=r?i:e.type,s=ot[n],o={type:n};r?s.forEach(a=>{o[a]=e.getAttribute(a)}):Object.assign(o,e);let c=[];return n==="circle"?c=an(o):n==="ellipse"?c=cn(o):["polyline","polygon"].includes(n)?c=on(o):n==="rect"?c=ln(o):n==="line"?c=sn(o):["glyph","path"].includes(n)&&(c=R(r?e.getAttribute("d")||"":e.d||"")),pt(c)&&c.length?c:!1},Je=(e,t,r)=>{const i=r||document,n=Object.keys(ot),s=Ue(e),o=s?e.tagName:null;if(o==="path")throw TypeError(`${_}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${_}: "${o}" is not SVGElement`);const c=i.createElementNS("http://www.w3.org/2000/svg","path"),a=s?o:e.type,l=ot[a],m={type:a},h=J.round,f=se(e),g=f&&f.length?qt(f,h):"";return s?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||c.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&c.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),ie(g)?(c.setAttribute("d",g),t&&s&&(e.before(c,e),e.remove()),c):!1},oe=(e,t,r,i)=>{const[n]=e,{round:s}=J,o=s,c=t.slice(1),{x1:a,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=c.slice(-2),A=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(w(f,o)===w(u,o))return["V",y];if(w(g,o)===w(y,o))return["H",u]}else if(n==="C"){const[x,C]=c;if(r.x1=x,r.y1=C,"CS".includes(i)&&(w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o)||w(a,o)===w(m*2-f,o)&&w(l,o)===w(h*2-g,o)))return["S",c[2],c[3],c[4],c[5]]}else if(n==="Q"){const[x,C]=c;if(r.qx=x,r.qy=C,"QT".includes(i)&&w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o))return["T",c[2],c[3]]}return A},At=(e,t)=>{const r=e.slice(1).map(i=>w(i,t));return[e[0]].concat(r)},ae=(e,t)=>{const r=ht(e),i=typeof t=="number"&&t>=0?t:2,n={...rt},s=[];let o="M",c="Z";return E(r,(a,l,m,h)=>{n.x=m,n.y=h;const f=gt(a,n);let g=a;if([o]=a,s[l]=o,l){c=s[l-1];const y=oe(a,f,n,c),A=At(y,i),x=A.join(""),C=vt(y,l,m,h),d=At(C,i),p=d.join("");g=x.length{const t=ht(e),r=it(t),i=t.length,n=t[i-1][0]==="Z",s=E(t,(o,c)=>{const a=r[c],l=c&&t[c-1],m=l&&l[0],h=t[c+1],f=h&&h[0],[g]=o,[u,y]=r[c?c-1:i-1].slice(-2);let A=o;switch(g){case"M":A=n?["Z"]:[g,u,y];break;case"A":A=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?A=["S",o[1],o[2],u,y]:A=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?A=["C",a[3],a[4],a[1],a[2],u,y]:A=[g,a[1],a[2],u,y];break;case"Q":h&&f==="T"?A=["T",u,y]:A=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?A=["Q",a[1],a[2],u,y]:A=[g,u,y];break;case"Z":A=["M",u,y];break;case"H":A=[g,u];break;case"V":A=[g,y];break;default:A=[g].concat(o.slice(1,-2),u,y)}return A});return n?s.reverse():[s[0]].concat(s.slice(1).reverse())},ce=e=>{const t=[];let r,i=-1,n=0,s=0,o=0,c=0;const a={...rt};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(i+=1,[n,s]=u,n+=g?a.x:0,s+=g?a.y:0,o=n,c=s,r=[g?[h,o,c]:l]):(h==="Z"?(n=o,s=c):h==="H"?([,n]=l,n+=g?a.x:0):h==="V"?([,s]=l,s+=g?a.y:0):([n,s]=l.slice(-2),n+=g?a.x:0,s+=g?a.y:0),r.push(l)),a.x=n,a.y=s,t[i]=r}),t},le=e=>{let t=new T;const{origin:r}=e,[i,n]=r,{translate:s}=e,{rotate:o}=e,{skew:c}=e,{scale:a}=e;return Array.isArray(s)&&s.length>=2&&s.every(l=>!Number.isNaN(+l))&&s.some(l=>l!==0)?t=t.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(t=t.translate(s)),(o||c||a)&&(t=t.translate(i,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(c)&&c.length===2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==0)?(t=c[0]?t.skewX(c[0]):t,t=c[1]?t.skewY(c[1]):t):typeof c=="number"&&!Number.isNaN(c)&&(t=t.skewX(c)),Array.isArray(a)&&a.length>=2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==1)?t=t.scale(...a):typeof a=="number"&&!Number.isNaN(a)&&(t=t.scale(a)),t=t.translate(-i,-n)),t},mn=(e,t)=>{let r=T.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},$t=(e,t,r)=>{const[i,n,s]=r,[o,c,a]=mn(e,[t[0],t[1],0,1]),l=o-i,m=c-n,h=a-s;return[l*(Math.abs(s)/Math.abs(h)||1)+i,m*(Math.abs(s)/Math.abs(h)||1)+n]},me=(e,t)=>{let r=0,i=0,n=0,s=0,o=0,c=0,a="M";const l=R(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:J.origin});const h=t.origin,f=le(t);return f.isIdentity?l.slice(0):E(l,(g,u,y,A)=>{[a]=g;const x=a.toUpperCase(),d=x!==a?nt(g,u,y,A):g.slice(0);let p=x==="A"?["C"].concat(ft(y,A,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):x==="V"?["L",y,d[1]]:x==="H"?["L",d[1],A]:d;a=p[0];const M=a==="C"&&p.length>7,S=M?p.slice(0,7):p.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(p.slice(7))),p=S),a==="L")[n,s]=$t(f,[p[1],p[2]],h),r!==n&&i!==s?p=["L",n,s]:i===s?p=["H",n]:r===n&&(p=["V",s]);else for(o=1,c=p.length;o{const t=e.slice(1).map((r,i,n)=>i?n[i-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((i,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},We=(e,t)=>{let{round:r}=J;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):E(e,i=>At(i,r))},Xe=(e,t=.5)=>{const r=t,i=e.slice(0,2),n=e.slice(2,4),s=e.slice(4,6),o=e.slice(6,8),c=D(i,n,r),a=D(n,s,r),l=D(s,o,r),m=D(c,a,r),h=D(a,l,r),f=D(m,h,r);return[["C",c[0],c[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class un{constructor(t,r){const i=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${_}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=R(t);const{round:s,origin:o}=i;let c;Number.isInteger(s)||s==="off"?c=s:c=J.round;let a=J.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);a=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=c,this.origin=a,this}get bbox(){return te(this.segments)}get length(){return X(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return st(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=ht(t),this}toRelative(){const{segments:t}=this;return this.segments=Wt(t),this}toCurve(){const{segments:t}=this;return this.segments=yt(t),this}reverse(t){const{segments:r}=this,i=ce(r),n=i.length>1?i:!1,s=n?n.map((c,a)=>t?a?xt(c):c.slice(0):xt(c)):r.slice(0);let o=[];return n?o=s.flat(1):o=t?r:xt(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=it(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=ae(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(a=>a in t))return this;const{segments:r,origin:[i,n,s]}=this,o={};for(const[a,l]of Object.entries(t))a==="skew"&&Array.isArray(l)||(a==="rotate"||a==="translate"||a==="origin"||a==="scale")&&Array.isArray(l)?o[a]=l.map(Number):a!=="origin"&&typeof Number(l)=="number"&&(o[a]=Number(l));const{origin:c}=o;if(Array.isArray(c)&&c.length>=2){const[a,l,m]=c.map(Number);o.origin=[Number.isNaN(a)?i:a,Number.isNaN(l)?n:l,m||s]}else o.origin=[i,n,s];return this.segments=me(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return qt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return T}static get arcTools(){return Ne}static get bezierTools(){return $e}static get cubicTools(){return Ie}static get lineTools(){return Pe}static get polygonTools(){return _e}static get quadTools(){return Oe}static get pathToAbsolute(){return ht}static get pathToRelative(){return Wt}static get pathToCurve(){return yt}static get pathToString(){return qt}static get distanceSquareRoot(){return lt}static get midPoint(){return D}static get rotateVector(){return et}static get roundTo(){return w}static get parsePathString(){return R}static get finalizeSegment(){return Nt}static get invalidPathValue(){return F}static get isArcCommand(){return Jt}static get isDigit(){return H}static get isDigitStart(){return Ut}static get isMoveCommand(){return Kt}static get isPathCommand(){return Gt}static get isSpace(){return Ft}static get paramsCount(){return K}static get paramsParser(){return rt}static get pathParser(){return Lt}static get scanFlag(){return Bt}static get scanParam(){return Ht}static get scanSegment(){return wt}static get skipSpaces(){return W}static get distanceEpsilon(){return dt}static get getClosestPoint(){return De}static get getDrawDirection(){return Qe}static get getPathArea(){return ee}static get getPathBBox(){return te}static get getPointAtLength(){return st}static get getPropertiesAtLength(){return jt}static get getPropertiesAtPoint(){return bt}static get getSegmentAtLength(){return Ze}static get getSegmentOfPoint(){return Be}static get getTotalLength(){return X}static get isAbsoluteArray(){return ne}static get isCurveArray(){return He}static get isNormalizedArray(){return re}static get isPathArray(){return pt}static get isPointInStroke(){return Fe}static get isRelativeArray(){return Ge}static get isValidPath(){return ie}static get shapeParams(){return ot}static get shapeToPath(){return Je}static get shapeToPathArray(){return se}static get absolutizeSegment(){return nt}static get arcToCubic(){return ft}static get getSVGMatrix(){return le}static get iterate(){return E}static get lineToCubic(){return zt}static get normalizePath(){return it}static get normalizeSegment(){return gt}static get optimizePath(){return ae}static get projection2d(){return $t}static get quadToCubic(){return Xt}static get relativizeSegment(){return vt}static get reverseCurve(){return Ke}static get reversePath(){return xt}static get roundPath(){return We}static get roundSegment(){return At}static get segmentToCubic(){return Yt}static get shortenSegment(){return oe}static get splitCubic(){return Xe}static get splitPath(){return ce}static get transformPath(){return me}}return b.CSSMatrix=T,b.absolutizeSegment=nt,b.arcToCubic=ft,b.arcTools=Ne,b.bezierTools=$e,b.cubicTools=Ie,b.default=un,b.distanceEpsilon=dt,b.distanceSquareRoot=lt,b.finalizeSegment=Nt,b.getClosestPoint=De,b.getDrawDirection=Qe,b.getPathArea=ee,b.getPathBBox=te,b.getPointAtLength=st,b.getPropertiesAtLength=jt,b.getPropertiesAtPoint=bt,b.getSVGMatrix=le,b.getSegmentAtLength=Ze,b.getSegmentOfPoint=Be,b.getTotalLength=X,b.invalidPathValue=F,b.isAbsoluteArray=ne,b.isArcCommand=Jt,b.isCurveArray=He,b.isDigit=H,b.isDigitStart=Ut,b.isMoveCommand=Kt,b.isNormalizedArray=re,b.isPathArray=pt,b.isPathCommand=Gt,b.isPointInStroke=Fe,b.isRelativeArray=Ge,b.isSpace=Ft,b.isValidPath=ie,b.iterate=E,b.lineToCubic=zt,b.lineTools=Pe,b.midPoint=D,b.normalizePath=it,b.normalizeSegment=gt,b.optimizePath=ae,b.paramsCount=K,b.paramsParser=rt,b.parsePathString=R,b.pathParser=Lt,b.pathToAbsolute=ht,b.pathToCurve=yt,b.pathToRelative=Wt,b.pathToString=qt,b.polygonTools=_e,b.projection2d=$t,b.quadToCubic=Xt,b.quadTools=Oe,b.relativizeSegment=vt,b.reverseCurve=Ke,b.reversePath=xt,b.rotateVector=et,b.roundPath=We,b.roundSegment=At,b.roundTo=w,b.scanFlag=Bt,b.scanParam=Ht,b.scanSegment=wt,b.segmentToCubic=Yt,b.shapeParams=ot,b.shapeToPath=Je,b.shapeToPathArray=se,b.shortenSegment=oe,b.skipSpaces=W,b.splitCubic=Xe,b.splitPath=ce,b.transformPath=me,Object.defineProperties(b,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),b}({}); //# sourceMappingURL=svg-path-commander.js.map diff --git a/docs/svg-path-commander.js.map b/docs/svg-path-commander.js.map index 08bc8c9..20e9acd 100755 --- a/docs/svg-path-commander.js.map +++ b/docs/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/math/rotateVector.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/options/options.ts","../src/math/roundTo.ts","../src/convert/pathToString.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getTotalLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getPathBBox.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/getSVGMatrix.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/projection2d.ts","../src/process/reverseCurve.ts","../src/process/reversePath.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/process/splitPath.ts","../src/process/transformPath.ts","../src/index.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","\"use strict\";\nimport * as util from \"./util\";\n// import CSSMatrix from \"@thednp/dommatrix\";\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n// import * as arcTools from \"./math/arcTools\";\n// import * as bezierTools from \"./math/bezier\";\n// import * as cubicTools from \"./math/cubicTools\";\n// import * as lineTools from \"./math/lineTools\";\n// import * as quadTools from \"./math/quadTools\";\n// import * as polygonTools from \"./math/polygonTools\";\n\n// import distanceSquareRoot from \"./math/distanceSquareRoot\";\n// import midPoint from \"./math/midPoint\";\n// import rotateVector from \"./math/rotateVector\";\n// import roundTo from \"./math/roundTo\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\n// import finalizeSegment from \"./parser/finalizeSegment\";\n// import invalidPathValue from \"./parser/invalidPathValue\";\n// import isArcCommand from \"./parser/isArcCommand\";\n// import isDigit from \"./parser/isDigit\";\n// import isDigitStart from \"./parser/isDigitStart\";\n// import isMoveCommand from \"./parser/isMoveCommand\";\n// import isPathCommand from \"./parser/isPathCommand\";\n// import isSpace from \"./parser/isSpace\";\n// import paramsCount from \"./parser/paramsCount\";\n// import paramsParser from \"./parser/paramsParser\";\n// import pathParser from \"./parser/pathParser\";\n// import scanFlag from \"./parser/scanFlag\";\n// import scanParam from \"./parser/scanParam\";\n// import scanSegment from \"./parser/scanSegment\";\n// import skipSpaces from \"./parser/skipSpaces\";\n\n// import distanceEpsilon from \"./util/distanceEpsilon\";\n// import getClosestPoint from \"./util/getClosestPoint\";\n// import getDrawDirection from \"./util/getDrawDirection\";\n// import getPathArea from \"./util/getPathArea\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getPointAtLength from \"./util/getPointAtLength\";\n// import getPropertiesAtLength from \"./util/getPropertiesAtLength\";\n// import getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\n// import getSegmentAtLength from \"./util/getSegmentAtLength\";\n// import getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport getTotalLength from \"./util/getTotalLength\";\n\n// import isAbsoluteArray from \"./util/isAbsoluteArray\";\n// import isCurveArray from \"./util/isCurveArray\";\n// import isNormalizedArray from \"./util/isNormalizedArray\";\n// import isPathArray from \"./util/isPathArray\";\n// import isPointInStroke from \"./util/isPointInStroke\";\n// import isRelativeArray from \"./util/isRelativeArray\";\n// import isValidPath from \"./util/isValidPath\";\n// import shapeParams from \"./util/shapeParams\";\n// import shapeToPath from \"./util/shapeToPath\";\n// import shapeToPathArray from \"./util/shapeToPathArray\";\n\n// import absolutizeSegment from \"./process/absolutizeSegment\";\n// import arcToCubic from \"./process/arcToCubic\";\n// import getSVGMatrix from \"./process/getSVGMatrix\";\n// import iterate from \"./process/iterate\";\n// import lineToCubic from \"./process/lineToCubic\";\nimport normalizePath from \"./process/normalizePath\";\n// import normalizeSegment from \"./process/normalizeSegment\";\nimport optimizePath from \"./process/optimizePath\";\n// import projection2d from \"./process/projection2d\";\n// import quadToCubic from \"./process/quadToCubic\";\n// import relativizeSegment from \"./process/relativizeSegment\";\n// import reverseCurve from \"./process/reverseCurve\";\nimport reversePath from \"./process/reversePath\";\n// import roundPath from \"./process/roundPath\";\n// import roundSegment from \"./process/roundSegment\";\n// import segmentToCubic from \"./process/segmentToCubic\";\n// import shortenSegment from \"./process/shortenSegment\";\n// import splitCubic from \"./process/splitCubic\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\n\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`,\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" || k === \"translate\" || k === \"origin\" ||\n k === \"scale\") && Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n}\n\n// export {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// // SVGPathCommander as default,\n// transformPath,\n// };\n\n// const index = {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// transformPath,\n// };\n\n// export { absolutizeSegment }\n// export { arcToCubic }\n// export { arcTools }\n// export { bezierTools }\n// export { CSSMatrix }\n// export { cubicTools }\n// export { distanceEpsilon }\n// export { distanceSquareRoot }\n// export { finalizeSegment }\n// export { getClosestPoint }\n// export { getDrawDirection }\n// export { getPathArea }\n// export { getPathBBox }\n// export { getPointAtLength }\n// export { getPropertiesAtLength }\n// export { getPropertiesAtPoint }\n// export { getSegmentAtLength }\n// export { getSegmentOfPoint }\n// export { getSVGMatrix }\n// export { getTotalLength }\n// export { invalidPathValue }\n// export { isAbsoluteArray }\n// export { isArcCommand }\n// export { isCurveArray }\n// export { isDigit }\n// export { isDigitStart }\n// export { isMoveCommand }\n// export { isNormalizedArray }\n// export { isPathArray }\n// export { isPathCommand }\n// export { isPointInStroke }\n// export { isRelativeArray }\n// export { isSpace }\n// export { isValidPath }\n// export { iterate }\n// export { lineToCubic }\n// export { lineTools }\n// export { midPoint }\n// export { normalizePath }\n// export { normalizeSegment }\n// export { optimizePath }\n// export { paramsCount }\n// export { paramsParser }\n// export { parsePathString }\n// export { pathParser }\n// export { pathToAbsolute }\n// export { pathToCurve }\n// export { pathToRelative }\n// export { pathToString }\n// export { polygonTools }\n// export { projection2d }\n// export { quadToCubic }\n// export { quadTools }\n// export { relativizeSegment }\n// export { reverseCurve }\n// export { reversePath }\n// export { rotateVector }\n// export { roundPath }\n// export { roundSegment }\n// export { roundTo }\n// export { scanFlag }\n// export { scanParam }\n// export { scanSegment }\n// export { segmentToCubic }\n// export { shapeParams }\n// export { shapeToPath }\n// export { shapeToPathArray }\n// export { shortenSegment }\n// export { skipSpaces }\n// export { splitCubic }\n// export { splitPath }\n// export { transformPath }\n// export { SVGPathCommander as default }\n// export default SVGPathCommander;\nconst defaultExport = Object.assign(SVGPathCommander, util);\n\nexport { defaultExport as default };\n// export default Object.assign(SVGPathCommander, index);\n"],"names":["Z","z","s","t","e","p","$","E","P","y","g","n","i","r","a","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","l","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","polygon","area","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","rotateVector","rad","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","defaultOptions","roundTo","round","pow","pathToString","roundOption","valLen","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","totalLength","getTotalLength","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getPathBBox","minX","minY","maxX","maxY","width","height","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","reverseCurve","rotatedCurve","curveOnly","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","splitPath","composite","pi","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","util"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport * as arcTools from \"./math/arcTools\";\nimport * as bezierTools from \"./math/bezier\";\nimport * as cubicTools from \"./math/cubicTools\";\nimport * as lineTools from \"./math/lineTools\";\nimport * as quadTools from \"./math/quadTools\";\nimport * as polygonTools from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file From 79bd7adf385f984bcf8710ac6effa3f720dd3615 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 5 Feb 2025 14:10:49 +0200 Subject: [PATCH 4/5] re-export math --- src/index.ts | 12 ++++++------ src/math/arcTools.ts | 13 ++++++++++++- src/math/bezier.ts | 13 +++++++++++++ src/math/cubicTools.ts | 8 ++++++++ src/math/lineTools.ts | 13 ++++++++++++- src/math/polygonTools.ts | 6 +++++- src/math/quadTools.ts | 7 +++++++ 7 files changed, 63 insertions(+), 9 deletions(-) diff --git a/src/index.ts b/src/index.ts index 9296f0e..8779445 100755 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,11 @@ "use strict"; import CSSMatrix from "@thednp/dommatrix"; -import * as arcTools from "./math/arcTools"; -import * as bezierTools from "./math/bezier"; -import * as cubicTools from "./math/cubicTools"; -import * as lineTools from "./math/lineTools"; -import * as quadTools from "./math/quadTools"; -import * as polygonTools from "./math/polygonTools"; +import { arcTools } from "./math/arcTools"; +import { bezierTools } from "./math/bezier"; +import { cubicTools } from "./math/cubicTools"; +import { lineTools } from "./math/lineTools"; +import { quadTools } from "./math/quadTools"; +import { polygonTools } from "./math/polygonTools"; import distanceSquareRoot from "./math/distanceSquareRoot"; import midPoint from "./math/midPoint"; diff --git a/src/math/arcTools.ts b/src/math/arcTools.ts index bdb2158..91d4c05 100755 --- a/src/math/arcTools.ts +++ b/src/math/arcTools.ts @@ -427,7 +427,7 @@ const getArcBBox = ( return [xMin, yMin, xMax, yMax] as [number, number, number, number]; }; -export { +const arcTools = { angleBetween, arcLength, arcPoint, @@ -436,3 +436,14 @@ export { getArcProps, getPointAtArcLength, }; + +export { + arcTools, + angleBetween, + arcLength, + arcPoint, + getArcBBox, + getArcLength, + getArcProps, + getPointAtArcLength, +} \ No newline at end of file diff --git a/src/math/bezier.ts b/src/math/bezier.ts index 7e36695..37703da 100755 --- a/src/math/bezier.ts +++ b/src/math/bezier.ts @@ -277,8 +277,21 @@ const minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => { return [min, max] as PointTuple; }; +const bezierTools = { + bezierLength, + calculateBezier, + CBEZIER_MINMAX_EPSILON, + computeBezier, + Cvalues, + deriveBezier, + getBezierLength, + minmaxC, + minmaxQ, + Tvalues, +} export { + bezierTools, bezierLength, calculateBezier, CBEZIER_MINMAX_EPSILON, diff --git a/src/math/cubicTools.ts b/src/math/cubicTools.ts index 888fb75..3202cea 100755 --- a/src/math/cubicTools.ts +++ b/src/math/cubicTools.ts @@ -133,7 +133,15 @@ const getCubicBBox = ( ]; }; +const cubicTools = { + getCubicBBox, + getCubicLength, + getPointAtCubicLength, + getPointAtCubicSegmentLength, +} + export { + cubicTools, getCubicBBox, getCubicLength, getPointAtCubicLength, diff --git a/src/math/lineTools.ts b/src/math/lineTools.ts index 2f6eb87..9f1b067 100755 --- a/src/math/lineTools.ts +++ b/src/math/lineTools.ts @@ -69,4 +69,15 @@ const getLineBBox = (x1: number, y1: number, x2: number, y2: number) => { ]; }; -export { getLineBBox, getLineLength, getPointAtLineLength }; +const lineTools = { + getLineBBox, + getLineLength, + getPointAtLineLength, +} + +export { + lineTools, + getLineBBox, + getLineLength, + getPointAtLineLength, +}; diff --git a/src/math/polygonTools.ts b/src/math/polygonTools.ts index 02131a9..1757972 100755 --- a/src/math/polygonTools.ts +++ b/src/math/polygonTools.ts @@ -44,5 +44,9 @@ const polygonLength = (polygon: PointTuple[]) => { return 0; }, 0); }; +const polygonTools = { + polygonArea, + polygonLength, +}; -export { polygonArea, polygonLength }; +export { polygonTools, polygonArea, polygonLength }; diff --git a/src/math/quadTools.ts b/src/math/quadTools.ts index a86c8e6..3942932 100755 --- a/src/math/quadTools.ts +++ b/src/math/quadTools.ts @@ -119,8 +119,15 @@ const getQuadBBox = ( number, ]; }; +const quadTools = { + getPointAtQuadLength, + getPointAtQuadSegmentLength, + getQuadBBox, + getQuadLength, +} export { + quadTools, getPointAtQuadLength, getPointAtQuadSegmentLength, getQuadBBox, From e9572bf0657deece1d00d0d6ab8b1600363cdb92 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 5 Feb 2025 14:10:52 +0200 Subject: [PATCH 5/5] build --- dist/svg-path-commander.cjs | 2 +- dist/svg-path-commander.cjs.map | 2 +- dist/svg-path-commander.d.cts | 501 +++++++++----------------------- dist/svg-path-commander.d.ts | 501 +++++++++----------------------- dist/svg-path-commander.js | 2 +- dist/svg-path-commander.js.map | 2 +- dist/svg-path-commander.mjs | 2 +- dist/svg-path-commander.mjs.map | 2 +- docs/svg-path-commander.js | 2 +- docs/svg-path-commander.js.map | 2 +- 10 files changed, 270 insertions(+), 748 deletions(-) diff --git a/dist/svg-path-commander.cjs b/dist/svg-path-commander.cjs index f231a5a..2986fe9 100644 --- a/dist/svg-path-commander.cjs +++ b/dist/svg-path-commander.cjs @@ -1,2 +1,2 @@ -"use strict";var _t=Object.create;var _e=Object.defineProperty;var Ut=Object.getOwnPropertyDescriptor;var Ft=Object.getOwnPropertyNames;var Kt=Object.getPrototypeOf,Jt=Object.prototype.hasOwnProperty;var le=(t,e)=>{for(var n in e)_e(t,n,{get:e[n],enumerable:!0})},Qt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ft(e))!Jt.call(t,r)&&r!==n&&_e(t,r,{get:()=>e[r],enumerable:!(o=Ut(e,r))||o.enumerable});return t};var pt=(t,e,n)=>(n=t!=null?_t(Kt(t)):{},Qt(e||!t||!t.__esModule?_e(n,"default",{value:t,enumerable:!0}):n,t)),Wt=t=>Qt(_e({},"__esModule",{value:!0}),t);var xn={};le(xn,{CSSMatrix:()=>Vt.default,absolutizeSegment:()=>_,arcToCubic:()=>ye,arcTools:()=>Je,bezierTools:()=>Xe,cubicTools:()=>et,default:()=>dn,distanceEpsilon:()=>se,distanceSquareRoot:()=>re,finalizeSegment:()=>Ae,getClosestPoint:()=>xt,getDrawDirection:()=>St,getPathArea:()=>Ie,getPathBBox:()=>at,getPointAtLength:()=>me,getPropertiesAtLength:()=>Pe,getPropertiesAtPoint:()=>Y,getSVGMatrix:()=>Ge,getSegmentAtLength:()=>At,getSegmentOfPoint:()=>Ct,getTotalLength:()=>K,invalidPathValue:()=>j,isAbsoluteArray:()=>$e,isArcCommand:()=>qe,isCurveArray:()=>Tt,isDigit:()=>$,isDigitStart:()=>Qe,isMoveCommand:()=>De,isNormalizedArray:()=>je,isPathArray:()=>ee,isPathCommand:()=>ke,isPointInStroke:()=>Mt,isRelativeArray:()=>Lt,isSpace:()=>Ve,isValidPath:()=>Be,iterate:()=>T,lineToCubic:()=>Ce,lineTools:()=>Fe,midPoint:()=>E,normalizePath:()=>J,normalizeSegment:()=>X,optimizePath:()=>mt,paramsCount:()=>Z,paramsParser:()=>U,parsePathString:()=>L,pathParser:()=>F,pathToAbsolute:()=>oe,pathToCurve:()=>ae,pathToRelative:()=>ot,pathToString:()=>Te,polygonTools:()=>nt,projection2d:()=>Le,quadToCubic:()=>Ee,quadTools:()=>rt,relativizeSegment:()=>be,reverseCurve:()=>Nt,reversePath:()=>Me,rotateVector:()=>ne,roundPath:()=>wt,roundSegment:()=>ie,roundTo:()=>M,scanFlag:()=>ze,scanParam:()=>Re,scanSegment:()=>he,segmentToCubic:()=>Oe,shapeParams:()=>te,shapeToPath:()=>vt,shapeToPathArray:()=>He,shortenSegment:()=>Ze,skipSpaces:()=>G,splitCubic:()=>zt,splitPath:()=>it,transformPath:()=>ut});module.exports=Wt(xn);var Vt=pt(require("@thednp/dommatrix"),1);var Je={};le(Je,{angleBetween:()=>ft,arcLength:()=>gt,arcPoint:()=>fe,getArcBBox:()=>bt,getArcLength:()=>Ne,getArcProps:()=>Ke,getPointAtArcLength:()=>ht});var Fe={};le(Fe,{getLineBBox:()=>Ue,getLineLength:()=>pe,getPointAtLineLength:()=>ve});var Xt=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=Xt;var Yt=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),re=Yt;var pe=(t,e,n,o)=>re([t,e],[n,o]),ve=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=re([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},Ue=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]};var gt=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},fe=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),c=n*i(s),l=o*a(s);return[t+m*c-u*l,e+u*c+m*l]},ft=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},Ke=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:c,cos:l,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,b={x:l(S)*A+c(S)*y,y:-c(S)*A+l(S)*y},d=b.x**2/p**2+b.y**2/h**2;d>1&&(p*=f(d),h*=f(d));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,R=p**2*b.y**2+h**2*b.x**2,k=C/R;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},B={x:l(S)*v.x-c(S)*v.y+(t+i)/2,y:c(S)*v.x+l(S)*v.y+(e+m)/2},ue={x:(b.x-v.x)/p,y:(b.y-v.y)/h},Q=ft({x:1,y:0},ue),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},q=ft(ue,x);!a&&q>0?q-=2*g:a&&q<0&&(q+=2*g),q%=2*g;let H=Q+q;return{center:B,startAngle:Q,endAngle:H,rx:p,ry:h}},Ne=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:c,startAngle:l,endAngle:f}=Ke(t,e,n,o,r,s,a,i,m);return gt(u,c,f-l)},ht=(t,e,n,o,r,s,a,i,m,u)=>{let c={x:t,y:e},{center:l,rx:f,ry:g,startAngle:p,endAngle:h}=Ke(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let P=gt(f,g,h-p);if(u<=0)c={x:t,y:e};else if(u>=P)c={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return ve(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,b=h-p,C=(r%360+360)%360*(S/180),R=p+b*(u/P),k=f*A(R),w=g*y(R);c={x:A(C)*k-y(C)*w+l.x,y:y(C)*k+A(C)*w+l.y}}}return c},bt=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:c,ry:l,startAngle:f,endAngle:g}=Ke(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:P,tan:S,atan2:A,PI:y}=Math,{x:b,y:d}=u,C=r*y/180,R=S(C),k=A(-l*R,c),w=k,v=k+y,B=A(l,c*R),ue=B+y,Q=[i],x=[m],q=h(t,i),H=P(t,i),O=h(e,m),W=P(e,m),de=g-p*1e-5,ce=fe(b,d,c,l,C,de),N=g-p*.99999,D=fe(b,d,c,l,C,N);if(ce[0]>H||D[0]>H){let z=fe(b,d,c,l,C,w);Q.push(z[0]),x.push(z[1])}if(ce[0]W||D[1]>W){let z=fe(b,d,c,l,C,B);Q.push(z[0]),x.push(z[1])}return q=h.apply([],Q),O=h.apply([],x),H=P.apply([],Q),W=P.apply([],x),[q,O,H,W]};var Xe={};le(Xe,{CBEZIER_MINMAX_EPSILON:()=>$t,Cvalues:()=>qt,Tvalues:()=>yt,bezierLength:()=>It,calculateBezier:()=>Ot,computeBezier:()=>Et,deriveBezier:()=>Dt,getBezierLength:()=>ge,minmaxC:()=>We,minmaxQ:()=>we});var yt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],qt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Dt=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,c=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,c=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+c*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+c*r[3].y,t:e}},Ot=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},It=t=>{let n=yt.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oEt(n[0],o))},$t=1e-8,we=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)<$t)return t===o&&t===e?[t,o]:we([t,-.5*t+1.5*e,t-3*e+3*n]);let s=-t*n+t*o-e*n-e*o+e*e+n*n;if(s<=0)return[Math.min(t,o),Math.max(t,o)];let a=Math.sqrt(s),i=Math.min(t,o),m=Math.max(t,o),u=t-2*e+n;for(let c=(u+a)/r,l=1;l<=2;c=(u-a)/r,l++){if(c>0&&c<1){let f=t*(1-c)*(1-c)*(1-c)+e*3*(1-c)*(1-c)*c+n*3*(1-c)*c*c+o*c*c*c;fm&&(m=f)}}return[i,m]};var et={};le(et,{getCubicBBox:()=>Ye,getCubicLength:()=>xe,getPointAtCubicLength:()=>Pt,getPointAtCubicSegmentLength:()=>jt});var jt=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},xe=(t,e,n,o,r,s,a,i)=>ge([t,e,n,o,r,s,a,i]),Pt=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",c={x:t,y:e};if(u){let l=ge([t,e,n,o,r,s,a,i]);m<=0||(m>=l?c={x:a,y:i}:c=jt([t,e,n,o,r,s,a,i],m/l))}return c},Ye=(t,e,n,o,r,s,a,i)=>{let m=We([t,n,r,a]),u=We([e,o,s,i]);return[m[0],u[0],m[1],u[1]]};var rt={};le(rt,{getPointAtQuadLength:()=>dt,getPointAtQuadSegmentLength:()=>Bt,getQuadBBox:()=>tt,getQuadLength:()=>Se});var Bt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},Se=(t,e,n,o,r,s)=>ge([t,e,n,o,r,s]),dt=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=ge([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=Bt([t,e,n,o,r,s],a/u))}return m},tt=(t,e,n,o,r,s)=>{let a=we([t,n,r]),i=we([e,o,s]);return[a[0],i[0],a[1],i[1]]};var nt={};le(nt,{polygonArea:()=>er,polygonLength:()=>tr});var er=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+re(t[o-1],n):0,0);var rr=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ne=rr;var nr=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=nr;var or={origin:[0,0,0],round:4},I=or;var ar={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=ar;var sr=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},Ae=sr;var mr="SVGPathCommander Error",V=mr;var ir=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${V}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},ze=ir;var ur=t=>t>=48&&t<=57,$=ur;var cr="Invalid path value",j=cr;var lr=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${V}: ${j} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!$(u)&&u!==46){t.err=`${V}: ${j} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Ve=pr;var fr=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},ke=gr;var hr=t=>$(t)||t===43||t===45||t===46,Qe=hr;var br=t=>(t|32)===97,qe=br;var yr=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},De=yr;var Pr=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!ke(s)){t.err=`${V}: ${j} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!De(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${V}: ${j} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){Ae(t);return}for(;;){for(let m=a;m>0;m-=1){if(qe(s)&&(m===3||m===4)?ze(t):Re(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!Qe(n.charCodeAt(t.index)))break}Ae(t)},he=Pr;var F=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var dr=t=>{if(typeof t!="string")return t.slice(0);let e=new F(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,c=0,l=0;for(let f=0;f{let e=L(t);return T(e,_)},oe=Ar;var Cr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,be)},ot=Tr;var Ht=(t,e,n,o,r,s,a,i,m,u)=>{let c=t,l=e,f=n,g=o,p=i,h=m,P=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,b,d,C,R;if(u)[b,d,C,R]=u;else{y=ne(c,l,-S),c=y.x,l=y.y,y=ne(p,h,-S),p=y.x,h=y.y;let N=(c-p)/2,D=(l-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let ct=f*f,lt=g*g,kt=(s===a?-1:1)*Math.sqrt(Math.abs((ct*lt-ct*D*D-lt*N*N)/(ct*D*D+lt*N*N)));C=kt*f*D/g+(c+p)/2,R=kt*-g*N/f+(l+h)/2,b=Math.asin(((l-R)/g*10**9>>0)/10**9),d=Math.asin(((h-R)/g*10**9>>0)/10**9),b=cd&&(b-=Math.PI*2),!a&&d>b&&(d-=Math.PI*2)}let k=d-b;if(Math.abs(k)>P){let N=d,D=p,z=h;d=b+P*(a&&d>b?1:-1),p=C+f*Math.cos(d),h=R+g*Math.sin(d),A=Ht(p,h,f,g,r,0,a,D,z,[d,N,C,R])}k=d-b;let w=Math.cos(b),v=Math.sin(b),B=Math.cos(d),ue=Math.sin(d),Q=Math.tan(k/4),x=4/3*f*Q,q=4/3*g*Q,H=[c,l],O=[c+x*v,l-q*w],W=[p+x*ue,h-q*B],de=[p,h];if(O[0]=2*H[0]-O[0],O[1]=2*H[1]-O[1],u)return[O[0],O[1],W[0],W[1],de[0],de[1]].concat(A);A=[O[0],O[1],W[0],W[1],de[0],de[1]].concat(A);let ce=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},Ee=Mr;var Lr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Ce=Lr;var vr=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(ye(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(Ee(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Ce(a,i,r,s)):n==="Z"?["C"].concat(Ce(a,i,m,u)):t},Oe=vr;var Nr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:c}=e,l=t.slice(1),f=l.map((g,p)=>g+(r?p%2?c:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=l.slice(0,-2).concat(l[5]+(r?u:0),l[6]+(r?c:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?c:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},X=Nr;var wr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=wr;var zr=t=>{let e={...U},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=X(o,e),m=Oe(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let c=m.length;return e.x1=+m[c-2],e.y1=+m[c-1],e.x2=+m[c-4]||e.x1,e.y2=+m[c-3]||e.y1,m})},ae=zr;var Rr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,c=-1/0,l=0,f=0,g=0,p=0,h=0,P=0,S=0,A=0,y=0,b=0;T(e,(R,k,w,v)=>{[n]=R;let B=n.toUpperCase(),Q=B!==n?_(R,k,w,v):R.slice(0),x=B==="V"?["L",w,Q[1]]:B==="H"?["L",Q[1],v]:Q;[n]=x,"TQ".includes(B)||(y=0,b=0);if(n==="M")[,o,r]=x,l=o,f=r,g=o,p=r;else if(n==="L")[l,f,g,p]=Ue(w,v,x[1],x[2]);else if(n==="A")[l,f,g,p]=bt(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let q=h*2-S,H=P*2-A;[l,f,g,p]=Ye(w,v,q,H,x[1],x[2],x[3],x[4])}else n==="C"?[l,f,g,p]=Ye(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(y=h*2-y,b=P*2-b,[l,f,g,p]=tt(w,v,y,b,x[1],x[2])):n==="Q"?(y=x[1],b=x[2],[l,f,g,p]=tt(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([l,f,g,p]=Ue(w,v,o,r));i=a(l,i),m=a(f,m),u=s(g,u),c=s(p,c),[h,P]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,P]});let d=u-i,C=c-m;return{width:d,height:C,x:i,y:m,x2:u,y2:c,cx:i+d/2,cy:m+C/2,cz:Math.max(d,C)+Math.min(d,C)/2}},at=Vr;var kr=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,c=0,l=0;return T(e,(f,g,p,h)=>{[m]=f;let P=m.toUpperCase(),A=P!==m?_(f,g,p,h):f.slice(0),y=P==="V"?["L",p,A[1]]:P==="H"?["L",A[1],h]:A;[m]=y,"TQ".includes(P)||(a=0,i=0);if(m==="M")[,u,c]=y;else if(m==="L")l+=pe(p,h,y[1],y[2]);else if(m==="A")l+=Ne(p,h,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let b=n*2-r,d=o*2-s;l+=xe(p,h,b,d,y[1],y[2],y[3],y[4])}else m==="C"?l+=xe(p,h,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,l+=Se(p,h,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],l+=Se(p,h,y[1],y[2],y[3],y[4])):m==="Z"&&(l+=pe(p,h,u,c));[n,o]=m==="Z"?[u,c]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),l},K=kr;var se=1e-5;var Qr=t=>{let e=L(t),n={...U};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=X(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},J=Qr;var qr=(t,e)=>{let n=J(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),c=typeof e=="number",l={x:m,y:u},f=0,g=l,p=0;return!c||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,l={x:m,y:u},f=0):s==="L"?(l=ve(r[0],r[1],r[2],r[3],e-p),f=pe(r[0],r[1],r[2],r[3])):s==="A"?(l=ht(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=Ne(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(l=Pt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=xe(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(l=dt(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=Se(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],l={x:m,y:u},f=pe(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-se?{x:a,y:i}:g)},me=qr;var Dr=(t,e)=>{let n=L(t),o=n.slice(0),r=K(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=K(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=K(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:c})=>c<=e)},Pe=Dr;var Er=(t,e)=>{let n=L(t),o=J(n),r=K(o),s=b=>{let d=b.x-e.x,C=b.y-e.y;return d*d+C*C},a=8,i,m={x:0,y:0},u=0,c=0,l=1/0;for(let b=0;b<=r;b+=a)i=me(o,b),u=s(i),u1e-6&&(p=c-a,f=me(o,p),P=s(f),h=c+a,g=me(o,h),S=s(g),p>=0&&PY(t,e).closest,xt=Or;var Ir=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,$r=t=>{let e=0,n=0,o=0;return ae(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=Ir(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Ie=$r;var jr=t=>Ie(ae(t))>=0,St=jr;var Br=(t,e)=>Pe(t,e).segment,At=Br;var Hr=(t,e)=>Y(t,e).segment,Ct=Hr;var Zr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ee=Zr;var Gr=t=>ee(t)&&t.every(([e])=>e===e.toUpperCase()),$e=Gr;var _r=t=>$e(t)&&t.every(([e])=>"ACLMQZ".includes(e)),je=_r;var Ur=t=>je(t)&&t.every(([e])=>"MC".includes(e)),Tt=Ur;var Fr=(t,e)=>{let{distance:n}=Y(t,e);return Math.abs(n)ee(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Lt=Kr;var Jr=t=>{if(typeof t!="string"||!t.length)return!1;let e=new F(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,st=Xr;var Yr=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},en=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},rn=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},nn=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},on=t=>{let e=Object.keys(te),n=st(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${V}: "${o}" is not SVGElement`);let r=n?o:t.type,s=te[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=tn(a):r==="ellipse"?i=rn(a):["polyline","polygon"].includes(r)?i=en(a):r==="rect"?i=nn(a):r==="line"?i=Yr(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),ee(i)&&i.length?i:!1},He=on;var an=(t,e,n)=>{let o=n||document,r=Object.keys(te),s=st(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${V}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${V}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=te[m],c={type:m},l=I.round,f=He(t),g=f&&f.length?Te(f,l):"";return s?(u.forEach(p=>{c[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(c,t),Object.keys(c).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),c[p])})),Be(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},vt=an;var sn=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:c,y2:l,x:f,y:g}=n,[p,h]=i.slice(-2),P=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a)||M(m,a)===M(c*2-f,a)&&M(u,a)===M(l*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a))return["T",i[2],i[3]]}return P},Ze=sn;var mn=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},ie=mn;var un=(t,e)=>{let n=oe(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return T(n,(m,u,c,l)=>{r.x=c,r.y=l;let f=X(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=Ze(m,f,r,i),P=ie(h,o),S=P.join(""),A=be(h,u,c,l),y=ie(A,o),b=y.join("");g=S.length{let e=oe(t),n=J(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],c=u&&u[0],l=e[i+1],f=l&&l[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),P=a;switch(g){case"M":P=r?["Z"]:[g,p,h];break;case"A":P=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":l&&f==="S"?P=["S",a[1],a[2],p,h]:P=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":c&&"CS".includes(c)&&(!l||f!=="S")?P=["C",m[3],m[4],m[1],m[2],p,h]:P=[g,m[1],m[2],p,h];break;case"Q":l&&f==="T"?P=["T",p,h]:P=[g,a[1],a[2],p,h];break;case"T":c&&"QT".includes(c)&&(!l||f!=="T")?P=["Q",m[1],m[2],p,h]:P=[g,p,h];break;case"Z":P=["M",p,h];break;case"H":P=[g,p];break;case"V":P=[g,h];break;default:P=[g].concat(a.slice(1,-2),p,h)}return P});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Me=cn;var ln=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[c]=u,l=c.toUpperCase(),f=c.toLowerCase(),g=c===f,p=u.slice(1);l==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[l,a,i]:u]):(l==="Z"?(r=a,s=i):l==="H"?([,r]=u,r+=g?m.x:0):l==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},it=ln;var Zt=pt(require("@thednp/dommatrix"),1),pn=t=>{let e=new Zt.default,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},Ge=pn;var Gt=pt(require("@thednp/dommatrix"),1),fn=(t,e)=>{let n=Gt.default.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},gn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=fn(t,[e[0],e[1],0,1]),u=a-o,c=i-r,l=m-s;return[u*(Math.abs(s)/Math.abs(l)||1)+o,c*(Math.abs(s)/Math.abs(l)||1)+r]},Le=gn;var hn=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),c=e&&Object.keys(e);if(!e||c&&!c.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let l=e.origin,f=Ge(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,P)=>{[m]=g;let S=m.toUpperCase(),y=S!==m?_(g,p,h,P):g.slice(0),b=S==="A"?["C"].concat(ye(h,P,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",h,y[1]]:S==="H"?["L",y[1],P]:y;m=b[0];let d=m==="C"&&b.length>7,C=d?b.slice(0,7):b.slice(0);if(d&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=Le(f,[b[1],b[2]],l);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},Nt=bn;var yn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>ie(o,n))},wt=yn;var Pn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),c=E(i,m,n),l=E(m,u,n),f=E(c,l,n);return[["C",i[0],i[1],c[0],c[1],f[0],f[1]],["C",l[0],l[1],u[0],u[1],a[0],a[1]]]},zt=Pn;var Rt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${V}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,c,l]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(c)?0:c,Number.isNaN(l)?0:l]}return this.round=i,this.origin=m,this}get bbox(){return at(this.segments)}get length(){return K(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return me(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=oe(e),this}toRelative(){let{segments:e}=this;return this.segments=ot(e),this}toCurve(){let{segments:e}=this;return this.segments=ae(e),this}reverse(e){let{segments:n}=this,o=it(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Me(i):i.slice(0):Me(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Me(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=J(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=mt(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,c]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,c||s]}else a.origin=[o,r,s];return this.segments=ut(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return Te(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return Vt.default}static get arcTools(){return Je}static get bezierTools(){return Xe}static get cubicTools(){return et}static get lineTools(){return Fe}static get polygonTools(){return nt}static get quadTools(){return rt}static get pathToAbsolute(){return oe}static get pathToRelative(){return ot}static get pathToCurve(){return ae}static get pathToString(){return Te}static get distanceSquareRoot(){return re}static get midPoint(){return E}static get rotateVector(){return ne}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return Ae}static get invalidPathValue(){return j}static get isArcCommand(){return qe}static get isDigit(){return $}static get isDigitStart(){return Qe}static get isMoveCommand(){return De}static get isPathCommand(){return ke}static get isSpace(){return Ve}static get paramsCount(){return Z}static get paramsParser(){return U}static get pathParser(){return F}static get scanFlag(){return ze}static get scanParam(){return Re}static get scanSegment(){return he}static get skipSpaces(){return G}static get distanceEpsilon(){return se}static get getClosestPoint(){return xt}static get getDrawDirection(){return St}static get getPathArea(){return Ie}static get getPathBBox(){return at}static get getPointAtLength(){return me}static get getPropertiesAtLength(){return Pe}static get getPropertiesAtPoint(){return Y}static get getSegmentAtLength(){return At}static get getSegmentOfPoint(){return Ct}static get getTotalLength(){return K}static get isAbsoluteArray(){return $e}static get isCurveArray(){return Tt}static get isNormalizedArray(){return je}static get isPathArray(){return ee}static get isPointInStroke(){return Mt}static get isRelativeArray(){return Lt}static get isValidPath(){return Be}static get shapeParams(){return te}static get shapeToPath(){return vt}static get shapeToPathArray(){return He}static get absolutizeSegment(){return _}static get arcToCubic(){return ye}static get getSVGMatrix(){return Ge}static get iterate(){return T}static get lineToCubic(){return Ce}static get normalizePath(){return J}static get normalizeSegment(){return X}static get optimizePath(){return mt}static get projection2d(){return Le}static get quadToCubic(){return Ee}static get relativizeSegment(){return be}static get reverseCurve(){return Nt}static get reversePath(){return Me}static get roundPath(){return wt}static get roundSegment(){return ie}static get segmentToCubic(){return Oe}static get shortenSegment(){return Ze}static get splitCubic(){return zt}static get splitPath(){return it}static get transformPath(){return ut}},dn=Rt;0&&(module.exports={CSSMatrix,absolutizeSegment,arcToCubic,arcTools,bezierTools,cubicTools,distanceEpsilon,distanceSquareRoot,finalizeSegment,getClosestPoint,getDrawDirection,getPathArea,getPathBBox,getPointAtLength,getPropertiesAtLength,getPropertiesAtPoint,getSVGMatrix,getSegmentAtLength,getSegmentOfPoint,getTotalLength,invalidPathValue,isAbsoluteArray,isArcCommand,isCurveArray,isDigit,isDigitStart,isMoveCommand,isNormalizedArray,isPathArray,isPathCommand,isPointInStroke,isRelativeArray,isSpace,isValidPath,iterate,lineToCubic,lineTools,midPoint,normalizePath,normalizeSegment,optimizePath,paramsCount,paramsParser,parsePathString,pathParser,pathToAbsolute,pathToCurve,pathToRelative,pathToString,polygonTools,projection2d,quadToCubic,quadTools,relativizeSegment,reverseCurve,reversePath,rotateVector,roundPath,roundSegment,roundTo,scanFlag,scanParam,scanSegment,segmentToCubic,shapeParams,shapeToPath,shapeToPathArray,shortenSegment,skipSpaces,splitCubic,splitPath,transformPath}); +"use strict";var Gt=Object.create;var Ge=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var Ut=Object.getOwnPropertyNames;var Ft=Object.getPrototypeOf,Kt=Object.prototype.hasOwnProperty;var Jt=(t,e)=>{for(var n in e)Ge(t,n,{get:e[n],enumerable:!0})},kt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ut(e))!Kt.call(t,r)&&r!==n&&Ge(t,r,{get:()=>e[r],enumerable:!(o=_t(e,r))||o.enumerable});return t};var at=(t,e,n)=>(n=t!=null?Gt(Ft(t)):{},kt(e||!t||!t.__esModule?Ge(n,"default",{value:t,enumerable:!0}):n,t)),Wt=t=>kt(Ge({},"__esModule",{value:!0}),t);var xn={};Jt(xn,{CSSMatrix:()=>Rt.default,absolutizeSegment:()=>_,arcToCubic:()=>be,arcTools:()=>lt,bezierTools:()=>ft,cubicTools:()=>ht,default:()=>dn,distanceEpsilon:()=>se,distanceSquareRoot:()=>re,finalizeSegment:()=>Se,getClosestPoint:()=>dt,getDrawDirection:()=>xt,getPathArea:()=>Oe,getPathBBox:()=>Xe,getPointAtLength:()=>me,getPropertiesAtLength:()=>ye,getPropertiesAtPoint:()=>Y,getSVGMatrix:()=>Ze,getSegmentAtLength:()=>St,getSegmentOfPoint:()=>At,getTotalLength:()=>K,invalidPathValue:()=>j,isAbsoluteArray:()=>Ie,isArcCommand:()=>qe,isCurveArray:()=>Ct,isDigit:()=>$,isDigitStart:()=>ke,isMoveCommand:()=>Qe,isNormalizedArray:()=>$e,isPathArray:()=>ee,isPathCommand:()=>Ve,isPointInStroke:()=>Tt,isRelativeArray:()=>Mt,isSpace:()=>Re,isValidPath:()=>je,iterate:()=>T,lineToCubic:()=>Ae,lineTools:()=>st,midPoint:()=>E,normalizePath:()=>J,normalizeSegment:()=>X,optimizePath:()=>et,paramsCount:()=>Z,paramsParser:()=>U,parsePathString:()=>L,pathParser:()=>F,pathToAbsolute:()=>oe,pathToCurve:()=>ae,pathToRelative:()=>We,pathToString:()=>Ce,polygonTools:()=>Pt,projection2d:()=>Me,quadToCubic:()=>De,quadTools:()=>yt,relativizeSegment:()=>he,reverseCurve:()=>vt,reversePath:()=>Te,rotateVector:()=>ne,roundPath:()=>Nt,roundSegment:()=>ie,roundTo:()=>M,scanFlag:()=>we,scanParam:()=>ze,scanSegment:()=>ge,segmentToCubic:()=>Ee,shapeParams:()=>te,shapeToPath:()=>Lt,shapeToPathArray:()=>Be,shortenSegment:()=>He,skipSpaces:()=>G,splitCubic:()=>wt,splitPath:()=>tt,transformPath:()=>rt});module.exports=Wt(xn);var Rt=at(require("@thednp/dommatrix"),1);var Xt=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=Xt;var Yt=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),re=Yt;var le=(t,e,n,o)=>re([t,e],[n,o]),Le=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=re([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},_e=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]},st={getLineBBox:_e,getLineLength:le,getPointAtLineLength:Le};var it=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},pe=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),c=n*i(s),l=o*a(s);return[t+m*c-u*l,e+u*c+m*l]},mt=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},Ue=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:c,cos:l,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,b={x:l(S)*A+c(S)*y,y:-c(S)*A+l(S)*y},d=b.x**2/p**2+b.y**2/h**2;d>1&&(p*=f(d),h*=f(d));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,R=p**2*b.y**2+h**2*b.x**2,k=C/R;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},B={x:l(S)*v.x-c(S)*v.y+(t+i)/2,y:c(S)*v.x+l(S)*v.y+(e+m)/2},ue={x:(b.x-v.x)/p,y:(b.y-v.y)/h},q=mt({x:1,y:0},ue),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},Q=mt(ue,x);!a&&Q>0?Q-=2*g:a&&Q<0&&(Q+=2*g),Q%=2*g;let H=q+Q;return{center:B,startAngle:q,endAngle:H,rx:p,ry:h}},ve=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:c,startAngle:l,endAngle:f}=Ue(t,e,n,o,r,s,a,i,m);return it(u,c,f-l)},ut=(t,e,n,o,r,s,a,i,m,u)=>{let c={x:t,y:e},{center:l,rx:f,ry:g,startAngle:p,endAngle:h}=Ue(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let P=it(f,g,h-p);if(u<=0)c={x:t,y:e};else if(u>=P)c={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return Le(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,b=h-p,C=(r%360+360)%360*(S/180),R=p+b*(u/P),k=f*A(R),w=g*y(R);c={x:A(C)*k-y(C)*w+l.x,y:y(C)*k+A(C)*w+l.y}}}return c},ct=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:c,ry:l,startAngle:f,endAngle:g}=Ue(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:P,tan:S,atan2:A,PI:y}=Math,{x:b,y:d}=u,C=r*y/180,R=S(C),k=A(-l*R,c),w=k,v=k+y,B=A(l,c*R),ue=B+y,q=[i],x=[m],Q=h(t,i),H=P(t,i),O=h(e,m),W=P(e,m),Pe=g-p*1e-5,ce=pe(b,d,c,l,C,Pe),N=g-p*.99999,D=pe(b,d,c,l,C,N);if(ce[0]>H||D[0]>H){let z=pe(b,d,c,l,C,w);q.push(z[0]),x.push(z[1])}if(ce[0]W||D[1]>W){let z=pe(b,d,c,l,C,B);q.push(z[0]),x.push(z[1])}return Q=h.apply([],q),O=h.apply([],x),H=P.apply([],q),W=P.apply([],x),[Q,O,H,W]},lt={angleBetween:mt,arcLength:it,arcPoint:pe,getArcBBox:ct,getArcLength:ve,getArcProps:Ue,getPointAtArcLength:ut};var pt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],qt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Qt=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,c=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,c=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+c*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+c*r[3].y,t:e}},Et=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},Ot=t=>{let n=pt.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oDt(n[0],o))},It=1e-8,Ne=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&c<1){let f=t*(1-c)*(1-c)*(1-c)+e*3*(1-c)*(1-c)*c+n*3*(1-c)*c*c+o*c*c*c;fm&&(m=f)}}return[i,m]},ft={bezierLength:Ot,calculateBezier:Et,CBEZIER_MINMAX_EPSILON:It,computeBezier:Dt,Cvalues:qt,deriveBezier:Qt,getBezierLength:fe,minmaxC:Fe,minmaxQ:Ne,Tvalues:pt};var $t=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},de=(t,e,n,o,r,s,a,i)=>fe([t,e,n,o,r,s,a,i]),gt=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",c={x:t,y:e};if(u){let l=fe([t,e,n,o,r,s,a,i]);m<=0||(m>=l?c={x:a,y:i}:c=$t([t,e,n,o,r,s,a,i],m/l))}return c},Ke=(t,e,n,o,r,s,a,i)=>{let m=Fe([t,n,r,a]),u=Fe([e,o,s,i]);return[m[0],u[0],m[1],u[1]]},ht={getCubicBBox:Ke,getCubicLength:de,getPointAtCubicLength:gt,getPointAtCubicSegmentLength:$t};var jt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},xe=(t,e,n,o,r,s)=>fe([t,e,n,o,r,s]),bt=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=fe([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=jt([t,e,n,o,r,s],a/u))}return m},Je=(t,e,n,o,r,s)=>{let a=Ne([t,n,r]),i=Ne([e,o,s]);return[a[0],i[0],a[1],i[1]]},yt={getPointAtQuadLength:bt,getPointAtQuadSegmentLength:jt,getQuadBBox:Je,getQuadLength:xe};var er=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+re(t[o-1],n):0,0),Pt={polygonArea:er,polygonLength:tr};var rr=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ne=rr;var nr=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=nr;var or={origin:[0,0,0],round:4},I=or;var ar={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=ar;var sr=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},Se=sr;var mr="SVGPathCommander Error",V=mr;var ir=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${V}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},we=ir;var ur=t=>t>=48&&t<=57,$=ur;var cr="Invalid path value",j=cr;var lr=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${V}: ${j} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!$(u)&&u!==46){t.err=`${V}: ${j} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Re=pr;var fr=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Ve=gr;var hr=t=>$(t)||t===43||t===45||t===46,ke=hr;var br=t=>(t|32)===97,qe=br;var yr=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Qe=yr;var Pr=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!Ve(s)){t.err=`${V}: ${j} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!Qe(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${V}: ${j} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){Se(t);return}for(;;){for(let m=a;m>0;m-=1){if(qe(s)&&(m===3||m===4)?we(t):ze(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!ke(n.charCodeAt(t.index)))break}Se(t)},ge=Pr;var F=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var dr=t=>{if(typeof t!="string")return t.slice(0);let e=new F(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,c=0,l=0;for(let f=0;f{let e=L(t);return T(e,_)},oe=Ar;var Cr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,he)},We=Tr;var Bt=(t,e,n,o,r,s,a,i,m,u)=>{let c=t,l=e,f=n,g=o,p=i,h=m,P=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,b,d,C,R;if(u)[b,d,C,R]=u;else{y=ne(c,l,-S),c=y.x,l=y.y,y=ne(p,h,-S),p=y.x,h=y.y;let N=(c-p)/2,D=(l-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let nt=f*f,ot=g*g,Vt=(s===a?-1:1)*Math.sqrt(Math.abs((nt*ot-nt*D*D-ot*N*N)/(nt*D*D+ot*N*N)));C=Vt*f*D/g+(c+p)/2,R=Vt*-g*N/f+(l+h)/2,b=Math.asin(((l-R)/g*10**9>>0)/10**9),d=Math.asin(((h-R)/g*10**9>>0)/10**9),b=cd&&(b-=Math.PI*2),!a&&d>b&&(d-=Math.PI*2)}let k=d-b;if(Math.abs(k)>P){let N=d,D=p,z=h;d=b+P*(a&&d>b?1:-1),p=C+f*Math.cos(d),h=R+g*Math.sin(d),A=Bt(p,h,f,g,r,0,a,D,z,[d,N,C,R])}k=d-b;let w=Math.cos(b),v=Math.sin(b),B=Math.cos(d),ue=Math.sin(d),q=Math.tan(k/4),x=4/3*f*q,Q=4/3*g*q,H=[c,l],O=[c+x*v,l-Q*w],W=[p+x*ue,h-Q*B],Pe=[p,h];if(O[0]=2*H[0]-O[0],O[1]=2*H[1]-O[1],u)return[O[0],O[1],W[0],W[1],Pe[0],Pe[1]].concat(A);A=[O[0],O[1],W[0],W[1],Pe[0],Pe[1]].concat(A);let ce=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},De=Mr;var Lr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Ae=Lr;var vr=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(be(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(De(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Ae(a,i,r,s)):n==="Z"?["C"].concat(Ae(a,i,m,u)):t},Ee=vr;var Nr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:c}=e,l=t.slice(1),f=l.map((g,p)=>g+(r?p%2?c:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=l.slice(0,-2).concat(l[5]+(r?u:0),l[6]+(r?c:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?c:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},X=Nr;var wr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=wr;var zr=t=>{let e={...U},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=X(o,e),m=Ee(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let c=m.length;return e.x1=+m[c-2],e.y1=+m[c-1],e.x2=+m[c-4]||e.x1,e.y2=+m[c-3]||e.y1,m})},ae=zr;var Rr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,c=-1/0,l=0,f=0,g=0,p=0,h=0,P=0,S=0,A=0,y=0,b=0;T(e,(R,k,w,v)=>{[n]=R;let B=n.toUpperCase(),q=B!==n?_(R,k,w,v):R.slice(0),x=B==="V"?["L",w,q[1]]:B==="H"?["L",q[1],v]:q;[n]=x,"TQ".includes(B)||(y=0,b=0);if(n==="M")[,o,r]=x,l=o,f=r,g=o,p=r;else if(n==="L")[l,f,g,p]=_e(w,v,x[1],x[2]);else if(n==="A")[l,f,g,p]=ct(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let Q=h*2-S,H=P*2-A;[l,f,g,p]=Ke(w,v,Q,H,x[1],x[2],x[3],x[4])}else n==="C"?[l,f,g,p]=Ke(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(y=h*2-y,b=P*2-b,[l,f,g,p]=Je(w,v,y,b,x[1],x[2])):n==="Q"?(y=x[1],b=x[2],[l,f,g,p]=Je(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([l,f,g,p]=_e(w,v,o,r));i=a(l,i),m=a(f,m),u=s(g,u),c=s(p,c),[h,P]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,P]});let d=u-i,C=c-m;return{width:d,height:C,x:i,y:m,x2:u,y2:c,cx:i+d/2,cy:m+C/2,cz:Math.max(d,C)+Math.min(d,C)/2}},Xe=Vr;var kr=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,c=0,l=0;return T(e,(f,g,p,h)=>{[m]=f;let P=m.toUpperCase(),A=P!==m?_(f,g,p,h):f.slice(0),y=P==="V"?["L",p,A[1]]:P==="H"?["L",A[1],h]:A;[m]=y,"TQ".includes(P)||(a=0,i=0);if(m==="M")[,u,c]=y;else if(m==="L")l+=le(p,h,y[1],y[2]);else if(m==="A")l+=ve(p,h,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let b=n*2-r,d=o*2-s;l+=de(p,h,b,d,y[1],y[2],y[3],y[4])}else m==="C"?l+=de(p,h,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,l+=xe(p,h,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],l+=xe(p,h,y[1],y[2],y[3],y[4])):m==="Z"&&(l+=le(p,h,u,c));[n,o]=m==="Z"?[u,c]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),l},K=kr;var se=1e-5;var qr=t=>{let e=L(t),n={...U};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=X(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},J=qr;var Qr=(t,e)=>{let n=J(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),c=typeof e=="number",l={x:m,y:u},f=0,g=l,p=0;return!c||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,l={x:m,y:u},f=0):s==="L"?(l=Le(r[0],r[1],r[2],r[3],e-p),f=le(r[0],r[1],r[2],r[3])):s==="A"?(l=ut(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=ve(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(l=gt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=de(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(l=bt(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=xe(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],l={x:m,y:u},f=le(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-se?{x:a,y:i}:g)},me=Qr;var Dr=(t,e)=>{let n=L(t),o=n.slice(0),r=K(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=K(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=K(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:c})=>c<=e)},ye=Dr;var Er=(t,e)=>{let n=L(t),o=J(n),r=K(o),s=b=>{let d=b.x-e.x,C=b.y-e.y;return d*d+C*C},a=8,i,m={x:0,y:0},u=0,c=0,l=1/0;for(let b=0;b<=r;b+=a)i=me(o,b),u=s(i),u1e-6&&(p=c-a,f=me(o,p),P=s(f),h=c+a,g=me(o,h),S=s(g),p>=0&&PY(t,e).closest,dt=Or;var Ir=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,$r=t=>{let e=0,n=0,o=0;return ae(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=Ir(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Oe=$r;var jr=t=>Oe(ae(t))>=0,xt=jr;var Br=(t,e)=>ye(t,e).segment,St=Br;var Hr=(t,e)=>Y(t,e).segment,At=Hr;var Zr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ee=Zr;var Gr=t=>ee(t)&&t.every(([e])=>e===e.toUpperCase()),Ie=Gr;var _r=t=>Ie(t)&&t.every(([e])=>"ACLMQZ".includes(e)),$e=_r;var Ur=t=>$e(t)&&t.every(([e])=>"MC".includes(e)),Ct=Ur;var Fr=(t,e)=>{let{distance:n}=Y(t,e);return Math.abs(n)ee(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Mt=Kr;var Jr=t=>{if(typeof t!="string"||!t.length)return!1;let e=new F(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Ye=Xr;var Yr=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},en=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},rn=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},nn=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},on=t=>{let e=Object.keys(te),n=Ye(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${V}: "${o}" is not SVGElement`);let r=n?o:t.type,s=te[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=tn(a):r==="ellipse"?i=rn(a):["polyline","polygon"].includes(r)?i=en(a):r==="rect"?i=nn(a):r==="line"?i=Yr(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),ee(i)&&i.length?i:!1},Be=on;var an=(t,e,n)=>{let o=n||document,r=Object.keys(te),s=Ye(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${V}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${V}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=te[m],c={type:m},l=I.round,f=Be(t),g=f&&f.length?Ce(f,l):"";return s?(u.forEach(p=>{c[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(c,t),Object.keys(c).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),c[p])})),je(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},Lt=an;var sn=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:c,y2:l,x:f,y:g}=n,[p,h]=i.slice(-2),P=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a)||M(m,a)===M(c*2-f,a)&&M(u,a)===M(l*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a))return["T",i[2],i[3]]}return P},He=sn;var mn=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},ie=mn;var un=(t,e)=>{let n=oe(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return T(n,(m,u,c,l)=>{r.x=c,r.y=l;let f=X(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=He(m,f,r,i),P=ie(h,o),S=P.join(""),A=he(h,u,c,l),y=ie(A,o),b=y.join("");g=S.length{let e=oe(t),n=J(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],c=u&&u[0],l=e[i+1],f=l&&l[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),P=a;switch(g){case"M":P=r?["Z"]:[g,p,h];break;case"A":P=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":l&&f==="S"?P=["S",a[1],a[2],p,h]:P=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":c&&"CS".includes(c)&&(!l||f!=="S")?P=["C",m[3],m[4],m[1],m[2],p,h]:P=[g,m[1],m[2],p,h];break;case"Q":l&&f==="T"?P=["T",p,h]:P=[g,a[1],a[2],p,h];break;case"T":c&&"QT".includes(c)&&(!l||f!=="T")?P=["Q",m[1],m[2],p,h]:P=[g,p,h];break;case"Z":P=["M",p,h];break;case"H":P=[g,p];break;case"V":P=[g,h];break;default:P=[g].concat(a.slice(1,-2),p,h)}return P});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Te=cn;var ln=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[c]=u,l=c.toUpperCase(),f=c.toLowerCase(),g=c===f,p=u.slice(1);l==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[l,a,i]:u]):(l==="Z"?(r=a,s=i):l==="H"?([,r]=u,r+=g?m.x:0):l==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},tt=ln;var Ht=at(require("@thednp/dommatrix"),1),pn=t=>{let e=new Ht.default,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},Ze=pn;var Zt=at(require("@thednp/dommatrix"),1),fn=(t,e)=>{let n=Zt.default.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},gn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=fn(t,[e[0],e[1],0,1]),u=a-o,c=i-r,l=m-s;return[u*(Math.abs(s)/Math.abs(l)||1)+o,c*(Math.abs(s)/Math.abs(l)||1)+r]},Me=gn;var hn=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),c=e&&Object.keys(e);if(!e||c&&!c.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let l=e.origin,f=Ze(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,P)=>{[m]=g;let S=m.toUpperCase(),y=S!==m?_(g,p,h,P):g.slice(0),b=S==="A"?["C"].concat(be(h,P,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",h,y[1]]:S==="H"?["L",y[1],P]:y;m=b[0];let d=m==="C"&&b.length>7,C=d?b.slice(0,7):b.slice(0);if(d&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=Me(f,[b[1],b[2]],l);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},vt=bn;var yn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>ie(o,n))},Nt=yn;var Pn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),c=E(i,m,n),l=E(m,u,n),f=E(c,l,n);return[["C",i[0],i[1],c[0],c[1],f[0],f[1]],["C",l[0],l[1],u[0],u[1],a[0],a[1]]]},wt=Pn;var zt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${V}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,c,l]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(c)?0:c,Number.isNaN(l)?0:l]}return this.round=i,this.origin=m,this}get bbox(){return Xe(this.segments)}get length(){return K(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return me(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=oe(e),this}toRelative(){let{segments:e}=this;return this.segments=We(e),this}toCurve(){let{segments:e}=this;return this.segments=ae(e),this}reverse(e){let{segments:n}=this,o=tt(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Te(i):i.slice(0):Te(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Te(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=J(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=et(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,c]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,c||s]}else a.origin=[o,r,s];return this.segments=rt(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return Ce(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return Rt.default}static get arcTools(){return lt}static get bezierTools(){return ft}static get cubicTools(){return ht}static get lineTools(){return st}static get polygonTools(){return Pt}static get quadTools(){return yt}static get pathToAbsolute(){return oe}static get pathToRelative(){return We}static get pathToCurve(){return ae}static get pathToString(){return Ce}static get distanceSquareRoot(){return re}static get midPoint(){return E}static get rotateVector(){return ne}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return Se}static get invalidPathValue(){return j}static get isArcCommand(){return qe}static get isDigit(){return $}static get isDigitStart(){return ke}static get isMoveCommand(){return Qe}static get isPathCommand(){return Ve}static get isSpace(){return Re}static get paramsCount(){return Z}static get paramsParser(){return U}static get pathParser(){return F}static get scanFlag(){return we}static get scanParam(){return ze}static get scanSegment(){return ge}static get skipSpaces(){return G}static get distanceEpsilon(){return se}static get getClosestPoint(){return dt}static get getDrawDirection(){return xt}static get getPathArea(){return Oe}static get getPathBBox(){return Xe}static get getPointAtLength(){return me}static get getPropertiesAtLength(){return ye}static get getPropertiesAtPoint(){return Y}static get getSegmentAtLength(){return St}static get getSegmentOfPoint(){return At}static get getTotalLength(){return K}static get isAbsoluteArray(){return Ie}static get isCurveArray(){return Ct}static get isNormalizedArray(){return $e}static get isPathArray(){return ee}static get isPointInStroke(){return Tt}static get isRelativeArray(){return Mt}static get isValidPath(){return je}static get shapeParams(){return te}static get shapeToPath(){return Lt}static get shapeToPathArray(){return Be}static get absolutizeSegment(){return _}static get arcToCubic(){return be}static get getSVGMatrix(){return Ze}static get iterate(){return T}static get lineToCubic(){return Ae}static get normalizePath(){return J}static get normalizeSegment(){return X}static get optimizePath(){return et}static get projection2d(){return Me}static get quadToCubic(){return De}static get relativizeSegment(){return he}static get reverseCurve(){return vt}static get reversePath(){return Te}static get roundPath(){return Nt}static get roundSegment(){return ie}static get segmentToCubic(){return Ee}static get shortenSegment(){return He}static get splitCubic(){return wt}static get splitPath(){return tt}static get transformPath(){return rt}},dn=zt;0&&(module.exports={CSSMatrix,absolutizeSegment,arcToCubic,arcTools,bezierTools,cubicTools,distanceEpsilon,distanceSquareRoot,finalizeSegment,getClosestPoint,getDrawDirection,getPathArea,getPathBBox,getPointAtLength,getPropertiesAtLength,getPropertiesAtPoint,getSVGMatrix,getSegmentAtLength,getSegmentOfPoint,getTotalLength,invalidPathValue,isAbsoluteArray,isArcCommand,isCurveArray,isDigit,isDigitStart,isMoveCommand,isNormalizedArray,isPathArray,isPathCommand,isPointInStroke,isRelativeArray,isSpace,isValidPath,iterate,lineToCubic,lineTools,midPoint,normalizePath,normalizeSegment,optimizePath,paramsCount,paramsParser,parsePathString,pathParser,pathToAbsolute,pathToCurve,pathToRelative,pathToString,polygonTools,projection2d,quadToCubic,quadTools,relativizeSegment,reverseCurve,reversePath,rotateVector,roundPath,roundSegment,roundTo,scanFlag,scanParam,scanSegment,segmentToCubic,shapeParams,shapeToPath,shapeToPathArray,shortenSegment,skipSpaces,splitCubic,splitPath,transformPath}); //# sourceMappingURL=svg-path-commander.cjs.map \ No newline at end of file diff --git a/dist/svg-path-commander.cjs.map b/dist/svg-path-commander.cjs.map index 866838a..a0101a3 100644 --- a/dist/svg-path-commander.cjs.map +++ b/dist/svg-path-commander.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/math/arcTools.ts","../src/math/lineTools.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport * as arcTools from \"./math/arcTools\";\nimport * as bezierTools from \"./math/bezier\";\nimport * as cubicTools from \"./math/cubicTools\";\nimport * as lineTools from \"./math/lineTools\";\nimport * as quadTools from \"./math/quadTools\";\nimport * as polygonTools from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["src_exports","__export","CSSMatrix","absolutizeSegment_default","arcToCubic_default","arcTools_exports","bezier_exports","cubicTools_exports","src_default","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools_exports","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools_exports","projection2d_default","quadToCubic_default","quadTools_exports","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","__toCommonJS","import_dommatrix","arcTools_exports","__export","angleBetween","arcLength","arcPoint","getArcBBox","getArcLength","getArcProps","getPointAtArcLength","lineTools_exports","__export","getLineBBox","getLineLength","getPointAtLineLength","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","bezier_exports","__export","CBEZIER_MINMAX_EPSILON","Cvalues","Tvalues","bezierLength","calculateBezier","computeBezier","deriveBezier","getBezierLength","minmaxC","minmaxQ","points","dpoints","p","d","c","list","j","t","order","mt","mt2","t2","a","b","derivativeFn","l","len","sum","i","curve","idx","step","v1","cp","v2","min","max","E","cp1","cp2","K","T","S","L","R","Q","cubicTools_exports","__export","getCubicBBox","getCubicLength","getPointAtCubicLength","getPointAtCubicSegmentLength","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","quadTools_exports","__export","getPointAtQuadLength","getPointAtQuadSegmentLength","getQuadBBox","getQuadLength","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","polygonTools_exports","__export","polygonArea","polygonLength","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","l","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools_exports","bezier_exports","cubicTools_exports","lineTools_exports","polygonTools_exports","quadTools_exports","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","src_default"]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["src_exports","__export","CSSMatrix","absolutizeSegment_default","arcToCubic_default","arcTools","bezierTools","cubicTools","src_default","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools","projection2d_default","quadToCubic_default","quadTools","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","__toCommonJS","import_dommatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","l","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","src_default"]} \ No newline at end of file diff --git a/dist/svg-path-commander.d.cts b/dist/svg-path-commander.d.cts index 851cadb..d8c3d58 100644 --- a/dist/svg-path-commander.d.cts +++ b/dist/svg-path-commander.d.cts @@ -307,382 +307,80 @@ type TransformEntries = [ TransformObject[TransformProps] ][]; -/** - * Returns the Arc segment length. - * @param rx radius along X axis - * @param ry radius along Y axis - * @param theta the angle in radians - * @returns the arc length - */ -declare const arcLength: (rx: number, ry: number, theta: number) => number; -/** - * Find point on ellipse at given angle around ellipse (theta); - * @param cx the center X - * @param cy the center Y - * @param rx the radius X - * @param ry the radius Y - * @param alpha the arc rotation angle in radians - * @param theta the arc sweep angle in radians - * @returns a point around ellipse at given angle - */ -declare const arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; -/** - * Returns the angle between two points. - * @param v0 starting point - * @param v1 ending point - * @returns the angle in radian - */ -declare const angleBetween: (v0: Point, v1: Point) => number; -/** - * Returns the following properties for an Arc segment: center, start angle, - * end angle, and radiuses on X and Y axis. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns properties specific to Arc segments - */ -declare const getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { - rx: number; - ry: number; - startAngle: number; - endAngle: number; - center: { +declare const arcTools: { + angleBetween: (v0: Point, v1: Point) => number; + arcLength: (rx: number, ry: number, theta: number) => number; + arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; + getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; + getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; + getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { + rx: number; + ry: number; + startAngle: number; + endAngle: number; + center: { + x: number; + y: number; + }; + }; + getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { x: number; y: number; }; }; -/** - * Returns the length of an Arc segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the length of the Arc segment - */ -declare const getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; -/** - * Returns a point along an Arc segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance a [0-1] ratio - * @returns a point along the Arc segment - */ -declare const getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { - x: number; - y: number; -}; -/** - * Returns the extrema for an Arc segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @see https://github.com/herrstrietzel/svg-pathdata-getbbox - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the Arc segment - */ -declare const getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; - -declare const arcTools_angleBetween: typeof angleBetween; -declare const arcTools_arcLength: typeof arcLength; -declare const arcTools_arcPoint: typeof arcPoint; -declare const arcTools_getArcBBox: typeof getArcBBox; -declare const arcTools_getArcLength: typeof getArcLength; -declare const arcTools_getArcProps: typeof getArcProps; -declare const arcTools_getPointAtArcLength: typeof getPointAtArcLength; -declare namespace arcTools { - export { arcTools_angleBetween as angleBetween, arcTools_arcLength as arcLength, arcTools_arcPoint as arcPoint, arcTools_getArcBBox as getArcBBox, arcTools_getArcLength as getArcLength, arcTools_getArcProps as getArcProps, arcTools_getPointAtArcLength as getPointAtArcLength }; -} -/** - * Tools from bezier.js by Mike 'Pomax' Kamermans - * @see https://github.com/Pomax/bezierjs - */ -declare const Tvalues: number[]; -declare const Cvalues: number[]; -/** - * @param points - * @returns - */ -declare const deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; -/** - * @param points - * @param t - */ -declare const computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; -declare const calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; -declare const bezierLength: (derivativeFn: DeriveCallback) => number; -/** - * Returns the length of CubicBezier / Quad segment. - * @param curve cubic / quad bezier segment - */ -declare const getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; -declare const CBEZIER_MINMAX_EPSILON = 1e-8; -/** - * Returns the most extreme points in a Quad Bezier segment. - * @param A an array which consist of X/Y values - */ -declare const minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; -/** - * Returns the most extreme points in a Cubic Bezier segment. - * @param A an array which consist of X/Y values - * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127 - */ -declare const minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; - -declare const bezierTools_CBEZIER_MINMAX_EPSILON: typeof CBEZIER_MINMAX_EPSILON; -declare const bezierTools_Cvalues: typeof Cvalues; -declare const bezierTools_Tvalues: typeof Tvalues; -declare const bezierTools_bezierLength: typeof bezierLength; -declare const bezierTools_calculateBezier: typeof calculateBezier; -declare const bezierTools_computeBezier: typeof computeBezier; -declare const bezierTools_deriveBezier: typeof deriveBezier; -declare const bezierTools_getBezierLength: typeof getBezierLength; -declare const bezierTools_minmaxC: typeof minmaxC; -declare const bezierTools_minmaxQ: typeof minmaxQ; -declare namespace bezierTools { - export { bezierTools_CBEZIER_MINMAX_EPSILON as CBEZIER_MINMAX_EPSILON, bezierTools_Cvalues as Cvalues, bezierTools_Tvalues as Tvalues, bezierTools_bezierLength as bezierLength, bezierTools_calculateBezier as calculateBezier, bezierTools_computeBezier as computeBezier, bezierTools_deriveBezier as deriveBezier, bezierTools_getBezierLength as getBezierLength, bezierTools_minmaxC as minmaxC, bezierTools_minmaxQ as minmaxQ }; -} - -/** - * Returns a point at a given length of a CubicBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param t a [0-1] ratio - * @returns the point at cubic-bezier segment length - */ -declare const getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { - x: number; - y: number; -}; -/** - * Returns the length of a CubicBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the CubicBezier segment length - */ -declare const getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; -/** - * Returns the point along a CubicBezier segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to look at - * @returns the point at CubicBezier length - */ -declare const getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; +declare const bezierTools: { + bezierLength: (derivativeFn: DeriveCallback) => number; + calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; + CBEZIER_MINMAX_EPSILON: number; + computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; + Cvalues: number[]; + deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; + getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; + minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; + minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; + Tvalues: number[]; }; -/** - * Returns the boundig box of a CubicBezier segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the CubicBezier segment - */ -declare const getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; - -declare const cubicTools_getCubicBBox: typeof getCubicBBox; -declare const cubicTools_getCubicLength: typeof getCubicLength; -declare const cubicTools_getPointAtCubicLength: typeof getPointAtCubicLength; -declare const cubicTools_getPointAtCubicSegmentLength: typeof getPointAtCubicSegmentLength; -declare namespace cubicTools { - export { cubicTools_getCubicBBox as getCubicBBox, cubicTools_getCubicLength as getCubicLength, cubicTools_getPointAtCubicLength as getPointAtCubicLength, cubicTools_getPointAtCubicSegmentLength as getPointAtCubicSegmentLength }; -} -/** - * Returns length for line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the line segment length - */ -declare const getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; -/** - * Returns a point along the line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to point in [0-1] range - * @returns the point at length - */ -declare const getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; +declare const cubicTools: { + getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; + getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; + getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { + x: number; + y: number; + }; }; -/** - * Returns bounding box for line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to point in [0-1] range - * @returns the extrema for line segments - */ -declare const getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; -declare const lineTools_getLineBBox: typeof getLineBBox; -declare const lineTools_getLineLength: typeof getLineLength; -declare const lineTools_getPointAtLineLength: typeof getPointAtLineLength; -declare namespace lineTools { - export { lineTools_getLineBBox as getLineBBox, lineTools_getLineLength as getLineLength, lineTools_getPointAtLineLength as getPointAtLineLength }; -} - -/** - * Returns the {x,y} coordinates of a point at a - * given length of a quadratic-bezier segment. - * - * @see https://github.com/substack/point-at-length - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param t a [0-1] ratio - * @returns the requested {x,y} coordinates - */ -declare const getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { - x: number; - y: number; -}; -/** - * Returns the length of a QuadraticBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the QuadraticBezier segment length - */ -declare const getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; -/** - * Returns the point along a QuadraticBezier segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to look at - * @returns the point at QuadraticBezier length - */ -declare const getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; +declare const lineTools: { + getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; + getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; + getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; }; -/** - * Returns the boundig box of a QuadraticBezier segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the QuadraticBezier segment - */ -declare const getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; - -declare const quadTools_getPointAtQuadLength: typeof getPointAtQuadLength; -declare const quadTools_getPointAtQuadSegmentLength: typeof getPointAtQuadSegmentLength; -declare const quadTools_getQuadBBox: typeof getQuadBBox; -declare const quadTools_getQuadLength: typeof getQuadLength; -declare namespace quadTools { - export { quadTools_getPointAtQuadLength as getPointAtQuadLength, quadTools_getPointAtQuadSegmentLength as getPointAtQuadSegmentLength, quadTools_getQuadBBox as getQuadBBox, quadTools_getQuadLength as getQuadLength }; -} -/** - * d3-polygon-area - * https://github.com/d3/d3-polygon - * - * Returns the area of a polygon. - * - * @param polygon an array of coordinates - * @returns the polygon area - */ -declare const polygonArea: (polygon: PointTuple[]) => number; -/** - * d3-polygon-length - * https://github.com/d3/d3-polygon - * - * Returns the perimeter of a polygon. - * - * @param polygon an array of coordinates - * @returns the polygon length - */ -declare const polygonLength: (polygon: PointTuple[]) => number; +declare const quadTools: { + getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { + x: number; + y: number; + }; + getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; + getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; +}; -declare const polygonTools_polygonArea: typeof polygonArea; -declare const polygonTools_polygonLength: typeof polygonLength; -declare namespace polygonTools { - export { polygonTools_polygonArea as polygonArea, polygonTools_polygonLength as polygonLength }; -} +declare const polygonTools: { + polygonArea: (polygon: PointTuple[]) => number; + polygonLength: (polygon: PointTuple[]) => number; +}; /** * Returns the square root of the distance @@ -1466,12 +1164,75 @@ declare class SVGPathCommander { */ dispose(): void; static get CSSMatrix(): typeof CSSMatrix; - static get arcTools(): typeof arcTools; - static get bezierTools(): typeof bezierTools; - static get cubicTools(): typeof cubicTools; - static get lineTools(): typeof lineTools; - static get polygonTools(): typeof polygonTools; - static get quadTools(): typeof quadTools; + static get arcTools(): { + angleBetween: (v0: Point, v1: Point) => number; + arcLength: (rx: number, ry: number, theta: number) => number; + arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; + getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; + getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; + getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { + rx: number; + ry: number; + startAngle: number; + endAngle: number; + center: { + x: number; + y: number; + }; + }; + getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { + x: number; + y: number; + }; + }; + static get bezierTools(): { + bezierLength: (derivativeFn: DeriveCallback) => number; + calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; + CBEZIER_MINMAX_EPSILON: number; + computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; + Cvalues: number[]; + deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; + getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; + minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; + minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; + Tvalues: number[]; + }; + static get cubicTools(): { + getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; + getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; + getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { + x: number; + y: number; + }; + }; + static get lineTools(): { + getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; + getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; + getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + }; + static get polygonTools(): { + polygonArea: (polygon: PointTuple[]) => number; + polygonLength: (polygon: PointTuple[]) => number; + }; + static get quadTools(): { + getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { + x: number; + y: number; + }; + getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; + getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; + }; static get pathToAbsolute(): (pathInput: string | PathArray) => AbsoluteArray; static get pathToRelative(): (pathInput: string | PathArray) => RelativeArray; static get pathToCurve(): (pathInput: string | PathArray) => CurveArray; diff --git a/dist/svg-path-commander.d.ts b/dist/svg-path-commander.d.ts index 851cadb..d8c3d58 100644 --- a/dist/svg-path-commander.d.ts +++ b/dist/svg-path-commander.d.ts @@ -307,382 +307,80 @@ type TransformEntries = [ TransformObject[TransformProps] ][]; -/** - * Returns the Arc segment length. - * @param rx radius along X axis - * @param ry radius along Y axis - * @param theta the angle in radians - * @returns the arc length - */ -declare const arcLength: (rx: number, ry: number, theta: number) => number; -/** - * Find point on ellipse at given angle around ellipse (theta); - * @param cx the center X - * @param cy the center Y - * @param rx the radius X - * @param ry the radius Y - * @param alpha the arc rotation angle in radians - * @param theta the arc sweep angle in radians - * @returns a point around ellipse at given angle - */ -declare const arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; -/** - * Returns the angle between two points. - * @param v0 starting point - * @param v1 ending point - * @returns the angle in radian - */ -declare const angleBetween: (v0: Point, v1: Point) => number; -/** - * Returns the following properties for an Arc segment: center, start angle, - * end angle, and radiuses on X and Y axis. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns properties specific to Arc segments - */ -declare const getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { - rx: number; - ry: number; - startAngle: number; - endAngle: number; - center: { +declare const arcTools: { + angleBetween: (v0: Point, v1: Point) => number; + arcLength: (rx: number, ry: number, theta: number) => number; + arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; + getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; + getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; + getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { + rx: number; + ry: number; + startAngle: number; + endAngle: number; + center: { + x: number; + y: number; + }; + }; + getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { x: number; y: number; }; }; -/** - * Returns the length of an Arc segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the length of the Arc segment - */ -declare const getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; -/** - * Returns a point along an Arc segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance a [0-1] ratio - * @returns a point along the Arc segment - */ -declare const getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { - x: number; - y: number; -}; -/** - * Returns the extrema for an Arc segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @see https://github.com/herrstrietzel/svg-pathdata-getbbox - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param RX the radius on X axis - * @param RY the radius on Y axis - * @param angle the ellipse rotation in degrees - * @param LAF the large arc flag - * @param SF the sweep flag - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the Arc segment - */ -declare const getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; - -declare const arcTools_angleBetween: typeof angleBetween; -declare const arcTools_arcLength: typeof arcLength; -declare const arcTools_arcPoint: typeof arcPoint; -declare const arcTools_getArcBBox: typeof getArcBBox; -declare const arcTools_getArcLength: typeof getArcLength; -declare const arcTools_getArcProps: typeof getArcProps; -declare const arcTools_getPointAtArcLength: typeof getPointAtArcLength; -declare namespace arcTools { - export { arcTools_angleBetween as angleBetween, arcTools_arcLength as arcLength, arcTools_arcPoint as arcPoint, arcTools_getArcBBox as getArcBBox, arcTools_getArcLength as getArcLength, arcTools_getArcProps as getArcProps, arcTools_getPointAtArcLength as getPointAtArcLength }; -} -/** - * Tools from bezier.js by Mike 'Pomax' Kamermans - * @see https://github.com/Pomax/bezierjs - */ -declare const Tvalues: number[]; -declare const Cvalues: number[]; -/** - * @param points - * @returns - */ -declare const deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; -/** - * @param points - * @param t - */ -declare const computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; -declare const calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; -declare const bezierLength: (derivativeFn: DeriveCallback) => number; -/** - * Returns the length of CubicBezier / Quad segment. - * @param curve cubic / quad bezier segment - */ -declare const getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; -declare const CBEZIER_MINMAX_EPSILON = 1e-8; -/** - * Returns the most extreme points in a Quad Bezier segment. - * @param A an array which consist of X/Y values - */ -declare const minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; -/** - * Returns the most extreme points in a Cubic Bezier segment. - * @param A an array which consist of X/Y values - * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127 - */ -declare const minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; - -declare const bezierTools_CBEZIER_MINMAX_EPSILON: typeof CBEZIER_MINMAX_EPSILON; -declare const bezierTools_Cvalues: typeof Cvalues; -declare const bezierTools_Tvalues: typeof Tvalues; -declare const bezierTools_bezierLength: typeof bezierLength; -declare const bezierTools_calculateBezier: typeof calculateBezier; -declare const bezierTools_computeBezier: typeof computeBezier; -declare const bezierTools_deriveBezier: typeof deriveBezier; -declare const bezierTools_getBezierLength: typeof getBezierLength; -declare const bezierTools_minmaxC: typeof minmaxC; -declare const bezierTools_minmaxQ: typeof minmaxQ; -declare namespace bezierTools { - export { bezierTools_CBEZIER_MINMAX_EPSILON as CBEZIER_MINMAX_EPSILON, bezierTools_Cvalues as Cvalues, bezierTools_Tvalues as Tvalues, bezierTools_bezierLength as bezierLength, bezierTools_calculateBezier as calculateBezier, bezierTools_computeBezier as computeBezier, bezierTools_deriveBezier as deriveBezier, bezierTools_getBezierLength as getBezierLength, bezierTools_minmaxC as minmaxC, bezierTools_minmaxQ as minmaxQ }; -} - -/** - * Returns a point at a given length of a CubicBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param t a [0-1] ratio - * @returns the point at cubic-bezier segment length - */ -declare const getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { - x: number; - y: number; -}; -/** - * Returns the length of a CubicBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the CubicBezier segment length - */ -declare const getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; -/** - * Returns the point along a CubicBezier segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to look at - * @returns the point at CubicBezier length - */ -declare const getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; +declare const bezierTools: { + bezierLength: (derivativeFn: DeriveCallback) => number; + calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; + CBEZIER_MINMAX_EPSILON: number; + computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; + Cvalues: number[]; + deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; + getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; + minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; + minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; + Tvalues: number[]; }; -/** - * Returns the boundig box of a CubicBezier segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param c1x the first control point X - * @param c1y the first control point Y - * @param c2x the second control point X - * @param c2y the second control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the CubicBezier segment - */ -declare const getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; - -declare const cubicTools_getCubicBBox: typeof getCubicBBox; -declare const cubicTools_getCubicLength: typeof getCubicLength; -declare const cubicTools_getPointAtCubicLength: typeof getPointAtCubicLength; -declare const cubicTools_getPointAtCubicSegmentLength: typeof getPointAtCubicSegmentLength; -declare namespace cubicTools { - export { cubicTools_getCubicBBox as getCubicBBox, cubicTools_getCubicLength as getCubicLength, cubicTools_getPointAtCubicLength as getPointAtCubicLength, cubicTools_getPointAtCubicSegmentLength as getPointAtCubicSegmentLength }; -} -/** - * Returns length for line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the line segment length - */ -declare const getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; -/** - * Returns a point along the line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to point in [0-1] range - * @returns the point at length - */ -declare const getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; +declare const cubicTools: { + getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; + getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; + getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { + x: number; + y: number; + }; }; -/** - * Returns bounding box for line segments (MoveTo, LineTo). - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to point in [0-1] range - * @returns the extrema for line segments - */ -declare const getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; -declare const lineTools_getLineBBox: typeof getLineBBox; -declare const lineTools_getLineLength: typeof getLineLength; -declare const lineTools_getPointAtLineLength: typeof getPointAtLineLength; -declare namespace lineTools { - export { lineTools_getLineBBox as getLineBBox, lineTools_getLineLength as getLineLength, lineTools_getPointAtLineLength as getPointAtLineLength }; -} - -/** - * Returns the {x,y} coordinates of a point at a - * given length of a quadratic-bezier segment. - * - * @see https://github.com/substack/point-at-length - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param t a [0-1] ratio - * @returns the requested {x,y} coordinates - */ -declare const getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { - x: number; - y: number; -}; -/** - * Returns the length of a QuadraticBezier segment. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the QuadraticBezier segment length - */ -declare const getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; -/** - * Returns the point along a QuadraticBezier segment at a given distance. - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @param distance the distance to look at - * @returns the point at QuadraticBezier length - */ -declare const getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { - x: number; - y: number; +declare const lineTools: { + getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; + getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; + getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; }; -/** - * Returns the boundig box of a QuadraticBezier segment in the following format: - * [MIN_X, MIN_Y, MAX_X, MAX_Y] - * - * @param x1 the starting point X - * @param y1 the starting point Y - * @param cx the control point X - * @param cy the control point Y - * @param x2 the ending point X - * @param y2 the ending point Y - * @returns the extrema of the QuadraticBezier segment - */ -declare const getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; - -declare const quadTools_getPointAtQuadLength: typeof getPointAtQuadLength; -declare const quadTools_getPointAtQuadSegmentLength: typeof getPointAtQuadSegmentLength; -declare const quadTools_getQuadBBox: typeof getQuadBBox; -declare const quadTools_getQuadLength: typeof getQuadLength; -declare namespace quadTools { - export { quadTools_getPointAtQuadLength as getPointAtQuadLength, quadTools_getPointAtQuadSegmentLength as getPointAtQuadSegmentLength, quadTools_getQuadBBox as getQuadBBox, quadTools_getQuadLength as getQuadLength }; -} -/** - * d3-polygon-area - * https://github.com/d3/d3-polygon - * - * Returns the area of a polygon. - * - * @param polygon an array of coordinates - * @returns the polygon area - */ -declare const polygonArea: (polygon: PointTuple[]) => number; -/** - * d3-polygon-length - * https://github.com/d3/d3-polygon - * - * Returns the perimeter of a polygon. - * - * @param polygon an array of coordinates - * @returns the polygon length - */ -declare const polygonLength: (polygon: PointTuple[]) => number; +declare const quadTools: { + getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { + x: number; + y: number; + }; + getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; + getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; +}; -declare const polygonTools_polygonArea: typeof polygonArea; -declare const polygonTools_polygonLength: typeof polygonLength; -declare namespace polygonTools { - export { polygonTools_polygonArea as polygonArea, polygonTools_polygonLength as polygonLength }; -} +declare const polygonTools: { + polygonArea: (polygon: PointTuple[]) => number; + polygonLength: (polygon: PointTuple[]) => number; +}; /** * Returns the square root of the distance @@ -1466,12 +1164,75 @@ declare class SVGPathCommander { */ dispose(): void; static get CSSMatrix(): typeof CSSMatrix; - static get arcTools(): typeof arcTools; - static get bezierTools(): typeof bezierTools; - static get cubicTools(): typeof cubicTools; - static get lineTools(): typeof lineTools; - static get polygonTools(): typeof polygonTools; - static get quadTools(): typeof quadTools; + static get arcTools(): { + angleBetween: (v0: Point, v1: Point) => number; + arcLength: (rx: number, ry: number, theta: number) => number; + arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; + getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; + getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; + getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { + rx: number; + ry: number; + startAngle: number; + endAngle: number; + center: { + x: number; + y: number; + }; + }; + getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { + x: number; + y: number; + }; + }; + static get bezierTools(): { + bezierLength: (derivativeFn: DeriveCallback) => number; + calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; + CBEZIER_MINMAX_EPSILON: number; + computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; + Cvalues: number[]; + deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; + getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; + minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; + minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; + Tvalues: number[]; + }; + static get cubicTools(): { + getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; + getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; + getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { + x: number; + y: number; + }; + }; + static get lineTools(): { + getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; + getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; + getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + }; + static get polygonTools(): { + polygonArea: (polygon: PointTuple[]) => number; + polygonLength: (polygon: PointTuple[]) => number; + }; + static get quadTools(): { + getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { + x: number; + y: number; + }; + getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; + getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; + }; static get pathToAbsolute(): (pathInput: string | PathArray) => AbsoluteArray; static get pathToRelative(): (pathInput: string | PathArray) => RelativeArray; static get pathToCurve(): (pathInput: string | PathArray) => CurveArray; diff --git a/dist/svg-path-commander.js b/dist/svg-path-commander.js index 53c9289..5e1fb58 100644 --- a/dist/svg-path-commander.js +++ b/dist/svg-path-commander.js @@ -1,2 +1,2 @@ -var SVGPathCommander=function(b){"use strict";var tn=Object.defineProperty,en=(e,t,r)=>t in e?tn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,I=(e,t,r)=>en(e,typeof t!="symbol"?t+"":t,r);const nn={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},fe=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),ge=e=>e instanceof DOMMatrix||e instanceof T||typeof e=="object"&&Object.keys(nn).every(t=>e&&t in e),ct=e=>{const t=new T,r=Array.from(e);if(!fe(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[i,n,s,o,c,a,l,m,h,f,g,u,y,A,x,C]=r;t.m11=i,t.a=i,t.m21=c,t.c=c,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=a,t.d=a,t.m32=f,t.m42=A,t.f=A,t.m13=s,t.m23=l,t.m33=g,t.m43=x,t.m14=o,t.m24=m,t.m34=u,t.m44=C}else if(r.length===6){const[i,n,s,o,c,a]=r;t.m11=i,t.a=i,t.m12=n,t.b=n,t.m21=s,t.c=s,t.m22=o,t.d=o,t.m41=c,t.e=c,t.m42=a,t.f=a}return t},ye=e=>{if(ge(e))return ct([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},de=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new T;const i=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[s,o]=n.split("(");if(!o)throw TypeError(i);const c=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[a,l,m,h]=c,f=[a,l,m],g=[a,l,m,h];if(s==="perspective"&&a&&[l,m].every(u=>u===void 0))r.m34=-1/a;else if(s.includes("matrix")&&[6,16].includes(c.length)&&c.every(u=>!Number.isNaN(+u))){const u=c.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(ct(u))}else if(s==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(a,l,m);else if(s==="translate"&&a&&m===void 0)r=r.translate(a,l||0,0);else if(s==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(a,l,m,h);else if(s==="rotate"&&a&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,a);else if(s==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(a,l,m);else if(s==="scale"&&!Number.isNaN(a)&&(a!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?a:l;r=r.scale(a,u,1)}else if(s==="skew"&&(a||!Number.isNaN(a)&&l)&&m===void 0)r=r.skew(a,l||0);else if(["translate","rotate","scale","skew"].some(u=>s.includes(u))&&/[XYZ]/.test(s)&&a&&[l,m].every(u=>u===void 0))if(s==="skewX"||s==="skewY")r=r[s](a);else{const u=s.replace(/[XYZ]/,""),y=s.replace(u,""),A=["X","Y","Z"].indexOf(y),x=u==="scale"?1:0,C=[A===0?a:x,A===1?a:x,A===2?a:x];r=r[u](...C)}else throw TypeError(i)}),r},kt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],be=(e,t,r)=>{const i=new T;return i.m41=e,i.e=e,i.m42=t,i.f=t,i.m43=r,i},pe=(e,t,r)=>{const i=new T,n=Math.PI/180,s=e*n,o=t*n,c=r*n,a=Math.cos(s),l=-Math.sin(s),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(c),g=-Math.sin(c),u=m*f,y=-m*g;i.m11=u,i.a=u,i.m12=y,i.b=y,i.m13=h;const A=l*h*f+a*g;i.m21=A,i.c=A;const x=a*f-l*h*g;return i.m22=x,i.d=x,i.m23=-l*m,i.m31=l*g-a*h*f,i.m32=l*f+a*h*g,i.m33=a*m,i},Ae=(e,t,r,i)=>{const n=new T,s=Math.sqrt(e*e+t*t+r*r);if(s===0)return n;const o=e/s,c=t/s,a=r/s,l=i*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=c*c,y=a*a,A=1-2*(u+y)*f;n.m11=A,n.a=A;const x=2*(o*c*f+a*m*h);n.m12=x,n.b=x,n.m13=2*(o*a*f-c*m*h);const C=2*(c*o*f-a*m*h);n.m21=C,n.c=C;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(c*a*f+o*m*h),n.m31=2*(a*o*f+c*m*h),n.m32=2*(a*c*f-o*m*h),n.m33=1-2*(g+u)*f,n},xe=(e,t,r)=>{const i=new T;return i.m11=e,i.a=e,i.m22=t,i.d=t,i.m33=r,i},Ct=(e,t)=>{const r=new T;if(e){const i=e*Math.PI/180,n=Math.tan(i);r.m21=n,r.c=n}if(t){const i=t*Math.PI/180,n=Math.tan(i);r.m12=n,r.b=n}return r},Ce=e=>Ct(e,0),Me=e=>Ct(0,e),B=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,i=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,s=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,c=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,a=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,A=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,x=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return ct([r,i,n,s,o,c,a,l,m,h,f,g,u,y,A,x])};class T{constructor(t){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,t?this.setMatrixValue(t):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?de(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?ct(t):typeof t=="object"?ye(t):this}toFloat32Array(t){return Float32Array.from(kt(this,t))}toFloat64Array(t){return Float64Array.from(kt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return B(this,t)}translate(t,r,i){const n=t;let s=r,o=i;return typeof s>"u"&&(s=0),typeof o>"u"&&(o=0),B(this,be(n,s,o))}scale(t,r,i){const n=t;let s=r,o=i;return typeof s>"u"&&(s=t),typeof o>"u"&&(o=1),B(this,xe(n,s,o))}rotate(t,r,i){let n=t,s=r||0,o=i||0;return typeof t=="number"&&typeof r>"u"&&typeof i>"u"&&(o=n,n=0,s=0),B(this,pe(n,s,o))}rotateAxisAngle(t,r,i,n){if([t,r,i,n].some(s=>Number.isNaN(+s)))throw new TypeError("CSSMatrix: expecting 4 values");return B(this,Ae(t,r,i,n))}skewX(t){return B(this,Ce(t))}skewY(t){return B(this,Me(t))}skew(t,r){return B(this,Ct(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,i=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,s=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,i,n,s):{x:r,y:i,z:n,w:s}}}I(T,"Translate",be),I(T,"Rotate",pe),I(T,"RotateAxisAngle",Ae),I(T,"Scale",xe),I(T,"SkewX",Ce),I(T,"SkewY",Me),I(T,"Skew",Ct),I(T,"Multiply",B),I(T,"fromArray",ct),I(T,"fromMatrix",ye),I(T,"fromString",de),I(T,"toArray",kt),I(T,"isCompatibleArray",fe),I(T,"isCompatibleObject",ge);const D=(e,t,r)=>{const[i,n]=e,[s,o]=t;return[i+(s-i)*r,n+(o-n)*r]},lt=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),mt=(e,t,r,i)=>lt([e,t],[r,i]),Vt=(e,t,r,i,n)=>{let s={x:e,y:t};if(typeof n=="number"){const o=lt([e,t],[r,i]);if(n<=0)s={x:e,y:t};else if(n>=o)s={x:r,y:i};else{const[c,a]=D([e,t],[r,i],n/o);s={x:c,y:a}}}return s},It=(e,t,r,i)=>{const{min:n,max:s}=Math;return[n(e,r),n(t,i),s(e,r),s(t,i)]},Pe=Object.freeze(Object.defineProperty({__proto__:null,getLineBBox:It,getLineLength:mt,getPointAtLineLength:Vt},Symbol.toStringTag,{value:"Module"})),Rt=(e,t,r)=>{const i=r/2,n=Math.sin(i),s=Math.cos(i),o=e**2*n**2,c=t**2*s**2,a=Math.sqrt(o+c)*r;return Math.abs(a)},U=(e,t,r,i,n,s)=>{const{sin:o,cos:c}=Math,a=c(n),l=o(n),m=r*c(s),h=i*o(s);return[e+a*m-l*h,t+l*m+a*h]},Et=(e,t)=>{const{x:r,y:i}=e,{x:n,y:s}=t,o=r*n+i*s,c=Math.sqrt((r**2+i**2)*(n**2+s**2));return(r*s-i*n<0?-1:1)*Math.acos(o/c)},Mt=(e,t,r,i,n,s,o,c,a)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(i);const x=(n%360+360)%360*(g/180);if(e===c&&t===a)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:c,y:a}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(c+e)/2,y:(a+t)/2}};const C=(e-c)/2,d=(t-a)/2,p={x:h(x)*C+m(x)*d,y:-m(x)*C+h(x)*d},M=p.x**2/u**2+p.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const S=u**2*y**2-u**2*p.y**2-y**2*p.x**2,q=u**2*p.y**2+y**2*p.x**2;let j=S/q;j=j<0?0:j;const v=(s!==o?1:-1)*f(j),N={x:v*(u*p.y/y),y:v*(-(y*p.x)/u)},Q={x:h(x)*N.x-m(x)*N.y+(e+c)/2,y:m(x)*N.x+h(x)*N.y+(t+a)/2},Y={x:(p.x-N.x)/u,y:(p.y-N.y)/y},$=Et({x:1,y:0},Y),P={x:(-p.x-N.x)/u,y:(-p.y-N.y)/y};let k=Et(Y,P);!o&&k>0?k-=2*g:o&&k<0&&(k+=2*g),k%=2*g;const Z=$+k;return{center:Q,startAngle:$,endAngle:Z,rx:u,ry:y}},Ot=(e,t,r,i,n,s,o,c,a)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=Mt(e,t,r,i,n,s,o,c,a);return Rt(l,m,f-h)},Se=(e,t,r,i,n,s,o,c,a,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=Mt(e,t,r,i,n,s,o,c,a);if(typeof l=="number"){const A=Rt(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=A)m={x:c,y:a};else{if(e===c&&t===a)return{x:c,y:a};if(f===0||g===0)return Vt(e,t,c,a,l);const{PI:x,cos:C,sin:d}=Math,p=y-u,S=(n%360+360)%360*(x/180),q=u+p*(l/A),j=f*C(q),v=g*d(q);m={x:C(S)*j-d(S)*v+h.x,y:d(S)*j+C(S)*v+h.y}}}return m},Te=(e,t,r,i,n,s,o,c,a)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=Mt(e,t,r,i,n,s,o,c,a),u=g-f,{min:y,max:A,tan:x,atan2:C,PI:d}=Math,{x:p,y:M}=l,S=n*d/180,q=x(S),j=C(-h*q,m),v=j,N=j+d,Q=C(h,m*q),Y=Q+d,$=[c],P=[a];let k=y(e,c),Z=A(e,c),O=y(t,a),G=A(t,a);const at=g-u*1e-5,tt=U(p,M,m,h,S,at),L=g-u*.99999,V=U(p,M,m,h,S,L);if(tt[0]>Z||V[0]>Z){const z=U(p,M,m,h,S,v);$.push(z[0]),P.push(z[1])}if(tt[0]G||V[1]>G){const z=U(p,M,m,h,S,Q);$.push(z[0]),P.push(z[1])}return k=y.apply([],$),O=y.apply([],P),Z=A.apply([],$),G=A.apply([],P),[k,O,Z,G]},Ne=Object.freeze(Object.defineProperty({__proto__:null,angleBetween:Et,arcLength:Rt,arcPoint:U,getArcBBox:Te,getArcLength:Ot,getArcProps:Mt,getPointAtArcLength:Se},Symbol.toStringTag,{value:"Module"})),_t=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],we=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Le=e=>{const t=[];for(let r=e,i=r.length,n=i-1;i>1;i-=1,n-=1){const s=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const i=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:i*n[0].x+t*n[1].x,y:i*n[0].y+t*n[1].y,t};const s=i*i,o=t*t;let c=0,a=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],c=s,a=i*t*2,l=o):r===3&&(c=s*i,a=s*t*3,l=i*o*3,m=t*o),{x:c*n[0].x+a*n[1].x+l*n[2].x+m*n[3].x,y:c*n[0].y+a*n[1].y+l*n[2].y+m*n[3].y,t}},ze=(e,t)=>{const r=e(t),i=r.x*r.x+r.y*r.y;return Math.sqrt(i)},qe=e=>{const r=_t.length;let i=0;for(let n=0,s;n{const t=[];for(let i=0,n=e.length,s=2;ive(r[0],i))},je=1e-8,Pt=([e,t,r])=>{const i=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[i,n];const s=(e*r-t*t)/(e-2*t+r);return s{const n=e-3*t+3*r-i;if(Math.abs(n)0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+i*m*m*m;fa&&(a=f)}return[c,a]},$e=Object.freeze(Object.defineProperty({__proto__:null,CBEZIER_MINMAX_EPSILON:je,Cvalues:we,Tvalues:_t,bezierLength:qe,calculateBezier:ze,computeBezier:ve,deriveBezier:Le,getBezierLength:ut,minmaxC:Dt,minmaxQ:Pt},Symbol.toStringTag,{value:"Module"})),ke=([e,t,r,i,n,s,o,c],a)=>{const l=1-a;return{x:l**3*e+3*l**2*a*r+3*l*a**2*n+a**3*o,y:l**3*t+3*l**2*a*i+3*l*a**2*s+a**3*c}},St=(e,t,r,i,n,s,o,c)=>ut([e,t,r,i,n,s,o,c]),Ve=(e,t,r,i,n,s,o,c,a)=>{const l=typeof a=="number";let m={x:e,y:t};if(l){const h=ut([e,t,r,i,n,s,o,c]);a<=0||(a>=h?m={x:o,y:c}:m=ke([e,t,r,i,n,s,o,c],a/h))}return m},Qt=(e,t,r,i,n,s,o,c)=>{const a=Dt([e,r,n,o]),l=Dt([t,i,s,c]);return[a[0],l[0],a[1],l[1]]},Ie=Object.freeze(Object.defineProperty({__proto__:null,getCubicBBox:Qt,getCubicLength:St,getPointAtCubicLength:Ve,getPointAtCubicSegmentLength:ke},Symbol.toStringTag,{value:"Module"})),Re=([e,t,r,i,n,s],o)=>{const c=1-o;return{x:c**2*e+2*c*o*r+o**2*n,y:c**2*t+2*c*o*i+o**2*s}},Tt=(e,t,r,i,n,s)=>ut([e,t,r,i,n,s]),Ee=(e,t,r,i,n,s,o)=>{const c=typeof o=="number";let a={x:e,y:t};if(c){const l=ut([e,t,r,i,n,s]);o<=0||(o>=l?a={x:n,y:s}:a=Re([e,t,r,i,n,s],o/l))}return a},Zt=(e,t,r,i,n,s)=>{const o=Pt([e,r,n]),c=Pt([t,i,s]);return[o[0],c[0],o[1],c[1]]},Oe=Object.freeze(Object.defineProperty({__proto__:null,getPointAtQuadLength:Ee,getPointAtQuadSegmentLength:Re,getQuadBBox:Zt,getQuadLength:Tt},Symbol.toStringTag,{value:"Module"})),_e=Object.freeze(Object.defineProperty({__proto__:null,polygonArea:e=>{const t=e.length;let r=-1,i,n=e[t-1],s=0;for(;++re.reduce((t,r,i)=>i?t+lt(e[i-1],r):0,0)},Symbol.toStringTag,{value:"Module"})),et=(e,t,r)=>{const{sin:i,cos:n}=Math,s=e*n(r)-t*i(r),o=e*i(r)+t*n(r);return{x:s,y:o}},w=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},J={origin:[0,0,0],round:4},K={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Nt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:i}=e;for(;i.length>=K[r]&&(r==="m"&&i.length>2?(e.segments.push([t].concat(i.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(i.splice(0,K[r]))),!!K[r]););},_="SVGPathCommander Error",Bt=e=>{const{index:t,pathValue:r}=e,i=r.charCodeAt(t);if(i===48){e.param=0,e.index+=1;return}if(i===49){e.param=1,e.index+=1;return}e.err=`${_}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},H=e=>e>=48&&e<=57,F="Invalid path value",Ht=e=>{const{max:t,pathValue:r,index:i}=e;let n=i,s=!1,o=!1,c=!1,a=!1,l;if(n>=t){e.err=`${_}: ${F} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!H(l)&&l!==46){e.err=`${_}: ${F} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(s=l===48,n+=1,l=r.charCodeAt(n),s&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),W=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Ut=e=>H(e)||e===43||e===45||e===46,Jt=e=>(e|32)===97,Kt=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},wt=e=>{var a;const{max:t,pathValue:r,index:i,segments:n}=e,s=r.charCodeAt(i),o=K[r[i].toLowerCase()];if(e.segmentStart=i,!Gt(s)){e.err=`${_}: ${F} "${r[i]}" is not a path command at index ${i}`;return}const c=n[n.length-1];if(!Kt(s)&&((a=c==null?void 0:c[0])==null?void 0:a.toLocaleLowerCase())==="z"){e.err=`${_}: ${F} "${r[i]}" is not a MoveTo path command at index ${i}`;return}if(e.index+=1,W(e),e.data=[],!o){Nt(e);return}for(;;){for(let l=o;l>0;l-=1){if(Jt(s)&&(l===3||l===4)?Bt(e):Ht(e),e.err.length)return;e.data.push(e.param),W(e),e.index=e.max||!Ut(r.charCodeAt(e.index)))break}Nt(e)};class Lt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const R=e=>{if(typeof e!="string")return e.slice(0);const t=new Lt(e);for(W(t);t.index{const[n]=e,s=n.toUpperCase();if(t===0||s===n)return e;if(s==="A")return[s,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+i];if(s==="V")return[s,e[1]+i];if(s==="H")return[s,e[1]+r];if(s==="L")return[s,e[1]+r,e[2]+i];{const c=[],a=e.length;for(let l=1;l{let r=e.length,i,n="M",s="M",o=!1,c=0,a=0,l=0,m=0,h=0;for(let f=0;f{const t=R(e);return E(t,nt)},vt=(e,t,r,i)=>{const[n]=e,s=n.toLowerCase();if(t===0||n===s)return e;if(s==="a")return[s,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-i];if(s==="v")return[s,e[1]-i];if(s==="h")return[s,e[1]-r];if(s==="l")return[s,e[1]-r,e[2]-i];{const c=[],a=e.length;for(let l=1;l{const t=R(e);return E(t,vt)},ft=(e,t,r,i,n,s,o,c,a,l)=>{let m=e,h=t,f=r,g=i,u=c,y=a;const A=Math.PI*120/180,x=Math.PI/180*(+n||0);let C=[],d,p,M,S,q;if(l)[p,M,S,q]=l;else{d=et(m,h,-x),m=d.x,h=d.y,d=et(u,y,-x),u=d.x,y=d.y;const L=(m-u)/2,V=(h-y)/2;let z=L*L/(f*f)+V*V/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);const ue=f*f,he=g*g,Ye=(s===o?-1:1)*Math.sqrt(Math.abs((ue*he-ue*V*V-he*L*L)/(ue*V*V+he*L*L)));S=Ye*f*V/g+(m+u)/2,q=Ye*-g*L/f+(h+y)/2,p=Math.asin(((h-q)/g*10**9>>0)/10**9),M=Math.asin(((y-q)/g*10**9>>0)/10**9),p=mM&&(p-=Math.PI*2),!o&&M>p&&(M-=Math.PI*2)}let j=M-p;if(Math.abs(j)>A){const L=M,V=u,z=y;M=p+A*(o&&M>p?1:-1),u=S+f*Math.cos(M),y=q+g*Math.sin(M),C=ft(u,y,f,g,n,0,o,V,z,[M,L,S,q])}j=M-p;const v=Math.cos(p),N=Math.sin(p),Q=Math.cos(M),Y=Math.sin(M),$=Math.tan(j/4),P=4/3*f*$,k=4/3*g*$,Z=[m,h],O=[m+P*N,h-k*v],G=[u+P*Y,y-k*Q],at=[u,y];if(O[0]=2*Z[0]-O[0],O[1]=2*Z[1]-O[1],l)return[O[0],O[1],G[0],G[1],at[0],at[1]].concat(C);C=[O[0],O[1],G[0],G[1],at[0],at[1]].concat(C);const tt=[];for(let L=0,V=C.length;L{const o=.3333333333333333,c=2/3;return[o*e+c*r,o*t+c*i,o*n+c*r,o*s+c*i,n,s]},zt=(e,t,r,i)=>{const n=D([e,t],[r,i],.3333333333333333),s=D([e,t],[r,i],2/3);return[n[0],n[1],s[0],s[1],r,i]},Yt=(e,t)=>{const[r]=e,i=e.slice(1).map(Number),[n,s]=i,{x1:o,y1:c,x:a,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=s,e):r==="A"?["C"].concat(ft(o,c,i[0],i[1],i[2],i[3],i[4],i[5],i[6])):r==="Q"?(t.qx=n,t.qy=s,["C"].concat(Xt(o,c,i[0],i[1],i[2],i[3]))):r==="L"?["C"].concat(zt(o,c,n,s)):r==="Z"?["C"].concat(zt(o,c,a,l)):e},gt=(e,t)=>{const[r]=e,i=r.toUpperCase(),n=r!==i,{x1:s,y1:o,x2:c,y2:a,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(i)||(t.qx=null,t.qy=null),i==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(i==="H")return["L",e[1]+(n?l:0),o];if(i==="V")return["L",s,e[1]+(n?m:0)];if(i==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(i==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(i==="C")return["C"].concat(f);if(i==="S"){const g=s*2-c,u=o*2-a;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(i==="T"){const g=s*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(i==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(i==="Z")return["Z"];return e},rt={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},yt=e=>{const t={...rt},r=R(e);return E(r,(i,n,s,o)=>{t.x=s,t.y=o;const c=gt(i,t);let a=Yt(c,t);a[0]==="C"&&a.length>7&&(r.splice(n+1,0,["C"].concat(a.slice(7))),a=a.slice(0,7));const m=a.length;return t.x1=+a[m-2],t.y1=+a[m-1],t.x2=+a[m-4]||t.x1,t.y2=+a[m-3]||t.y1,a})},qt=(e,t)=>{const r=e.length;let{round:i}=J,n=e[0],s="";i=t==="off"||typeof t=="number"&&t>=0?t:typeof i=="number"&&i>=0?i:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=R(e);let r="M",i=0,n=0;const{max:s,min:o}=Math;let c=1/0,a=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,A=0,x=0,C=0,d=0,p=0;E(t,(q,j,v,N)=>{[r]=q;const Q=r.toUpperCase(),$=Q!==r?nt(q,j,v,N):q.slice(0),P=Q==="V"?["L",v,$[1]]:Q==="H"?["L",$[1],N]:$;if([r]=P,"TQ".includes(Q)||(d=0,p=0),r==="M")[,i,n]=P,h=i,f=n,g=i,u=n;else if(r==="L")[h,f,g,u]=It(v,N,P[1],P[2]);else if(r==="A")[h,f,g,u]=Te(v,N,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(r==="S"){const k=y*2-x,Z=A*2-C;[h,f,g,u]=Qt(v,N,k,Z,P[1],P[2],P[3],P[4])}else r==="C"?[h,f,g,u]=Qt(v,N,P[1],P[2],P[3],P[4],P[5],P[6]):r==="T"?(d=y*2-d,p=A*2-p,[h,f,g,u]=Zt(v,N,d,p,P[1],P[2])):r==="Q"?(d=P[1],p=P[2],[h,f,g,u]=Zt(v,N,P[1],P[2],P[3],P[4])):r==="Z"&&([h,f,g,u]=It(v,N,i,n));c=o(h,c),a=o(f,a),l=s(g,l),m=s(u,m),[y,A]=r==="Z"?[i,n]:P.slice(-2),[x,C]=r==="C"?[P[3],P[4]]:r==="S"?[P[1],P[2]]:[y,A]});const M=l-c,S=m-a;return{width:M,height:S,x:c,y:a,x2:l,y2:m,cx:c+M/2,cy:a+S/2,cz:Math.max(M,S)+Math.min(M,S)/2}},X=e=>{const t=R(e);let r=0,i=0,n=0,s=0,o=0,c=0,a="M",l=0,m=0,h=0;return E(t,(f,g,u,y)=>{[a]=f;const A=a.toUpperCase(),C=A!==a?nt(f,g,u,y):f.slice(0),d=A==="V"?["L",u,C[1]]:A==="H"?["L",C[1],y]:C;if([a]=d,"TQ".includes(A)||(o=0,c=0),a==="M")[,l,m]=d;else if(a==="L")h+=mt(u,y,d[1],d[2]);else if(a==="A")h+=Ot(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(a==="S"){const p=r*2-n,M=i*2-s;h+=St(u,y,p,M,d[1],d[2],d[3],d[4])}else a==="C"?h+=St(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):a==="T"?(o=r*2-o,c=i*2-c,h+=Tt(u,y,o,c,d[1],d[2])):a==="Q"?(o=d[1],c=d[2],h+=Tt(u,y,d[1],d[2],d[3],d[4])):a==="Z"&&(h+=mt(u,y,l,m));[r,i]=a==="Z"?[l,m]:d.slice(-2),[n,s]=a==="C"?[d[3],d[4]]:a==="S"?[d[1],d[2]]:[r,i]}),h},dt=1e-5,it=e=>{const t=R(e),r={...rt};return E(t,(i,n,s,o)=>{r.x=s,r.y=o;const c=gt(i,r),a=c.length;return r.x1=+c[a-2],r.y1=+c[a-1],r.x2=+c[a-4]||r.x1,r.y2=+c[a-3]||r.y1,c})},st=(e,t)=>{const r=it(e);let i=!1,n=[],s="M",o=0,c=0,[a,l]=r[0].slice(1);const m=typeof t=="number";let h={x:a,y:l},f=0,g=h,u=0;return!m||t{if([s]=y,i=s==="M",n=i?n:[x,C].concat(y.slice(1)),i?([,a,l]=y,h={x:a,y:l},f=0):s==="L"?(h=Vt(n[0],n[1],n[2],n[3],t-u),f=mt(n[0],n[1],n[2],n[3])):s==="A"?(h=Se(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=Ot(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):s==="C"?(h=Ve(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=St(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):s==="Q"?(h=Ee(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=Tt(n[0],n[1],n[2],n[3],n[4],n[5])):s==="Z"&&(n=[x,C,a,l],h={x:a,y:l},f=mt(n[0],n[1],n[2],n[3])),[o,c]=n.slice(-2),uu-dt?{x:o,y:c}:g)},jt=(e,t)=>{const r=R(e);let i=r.slice(0),n=X(i),s=i.length-1,o=0,c=0,a=r[0];if(s<=0||!t||!Number.isFinite(t))return{segment:a,index:0,length:c,lengthAtSegment:o};if(t>=n)return i=r.slice(0,-1),o=X(i),c=n-o,a=r[s],{segment:a,index:s,length:c,lengthAtSegment:o};const l=[];for(;s>0;)a=i[s],i=i.slice(0,-1),o=X(i),c=n-o,n=o,l.push({segment:a,index:s,length:c,lengthAtSegment:o}),s-=1;return l.find(({lengthAtSegment:m})=>m<=t)},bt=(e,t)=>{const r=R(e),i=it(r),n=X(i),s=p=>{const M=p.x-t.x,S=p.y-t.y;return M*M+S*S};let o=8,c,a={x:0,y:0},l=0,m=0,h=1/0;for(let p=0;p<=n;p+=o)c=st(i,p),l=s(c),l1e-6&&(u=m-o,f=st(i,u),A=s(f),y=m+o,g=st(i,y),x=s(g),u>=0&&Abt(e,t).closest,rn=(e,t,r,i,n,s,o,c)=>3*((c-t)*(r+n)-(o-e)*(i+s)+i*(e-n)-r*(t-s)+c*(n+e/3)-o*(s+t/3))/20,ee=e=>{let t=0,r=0,i=0;return yt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return i=rn(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),i}}).reduce((n,s)=>n+s,0)},Qe=e=>ee(yt(e))>=0,Ze=(e,t)=>jt(e,t).segment,Be=(e,t)=>bt(e,t).segment,pt=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return K[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,ne=e=>pt(e)&&e.every(([t])=>t===t.toUpperCase()),re=e=>ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),He=e=>re(e)&&e.every(([t])=>"MC".includes(t)),Fe=(e,t)=>{const{distance:r}=bt(e,t);return Math.abs(r)pt(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),ie=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Lt(e);for(W(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,sn=e=>{let{x1:t,y1:r,x2:i,y2:n}=e;return[t,r,i,n]=[t,r,i,n].map(s=>+s),[["M",t,r],["L",i,n]]},on=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let i=0;for(;i{let{cx:t,cy:r,r:i}=e;return[t,r,i]=[t,r,i].map(n=>+n),[["M",t-i,r],["a",i,i,0,1,0,2*i,0],["a",i,i,0,1,0,-2*i,0]]},cn=e=>{let{cx:t,cy:r}=e,i=e.rx||0,n=e.ry||i;return[t,r,i,n]=[t,r,i,n].map(s=>+s),[["M",t-i,r],["a",i,n,0,1,0,2*i,0],["a",i,n,0,1,0,-2*i,0]]},ln=e=>{const t=+e.x||0,r=+e.y||0,i=+e.width,n=+e.height;let s=+(e.rx||0),o=+(e.ry||s);return s||o?(s*2>i&&(s-=(s*2-i)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+s,r],["h",i-s*2],["s",s,0,s,o],["v",n-o*2],["s",0,o,-s,o],["h",-i+s*2],["s",-s,0,-s,-o],["v",-n+o*2],["s",0,-o,s,-o]]):[["M",t,r],["h",i],["v",n],["H",t],["Z"]]},se=e=>{const t=Object.keys(ot),r=Ue(e),i=r?e.tagName:null;if(i&&[...t,"path"].every(a=>i!==a))throw TypeError(`${_}: "${i}" is not SVGElement`);const n=r?i:e.type,s=ot[n],o={type:n};r?s.forEach(a=>{o[a]=e.getAttribute(a)}):Object.assign(o,e);let c=[];return n==="circle"?c=an(o):n==="ellipse"?c=cn(o):["polyline","polygon"].includes(n)?c=on(o):n==="rect"?c=ln(o):n==="line"?c=sn(o):["glyph","path"].includes(n)&&(c=R(r?e.getAttribute("d")||"":e.d||"")),pt(c)&&c.length?c:!1},Je=(e,t,r)=>{const i=r||document,n=Object.keys(ot),s=Ue(e),o=s?e.tagName:null;if(o==="path")throw TypeError(`${_}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${_}: "${o}" is not SVGElement`);const c=i.createElementNS("http://www.w3.org/2000/svg","path"),a=s?o:e.type,l=ot[a],m={type:a},h=J.round,f=se(e),g=f&&f.length?qt(f,h):"";return s?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||c.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&c.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),ie(g)?(c.setAttribute("d",g),t&&s&&(e.before(c,e),e.remove()),c):!1},oe=(e,t,r,i)=>{const[n]=e,{round:s}=J,o=s,c=t.slice(1),{x1:a,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=c.slice(-2),A=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(w(f,o)===w(u,o))return["V",y];if(w(g,o)===w(y,o))return["H",u]}else if(n==="C"){const[x,C]=c;if(r.x1=x,r.y1=C,"CS".includes(i)&&(w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o)||w(a,o)===w(m*2-f,o)&&w(l,o)===w(h*2-g,o)))return["S",c[2],c[3],c[4],c[5]]}else if(n==="Q"){const[x,C]=c;if(r.qx=x,r.qy=C,"QT".includes(i)&&w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o))return["T",c[2],c[3]]}return A},At=(e,t)=>{const r=e.slice(1).map(i=>w(i,t));return[e[0]].concat(r)},ae=(e,t)=>{const r=ht(e),i=typeof t=="number"&&t>=0?t:2,n={...rt},s=[];let o="M",c="Z";return E(r,(a,l,m,h)=>{n.x=m,n.y=h;const f=gt(a,n);let g=a;if([o]=a,s[l]=o,l){c=s[l-1];const y=oe(a,f,n,c),A=At(y,i),x=A.join(""),C=vt(y,l,m,h),d=At(C,i),p=d.join("");g=x.length{const t=ht(e),r=it(t),i=t.length,n=t[i-1][0]==="Z",s=E(t,(o,c)=>{const a=r[c],l=c&&t[c-1],m=l&&l[0],h=t[c+1],f=h&&h[0],[g]=o,[u,y]=r[c?c-1:i-1].slice(-2);let A=o;switch(g){case"M":A=n?["Z"]:[g,u,y];break;case"A":A=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?A=["S",o[1],o[2],u,y]:A=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?A=["C",a[3],a[4],a[1],a[2],u,y]:A=[g,a[1],a[2],u,y];break;case"Q":h&&f==="T"?A=["T",u,y]:A=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?A=["Q",a[1],a[2],u,y]:A=[g,u,y];break;case"Z":A=["M",u,y];break;case"H":A=[g,u];break;case"V":A=[g,y];break;default:A=[g].concat(o.slice(1,-2),u,y)}return A});return n?s.reverse():[s[0]].concat(s.slice(1).reverse())},ce=e=>{const t=[];let r,i=-1,n=0,s=0,o=0,c=0;const a={...rt};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(i+=1,[n,s]=u,n+=g?a.x:0,s+=g?a.y:0,o=n,c=s,r=[g?[h,o,c]:l]):(h==="Z"?(n=o,s=c):h==="H"?([,n]=l,n+=g?a.x:0):h==="V"?([,s]=l,s+=g?a.y:0):([n,s]=l.slice(-2),n+=g?a.x:0,s+=g?a.y:0),r.push(l)),a.x=n,a.y=s,t[i]=r}),t},le=e=>{let t=new T;const{origin:r}=e,[i,n]=r,{translate:s}=e,{rotate:o}=e,{skew:c}=e,{scale:a}=e;return Array.isArray(s)&&s.length>=2&&s.every(l=>!Number.isNaN(+l))&&s.some(l=>l!==0)?t=t.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(t=t.translate(s)),(o||c||a)&&(t=t.translate(i,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(c)&&c.length===2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==0)?(t=c[0]?t.skewX(c[0]):t,t=c[1]?t.skewY(c[1]):t):typeof c=="number"&&!Number.isNaN(c)&&(t=t.skewX(c)),Array.isArray(a)&&a.length>=2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==1)?t=t.scale(...a):typeof a=="number"&&!Number.isNaN(a)&&(t=t.scale(a)),t=t.translate(-i,-n)),t},mn=(e,t)=>{let r=T.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},$t=(e,t,r)=>{const[i,n,s]=r,[o,c,a]=mn(e,[t[0],t[1],0,1]),l=o-i,m=c-n,h=a-s;return[l*(Math.abs(s)/Math.abs(h)||1)+i,m*(Math.abs(s)/Math.abs(h)||1)+n]},me=(e,t)=>{let r=0,i=0,n=0,s=0,o=0,c=0,a="M";const l=R(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:J.origin});const h=t.origin,f=le(t);return f.isIdentity?l.slice(0):E(l,(g,u,y,A)=>{[a]=g;const x=a.toUpperCase(),d=x!==a?nt(g,u,y,A):g.slice(0);let p=x==="A"?["C"].concat(ft(y,A,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):x==="V"?["L",y,d[1]]:x==="H"?["L",d[1],A]:d;a=p[0];const M=a==="C"&&p.length>7,S=M?p.slice(0,7):p.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(p.slice(7))),p=S),a==="L")[n,s]=$t(f,[p[1],p[2]],h),r!==n&&i!==s?p=["L",n,s]:i===s?p=["H",n]:r===n&&(p=["V",s]);else for(o=1,c=p.length;o{const t=e.slice(1).map((r,i,n)=>i?n[i-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((i,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},We=(e,t)=>{let{round:r}=J;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):E(e,i=>At(i,r))},Xe=(e,t=.5)=>{const r=t,i=e.slice(0,2),n=e.slice(2,4),s=e.slice(4,6),o=e.slice(6,8),c=D(i,n,r),a=D(n,s,r),l=D(s,o,r),m=D(c,a,r),h=D(a,l,r),f=D(m,h,r);return[["C",c[0],c[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class un{constructor(t,r){const i=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${_}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=R(t);const{round:s,origin:o}=i;let c;Number.isInteger(s)||s==="off"?c=s:c=J.round;let a=J.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);a=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=c,this.origin=a,this}get bbox(){return te(this.segments)}get length(){return X(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return st(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=ht(t),this}toRelative(){const{segments:t}=this;return this.segments=Wt(t),this}toCurve(){const{segments:t}=this;return this.segments=yt(t),this}reverse(t){const{segments:r}=this,i=ce(r),n=i.length>1?i:!1,s=n?n.map((c,a)=>t?a?xt(c):c.slice(0):xt(c)):r.slice(0);let o=[];return n?o=s.flat(1):o=t?r:xt(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=it(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=ae(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(a=>a in t))return this;const{segments:r,origin:[i,n,s]}=this,o={};for(const[a,l]of Object.entries(t))a==="skew"&&Array.isArray(l)||(a==="rotate"||a==="translate"||a==="origin"||a==="scale")&&Array.isArray(l)?o[a]=l.map(Number):a!=="origin"&&typeof Number(l)=="number"&&(o[a]=Number(l));const{origin:c}=o;if(Array.isArray(c)&&c.length>=2){const[a,l,m]=c.map(Number);o.origin=[Number.isNaN(a)?i:a,Number.isNaN(l)?n:l,m||s]}else o.origin=[i,n,s];return this.segments=me(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return qt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return T}static get arcTools(){return Ne}static get bezierTools(){return $e}static get cubicTools(){return Ie}static get lineTools(){return Pe}static get polygonTools(){return _e}static get quadTools(){return Oe}static get pathToAbsolute(){return ht}static get pathToRelative(){return Wt}static get pathToCurve(){return yt}static get pathToString(){return qt}static get distanceSquareRoot(){return lt}static get midPoint(){return D}static get rotateVector(){return et}static get roundTo(){return w}static get parsePathString(){return R}static get finalizeSegment(){return Nt}static get invalidPathValue(){return F}static get isArcCommand(){return Jt}static get isDigit(){return H}static get isDigitStart(){return Ut}static get isMoveCommand(){return Kt}static get isPathCommand(){return Gt}static get isSpace(){return Ft}static get paramsCount(){return K}static get paramsParser(){return rt}static get pathParser(){return Lt}static get scanFlag(){return Bt}static get scanParam(){return Ht}static get scanSegment(){return wt}static get skipSpaces(){return W}static get distanceEpsilon(){return dt}static get getClosestPoint(){return De}static get getDrawDirection(){return Qe}static get getPathArea(){return ee}static get getPathBBox(){return te}static get getPointAtLength(){return st}static get getPropertiesAtLength(){return jt}static get getPropertiesAtPoint(){return bt}static get getSegmentAtLength(){return Ze}static get getSegmentOfPoint(){return Be}static get getTotalLength(){return X}static get isAbsoluteArray(){return ne}static get isCurveArray(){return He}static get isNormalizedArray(){return re}static get isPathArray(){return pt}static get isPointInStroke(){return Fe}static get isRelativeArray(){return Ge}static get isValidPath(){return ie}static get shapeParams(){return ot}static get shapeToPath(){return Je}static get shapeToPathArray(){return se}static get absolutizeSegment(){return nt}static get arcToCubic(){return ft}static get getSVGMatrix(){return le}static get iterate(){return E}static get lineToCubic(){return zt}static get normalizePath(){return it}static get normalizeSegment(){return gt}static get optimizePath(){return ae}static get projection2d(){return $t}static get quadToCubic(){return Xt}static get relativizeSegment(){return vt}static get reverseCurve(){return Ke}static get reversePath(){return xt}static get roundPath(){return We}static get roundSegment(){return At}static get segmentToCubic(){return Yt}static get shortenSegment(){return oe}static get splitCubic(){return Xe}static get splitPath(){return ce}static get transformPath(){return me}}return b.CSSMatrix=T,b.absolutizeSegment=nt,b.arcToCubic=ft,b.arcTools=Ne,b.bezierTools=$e,b.cubicTools=Ie,b.default=un,b.distanceEpsilon=dt,b.distanceSquareRoot=lt,b.finalizeSegment=Nt,b.getClosestPoint=De,b.getDrawDirection=Qe,b.getPathArea=ee,b.getPathBBox=te,b.getPointAtLength=st,b.getPropertiesAtLength=jt,b.getPropertiesAtPoint=bt,b.getSVGMatrix=le,b.getSegmentAtLength=Ze,b.getSegmentOfPoint=Be,b.getTotalLength=X,b.invalidPathValue=F,b.isAbsoluteArray=ne,b.isArcCommand=Jt,b.isCurveArray=He,b.isDigit=H,b.isDigitStart=Ut,b.isMoveCommand=Kt,b.isNormalizedArray=re,b.isPathArray=pt,b.isPathCommand=Gt,b.isPointInStroke=Fe,b.isRelativeArray=Ge,b.isSpace=Ft,b.isValidPath=ie,b.iterate=E,b.lineToCubic=zt,b.lineTools=Pe,b.midPoint=D,b.normalizePath=it,b.normalizeSegment=gt,b.optimizePath=ae,b.paramsCount=K,b.paramsParser=rt,b.parsePathString=R,b.pathParser=Lt,b.pathToAbsolute=ht,b.pathToCurve=yt,b.pathToRelative=Wt,b.pathToString=qt,b.polygonTools=_e,b.projection2d=$t,b.quadToCubic=Xt,b.quadTools=Oe,b.relativizeSegment=vt,b.reverseCurve=Ke,b.reversePath=xt,b.rotateVector=et,b.roundPath=We,b.roundSegment=At,b.roundTo=w,b.scanFlag=Bt,b.scanParam=Ht,b.scanSegment=wt,b.segmentToCubic=Yt,b.shapeParams=ot,b.shapeToPath=Je,b.shapeToPathArray=se,b.shortenSegment=oe,b.skipSpaces=W,b.splitCubic=Xe,b.splitPath=ce,b.transformPath=me,Object.defineProperties(b,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),b}({}); +var SVGPathCommander=function(b){"use strict";var tn=Object.defineProperty,en=(e,t,r)=>t in e?tn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t,r)=>en(e,typeof t!="symbol"?t+"":t,r);const nn={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},fe=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),ge=e=>e instanceof DOMMatrix||e instanceof T||typeof e=="object"&&Object.keys(nn).every(t=>e&&t in e),ct=e=>{const t=new T,r=Array.from(e);if(!fe(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,i,o,c,a,l,m,h,f,g,u,y,p,x,C]=r;t.m11=s,t.a=s,t.m21=c,t.c=c,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=a,t.d=a,t.m32=f,t.m42=p,t.f=p,t.m13=i,t.m23=l,t.m33=g,t.m43=x,t.m14=o,t.m24=m,t.m34=u,t.m44=C}else if(r.length===6){const[s,n,i,o,c,a]=r;t.m11=s,t.a=s,t.m12=n,t.b=n,t.m21=i,t.c=i,t.m22=o,t.d=o,t.m41=c,t.e=c,t.m42=a,t.f=a}return t},ye=e=>{if(ge(e))return ct([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},de=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new T;const s=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[i,o]=n.split("(");if(!o)throw TypeError(s);const c=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[a,l,m,h]=c,f=[a,l,m],g=[a,l,m,h];if(i==="perspective"&&a&&[l,m].every(u=>u===void 0))r.m34=-1/a;else if(i.includes("matrix")&&[6,16].includes(c.length)&&c.every(u=>!Number.isNaN(+u))){const u=c.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(ct(u))}else if(i==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(a,l,m);else if(i==="translate"&&a&&m===void 0)r=r.translate(a,l||0,0);else if(i==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(a,l,m,h);else if(i==="rotate"&&a&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,a);else if(i==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(a,l,m);else if(i==="scale"&&!Number.isNaN(a)&&(a!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?a:l;r=r.scale(a,u,1)}else if(i==="skew"&&(a||!Number.isNaN(a)&&l)&&m===void 0)r=r.skew(a,l||0);else if(["translate","rotate","scale","skew"].some(u=>i.includes(u))&&/[XYZ]/.test(i)&&a&&[l,m].every(u=>u===void 0))if(i==="skewX"||i==="skewY")r=r[i](a);else{const u=i.replace(/[XYZ]/,""),y=i.replace(u,""),p=["X","Y","Z"].indexOf(y),x=u==="scale"?1:0,C=[p===0?a:x,p===1?a:x,p===2?a:x];r=r[u](...C)}else throw TypeError(s)}),r},Vt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],be=(e,t,r)=>{const s=new T;return s.m41=e,s.e=e,s.m42=t,s.f=t,s.m43=r,s},Ae=(e,t,r)=>{const s=new T,n=Math.PI/180,i=e*n,o=t*n,c=r*n,a=Math.cos(i),l=-Math.sin(i),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(c),g=-Math.sin(c),u=m*f,y=-m*g;s.m11=u,s.a=u,s.m12=y,s.b=y,s.m13=h;const p=l*h*f+a*g;s.m21=p,s.c=p;const x=a*f-l*h*g;return s.m22=x,s.d=x,s.m23=-l*m,s.m31=l*g-a*h*f,s.m32=l*f+a*h*g,s.m33=a*m,s},pe=(e,t,r,s)=>{const n=new T,i=Math.sqrt(e*e+t*t+r*r);if(i===0)return n;const o=e/i,c=t/i,a=r/i,l=s*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=c*c,y=a*a,p=1-2*(u+y)*f;n.m11=p,n.a=p;const x=2*(o*c*f+a*m*h);n.m12=x,n.b=x,n.m13=2*(o*a*f-c*m*h);const C=2*(c*o*f-a*m*h);n.m21=C,n.c=C;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(c*a*f+o*m*h),n.m31=2*(a*o*f+c*m*h),n.m32=2*(a*c*f-o*m*h),n.m33=1-2*(g+u)*f,n},xe=(e,t,r)=>{const s=new T;return s.m11=e,s.a=e,s.m22=t,s.d=t,s.m33=r,s},Ct=(e,t)=>{const r=new T;if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},Ce=e=>Ct(e,0),Me=e=>Ct(0,e),H=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,s=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,i=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,c=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,a=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,p=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,x=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return ct([r,s,n,i,o,c,a,l,m,h,f,g,u,y,p,x])};class T{constructor(t){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,t?this.setMatrixValue(t):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?de(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?ct(t):typeof t=="object"?ye(t):this}toFloat32Array(t){return Float32Array.from(Vt(this,t))}toFloat64Array(t){return Float64Array.from(Vt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return H(this,t)}translate(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=0),typeof o>"u"&&(o=0),H(this,be(n,i,o))}scale(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=t),typeof o>"u"&&(o=1),H(this,xe(n,i,o))}rotate(t,r,s){let n=t,i=r||0,o=s||0;return typeof t=="number"&&typeof r>"u"&&typeof s>"u"&&(o=n,n=0,i=0),H(this,Ae(n,i,o))}rotateAxisAngle(t,r,s,n){if([t,r,s,n].some(i=>Number.isNaN(+i)))throw new TypeError("CSSMatrix: expecting 4 values");return H(this,pe(t,r,s,n))}skewX(t){return H(this,Ce(t))}skewY(t){return H(this,Me(t))}skew(t,r){return H(this,Ct(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,s=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,i=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,s,n,i):{x:r,y:s,z:n,w:i}}}R(T,"Translate",be),R(T,"Rotate",Ae),R(T,"RotateAxisAngle",pe),R(T,"Scale",xe),R(T,"SkewX",Ce),R(T,"SkewY",Me),R(T,"Skew",Ct),R(T,"Multiply",H),R(T,"fromArray",ct),R(T,"fromMatrix",ye),R(T,"fromString",de),R(T,"toArray",Vt),R(T,"isCompatibleArray",fe),R(T,"isCompatibleObject",ge);const Z=(e,t,r)=>{const[s,n]=e,[i,o]=t;return[s+(i-s)*r,n+(o-n)*r]},lt=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),mt=(e,t,r,s)=>lt([e,t],[r,s]),It=(e,t,r,s,n)=>{let i={x:e,y:t};if(typeof n=="number"){const o=lt([e,t],[r,s]);if(n<=0)i={x:e,y:t};else if(n>=o)i={x:r,y:s};else{const[c,a]=Z([e,t],[r,s],n/o);i={x:c,y:a}}}return i},Rt=(e,t,r,s)=>{const{min:n,max:i}=Math;return[n(e,r),n(t,s),i(e,r),i(t,s)]},Pe={getLineBBox:Rt,getLineLength:mt,getPointAtLineLength:It},Et=(e,t,r)=>{const s=r/2,n=Math.sin(s),i=Math.cos(s),o=e**2*n**2,c=t**2*i**2,a=Math.sqrt(o+c)*r;return Math.abs(a)},_=(e,t,r,s,n,i)=>{const{sin:o,cos:c}=Math,a=c(n),l=o(n),m=r*c(i),h=s*o(i);return[e+a*m-l*h,t+l*m+a*h]},jt=(e,t)=>{const{x:r,y:s}=e,{x:n,y:i}=t,o=r*n+s*i,c=Math.sqrt((r**2+s**2)*(n**2+i**2));return(r*i-s*n<0?-1:1)*Math.acos(o/c)},Mt=(e,t,r,s,n,i,o,c,a)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(s);const x=(n%360+360)%360*(g/180);if(e===c&&t===a)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:c,y:a}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(c+e)/2,y:(a+t)/2}};const C=(e-c)/2,d=(t-a)/2,A={x:h(x)*C+m(x)*d,y:-m(x)*C+h(x)*d},M=A.x**2/u**2+A.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const S=u**2*y**2-u**2*A.y**2-y**2*A.x**2,q=u**2*A.y**2+y**2*A.x**2;let $=S/q;$=$<0?0:$;const v=(i!==o?1:-1)*f($),N={x:v*(u*A.y/y),y:v*(-(y*A.x)/u)},O={x:h(x)*N.x-m(x)*N.y+(e+c)/2,y:m(x)*N.x+h(x)*N.y+(t+a)/2},Y={x:(A.x-N.x)/u,y:(A.y-N.y)/y},k=jt({x:1,y:0},Y),P={x:(-A.x-N.x)/u,y:(-A.y-N.y)/y};let V=jt(Y,P);!o&&V>0?V-=2*g:o&&V<0&&(V+=2*g),V%=2*g;const B=k+V;return{center:O,startAngle:k,endAngle:B,rx:u,ry:y}},Dt=(e,t,r,s,n,i,o,c,a)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=Mt(e,t,r,s,n,i,o,c,a);return Et(l,m,f-h)},Se=(e,t,r,s,n,i,o,c,a,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=Mt(e,t,r,s,n,i,o,c,a);if(typeof l=="number"){const p=Et(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=p)m={x:c,y:a};else{if(e===c&&t===a)return{x:c,y:a};if(f===0||g===0)return It(e,t,c,a,l);const{PI:x,cos:C,sin:d}=Math,A=y-u,S=(n%360+360)%360*(x/180),q=u+A*(l/p),$=f*C(q),v=g*d(q);m={x:C(S)*$-d(S)*v+h.x,y:d(S)*$+C(S)*v+h.y}}}return m},Te=(e,t,r,s,n,i,o,c,a)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=Mt(e,t,r,s,n,i,o,c,a),u=g-f,{min:y,max:p,tan:x,atan2:C,PI:d}=Math,{x:A,y:M}=l,S=n*d/180,q=x(S),$=C(-h*q,m),v=$,N=$+d,O=C(h,m*q),Y=O+d,k=[c],P=[a];let V=y(e,c),B=p(e,c),D=y(t,a),U=p(t,a);const at=g-u*1e-5,tt=_(A,M,m,h,S,at),L=g-u*.99999,I=_(A,M,m,h,S,L);if(tt[0]>B||I[0]>B){const z=_(A,M,m,h,S,v);k.push(z[0]),P.push(z[1])}if(tt[0]U||I[1]>U){const z=_(A,M,m,h,S,O);k.push(z[0]),P.push(z[1])}return V=y.apply([],k),D=y.apply([],P),B=p.apply([],k),U=p.apply([],P),[V,D,B,U]},Ne={angleBetween:jt,arcLength:Et,arcPoint:_,getArcBBox:Te,getArcLength:Dt,getArcProps:Mt,getPointAtArcLength:Se},Qt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],we=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Le=e=>{const t=[];for(let r=e,s=r.length,n=s-1;s>1;s-=1,n-=1){const i=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const s=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:s*n[0].x+t*n[1].x,y:s*n[0].y+t*n[1].y,t};const i=s*s,o=t*t;let c=0,a=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],c=i,a=s*t*2,l=o):r===3&&(c=i*s,a=i*t*3,l=s*o*3,m=t*o),{x:c*n[0].x+a*n[1].x+l*n[2].x+m*n[3].x,y:c*n[0].y+a*n[1].y+l*n[2].y+m*n[3].y,t}},ze=(e,t)=>{const r=e(t),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},qe=e=>{const r=Qt.length;let s=0;for(let n=0,i;n{const t=[];for(let s=0,n=e.length,i=2;sve(r[0],s))},$e=1e-8,Pt=([e,t,r])=>{const s=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[s,n];const i=(e*r-t*t)/(e-2*t+r);return i{const n=e-3*t+3*r-s;if(Math.abs(n)<$e)return e===s&&e===t?[e,s]:Pt([e,-.5*e+1.5*t,e-3*t+3*r]);const i=-e*r+e*s-t*r-t*s+t*t+r*r;if(i<=0)return[Math.min(e,s),Math.max(e,s)];const o=Math.sqrt(i);let c=Math.min(e,s),a=Math.max(e,s);const l=e-2*t+r;for(let m=(l+o)/n,h=1;h<=2;m=(l-o)/n,h++)if(m>0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fa&&(a=f)}return[c,a]},ke={bezierLength:qe,calculateBezier:ze,CBEZIER_MINMAX_EPSILON:$e,computeBezier:ve,Cvalues:we,deriveBezier:Le,getBezierLength:ut,minmaxC:Zt,minmaxQ:Pt,Tvalues:Qt},Ve=([e,t,r,s,n,i,o,c],a)=>{const l=1-a;return{x:l**3*e+3*l**2*a*r+3*l*a**2*n+a**3*o,y:l**3*t+3*l**2*a*s+3*l*a**2*i+a**3*c}},St=(e,t,r,s,n,i,o,c)=>ut([e,t,r,s,n,i,o,c]),Ie=(e,t,r,s,n,i,o,c,a)=>{const l=typeof a=="number";let m={x:e,y:t};if(l){const h=ut([e,t,r,s,n,i,o,c]);a<=0||(a>=h?m={x:o,y:c}:m=Ve([e,t,r,s,n,i,o,c],a/h))}return m},Ot=(e,t,r,s,n,i,o,c)=>{const a=Zt([e,r,n,o]),l=Zt([t,s,i,c]);return[a[0],l[0],a[1],l[1]]},Re={getCubicBBox:Ot,getCubicLength:St,getPointAtCubicLength:Ie,getPointAtCubicSegmentLength:Ve},Ee=([e,t,r,s,n,i],o)=>{const c=1-o;return{x:c**2*e+2*c*o*r+o**2*n,y:c**2*t+2*c*o*s+o**2*i}},Tt=(e,t,r,s,n,i)=>ut([e,t,r,s,n,i]),je=(e,t,r,s,n,i,o)=>{const c=typeof o=="number";let a={x:e,y:t};if(c){const l=ut([e,t,r,s,n,i]);o<=0||(o>=l?a={x:n,y:i}:a=Ee([e,t,r,s,n,i],o/l))}return a},Bt=(e,t,r,s,n,i)=>{const o=Pt([e,r,n]),c=Pt([t,s,i]);return[o[0],c[0],o[1],c[1]]},De={getPointAtQuadLength:je,getPointAtQuadSegmentLength:Ee,getQuadBBox:Bt,getQuadLength:Tt},Qe={polygonArea:e=>{const t=e.length;let r=-1,s,n=e[t-1],i=0;for(;++re.reduce((t,r,s)=>s?t+lt(e[s-1],r):0,0)},et=(e,t,r)=>{const{sin:s,cos:n}=Math,i=e*n(r)-t*s(r),o=e*s(r)+t*n(r);return{x:i,y:o}},w=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},J={origin:[0,0,0],round:4},K={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Nt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:s}=e;for(;s.length>=K[r]&&(r==="m"&&s.length>2?(e.segments.push([t].concat(s.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(s.splice(0,K[r]))),!!K[r]););},Q="SVGPathCommander Error",Ht=e=>{const{index:t,pathValue:r}=e,s=r.charCodeAt(t);if(s===48){e.param=0,e.index+=1;return}if(s===49){e.param=1,e.index+=1;return}e.err=`${Q}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},F=e=>e>=48&&e<=57,G="Invalid path value",Ft=e=>{const{max:t,pathValue:r,index:s}=e;let n=s,i=!1,o=!1,c=!1,a=!1,l;if(n>=t){e.err=`${Q}: ${G} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!F(l)&&l!==46){e.err=`${Q}: ${G} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(i=l===48,n+=1,l=r.charCodeAt(n),i&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),W=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},_t=e=>F(e)||e===43||e===45||e===46,Jt=e=>(e|32)===97,Kt=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},wt=e=>{var a;const{max:t,pathValue:r,index:s,segments:n}=e,i=r.charCodeAt(s),o=K[r[s].toLowerCase()];if(e.segmentStart=s,!Ut(i)){e.err=`${Q}: ${G} "${r[s]}" is not a path command at index ${s}`;return}const c=n[n.length-1];if(!Kt(i)&&((a=c==null?void 0:c[0])==null?void 0:a.toLocaleLowerCase())==="z"){e.err=`${Q}: ${G} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(e.index+=1,W(e),e.data=[],!o){Nt(e);return}for(;;){for(let l=o;l>0;l-=1){if(Jt(i)&&(l===3||l===4)?Ht(e):Ft(e),e.err.length)return;e.data.push(e.param),W(e),e.index=e.max||!_t(r.charCodeAt(e.index)))break}Nt(e)};class Lt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const E=e=>{if(typeof e!="string")return e.slice(0);const t=new Lt(e);for(W(t);t.index{const[n]=e,i=n.toUpperCase();if(t===0||i===n)return e;if(i==="A")return[i,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+s];if(i==="V")return[i,e[1]+s];if(i==="H")return[i,e[1]+r];if(i==="L")return[i,e[1]+r,e[2]+s];{const c=[],a=e.length;for(let l=1;l{let r=e.length,s,n="M",i="M",o=!1,c=0,a=0,l=0,m=0,h=0;for(let f=0;f{const t=E(e);return j(t,nt)},vt=(e,t,r,s)=>{const[n]=e,i=n.toLowerCase();if(t===0||n===i)return e;if(i==="a")return[i,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-s];if(i==="v")return[i,e[1]-s];if(i==="h")return[i,e[1]-r];if(i==="l")return[i,e[1]-r,e[2]-s];{const c=[],a=e.length;for(let l=1;l{const t=E(e);return j(t,vt)},ft=(e,t,r,s,n,i,o,c,a,l)=>{let m=e,h=t,f=r,g=s,u=c,y=a;const p=Math.PI*120/180,x=Math.PI/180*(+n||0);let C=[],d,A,M,S,q;if(l)[A,M,S,q]=l;else{d=et(m,h,-x),m=d.x,h=d.y,d=et(u,y,-x),u=d.x,y=d.y;const L=(m-u)/2,I=(h-y)/2;let z=L*L/(f*f)+I*I/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);const ue=f*f,he=g*g,Ye=(i===o?-1:1)*Math.sqrt(Math.abs((ue*he-ue*I*I-he*L*L)/(ue*I*I+he*L*L)));S=Ye*f*I/g+(m+u)/2,q=Ye*-g*L/f+(h+y)/2,A=Math.asin(((h-q)/g*10**9>>0)/10**9),M=Math.asin(((y-q)/g*10**9>>0)/10**9),A=mM&&(A-=Math.PI*2),!o&&M>A&&(M-=Math.PI*2)}let $=M-A;if(Math.abs($)>p){const L=M,I=u,z=y;M=A+p*(o&&M>A?1:-1),u=S+f*Math.cos(M),y=q+g*Math.sin(M),C=ft(u,y,f,g,n,0,o,I,z,[M,L,S,q])}$=M-A;const v=Math.cos(A),N=Math.sin(A),O=Math.cos(M),Y=Math.sin(M),k=Math.tan($/4),P=4/3*f*k,V=4/3*g*k,B=[m,h],D=[m+P*N,h-V*v],U=[u+P*Y,y-V*O],at=[u,y];if(D[0]=2*B[0]-D[0],D[1]=2*B[1]-D[1],l)return[D[0],D[1],U[0],U[1],at[0],at[1]].concat(C);C=[D[0],D[1],U[0],U[1],at[0],at[1]].concat(C);const tt=[];for(let L=0,I=C.length;L{const o=.3333333333333333,c=2/3;return[o*e+c*r,o*t+c*s,o*n+c*r,o*i+c*s,n,i]},zt=(e,t,r,s)=>{const n=Z([e,t],[r,s],.3333333333333333),i=Z([e,t],[r,s],2/3);return[n[0],n[1],i[0],i[1],r,s]},Yt=(e,t)=>{const[r]=e,s=e.slice(1).map(Number),[n,i]=s,{x1:o,y1:c,x:a,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=i,e):r==="A"?["C"].concat(ft(o,c,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(t.qx=n,t.qy=i,["C"].concat(Xt(o,c,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(zt(o,c,n,i)):r==="Z"?["C"].concat(zt(o,c,a,l)):e},gt=(e,t)=>{const[r]=e,s=r.toUpperCase(),n=r!==s,{x1:i,y1:o,x2:c,y2:a,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(s)||(t.qx=null,t.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",e[1]+(n?l:0),o];if(s==="V")return["L",i,e[1]+(n?m:0)];if(s==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const g=i*2-c,u=o*2-a;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(s==="T"){const g=i*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(s==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return e},rt={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},yt=e=>{const t={...rt},r=E(e);return j(r,(s,n,i,o)=>{t.x=i,t.y=o;const c=gt(s,t);let a=Yt(c,t);a[0]==="C"&&a.length>7&&(r.splice(n+1,0,["C"].concat(a.slice(7))),a=a.slice(0,7));const m=a.length;return t.x1=+a[m-2],t.y1=+a[m-1],t.x2=+a[m-4]||t.x1,t.y2=+a[m-3]||t.y1,a})},qt=(e,t)=>{const r=e.length;let{round:s}=J,n=e[0],i="";s=t==="off"||typeof t=="number"&&t>=0?t:typeof s=="number"&&s>=0?s:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=E(e);let r="M",s=0,n=0;const{max:i,min:o}=Math;let c=1/0,a=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,p=0,x=0,C=0,d=0,A=0;j(t,(q,$,v,N)=>{[r]=q;const O=r.toUpperCase(),k=O!==r?nt(q,$,v,N):q.slice(0),P=O==="V"?["L",v,k[1]]:O==="H"?["L",k[1],N]:k;if([r]=P,"TQ".includes(O)||(d=0,A=0),r==="M")[,s,n]=P,h=s,f=n,g=s,u=n;else if(r==="L")[h,f,g,u]=Rt(v,N,P[1],P[2]);else if(r==="A")[h,f,g,u]=Te(v,N,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(r==="S"){const V=y*2-x,B=p*2-C;[h,f,g,u]=Ot(v,N,V,B,P[1],P[2],P[3],P[4])}else r==="C"?[h,f,g,u]=Ot(v,N,P[1],P[2],P[3],P[4],P[5],P[6]):r==="T"?(d=y*2-d,A=p*2-A,[h,f,g,u]=Bt(v,N,d,A,P[1],P[2])):r==="Q"?(d=P[1],A=P[2],[h,f,g,u]=Bt(v,N,P[1],P[2],P[3],P[4])):r==="Z"&&([h,f,g,u]=Rt(v,N,s,n));c=o(h,c),a=o(f,a),l=i(g,l),m=i(u,m),[y,p]=r==="Z"?[s,n]:P.slice(-2),[x,C]=r==="C"?[P[3],P[4]]:r==="S"?[P[1],P[2]]:[y,p]});const M=l-c,S=m-a;return{width:M,height:S,x:c,y:a,x2:l,y2:m,cx:c+M/2,cy:a+S/2,cz:Math.max(M,S)+Math.min(M,S)/2}},X=e=>{const t=E(e);let r=0,s=0,n=0,i=0,o=0,c=0,a="M",l=0,m=0,h=0;return j(t,(f,g,u,y)=>{[a]=f;const p=a.toUpperCase(),C=p!==a?nt(f,g,u,y):f.slice(0),d=p==="V"?["L",u,C[1]]:p==="H"?["L",C[1],y]:C;if([a]=d,"TQ".includes(p)||(o=0,c=0),a==="M")[,l,m]=d;else if(a==="L")h+=mt(u,y,d[1],d[2]);else if(a==="A")h+=Dt(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(a==="S"){const A=r*2-n,M=s*2-i;h+=St(u,y,A,M,d[1],d[2],d[3],d[4])}else a==="C"?h+=St(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):a==="T"?(o=r*2-o,c=s*2-c,h+=Tt(u,y,o,c,d[1],d[2])):a==="Q"?(o=d[1],c=d[2],h+=Tt(u,y,d[1],d[2],d[3],d[4])):a==="Z"&&(h+=mt(u,y,l,m));[r,s]=a==="Z"?[l,m]:d.slice(-2),[n,i]=a==="C"?[d[3],d[4]]:a==="S"?[d[1],d[2]]:[r,s]}),h},dt=1e-5,st=e=>{const t=E(e),r={...rt};return j(t,(s,n,i,o)=>{r.x=i,r.y=o;const c=gt(s,r),a=c.length;return r.x1=+c[a-2],r.y1=+c[a-1],r.x2=+c[a-4]||r.x1,r.y2=+c[a-3]||r.y1,c})},it=(e,t)=>{const r=st(e);let s=!1,n=[],i="M",o=0,c=0,[a,l]=r[0].slice(1);const m=typeof t=="number";let h={x:a,y:l},f=0,g=h,u=0;return!m||t{if([i]=y,s=i==="M",n=s?n:[x,C].concat(y.slice(1)),s?([,a,l]=y,h={x:a,y:l},f=0):i==="L"?(h=It(n[0],n[1],n[2],n[3],t-u),f=mt(n[0],n[1],n[2],n[3])):i==="A"?(h=Se(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=Dt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):i==="C"?(h=Ie(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=St(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):i==="Q"?(h=je(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=Tt(n[0],n[1],n[2],n[3],n[4],n[5])):i==="Z"&&(n=[x,C,a,l],h={x:a,y:l},f=mt(n[0],n[1],n[2],n[3])),[o,c]=n.slice(-2),uu-dt?{x:o,y:c}:g)},$t=(e,t)=>{const r=E(e);let s=r.slice(0),n=X(s),i=s.length-1,o=0,c=0,a=r[0];if(i<=0||!t||!Number.isFinite(t))return{segment:a,index:0,length:c,lengthAtSegment:o};if(t>=n)return s=r.slice(0,-1),o=X(s),c=n-o,a=r[i],{segment:a,index:i,length:c,lengthAtSegment:o};const l=[];for(;i>0;)a=s[i],s=s.slice(0,-1),o=X(s),c=n-o,n=o,l.push({segment:a,index:i,length:c,lengthAtSegment:o}),i-=1;return l.find(({lengthAtSegment:m})=>m<=t)},bt=(e,t)=>{const r=E(e),s=st(r),n=X(s),i=A=>{const M=A.x-t.x,S=A.y-t.y;return M*M+S*S};let o=8,c,a={x:0,y:0},l=0,m=0,h=1/0;for(let A=0;A<=n;A+=o)c=it(s,A),l=i(c),l1e-6&&(u=m-o,f=it(s,u),p=i(f),y=m+o,g=it(s,y),x=i(g),u>=0&&pbt(e,t).closest,rn=(e,t,r,s,n,i,o,c)=>3*((c-t)*(r+n)-(o-e)*(s+i)+s*(e-n)-r*(t-i)+c*(n+e/3)-o*(i+t/3))/20,ee=e=>{let t=0,r=0,s=0;return yt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return s=rn(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),s}}).reduce((n,i)=>n+i,0)},Oe=e=>ee(yt(e))>=0,Be=(e,t)=>$t(e,t).segment,He=(e,t)=>bt(e,t).segment,At=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return K[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,ne=e=>At(e)&&e.every(([t])=>t===t.toUpperCase()),re=e=>ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),Fe=e=>re(e)&&e.every(([t])=>"MC".includes(t)),Ge=(e,t)=>{const{distance:r}=bt(e,t);return Math.abs(r)At(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),se=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Lt(e);for(W(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,sn=e=>{let{x1:t,y1:r,x2:s,y2:n}=e;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t,r],["L",s,n]]},on=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:t,cy:r,r:s}=e;return[t,r,s]=[t,r,s].map(n=>+n),[["M",t-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},cn=e=>{let{cx:t,cy:r}=e,s=e.rx||0,n=e.ry||s;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},ln=e=>{const t=+e.x||0,r=+e.y||0,s=+e.width,n=+e.height;let i=+(e.rx||0),o=+(e.ry||i);return i||o?(i*2>s&&(i-=(i*2-s)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+i,r],["h",s-i*2],["s",i,0,i,o],["v",n-o*2],["s",0,o,-i,o],["h",-s+i*2],["s",-i,0,-i,-o],["v",-n+o*2],["s",0,-o,i,-o]]):[["M",t,r],["h",s],["v",n],["H",t],["Z"]]},ie=e=>{const t=Object.keys(ot),r=_e(e),s=r?e.tagName:null;if(s&&[...t,"path"].every(a=>s!==a))throw TypeError(`${Q}: "${s}" is not SVGElement`);const n=r?s:e.type,i=ot[n],o={type:n};r?i.forEach(a=>{o[a]=e.getAttribute(a)}):Object.assign(o,e);let c=[];return n==="circle"?c=an(o):n==="ellipse"?c=cn(o):["polyline","polygon"].includes(n)?c=on(o):n==="rect"?c=ln(o):n==="line"?c=sn(o):["glyph","path"].includes(n)&&(c=E(r?e.getAttribute("d")||"":e.d||"")),At(c)&&c.length?c:!1},Je=(e,t,r)=>{const s=r||document,n=Object.keys(ot),i=_e(e),o=i?e.tagName:null;if(o==="path")throw TypeError(`${Q}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${Q}: "${o}" is not SVGElement`);const c=s.createElementNS("http://www.w3.org/2000/svg","path"),a=i?o:e.type,l=ot[a],m={type:a},h=J.round,f=ie(e),g=f&&f.length?qt(f,h):"";return i?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||c.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&c.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),se(g)?(c.setAttribute("d",g),t&&i&&(e.before(c,e),e.remove()),c):!1},oe=(e,t,r,s)=>{const[n]=e,{round:i}=J,o=i,c=t.slice(1),{x1:a,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=c.slice(-2),p=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(w(f,o)===w(u,o))return["V",y];if(w(g,o)===w(y,o))return["H",u]}else if(n==="C"){const[x,C]=c;if(r.x1=x,r.y1=C,"CS".includes(s)&&(w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o)||w(a,o)===w(m*2-f,o)&&w(l,o)===w(h*2-g,o)))return["S",c[2],c[3],c[4],c[5]]}else if(n==="Q"){const[x,C]=c;if(r.qx=x,r.qy=C,"QT".includes(s)&&w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o))return["T",c[2],c[3]]}return p},pt=(e,t)=>{const r=e.slice(1).map(s=>w(s,t));return[e[0]].concat(r)},ae=(e,t)=>{const r=ht(e),s=typeof t=="number"&&t>=0?t:2,n={...rt},i=[];let o="M",c="Z";return j(r,(a,l,m,h)=>{n.x=m,n.y=h;const f=gt(a,n);let g=a;if([o]=a,i[l]=o,l){c=i[l-1];const y=oe(a,f,n,c),p=pt(y,s),x=p.join(""),C=vt(y,l,m,h),d=pt(C,s),A=d.join("");g=x.length{const t=ht(e),r=st(t),s=t.length,n=t[s-1][0]==="Z",i=j(t,(o,c)=>{const a=r[c],l=c&&t[c-1],m=l&&l[0],h=t[c+1],f=h&&h[0],[g]=o,[u,y]=r[c?c-1:s-1].slice(-2);let p=o;switch(g){case"M":p=n?["Z"]:[g,u,y];break;case"A":p=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?p=["S",o[1],o[2],u,y]:p=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?p=["C",a[3],a[4],a[1],a[2],u,y]:p=[g,a[1],a[2],u,y];break;case"Q":h&&f==="T"?p=["T",u,y]:p=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?p=["Q",a[1],a[2],u,y]:p=[g,u,y];break;case"Z":p=["M",u,y];break;case"H":p=[g,u];break;case"V":p=[g,y];break;default:p=[g].concat(o.slice(1,-2),u,y)}return p});return n?i.reverse():[i[0]].concat(i.slice(1).reverse())},ce=e=>{const t=[];let r,s=-1,n=0,i=0,o=0,c=0;const a={...rt};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(s+=1,[n,i]=u,n+=g?a.x:0,i+=g?a.y:0,o=n,c=i,r=[g?[h,o,c]:l]):(h==="Z"?(n=o,i=c):h==="H"?([,n]=l,n+=g?a.x:0):h==="V"?([,i]=l,i+=g?a.y:0):([n,i]=l.slice(-2),n+=g?a.x:0,i+=g?a.y:0),r.push(l)),a.x=n,a.y=i,t[s]=r}),t},le=e=>{let t=new T;const{origin:r}=e,[s,n]=r,{translate:i}=e,{rotate:o}=e,{skew:c}=e,{scale:a}=e;return Array.isArray(i)&&i.length>=2&&i.every(l=>!Number.isNaN(+l))&&i.some(l=>l!==0)?t=t.translate(...i):typeof i=="number"&&!Number.isNaN(i)&&(t=t.translate(i)),(o||c||a)&&(t=t.translate(s,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(c)&&c.length===2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==0)?(t=c[0]?t.skewX(c[0]):t,t=c[1]?t.skewY(c[1]):t):typeof c=="number"&&!Number.isNaN(c)&&(t=t.skewX(c)),Array.isArray(a)&&a.length>=2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==1)?t=t.scale(...a):typeof a=="number"&&!Number.isNaN(a)&&(t=t.scale(a)),t=t.translate(-s,-n)),t},mn=(e,t)=>{let r=T.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},kt=(e,t,r)=>{const[s,n,i]=r,[o,c,a]=mn(e,[t[0],t[1],0,1]),l=o-s,m=c-n,h=a-i;return[l*(Math.abs(i)/Math.abs(h)||1)+s,m*(Math.abs(i)/Math.abs(h)||1)+n]},me=(e,t)=>{let r=0,s=0,n=0,i=0,o=0,c=0,a="M";const l=E(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:J.origin});const h=t.origin,f=le(t);return f.isIdentity?l.slice(0):j(l,(g,u,y,p)=>{[a]=g;const x=a.toUpperCase(),d=x!==a?nt(g,u,y,p):g.slice(0);let A=x==="A"?["C"].concat(ft(y,p,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):x==="V"?["L",y,d[1]]:x==="H"?["L",d[1],p]:d;a=A[0];const M=a==="C"&&A.length>7,S=M?A.slice(0,7):A.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(A.slice(7))),A=S),a==="L")[n,i]=kt(f,[A[1],A[2]],h),r!==n&&s!==i?A=["L",n,i]:s===i?A=["H",n]:r===n&&(A=["V",i]);else for(o=1,c=A.length;o{const t=e.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},We=(e,t)=>{let{round:r}=J;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):j(e,s=>pt(s,r))},Xe=(e,t=.5)=>{const r=t,s=e.slice(0,2),n=e.slice(2,4),i=e.slice(4,6),o=e.slice(6,8),c=Z(s,n,r),a=Z(n,i,r),l=Z(i,o,r),m=Z(c,a,r),h=Z(a,l,r),f=Z(m,h,r);return[["C",c[0],c[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class un{constructor(t,r){const s=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${Q}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=E(t);const{round:i,origin:o}=s;let c;Number.isInteger(i)||i==="off"?c=i:c=J.round;let a=J.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);a=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=c,this.origin=a,this}get bbox(){return te(this.segments)}get length(){return X(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return it(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=ht(t),this}toRelative(){const{segments:t}=this;return this.segments=Wt(t),this}toCurve(){const{segments:t}=this;return this.segments=yt(t),this}reverse(t){const{segments:r}=this,s=ce(r),n=s.length>1?s:!1,i=n?n.map((c,a)=>t?a?xt(c):c.slice(0):xt(c)):r.slice(0);let o=[];return n?o=i.flat(1):o=t?r:xt(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=st(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=ae(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(a=>a in t))return this;const{segments:r,origin:[s,n,i]}=this,o={};for(const[a,l]of Object.entries(t))a==="skew"&&Array.isArray(l)||(a==="rotate"||a==="translate"||a==="origin"||a==="scale")&&Array.isArray(l)?o[a]=l.map(Number):a!=="origin"&&typeof Number(l)=="number"&&(o[a]=Number(l));const{origin:c}=o;if(Array.isArray(c)&&c.length>=2){const[a,l,m]=c.map(Number);o.origin=[Number.isNaN(a)?s:a,Number.isNaN(l)?n:l,m||i]}else o.origin=[s,n,i];return this.segments=me(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return qt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return T}static get arcTools(){return Ne}static get bezierTools(){return ke}static get cubicTools(){return Re}static get lineTools(){return Pe}static get polygonTools(){return Qe}static get quadTools(){return De}static get pathToAbsolute(){return ht}static get pathToRelative(){return Wt}static get pathToCurve(){return yt}static get pathToString(){return qt}static get distanceSquareRoot(){return lt}static get midPoint(){return Z}static get rotateVector(){return et}static get roundTo(){return w}static get parsePathString(){return E}static get finalizeSegment(){return Nt}static get invalidPathValue(){return G}static get isArcCommand(){return Jt}static get isDigit(){return F}static get isDigitStart(){return _t}static get isMoveCommand(){return Kt}static get isPathCommand(){return Ut}static get isSpace(){return Gt}static get paramsCount(){return K}static get paramsParser(){return rt}static get pathParser(){return Lt}static get scanFlag(){return Ht}static get scanParam(){return Ft}static get scanSegment(){return wt}static get skipSpaces(){return W}static get distanceEpsilon(){return dt}static get getClosestPoint(){return Ze}static get getDrawDirection(){return Oe}static get getPathArea(){return ee}static get getPathBBox(){return te}static get getPointAtLength(){return it}static get getPropertiesAtLength(){return $t}static get getPropertiesAtPoint(){return bt}static get getSegmentAtLength(){return Be}static get getSegmentOfPoint(){return He}static get getTotalLength(){return X}static get isAbsoluteArray(){return ne}static get isCurveArray(){return Fe}static get isNormalizedArray(){return re}static get isPathArray(){return At}static get isPointInStroke(){return Ge}static get isRelativeArray(){return Ue}static get isValidPath(){return se}static get shapeParams(){return ot}static get shapeToPath(){return Je}static get shapeToPathArray(){return ie}static get absolutizeSegment(){return nt}static get arcToCubic(){return ft}static get getSVGMatrix(){return le}static get iterate(){return j}static get lineToCubic(){return zt}static get normalizePath(){return st}static get normalizeSegment(){return gt}static get optimizePath(){return ae}static get projection2d(){return kt}static get quadToCubic(){return Xt}static get relativizeSegment(){return vt}static get reverseCurve(){return Ke}static get reversePath(){return xt}static get roundPath(){return We}static get roundSegment(){return pt}static get segmentToCubic(){return Yt}static get shortenSegment(){return oe}static get splitCubic(){return Xe}static get splitPath(){return ce}static get transformPath(){return me}}return b.CSSMatrix=T,b.absolutizeSegment=nt,b.arcToCubic=ft,b.arcTools=Ne,b.bezierTools=ke,b.cubicTools=Re,b.default=un,b.distanceEpsilon=dt,b.distanceSquareRoot=lt,b.finalizeSegment=Nt,b.getClosestPoint=Ze,b.getDrawDirection=Oe,b.getPathArea=ee,b.getPathBBox=te,b.getPointAtLength=it,b.getPropertiesAtLength=$t,b.getPropertiesAtPoint=bt,b.getSVGMatrix=le,b.getSegmentAtLength=Be,b.getSegmentOfPoint=He,b.getTotalLength=X,b.invalidPathValue=G,b.isAbsoluteArray=ne,b.isArcCommand=Jt,b.isCurveArray=Fe,b.isDigit=F,b.isDigitStart=_t,b.isMoveCommand=Kt,b.isNormalizedArray=re,b.isPathArray=At,b.isPathCommand=Ut,b.isPointInStroke=Ge,b.isRelativeArray=Ue,b.isSpace=Gt,b.isValidPath=se,b.iterate=j,b.lineToCubic=zt,b.lineTools=Pe,b.midPoint=Z,b.normalizePath=st,b.normalizeSegment=gt,b.optimizePath=ae,b.paramsCount=K,b.paramsParser=rt,b.parsePathString=E,b.pathParser=Lt,b.pathToAbsolute=ht,b.pathToCurve=yt,b.pathToRelative=Wt,b.pathToString=qt,b.polygonTools=Qe,b.projection2d=kt,b.quadToCubic=Xt,b.quadTools=De,b.relativizeSegment=vt,b.reverseCurve=Ke,b.reversePath=xt,b.rotateVector=et,b.roundPath=We,b.roundSegment=pt,b.roundTo=w,b.scanFlag=Ht,b.scanParam=Ft,b.scanSegment=wt,b.segmentToCubic=Yt,b.shapeParams=ot,b.shapeToPath=Je,b.shapeToPathArray=ie,b.shortenSegment=oe,b.skipSpaces=W,b.splitCubic=Xe,b.splitPath=ce,b.transformPath=me,Object.defineProperties(b,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),b}({}); //# sourceMappingURL=svg-path-commander.js.map diff --git a/dist/svg-path-commander.js.map b/dist/svg-path-commander.js.map index 20e9acd..6739cf9 100644 --- a/dist/svg-path-commander.js.map +++ b/dist/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport * as arcTools from \"./math/arcTools\";\nimport * as bezierTools from \"./math/bezier\";\nimport * as cubicTools from \"./math/cubicTools\";\nimport * as lineTools from \"./math/lineTools\";\nimport * as quadTools from \"./math/quadTools\";\nimport * as polygonTools from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file diff --git a/dist/svg-path-commander.mjs b/dist/svg-path-commander.mjs index b6c335e..a3bd40a 100644 --- a/dist/svg-path-commander.mjs +++ b/dist/svg-path-commander.mjs @@ -1,2 +1,2 @@ -var $t=Object.defineProperty;var he=(t,e)=>{for(var n in e)$t(t,n,{get:e[n],enumerable:!0})};import cn from"@thednp/dommatrix";var at={};he(at,{angleBetween:()=>tt,arcLength:()=>rt,arcPoint:()=>se,getArcBBox:()=>ot,getArcLength:()=>Ce,getArcProps:()=>Re,getPointAtArcLength:()=>nt});var et={};he(et,{getLineBBox:()=>ze,getLineLength:()=>ae,getPointAtLineLength:()=>Ae});var jt=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=jt;var Bt=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),oe=Bt;var ae=(t,e,n,o)=>oe([t,e],[n,o]),Ae=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=oe([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},ze=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]};var rt=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},se=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),c=n*i(s),l=o*a(s);return[t+m*c-u*l,e+u*c+m*l]},tt=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},Re=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:c,cos:l,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,b={x:l(S)*A+c(S)*y,y:-c(S)*A+l(S)*y},d=b.x**2/p**2+b.y**2/h**2;d>1&&(p*=f(d),h*=f(d));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,R=p**2*b.y**2+h**2*b.x**2,k=C/R;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},$={x:l(S)*v.x-c(S)*v.y+(t+i)/2,y:c(S)*v.x+l(S)*v.y+(e+m)/2},re={x:(b.x-v.x)/p,y:(b.y-v.y)/h},Q=tt({x:1,y:0},re),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},q=tt(re,x);!a&&q>0?q-=2*g:a&&q<0&&(q+=2*g),q%=2*g;let j=Q+q;return{center:$,startAngle:Q,endAngle:j,rx:p,ry:h}},Ce=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:c,startAngle:l,endAngle:f}=Re(t,e,n,o,r,s,a,i,m);return rt(u,c,f-l)},nt=(t,e,n,o,r,s,a,i,m,u)=>{let c={x:t,y:e},{center:l,rx:f,ry:g,startAngle:p,endAngle:h}=Re(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let P=rt(f,g,h-p);if(u<=0)c={x:t,y:e};else if(u>=P)c={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return Ae(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,b=h-p,C=(r%360+360)%360*(S/180),R=p+b*(u/P),k=f*A(R),w=g*y(R);c={x:A(C)*k-y(C)*w+l.x,y:y(C)*k+A(C)*w+l.y}}}return c},ot=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:c,ry:l,startAngle:f,endAngle:g}=Re(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:P,tan:S,atan2:A,PI:y}=Math,{x:b,y:d}=u,C=r*y/180,R=S(C),k=A(-l*R,c),w=k,v=k+y,$=A(l,c*R),re=$+y,Q=[i],x=[m],q=h(t,i),j=P(t,i),O=h(e,m),F=P(e,m),ge=g-p*1e-5,ne=se(b,d,c,l,C,ge),N=g-p*.99999,D=se(b,d,c,l,C,N);if(ne[0]>j||D[0]>j){let z=se(b,d,c,l,C,w);Q.push(z[0]),x.push(z[1])}if(ne[0]F||D[1]>F){let z=se(b,d,c,l,C,$);Q.push(z[0]),x.push(z[1])}return q=h.apply([],Q),O=h.apply([],x),j=P.apply([],Q),F=P.apply([],x),[q,O,j,F]};var mt={};he(mt,{CBEZIER_MINMAX_EPSILON:()=>Mt,Cvalues:()=>xt,Tvalues:()=>st,bezierLength:()=>Tt,calculateBezier:()=>Ct,computeBezier:()=>At,deriveBezier:()=>St,getBezierLength:()=>me,minmaxC:()=>Ve,minmaxQ:()=>Te});var st=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],xt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],St=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,c=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,c=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+c*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+c*r[3].y,t:e}},Ct=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},Tt=t=>{let n=st.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oAt(n[0],o))},Mt=1e-8,Te=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&c<1){let f=t*(1-c)*(1-c)*(1-c)+e*3*(1-c)*(1-c)*c+n*3*(1-c)*c*c+o*c*c*c;fm&&(m=f)}}return[i,m]};var ut={};he(ut,{getCubicBBox:()=>ke,getCubicLength:()=>be,getPointAtCubicLength:()=>it,getPointAtCubicSegmentLength:()=>Lt});var Lt=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},be=(t,e,n,o,r,s,a,i)=>me([t,e,n,o,r,s,a,i]),it=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",c={x:t,y:e};if(u){let l=me([t,e,n,o,r,s,a,i]);m<=0||(m>=l?c={x:a,y:i}:c=Lt([t,e,n,o,r,s,a,i],m/l))}return c},ke=(t,e,n,o,r,s,a,i)=>{let m=Ve([t,n,r,a]),u=Ve([e,o,s,i]);return[m[0],u[0],m[1],u[1]]};var lt={};he(lt,{getPointAtQuadLength:()=>ct,getPointAtQuadSegmentLength:()=>vt,getQuadBBox:()=>Qe,getQuadLength:()=>ye});var vt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},ye=(t,e,n,o,r,s)=>me([t,e,n,o,r,s]),ct=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=me([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=vt([t,e,n,o,r,s],a/u))}return m},Qe=(t,e,n,o,r,s)=>{let a=Te([t,n,r]),i=Te([e,o,s]);return[a[0],i[0],a[1],i[1]]};var pt={};he(pt,{polygonArea:()=>Ht,polygonLength:()=>Zt});var Ht=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+oe(t[o-1],n):0,0);var Gt=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ie=Gt;var _t=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=_t;var Ut={origin:[0,0,0],round:4},I=Ut;var Ft={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=Ft;var Kt=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},Me=Kt;var Jt="SVGPathCommander Error",V=Jt;var Wt=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${V}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},qe=Wt;var Xt=t=>t>=48&&t<=57,B=Xt;var Yt="Invalid path value",H=Yt;var er=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${V}: ${H} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!B(u)&&u!==46){t.err=`${V}: ${H} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Ee=tr;var rr=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Oe=nr;var or=t=>B(t)||t===43||t===45||t===46,Ie=or;var ar=t=>(t|32)===97,$e=ar;var sr=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},je=sr;var mr=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!Oe(s)){t.err=`${V}: ${H} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!je(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${V}: ${H} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){Me(t);return}for(;;){for(let m=a;m>0;m-=1){if($e(s)&&(m===3||m===4)?qe(t):De(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!Ie(n.charCodeAt(t.index)))break}Me(t)},Pe=mr;var K=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var ir=t=>{if(typeof t!="string")return t.slice(0);let e=new K(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,c=0,l=0;for(let f=0;f{let e=L(t);return T(e,_)},ue=lr;var pr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,de)},ft=fr;var Nt=(t,e,n,o,r,s,a,i,m,u)=>{let c=t,l=e,f=n,g=o,p=i,h=m,P=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,b,d,C,R;if(u)[b,d,C,R]=u;else{y=ie(c,l,-S),c=y.x,l=y.y,y=ie(p,h,-S),p=y.x,h=y.y;let N=(c-p)/2,D=(l-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let Xe=f*f,Ye=g*g,dt=(s===a?-1:1)*Math.sqrt(Math.abs((Xe*Ye-Xe*D*D-Ye*N*N)/(Xe*D*D+Ye*N*N)));C=dt*f*D/g+(c+p)/2,R=dt*-g*N/f+(l+h)/2,b=Math.asin(((l-R)/g*10**9>>0)/10**9),d=Math.asin(((h-R)/g*10**9>>0)/10**9),b=cd&&(b-=Math.PI*2),!a&&d>b&&(d-=Math.PI*2)}let k=d-b;if(Math.abs(k)>P){let N=d,D=p,z=h;d=b+P*(a&&d>b?1:-1),p=C+f*Math.cos(d),h=R+g*Math.sin(d),A=Nt(p,h,f,g,r,0,a,D,z,[d,N,C,R])}k=d-b;let w=Math.cos(b),v=Math.sin(b),$=Math.cos(d),re=Math.sin(d),Q=Math.tan(k/4),x=4/3*f*Q,q=4/3*g*Q,j=[c,l],O=[c+x*v,l-q*w],F=[p+x*re,h-q*$],ge=[p,h];if(O[0]=2*j[0]-O[0],O[1]=2*j[1]-O[1],u)return[O[0],O[1],F[0],F[1],ge[0],ge[1]].concat(A);A=[O[0],O[1],F[0],F[1],ge[0],ge[1]].concat(A);let ne=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},Be=gr;var hr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Le=hr;var br=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(xe(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(Be(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Le(a,i,r,s)):n==="Z"?["C"].concat(Le(a,i,m,u)):t},He=br;var yr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:c}=e,l=t.slice(1),f=l.map((g,p)=>g+(r?p%2?c:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=l.slice(0,-2).concat(l[5]+(r?u:0),l[6]+(r?c:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?c:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},X=yr;var Pr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=Pr;var dr=t=>{let e={...U},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=X(o,e),m=He(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let c=m.length;return e.x1=+m[c-2],e.y1=+m[c-1],e.x2=+m[c-4]||e.x1,e.y2=+m[c-3]||e.y1,m})},ce=dr;var xr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,c=-1/0,l=0,f=0,g=0,p=0,h=0,P=0,S=0,A=0,y=0,b=0;T(e,(R,k,w,v)=>{[n]=R;let $=n.toUpperCase(),Q=$!==n?_(R,k,w,v):R.slice(0),x=$==="V"?["L",w,Q[1]]:$==="H"?["L",Q[1],v]:Q;[n]=x,"TQ".includes($)||(y=0,b=0);if(n==="M")[,o,r]=x,l=o,f=r,g=o,p=r;else if(n==="L")[l,f,g,p]=ze(w,v,x[1],x[2]);else if(n==="A")[l,f,g,p]=ot(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let q=h*2-S,j=P*2-A;[l,f,g,p]=ke(w,v,q,j,x[1],x[2],x[3],x[4])}else n==="C"?[l,f,g,p]=ke(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(y=h*2-y,b=P*2-b,[l,f,g,p]=Qe(w,v,y,b,x[1],x[2])):n==="Q"?(y=x[1],b=x[2],[l,f,g,p]=Qe(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([l,f,g,p]=ze(w,v,o,r));i=a(l,i),m=a(f,m),u=s(g,u),c=s(p,c),[h,P]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,P]});let d=u-i,C=c-m;return{width:d,height:C,x:i,y:m,x2:u,y2:c,cx:i+d/2,cy:m+C/2,cz:Math.max(d,C)+Math.min(d,C)/2}},gt=Sr;var Ar=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,c=0,l=0;return T(e,(f,g,p,h)=>{[m]=f;let P=m.toUpperCase(),A=P!==m?_(f,g,p,h):f.slice(0),y=P==="V"?["L",p,A[1]]:P==="H"?["L",A[1],h]:A;[m]=y,"TQ".includes(P)||(a=0,i=0);if(m==="M")[,u,c]=y;else if(m==="L")l+=ae(p,h,y[1],y[2]);else if(m==="A")l+=Ce(p,h,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let b=n*2-r,d=o*2-s;l+=be(p,h,b,d,y[1],y[2],y[3],y[4])}else m==="C"?l+=be(p,h,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,l+=ye(p,h,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],l+=ye(p,h,y[1],y[2],y[3],y[4])):m==="Z"&&(l+=ae(p,h,u,c));[n,o]=m==="Z"?[u,c]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),l},J=Ar;var le=1e-5;var Cr=t=>{let e=L(t),n={...U};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=X(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},W=Cr;var Tr=(t,e)=>{let n=W(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),c=typeof e=="number",l={x:m,y:u},f=0,g=l,p=0;return!c||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,l={x:m,y:u},f=0):s==="L"?(l=Ae(r[0],r[1],r[2],r[3],e-p),f=ae(r[0],r[1],r[2],r[3])):s==="A"?(l=nt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=Ce(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(l=it(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=be(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(l=ct(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=ye(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],l={x:m,y:u},f=ae(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-le?{x:a,y:i}:g)},pe=Tr;var Mr=(t,e)=>{let n=L(t),o=n.slice(0),r=J(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=J(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=J(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:c})=>c<=e)},Se=Mr;var Lr=(t,e)=>{let n=L(t),o=W(n),r=J(o),s=b=>{let d=b.x-e.x,C=b.y-e.y;return d*d+C*C},a=8,i,m={x:0,y:0},u=0,c=0,l=1/0;for(let b=0;b<=r;b+=a)i=pe(o,b),u=s(i),u1e-6&&(p=c-a,f=pe(o,p),P=s(f),h=c+a,g=pe(o,h),S=s(g),p>=0&&PY(t,e).closest,wt=vr;var Nr=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,wr=t=>{let e=0,n=0,o=0;return ce(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=Nr(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Ze=wr;var zr=t=>Ze(ce(t))>=0,zt=zr;var Rr=(t,e)=>Se(t,e).segment,Rt=Rr;var Vr=(t,e)=>Y(t,e).segment,Vt=Vr;var kr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ee=kr;var Qr=t=>ee(t)&&t.every(([e])=>e===e.toUpperCase()),Ge=Qr;var qr=t=>Ge(t)&&t.every(([e])=>"ACLMQZ".includes(e)),_e=qr;var Dr=t=>_e(t)&&t.every(([e])=>"MC".includes(e)),kt=Dr;var Er=(t,e)=>{let{distance:n}=Y(t,e);return Math.abs(n)ee(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),qt=Or;var Ir=t=>{if(typeof t!="string"||!t.length)return!1;let e=new K(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Fe=jr;var Br=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},Hr=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},Gr=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},_r=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},Ur=t=>{let e=Object.keys(te),n=Fe(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${V}: "${o}" is not SVGElement`);let r=n?o:t.type,s=te[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=Zr(a):r==="ellipse"?i=Gr(a):["polyline","polygon"].includes(r)?i=Hr(a):r==="rect"?i=_r(a):r==="line"?i=Br(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),ee(i)&&i.length?i:!1},Ke=Ur;var Fr=(t,e,n)=>{let o=n||document,r=Object.keys(te),s=Fe(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${V}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${V}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=te[m],c={type:m},l=I.round,f=Ke(t),g=f&&f.length?ve(f,l):"";return s?(u.forEach(p=>{c[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(c,t),Object.keys(c).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),c[p])})),Ue(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},Dt=Fr;var Kr=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:c,y2:l,x:f,y:g}=n,[p,h]=i.slice(-2),P=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a)||M(m,a)===M(c*2-f,a)&&M(u,a)===M(l*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a))return["T",i[2],i[3]]}return P},Je=Kr;var Jr=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},fe=Jr;var Wr=(t,e)=>{let n=ue(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return T(n,(m,u,c,l)=>{r.x=c,r.y=l;let f=X(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=Je(m,f,r,i),P=fe(h,o),S=P.join(""),A=de(h,u,c,l),y=fe(A,o),b=y.join("");g=S.length{let e=ue(t),n=W(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],c=u&&u[0],l=e[i+1],f=l&&l[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),P=a;switch(g){case"M":P=r?["Z"]:[g,p,h];break;case"A":P=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":l&&f==="S"?P=["S",a[1],a[2],p,h]:P=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":c&&"CS".includes(c)&&(!l||f!=="S")?P=["C",m[3],m[4],m[1],m[2],p,h]:P=[g,m[1],m[2],p,h];break;case"Q":l&&f==="T"?P=["T",p,h]:P=[g,a[1],a[2],p,h];break;case"T":c&&"QT".includes(c)&&(!l||f!=="T")?P=["Q",m[1],m[2],p,h]:P=[g,p,h];break;case"Z":P=["M",p,h];break;case"H":P=[g,p];break;case"V":P=[g,h];break;default:P=[g].concat(a.slice(1,-2),p,h)}return P});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Ne=Xr;var Yr=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[c]=u,l=c.toUpperCase(),f=c.toLowerCase(),g=c===f,p=u.slice(1);l==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[l,a,i]:u]):(l==="Z"?(r=a,s=i):l==="H"?([,r]=u,r+=g?m.x:0):l==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},bt=Yr;import en from"@thednp/dommatrix";var tn=t=>{let e=new en,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},We=tn;import rn from"@thednp/dommatrix";var nn=(t,e)=>{let n=rn.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},on=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=nn(t,[e[0],e[1],0,1]),u=a-o,c=i-r,l=m-s;return[u*(Math.abs(s)/Math.abs(l)||1)+o,c*(Math.abs(s)/Math.abs(l)||1)+r]},we=on;var an=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),c=e&&Object.keys(e);if(!e||c&&!c.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let l=e.origin,f=We(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,P)=>{[m]=g;let S=m.toUpperCase(),y=S!==m?_(g,p,h,P):g.slice(0),b=S==="A"?["C"].concat(xe(h,P,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",h,y[1]]:S==="H"?["L",y[1],P]:y;m=b[0];let d=m==="C"&&b.length>7,C=d?b.slice(0,7):b.slice(0);if(d&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=we(f,[b[1],b[2]],l);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},Et=sn;var mn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>fe(o,n))},Ot=mn;var un=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),c=E(i,m,n),l=E(m,u,n),f=E(c,l,n);return[["C",i[0],i[1],c[0],c[1],f[0],f[1]],["C",l[0],l[1],u[0],u[1],a[0],a[1]]]},It=un;var Pt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${V}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,c,l]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(c)?0:c,Number.isNaN(l)?0:l]}return this.round=i,this.origin=m,this}get bbox(){return gt(this.segments)}get length(){return J(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return pe(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=ue(e),this}toRelative(){let{segments:e}=this;return this.segments=ft(e),this}toCurve(){let{segments:e}=this;return this.segments=ce(e),this}reverse(e){let{segments:n}=this,o=bt(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Ne(i):i.slice(0):Ne(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Ne(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=W(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=ht(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,c]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,c||s]}else a.origin=[o,r,s];return this.segments=yt(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return ve(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return cn}static get arcTools(){return at}static get bezierTools(){return mt}static get cubicTools(){return ut}static get lineTools(){return et}static get polygonTools(){return pt}static get quadTools(){return lt}static get pathToAbsolute(){return ue}static get pathToRelative(){return ft}static get pathToCurve(){return ce}static get pathToString(){return ve}static get distanceSquareRoot(){return oe}static get midPoint(){return E}static get rotateVector(){return ie}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return Me}static get invalidPathValue(){return H}static get isArcCommand(){return $e}static get isDigit(){return B}static get isDigitStart(){return Ie}static get isMoveCommand(){return je}static get isPathCommand(){return Oe}static get isSpace(){return Ee}static get paramsCount(){return Z}static get paramsParser(){return U}static get pathParser(){return K}static get scanFlag(){return qe}static get scanParam(){return De}static get scanSegment(){return Pe}static get skipSpaces(){return G}static get distanceEpsilon(){return le}static get getClosestPoint(){return wt}static get getDrawDirection(){return zt}static get getPathArea(){return Ze}static get getPathBBox(){return gt}static get getPointAtLength(){return pe}static get getPropertiesAtLength(){return Se}static get getPropertiesAtPoint(){return Y}static get getSegmentAtLength(){return Rt}static get getSegmentOfPoint(){return Vt}static get getTotalLength(){return J}static get isAbsoluteArray(){return Ge}static get isCurveArray(){return kt}static get isNormalizedArray(){return _e}static get isPathArray(){return ee}static get isPointInStroke(){return Qt}static get isRelativeArray(){return qt}static get isValidPath(){return Ue}static get shapeParams(){return te}static get shapeToPath(){return Dt}static get shapeToPathArray(){return Ke}static get absolutizeSegment(){return _}static get arcToCubic(){return xe}static get getSVGMatrix(){return We}static get iterate(){return T}static get lineToCubic(){return Le}static get normalizePath(){return W}static get normalizeSegment(){return X}static get optimizePath(){return ht}static get projection2d(){return we}static get quadToCubic(){return Be}static get relativizeSegment(){return de}static get reverseCurve(){return Et}static get reversePath(){return Ne}static get roundPath(){return Ot}static get roundSegment(){return fe}static get segmentToCubic(){return He}static get shortenSegment(){return Je}static get splitCubic(){return It}static get splitPath(){return bt}static get transformPath(){return yt}},li=Pt;export{cn as CSSMatrix,_ as absolutizeSegment,xe as arcToCubic,at as arcTools,mt as bezierTools,ut as cubicTools,li as default,le as distanceEpsilon,oe as distanceSquareRoot,Me as finalizeSegment,wt as getClosestPoint,zt as getDrawDirection,Ze as getPathArea,gt as getPathBBox,pe as getPointAtLength,Se as getPropertiesAtLength,Y as getPropertiesAtPoint,We as getSVGMatrix,Rt as getSegmentAtLength,Vt as getSegmentOfPoint,J as getTotalLength,H as invalidPathValue,Ge as isAbsoluteArray,$e as isArcCommand,kt as isCurveArray,B as isDigit,Ie as isDigitStart,je as isMoveCommand,_e as isNormalizedArray,ee as isPathArray,Oe as isPathCommand,Qt as isPointInStroke,qt as isRelativeArray,Ee as isSpace,Ue as isValidPath,T as iterate,Le as lineToCubic,et as lineTools,E as midPoint,W as normalizePath,X as normalizeSegment,ht as optimizePath,Z as paramsCount,U as paramsParser,L as parsePathString,K as pathParser,ue as pathToAbsolute,ce as pathToCurve,ft as pathToRelative,ve as pathToString,pt as polygonTools,we as projection2d,Be as quadToCubic,lt as quadTools,de as relativizeSegment,Et as reverseCurve,Ne as reversePath,ie as rotateVector,Ot as roundPath,fe as roundSegment,M as roundTo,qe as scanFlag,De as scanParam,Pe as scanSegment,He as segmentToCubic,te as shapeParams,Dt as shapeToPath,Ke as shapeToPathArray,Je as shortenSegment,G as skipSpaces,It as splitCubic,bt as splitPath,yt as transformPath}; +import mn from"@thednp/dommatrix";var It=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=It;var $t=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),oe=$t;var ae=(t,e,n,o)=>oe([t,e],[n,o]),Se=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=oe([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},we=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]},ft={getLineBBox:we,getLineLength:ae,getPointAtLineLength:Se};var et=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},se=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),c=n*i(s),l=o*a(s);return[t+m*c-u*l,e+u*c+m*l]},Ye=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},ze=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:c,cos:l,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,b={x:l(S)*A+c(S)*y,y:-c(S)*A+l(S)*y},d=b.x**2/p**2+b.y**2/h**2;d>1&&(p*=f(d),h*=f(d));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,R=p**2*b.y**2+h**2*b.x**2,k=C/R;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},$={x:l(S)*v.x-c(S)*v.y+(t+i)/2,y:c(S)*v.x+l(S)*v.y+(e+m)/2},re={x:(b.x-v.x)/p,y:(b.y-v.y)/h},q=Ye({x:1,y:0},re),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},Q=Ye(re,x);!a&&Q>0?Q-=2*g:a&&Q<0&&(Q+=2*g),Q%=2*g;let j=q+Q;return{center:$,startAngle:q,endAngle:j,rx:p,ry:h}},Ae=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:c,startAngle:l,endAngle:f}=ze(t,e,n,o,r,s,a,i,m);return et(u,c,f-l)},tt=(t,e,n,o,r,s,a,i,m,u)=>{let c={x:t,y:e},{center:l,rx:f,ry:g,startAngle:p,endAngle:h}=ze(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let P=et(f,g,h-p);if(u<=0)c={x:t,y:e};else if(u>=P)c={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return Se(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,b=h-p,C=(r%360+360)%360*(S/180),R=p+b*(u/P),k=f*A(R),w=g*y(R);c={x:A(C)*k-y(C)*w+l.x,y:y(C)*k+A(C)*w+l.y}}}return c},rt=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:c,ry:l,startAngle:f,endAngle:g}=ze(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:P,tan:S,atan2:A,PI:y}=Math,{x:b,y:d}=u,C=r*y/180,R=S(C),k=A(-l*R,c),w=k,v=k+y,$=A(l,c*R),re=$+y,q=[i],x=[m],Q=h(t,i),j=P(t,i),O=h(e,m),F=P(e,m),ge=g-p*1e-5,ne=se(b,d,c,l,C,ge),N=g-p*.99999,D=se(b,d,c,l,C,N);if(ne[0]>j||D[0]>j){let z=se(b,d,c,l,C,w);q.push(z[0]),x.push(z[1])}if(ne[0]F||D[1]>F){let z=se(b,d,c,l,C,$);q.push(z[0]),x.push(z[1])}return Q=h.apply([],q),O=h.apply([],x),j=P.apply([],q),F=P.apply([],x),[Q,O,j,F]},gt={angleBetween:Ye,arcLength:et,arcPoint:se,getArcBBox:rt,getArcLength:Ae,getArcProps:ze,getPointAtArcLength:tt};var nt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],ht=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],bt=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,c=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,c=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+c*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+c*r[3].y,t:e}},Pt=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},dt=t=>{let n=nt.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oyt(n[0],o))},xt=1e-8,Ce=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&c<1){let f=t*(1-c)*(1-c)*(1-c)+e*3*(1-c)*(1-c)*c+n*3*(1-c)*c*c+o*c*c*c;fm&&(m=f)}}return[i,m]},St={bezierLength:dt,calculateBezier:Pt,CBEZIER_MINMAX_EPSILON:xt,computeBezier:yt,Cvalues:ht,deriveBezier:bt,getBezierLength:me,minmaxC:Re,minmaxQ:Ce,Tvalues:nt};var At=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},he=(t,e,n,o,r,s,a,i)=>me([t,e,n,o,r,s,a,i]),ot=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",c={x:t,y:e};if(u){let l=me([t,e,n,o,r,s,a,i]);m<=0||(m>=l?c={x:a,y:i}:c=At([t,e,n,o,r,s,a,i],m/l))}return c},Ve=(t,e,n,o,r,s,a,i)=>{let m=Re([t,n,r,a]),u=Re([e,o,s,i]);return[m[0],u[0],m[1],u[1]]},Ct={getCubicBBox:Ve,getCubicLength:he,getPointAtCubicLength:ot,getPointAtCubicSegmentLength:At};var Tt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},be=(t,e,n,o,r,s)=>me([t,e,n,o,r,s]),at=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=me([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=Tt([t,e,n,o,r,s],a/u))}return m},ke=(t,e,n,o,r,s)=>{let a=Ce([t,n,r]),i=Ce([e,o,s]);return[a[0],i[0],a[1],i[1]]},Mt={getPointAtQuadLength:at,getPointAtQuadSegmentLength:Tt,getQuadBBox:ke,getQuadLength:be};var jt=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+oe(t[o-1],n):0,0),Lt={polygonArea:jt,polygonLength:Bt};var Ht=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ie=Ht;var Zt=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=Zt;var Gt={origin:[0,0,0],round:4},I=Gt;var _t={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=_t;var Ut=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},Te=Ut;var Ft="SVGPathCommander Error",V=Ft;var Kt=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${V}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},qe=Kt;var Jt=t=>t>=48&&t<=57,B=Jt;var Wt="Invalid path value",H=Wt;var Xt=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${V}: ${H} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!B(u)&&u!==46){t.err=`${V}: ${H} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),De=Yt;var er=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Ee=tr;var rr=t=>B(t)||t===43||t===45||t===46,Oe=rr;var nr=t=>(t|32)===97,Ie=nr;var or=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},$e=or;var ar=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!Ee(s)){t.err=`${V}: ${H} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!$e(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${V}: ${H} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){Te(t);return}for(;;){for(let m=a;m>0;m-=1){if(Ie(s)&&(m===3||m===4)?qe(t):Qe(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!Oe(n.charCodeAt(t.index)))break}Te(t)},ye=ar;var K=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var sr=t=>{if(typeof t!="string")return t.slice(0);let e=new K(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,c=0,l=0;for(let f=0;f{let e=L(t);return T(e,_)},ue=ur;var cr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,Pe)},st=lr;var vt=(t,e,n,o,r,s,a,i,m,u)=>{let c=t,l=e,f=n,g=o,p=i,h=m,P=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,b,d,C,R;if(u)[b,d,C,R]=u;else{y=ie(c,l,-S),c=y.x,l=y.y,y=ie(p,h,-S),p=y.x,h=y.y;let N=(c-p)/2,D=(l-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let We=f*f,Xe=g*g,pt=(s===a?-1:1)*Math.sqrt(Math.abs((We*Xe-We*D*D-Xe*N*N)/(We*D*D+Xe*N*N)));C=pt*f*D/g+(c+p)/2,R=pt*-g*N/f+(l+h)/2,b=Math.asin(((l-R)/g*10**9>>0)/10**9),d=Math.asin(((h-R)/g*10**9>>0)/10**9),b=cd&&(b-=Math.PI*2),!a&&d>b&&(d-=Math.PI*2)}let k=d-b;if(Math.abs(k)>P){let N=d,D=p,z=h;d=b+P*(a&&d>b?1:-1),p=C+f*Math.cos(d),h=R+g*Math.sin(d),A=vt(p,h,f,g,r,0,a,D,z,[d,N,C,R])}k=d-b;let w=Math.cos(b),v=Math.sin(b),$=Math.cos(d),re=Math.sin(d),q=Math.tan(k/4),x=4/3*f*q,Q=4/3*g*q,j=[c,l],O=[c+x*v,l-Q*w],F=[p+x*re,h-Q*$],ge=[p,h];if(O[0]=2*j[0]-O[0],O[1]=2*j[1]-O[1],u)return[O[0],O[1],F[0],F[1],ge[0],ge[1]].concat(A);A=[O[0],O[1],F[0],F[1],ge[0],ge[1]].concat(A);let ne=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},je=pr;var fr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Me=fr;var gr=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(de(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(je(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Me(a,i,r,s)):n==="Z"?["C"].concat(Me(a,i,m,u)):t},Be=gr;var hr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:c}=e,l=t.slice(1),f=l.map((g,p)=>g+(r?p%2?c:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=l.slice(0,-2).concat(l[5]+(r?u:0),l[6]+(r?c:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?c:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?c:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},X=hr;var br={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=br;var yr=t=>{let e={...U},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=X(o,e),m=Be(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let c=m.length;return e.x1=+m[c-2],e.y1=+m[c-1],e.x2=+m[c-4]||e.x1,e.y2=+m[c-3]||e.y1,m})},ce=yr;var Pr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,c=-1/0,l=0,f=0,g=0,p=0,h=0,P=0,S=0,A=0,y=0,b=0;T(e,(R,k,w,v)=>{[n]=R;let $=n.toUpperCase(),q=$!==n?_(R,k,w,v):R.slice(0),x=$==="V"?["L",w,q[1]]:$==="H"?["L",q[1],v]:q;[n]=x,"TQ".includes($)||(y=0,b=0);if(n==="M")[,o,r]=x,l=o,f=r,g=o,p=r;else if(n==="L")[l,f,g,p]=we(w,v,x[1],x[2]);else if(n==="A")[l,f,g,p]=rt(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let Q=h*2-S,j=P*2-A;[l,f,g,p]=Ve(w,v,Q,j,x[1],x[2],x[3],x[4])}else n==="C"?[l,f,g,p]=Ve(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(y=h*2-y,b=P*2-b,[l,f,g,p]=ke(w,v,y,b,x[1],x[2])):n==="Q"?(y=x[1],b=x[2],[l,f,g,p]=ke(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([l,f,g,p]=we(w,v,o,r));i=a(l,i),m=a(f,m),u=s(g,u),c=s(p,c),[h,P]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,P]});let d=u-i,C=c-m;return{width:d,height:C,x:i,y:m,x2:u,y2:c,cx:i+d/2,cy:m+C/2,cz:Math.max(d,C)+Math.min(d,C)/2}},mt=dr;var xr=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,c=0,l=0;return T(e,(f,g,p,h)=>{[m]=f;let P=m.toUpperCase(),A=P!==m?_(f,g,p,h):f.slice(0),y=P==="V"?["L",p,A[1]]:P==="H"?["L",A[1],h]:A;[m]=y,"TQ".includes(P)||(a=0,i=0);if(m==="M")[,u,c]=y;else if(m==="L")l+=ae(p,h,y[1],y[2]);else if(m==="A")l+=Ae(p,h,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let b=n*2-r,d=o*2-s;l+=he(p,h,b,d,y[1],y[2],y[3],y[4])}else m==="C"?l+=he(p,h,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,l+=be(p,h,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],l+=be(p,h,y[1],y[2],y[3],y[4])):m==="Z"&&(l+=ae(p,h,u,c));[n,o]=m==="Z"?[u,c]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),l},J=xr;var le=1e-5;var Sr=t=>{let e=L(t),n={...U};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=X(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},W=Sr;var Ar=(t,e)=>{let n=W(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),c=typeof e=="number",l={x:m,y:u},f=0,g=l,p=0;return!c||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,l={x:m,y:u},f=0):s==="L"?(l=Se(r[0],r[1],r[2],r[3],e-p),f=ae(r[0],r[1],r[2],r[3])):s==="A"?(l=tt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=Ae(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(l=ot(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=he(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(l=at(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=be(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],l={x:m,y:u},f=ae(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-le?{x:a,y:i}:g)},pe=Ar;var Cr=(t,e)=>{let n=L(t),o=n.slice(0),r=J(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=J(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=J(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:c})=>c<=e)},xe=Cr;var Tr=(t,e)=>{let n=L(t),o=W(n),r=J(o),s=b=>{let d=b.x-e.x,C=b.y-e.y;return d*d+C*C},a=8,i,m={x:0,y:0},u=0,c=0,l=1/0;for(let b=0;b<=r;b+=a)i=pe(o,b),u=s(i),u1e-6&&(p=c-a,f=pe(o,p),P=s(f),h=c+a,g=pe(o,h),S=s(g),p>=0&&PY(t,e).closest,Nt=Mr;var Lr=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,vr=t=>{let e=0,n=0,o=0;return ce(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=Lr(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},He=vr;var Nr=t=>He(ce(t))>=0,wt=Nr;var wr=(t,e)=>xe(t,e).segment,zt=wr;var zr=(t,e)=>Y(t,e).segment,Rt=zr;var Rr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ee=Rr;var Vr=t=>ee(t)&&t.every(([e])=>e===e.toUpperCase()),Ze=Vr;var kr=t=>Ze(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Ge=kr;var qr=t=>Ge(t)&&t.every(([e])=>"MC".includes(e)),Vt=qr;var Qr=(t,e)=>{let{distance:n}=Y(t,e);return Math.abs(n)ee(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),qt=Dr;var Er=t=>{if(typeof t!="string"||!t.length)return!1;let e=new K(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Ue=Ir;var $r=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},jr=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},Hr=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},Zr=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},Gr=t=>{let e=Object.keys(te),n=Ue(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${V}: "${o}" is not SVGElement`);let r=n?o:t.type,s=te[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=Br(a):r==="ellipse"?i=Hr(a):["polyline","polygon"].includes(r)?i=jr(a):r==="rect"?i=Zr(a):r==="line"?i=$r(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),ee(i)&&i.length?i:!1},Fe=Gr;var _r=(t,e,n)=>{let o=n||document,r=Object.keys(te),s=Ue(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${V}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${V}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=te[m],c={type:m},l=I.round,f=Fe(t),g=f&&f.length?Le(f,l):"";return s?(u.forEach(p=>{c[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(c,t),Object.keys(c).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),c[p])})),_e(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},Qt=_r;var Ur=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:c,y2:l,x:f,y:g}=n,[p,h]=i.slice(-2),P=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a)||M(m,a)===M(c*2-f,a)&&M(u,a)===M(l*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-c,a)&&M(A,a)===M(u*2-l,a))return["T",i[2],i[3]]}return P},Ke=Ur;var Fr=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},fe=Fr;var Kr=(t,e)=>{let n=ue(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return T(n,(m,u,c,l)=>{r.x=c,r.y=l;let f=X(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=Ke(m,f,r,i),P=fe(h,o),S=P.join(""),A=Pe(h,u,c,l),y=fe(A,o),b=y.join("");g=S.length{let e=ue(t),n=W(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],c=u&&u[0],l=e[i+1],f=l&&l[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),P=a;switch(g){case"M":P=r?["Z"]:[g,p,h];break;case"A":P=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":l&&f==="S"?P=["S",a[1],a[2],p,h]:P=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":c&&"CS".includes(c)&&(!l||f!=="S")?P=["C",m[3],m[4],m[1],m[2],p,h]:P=[g,m[1],m[2],p,h];break;case"Q":l&&f==="T"?P=["T",p,h]:P=[g,a[1],a[2],p,h];break;case"T":c&&"QT".includes(c)&&(!l||f!=="T")?P=["Q",m[1],m[2],p,h]:P=[g,p,h];break;case"Z":P=["M",p,h];break;case"H":P=[g,p];break;case"V":P=[g,h];break;default:P=[g].concat(a.slice(1,-2),p,h)}return P});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},ve=Jr;var Wr=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[c]=u,l=c.toUpperCase(),f=c.toLowerCase(),g=c===f,p=u.slice(1);l==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[l,a,i]:u]):(l==="Z"?(r=a,s=i):l==="H"?([,r]=u,r+=g?m.x:0):l==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},ut=Wr;import Xr from"@thednp/dommatrix";var Yr=t=>{let e=new Xr,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},Je=Yr;import en from"@thednp/dommatrix";var tn=(t,e)=>{let n=en.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},rn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=tn(t,[e[0],e[1],0,1]),u=a-o,c=i-r,l=m-s;return[u*(Math.abs(s)/Math.abs(l)||1)+o,c*(Math.abs(s)/Math.abs(l)||1)+r]},Ne=rn;var nn=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),c=e&&Object.keys(e);if(!e||c&&!c.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let l=e.origin,f=Je(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,P)=>{[m]=g;let S=m.toUpperCase(),y=S!==m?_(g,p,h,P):g.slice(0),b=S==="A"?["C"].concat(de(h,P,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",h,y[1]]:S==="H"?["L",y[1],P]:y;m=b[0];let d=m==="C"&&b.length>7,C=d?b.slice(0,7):b.slice(0);if(d&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=Ne(f,[b[1],b[2]],l);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},Dt=on;var an=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>fe(o,n))},Et=an;var sn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),c=E(i,m,n),l=E(m,u,n),f=E(c,l,n);return[["C",i[0],i[1],c[0],c[1],f[0],f[1]],["C",l[0],l[1],u[0],u[1],a[0],a[1]]]},Ot=sn;var lt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${V}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,c,l]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(c)?0:c,Number.isNaN(l)?0:l]}return this.round=i,this.origin=m,this}get bbox(){return mt(this.segments)}get length(){return J(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return pe(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=ue(e),this}toRelative(){let{segments:e}=this;return this.segments=st(e),this}toCurve(){let{segments:e}=this;return this.segments=ce(e),this}reverse(e){let{segments:n}=this,o=ut(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?ve(i):i.slice(0):ve(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:ve(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=W(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=it(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,c]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,c||s]}else a.origin=[o,r,s];return this.segments=ct(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return Le(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return mn}static get arcTools(){return gt}static get bezierTools(){return St}static get cubicTools(){return Ct}static get lineTools(){return ft}static get polygonTools(){return Lt}static get quadTools(){return Mt}static get pathToAbsolute(){return ue}static get pathToRelative(){return st}static get pathToCurve(){return ce}static get pathToString(){return Le}static get distanceSquareRoot(){return oe}static get midPoint(){return E}static get rotateVector(){return ie}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return Te}static get invalidPathValue(){return H}static get isArcCommand(){return Ie}static get isDigit(){return B}static get isDigitStart(){return Oe}static get isMoveCommand(){return $e}static get isPathCommand(){return Ee}static get isSpace(){return De}static get paramsCount(){return Z}static get paramsParser(){return U}static get pathParser(){return K}static get scanFlag(){return qe}static get scanParam(){return Qe}static get scanSegment(){return ye}static get skipSpaces(){return G}static get distanceEpsilon(){return le}static get getClosestPoint(){return Nt}static get getDrawDirection(){return wt}static get getPathArea(){return He}static get getPathBBox(){return mt}static get getPointAtLength(){return pe}static get getPropertiesAtLength(){return xe}static get getPropertiesAtPoint(){return Y}static get getSegmentAtLength(){return zt}static get getSegmentOfPoint(){return Rt}static get getTotalLength(){return J}static get isAbsoluteArray(){return Ze}static get isCurveArray(){return Vt}static get isNormalizedArray(){return Ge}static get isPathArray(){return ee}static get isPointInStroke(){return kt}static get isRelativeArray(){return qt}static get isValidPath(){return _e}static get shapeParams(){return te}static get shapeToPath(){return Qt}static get shapeToPathArray(){return Fe}static get absolutizeSegment(){return _}static get arcToCubic(){return de}static get getSVGMatrix(){return Je}static get iterate(){return T}static get lineToCubic(){return Me}static get normalizePath(){return W}static get normalizeSegment(){return X}static get optimizePath(){return it}static get projection2d(){return Ne}static get quadToCubic(){return je}static get relativizeSegment(){return Pe}static get reverseCurve(){return Dt}static get reversePath(){return ve}static get roundPath(){return Et}static get roundSegment(){return fe}static get segmentToCubic(){return Be}static get shortenSegment(){return Ke}static get splitCubic(){return Ot}static get splitPath(){return ut}static get transformPath(){return ct}},xi=lt;export{mn as CSSMatrix,_ as absolutizeSegment,de as arcToCubic,gt as arcTools,St as bezierTools,Ct as cubicTools,xi as default,le as distanceEpsilon,oe as distanceSquareRoot,Te as finalizeSegment,Nt as getClosestPoint,wt as getDrawDirection,He as getPathArea,mt as getPathBBox,pe as getPointAtLength,xe as getPropertiesAtLength,Y as getPropertiesAtPoint,Je as getSVGMatrix,zt as getSegmentAtLength,Rt as getSegmentOfPoint,J as getTotalLength,H as invalidPathValue,Ze as isAbsoluteArray,Ie as isArcCommand,Vt as isCurveArray,B as isDigit,Oe as isDigitStart,$e as isMoveCommand,Ge as isNormalizedArray,ee as isPathArray,Ee as isPathCommand,kt as isPointInStroke,qt as isRelativeArray,De as isSpace,_e as isValidPath,T as iterate,Me as lineToCubic,ft as lineTools,E as midPoint,W as normalizePath,X as normalizeSegment,it as optimizePath,Z as paramsCount,U as paramsParser,L as parsePathString,K as pathParser,ue as pathToAbsolute,ce as pathToCurve,st as pathToRelative,Le as pathToString,Lt as polygonTools,Ne as projection2d,je as quadToCubic,Mt as quadTools,Pe as relativizeSegment,Dt as reverseCurve,ve as reversePath,ie as rotateVector,Et as roundPath,fe as roundSegment,M as roundTo,qe as scanFlag,Qe as scanParam,ye as scanSegment,Be as segmentToCubic,te as shapeParams,Qt as shapeToPath,Fe as shapeToPathArray,Ke as shortenSegment,G as skipSpaces,Ot as splitCubic,ut as splitPath,ct as transformPath}; //# sourceMappingURL=svg-path-commander.mjs.map \ No newline at end of file diff --git a/dist/svg-path-commander.mjs.map b/dist/svg-path-commander.mjs.map index 7ead948..19c82ce 100644 --- a/dist/svg-path-commander.mjs.map +++ b/dist/svg-path-commander.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/math/arcTools.ts","../src/math/lineTools.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport * as arcTools from \"./math/arcTools\";\nimport * as bezierTools from \"./math/bezier\";\nimport * as cubicTools from \"./math/cubicTools\";\nimport * as lineTools from \"./math/lineTools\";\nimport * as quadTools from \"./math/quadTools\";\nimport * as polygonTools from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["CSSMatrix","arcTools_exports","__export","angleBetween","arcLength","arcPoint","getArcBBox","getArcLength","getArcProps","getPointAtArcLength","lineTools_exports","__export","getLineBBox","getLineLength","getPointAtLineLength","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","bezier_exports","__export","CBEZIER_MINMAX_EPSILON","Cvalues","Tvalues","bezierLength","calculateBezier","computeBezier","deriveBezier","getBezierLength","minmaxC","minmaxQ","points","dpoints","p","d","c","list","j","t","order","mt","mt2","t2","a","b","derivativeFn","l","len","sum","i","curve","idx","step","v1","cp","v2","min","max","E","cp1","cp2","K","T","S","L","R","Q","cubicTools_exports","__export","getCubicBBox","getCubicLength","getPointAtCubicLength","getPointAtCubicSegmentLength","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","quadTools_exports","__export","getPointAtQuadLength","getPointAtQuadSegmentLength","getQuadBBox","getQuadLength","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","polygonTools_exports","__export","polygonArea","polygonLength","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","l","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools_exports","bezier_exports","cubicTools_exports","lineTools_exports","polygonTools_exports","quadTools_exports","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","src_default"]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["CSSMatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","l","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","src_default"]} \ No newline at end of file diff --git a/docs/svg-path-commander.js b/docs/svg-path-commander.js index 53c9289..5e1fb58 100755 --- a/docs/svg-path-commander.js +++ b/docs/svg-path-commander.js @@ -1,2 +1,2 @@ -var SVGPathCommander=function(b){"use strict";var tn=Object.defineProperty,en=(e,t,r)=>t in e?tn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,I=(e,t,r)=>en(e,typeof t!="symbol"?t+"":t,r);const nn={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},fe=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),ge=e=>e instanceof DOMMatrix||e instanceof T||typeof e=="object"&&Object.keys(nn).every(t=>e&&t in e),ct=e=>{const t=new T,r=Array.from(e);if(!fe(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[i,n,s,o,c,a,l,m,h,f,g,u,y,A,x,C]=r;t.m11=i,t.a=i,t.m21=c,t.c=c,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=a,t.d=a,t.m32=f,t.m42=A,t.f=A,t.m13=s,t.m23=l,t.m33=g,t.m43=x,t.m14=o,t.m24=m,t.m34=u,t.m44=C}else if(r.length===6){const[i,n,s,o,c,a]=r;t.m11=i,t.a=i,t.m12=n,t.b=n,t.m21=s,t.c=s,t.m22=o,t.d=o,t.m41=c,t.e=c,t.m42=a,t.f=a}return t},ye=e=>{if(ge(e))return ct([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},de=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new T;const i=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[s,o]=n.split("(");if(!o)throw TypeError(i);const c=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[a,l,m,h]=c,f=[a,l,m],g=[a,l,m,h];if(s==="perspective"&&a&&[l,m].every(u=>u===void 0))r.m34=-1/a;else if(s.includes("matrix")&&[6,16].includes(c.length)&&c.every(u=>!Number.isNaN(+u))){const u=c.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(ct(u))}else if(s==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(a,l,m);else if(s==="translate"&&a&&m===void 0)r=r.translate(a,l||0,0);else if(s==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(a,l,m,h);else if(s==="rotate"&&a&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,a);else if(s==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(a,l,m);else if(s==="scale"&&!Number.isNaN(a)&&(a!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?a:l;r=r.scale(a,u,1)}else if(s==="skew"&&(a||!Number.isNaN(a)&&l)&&m===void 0)r=r.skew(a,l||0);else if(["translate","rotate","scale","skew"].some(u=>s.includes(u))&&/[XYZ]/.test(s)&&a&&[l,m].every(u=>u===void 0))if(s==="skewX"||s==="skewY")r=r[s](a);else{const u=s.replace(/[XYZ]/,""),y=s.replace(u,""),A=["X","Y","Z"].indexOf(y),x=u==="scale"?1:0,C=[A===0?a:x,A===1?a:x,A===2?a:x];r=r[u](...C)}else throw TypeError(i)}),r},kt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],be=(e,t,r)=>{const i=new T;return i.m41=e,i.e=e,i.m42=t,i.f=t,i.m43=r,i},pe=(e,t,r)=>{const i=new T,n=Math.PI/180,s=e*n,o=t*n,c=r*n,a=Math.cos(s),l=-Math.sin(s),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(c),g=-Math.sin(c),u=m*f,y=-m*g;i.m11=u,i.a=u,i.m12=y,i.b=y,i.m13=h;const A=l*h*f+a*g;i.m21=A,i.c=A;const x=a*f-l*h*g;return i.m22=x,i.d=x,i.m23=-l*m,i.m31=l*g-a*h*f,i.m32=l*f+a*h*g,i.m33=a*m,i},Ae=(e,t,r,i)=>{const n=new T,s=Math.sqrt(e*e+t*t+r*r);if(s===0)return n;const o=e/s,c=t/s,a=r/s,l=i*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=c*c,y=a*a,A=1-2*(u+y)*f;n.m11=A,n.a=A;const x=2*(o*c*f+a*m*h);n.m12=x,n.b=x,n.m13=2*(o*a*f-c*m*h);const C=2*(c*o*f-a*m*h);n.m21=C,n.c=C;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(c*a*f+o*m*h),n.m31=2*(a*o*f+c*m*h),n.m32=2*(a*c*f-o*m*h),n.m33=1-2*(g+u)*f,n},xe=(e,t,r)=>{const i=new T;return i.m11=e,i.a=e,i.m22=t,i.d=t,i.m33=r,i},Ct=(e,t)=>{const r=new T;if(e){const i=e*Math.PI/180,n=Math.tan(i);r.m21=n,r.c=n}if(t){const i=t*Math.PI/180,n=Math.tan(i);r.m12=n,r.b=n}return r},Ce=e=>Ct(e,0),Me=e=>Ct(0,e),B=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,i=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,s=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,c=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,a=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,A=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,x=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return ct([r,i,n,s,o,c,a,l,m,h,f,g,u,y,A,x])};class T{constructor(t){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,t?this.setMatrixValue(t):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?de(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?ct(t):typeof t=="object"?ye(t):this}toFloat32Array(t){return Float32Array.from(kt(this,t))}toFloat64Array(t){return Float64Array.from(kt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return B(this,t)}translate(t,r,i){const n=t;let s=r,o=i;return typeof s>"u"&&(s=0),typeof o>"u"&&(o=0),B(this,be(n,s,o))}scale(t,r,i){const n=t;let s=r,o=i;return typeof s>"u"&&(s=t),typeof o>"u"&&(o=1),B(this,xe(n,s,o))}rotate(t,r,i){let n=t,s=r||0,o=i||0;return typeof t=="number"&&typeof r>"u"&&typeof i>"u"&&(o=n,n=0,s=0),B(this,pe(n,s,o))}rotateAxisAngle(t,r,i,n){if([t,r,i,n].some(s=>Number.isNaN(+s)))throw new TypeError("CSSMatrix: expecting 4 values");return B(this,Ae(t,r,i,n))}skewX(t){return B(this,Ce(t))}skewY(t){return B(this,Me(t))}skew(t,r){return B(this,Ct(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,i=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,s=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,i,n,s):{x:r,y:i,z:n,w:s}}}I(T,"Translate",be),I(T,"Rotate",pe),I(T,"RotateAxisAngle",Ae),I(T,"Scale",xe),I(T,"SkewX",Ce),I(T,"SkewY",Me),I(T,"Skew",Ct),I(T,"Multiply",B),I(T,"fromArray",ct),I(T,"fromMatrix",ye),I(T,"fromString",de),I(T,"toArray",kt),I(T,"isCompatibleArray",fe),I(T,"isCompatibleObject",ge);const D=(e,t,r)=>{const[i,n]=e,[s,o]=t;return[i+(s-i)*r,n+(o-n)*r]},lt=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),mt=(e,t,r,i)=>lt([e,t],[r,i]),Vt=(e,t,r,i,n)=>{let s={x:e,y:t};if(typeof n=="number"){const o=lt([e,t],[r,i]);if(n<=0)s={x:e,y:t};else if(n>=o)s={x:r,y:i};else{const[c,a]=D([e,t],[r,i],n/o);s={x:c,y:a}}}return s},It=(e,t,r,i)=>{const{min:n,max:s}=Math;return[n(e,r),n(t,i),s(e,r),s(t,i)]},Pe=Object.freeze(Object.defineProperty({__proto__:null,getLineBBox:It,getLineLength:mt,getPointAtLineLength:Vt},Symbol.toStringTag,{value:"Module"})),Rt=(e,t,r)=>{const i=r/2,n=Math.sin(i),s=Math.cos(i),o=e**2*n**2,c=t**2*s**2,a=Math.sqrt(o+c)*r;return Math.abs(a)},U=(e,t,r,i,n,s)=>{const{sin:o,cos:c}=Math,a=c(n),l=o(n),m=r*c(s),h=i*o(s);return[e+a*m-l*h,t+l*m+a*h]},Et=(e,t)=>{const{x:r,y:i}=e,{x:n,y:s}=t,o=r*n+i*s,c=Math.sqrt((r**2+i**2)*(n**2+s**2));return(r*s-i*n<0?-1:1)*Math.acos(o/c)},Mt=(e,t,r,i,n,s,o,c,a)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(i);const x=(n%360+360)%360*(g/180);if(e===c&&t===a)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:c,y:a}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(c+e)/2,y:(a+t)/2}};const C=(e-c)/2,d=(t-a)/2,p={x:h(x)*C+m(x)*d,y:-m(x)*C+h(x)*d},M=p.x**2/u**2+p.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const S=u**2*y**2-u**2*p.y**2-y**2*p.x**2,q=u**2*p.y**2+y**2*p.x**2;let j=S/q;j=j<0?0:j;const v=(s!==o?1:-1)*f(j),N={x:v*(u*p.y/y),y:v*(-(y*p.x)/u)},Q={x:h(x)*N.x-m(x)*N.y+(e+c)/2,y:m(x)*N.x+h(x)*N.y+(t+a)/2},Y={x:(p.x-N.x)/u,y:(p.y-N.y)/y},$=Et({x:1,y:0},Y),P={x:(-p.x-N.x)/u,y:(-p.y-N.y)/y};let k=Et(Y,P);!o&&k>0?k-=2*g:o&&k<0&&(k+=2*g),k%=2*g;const Z=$+k;return{center:Q,startAngle:$,endAngle:Z,rx:u,ry:y}},Ot=(e,t,r,i,n,s,o,c,a)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=Mt(e,t,r,i,n,s,o,c,a);return Rt(l,m,f-h)},Se=(e,t,r,i,n,s,o,c,a,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=Mt(e,t,r,i,n,s,o,c,a);if(typeof l=="number"){const A=Rt(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=A)m={x:c,y:a};else{if(e===c&&t===a)return{x:c,y:a};if(f===0||g===0)return Vt(e,t,c,a,l);const{PI:x,cos:C,sin:d}=Math,p=y-u,S=(n%360+360)%360*(x/180),q=u+p*(l/A),j=f*C(q),v=g*d(q);m={x:C(S)*j-d(S)*v+h.x,y:d(S)*j+C(S)*v+h.y}}}return m},Te=(e,t,r,i,n,s,o,c,a)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=Mt(e,t,r,i,n,s,o,c,a),u=g-f,{min:y,max:A,tan:x,atan2:C,PI:d}=Math,{x:p,y:M}=l,S=n*d/180,q=x(S),j=C(-h*q,m),v=j,N=j+d,Q=C(h,m*q),Y=Q+d,$=[c],P=[a];let k=y(e,c),Z=A(e,c),O=y(t,a),G=A(t,a);const at=g-u*1e-5,tt=U(p,M,m,h,S,at),L=g-u*.99999,V=U(p,M,m,h,S,L);if(tt[0]>Z||V[0]>Z){const z=U(p,M,m,h,S,v);$.push(z[0]),P.push(z[1])}if(tt[0]G||V[1]>G){const z=U(p,M,m,h,S,Q);$.push(z[0]),P.push(z[1])}return k=y.apply([],$),O=y.apply([],P),Z=A.apply([],$),G=A.apply([],P),[k,O,Z,G]},Ne=Object.freeze(Object.defineProperty({__proto__:null,angleBetween:Et,arcLength:Rt,arcPoint:U,getArcBBox:Te,getArcLength:Ot,getArcProps:Mt,getPointAtArcLength:Se},Symbol.toStringTag,{value:"Module"})),_t=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],we=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Le=e=>{const t=[];for(let r=e,i=r.length,n=i-1;i>1;i-=1,n-=1){const s=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const i=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:i*n[0].x+t*n[1].x,y:i*n[0].y+t*n[1].y,t};const s=i*i,o=t*t;let c=0,a=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],c=s,a=i*t*2,l=o):r===3&&(c=s*i,a=s*t*3,l=i*o*3,m=t*o),{x:c*n[0].x+a*n[1].x+l*n[2].x+m*n[3].x,y:c*n[0].y+a*n[1].y+l*n[2].y+m*n[3].y,t}},ze=(e,t)=>{const r=e(t),i=r.x*r.x+r.y*r.y;return Math.sqrt(i)},qe=e=>{const r=_t.length;let i=0;for(let n=0,s;n{const t=[];for(let i=0,n=e.length,s=2;ive(r[0],i))},je=1e-8,Pt=([e,t,r])=>{const i=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[i,n];const s=(e*r-t*t)/(e-2*t+r);return s{const n=e-3*t+3*r-i;if(Math.abs(n)0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+i*m*m*m;fa&&(a=f)}return[c,a]},$e=Object.freeze(Object.defineProperty({__proto__:null,CBEZIER_MINMAX_EPSILON:je,Cvalues:we,Tvalues:_t,bezierLength:qe,calculateBezier:ze,computeBezier:ve,deriveBezier:Le,getBezierLength:ut,minmaxC:Dt,minmaxQ:Pt},Symbol.toStringTag,{value:"Module"})),ke=([e,t,r,i,n,s,o,c],a)=>{const l=1-a;return{x:l**3*e+3*l**2*a*r+3*l*a**2*n+a**3*o,y:l**3*t+3*l**2*a*i+3*l*a**2*s+a**3*c}},St=(e,t,r,i,n,s,o,c)=>ut([e,t,r,i,n,s,o,c]),Ve=(e,t,r,i,n,s,o,c,a)=>{const l=typeof a=="number";let m={x:e,y:t};if(l){const h=ut([e,t,r,i,n,s,o,c]);a<=0||(a>=h?m={x:o,y:c}:m=ke([e,t,r,i,n,s,o,c],a/h))}return m},Qt=(e,t,r,i,n,s,o,c)=>{const a=Dt([e,r,n,o]),l=Dt([t,i,s,c]);return[a[0],l[0],a[1],l[1]]},Ie=Object.freeze(Object.defineProperty({__proto__:null,getCubicBBox:Qt,getCubicLength:St,getPointAtCubicLength:Ve,getPointAtCubicSegmentLength:ke},Symbol.toStringTag,{value:"Module"})),Re=([e,t,r,i,n,s],o)=>{const c=1-o;return{x:c**2*e+2*c*o*r+o**2*n,y:c**2*t+2*c*o*i+o**2*s}},Tt=(e,t,r,i,n,s)=>ut([e,t,r,i,n,s]),Ee=(e,t,r,i,n,s,o)=>{const c=typeof o=="number";let a={x:e,y:t};if(c){const l=ut([e,t,r,i,n,s]);o<=0||(o>=l?a={x:n,y:s}:a=Re([e,t,r,i,n,s],o/l))}return a},Zt=(e,t,r,i,n,s)=>{const o=Pt([e,r,n]),c=Pt([t,i,s]);return[o[0],c[0],o[1],c[1]]},Oe=Object.freeze(Object.defineProperty({__proto__:null,getPointAtQuadLength:Ee,getPointAtQuadSegmentLength:Re,getQuadBBox:Zt,getQuadLength:Tt},Symbol.toStringTag,{value:"Module"})),_e=Object.freeze(Object.defineProperty({__proto__:null,polygonArea:e=>{const t=e.length;let r=-1,i,n=e[t-1],s=0;for(;++re.reduce((t,r,i)=>i?t+lt(e[i-1],r):0,0)},Symbol.toStringTag,{value:"Module"})),et=(e,t,r)=>{const{sin:i,cos:n}=Math,s=e*n(r)-t*i(r),o=e*i(r)+t*n(r);return{x:s,y:o}},w=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},J={origin:[0,0,0],round:4},K={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Nt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:i}=e;for(;i.length>=K[r]&&(r==="m"&&i.length>2?(e.segments.push([t].concat(i.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(i.splice(0,K[r]))),!!K[r]););},_="SVGPathCommander Error",Bt=e=>{const{index:t,pathValue:r}=e,i=r.charCodeAt(t);if(i===48){e.param=0,e.index+=1;return}if(i===49){e.param=1,e.index+=1;return}e.err=`${_}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},H=e=>e>=48&&e<=57,F="Invalid path value",Ht=e=>{const{max:t,pathValue:r,index:i}=e;let n=i,s=!1,o=!1,c=!1,a=!1,l;if(n>=t){e.err=`${_}: ${F} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!H(l)&&l!==46){e.err=`${_}: ${F} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(s=l===48,n+=1,l=r.charCodeAt(n),s&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),W=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Ut=e=>H(e)||e===43||e===45||e===46,Jt=e=>(e|32)===97,Kt=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},wt=e=>{var a;const{max:t,pathValue:r,index:i,segments:n}=e,s=r.charCodeAt(i),o=K[r[i].toLowerCase()];if(e.segmentStart=i,!Gt(s)){e.err=`${_}: ${F} "${r[i]}" is not a path command at index ${i}`;return}const c=n[n.length-1];if(!Kt(s)&&((a=c==null?void 0:c[0])==null?void 0:a.toLocaleLowerCase())==="z"){e.err=`${_}: ${F} "${r[i]}" is not a MoveTo path command at index ${i}`;return}if(e.index+=1,W(e),e.data=[],!o){Nt(e);return}for(;;){for(let l=o;l>0;l-=1){if(Jt(s)&&(l===3||l===4)?Bt(e):Ht(e),e.err.length)return;e.data.push(e.param),W(e),e.index=e.max||!Ut(r.charCodeAt(e.index)))break}Nt(e)};class Lt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const R=e=>{if(typeof e!="string")return e.slice(0);const t=new Lt(e);for(W(t);t.index{const[n]=e,s=n.toUpperCase();if(t===0||s===n)return e;if(s==="A")return[s,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+i];if(s==="V")return[s,e[1]+i];if(s==="H")return[s,e[1]+r];if(s==="L")return[s,e[1]+r,e[2]+i];{const c=[],a=e.length;for(let l=1;l{let r=e.length,i,n="M",s="M",o=!1,c=0,a=0,l=0,m=0,h=0;for(let f=0;f{const t=R(e);return E(t,nt)},vt=(e,t,r,i)=>{const[n]=e,s=n.toLowerCase();if(t===0||n===s)return e;if(s==="a")return[s,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-i];if(s==="v")return[s,e[1]-i];if(s==="h")return[s,e[1]-r];if(s==="l")return[s,e[1]-r,e[2]-i];{const c=[],a=e.length;for(let l=1;l{const t=R(e);return E(t,vt)},ft=(e,t,r,i,n,s,o,c,a,l)=>{let m=e,h=t,f=r,g=i,u=c,y=a;const A=Math.PI*120/180,x=Math.PI/180*(+n||0);let C=[],d,p,M,S,q;if(l)[p,M,S,q]=l;else{d=et(m,h,-x),m=d.x,h=d.y,d=et(u,y,-x),u=d.x,y=d.y;const L=(m-u)/2,V=(h-y)/2;let z=L*L/(f*f)+V*V/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);const ue=f*f,he=g*g,Ye=(s===o?-1:1)*Math.sqrt(Math.abs((ue*he-ue*V*V-he*L*L)/(ue*V*V+he*L*L)));S=Ye*f*V/g+(m+u)/2,q=Ye*-g*L/f+(h+y)/2,p=Math.asin(((h-q)/g*10**9>>0)/10**9),M=Math.asin(((y-q)/g*10**9>>0)/10**9),p=mM&&(p-=Math.PI*2),!o&&M>p&&(M-=Math.PI*2)}let j=M-p;if(Math.abs(j)>A){const L=M,V=u,z=y;M=p+A*(o&&M>p?1:-1),u=S+f*Math.cos(M),y=q+g*Math.sin(M),C=ft(u,y,f,g,n,0,o,V,z,[M,L,S,q])}j=M-p;const v=Math.cos(p),N=Math.sin(p),Q=Math.cos(M),Y=Math.sin(M),$=Math.tan(j/4),P=4/3*f*$,k=4/3*g*$,Z=[m,h],O=[m+P*N,h-k*v],G=[u+P*Y,y-k*Q],at=[u,y];if(O[0]=2*Z[0]-O[0],O[1]=2*Z[1]-O[1],l)return[O[0],O[1],G[0],G[1],at[0],at[1]].concat(C);C=[O[0],O[1],G[0],G[1],at[0],at[1]].concat(C);const tt=[];for(let L=0,V=C.length;L{const o=.3333333333333333,c=2/3;return[o*e+c*r,o*t+c*i,o*n+c*r,o*s+c*i,n,s]},zt=(e,t,r,i)=>{const n=D([e,t],[r,i],.3333333333333333),s=D([e,t],[r,i],2/3);return[n[0],n[1],s[0],s[1],r,i]},Yt=(e,t)=>{const[r]=e,i=e.slice(1).map(Number),[n,s]=i,{x1:o,y1:c,x:a,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=s,e):r==="A"?["C"].concat(ft(o,c,i[0],i[1],i[2],i[3],i[4],i[5],i[6])):r==="Q"?(t.qx=n,t.qy=s,["C"].concat(Xt(o,c,i[0],i[1],i[2],i[3]))):r==="L"?["C"].concat(zt(o,c,n,s)):r==="Z"?["C"].concat(zt(o,c,a,l)):e},gt=(e,t)=>{const[r]=e,i=r.toUpperCase(),n=r!==i,{x1:s,y1:o,x2:c,y2:a,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(i)||(t.qx=null,t.qy=null),i==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(i==="H")return["L",e[1]+(n?l:0),o];if(i==="V")return["L",s,e[1]+(n?m:0)];if(i==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(i==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(i==="C")return["C"].concat(f);if(i==="S"){const g=s*2-c,u=o*2-a;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(i==="T"){const g=s*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(i==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(i==="Z")return["Z"];return e},rt={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},yt=e=>{const t={...rt},r=R(e);return E(r,(i,n,s,o)=>{t.x=s,t.y=o;const c=gt(i,t);let a=Yt(c,t);a[0]==="C"&&a.length>7&&(r.splice(n+1,0,["C"].concat(a.slice(7))),a=a.slice(0,7));const m=a.length;return t.x1=+a[m-2],t.y1=+a[m-1],t.x2=+a[m-4]||t.x1,t.y2=+a[m-3]||t.y1,a})},qt=(e,t)=>{const r=e.length;let{round:i}=J,n=e[0],s="";i=t==="off"||typeof t=="number"&&t>=0?t:typeof i=="number"&&i>=0?i:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=R(e);let r="M",i=0,n=0;const{max:s,min:o}=Math;let c=1/0,a=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,A=0,x=0,C=0,d=0,p=0;E(t,(q,j,v,N)=>{[r]=q;const Q=r.toUpperCase(),$=Q!==r?nt(q,j,v,N):q.slice(0),P=Q==="V"?["L",v,$[1]]:Q==="H"?["L",$[1],N]:$;if([r]=P,"TQ".includes(Q)||(d=0,p=0),r==="M")[,i,n]=P,h=i,f=n,g=i,u=n;else if(r==="L")[h,f,g,u]=It(v,N,P[1],P[2]);else if(r==="A")[h,f,g,u]=Te(v,N,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(r==="S"){const k=y*2-x,Z=A*2-C;[h,f,g,u]=Qt(v,N,k,Z,P[1],P[2],P[3],P[4])}else r==="C"?[h,f,g,u]=Qt(v,N,P[1],P[2],P[3],P[4],P[5],P[6]):r==="T"?(d=y*2-d,p=A*2-p,[h,f,g,u]=Zt(v,N,d,p,P[1],P[2])):r==="Q"?(d=P[1],p=P[2],[h,f,g,u]=Zt(v,N,P[1],P[2],P[3],P[4])):r==="Z"&&([h,f,g,u]=It(v,N,i,n));c=o(h,c),a=o(f,a),l=s(g,l),m=s(u,m),[y,A]=r==="Z"?[i,n]:P.slice(-2),[x,C]=r==="C"?[P[3],P[4]]:r==="S"?[P[1],P[2]]:[y,A]});const M=l-c,S=m-a;return{width:M,height:S,x:c,y:a,x2:l,y2:m,cx:c+M/2,cy:a+S/2,cz:Math.max(M,S)+Math.min(M,S)/2}},X=e=>{const t=R(e);let r=0,i=0,n=0,s=0,o=0,c=0,a="M",l=0,m=0,h=0;return E(t,(f,g,u,y)=>{[a]=f;const A=a.toUpperCase(),C=A!==a?nt(f,g,u,y):f.slice(0),d=A==="V"?["L",u,C[1]]:A==="H"?["L",C[1],y]:C;if([a]=d,"TQ".includes(A)||(o=0,c=0),a==="M")[,l,m]=d;else if(a==="L")h+=mt(u,y,d[1],d[2]);else if(a==="A")h+=Ot(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(a==="S"){const p=r*2-n,M=i*2-s;h+=St(u,y,p,M,d[1],d[2],d[3],d[4])}else a==="C"?h+=St(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):a==="T"?(o=r*2-o,c=i*2-c,h+=Tt(u,y,o,c,d[1],d[2])):a==="Q"?(o=d[1],c=d[2],h+=Tt(u,y,d[1],d[2],d[3],d[4])):a==="Z"&&(h+=mt(u,y,l,m));[r,i]=a==="Z"?[l,m]:d.slice(-2),[n,s]=a==="C"?[d[3],d[4]]:a==="S"?[d[1],d[2]]:[r,i]}),h},dt=1e-5,it=e=>{const t=R(e),r={...rt};return E(t,(i,n,s,o)=>{r.x=s,r.y=o;const c=gt(i,r),a=c.length;return r.x1=+c[a-2],r.y1=+c[a-1],r.x2=+c[a-4]||r.x1,r.y2=+c[a-3]||r.y1,c})},st=(e,t)=>{const r=it(e);let i=!1,n=[],s="M",o=0,c=0,[a,l]=r[0].slice(1);const m=typeof t=="number";let h={x:a,y:l},f=0,g=h,u=0;return!m||t{if([s]=y,i=s==="M",n=i?n:[x,C].concat(y.slice(1)),i?([,a,l]=y,h={x:a,y:l},f=0):s==="L"?(h=Vt(n[0],n[1],n[2],n[3],t-u),f=mt(n[0],n[1],n[2],n[3])):s==="A"?(h=Se(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=Ot(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):s==="C"?(h=Ve(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=St(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):s==="Q"?(h=Ee(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=Tt(n[0],n[1],n[2],n[3],n[4],n[5])):s==="Z"&&(n=[x,C,a,l],h={x:a,y:l},f=mt(n[0],n[1],n[2],n[3])),[o,c]=n.slice(-2),uu-dt?{x:o,y:c}:g)},jt=(e,t)=>{const r=R(e);let i=r.slice(0),n=X(i),s=i.length-1,o=0,c=0,a=r[0];if(s<=0||!t||!Number.isFinite(t))return{segment:a,index:0,length:c,lengthAtSegment:o};if(t>=n)return i=r.slice(0,-1),o=X(i),c=n-o,a=r[s],{segment:a,index:s,length:c,lengthAtSegment:o};const l=[];for(;s>0;)a=i[s],i=i.slice(0,-1),o=X(i),c=n-o,n=o,l.push({segment:a,index:s,length:c,lengthAtSegment:o}),s-=1;return l.find(({lengthAtSegment:m})=>m<=t)},bt=(e,t)=>{const r=R(e),i=it(r),n=X(i),s=p=>{const M=p.x-t.x,S=p.y-t.y;return M*M+S*S};let o=8,c,a={x:0,y:0},l=0,m=0,h=1/0;for(let p=0;p<=n;p+=o)c=st(i,p),l=s(c),l1e-6&&(u=m-o,f=st(i,u),A=s(f),y=m+o,g=st(i,y),x=s(g),u>=0&&Abt(e,t).closest,rn=(e,t,r,i,n,s,o,c)=>3*((c-t)*(r+n)-(o-e)*(i+s)+i*(e-n)-r*(t-s)+c*(n+e/3)-o*(s+t/3))/20,ee=e=>{let t=0,r=0,i=0;return yt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return i=rn(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),i}}).reduce((n,s)=>n+s,0)},Qe=e=>ee(yt(e))>=0,Ze=(e,t)=>jt(e,t).segment,Be=(e,t)=>bt(e,t).segment,pt=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return K[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,ne=e=>pt(e)&&e.every(([t])=>t===t.toUpperCase()),re=e=>ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),He=e=>re(e)&&e.every(([t])=>"MC".includes(t)),Fe=(e,t)=>{const{distance:r}=bt(e,t);return Math.abs(r)pt(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),ie=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Lt(e);for(W(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,sn=e=>{let{x1:t,y1:r,x2:i,y2:n}=e;return[t,r,i,n]=[t,r,i,n].map(s=>+s),[["M",t,r],["L",i,n]]},on=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let i=0;for(;i{let{cx:t,cy:r,r:i}=e;return[t,r,i]=[t,r,i].map(n=>+n),[["M",t-i,r],["a",i,i,0,1,0,2*i,0],["a",i,i,0,1,0,-2*i,0]]},cn=e=>{let{cx:t,cy:r}=e,i=e.rx||0,n=e.ry||i;return[t,r,i,n]=[t,r,i,n].map(s=>+s),[["M",t-i,r],["a",i,n,0,1,0,2*i,0],["a",i,n,0,1,0,-2*i,0]]},ln=e=>{const t=+e.x||0,r=+e.y||0,i=+e.width,n=+e.height;let s=+(e.rx||0),o=+(e.ry||s);return s||o?(s*2>i&&(s-=(s*2-i)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+s,r],["h",i-s*2],["s",s,0,s,o],["v",n-o*2],["s",0,o,-s,o],["h",-i+s*2],["s",-s,0,-s,-o],["v",-n+o*2],["s",0,-o,s,-o]]):[["M",t,r],["h",i],["v",n],["H",t],["Z"]]},se=e=>{const t=Object.keys(ot),r=Ue(e),i=r?e.tagName:null;if(i&&[...t,"path"].every(a=>i!==a))throw TypeError(`${_}: "${i}" is not SVGElement`);const n=r?i:e.type,s=ot[n],o={type:n};r?s.forEach(a=>{o[a]=e.getAttribute(a)}):Object.assign(o,e);let c=[];return n==="circle"?c=an(o):n==="ellipse"?c=cn(o):["polyline","polygon"].includes(n)?c=on(o):n==="rect"?c=ln(o):n==="line"?c=sn(o):["glyph","path"].includes(n)&&(c=R(r?e.getAttribute("d")||"":e.d||"")),pt(c)&&c.length?c:!1},Je=(e,t,r)=>{const i=r||document,n=Object.keys(ot),s=Ue(e),o=s?e.tagName:null;if(o==="path")throw TypeError(`${_}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${_}: "${o}" is not SVGElement`);const c=i.createElementNS("http://www.w3.org/2000/svg","path"),a=s?o:e.type,l=ot[a],m={type:a},h=J.round,f=se(e),g=f&&f.length?qt(f,h):"";return s?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||c.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&c.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),ie(g)?(c.setAttribute("d",g),t&&s&&(e.before(c,e),e.remove()),c):!1},oe=(e,t,r,i)=>{const[n]=e,{round:s}=J,o=s,c=t.slice(1),{x1:a,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=c.slice(-2),A=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(w(f,o)===w(u,o))return["V",y];if(w(g,o)===w(y,o))return["H",u]}else if(n==="C"){const[x,C]=c;if(r.x1=x,r.y1=C,"CS".includes(i)&&(w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o)||w(a,o)===w(m*2-f,o)&&w(l,o)===w(h*2-g,o)))return["S",c[2],c[3],c[4],c[5]]}else if(n==="Q"){const[x,C]=c;if(r.qx=x,r.qy=C,"QT".includes(i)&&w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o))return["T",c[2],c[3]]}return A},At=(e,t)=>{const r=e.slice(1).map(i=>w(i,t));return[e[0]].concat(r)},ae=(e,t)=>{const r=ht(e),i=typeof t=="number"&&t>=0?t:2,n={...rt},s=[];let o="M",c="Z";return E(r,(a,l,m,h)=>{n.x=m,n.y=h;const f=gt(a,n);let g=a;if([o]=a,s[l]=o,l){c=s[l-1];const y=oe(a,f,n,c),A=At(y,i),x=A.join(""),C=vt(y,l,m,h),d=At(C,i),p=d.join("");g=x.length{const t=ht(e),r=it(t),i=t.length,n=t[i-1][0]==="Z",s=E(t,(o,c)=>{const a=r[c],l=c&&t[c-1],m=l&&l[0],h=t[c+1],f=h&&h[0],[g]=o,[u,y]=r[c?c-1:i-1].slice(-2);let A=o;switch(g){case"M":A=n?["Z"]:[g,u,y];break;case"A":A=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?A=["S",o[1],o[2],u,y]:A=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?A=["C",a[3],a[4],a[1],a[2],u,y]:A=[g,a[1],a[2],u,y];break;case"Q":h&&f==="T"?A=["T",u,y]:A=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?A=["Q",a[1],a[2],u,y]:A=[g,u,y];break;case"Z":A=["M",u,y];break;case"H":A=[g,u];break;case"V":A=[g,y];break;default:A=[g].concat(o.slice(1,-2),u,y)}return A});return n?s.reverse():[s[0]].concat(s.slice(1).reverse())},ce=e=>{const t=[];let r,i=-1,n=0,s=0,o=0,c=0;const a={...rt};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(i+=1,[n,s]=u,n+=g?a.x:0,s+=g?a.y:0,o=n,c=s,r=[g?[h,o,c]:l]):(h==="Z"?(n=o,s=c):h==="H"?([,n]=l,n+=g?a.x:0):h==="V"?([,s]=l,s+=g?a.y:0):([n,s]=l.slice(-2),n+=g?a.x:0,s+=g?a.y:0),r.push(l)),a.x=n,a.y=s,t[i]=r}),t},le=e=>{let t=new T;const{origin:r}=e,[i,n]=r,{translate:s}=e,{rotate:o}=e,{skew:c}=e,{scale:a}=e;return Array.isArray(s)&&s.length>=2&&s.every(l=>!Number.isNaN(+l))&&s.some(l=>l!==0)?t=t.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(t=t.translate(s)),(o||c||a)&&(t=t.translate(i,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(c)&&c.length===2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==0)?(t=c[0]?t.skewX(c[0]):t,t=c[1]?t.skewY(c[1]):t):typeof c=="number"&&!Number.isNaN(c)&&(t=t.skewX(c)),Array.isArray(a)&&a.length>=2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==1)?t=t.scale(...a):typeof a=="number"&&!Number.isNaN(a)&&(t=t.scale(a)),t=t.translate(-i,-n)),t},mn=(e,t)=>{let r=T.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},$t=(e,t,r)=>{const[i,n,s]=r,[o,c,a]=mn(e,[t[0],t[1],0,1]),l=o-i,m=c-n,h=a-s;return[l*(Math.abs(s)/Math.abs(h)||1)+i,m*(Math.abs(s)/Math.abs(h)||1)+n]},me=(e,t)=>{let r=0,i=0,n=0,s=0,o=0,c=0,a="M";const l=R(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:J.origin});const h=t.origin,f=le(t);return f.isIdentity?l.slice(0):E(l,(g,u,y,A)=>{[a]=g;const x=a.toUpperCase(),d=x!==a?nt(g,u,y,A):g.slice(0);let p=x==="A"?["C"].concat(ft(y,A,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):x==="V"?["L",y,d[1]]:x==="H"?["L",d[1],A]:d;a=p[0];const M=a==="C"&&p.length>7,S=M?p.slice(0,7):p.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(p.slice(7))),p=S),a==="L")[n,s]=$t(f,[p[1],p[2]],h),r!==n&&i!==s?p=["L",n,s]:i===s?p=["H",n]:r===n&&(p=["V",s]);else for(o=1,c=p.length;o{const t=e.slice(1).map((r,i,n)=>i?n[i-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((i,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},We=(e,t)=>{let{round:r}=J;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):E(e,i=>At(i,r))},Xe=(e,t=.5)=>{const r=t,i=e.slice(0,2),n=e.slice(2,4),s=e.slice(4,6),o=e.slice(6,8),c=D(i,n,r),a=D(n,s,r),l=D(s,o,r),m=D(c,a,r),h=D(a,l,r),f=D(m,h,r);return[["C",c[0],c[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class un{constructor(t,r){const i=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${_}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=R(t);const{round:s,origin:o}=i;let c;Number.isInteger(s)||s==="off"?c=s:c=J.round;let a=J.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);a=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=c,this.origin=a,this}get bbox(){return te(this.segments)}get length(){return X(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return st(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=ht(t),this}toRelative(){const{segments:t}=this;return this.segments=Wt(t),this}toCurve(){const{segments:t}=this;return this.segments=yt(t),this}reverse(t){const{segments:r}=this,i=ce(r),n=i.length>1?i:!1,s=n?n.map((c,a)=>t?a?xt(c):c.slice(0):xt(c)):r.slice(0);let o=[];return n?o=s.flat(1):o=t?r:xt(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=it(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=ae(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(a=>a in t))return this;const{segments:r,origin:[i,n,s]}=this,o={};for(const[a,l]of Object.entries(t))a==="skew"&&Array.isArray(l)||(a==="rotate"||a==="translate"||a==="origin"||a==="scale")&&Array.isArray(l)?o[a]=l.map(Number):a!=="origin"&&typeof Number(l)=="number"&&(o[a]=Number(l));const{origin:c}=o;if(Array.isArray(c)&&c.length>=2){const[a,l,m]=c.map(Number);o.origin=[Number.isNaN(a)?i:a,Number.isNaN(l)?n:l,m||s]}else o.origin=[i,n,s];return this.segments=me(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return qt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return T}static get arcTools(){return Ne}static get bezierTools(){return $e}static get cubicTools(){return Ie}static get lineTools(){return Pe}static get polygonTools(){return _e}static get quadTools(){return Oe}static get pathToAbsolute(){return ht}static get pathToRelative(){return Wt}static get pathToCurve(){return yt}static get pathToString(){return qt}static get distanceSquareRoot(){return lt}static get midPoint(){return D}static get rotateVector(){return et}static get roundTo(){return w}static get parsePathString(){return R}static get finalizeSegment(){return Nt}static get invalidPathValue(){return F}static get isArcCommand(){return Jt}static get isDigit(){return H}static get isDigitStart(){return Ut}static get isMoveCommand(){return Kt}static get isPathCommand(){return Gt}static get isSpace(){return Ft}static get paramsCount(){return K}static get paramsParser(){return rt}static get pathParser(){return Lt}static get scanFlag(){return Bt}static get scanParam(){return Ht}static get scanSegment(){return wt}static get skipSpaces(){return W}static get distanceEpsilon(){return dt}static get getClosestPoint(){return De}static get getDrawDirection(){return Qe}static get getPathArea(){return ee}static get getPathBBox(){return te}static get getPointAtLength(){return st}static get getPropertiesAtLength(){return jt}static get getPropertiesAtPoint(){return bt}static get getSegmentAtLength(){return Ze}static get getSegmentOfPoint(){return Be}static get getTotalLength(){return X}static get isAbsoluteArray(){return ne}static get isCurveArray(){return He}static get isNormalizedArray(){return re}static get isPathArray(){return pt}static get isPointInStroke(){return Fe}static get isRelativeArray(){return Ge}static get isValidPath(){return ie}static get shapeParams(){return ot}static get shapeToPath(){return Je}static get shapeToPathArray(){return se}static get absolutizeSegment(){return nt}static get arcToCubic(){return ft}static get getSVGMatrix(){return le}static get iterate(){return E}static get lineToCubic(){return zt}static get normalizePath(){return it}static get normalizeSegment(){return gt}static get optimizePath(){return ae}static get projection2d(){return $t}static get quadToCubic(){return Xt}static get relativizeSegment(){return vt}static get reverseCurve(){return Ke}static get reversePath(){return xt}static get roundPath(){return We}static get roundSegment(){return At}static get segmentToCubic(){return Yt}static get shortenSegment(){return oe}static get splitCubic(){return Xe}static get splitPath(){return ce}static get transformPath(){return me}}return b.CSSMatrix=T,b.absolutizeSegment=nt,b.arcToCubic=ft,b.arcTools=Ne,b.bezierTools=$e,b.cubicTools=Ie,b.default=un,b.distanceEpsilon=dt,b.distanceSquareRoot=lt,b.finalizeSegment=Nt,b.getClosestPoint=De,b.getDrawDirection=Qe,b.getPathArea=ee,b.getPathBBox=te,b.getPointAtLength=st,b.getPropertiesAtLength=jt,b.getPropertiesAtPoint=bt,b.getSVGMatrix=le,b.getSegmentAtLength=Ze,b.getSegmentOfPoint=Be,b.getTotalLength=X,b.invalidPathValue=F,b.isAbsoluteArray=ne,b.isArcCommand=Jt,b.isCurveArray=He,b.isDigit=H,b.isDigitStart=Ut,b.isMoveCommand=Kt,b.isNormalizedArray=re,b.isPathArray=pt,b.isPathCommand=Gt,b.isPointInStroke=Fe,b.isRelativeArray=Ge,b.isSpace=Ft,b.isValidPath=ie,b.iterate=E,b.lineToCubic=zt,b.lineTools=Pe,b.midPoint=D,b.normalizePath=it,b.normalizeSegment=gt,b.optimizePath=ae,b.paramsCount=K,b.paramsParser=rt,b.parsePathString=R,b.pathParser=Lt,b.pathToAbsolute=ht,b.pathToCurve=yt,b.pathToRelative=Wt,b.pathToString=qt,b.polygonTools=_e,b.projection2d=$t,b.quadToCubic=Xt,b.quadTools=Oe,b.relativizeSegment=vt,b.reverseCurve=Ke,b.reversePath=xt,b.rotateVector=et,b.roundPath=We,b.roundSegment=At,b.roundTo=w,b.scanFlag=Bt,b.scanParam=Ht,b.scanSegment=wt,b.segmentToCubic=Yt,b.shapeParams=ot,b.shapeToPath=Je,b.shapeToPathArray=se,b.shortenSegment=oe,b.skipSpaces=W,b.splitCubic=Xe,b.splitPath=ce,b.transformPath=me,Object.defineProperties(b,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),b}({}); +var SVGPathCommander=function(b){"use strict";var tn=Object.defineProperty,en=(e,t,r)=>t in e?tn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t,r)=>en(e,typeof t!="symbol"?t+"":t,r);const nn={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},fe=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),ge=e=>e instanceof DOMMatrix||e instanceof T||typeof e=="object"&&Object.keys(nn).every(t=>e&&t in e),ct=e=>{const t=new T,r=Array.from(e);if(!fe(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,i,o,c,a,l,m,h,f,g,u,y,p,x,C]=r;t.m11=s,t.a=s,t.m21=c,t.c=c,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=a,t.d=a,t.m32=f,t.m42=p,t.f=p,t.m13=i,t.m23=l,t.m33=g,t.m43=x,t.m14=o,t.m24=m,t.m34=u,t.m44=C}else if(r.length===6){const[s,n,i,o,c,a]=r;t.m11=s,t.a=s,t.m12=n,t.b=n,t.m21=i,t.c=i,t.m22=o,t.d=o,t.m41=c,t.e=c,t.m42=a,t.f=a}return t},ye=e=>{if(ge(e))return ct([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},de=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new T;const s=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[i,o]=n.split("(");if(!o)throw TypeError(s);const c=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[a,l,m,h]=c,f=[a,l,m],g=[a,l,m,h];if(i==="perspective"&&a&&[l,m].every(u=>u===void 0))r.m34=-1/a;else if(i.includes("matrix")&&[6,16].includes(c.length)&&c.every(u=>!Number.isNaN(+u))){const u=c.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(ct(u))}else if(i==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(a,l,m);else if(i==="translate"&&a&&m===void 0)r=r.translate(a,l||0,0);else if(i==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(a,l,m,h);else if(i==="rotate"&&a&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,a);else if(i==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(a,l,m);else if(i==="scale"&&!Number.isNaN(a)&&(a!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?a:l;r=r.scale(a,u,1)}else if(i==="skew"&&(a||!Number.isNaN(a)&&l)&&m===void 0)r=r.skew(a,l||0);else if(["translate","rotate","scale","skew"].some(u=>i.includes(u))&&/[XYZ]/.test(i)&&a&&[l,m].every(u=>u===void 0))if(i==="skewX"||i==="skewY")r=r[i](a);else{const u=i.replace(/[XYZ]/,""),y=i.replace(u,""),p=["X","Y","Z"].indexOf(y),x=u==="scale"?1:0,C=[p===0?a:x,p===1?a:x,p===2?a:x];r=r[u](...C)}else throw TypeError(s)}),r},Vt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],be=(e,t,r)=>{const s=new T;return s.m41=e,s.e=e,s.m42=t,s.f=t,s.m43=r,s},Ae=(e,t,r)=>{const s=new T,n=Math.PI/180,i=e*n,o=t*n,c=r*n,a=Math.cos(i),l=-Math.sin(i),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(c),g=-Math.sin(c),u=m*f,y=-m*g;s.m11=u,s.a=u,s.m12=y,s.b=y,s.m13=h;const p=l*h*f+a*g;s.m21=p,s.c=p;const x=a*f-l*h*g;return s.m22=x,s.d=x,s.m23=-l*m,s.m31=l*g-a*h*f,s.m32=l*f+a*h*g,s.m33=a*m,s},pe=(e,t,r,s)=>{const n=new T,i=Math.sqrt(e*e+t*t+r*r);if(i===0)return n;const o=e/i,c=t/i,a=r/i,l=s*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=c*c,y=a*a,p=1-2*(u+y)*f;n.m11=p,n.a=p;const x=2*(o*c*f+a*m*h);n.m12=x,n.b=x,n.m13=2*(o*a*f-c*m*h);const C=2*(c*o*f-a*m*h);n.m21=C,n.c=C;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(c*a*f+o*m*h),n.m31=2*(a*o*f+c*m*h),n.m32=2*(a*c*f-o*m*h),n.m33=1-2*(g+u)*f,n},xe=(e,t,r)=>{const s=new T;return s.m11=e,s.a=e,s.m22=t,s.d=t,s.m33=r,s},Ct=(e,t)=>{const r=new T;if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},Ce=e=>Ct(e,0),Me=e=>Ct(0,e),H=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,s=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,i=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,c=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,a=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,p=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,x=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return ct([r,s,n,i,o,c,a,l,m,h,f,g,u,y,p,x])};class T{constructor(t){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,t?this.setMatrixValue(t):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?de(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?ct(t):typeof t=="object"?ye(t):this}toFloat32Array(t){return Float32Array.from(Vt(this,t))}toFloat64Array(t){return Float64Array.from(Vt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return H(this,t)}translate(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=0),typeof o>"u"&&(o=0),H(this,be(n,i,o))}scale(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=t),typeof o>"u"&&(o=1),H(this,xe(n,i,o))}rotate(t,r,s){let n=t,i=r||0,o=s||0;return typeof t=="number"&&typeof r>"u"&&typeof s>"u"&&(o=n,n=0,i=0),H(this,Ae(n,i,o))}rotateAxisAngle(t,r,s,n){if([t,r,s,n].some(i=>Number.isNaN(+i)))throw new TypeError("CSSMatrix: expecting 4 values");return H(this,pe(t,r,s,n))}skewX(t){return H(this,Ce(t))}skewY(t){return H(this,Me(t))}skew(t,r){return H(this,Ct(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,s=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,i=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,s,n,i):{x:r,y:s,z:n,w:i}}}R(T,"Translate",be),R(T,"Rotate",Ae),R(T,"RotateAxisAngle",pe),R(T,"Scale",xe),R(T,"SkewX",Ce),R(T,"SkewY",Me),R(T,"Skew",Ct),R(T,"Multiply",H),R(T,"fromArray",ct),R(T,"fromMatrix",ye),R(T,"fromString",de),R(T,"toArray",Vt),R(T,"isCompatibleArray",fe),R(T,"isCompatibleObject",ge);const Z=(e,t,r)=>{const[s,n]=e,[i,o]=t;return[s+(i-s)*r,n+(o-n)*r]},lt=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),mt=(e,t,r,s)=>lt([e,t],[r,s]),It=(e,t,r,s,n)=>{let i={x:e,y:t};if(typeof n=="number"){const o=lt([e,t],[r,s]);if(n<=0)i={x:e,y:t};else if(n>=o)i={x:r,y:s};else{const[c,a]=Z([e,t],[r,s],n/o);i={x:c,y:a}}}return i},Rt=(e,t,r,s)=>{const{min:n,max:i}=Math;return[n(e,r),n(t,s),i(e,r),i(t,s)]},Pe={getLineBBox:Rt,getLineLength:mt,getPointAtLineLength:It},Et=(e,t,r)=>{const s=r/2,n=Math.sin(s),i=Math.cos(s),o=e**2*n**2,c=t**2*i**2,a=Math.sqrt(o+c)*r;return Math.abs(a)},_=(e,t,r,s,n,i)=>{const{sin:o,cos:c}=Math,a=c(n),l=o(n),m=r*c(i),h=s*o(i);return[e+a*m-l*h,t+l*m+a*h]},jt=(e,t)=>{const{x:r,y:s}=e,{x:n,y:i}=t,o=r*n+s*i,c=Math.sqrt((r**2+s**2)*(n**2+i**2));return(r*i-s*n<0?-1:1)*Math.acos(o/c)},Mt=(e,t,r,s,n,i,o,c,a)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(s);const x=(n%360+360)%360*(g/180);if(e===c&&t===a)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:c,y:a}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(c+e)/2,y:(a+t)/2}};const C=(e-c)/2,d=(t-a)/2,A={x:h(x)*C+m(x)*d,y:-m(x)*C+h(x)*d},M=A.x**2/u**2+A.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const S=u**2*y**2-u**2*A.y**2-y**2*A.x**2,q=u**2*A.y**2+y**2*A.x**2;let $=S/q;$=$<0?0:$;const v=(i!==o?1:-1)*f($),N={x:v*(u*A.y/y),y:v*(-(y*A.x)/u)},O={x:h(x)*N.x-m(x)*N.y+(e+c)/2,y:m(x)*N.x+h(x)*N.y+(t+a)/2},Y={x:(A.x-N.x)/u,y:(A.y-N.y)/y},k=jt({x:1,y:0},Y),P={x:(-A.x-N.x)/u,y:(-A.y-N.y)/y};let V=jt(Y,P);!o&&V>0?V-=2*g:o&&V<0&&(V+=2*g),V%=2*g;const B=k+V;return{center:O,startAngle:k,endAngle:B,rx:u,ry:y}},Dt=(e,t,r,s,n,i,o,c,a)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=Mt(e,t,r,s,n,i,o,c,a);return Et(l,m,f-h)},Se=(e,t,r,s,n,i,o,c,a,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=Mt(e,t,r,s,n,i,o,c,a);if(typeof l=="number"){const p=Et(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=p)m={x:c,y:a};else{if(e===c&&t===a)return{x:c,y:a};if(f===0||g===0)return It(e,t,c,a,l);const{PI:x,cos:C,sin:d}=Math,A=y-u,S=(n%360+360)%360*(x/180),q=u+A*(l/p),$=f*C(q),v=g*d(q);m={x:C(S)*$-d(S)*v+h.x,y:d(S)*$+C(S)*v+h.y}}}return m},Te=(e,t,r,s,n,i,o,c,a)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=Mt(e,t,r,s,n,i,o,c,a),u=g-f,{min:y,max:p,tan:x,atan2:C,PI:d}=Math,{x:A,y:M}=l,S=n*d/180,q=x(S),$=C(-h*q,m),v=$,N=$+d,O=C(h,m*q),Y=O+d,k=[c],P=[a];let V=y(e,c),B=p(e,c),D=y(t,a),U=p(t,a);const at=g-u*1e-5,tt=_(A,M,m,h,S,at),L=g-u*.99999,I=_(A,M,m,h,S,L);if(tt[0]>B||I[0]>B){const z=_(A,M,m,h,S,v);k.push(z[0]),P.push(z[1])}if(tt[0]U||I[1]>U){const z=_(A,M,m,h,S,O);k.push(z[0]),P.push(z[1])}return V=y.apply([],k),D=y.apply([],P),B=p.apply([],k),U=p.apply([],P),[V,D,B,U]},Ne={angleBetween:jt,arcLength:Et,arcPoint:_,getArcBBox:Te,getArcLength:Dt,getArcProps:Mt,getPointAtArcLength:Se},Qt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],we=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Le=e=>{const t=[];for(let r=e,s=r.length,n=s-1;s>1;s-=1,n-=1){const i=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const s=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:s*n[0].x+t*n[1].x,y:s*n[0].y+t*n[1].y,t};const i=s*s,o=t*t;let c=0,a=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],c=i,a=s*t*2,l=o):r===3&&(c=i*s,a=i*t*3,l=s*o*3,m=t*o),{x:c*n[0].x+a*n[1].x+l*n[2].x+m*n[3].x,y:c*n[0].y+a*n[1].y+l*n[2].y+m*n[3].y,t}},ze=(e,t)=>{const r=e(t),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},qe=e=>{const r=Qt.length;let s=0;for(let n=0,i;n{const t=[];for(let s=0,n=e.length,i=2;sve(r[0],s))},$e=1e-8,Pt=([e,t,r])=>{const s=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[s,n];const i=(e*r-t*t)/(e-2*t+r);return i{const n=e-3*t+3*r-s;if(Math.abs(n)<$e)return e===s&&e===t?[e,s]:Pt([e,-.5*e+1.5*t,e-3*t+3*r]);const i=-e*r+e*s-t*r-t*s+t*t+r*r;if(i<=0)return[Math.min(e,s),Math.max(e,s)];const o=Math.sqrt(i);let c=Math.min(e,s),a=Math.max(e,s);const l=e-2*t+r;for(let m=(l+o)/n,h=1;h<=2;m=(l-o)/n,h++)if(m>0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fa&&(a=f)}return[c,a]},ke={bezierLength:qe,calculateBezier:ze,CBEZIER_MINMAX_EPSILON:$e,computeBezier:ve,Cvalues:we,deriveBezier:Le,getBezierLength:ut,minmaxC:Zt,minmaxQ:Pt,Tvalues:Qt},Ve=([e,t,r,s,n,i,o,c],a)=>{const l=1-a;return{x:l**3*e+3*l**2*a*r+3*l*a**2*n+a**3*o,y:l**3*t+3*l**2*a*s+3*l*a**2*i+a**3*c}},St=(e,t,r,s,n,i,o,c)=>ut([e,t,r,s,n,i,o,c]),Ie=(e,t,r,s,n,i,o,c,a)=>{const l=typeof a=="number";let m={x:e,y:t};if(l){const h=ut([e,t,r,s,n,i,o,c]);a<=0||(a>=h?m={x:o,y:c}:m=Ve([e,t,r,s,n,i,o,c],a/h))}return m},Ot=(e,t,r,s,n,i,o,c)=>{const a=Zt([e,r,n,o]),l=Zt([t,s,i,c]);return[a[0],l[0],a[1],l[1]]},Re={getCubicBBox:Ot,getCubicLength:St,getPointAtCubicLength:Ie,getPointAtCubicSegmentLength:Ve},Ee=([e,t,r,s,n,i],o)=>{const c=1-o;return{x:c**2*e+2*c*o*r+o**2*n,y:c**2*t+2*c*o*s+o**2*i}},Tt=(e,t,r,s,n,i)=>ut([e,t,r,s,n,i]),je=(e,t,r,s,n,i,o)=>{const c=typeof o=="number";let a={x:e,y:t};if(c){const l=ut([e,t,r,s,n,i]);o<=0||(o>=l?a={x:n,y:i}:a=Ee([e,t,r,s,n,i],o/l))}return a},Bt=(e,t,r,s,n,i)=>{const o=Pt([e,r,n]),c=Pt([t,s,i]);return[o[0],c[0],o[1],c[1]]},De={getPointAtQuadLength:je,getPointAtQuadSegmentLength:Ee,getQuadBBox:Bt,getQuadLength:Tt},Qe={polygonArea:e=>{const t=e.length;let r=-1,s,n=e[t-1],i=0;for(;++re.reduce((t,r,s)=>s?t+lt(e[s-1],r):0,0)},et=(e,t,r)=>{const{sin:s,cos:n}=Math,i=e*n(r)-t*s(r),o=e*s(r)+t*n(r);return{x:i,y:o}},w=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},J={origin:[0,0,0],round:4},K={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Nt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:s}=e;for(;s.length>=K[r]&&(r==="m"&&s.length>2?(e.segments.push([t].concat(s.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(s.splice(0,K[r]))),!!K[r]););},Q="SVGPathCommander Error",Ht=e=>{const{index:t,pathValue:r}=e,s=r.charCodeAt(t);if(s===48){e.param=0,e.index+=1;return}if(s===49){e.param=1,e.index+=1;return}e.err=`${Q}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},F=e=>e>=48&&e<=57,G="Invalid path value",Ft=e=>{const{max:t,pathValue:r,index:s}=e;let n=s,i=!1,o=!1,c=!1,a=!1,l;if(n>=t){e.err=`${Q}: ${G} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!F(l)&&l!==46){e.err=`${Q}: ${G} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(i=l===48,n+=1,l=r.charCodeAt(n),i&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),W=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},_t=e=>F(e)||e===43||e===45||e===46,Jt=e=>(e|32)===97,Kt=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},wt=e=>{var a;const{max:t,pathValue:r,index:s,segments:n}=e,i=r.charCodeAt(s),o=K[r[s].toLowerCase()];if(e.segmentStart=s,!Ut(i)){e.err=`${Q}: ${G} "${r[s]}" is not a path command at index ${s}`;return}const c=n[n.length-1];if(!Kt(i)&&((a=c==null?void 0:c[0])==null?void 0:a.toLocaleLowerCase())==="z"){e.err=`${Q}: ${G} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(e.index+=1,W(e),e.data=[],!o){Nt(e);return}for(;;){for(let l=o;l>0;l-=1){if(Jt(i)&&(l===3||l===4)?Ht(e):Ft(e),e.err.length)return;e.data.push(e.param),W(e),e.index=e.max||!_t(r.charCodeAt(e.index)))break}Nt(e)};class Lt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const E=e=>{if(typeof e!="string")return e.slice(0);const t=new Lt(e);for(W(t);t.index{const[n]=e,i=n.toUpperCase();if(t===0||i===n)return e;if(i==="A")return[i,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+s];if(i==="V")return[i,e[1]+s];if(i==="H")return[i,e[1]+r];if(i==="L")return[i,e[1]+r,e[2]+s];{const c=[],a=e.length;for(let l=1;l{let r=e.length,s,n="M",i="M",o=!1,c=0,a=0,l=0,m=0,h=0;for(let f=0;f{const t=E(e);return j(t,nt)},vt=(e,t,r,s)=>{const[n]=e,i=n.toLowerCase();if(t===0||n===i)return e;if(i==="a")return[i,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-s];if(i==="v")return[i,e[1]-s];if(i==="h")return[i,e[1]-r];if(i==="l")return[i,e[1]-r,e[2]-s];{const c=[],a=e.length;for(let l=1;l{const t=E(e);return j(t,vt)},ft=(e,t,r,s,n,i,o,c,a,l)=>{let m=e,h=t,f=r,g=s,u=c,y=a;const p=Math.PI*120/180,x=Math.PI/180*(+n||0);let C=[],d,A,M,S,q;if(l)[A,M,S,q]=l;else{d=et(m,h,-x),m=d.x,h=d.y,d=et(u,y,-x),u=d.x,y=d.y;const L=(m-u)/2,I=(h-y)/2;let z=L*L/(f*f)+I*I/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);const ue=f*f,he=g*g,Ye=(i===o?-1:1)*Math.sqrt(Math.abs((ue*he-ue*I*I-he*L*L)/(ue*I*I+he*L*L)));S=Ye*f*I/g+(m+u)/2,q=Ye*-g*L/f+(h+y)/2,A=Math.asin(((h-q)/g*10**9>>0)/10**9),M=Math.asin(((y-q)/g*10**9>>0)/10**9),A=mM&&(A-=Math.PI*2),!o&&M>A&&(M-=Math.PI*2)}let $=M-A;if(Math.abs($)>p){const L=M,I=u,z=y;M=A+p*(o&&M>A?1:-1),u=S+f*Math.cos(M),y=q+g*Math.sin(M),C=ft(u,y,f,g,n,0,o,I,z,[M,L,S,q])}$=M-A;const v=Math.cos(A),N=Math.sin(A),O=Math.cos(M),Y=Math.sin(M),k=Math.tan($/4),P=4/3*f*k,V=4/3*g*k,B=[m,h],D=[m+P*N,h-V*v],U=[u+P*Y,y-V*O],at=[u,y];if(D[0]=2*B[0]-D[0],D[1]=2*B[1]-D[1],l)return[D[0],D[1],U[0],U[1],at[0],at[1]].concat(C);C=[D[0],D[1],U[0],U[1],at[0],at[1]].concat(C);const tt=[];for(let L=0,I=C.length;L{const o=.3333333333333333,c=2/3;return[o*e+c*r,o*t+c*s,o*n+c*r,o*i+c*s,n,i]},zt=(e,t,r,s)=>{const n=Z([e,t],[r,s],.3333333333333333),i=Z([e,t],[r,s],2/3);return[n[0],n[1],i[0],i[1],r,s]},Yt=(e,t)=>{const[r]=e,s=e.slice(1).map(Number),[n,i]=s,{x1:o,y1:c,x:a,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=i,e):r==="A"?["C"].concat(ft(o,c,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(t.qx=n,t.qy=i,["C"].concat(Xt(o,c,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(zt(o,c,n,i)):r==="Z"?["C"].concat(zt(o,c,a,l)):e},gt=(e,t)=>{const[r]=e,s=r.toUpperCase(),n=r!==s,{x1:i,y1:o,x2:c,y2:a,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(s)||(t.qx=null,t.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",e[1]+(n?l:0),o];if(s==="V")return["L",i,e[1]+(n?m:0)];if(s==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const g=i*2-c,u=o*2-a;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(s==="T"){const g=i*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(s==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return e},rt={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},yt=e=>{const t={...rt},r=E(e);return j(r,(s,n,i,o)=>{t.x=i,t.y=o;const c=gt(s,t);let a=Yt(c,t);a[0]==="C"&&a.length>7&&(r.splice(n+1,0,["C"].concat(a.slice(7))),a=a.slice(0,7));const m=a.length;return t.x1=+a[m-2],t.y1=+a[m-1],t.x2=+a[m-4]||t.x1,t.y2=+a[m-3]||t.y1,a})},qt=(e,t)=>{const r=e.length;let{round:s}=J,n=e[0],i="";s=t==="off"||typeof t=="number"&&t>=0?t:typeof s=="number"&&s>=0?s:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=E(e);let r="M",s=0,n=0;const{max:i,min:o}=Math;let c=1/0,a=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,p=0,x=0,C=0,d=0,A=0;j(t,(q,$,v,N)=>{[r]=q;const O=r.toUpperCase(),k=O!==r?nt(q,$,v,N):q.slice(0),P=O==="V"?["L",v,k[1]]:O==="H"?["L",k[1],N]:k;if([r]=P,"TQ".includes(O)||(d=0,A=0),r==="M")[,s,n]=P,h=s,f=n,g=s,u=n;else if(r==="L")[h,f,g,u]=Rt(v,N,P[1],P[2]);else if(r==="A")[h,f,g,u]=Te(v,N,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(r==="S"){const V=y*2-x,B=p*2-C;[h,f,g,u]=Ot(v,N,V,B,P[1],P[2],P[3],P[4])}else r==="C"?[h,f,g,u]=Ot(v,N,P[1],P[2],P[3],P[4],P[5],P[6]):r==="T"?(d=y*2-d,A=p*2-A,[h,f,g,u]=Bt(v,N,d,A,P[1],P[2])):r==="Q"?(d=P[1],A=P[2],[h,f,g,u]=Bt(v,N,P[1],P[2],P[3],P[4])):r==="Z"&&([h,f,g,u]=Rt(v,N,s,n));c=o(h,c),a=o(f,a),l=i(g,l),m=i(u,m),[y,p]=r==="Z"?[s,n]:P.slice(-2),[x,C]=r==="C"?[P[3],P[4]]:r==="S"?[P[1],P[2]]:[y,p]});const M=l-c,S=m-a;return{width:M,height:S,x:c,y:a,x2:l,y2:m,cx:c+M/2,cy:a+S/2,cz:Math.max(M,S)+Math.min(M,S)/2}},X=e=>{const t=E(e);let r=0,s=0,n=0,i=0,o=0,c=0,a="M",l=0,m=0,h=0;return j(t,(f,g,u,y)=>{[a]=f;const p=a.toUpperCase(),C=p!==a?nt(f,g,u,y):f.slice(0),d=p==="V"?["L",u,C[1]]:p==="H"?["L",C[1],y]:C;if([a]=d,"TQ".includes(p)||(o=0,c=0),a==="M")[,l,m]=d;else if(a==="L")h+=mt(u,y,d[1],d[2]);else if(a==="A")h+=Dt(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(a==="S"){const A=r*2-n,M=s*2-i;h+=St(u,y,A,M,d[1],d[2],d[3],d[4])}else a==="C"?h+=St(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):a==="T"?(o=r*2-o,c=s*2-c,h+=Tt(u,y,o,c,d[1],d[2])):a==="Q"?(o=d[1],c=d[2],h+=Tt(u,y,d[1],d[2],d[3],d[4])):a==="Z"&&(h+=mt(u,y,l,m));[r,s]=a==="Z"?[l,m]:d.slice(-2),[n,i]=a==="C"?[d[3],d[4]]:a==="S"?[d[1],d[2]]:[r,s]}),h},dt=1e-5,st=e=>{const t=E(e),r={...rt};return j(t,(s,n,i,o)=>{r.x=i,r.y=o;const c=gt(s,r),a=c.length;return r.x1=+c[a-2],r.y1=+c[a-1],r.x2=+c[a-4]||r.x1,r.y2=+c[a-3]||r.y1,c})},it=(e,t)=>{const r=st(e);let s=!1,n=[],i="M",o=0,c=0,[a,l]=r[0].slice(1);const m=typeof t=="number";let h={x:a,y:l},f=0,g=h,u=0;return!m||t{if([i]=y,s=i==="M",n=s?n:[x,C].concat(y.slice(1)),s?([,a,l]=y,h={x:a,y:l},f=0):i==="L"?(h=It(n[0],n[1],n[2],n[3],t-u),f=mt(n[0],n[1],n[2],n[3])):i==="A"?(h=Se(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=Dt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):i==="C"?(h=Ie(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=St(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):i==="Q"?(h=je(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=Tt(n[0],n[1],n[2],n[3],n[4],n[5])):i==="Z"&&(n=[x,C,a,l],h={x:a,y:l},f=mt(n[0],n[1],n[2],n[3])),[o,c]=n.slice(-2),uu-dt?{x:o,y:c}:g)},$t=(e,t)=>{const r=E(e);let s=r.slice(0),n=X(s),i=s.length-1,o=0,c=0,a=r[0];if(i<=0||!t||!Number.isFinite(t))return{segment:a,index:0,length:c,lengthAtSegment:o};if(t>=n)return s=r.slice(0,-1),o=X(s),c=n-o,a=r[i],{segment:a,index:i,length:c,lengthAtSegment:o};const l=[];for(;i>0;)a=s[i],s=s.slice(0,-1),o=X(s),c=n-o,n=o,l.push({segment:a,index:i,length:c,lengthAtSegment:o}),i-=1;return l.find(({lengthAtSegment:m})=>m<=t)},bt=(e,t)=>{const r=E(e),s=st(r),n=X(s),i=A=>{const M=A.x-t.x,S=A.y-t.y;return M*M+S*S};let o=8,c,a={x:0,y:0},l=0,m=0,h=1/0;for(let A=0;A<=n;A+=o)c=it(s,A),l=i(c),l1e-6&&(u=m-o,f=it(s,u),p=i(f),y=m+o,g=it(s,y),x=i(g),u>=0&&pbt(e,t).closest,rn=(e,t,r,s,n,i,o,c)=>3*((c-t)*(r+n)-(o-e)*(s+i)+s*(e-n)-r*(t-i)+c*(n+e/3)-o*(i+t/3))/20,ee=e=>{let t=0,r=0,s=0;return yt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return s=rn(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),s}}).reduce((n,i)=>n+i,0)},Oe=e=>ee(yt(e))>=0,Be=(e,t)=>$t(e,t).segment,He=(e,t)=>bt(e,t).segment,At=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return K[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,ne=e=>At(e)&&e.every(([t])=>t===t.toUpperCase()),re=e=>ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),Fe=e=>re(e)&&e.every(([t])=>"MC".includes(t)),Ge=(e,t)=>{const{distance:r}=bt(e,t);return Math.abs(r)At(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),se=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Lt(e);for(W(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,sn=e=>{let{x1:t,y1:r,x2:s,y2:n}=e;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t,r],["L",s,n]]},on=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:t,cy:r,r:s}=e;return[t,r,s]=[t,r,s].map(n=>+n),[["M",t-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},cn=e=>{let{cx:t,cy:r}=e,s=e.rx||0,n=e.ry||s;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},ln=e=>{const t=+e.x||0,r=+e.y||0,s=+e.width,n=+e.height;let i=+(e.rx||0),o=+(e.ry||i);return i||o?(i*2>s&&(i-=(i*2-s)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+i,r],["h",s-i*2],["s",i,0,i,o],["v",n-o*2],["s",0,o,-i,o],["h",-s+i*2],["s",-i,0,-i,-o],["v",-n+o*2],["s",0,-o,i,-o]]):[["M",t,r],["h",s],["v",n],["H",t],["Z"]]},ie=e=>{const t=Object.keys(ot),r=_e(e),s=r?e.tagName:null;if(s&&[...t,"path"].every(a=>s!==a))throw TypeError(`${Q}: "${s}" is not SVGElement`);const n=r?s:e.type,i=ot[n],o={type:n};r?i.forEach(a=>{o[a]=e.getAttribute(a)}):Object.assign(o,e);let c=[];return n==="circle"?c=an(o):n==="ellipse"?c=cn(o):["polyline","polygon"].includes(n)?c=on(o):n==="rect"?c=ln(o):n==="line"?c=sn(o):["glyph","path"].includes(n)&&(c=E(r?e.getAttribute("d")||"":e.d||"")),At(c)&&c.length?c:!1},Je=(e,t,r)=>{const s=r||document,n=Object.keys(ot),i=_e(e),o=i?e.tagName:null;if(o==="path")throw TypeError(`${Q}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${Q}: "${o}" is not SVGElement`);const c=s.createElementNS("http://www.w3.org/2000/svg","path"),a=i?o:e.type,l=ot[a],m={type:a},h=J.round,f=ie(e),g=f&&f.length?qt(f,h):"";return i?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||c.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&c.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),se(g)?(c.setAttribute("d",g),t&&i&&(e.before(c,e),e.remove()),c):!1},oe=(e,t,r,s)=>{const[n]=e,{round:i}=J,o=i,c=t.slice(1),{x1:a,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=c.slice(-2),p=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(w(f,o)===w(u,o))return["V",y];if(w(g,o)===w(y,o))return["H",u]}else if(n==="C"){const[x,C]=c;if(r.x1=x,r.y1=C,"CS".includes(s)&&(w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o)||w(a,o)===w(m*2-f,o)&&w(l,o)===w(h*2-g,o)))return["S",c[2],c[3],c[4],c[5]]}else if(n==="Q"){const[x,C]=c;if(r.qx=x,r.qy=C,"QT".includes(s)&&w(x,o)===w(a*2-m,o)&&w(C,o)===w(l*2-h,o))return["T",c[2],c[3]]}return p},pt=(e,t)=>{const r=e.slice(1).map(s=>w(s,t));return[e[0]].concat(r)},ae=(e,t)=>{const r=ht(e),s=typeof t=="number"&&t>=0?t:2,n={...rt},i=[];let o="M",c="Z";return j(r,(a,l,m,h)=>{n.x=m,n.y=h;const f=gt(a,n);let g=a;if([o]=a,i[l]=o,l){c=i[l-1];const y=oe(a,f,n,c),p=pt(y,s),x=p.join(""),C=vt(y,l,m,h),d=pt(C,s),A=d.join("");g=x.length{const t=ht(e),r=st(t),s=t.length,n=t[s-1][0]==="Z",i=j(t,(o,c)=>{const a=r[c],l=c&&t[c-1],m=l&&l[0],h=t[c+1],f=h&&h[0],[g]=o,[u,y]=r[c?c-1:s-1].slice(-2);let p=o;switch(g){case"M":p=n?["Z"]:[g,u,y];break;case"A":p=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?p=["S",o[1],o[2],u,y]:p=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?p=["C",a[3],a[4],a[1],a[2],u,y]:p=[g,a[1],a[2],u,y];break;case"Q":h&&f==="T"?p=["T",u,y]:p=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?p=["Q",a[1],a[2],u,y]:p=[g,u,y];break;case"Z":p=["M",u,y];break;case"H":p=[g,u];break;case"V":p=[g,y];break;default:p=[g].concat(o.slice(1,-2),u,y)}return p});return n?i.reverse():[i[0]].concat(i.slice(1).reverse())},ce=e=>{const t=[];let r,s=-1,n=0,i=0,o=0,c=0;const a={...rt};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(s+=1,[n,i]=u,n+=g?a.x:0,i+=g?a.y:0,o=n,c=i,r=[g?[h,o,c]:l]):(h==="Z"?(n=o,i=c):h==="H"?([,n]=l,n+=g?a.x:0):h==="V"?([,i]=l,i+=g?a.y:0):([n,i]=l.slice(-2),n+=g?a.x:0,i+=g?a.y:0),r.push(l)),a.x=n,a.y=i,t[s]=r}),t},le=e=>{let t=new T;const{origin:r}=e,[s,n]=r,{translate:i}=e,{rotate:o}=e,{skew:c}=e,{scale:a}=e;return Array.isArray(i)&&i.length>=2&&i.every(l=>!Number.isNaN(+l))&&i.some(l=>l!==0)?t=t.translate(...i):typeof i=="number"&&!Number.isNaN(i)&&(t=t.translate(i)),(o||c||a)&&(t=t.translate(s,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(c)&&c.length===2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==0)?(t=c[0]?t.skewX(c[0]):t,t=c[1]?t.skewY(c[1]):t):typeof c=="number"&&!Number.isNaN(c)&&(t=t.skewX(c)),Array.isArray(a)&&a.length>=2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==1)?t=t.scale(...a):typeof a=="number"&&!Number.isNaN(a)&&(t=t.scale(a)),t=t.translate(-s,-n)),t},mn=(e,t)=>{let r=T.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},kt=(e,t,r)=>{const[s,n,i]=r,[o,c,a]=mn(e,[t[0],t[1],0,1]),l=o-s,m=c-n,h=a-i;return[l*(Math.abs(i)/Math.abs(h)||1)+s,m*(Math.abs(i)/Math.abs(h)||1)+n]},me=(e,t)=>{let r=0,s=0,n=0,i=0,o=0,c=0,a="M";const l=E(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:J.origin});const h=t.origin,f=le(t);return f.isIdentity?l.slice(0):j(l,(g,u,y,p)=>{[a]=g;const x=a.toUpperCase(),d=x!==a?nt(g,u,y,p):g.slice(0);let A=x==="A"?["C"].concat(ft(y,p,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):x==="V"?["L",y,d[1]]:x==="H"?["L",d[1],p]:d;a=A[0];const M=a==="C"&&A.length>7,S=M?A.slice(0,7):A.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(A.slice(7))),A=S),a==="L")[n,i]=kt(f,[A[1],A[2]],h),r!==n&&s!==i?A=["L",n,i]:s===i?A=["H",n]:r===n&&(A=["V",i]);else for(o=1,c=A.length;o{const t=e.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},We=(e,t)=>{let{round:r}=J;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):j(e,s=>pt(s,r))},Xe=(e,t=.5)=>{const r=t,s=e.slice(0,2),n=e.slice(2,4),i=e.slice(4,6),o=e.slice(6,8),c=Z(s,n,r),a=Z(n,i,r),l=Z(i,o,r),m=Z(c,a,r),h=Z(a,l,r),f=Z(m,h,r);return[["C",c[0],c[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class un{constructor(t,r){const s=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${Q}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=E(t);const{round:i,origin:o}=s;let c;Number.isInteger(i)||i==="off"?c=i:c=J.round;let a=J.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);a=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=c,this.origin=a,this}get bbox(){return te(this.segments)}get length(){return X(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return it(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=ht(t),this}toRelative(){const{segments:t}=this;return this.segments=Wt(t),this}toCurve(){const{segments:t}=this;return this.segments=yt(t),this}reverse(t){const{segments:r}=this,s=ce(r),n=s.length>1?s:!1,i=n?n.map((c,a)=>t?a?xt(c):c.slice(0):xt(c)):r.slice(0);let o=[];return n?o=i.flat(1):o=t?r:xt(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=st(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=ae(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(a=>a in t))return this;const{segments:r,origin:[s,n,i]}=this,o={};for(const[a,l]of Object.entries(t))a==="skew"&&Array.isArray(l)||(a==="rotate"||a==="translate"||a==="origin"||a==="scale")&&Array.isArray(l)?o[a]=l.map(Number):a!=="origin"&&typeof Number(l)=="number"&&(o[a]=Number(l));const{origin:c}=o;if(Array.isArray(c)&&c.length>=2){const[a,l,m]=c.map(Number);o.origin=[Number.isNaN(a)?s:a,Number.isNaN(l)?n:l,m||i]}else o.origin=[s,n,i];return this.segments=me(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return qt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return T}static get arcTools(){return Ne}static get bezierTools(){return ke}static get cubicTools(){return Re}static get lineTools(){return Pe}static get polygonTools(){return Qe}static get quadTools(){return De}static get pathToAbsolute(){return ht}static get pathToRelative(){return Wt}static get pathToCurve(){return yt}static get pathToString(){return qt}static get distanceSquareRoot(){return lt}static get midPoint(){return Z}static get rotateVector(){return et}static get roundTo(){return w}static get parsePathString(){return E}static get finalizeSegment(){return Nt}static get invalidPathValue(){return G}static get isArcCommand(){return Jt}static get isDigit(){return F}static get isDigitStart(){return _t}static get isMoveCommand(){return Kt}static get isPathCommand(){return Ut}static get isSpace(){return Gt}static get paramsCount(){return K}static get paramsParser(){return rt}static get pathParser(){return Lt}static get scanFlag(){return Ht}static get scanParam(){return Ft}static get scanSegment(){return wt}static get skipSpaces(){return W}static get distanceEpsilon(){return dt}static get getClosestPoint(){return Ze}static get getDrawDirection(){return Oe}static get getPathArea(){return ee}static get getPathBBox(){return te}static get getPointAtLength(){return it}static get getPropertiesAtLength(){return $t}static get getPropertiesAtPoint(){return bt}static get getSegmentAtLength(){return Be}static get getSegmentOfPoint(){return He}static get getTotalLength(){return X}static get isAbsoluteArray(){return ne}static get isCurveArray(){return Fe}static get isNormalizedArray(){return re}static get isPathArray(){return At}static get isPointInStroke(){return Ge}static get isRelativeArray(){return Ue}static get isValidPath(){return se}static get shapeParams(){return ot}static get shapeToPath(){return Je}static get shapeToPathArray(){return ie}static get absolutizeSegment(){return nt}static get arcToCubic(){return ft}static get getSVGMatrix(){return le}static get iterate(){return j}static get lineToCubic(){return zt}static get normalizePath(){return st}static get normalizeSegment(){return gt}static get optimizePath(){return ae}static get projection2d(){return kt}static get quadToCubic(){return Xt}static get relativizeSegment(){return vt}static get reverseCurve(){return Ke}static get reversePath(){return xt}static get roundPath(){return We}static get roundSegment(){return pt}static get segmentToCubic(){return Yt}static get shortenSegment(){return oe}static get splitCubic(){return Xe}static get splitPath(){return ce}static get transformPath(){return me}}return b.CSSMatrix=T,b.absolutizeSegment=nt,b.arcToCubic=ft,b.arcTools=Ne,b.bezierTools=ke,b.cubicTools=Re,b.default=un,b.distanceEpsilon=dt,b.distanceSquareRoot=lt,b.finalizeSegment=Nt,b.getClosestPoint=Ze,b.getDrawDirection=Oe,b.getPathArea=ee,b.getPathBBox=te,b.getPointAtLength=it,b.getPropertiesAtLength=$t,b.getPropertiesAtPoint=bt,b.getSVGMatrix=le,b.getSegmentAtLength=Be,b.getSegmentOfPoint=He,b.getTotalLength=X,b.invalidPathValue=G,b.isAbsoluteArray=ne,b.isArcCommand=Jt,b.isCurveArray=Fe,b.isDigit=F,b.isDigitStart=_t,b.isMoveCommand=Kt,b.isNormalizedArray=re,b.isPathArray=At,b.isPathCommand=Ut,b.isPointInStroke=Ge,b.isRelativeArray=Ue,b.isSpace=Gt,b.isValidPath=se,b.iterate=j,b.lineToCubic=zt,b.lineTools=Pe,b.midPoint=Z,b.normalizePath=st,b.normalizeSegment=gt,b.optimizePath=ae,b.paramsCount=K,b.paramsParser=rt,b.parsePathString=E,b.pathParser=Lt,b.pathToAbsolute=ht,b.pathToCurve=yt,b.pathToRelative=Wt,b.pathToString=qt,b.polygonTools=Qe,b.projection2d=kt,b.quadToCubic=Xt,b.quadTools=De,b.relativizeSegment=vt,b.reverseCurve=Ke,b.reversePath=xt,b.rotateVector=et,b.roundPath=We,b.roundSegment=pt,b.roundTo=w,b.scanFlag=Ht,b.scanParam=Ft,b.scanSegment=wt,b.segmentToCubic=Yt,b.shapeParams=ot,b.shapeToPath=Je,b.shapeToPathArray=ie,b.shortenSegment=oe,b.skipSpaces=W,b.splitCubic=Xe,b.splitPath=ce,b.transformPath=me,Object.defineProperties(b,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),b}({}); //# sourceMappingURL=svg-path-commander.js.map diff --git a/docs/svg-path-commander.js.map b/docs/svg-path-commander.js.map index 20e9acd..6739cf9 100755 --- a/docs/svg-path-commander.js.map +++ b/docs/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\n\nexport {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\nexport { polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport * as arcTools from \"./math/arcTools\";\nimport * as bezierTools from \"./math/bezier\";\nimport * as cubicTools from \"./math/cubicTools\";\nimport * as lineTools from \"./math/lineTools\";\nimport * as quadTools from \"./math/quadTools\";\nimport * as polygonTools from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nconst distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n\nexport default distanceSquareRoot;\n","import midPoint from \"./midPoint\";\nimport distanceSquareRoot from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the extrema for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n}\n\nexport {\n lineTools,\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance a [0-1] ratio\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n arcTools,\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n}","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n}\n\nexport {\n bezierTools,\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n}\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the boundig box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n}\n\nexport {\n quadTools,\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n","import distanceSquareRoot from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n /* eslint-disable-next-line */\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonTools, polygonArea, polygonLength };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nconst rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n\nexport default rotateVector;\n","const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n\nexport default paramsCount;\n","import paramsCount from \"./paramsCount\";\nimport PathParser from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path the `PathParser` instance\n */\nconst finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCount[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path the `PathParser` instance\n */\nconst scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n\nexport default scanFlag;\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path the `PathParser` instance\n */\nconst scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\nexport default scanParam;\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nconst isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\nexport default isSpace;\n","import isSpace from \"./isSpace\";\nimport type PathParser from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path the `PathParser` instance\n */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\nexport default isPathCommand;\n","import isDigit from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\nexport default isDigitStart;\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts from \"./paramsCount\";\nimport scanFlag from \"./scanFlag\";\nimport scanParam from \"./scanParam\";\nimport skipSpaces from \"./skipSpaces\";\nimport isPathCommand from \"./isPathCommand\";\nimport isDigitStart from \"./isDigitStart\";\nimport isArcCommand from \"./isArcCommand\";\nimport isMoveCommand from \"./isMoveCommand\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./error\";\n\nimport type PathParser from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path the `PathParser` instance\n */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) && lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\nexport default scanSegment;\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString\n */\nexport default class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import scanSegment from \"./scanSegment\";\nimport skipSpaces from \"./skipSpaces\";\nimport PathParser from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `pathArray`.\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n\nexport default parsePathString;\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nconst absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nconst relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n\nexport default relativizeSegment;\n","import type { PathArray, RelativeArray } from \"../types\";\nimport parsePathString from \"../parser/parsePathString\";\nimport iterate from \"../process/iterate\";\nimport relativizeSegment from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput the path string | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\n","import rotateVector from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @return the resulting cubic-bezier segment(s)\n */\nconst arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nexport default arcToCubic;\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nconst quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\nexport default quadToCubic;\n","import midPoint from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nconst lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\nexport default lineToCubic;\n","import arcToCubic from \"./arcToCubic\";\nimport quadToCubic from \"./quadToCubic\";\nimport lineToCubic from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n const { x1: px1, y1: py1, x: px, y: py } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n\nexport default paramsParser;\n","import segmentToCubic from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizeSegment from \"../process/normalizeSegment\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Parses a path string value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default pathToCurve;\n","import type { PathArray, PathSegment } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport roundTo from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the `pathArray` segments.\n *\n * @param path the `pathArray` object\n * @param roundOption amount of decimals to round values to\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n\nexport default pathToString;\n","import iterate from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\nconst getPathBBox = (pathInput: PathArray | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n\nexport default getPathBBox;\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport iterate from \"../process/iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\n\n/**\n * Returns the shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n });\n};\nexport default normalizePath;\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport iterate from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n\nexport default getPointAtLength;\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport parsePathString from \"../parser/parsePathString\";\nimport getTotalLength from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as PathArray;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport getPointAtLength from \"./getPointAtLength\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\nimport getTotalLength from \"./getTotalLength\";\nimport parsePathString from \"../parser/parsePathString\";\nimport normalizePath from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n\nexport default getPropertiesAtPoint;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\n","import pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path the shape `pathArray`\n * @returns the length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\nexport default getPathArea;\n","import getPathArea from \"./getPathArea\";\nimport pathToCurve from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\n","import type { PathArray, PathSegment } from \"../types\";\nimport getPropertiesAtLength from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCount[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\nexport default isPathArray;\n","import type { AbsoluteArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\nexport default isAbsoluteArray;\n","import type { NormalArray } from \"../types\";\nimport isAbsoluteArray from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\nexport default isNormalizedArray;\n","import { CurveArray } from \"../types\";\nimport isNormalizedArray from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nconst isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\nexport default isCurveArray;\n","import type { PathArray } from \"../types\";\nimport getPropertiesAtPoint from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nconst isPointInStroke = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\nexport default isPointInStroke;\n","import type { RelativeArray } from \"../types\";\nimport isPathArray from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nconst isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\nexport default isRelativeArray;\n","import scanSegment from \"../parser/scanSegment\";\nimport skipSpaces from \"../parser/skipSpaces\";\nimport PathParser from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nconst isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n\nexport default shapeParams;\n","const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n\nexport default isElement;\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport error from \"../parser/error\";\nimport parsePathString from \"../parser/parsePathString\";\nimport shapeParams from \"./shapeParams\";\nimport isPathArray from \"./isPathArray\";\nimport isElement from \"./isElement\";\n\n/**\n * Returns a new `pathArray` from line attributes.\n *\n * @param attr shape configuration\n * @returns a new line `pathArray`\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` from ellipse attributes.\n *\n * @param attr shape configuration\n * @return an ellipse `pathArray`\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new `pathArray` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\nexport default shapeToPathArray;\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport pathToString from \"../convert/pathToString\";\nimport defaultOptions from \"../options/options\";\nimport error from \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\n });\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n\nexport default shapeToPath;\n","import defaultOptions from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport roundTo from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nconst shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport shortenSegment from \"./shortenSegment\";\nimport paramsParser from \"../parser/paramsParser\";\nimport iterate from \"./iterate\";\nimport normalizeSegment from \"./normalizeSegment\";\nimport relativizeSegment from \"./relativizeSegment\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Optimizes a `pathArray` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : /* istanbul ignore next @preserve */ 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result = seg;\n [pathCommand] = seg;\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n\nexport default optimizePath;\n","import type {\n ASegment,\n CSegment,\n HSegment,\n MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\nimport pathToAbsolute from \"../convert/pathToAbsolute\";\nimport normalizePath from \"./normalizePath\";\nimport iterate from \"./iterate\";\n\n/**\n * Reverses all segments of a `pathArray` and returns a new `pathArray` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const [pathCommand] = segment;\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = (isClosed ? [\"Z\"] : [pathCommand, x, y]) as PathSegment;\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\nexport default getSVGMatrix;\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @return the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nconst projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\nexport default projection2d;\n","import getSVGMatrix from \"./getSVGMatrix\";\nimport projection2d from \"./projection2d\";\nimport defaultOptions from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"./absolutizeSegment\";\nimport arcToCubic from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a `pathArray` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n let pathCommand = \"M\";\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as typeof path;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as typeof path;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment =\n (isLongArc ? result.slice(0, 7) : result.slice(0)) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n });\n};\n\nexport default transformPath;\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n\nexport default reverseCurve;\n","import type { PathArray } from \"../types\";\nimport defaultOptions from \"../options/options\";\nimport iterate from \"./iterate\";\nimport roundSegment from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp \n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values\n *\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values\n *\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @param onlySubpath option to reverse all sub-paths except first\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically\n *\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally\n *\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;\n\nexport {\n CSSMatrix,\n arcTools,\n bezierTools,\n cubicTools,\n lineTools,\n polygonTools,\n quadTools,\n pathToAbsolute,\n pathToRelative,\n pathToCurve,\n pathToString,\n distanceSquareRoot,\n midPoint,\n rotateVector,\n roundTo,\n parsePathString,\n finalizeSegment,\n invalidPathValue,\n isArcCommand,\n isDigit,\n isDigitStart,\n isMoveCommand,\n isPathCommand,\n isSpace,\n paramsCount,\n paramsParser,\n pathParser,\n scanFlag,\n scanParam,\n scanSegment,\n skipSpaces,\n distanceEpsilon,\n getClosestPoint,\n getDrawDirection,\n getPathArea,\n getPathBBox,\n getPointAtLength,\n getPropertiesAtLength,\n getPropertiesAtPoint,\n getSegmentAtLength,\n getSegmentOfPoint,\n getTotalLength,\n isAbsoluteArray,\n isCurveArray,\n isNormalizedArray,\n isPathArray,\n isPointInStroke,\n isRelativeArray,\n isValidPath,\n shapeParams,\n shapeToPath,\n shapeToPathArray,\n absolutizeSegment,\n arcToCubic,\n getSVGMatrix,\n iterate,\n lineToCubic,\n normalizePath,\n normalizeSegment,\n optimizePath,\n projection2d,\n quadToCubic,\n relativizeSegment,\n reverseCurve,\n reversePath,\n roundPath,\n roundSegment,\n segmentToCubic,\n shortenSegment,\n splitCubic,\n splitPath,\n transformPath,\n};\n"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file