UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 25.3 kB
{"version":3,"file":"TextSVGExportMixin.mjs","sources":["../../../../src/shapes/Text/TextSVGExportMixin.ts"],"sourcesContent":["import { config } from '../../config';\nimport type { TSVGReviver } from '../../typedefs';\nimport { escapeXml } from '../../util/lang_string';\nimport { colorPropToSVG, createSVGRect } from '../../util/misc/svgParsing';\nimport { hasStyleChanged } from '../../util/misc/textStyles';\nimport { toFixed } from '../../util/misc/toFixed';\nimport { FabricObjectSVGExportMixin } from '../Object/FabricObjectSVGExportMixin';\nimport { type TextStyleDeclaration } from './StyledText';\nimport { JUSTIFY } from '../Text/constants';\nimport type { FabricText, GraphemeBBox } from './Text';\nimport { STROKE, FILL } from '../../constants';\nimport { createRotateMatrix } from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport { Point } from '../../Point';\nimport { matrixToSVG } from '../../util/misc/svgExport';\n\nconst multipleSpacesRegex = / +/g;\nconst dblQuoteRegex = /\"/g;\n\nfunction createSVGInlineRect(\n color: string,\n left: number,\n top: number,\n width: number,\n height: number,\n) {\n return `\\t\\t${createSVGRect(color, { left, top, width, height })}\\n`;\n}\n\nexport class TextSVGExportMixin extends FabricObjectSVGExportMixin {\n _toSVG(this: TextSVGExportMixin & FabricText): string[] {\n const offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n }\n\n toSVG(this: TextSVGExportMixin & FabricText, reviver?: TSVGReviver): string {\n const textSvg = this._createBaseSVGMarkup(this._toSVG(), {\n reviver,\n noStyle: true,\n withShadow: true,\n }),\n path = this.path;\n if (path) {\n return (\n textSvg +\n path._createBaseSVGMarkup(path._toSVG(), {\n reviver,\n withShadow: true,\n additionalTransform: matrixToSVG(this.calcOwnMatrix()),\n })\n );\n }\n return textSvg;\n }\n\n private _getSVGLeftTopOffsets(this: TextSVGExportMixin & FabricText) {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0),\n };\n }\n\n private _wrapSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n {\n textBgRects,\n textSpans,\n }: {\n textSpans: string[];\n textBgRects: string[];\n },\n ) {\n const noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textBgRects.join(''),\n '\\t\\t<text xml:space=\"preserve\" ',\n `font-family=\"${this.fontFamily.replace(dblQuoteRegex, \"'\")}\" `,\n `font-size=\"${this.fontSize}\" `,\n this.fontStyle ? `font-style=\"${this.fontStyle}\" ` : '',\n this.fontWeight ? `font-weight=\"${this.fontWeight}\" ` : '',\n textDecoration ? `text-decoration=\"${textDecoration}\" ` : '',\n this.direction === 'rtl' ? `direction=\"${this.direction}\" ` : '',\n 'style=\"',\n this.getSvgStyles(noShadow),\n '\"',\n this.addPaintOrder(),\n ' >',\n textSpans.join(''),\n '</text>\\n',\n ];\n }\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n private _getSVGTextAndBg(\n this: TextSVGExportMixin & FabricText,\n textTopOffset: number,\n textLeftOffset: number,\n ) {\n const textSpans: string[] = [],\n textBgRects: string[] = [];\n let height = textTopOffset,\n lineOffset;\n\n // bounding-box background\n this.backgroundColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n this.backgroundColor,\n -this.width / 2,\n -this.height / 2,\n this.width,\n this.height,\n ),\n );\n\n // text and text-background\n for (let i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.direction === 'rtl') {\n lineOffset += this.width;\n }\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(\n textBgRects,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n }\n this._setSVGTextLineText(\n textSpans,\n i,\n textLeftOffset + lineOffset,\n height,\n );\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans,\n textBgRects,\n };\n }\n\n private _createTextCharSpan(\n this: TextSVGExportMixin & FabricText,\n char: string,\n styleDecl: TextStyleDeclaration,\n left: number,\n top: number,\n charBox: GraphemeBBox,\n ) {\n const numFractionDigit = config.NUM_FRACTION_DIGITS;\n const styleProps = this.getSvgSpanStyles(\n styleDecl,\n char !== char.trim() || !!char.match(multipleSpacesRegex),\n ),\n fillStyles = styleProps ? `style=\"${styleProps}\"` : '',\n dy = styleDecl.deltaY,\n dySpan = dy ? ` dy=\"${toFixed(dy, numFractionDigit)}\" ` : '',\n { angle, renderLeft, renderTop, width } = charBox;\n let angleAttr = '';\n if (renderLeft !== undefined) {\n const wBy2 = width / 2;\n angle &&\n (angleAttr = ` rotate=\"${toFixed(radiansToDegrees(angle), numFractionDigit)}\"`);\n const m = createRotateMatrix({ angle: radiansToDegrees(angle!) });\n m[4] = renderLeft!;\n m[5] = renderTop!;\n const renderPoint = new Point(-wBy2, 0).transform(m);\n left = renderPoint.x;\n top = renderPoint.y;\n }\n\n return `<tspan x=\"${toFixed(left, numFractionDigit)}\" y=\"${toFixed(\n top,\n numFractionDigit,\n )}\" ${dySpan}${angleAttr}${fillStyles}>${escapeXml(char)}</tspan>`;\n }\n\n private _setSVGTextLineText(\n this: TextSVGExportMixin & FabricText,\n textSpans: string[],\n lineIndex: number,\n textLeftOffset: number,\n textTopOffset: number,\n ) {\n const lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.includes(JUSTIFY),\n line = this._textLines[lineIndex];\n let actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n style,\n boxWidth = 0,\n timeToRender;\n\n textTopOffset +=\n (lineHeight * (1 - this._fontSizeFraction)) / this.lineHeight;\n for (let i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || this.path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n } else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing or a path, we render char by char\n actualStyle =\n actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i);\n textSpans.push(\n this._createTextCharSpan(\n charsToRender,\n style,\n textLeftOffset,\n textTopOffset,\n charBox,\n ),\n );\n charsToRender = '';\n actualStyle = nextStyle;\n if (this.direction === 'rtl') {\n textLeftOffset -= boxWidth;\n } else {\n textLeftOffset += boxWidth;\n }\n boxWidth = 0;\n }\n }\n }\n\n private _setSVGTextLineBg(\n this: TextSVGExportMixin & FabricText,\n textBgRects: (string | number)[],\n i: number,\n leftOffset: number,\n textTopOffset: number,\n ) {\n const line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight;\n let boxWidth = 0,\n boxStart = 0,\n currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (let j = 0; j < line.length; j++) {\n const { left, width, kernedWidth } = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n boxStart = left;\n boxWidth = width;\n lastColor = currentColor;\n } else {\n boxWidth += kernedWidth;\n }\n }\n currentColor &&\n textBgRects.push(\n ...createSVGInlineRect(\n lastColor,\n leftOffset + boxStart,\n textTopOffset,\n boxWidth,\n heightOfLine,\n ),\n );\n }\n\n /**\n * @deprecated unused\n */\n _getSVGLineTopOffset(\n this: TextSVGExportMixin & FabricText,\n lineIndex: number,\n ) {\n let lineTopOffset = 0,\n j;\n for (j = 0; j < lineIndex; j++) {\n lineTopOffset += this.getHeightOfLine(j);\n }\n const lastHeight = this.getHeightOfLine(j);\n return {\n lineTop: lineTopOffset,\n offset:\n ((this._fontSizeMult - this._fontSizeFraction) * lastHeight) /\n (this.lineHeight * this._fontSizeMult),\n };\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles(this: TextSVGExportMixin & FabricText, skipShadow?: boolean) {\n return `${super.getSvgStyles(skipShadow)} text-decoration-thickness: ${toFixed((this.textDecorationThickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; white-space: pre;`;\n }\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n useWhiteSpace?: boolean,\n ) {\n const {\n fontFamily,\n strokeWidth,\n stroke,\n fill,\n fontSize,\n fontStyle,\n fontWeight,\n deltaY,\n textDecorationThickness,\n linethrough,\n overline,\n underline,\n } = style;\n\n const textDecoration = this.getSvgTextDecoration({\n underline: underline ?? this.underline,\n overline: overline ?? this.overline,\n linethrough: linethrough ?? this.linethrough,\n });\n const thickness = textDecorationThickness || this.textDecorationThickness;\n return [\n stroke ? colorPropToSVG(STROKE, stroke) : '',\n strokeWidth ? `stroke-width: ${strokeWidth}; ` : '',\n fontFamily\n ? `font-family: ${\n !fontFamily.includes(\"'\") && !fontFamily.includes('\"')\n ? `'${fontFamily}'`\n : fontFamily\n }; `\n : '',\n fontSize ? `font-size: ${fontSize}px; ` : '',\n fontStyle ? `font-style: ${fontStyle}; ` : '',\n fontWeight ? `font-weight: ${fontWeight}; ` : '',\n textDecoration\n ? `text-decoration: ${textDecoration}; text-decoration-thickness: ${toFixed((thickness * this.getObjectScaling().y) / 10, config.NUM_FRACTION_DIGITS)}%; `\n : '',\n fill ? colorPropToSVG(FILL, fill) : '',\n deltaY ? `baseline-shift: ${-deltaY}; ` : '',\n useWhiteSpace ? 'white-space: pre; ' : '',\n ].join('');\n }\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration(\n this: TextSVGExportMixin & FabricText,\n style: TextStyleDeclaration,\n ) {\n return (['overline', 'underline', 'line-through'] as const)\n .filter(\n (decoration) =>\n style[\n decoration.replace('-', '') as\n | 'overline'\n | 'underline'\n | 'linethrough'\n ],\n )\n .join(' ');\n }\n}\n"],"names":["multipleSpacesRegex","dblQuoteRegex","createSVGInlineRect","color","left","top","width","height","concat","createSVGRect","TextSVGExportMixin","FabricObjectSVGExportMixin","_toSVG","offsets","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","toSVG","reviver","textSvg","_createBaseSVGMarkup","noStyle","withShadow","path","additionalTransform","matrixToSVG","calcOwnMatrix","lineTop","getHeightOfLine","_ref","textBgRects","textSpans","noShadow","textDecoration","getSvgTextDecoration","join","fontFamily","replace","fontSize","fontStyle","fontWeight","direction","getSvgStyles","addPaintOrder","textTopOffset","textLeftOffset","lineOffset","backgroundColor","push","i","len","_textLines","length","_getLineLeftOffset","textBackgroundColor","styleHas","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","char","styleDecl","charBox","numFractionDigit","config","NUM_FRACTION_DIGITS","styleProps","getSvgSpanStyles","trim","match","fillStyles","dy","deltaY","dySpan","toFixed","angle","renderLeft","renderTop","angleAttr","undefined","wBy2","radiansToDegrees","m","createRotateMatrix","renderPoint","Point","transform","x","y","escapeXml","lineIndex","lineHeight","isJustify","textAlign","includes","JUSTIFY","line","actualStyle","nextStyle","charsToRender","style","boxWidth","timeToRender","_fontSizeFraction","charSpacing","__charBounds","kernedWidth","_reSpaceAndTab","test","getCompleteStyleDeclaration","hasStyleChanged","_getStyleDeclaration","leftOffset","heightOfLine","boxStart","currentColor","lastColor","getValueOfPropertyAt","j","_getSVGLineTopOffset","lineTopOffset","lastHeight","offset","_fontSizeMult","skipShadow","textDecorationThickness","getObjectScaling","useWhiteSpace","strokeWidth","stroke","fill","linethrough","overline","underline","thickness","colorPropToSVG","STROKE","FILL","filter","decoration"],"mappings":";;;;;;;;;;;;;AAgBA,MAAMA,mBAAmB,GAAG,MAAM,CAAA;AAClC,MAAMC,aAAa,GAAG,IAAI,CAAA;AAE1B,SAASC,mBAAmBA,CAC1BC,KAAa,EACbC,IAAY,EACZC,GAAW,EACXC,KAAa,EACbC,MAAc,EACd;AACA,EAAA,OAAA,MAAA,CAAAC,MAAA,CAAcC,aAAa,CAACN,KAAK,EAAE;IAAEC,IAAI;IAAEC,GAAG;IAAEC,KAAK;AAAEC,IAAAA,MAAAA;AAAO,GAAC,CAAC,EAAA,IAAA,CAAA,CAAA;AAClE,CAAA;AAEO,MAAMG,kBAAkB,SAASC,0BAA0B,CAAC;AACjEC,EAAAA,MAAMA,GAAkD;AACtD,IAAA,MAAMC,OAAO,GAAG,IAAI,CAACC,qBAAqB,EAAE;AAC1CC,MAAAA,SAAS,GAAG,IAAI,CAACC,gBAAgB,CAACH,OAAO,CAACI,OAAO,EAAEJ,OAAO,CAACK,QAAQ,CAAC,CAAA;AACtE,IAAA,OAAO,IAAI,CAACC,iBAAiB,CAACJ,SAAS,CAAC,CAAA;AAC1C,GAAA;EAEAK,KAAKA,CAAwCC,OAAqB,EAAU;IAC1E,MAAMC,OAAO,GAAG,IAAI,CAACC,oBAAoB,CAAC,IAAI,CAACX,MAAM,EAAE,EAAE;QACrDS,OAAO;AACPG,QAAAA,OAAO,EAAE,IAAI;AACbC,QAAAA,UAAU,EAAE,IAAA;AACd,OAAC,CAAC;MACFC,IAAI,GAAG,IAAI,CAACA,IAAI,CAAA;AAClB,IAAA,IAAIA,IAAI,EAAE;MACR,OACEJ,OAAO,GACPI,IAAI,CAACH,oBAAoB,CAACG,IAAI,CAACd,MAAM,EAAE,EAAE;QACvCS,OAAO;AACPI,QAAAA,UAAU,EAAE,IAAI;AAChBE,QAAAA,mBAAmB,EAAEC,WAAW,CAAC,IAAI,CAACC,aAAa,EAAE,CAAA;AACvD,OAAC,CAAC,CAAA;AAEN,KAAA;AACA,IAAA,OAAOP,OAAO,CAAA;AAChB,GAAA;AAEQR,EAAAA,qBAAqBA,GAAwC;IACnE,OAAO;AACLI,MAAAA,QAAQ,EAAE,CAAC,IAAI,CAACZ,KAAK,GAAG,CAAC;AACzBW,MAAAA,OAAO,EAAE,CAAC,IAAI,CAACV,MAAM,GAAG,CAAC;AACzBuB,MAAAA,OAAO,EAAE,IAAI,CAACC,eAAe,CAAC,CAAC,CAAA;KAChC,CAAA;AACH,GAAA;EAEQZ,iBAAiBA,CAAAa,IAAA,EASvB;IAAA,IAPA;MACEC,WAAW;AACXC,MAAAA,SAAAA;AAIF,KAAC,GAAAF,IAAA,CAAA;IAED,MAAMG,QAAQ,GAAG,IAAI;AACnBC,MAAAA,cAAc,GAAG,IAAI,CAACC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAClD,OAAO,CACLJ,WAAW,CAACK,IAAI,CAAC,EAAE,CAAC,EACpB,iCAAiC,EAAA9B,gBAAAA,CAAAA,MAAA,CACjB,IAAI,CAAC+B,UAAU,CAACC,OAAO,CAACvC,aAAa,EAAE,GAAG,CAAC,EAAAO,KAAAA,CAAAA,EAAAA,cAAAA,CAAAA,MAAA,CAC7C,IAAI,CAACiC,QAAQ,EAC3B,KAAA,CAAA,EAAA,IAAI,CAACC,SAAS,GAAA,eAAA,CAAAlC,MAAA,CAAkB,IAAI,CAACkC,SAAS,EAAO,KAAA,CAAA,GAAA,EAAE,EACvD,IAAI,CAACC,UAAU,oBAAAnC,MAAA,CAAmB,IAAI,CAACmC,UAAU,EAAA,KAAA,CAAA,GAAO,EAAE,EAC1DP,cAAc,wBAAA5B,MAAA,CAAuB4B,cAAc,EAAO,KAAA,CAAA,GAAA,EAAE,EAC5D,IAAI,CAACQ,SAAS,KAAK,KAAK,GAAA,cAAA,CAAApC,MAAA,CAAiB,IAAI,CAACoC,SAAS,EAAA,KAAA,CAAA,GAAO,EAAE,EAChE,SAAS,EACT,IAAI,CAACC,YAAY,CAACV,QAAQ,CAAC,EAC3B,GAAG,EACH,IAAI,CAACW,aAAa,EAAE,EACpB,IAAI,EACJZ,SAAS,CAACI,IAAI,CAAC,EAAE,CAAC,EAClB,WAAW,CACZ,CAAA;AACH,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACUtB,EAAAA,gBAAgBA,CAEtB+B,aAAqB,EACrBC,cAAsB,EACtB;IACA,MAAMd,SAAmB,GAAG,EAAE;AAC5BD,MAAAA,WAAqB,GAAG,EAAE,CAAA;IAC5B,IAAI1B,MAAM,GAAGwC,aAAa;MACxBE,UAAU,CAAA;;AAEZ;AACA,IAAA,IAAI,CAACC,eAAe,IAClBjB,WAAW,CAACkB,IAAI,CACd,GAAGjD,mBAAmB,CACpB,IAAI,CAACgD,eAAe,EACpB,CAAC,IAAI,CAAC5C,KAAK,GAAG,CAAC,EACf,CAAC,IAAI,CAACC,MAAM,GAAG,CAAC,EAChB,IAAI,CAACD,KAAK,EACV,IAAI,CAACC,MACP,CACF,CAAC,CAAA;;AAEH;AACA,IAAA,KAAK,IAAI6C,CAAC,GAAG,CAAC,EAAEC,GAAG,GAAG,IAAI,CAACC,UAAU,CAACC,MAAM,EAAEH,CAAC,GAAGC,GAAG,EAAED,CAAC,EAAE,EAAE;AAC1DH,MAAAA,UAAU,GAAG,IAAI,CAACO,kBAAkB,CAACJ,CAAC,CAAC,CAAA;AACvC,MAAA,IAAI,IAAI,CAACR,SAAS,KAAK,KAAK,EAAE;QAC5BK,UAAU,IAAI,IAAI,CAAC3C,KAAK,CAAA;AAC1B,OAAA;AACA,MAAA,IAAI,IAAI,CAACmD,mBAAmB,IAAI,IAAI,CAACC,QAAQ,CAAC,qBAAqB,EAAEN,CAAC,CAAC,EAAE;AACvE,QAAA,IAAI,CAACO,iBAAiB,CACpB1B,WAAW,EACXmB,CAAC,EACDJ,cAAc,GAAGC,UAAU,EAC3B1C,MACF,CAAC,CAAA;AACH,OAAA;AACA,MAAA,IAAI,CAACqD,mBAAmB,CACtB1B,SAAS,EACTkB,CAAC,EACDJ,cAAc,GAAGC,UAAU,EAC3B1C,MACF,CAAC,CAAA;AACDA,MAAAA,MAAM,IAAI,IAAI,CAACwB,eAAe,CAACqB,CAAC,CAAC,CAAA;AACnC,KAAA;IAEA,OAAO;MACLlB,SAAS;AACTD,MAAAA,WAAAA;KACD,CAAA;AACH,GAAA;EAEQ4B,mBAAmBA,CAEzBC,IAAY,EACZC,SAA+B,EAC/B3D,IAAY,EACZC,GAAW,EACX2D,OAAqB,EACrB;AACA,IAAA,MAAMC,gBAAgB,GAAGC,MAAM,CAACC,mBAAmB,CAAA;IACnD,MAAMC,UAAU,GAAG,IAAI,CAACC,gBAAgB,CACpCN,SAAS,EACTD,IAAI,KAAKA,IAAI,CAACQ,IAAI,EAAE,IAAI,CAAC,CAACR,IAAI,CAACS,KAAK,CAACvE,mBAAmB,CAC1D,CAAC;AACDwE,MAAAA,UAAU,GAAGJ,UAAU,GAAA,UAAA,CAAA5D,MAAA,CAAa4D,UAAU,UAAM,EAAE;MACtDK,EAAE,GAAGV,SAAS,CAACW,MAAM;AACrBC,MAAAA,MAAM,GAAGF,EAAE,GAAAjE,QAAAA,CAAAA,MAAA,CAAWoE,OAAO,CAACH,EAAE,EAAER,gBAAgB,CAAC,EAAA,KAAA,CAAA,GAAO,EAAE;AAC5D,MAAA;QAAEY,KAAK;QAAEC,UAAU;QAAEC,SAAS;AAAEzE,QAAAA,KAAAA;AAAM,OAAC,GAAG0D,OAAO,CAAA;IACnD,IAAIgB,SAAS,GAAG,EAAE,CAAA;IAClB,IAAIF,UAAU,KAAKG,SAAS,EAAE;AAC5B,MAAA,MAAMC,IAAI,GAAG5E,KAAK,GAAG,CAAC,CAAA;AACtBuE,MAAAA,KAAK,KACFG,SAAS,GAAAxE,YAAAA,CAAAA,MAAA,CAAeoE,OAAO,CAACO,gBAAgB,CAACN,KAAK,CAAC,EAAEZ,gBAAgB,CAAC,OAAG,CAAC,CAAA;MACjF,MAAMmB,CAAC,GAAGC,kBAAkB,CAAC;QAAER,KAAK,EAAEM,gBAAgB,CAACN,KAAM,CAAA;AAAE,OAAC,CAAC,CAAA;AACjEO,MAAAA,CAAC,CAAC,CAAC,CAAC,GAAGN,UAAW,CAAA;AAClBM,MAAAA,CAAC,CAAC,CAAC,CAAC,GAAGL,SAAU,CAAA;AACjB,MAAA,MAAMO,WAAW,GAAG,IAAIC,KAAK,CAAC,CAACL,IAAI,EAAE,CAAC,CAAC,CAACM,SAAS,CAACJ,CAAC,CAAC,CAAA;MACpDhF,IAAI,GAAGkF,WAAW,CAACG,CAAC,CAAA;MACpBpF,GAAG,GAAGiF,WAAW,CAACI,CAAC,CAAA;AACrB,KAAA;AAEA,IAAA,OAAA,aAAA,CAAAlF,MAAA,CAAoBoE,OAAO,CAACxE,IAAI,EAAE6D,gBAAgB,CAAC,EAAA,SAAA,CAAA,CAAAzD,MAAA,CAAQoE,OAAO,CAChEvE,GAAG,EACH4D,gBACF,CAAC,EAAAzD,KAAAA,CAAAA,CAAAA,MAAA,CAAKmE,MAAM,CAAA,CAAAnE,MAAA,CAAGwE,SAAS,CAAAxE,CAAAA,MAAA,CAAGgE,UAAU,OAAAhE,MAAA,CAAImF,SAAS,CAAC7B,IAAI,CAAC,EAAA,UAAA,CAAA,CAAA;AAC1D,GAAA;EAEQF,mBAAmBA,CAEzB1B,SAAmB,EACnB0D,SAAiB,EACjB5C,cAAsB,EACtBD,aAAqB,EACrB;AACA,IAAA,MAAM8C,UAAU,GAAG,IAAI,CAAC9D,eAAe,CAAC6D,SAAS,CAAC;MAChDE,SAAS,GAAG,IAAI,CAACC,SAAS,CAACC,QAAQ,CAACC,OAAO,CAAC;AAC5CC,MAAAA,IAAI,GAAG,IAAI,CAAC5C,UAAU,CAACsC,SAAS,CAAC,CAAA;AACnC,IAAA,IAAIO,WAAW;MACbC,SAAS;AACTC,MAAAA,aAAa,GAAG,EAAE;MAClBrC,OAAO;MACPsC,KAAK;AACLC,MAAAA,QAAQ,GAAG,CAAC;MACZC,YAAY,CAAA;AAEdzD,IAAAA,aAAa,IACV8C,UAAU,IAAI,CAAC,GAAG,IAAI,CAACY,iBAAiB,CAAC,GAAI,IAAI,CAACZ,UAAU,CAAA;AAC/D,IAAA,KAAK,IAAIzC,CAAC,GAAG,CAAC,EAAEC,GAAG,GAAG6C,IAAI,CAAC3C,MAAM,GAAG,CAAC,EAAEH,CAAC,IAAIC,GAAG,EAAED,CAAC,EAAE,EAAE;MACpDoD,YAAY,GAAGpD,CAAC,KAAKC,GAAG,IAAI,IAAI,CAACqD,WAAW,IAAI,IAAI,CAAChF,IAAI,CAAA;AACzD2E,MAAAA,aAAa,IAAIH,IAAI,CAAC9C,CAAC,CAAC,CAAA;MACxBY,OAAO,GAAG,IAAI,CAAC2C,YAAY,CAACf,SAAS,CAAC,CAACxC,CAAC,CAAC,CAAA;MACzC,IAAImD,QAAQ,KAAK,CAAC,EAAE;AAClBvD,QAAAA,cAAc,IAAIgB,OAAO,CAAC4C,WAAW,GAAG5C,OAAO,CAAC1D,KAAK,CAAA;QACrDiG,QAAQ,IAAIvC,OAAO,CAAC1D,KAAK,CAAA;AAC3B,OAAC,MAAM;QACLiG,QAAQ,IAAIvC,OAAO,CAAC4C,WAAW,CAAA;AACjC,OAAA;AACA,MAAA,IAAId,SAAS,IAAI,CAACU,YAAY,EAAE;QAC9B,IAAI,IAAI,CAACK,cAAc,CAACC,IAAI,CAACZ,IAAI,CAAC9C,CAAC,CAAC,CAAC,EAAE;AACrCoD,UAAAA,YAAY,GAAG,IAAI,CAAA;AACrB,SAAA;AACF,OAAA;MACA,IAAI,CAACA,YAAY,EAAE;AACjB;QACAL,WAAW,GACTA,WAAW,IAAI,IAAI,CAACY,2BAA2B,CAACnB,SAAS,EAAExC,CAAC,CAAC,CAAA;QAC/DgD,SAAS,GAAG,IAAI,CAACW,2BAA2B,CAACnB,SAAS,EAAExC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9DoD,YAAY,GAAGQ,eAAe,CAACb,WAAW,EAAEC,SAAS,EAAE,IAAI,CAAC,CAAA;AAC9D,OAAA;AACA,MAAA,IAAII,YAAY,EAAE;QAChBF,KAAK,GAAG,IAAI,CAACW,oBAAoB,CAACrB,SAAS,EAAExC,CAAC,CAAC,CAAA;AAC/ClB,QAAAA,SAAS,CAACiB,IAAI,CACZ,IAAI,CAACU,mBAAmB,CACtBwC,aAAa,EACbC,KAAK,EACLtD,cAAc,EACdD,aAAa,EACbiB,OACF,CACF,CAAC,CAAA;AACDqC,QAAAA,aAAa,GAAG,EAAE,CAAA;AAClBF,QAAAA,WAAW,GAAGC,SAAS,CAAA;AACvB,QAAA,IAAI,IAAI,CAACxD,SAAS,KAAK,KAAK,EAAE;AAC5BI,UAAAA,cAAc,IAAIuD,QAAQ,CAAA;AAC5B,SAAC,MAAM;AACLvD,UAAAA,cAAc,IAAIuD,QAAQ,CAAA;AAC5B,SAAA;AACAA,QAAAA,QAAQ,GAAG,CAAC,CAAA;AACd,OAAA;AACF,KAAA;AACF,GAAA;EAEQ5C,iBAAiBA,CAEvB1B,WAAgC,EAChCmB,CAAS,EACT8D,UAAkB,EAClBnE,aAAqB,EACrB;AACA,IAAA,MAAMmD,IAAI,GAAG,IAAI,CAAC5C,UAAU,CAACF,CAAC,CAAC;MAC7B+D,YAAY,GAAG,IAAI,CAACpF,eAAe,CAACqB,CAAC,CAAC,GAAG,IAAI,CAACyC,UAAU,CAAA;IAC1D,IAAIU,QAAQ,GAAG,CAAC;AACda,MAAAA,QAAQ,GAAG,CAAC;MACZC,YAAY;MACZC,SAAS,GAAG,IAAI,CAACC,oBAAoB,CAACnE,CAAC,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAA;AACpE,IAAA,KAAK,IAAIoE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGtB,IAAI,CAAC3C,MAAM,EAAEiE,CAAC,EAAE,EAAE;MACpC,MAAM;QAAEpH,IAAI;QAAEE,KAAK;AAAEsG,QAAAA,WAAAA;OAAa,GAAG,IAAI,CAACD,YAAY,CAACvD,CAAC,CAAC,CAACoE,CAAC,CAAC,CAAA;MAC5DH,YAAY,GAAG,IAAI,CAACE,oBAAoB,CAACnE,CAAC,EAAEoE,CAAC,EAAE,qBAAqB,CAAC,CAAA;MACrE,IAAIH,YAAY,KAAKC,SAAS,EAAE;QAC9BA,SAAS,IACPrF,WAAW,CAACkB,IAAI,CACd,GAAGjD,mBAAmB,CACpBoH,SAAS,EACTJ,UAAU,GAAGE,QAAQ,EACrBrE,aAAa,EACbwD,QAAQ,EACRY,YACF,CACF,CAAC,CAAA;AACHC,QAAAA,QAAQ,GAAGhH,IAAI,CAAA;AACfmG,QAAAA,QAAQ,GAAGjG,KAAK,CAAA;AAChBgH,QAAAA,SAAS,GAAGD,YAAY,CAAA;AAC1B,OAAC,MAAM;AACLd,QAAAA,QAAQ,IAAIK,WAAW,CAAA;AACzB,OAAA;AACF,KAAA;IACAS,YAAY,IACVpF,WAAW,CAACkB,IAAI,CACd,GAAGjD,mBAAmB,CACpBoH,SAAS,EACTJ,UAAU,GAAGE,QAAQ,EACrBrE,aAAa,EACbwD,QAAQ,EACRY,YACF,CACF,CAAC,CAAA;AACL,GAAA;;AAEA;AACF;AACA;EACEM,oBAAoBA,CAElB7B,SAAiB,EACjB;IACA,IAAI8B,aAAa,GAAG,CAAC;MACnBF,CAAC,CAAA;IACH,KAAKA,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG5B,SAAS,EAAE4B,CAAC,EAAE,EAAE;AAC9BE,MAAAA,aAAa,IAAI,IAAI,CAAC3F,eAAe,CAACyF,CAAC,CAAC,CAAA;AAC1C,KAAA;AACA,IAAA,MAAMG,UAAU,GAAG,IAAI,CAAC5F,eAAe,CAACyF,CAAC,CAAC,CAAA;IAC1C,OAAO;AACL1F,MAAAA,OAAO,EAAE4F,aAAa;AACtBE,MAAAA,MAAM,EACH,CAAC,IAAI,CAACC,aAAa,GAAG,IAAI,CAACpB,iBAAiB,IAAIkB,UAAU,IAC1D,IAAI,CAAC9B,UAAU,GAAG,IAAI,CAACgC,aAAa,CAAA;KACxC,CAAA;AACH,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACEhF,YAAYA,CAAwCiF,UAAoB,EAAE;AACxE,IAAA,OAAA,EAAA,CAAAtH,MAAA,CAAU,KAAK,CAACqC,YAAY,CAACiF,UAAU,CAAC,EAAAtH,8BAAAA,CAAAA,CAAAA,MAAA,CAA+BoE,OAAO,CAAE,IAAI,CAACmD,uBAAuB,GAAG,IAAI,CAACC,gBAAgB,EAAE,CAACtC,CAAC,GAAI,EAAE,EAAExB,MAAM,CAACC,mBAAmB,CAAC,EAAA,sBAAA,CAAA,CAAA;AAC7K,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEE,EAAAA,gBAAgBA,CAEdiC,KAA2B,EAC3B2B,aAAuB,EACvB;IACA,MAAM;MACJ1F,UAAU;MACV2F,WAAW;MACXC,MAAM;MACNC,IAAI;MACJ3F,QAAQ;MACRC,SAAS;MACTC,UAAU;MACV+B,MAAM;MACNqD,uBAAuB;MACvBM,WAAW;MACXC,QAAQ;AACRC,MAAAA,SAAAA;AACF,KAAC,GAAGjC,KAAK,CAAA;AAET,IAAA,MAAMlE,cAAc,GAAG,IAAI,CAACC,oBAAoB,CAAC;MAC/CkG,SAAS,EAAEA,SAAS,KAATA,IAAAA,IAAAA,SAAS,cAATA,SAAS,GAAI,IAAI,CAACA,SAAS;MACtCD,QAAQ,EAAEA,QAAQ,KAARA,IAAAA,IAAAA,QAAQ,cAARA,QAAQ,GAAI,IAAI,CAACA,QAAQ;MACnCD,WAAW,EAAEA,WAAW,KAAXA,IAAAA,IAAAA,WAAW,cAAXA,WAAW,GAAI,IAAI,CAACA,WAAAA;AACnC,KAAC,CAAC,CAAA;AACF,IAAA,MAAMG,SAAS,GAAGT,uBAAuB,IAAI,IAAI,CAACA,uBAAuB,CAAA;AACzE,IAAA,OAAO,CACLI,MAAM,GAAGM,cAAc,CAACC,MAAM,EAAEP,MAAM,CAAC,GAAG,EAAE,EAC5CD,WAAW,GAAA,gBAAA,CAAA1H,MAAA,CAAoB0H,WAAW,EAAA,IAAA,CAAA,GAAO,EAAE,EACnD3F,UAAU,GAAA,eAAA,CAAA/B,MAAA,CAEJ,CAAC+B,UAAU,CAACyD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAACzD,UAAU,CAACyD,QAAQ,CAAC,GAAG,CAAC,GAAAxF,GAAAA,CAAAA,MAAA,CAC9C+B,UAAU,EACdA,GAAAA,CAAAA,GAAAA,UAAU,UAEhB,EAAE,EACNE,QAAQ,GAAA,aAAA,CAAAjC,MAAA,CAAiBiC,QAAQ,EAAA,MAAA,CAAA,GAAS,EAAE,EAC5CC,SAAS,GAAA,cAAA,CAAAlC,MAAA,CAAkBkC,SAAS,EAAA,IAAA,CAAA,GAAO,EAAE,EAC7CC,UAAU,GAAAnC,eAAAA,CAAAA,MAAA,CAAmBmC,UAAU,EAAO,IAAA,CAAA,GAAA,EAAE,EAChDP,cAAc,GAAA5B,mBAAAA,CAAAA,MAAA,CACU4B,cAAc,EAAA5B,+BAAAA,CAAAA,CAAAA,MAAA,CAAgCoE,OAAO,CAAE4D,SAAS,GAAG,IAAI,CAACR,gBAAgB,EAAE,CAACtC,CAAC,GAAI,EAAE,EAAExB,MAAM,CAACC,mBAAmB,CAAC,EAAA,KAAA,CAAA,GACnJ,EAAE,EACNiE,IAAI,GAAGK,cAAc,CAACE,IAAI,EAAEP,IAAI,CAAC,GAAG,EAAE,EACtC1D,MAAM,sBAAAlE,MAAA,CAAsB,CAACkE,MAAM,EAAO,IAAA,CAAA,GAAA,EAAE,EAC5CuD,aAAa,GAAG,oBAAoB,GAAG,EAAE,CAC1C,CAAC3F,IAAI,CAAC,EAAE,CAAC,CAAA;AACZ,GAAA;;AAEA;AACF;AACA;AACA;AACA;EACED,oBAAoBA,CAElBiE,KAA2B,EAC3B;AACA,IAAA,OAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAC9CsC,MAAM,CACJC,UAAU,IACTvC,KAAK,CACHuC,UAAU,CAACrG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAKjC,CAAC,CACAF,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,GAAA;AACF;;;;"}