1 line
179 KiB
Plaintext
1 line
179 KiB
Plaintext
{"version":3,"file":"pixi-graphics-smooth.mjs","sources":["../src/core/BatchDrawCall.ts","../src/core/BatchPart.ts","../src/core/FillStyle.ts","../src/core/LineStyle.ts","../src/core/BuildData.ts","../src/core/const.ts","../src/core/SegmentPacker.ts","../src/core/SmoothGraphicsData.ts","../src/shapes/CircleBuilder.ts","../src/shapes/PolyBuilder.ts","../src/shapes/RectangleBuilder.ts","../src/shapes/RoundedRectangleBuilder.ts","../src/shapes/index.ts","../src/SmoothGraphicsGeometry.ts","../src/SmoothShader.ts","../src/settings.ts","../src/SmoothGraphics.ts","../src/DashLineShader.ts"],"sourcesContent":["import { Matrix, BaseTexture, BatchTextureArray, Shader, Texture, BLEND_MODES } from '@pixi/core';\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport interface IGraphicsBatchSettings\r\n{\r\n maxStyles: number;\r\n maxTextures: number;\r\n pixelLine: number;\r\n}\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport function matrixEquals(th: Matrix, matrix: Matrix, eps = 1e-3)\r\n{\r\n return this === matrix || (Math.abs(th.a - matrix.a) < eps\r\n && Math.abs(th.b - matrix.b) < eps\r\n && Math.abs(th.c - matrix.c) < eps\r\n && Math.abs(th.d - matrix.d) < eps\r\n && Math.abs(th.tx - matrix.tx) < eps\r\n && Math.abs(th.ty - matrix.ty) < eps);\r\n}\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class BatchStyleArray\r\n{\r\n public textureIds: number[];\r\n public matrices: Matrix[];\r\n public lines: number[];\r\n public count: number;\r\n\r\n constructor()\r\n {\r\n this.textureIds = [];\r\n this.matrices = [];\r\n this.lines = [];\r\n this.count = 0;\r\n // TODO: mapCoord for atlas cases\r\n // TODO: gradients?\r\n }\r\n\r\n clear(): void\r\n {\r\n for (let i = 0; i < this.count; i++)\r\n {\r\n this.textureIds[i] = null;\r\n this.matrices[i] = null;\r\n }\r\n this.count = 0;\r\n }\r\n\r\n add(textureId: number, matrix: Matrix,\r\n lineWidth: number, lineAlignment: number, lineScaleMode: number,\r\n settings: IGraphicsBatchSettings): number\r\n {\r\n const { textureIds, matrices, lines, count } = this;\r\n\r\n textureId = (textureId * 4) + lineScaleMode;\r\n for (let i = 0; i < count; i++)\r\n {\r\n if (lines[i * 2] === lineWidth && lines[(i * 2) + 1] === lineAlignment\r\n && textureIds[i] === textureId && (matrixEquals(matrices[i], matrix)))\r\n {\r\n return i;\r\n }\r\n }\r\n if (count >= settings.maxStyles)\r\n {\r\n return -1;\r\n }\r\n textureIds[count] = textureId;\r\n matrices[count] = matrix;\r\n lines[count * 2] = lineWidth;\r\n lines[(count * 2) + 1] = lineAlignment;\r\n this.count++;\r\n\r\n return count;\r\n }\r\n}\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class BatchDrawCall\r\n{\r\n texArray: BatchTextureArray;\r\n styleArray: BatchStyleArray;\r\n blend: BLEND_MODES;\r\n start: number;\r\n size: number;\r\n data: any;\r\n shader: Shader;\r\n TICK: number;\r\n settings: IGraphicsBatchSettings;\r\n\r\n constructor()\r\n {\r\n this.texArray = new BatchTextureArray();\r\n this.styleArray = new BatchStyleArray();\r\n this.shader = null;\r\n this.blend = BLEND_MODES.NORMAL;\r\n\r\n this.start = 0;\r\n this.size = 0;\r\n this.TICK = 0; // for filling textures\r\n this.settings = null;\r\n /**\r\n * data for uniforms or custom webgl state\r\n * @member {object}\r\n */\r\n this.data = null;\r\n }\r\n\r\n clear()\r\n {\r\n this.texArray.clear();\r\n this.styleArray.clear();\r\n this.settings = null;\r\n this.data = null;\r\n this.shader = null;\r\n }\r\n\r\n begin(settings: IGraphicsBatchSettings, shader: Shader)\r\n {\r\n this.TICK = ++BaseTexture._globalBatch;\r\n this.settings = settings;\r\n this.shader = shader;\r\n // start and size calculated outside\r\n this.start = 0;\r\n this.size = 0;\r\n this.data = null;\r\n if (shader && (shader as any).settings)\r\n {\r\n this.settings = (shader as any).settings;\r\n }\r\n }\r\n\r\n check(shader: Shader): boolean\r\n {\r\n if (this.size === 0)\r\n {\r\n this.shader = shader;\r\n\r\n return true;\r\n }\r\n\r\n return (this.shader === shader);\r\n }\r\n\r\n add(texture: Texture, matrix: Matrix, lineWidth: number,\r\n lineAlignment: number, lineScaleMode: number): number\r\n {\r\n const { texArray, TICK, styleArray, settings } = this;\r\n const { baseTexture } = texture;\r\n // check tex\r\n\r\n if (baseTexture._batchEnabled !== TICK && texArray.count === settings.maxTextures)\r\n {\r\n return -1;\r\n }\r\n const loc = baseTexture._batchEnabled !== TICK ? texArray.count : baseTexture._batchLocation;\r\n // check and add style\r\n // add1 -> add2 only works in chain, not when there are several adds inside\r\n const res = styleArray.add(loc, matrix || Matrix.IDENTITY,\r\n lineWidth, lineAlignment, lineScaleMode, settings);\r\n\r\n if (res >= 0)\r\n {\r\n // SUCCESS here\r\n // add tex\r\n if (baseTexture._batchEnabled !== TICK)\r\n {\r\n baseTexture._batchEnabled = TICK;\r\n baseTexture._batchLocation = texArray.count;\r\n texArray.elements[texArray.count++] = baseTexture;\r\n }\r\n }\r\n\r\n return res;\r\n }\r\n}\r\n","import { LineStyle } from './LineStyle';\r\nimport { FillStyle } from './FillStyle';\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class BatchPart\r\n{\r\n public style: LineStyle | FillStyle;\r\n public start: number;\r\n public size: number;\r\n public jointEnd: number;\r\n public attribStart: number;\r\n public attribSize: number;\r\n public styleId: number;\r\n public rgba: number;\r\n\r\n constructor()\r\n {\r\n this.reset();\r\n }\r\n\r\n public begin(style: LineStyle | FillStyle, startIndex: number, attribStart: number): void\r\n {\r\n this.reset();\r\n this.style = style;\r\n this.start = startIndex;\r\n this.attribStart = attribStart;\r\n this.jointEnd = 0;\r\n }\r\n\r\n public end(endIndex: number, endAttrib: number): void\r\n {\r\n this.attribSize = endAttrib - this.attribStart;\r\n this.size = endIndex - this.start;\r\n }\r\n\r\n public reset(): void\r\n {\r\n this.style = null;\r\n this.size = 0;\r\n this.start = 0;\r\n this.attribStart = 0;\r\n this.attribSize = 0;\r\n this.styleId = -1;\r\n this.rgba = 0;\r\n this.jointEnd = 0;\r\n }\r\n}\r\n","import { Shader, Texture } from '@pixi/core';\r\nimport type { Matrix } from '@pixi/core';\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class FillStyle\r\n{\r\n constructor()\r\n {\r\n this.reset();\r\n }\r\n\r\n color: number;\r\n alpha: number;\r\n texture: Texture;\r\n matrix: Matrix;\r\n matrixTex: Matrix;\r\n shader: Shader;\r\n visible: boolean;\r\n smooth: boolean;\r\n\r\n toJSON()\r\n {\r\n return this.copyTo({});\r\n }\r\n\r\n clone(): FillStyle\r\n {\r\n return this.copyTo(new FillStyle());\r\n }\r\n\r\n copyTo(obj: any): any\r\n {\r\n obj.color = this.color;\r\n obj.alpha = this.alpha;\r\n obj.texture = this.texture;\r\n obj.matrix = this.matrix;\r\n obj.shader = this.shader;\r\n obj.visible = this.visible;\r\n obj.smooth = this.smooth;\r\n obj.matrixTex = null;\r\n\r\n return obj;\r\n }\r\n\r\n packLineScale()\r\n {\r\n return 0;\r\n }\r\n\r\n reset()\r\n {\r\n this.color = 0xFFFFFF;\r\n\r\n this.alpha = 1;\r\n\r\n this.texture = Texture.WHITE;\r\n\r\n this.matrix = null;\r\n\r\n this.shader = null;\r\n\r\n this.visible = false;\r\n\r\n this.smooth = false;\r\n\r\n this.matrixTex = null;\r\n }\r\n\r\n destroy()\r\n {\r\n this.texture = null;\r\n this.matrix = null;\r\n this.matrixTex = null;\r\n }\r\n\r\n getTextureMatrix()\r\n {\r\n const tex = this.texture;\r\n\r\n if (!this.matrix)\r\n {\r\n return null;\r\n }\r\n\r\n if (tex.frame.width === tex.baseTexture.width\r\n && tex.frame.height === tex.baseTexture.height)\r\n {\r\n return this.matrix;\r\n }\r\n\r\n if (!this.matrixTex)\r\n {\r\n this.matrixTex = this.matrix.clone();\r\n }\r\n else\r\n {\r\n this.matrixTex.copyFrom(this.matrix);\r\n }\r\n this.matrixTex.translate(Number(tex.frame.x), Number(tex.frame.y));\r\n\r\n return this.matrixTex;\r\n }\r\n}\r\n","import { LINE_CAP, LINE_JOIN } from '@pixi/graphics';\r\nimport { FillStyle } from './FillStyle';\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport enum LINE_SCALE_MODE\r\n {\r\n NONE = 'none',\r\n NORMAL = 'normal',\r\n HORIZONTAL = 'horizontal',\r\n VERTICAL = 'vertical',\r\n}\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class LineStyle extends FillStyle\r\n{\r\n width: number;\r\n alignment: number;\r\n\r\n cap: LINE_CAP;\r\n join: LINE_JOIN;\r\n miterLimit: number;\r\n scaleMode: LINE_SCALE_MODE;\r\n\r\n clone(): LineStyle\r\n {\r\n return this.copyTo(new LineStyle());\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\n copyTo(obj: any): LineStyle\r\n {\r\n obj.color = this.color;\r\n obj.alpha = this.alpha;\r\n obj.texture = this.texture;\r\n obj.matrix = this.matrix;\r\n obj.shader = this.shader;\r\n obj.visible = this.visible;\r\n obj.width = this.width;\r\n obj.alignment = this.alignment;\r\n obj.cap = this.cap;\r\n obj.join = this.join;\r\n obj.miterLimit = this.miterLimit;\r\n obj.scaleMode = this.scaleMode;\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * returns width multiplied by scaleMode\r\n */\r\n packLineScale(): number\r\n {\r\n switch (this.scaleMode)\r\n {\r\n case LINE_SCALE_MODE.NORMAL: return 1;\r\n case LINE_SCALE_MODE.HORIZONTAL: return 2;\r\n case LINE_SCALE_MODE.VERTICAL: return 3;\r\n default: return 0;\r\n }\r\n }\r\n\r\n reset(): void\r\n {\r\n super.reset();\r\n\r\n this.smooth = true;\r\n\r\n this.color = 0x0;\r\n\r\n this.width = 0;\r\n\r\n this.alignment = 0.5;\r\n\r\n this.cap = LINE_CAP.BUTT;\r\n this.join = LINE_JOIN.MITER;\r\n this.miterLimit = 10;\r\n this.scaleMode = LINE_SCALE_MODE.NORMAL;\r\n }\r\n}\r\n","/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class BuildData\r\n{\r\n verts: Array<number> = [];\r\n joints: Array<number> = [];\r\n vertexSize = 0;\r\n indexSize = 0;\r\n closePointEps = 1e-4;\r\n\r\n clear()\r\n {\r\n this.verts.length = 0;\r\n this.joints.length = 0;\r\n this.vertexSize = 0;\r\n this.indexSize = 0;\r\n }\r\n\r\n destroy()\r\n {\r\n this.verts.length = 0;\r\n this.joints.length = 0;\r\n }\r\n}\r\n","export enum JOINT_TYPE\r\n {\r\n NONE = 0,\r\n FILL = 1,\r\n JOINT_BEVEL = 4,\r\n JOINT_MITER = 8,\r\n JOINT_ROUND = 12,\r\n JOINT_CAP_BUTT = 16,\r\n JOINT_CAP_SQUARE = 18,\r\n JOINT_CAP_ROUND = 20,\r\n FILL_EXPAND = 24,\r\n CAP_BUTT = 1 << 5,\r\n CAP_SQUARE = 2 << 5,\r\n CAP_ROUND = 3 << 5,\r\n CAP_BUTT2 = 4 << 5,\r\n}\r\n","import { BuildData } from './BuildData';\r\nimport { JOINT_TYPE } from './const';\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class SegmentPacker\r\n{\r\n static vertsByJoint: Array<number> = [];\r\n\r\n strideFloats = 12;\r\n\r\n updateBufferSize(jointStart: number, jointLen: number, triangles: number, target: BuildData): void\r\n {\r\n const { joints } = target;\r\n let foundTriangle = false;\r\n\r\n let vertexSize = 0;\r\n let indexSize = 0;\r\n\r\n for (let i = jointStart; i < jointStart + jointLen; i++)\r\n {\r\n const prevCap = joints[i] & ~31;\r\n const joint = joints[i] & 31;\r\n\r\n if (joint === JOINT_TYPE.FILL)\r\n {\r\n foundTriangle = true;\r\n vertexSize++;\r\n continue;\r\n }\r\n\r\n if (joint >= JOINT_TYPE.FILL_EXPAND)\r\n {\r\n vertexSize += 3;\r\n indexSize += 3;\r\n continue;\r\n }\r\n\r\n const vs = SegmentPacker.vertsByJoint[joint] + SegmentPacker.vertsByJoint[prevCap];\r\n\r\n if (vs >= 4)\r\n {\r\n vertexSize += vs;\r\n indexSize += 6 + (3 * Math.max(vs - 6, 0));\r\n }\r\n }\r\n if (foundTriangle)\r\n {\r\n indexSize += triangles;\r\n }\r\n\r\n target.vertexSize += vertexSize;\r\n target.indexSize += indexSize;\r\n }\r\n\r\n bufferPos = 0;\r\n indexPos = 0;\r\n bufFloat: Float32Array;\r\n bufUint: Uint32Array;\r\n indices: Uint16Array;\r\n buildData: BuildData;\r\n\r\n beginPack(buildData: BuildData, bufFloat: Float32Array, bufUint: Uint32Array,\r\n indices: Uint16Array, bufferPos = 0, indexPos = 0): void\r\n {\r\n this.buildData = buildData;\r\n this.bufFloat = bufFloat;\r\n this.bufUint = bufUint;\r\n this.indices = indices;\r\n this.bufferPos = bufferPos;\r\n this.indexPos = indexPos;\r\n }\r\n\r\n endPack(): void\r\n {\r\n this.buildData = null;\r\n this.bufFloat = null;\r\n this.bufUint = null;\r\n this.indices = null;\r\n }\r\n\r\n packInterleavedGeometry(jointStart: number, jointLen: number, triangles: number[],\r\n lineStyle: number, color: number): void\r\n {\r\n const { bufFloat, bufUint, indices, buildData, strideFloats } = this;\r\n const { joints, verts } = buildData;\r\n\r\n let bufPos = this.bufferPos;\r\n let indPos = this.indexPos;\r\n let index = this.bufferPos / this.strideFloats;\r\n\r\n // eslint-disable-next-line max-len\r\n let x1: number; let y1: number;\r\n let x2: number; let y2: number;\r\n let prevX: number; let prevY: number;\r\n let nextX: number; let nextY: number;\r\n // let type: number;\r\n let hasTriangle = false;\r\n\r\n let travel = 0;\r\n\r\n for (let j = jointStart; j < jointStart + jointLen; j++)\r\n {\r\n const fullJoint = joints[j];\r\n const prevCap = joints[j] & ~31;\r\n const joint = joints[j] & 31;\r\n\r\n if (joint === JOINT_TYPE.FILL)\r\n {\r\n // just one vertex\r\n hasTriangle = true;\r\n x1 = verts[(j * 2)];\r\n y1 = verts[(j * 2) + 1];\r\n bufFloat[bufPos] = x1;\r\n bufFloat[bufPos + 1] = y1;\r\n bufFloat[bufPos + 2] = x1;\r\n bufFloat[bufPos + 3] = y1;\r\n bufFloat[bufPos + 4] = x1;\r\n bufFloat[bufPos + 5] = y1;\r\n bufFloat[bufPos + 6] = x1;\r\n bufFloat[bufPos + 7] = y1;\r\n bufFloat[bufPos + 8] = travel;\r\n bufFloat[bufPos + 9] = 16 * joint;\r\n bufFloat[bufPos + 10] = lineStyle;\r\n bufUint[bufPos + 11] = color;\r\n bufPos += strideFloats;\r\n continue;\r\n }\r\n\r\n if (joint >= JOINT_TYPE.FILL_EXPAND)\r\n {\r\n prevX = verts[j * 2];\r\n prevY = verts[(j * 2) + 1];\r\n x1 = verts[(j * 2) + 2];\r\n y1 = verts[(j * 2) + 3];\r\n x2 = verts[(j * 2) + 4];\r\n y2 = verts[(j * 2) + 5];\r\n\r\n const bis = j + 3;\r\n\r\n for (let i = 0; i < 3; i++)\r\n {\r\n bufFloat[bufPos] = prevX;\r\n bufFloat[bufPos + 1] = prevY;\r\n bufFloat[bufPos + 2] = x1;\r\n bufFloat[bufPos + 3] = y1;\r\n bufFloat[bufPos + 4] = x2;\r\n bufFloat[bufPos + 5] = y2;\r\n bufFloat[bufPos + 6] = verts[(bis + i) * 2];\r\n bufFloat[bufPos + 7] = verts[((bis + i) * 2) + 1];\r\n\r\n bufFloat[bufPos + 8] = travel;\r\n bufFloat[bufPos + 9] = (16 * fullJoint) + i;\r\n bufFloat[bufPos + 10] = lineStyle;\r\n bufUint[bufPos + 11] = color;\r\n bufPos += strideFloats;\r\n }\r\n\r\n indices[indPos] = index;\r\n indices[indPos + 1] = index + 1;\r\n indices[indPos + 2] = index + 2;\r\n indPos += 3;\r\n index += 3;\r\n continue;\r\n }\r\n\r\n const vs = SegmentPacker.vertsByJoint[joint] + SegmentPacker.vertsByJoint[prevCap];\r\n\r\n if (vs === 0)\r\n {\r\n continue;\r\n }\r\n x1 = verts[j * 2];\r\n y1 = verts[(j * 2) + 1];\r\n x2 = verts[(j * 2) + 2];\r\n y2 = verts[(j * 2) + 3];\r\n // TODO: caps here\r\n prevX = verts[(j * 2) - 2];\r\n prevY = verts[(j * 2) - 1];\r\n\r\n const dist = Math.sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));\r\n\r\n if (SegmentPacker.vertsByJoint[joint] === 0)\r\n {\r\n travel -= dist;\r\n }\r\n\r\n if ((joint & ~2) !== JOINT_TYPE.JOINT_CAP_BUTT)\r\n {\r\n nextX = verts[(j * 2) + 4];\r\n nextY = verts[(j * 2) + 5];\r\n }\r\n else\r\n {\r\n nextX = x1;\r\n nextY = y1;\r\n }\r\n // type = joint;\r\n\r\n for (let i = 0; i < vs; i++)\r\n {\r\n bufFloat[bufPos] = prevX;\r\n bufFloat[bufPos + 1] = prevY;\r\n bufFloat[bufPos + 2] = x1;\r\n bufFloat[bufPos + 3] = y1;\r\n bufFloat[bufPos + 4] = x2;\r\n bufFloat[bufPos + 5] = y2;\r\n bufFloat[bufPos + 6] = nextX;\r\n bufFloat[bufPos + 7] = nextY;\r\n bufFloat[bufPos + 8] = travel;\r\n bufFloat[bufPos + 9] = (16 * fullJoint) + i;\r\n bufFloat[bufPos + 10] = lineStyle;\r\n bufUint[bufPos + 11] = color;\r\n bufPos += strideFloats;\r\n }\r\n\r\n travel += dist;\r\n\r\n indices[indPos] = index;\r\n indices[indPos + 1] = index + 1;\r\n indices[indPos + 2] = index + 2;\r\n indices[indPos + 3] = index;\r\n indices[indPos + 4] = index + 2;\r\n indices[indPos + 5] = index + 3;\r\n indPos += 6;\r\n for (let j = 5; j + 1 < vs; j++)\r\n {\r\n indices[indPos] = index + 4;\r\n indices[indPos + 1] = index + j;\r\n indices[indPos + 2] = index + j + 1;\r\n indPos += 3;\r\n }\r\n index += vs;\r\n }\r\n\r\n if (hasTriangle)\r\n {\r\n for (let i = 0; i < triangles.length; i++)\r\n {\r\n indices[indPos + i] = triangles[i] + index;\r\n }\r\n indPos += triangles.length;\r\n }\r\n\r\n this.bufferPos = bufPos;\r\n this.indexPos = indPos;\r\n }\r\n}\r\n\r\nconst verts = SegmentPacker.vertsByJoint;\r\n\r\nfor (let i = 0; i < 256; i++)\r\n{ verts.push(0); }\r\n// simple fill\r\nverts[JOINT_TYPE.FILL] = 1;\r\n\r\nfor (let i = 0; i < 8; i++)\r\n{\r\n verts[JOINT_TYPE.FILL_EXPAND + i] = 3;\r\n}\r\n\r\n// no caps for now\r\nverts[JOINT_TYPE.JOINT_BEVEL] = 4 + 5;\r\nverts[JOINT_TYPE.JOINT_BEVEL + 1] = 4 + 5;\r\nverts[JOINT_TYPE.JOINT_BEVEL + 2] = 4 + 5;\r\nverts[JOINT_TYPE.JOINT_BEVEL + 3] = 4 + 5;\r\nverts[JOINT_TYPE.JOINT_ROUND] = 4 + 5;\r\nverts[JOINT_TYPE.JOINT_ROUND + 1] = 4 + 5;\r\nverts[JOINT_TYPE.JOINT_ROUND + 2] = 4 + 5;\r\nverts[JOINT_TYPE.JOINT_ROUND + 3] = 4 + 5;\r\nverts[JOINT_TYPE.JOINT_MITER] = 4 + 5;\r\nverts[JOINT_TYPE.JOINT_MITER + 1] = 4 + 5;\r\nverts[JOINT_TYPE.JOINT_MITER + 2] = 4;\r\nverts[JOINT_TYPE.JOINT_MITER + 3] = 4;\r\nverts[JOINT_TYPE.JOINT_CAP_BUTT] = 4;\r\nverts[JOINT_TYPE.JOINT_CAP_BUTT + 1] = 4;\r\nverts[JOINT_TYPE.JOINT_CAP_SQUARE] = 4;\r\nverts[JOINT_TYPE.JOINT_CAP_SQUARE + 1] = 4;\r\nverts[JOINT_TYPE.JOINT_CAP_ROUND] = 4 + 5;\r\nverts[JOINT_TYPE.JOINT_CAP_ROUND + 1] = 4 + 5;\r\n\r\nverts[JOINT_TYPE.CAP_ROUND] = 4;\r\n","import type { Matrix, SHAPES, IShape } from '@pixi/core';\r\nimport { LINE_CAP, LINE_JOIN } from '@pixi/graphics';\r\nimport { JOINT_TYPE } from './const';\r\nimport { FillStyle } from './FillStyle';\r\nimport { LineStyle } from './LineStyle';\r\n\r\n/**\r\n * A class to contain data useful for Graphics objects\r\n *\r\n * @memberof PIXI.smooth\r\n */\r\nexport class SmoothGraphicsData\r\n{\r\n shape: IShape;\r\n lineStyle: LineStyle;\r\n fillStyle: FillStyle;\r\n matrix: Matrix;\r\n type: SHAPES;\r\n holes: Array<SmoothGraphicsData>;\r\n\r\n // result of simplification\r\n closeStroke: boolean;\r\n points: number[];\r\n triangles: number[];\r\n // indices in build\r\n attribStart: number;\r\n fillStart: number;\r\n fillLen: number;\r\n strokeStart: number;\r\n strokeLen: number;\r\n fillAA: boolean;\r\n\r\n constructor(shape: IShape, fillStyle: FillStyle = null, lineStyle: LineStyle = null, matrix: Matrix = null)\r\n {\r\n this.shape = shape;\r\n\r\n this.lineStyle = lineStyle;\r\n\r\n this.fillStyle = fillStyle;\r\n\r\n this.matrix = matrix;\r\n\r\n this.type = shape.type;\r\n\r\n this.points = [];\r\n\r\n this.holes = [];\r\n\r\n this.triangles = [];\r\n\r\n this.closeStroke = false;\r\n\r\n this.clearBuild();\r\n }\r\n\r\n public clearPath()\r\n {\r\n this.points.length = 0;\r\n this.closeStroke = true;\r\n }\r\n\r\n public clearBuild()\r\n {\r\n this.triangles.length = 0;\r\n this.fillStart = 0;\r\n this.fillLen = 0;\r\n this.strokeStart = 0;\r\n this.strokeLen = 0;\r\n this.fillAA = false;\r\n }\r\n\r\n public clone(): SmoothGraphicsData\r\n {\r\n return new SmoothGraphicsData(\r\n this.shape,\r\n this.fillStyle,\r\n this.lineStyle,\r\n this.matrix\r\n );\r\n }\r\n\r\n public capType()\r\n {\r\n let cap: number;\r\n\r\n switch (this.lineStyle.cap)\r\n {\r\n case LINE_CAP.SQUARE:\r\n cap = JOINT_TYPE.CAP_SQUARE;\r\n break;\r\n case LINE_CAP.ROUND:\r\n cap = JOINT_TYPE.CAP_ROUND;\r\n break;\r\n default:\r\n cap = JOINT_TYPE.CAP_BUTT;\r\n break;\r\n }\r\n\r\n return cap;\r\n }\r\n\r\n public goodJointType()\r\n {\r\n let joint: number;\r\n\r\n switch (this.lineStyle.join)\r\n {\r\n case LINE_JOIN.BEVEL:\r\n joint = JOINT_TYPE.JOINT_BEVEL;\r\n break;\r\n case LINE_JOIN.ROUND:\r\n joint = JOINT_TYPE.JOINT_ROUND;\r\n break;\r\n default:\r\n joint = JOINT_TYPE.JOINT_MITER + 3;\r\n break;\r\n }\r\n\r\n return joint;\r\n }\r\n\r\n public jointType()\r\n {\r\n let joint: number;\r\n\r\n switch (this.lineStyle.join)\r\n {\r\n case LINE_JOIN.BEVEL:\r\n joint = JOINT_TYPE.JOINT_BEVEL;\r\n break;\r\n case LINE_JOIN.ROUND:\r\n joint = JOINT_TYPE.JOINT_ROUND;\r\n break;\r\n default:\r\n joint = JOINT_TYPE.JOINT_MITER;\r\n break;\r\n }\r\n\r\n return joint;\r\n }\r\n\r\n public destroy(): void\r\n {\r\n this.shape = null;\r\n this.holes.length = 0;\r\n this.holes = null;\r\n this.points.length = 0;\r\n this.points = null;\r\n this.lineStyle = null;\r\n this.fillStyle = null;\r\n this.triangles = null;\r\n }\r\n}\r\n","// for type only\r\nimport { SHAPES } from '@pixi/core';\r\n\r\nimport type { Circle, Ellipse, RoundedRectangle } from '@pixi/core';\r\nimport type { IShapeBuilder } from '../core/IShapeBuilder';\r\nimport { SmoothGraphicsData } from '../core/SmoothGraphicsData';\r\nimport { BuildData } from '../core/BuildData';\r\nimport { JOINT_TYPE } from '../core/const';\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class CircleBuilder implements IShapeBuilder\r\n{\r\n path(graphicsData: SmoothGraphicsData, _target: BuildData)\r\n {\r\n // need to convert points to a nice regular data\r\n const points = graphicsData.points;\r\n\r\n let x;\r\n let y;\r\n let dx;\r\n let dy;\r\n let rx;\r\n let ry;\r\n\r\n if (graphicsData.type === SHAPES.CIRC)\r\n {\r\n const circle = graphicsData.shape as Circle;\r\n\r\n x = circle.x;\r\n y = circle.y;\r\n rx = ry = circle.radius;\r\n dx = dy = 0;\r\n }\r\n else if (graphicsData.type === SHAPES.ELIP)\r\n {\r\n const ellipse = graphicsData.shape as Ellipse;\r\n\r\n x = ellipse.x;\r\n y = ellipse.y;\r\n rx = ellipse.width;\r\n ry = ellipse.height;\r\n dx = dy = 0;\r\n }\r\n else\r\n {\r\n const roundedRect = graphicsData.shape as RoundedRectangle;\r\n const halfWidth = roundedRect.width / 2;\r\n const halfHeight = roundedRect.height / 2;\r\n\r\n x = roundedRect.x + halfWidth;\r\n y = roundedRect.y + halfHeight;\r\n rx = ry = Math.max(0, Math.min(roundedRect.radius, Math.min(halfWidth, halfHeight)));\r\n dx = halfWidth - rx;\r\n dy = halfHeight - ry;\r\n }\r\n\r\n if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0))\r\n {\r\n points.length = 0;\r\n\r\n return;\r\n }\r\n\r\n // Choose a number of segments such that the maximum absolute deviation from the circle is approximately 0.029\r\n const n = Math.ceil(2.3 * Math.sqrt(rx + ry));\r\n const m = (n * 8) + (dx ? 4 : 0) + (dy ? 4 : 0);\r\n\r\n points.length = m;\r\n\r\n if (m === 0)\r\n {\r\n return;\r\n }\r\n\r\n if (n === 0)\r\n {\r\n points.length = 8;\r\n points[0] = points[6] = x + dx;\r\n points[1] = points[3] = y + dy;\r\n points[2] = points[4] = x - dx;\r\n points[5] = points[7] = y - dy;\r\n\r\n return;\r\n }\r\n\r\n let j1 = 0;\r\n let j2 = (n * 4) + (dx ? 2 : 0) + 2;\r\n let j3 = j2;\r\n let j4 = m;\r\n\r\n {\r\n const x0 = dx + rx;\r\n const y0 = dy;\r\n const x1 = x + x0;\r\n const x2 = x - x0;\r\n const y1 = y + y0;\r\n\r\n points[j1++] = x1;\r\n points[j1++] = y1;\r\n points[--j2] = y1;\r\n points[--j2] = x2;\r\n\r\n if (dy)\r\n {\r\n const y2 = y - y0;\r\n\r\n points[j3++] = x2;\r\n points[j3++] = y2;\r\n points[--j4] = y2;\r\n points[--j4] = x1;\r\n }\r\n }\r\n\r\n for (let i = 1; i < n; i++)\r\n {\r\n const a = Math.PI / 2 * (i / n);\r\n const x0 = dx + (Math.cos(a) * rx);\r\n const y0 = dy + (Math.sin(a) * ry);\r\n const x1 = x + x0;\r\n const x2 = x - x0;\r\n const y1 = y + y0;\r\n const y2 = y - y0;\r\n\r\n points[j1++] = x1;\r\n points[j1++] = y1;\r\n points[--j2] = y1;\r\n points[--j2] = x2;\r\n points[j3++] = x2;\r\n points[j3++] = y2;\r\n points[--j4] = y2;\r\n points[--j4] = x1;\r\n }\r\n\r\n {\r\n const x0 = dx;\r\n const y0 = dy + ry;\r\n const x1 = x + x0;\r\n const x2 = x - x0;\r\n const y1 = y + y0;\r\n const y2 = y - y0;\r\n\r\n points[j1++] = x1;\r\n points[j1++] = y1;\r\n points[--j4] = y2;\r\n points[--j4] = x1;\r\n\r\n if (dx)\r\n {\r\n points[j1++] = x2;\r\n points[j1++] = y1;\r\n points[--j4] = y2;\r\n points[--j4] = x2;\r\n }\r\n }\r\n }\r\n\r\n fill(graphicsData: SmoothGraphicsData, target: BuildData)\r\n {\r\n const { verts, joints } = target;\r\n const { points, triangles } = graphicsData;\r\n\r\n if (points.length === 0)\r\n {\r\n return;\r\n }\r\n\r\n let x;\r\n let y;\r\n\r\n if (graphicsData.type !== SHAPES.RREC)\r\n {\r\n const circle = graphicsData.shape as Circle;\r\n\r\n x = circle.x;\r\n y = circle.y;\r\n }\r\n else\r\n {\r\n const roundedRect = graphicsData.shape as RoundedRectangle;\r\n\r\n x = roundedRect.x + (roundedRect.width / 2);\r\n y = roundedRect.y + (roundedRect.height / 2);\r\n }\r\n\r\n const matrix = graphicsData.matrix;\r\n const cx = matrix ? (matrix.a * x) + (matrix.c * y) + matrix.tx : x;\r\n const cy = matrix ? (matrix.b * x) + (matrix.d * y) + matrix.ty : y;\r\n\r\n let vertPos = 1;\r\n const center = 0;\r\n\r\n if (!graphicsData.fillAA)\r\n {\r\n verts.push(cx, cy);\r\n joints.push(JOINT_TYPE.FILL);\r\n verts.push(points[0], points[1]);\r\n joints.push(JOINT_TYPE.FILL);\r\n\r\n for (let i = 2; i < points.length; i += 2)\r\n {\r\n verts.push(points[i], points[i + 1]);\r\n joints.push(JOINT_TYPE.FILL);\r\n\r\n triangles.push(vertPos++, center, vertPos);\r\n }\r\n\r\n triangles.push(center + 1, center, vertPos);\r\n\r\n return;\r\n }\r\n\r\n const len = points.length;\r\n\r\n let x1 = points[len - 2];\r\n let y1 = points[len - 1];\r\n\r\n let nx1 = y1 - points[len - 3];\r\n let ny1 = points[len - 4] - x1;\r\n const n1 = Math.sqrt((nx1 * nx1) + (ny1 * ny1));\r\n\r\n nx1 /= n1;\r\n ny1 /= n1;\r\n\r\n let bx1;\r\n let by1;\r\n\r\n for (let i = 0; i < len; i += 2)\r\n {\r\n const x2 = points[i];\r\n const y2 = points[i + 1];\r\n\r\n let nx2 = y2 - y1;\r\n let ny2 = x1 - x2;\r\n const n2 = Math.sqrt((nx2 * nx2) + (ny2 * ny2));\r\n\r\n nx2 /= n2;\r\n ny2 /= n2;\r\n\r\n let bx2 = nx1 + nx2;\r\n let by2 = ny1 + ny2;\r\n const b2 = (nx2 * bx2) + (ny2 * by2);\r\n\r\n bx2 /= b2;\r\n by2 /= b2;\r\n\r\n if (i > 0)\r\n {\r\n verts.push(bx2);\r\n verts.push(by2);\r\n }\r\n else\r\n {\r\n bx1 = bx2;\r\n by1 = by2;\r\n }\r\n\r\n verts.push(cx);\r\n verts.push(cy);\r\n verts.push(x1);\r\n verts.push(y1);\r\n verts.push(x2);\r\n verts.push(y2);\r\n\r\n verts.push(0);\r\n verts.push(0);\r\n verts.push(bx2);\r\n verts.push(by2);\r\n\r\n joints.push(JOINT_TYPE.FILL_EXPAND + 2);\r\n joints.push(JOINT_TYPE.NONE);\r\n joints.push(JOINT_TYPE.NONE);\r\n joints.push(JOINT_TYPE.NONE);\r\n joints.push(JOINT_TYPE.NONE);\r\n joints.push(JOINT_TYPE.NONE);\r\n\r\n x1 = x2;\r\n y1 = y2;\r\n nx1 = nx2;\r\n ny1 = ny2;\r\n }\r\n\r\n verts.push(bx1);\r\n verts.push(by1);\r\n }\r\n\r\n line(graphicsData: SmoothGraphicsData, target: BuildData): void\r\n {\r\n const { verts, joints } = target;\r\n const { points } = graphicsData;\r\n const joint = points.length === 8 // we dont need joints for arcs\r\n ? graphicsData.goodJointType() : JOINT_TYPE.JOINT_MITER + 3;\r\n const len = points.length;\r\n\r\n if (len === 0)\r\n {\r\n return;\r\n }\r\n\r\n verts.push(points[len - 2], points[len - 1]);\r\n joints.push(JOINT_TYPE.NONE);\r\n for (let i = 0; i < len; i += 2)\r\n {\r\n verts.push(points[i], points[i + 1]);\r\n joints.push(joint);\r\n }\r\n verts.push(points[0], points[1]);\r\n joints.push(JOINT_TYPE.NONE);\r\n verts.push(points[2], points[3]);\r\n joints.push(JOINT_TYPE.NONE);\r\n }\r\n}\r\n","import type { IShapeBuilder } from '../core/IShapeBuilder';\r\nimport { SmoothGraphicsData } from '../core/SmoothGraphicsData';\r\nimport { BuildData } from '../core/BuildData';\r\nimport { JOINT_TYPE } from '../core/const';\r\nimport { Point, Polygon, utils } from '@pixi/core';\r\n\r\nconst tempArr: Array<number> = [];\r\n\r\nfunction fixOrientation(points: number[], hole = false)\r\n{\r\n const m = points.length;\r\n\r\n if (m < 6)\r\n {\r\n return;\r\n }\r\n\r\n let area = 0;\r\n\r\n for (let i = 0, x1 = points[m - 2], y1 = points[m - 1]; i < m; i += 2)\r\n {\r\n const x2 = points[i];\r\n const y2 = points[i + 1];\r\n\r\n area += (x2 - x1) * (y2 + y1);\r\n\r\n x1 = x2;\r\n y1 = y2;\r\n }\r\n\r\n if ((!hole && area > 0) || (hole && area <= 0))\r\n {\r\n const n = m / 2;\r\n\r\n for (let i = n + (n % 2); i < m; i += 2)\r\n {\r\n const i1 = m - i - 2;\r\n const i2 = m - i - 1;\r\n const i3 = i;\r\n const i4 = i + 1;\r\n\r\n [points[i1], points[i3]] = [points[i3], points[i1]];\r\n [points[i2], points[i4]] = [points[i4], points[i2]];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class PolyBuilder implements IShapeBuilder\r\n{\r\n path(graphicsData: SmoothGraphicsData, buildData: BuildData)\r\n {\r\n const shape = graphicsData.shape as Polygon;\r\n const points = graphicsData.points = shape.points.slice();\r\n const eps = buildData.closePointEps;\r\n const eps2 = eps * eps;\r\n\r\n if (points.length === 0)\r\n {\r\n return;\r\n }\r\n\r\n const firstPoint = new Point(points[0], points[1]);\r\n const lastPoint = new Point(points[points.length - 2], points[points.length - 1]);\r\n const closedShape = graphicsData.closeStroke = shape.closeStroke;\r\n\r\n let len = points.length;\r\n let newLen = 2;\r\n\r\n // 1. remove equal points\r\n for (let i = 2; i < len; i += 2)\r\n {\r\n const x1 = points[i - 2];\r\n const y1 = points[i - 1];\r\n const x2 = points[i];\r\n const y2 = points[i + 1];\r\n let flag = true;\r\n\r\n if (Math.abs(x1 - x2) < eps\r\n && Math.abs(y1 - y2) < eps)\r\n {\r\n flag = false;\r\n }\r\n\r\n if (flag)\r\n {\r\n points[newLen] = points[i];\r\n points[newLen + 1] = points[i + 1];\r\n newLen += 2;\r\n }\r\n }\r\n points.length = len = newLen;\r\n\r\n newLen = 2;\r\n // 2. remove middle points\r\n for (let i = 2; i + 2 < len; i += 2)\r\n {\r\n let x1 = points[i - 2];\r\n let y1 = points[i - 1];\r\n const x2 = points[i];\r\n const y2 = points[i + 1];\r\n let x3 = points[i + 2];\r\n let y3 = points[i + 3];\r\n\r\n x1 -= x2;\r\n y1 -= y2;\r\n x3 -= x2;\r\n y3 -= y2;\r\n let flag = true;\r\n\r\n if (Math.abs((x3 * y1) - (y3 * x1)) < eps2)\r\n {\r\n if ((x1 * x3) + (y1 * y3) < -eps2)\r\n {\r\n flag = false;\r\n }\r\n }\r\n\r\n if (flag)\r\n {\r\n points[newLen] = points[i];\r\n points[newLen + 1] = points[i + 1];\r\n newLen += 2;\r\n }\r\n }\r\n points[newLen] = points[len - 2];\r\n points[newLen + 1] = points[len - 1];\r\n newLen += 2;\r\n\r\n points.length = len = newLen;\r\n\r\n if (len <= 2)\r\n {\r\n // suddenly, nothing\r\n return;\r\n }\r\n\r\n if (closedShape)\r\n {\r\n // first point should be last point in closed line!\r\n const closedPath = Math.abs(firstPoint.x - lastPoint.x) < eps\r\n && Math.abs(firstPoint.y - lastPoint.y) < eps;\r\n\r\n if (closedPath)\r\n {\r\n points.pop();\r\n points.pop();\r\n }\r\n }\r\n }\r\n\r\n line(graphicsData: SmoothGraphicsData, buildData: BuildData)\r\n {\r\n const { closeStroke, points } = graphicsData;\r\n // const eps = buildData.closePointEps;\r\n // const eps2 = eps * eps;\r\n const len = points.length;\r\n // const style = graphicsData.lineStyle;\r\n\r\n if (len <= 2)\r\n {\r\n return;\r\n }\r\n const { verts, joints } = buildData;\r\n\r\n // TODO: alignment\r\n\r\n const joint = graphicsData.jointType();\r\n const cap = graphicsData.capType();\r\n let prevCap = 0;\r\n\r\n let prevX: number; let\r\n prevY: number;\r\n\r\n if (closeStroke)\r\n {\r\n prevX = points[len - 2];\r\n prevY = points[len - 1];\r\n joints.push(JOINT_TYPE.NONE);\r\n }\r\n else\r\n {\r\n prevX = points[2];\r\n prevY = points[3];\r\n if (cap === JOINT_TYPE.CAP_ROUND)\r\n {\r\n verts.push(points[0], points[1]);\r\n joints.push(JOINT_TYPE.NONE);\r\n joints.push(JOINT_TYPE.CAP_ROUND);\r\n prevCap = 0;\r\n }\r\n else\r\n {\r\n prevCap = cap;\r\n joints.push(JOINT_TYPE.NONE);\r\n }\r\n }\r\n verts.push(prevX, prevY);\r\n\r\n /* Line segments of interest where (x1,y1) forms the corner. */\r\n for (let i = 0; i < len; i += 2)\r\n {\r\n const x1 = points[i]; const\r\n y1 = points[i + 1];\r\n\r\n // let x2: number; let\r\n // y2: number;\r\n\r\n // if (i + 2 < len)\r\n // {\r\n // x2 = points[i + 2];\r\n // y2 = points[i + 3];\r\n // }\r\n // else\r\n // {\r\n // x2 = points[0];\r\n // y2 = points[1];\r\n // }\r\n\r\n // const dx = x2 - x1;\r\n // const dy = y2 - y1;\r\n // let nextX: number; let\r\n // nextY: number;\r\n\r\n let endJoint = joint;\r\n\r\n if (i + 2 >= len)\r\n {\r\n // nextX = points[2];\r\n // nextY = points[3];\r\n if (!closeStroke)\r\n {\r\n endJoint = JOINT_TYPE.NONE;\r\n }\r\n }\r\n else if (i + 4 >= len)\r\n {\r\n // nextX = points[0];\r\n // nextY = points[1];\r\n if (!closeStroke)\r\n {\r\n if (cap === JOINT_TYPE.CAP_ROUND)\r\n {\r\n endJoint = JOINT_TYPE.JOINT_CAP_ROUND;\r\n }\r\n if (cap === JOINT_TYPE.CAP_BUTT)\r\n {\r\n endJoint = JOINT_TYPE.JOINT_CAP_BUTT;\r\n }\r\n if (cap === JOINT_TYPE.CAP_SQUARE)\r\n {\r\n endJoint = JOINT_TYPE.JOINT_CAP_SQUARE;\r\n }\r\n }\r\n }\r\n // else\r\n // {\r\n // nextX = points[i + 4];\r\n // nextY = points[i + 5];\r\n // }\r\n\r\n // const dx3 = x1 - prevX;\r\n // const dy3 = y1 - prevY;\r\n\r\n endJoint += prevCap;\r\n prevCap = 0;\r\n\r\n verts.push(x1, y1);\r\n joints.push(endJoint);\r\n\r\n prevX = x1;\r\n prevY = y1;\r\n }\r\n\r\n if (closeStroke)\r\n {\r\n verts.push(points[0], points[1]);\r\n joints.push(JOINT_TYPE.NONE);\r\n verts.push(points[2], points[3]);\r\n joints.push(JOINT_TYPE.NONE);\r\n }\r\n else\r\n {\r\n verts.push(points[len - 4], points[len - 3]);\r\n joints.push(JOINT_TYPE.NONE);\r\n }\r\n }\r\n\r\n fill(graphicsData: SmoothGraphicsData, buildData: BuildData)\r\n {\r\n let points = graphicsData.points;\r\n // TODO: simplify holes too!\r\n const holes = graphicsData.holes;\r\n const eps = buildData.closePointEps;\r\n\r\n const { verts, joints } = buildData;\r\n\r\n if (points.length < 6)\r\n {\r\n return;\r\n }\r\n const holeArray = [];\r\n let len = points.length;\r\n\r\n fixOrientation(points, false);\r\n\r\n // Process holes..\r\n for (let i = 0; i < holes.length; i++)\r\n {\r\n const hole = holes[i];\r\n\r\n fixOrientation(hole.points, true);\r\n\r\n holeArray.push(points.length / 2);\r\n points = points.concat(hole.points);\r\n }\r\n\r\n // TODO: reduce size later?\r\n const pn = tempArr;\r\n\r\n if (pn.length < points.length)\r\n {\r\n pn.length = points.length;\r\n }\r\n let start = 0;\r\n\r\n for (let i = 0; i <= holeArray.length; i++)\r\n {\r\n let finish = len / 2;\r\n\r\n if (i > 0)\r\n {\r\n if (i < holeArray.length)\r\n {\r\n finish = holeArray[i];\r\n }\r\n else\r\n {\r\n finish = (points.length >> 1);\r\n }\r\n }\r\n pn[start * 2] = finish - 1;\r\n pn[((finish - 1) * 2) + 1] = start;\r\n for (let j = start; j + 1 < finish; j++)\r\n {\r\n pn[(j * 2) + 1] = j + 1;\r\n pn[(j * 2) + 2] = j;\r\n }\r\n start = finish;\r\n }\r\n\r\n // sort color\r\n graphicsData.triangles = utils.earcut(points, holeArray, 2);\r\n\r\n if (!graphicsData.triangles)\r\n {\r\n return;\r\n }\r\n\r\n if (!graphicsData.fillAA)\r\n {\r\n for (let i = 0; i < points.length; i += 2)\r\n {\r\n verts.push(points[i], points[i + 1]);\r\n joints.push(JOINT_TYPE.FILL);\r\n }\r\n\r\n return;\r\n }\r\n\r\n const { triangles } = graphicsData;\r\n\r\n len = points.length;\r\n\r\n for (let i = 0; i < triangles.length; i += 3)\r\n {\r\n // TODO: holes prev/next!!!\r\n let flag = 0;\r\n\r\n for (let j = 0; j < 3; j++)\r\n {\r\n const ind1 = triangles[i + j];\r\n const ind2 = triangles[i + ((j + 1) % 3)];\r\n\r\n if (pn[ind1 * 2] === ind2 || pn[(ind1 * 2) + 1] === ind2)\r\n {\r\n flag |= (1 << j);\r\n }\r\n }\r\n joints.push(JOINT_TYPE.FILL_EXPAND + flag);\r\n joints.push(JOINT_TYPE.NONE);\r\n joints.push(JOINT_TYPE.NONE);\r\n joints.push(JOINT_TYPE.NONE);\r\n joints.push(JOINT_TYPE.NONE);\r\n joints.push(JOINT_TYPE.NONE);\r\n }\r\n\r\n // bisect, re-using pn\r\n for (let ind = 0; ind < len / 2; ind++)\r\n {\r\n const prev = pn[ind * 2];\r\n const next = pn[(ind * 2) + 1];\r\n let nx1 = (points[(next * 2) + 1] - points[(ind * 2) + 1]); let\r\n ny1 = -(points[next * 2] - points[ind * 2]);\r\n let nx2 = (points[(ind * 2) + 1] - points[(prev * 2) + 1]); let\r\n ny2 = -(points[ind * 2] - points[prev * 2]);\r\n const D1 = Math.sqrt((nx1 * nx1) + (ny1 * ny1));\r\n\r\n nx1 /= D1;\r\n ny1 /= D1;\r\n const D2 = Math.sqrt((nx2 * nx2) + (ny2 * ny2));\r\n\r\n nx2 /= D2;\r\n ny2 /= D2;\r\n\r\n let bx = (nx1 + nx2);\r\n let by = (ny1 + ny2);\r\n const D = (bx * nx1) + (by * ny1);\r\n\r\n if (Math.abs(D) < eps)\r\n {\r\n bx = nx1;\r\n by = ny1;\r\n }\r\n else\r\n {\r\n bx /= D;\r\n by /= D;\r\n }\r\n pn[ind * 2] = bx;\r\n pn[(ind * 2) + 1] = by;\r\n }\r\n\r\n for (let i = 0; i < triangles.length; i += 3)\r\n {\r\n const prev = triangles[i];\r\n const ind = triangles[i + 1];\r\n const next = triangles[i + 2];\r\n const nx1 = (points[(next * 2) + 1] - points[(ind * 2) + 1]); const\r\n ny1 = -(points[next * 2] - points[ind * 2]);\r\n const nx2 = (points[(ind * 2) + 1] - points[(prev * 2) + 1]); const\r\n ny2 = -(points[ind * 2] - points[prev * 2]);\r\n\r\n let j1 = 1;\r\n\r\n if ((nx1 * ny2) - (nx2 * ny1) > 0.0)\r\n {\r\n j1 = 2;\r\n }\r\n\r\n for (let j = 0; j < 3; j++)\r\n {\r\n const ind = triangles[i + ((j * j1) % 3)];\r\n\r\n verts.push(points[ind * 2], points[(ind * 2) + 1]);\r\n }\r\n for (let j = 0; j < 3; j++)\r\n {\r\n const ind = triangles[i + ((j * j1) % 3)];\r\n\r\n verts.push(pn[ind * 2], pn[(ind * 2) + 1]);\r\n }\r\n }\r\n }\r\n}\r\n","import type { Rectangle } from '@pixi/core';\r\nimport type { IShapeBuilder } from '../core/IShapeBuilder';\r\nimport { SmoothGraphicsData } from '../core/SmoothGraphicsData';\r\nimport { BuildData } from '../core/BuildData';\r\nimport { JOINT_TYPE } from '../core/const';\r\nimport { PolyBuilder } from './PolyBuilder';\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class RectangleBuilder implements IShapeBuilder\r\n{\r\n _polyBuilder = new PolyBuilder();\r\n\r\n path(graphicsData: SmoothGraphicsData, _target: BuildData)\r\n {\r\n // --- //\r\n // need to convert points to a nice regular data\r\n //\r\n const rectData = graphicsData.shape as Rectangle;\r\n const x = rectData.x;\r\n const y = rectData.y;\r\n const width = rectData.width;\r\n const height = rectData.height;\r\n const points = graphicsData.points;\r\n\r\n points.length = 0;\r\n\r\n points.push(x, y,\r\n x + width, y,\r\n x + width, y + height,\r\n x, y + height);\r\n }\r\n\r\n line(graphicsData: SmoothGraphicsData, target: BuildData): void\r\n {\r\n const { verts, joints } = target;\r\n const { points } = graphicsData;\r\n\r\n const joint = graphicsData.goodJointType();\r\n const len = points.length;\r\n\r\n verts.push(points[len - 2], points[len - 1]);\r\n joints.push(JOINT_TYPE.NONE);\r\n for (let i = 0; i < len; i += 2)\r\n {\r\n verts.push(points[i], points[i + 1]);\r\n joints.push(joint);\r\n }\r\n verts.push(points[0], points[1]);\r\n joints.push(JOINT_TYPE.NONE);\r\n verts.push(points[2], points[3]);\r\n joints.push(JOINT_TYPE.NONE);\r\n }\r\n\r\n fill(graphicsData: SmoothGraphicsData, target: BuildData): void\r\n {\r\n const { verts, joints } = target;\r\n const { points, triangles } = graphicsData;\r\n\r\n triangles.length = 0;\r\n\r\n if (!graphicsData.fillAA)\r\n {\r\n verts.push(points[0], points[1],\r\n points[2], points[3],\r\n points[4], points[5],\r\n points[6], points[7]);\r\n\r\n joints.push(JOINT_TYPE.FILL, JOINT_TYPE.FILL, JOINT_TYPE.FILL, JOINT_TYPE.FILL);\r\n triangles.push(0, 1, 2, 0, 2, 3);\r\n\r\n return;\r\n }\r\n\r\n this._polyBuilder.fill(graphicsData, target);\r\n }\r\n}\r\n","import type { IShapeBuilder } from '../core/IShapeBuilder';\r\nimport type { SmoothGraphicsData } from '../core/SmoothGraphicsData';\r\nimport type { BuildData } from '../core/BuildData';\r\nimport { CircleBuilder } from './CircleBuilder';\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class RoundedRectangleBuilder implements IShapeBuilder\r\n{\r\n _circleBuilder = new CircleBuilder();\r\n\r\n path(graphicsData: SmoothGraphicsData, target: BuildData)\r\n {\r\n this._circleBuilder.path(graphicsData, target);\r\n }\r\n\r\n line(graphicsData: SmoothGraphicsData, target: BuildData): void\r\n {\r\n this._circleBuilder.line(graphicsData, target);\r\n }\r\n\r\n fill(graphicsData: SmoothGraphicsData, target: BuildData): void\r\n {\r\n this._circleBuilder.fill(graphicsData, target);\r\n }\r\n}\r\n","import { SHAPES } from '@pixi/core';\r\nimport { IShapeBuilder } from '../core/IShapeBuilder';\r\nimport { CircleBuilder } from './CircleBuilder';\r\nimport { RectangleBuilder } from './RectangleBuilder';\r\nimport { RoundedRectangleBuilder } from './RoundedRectangleBuilder';\r\nimport { PolyBuilder } from './PolyBuilder';\r\n\r\nexport const FILL_COMMANDS: Record<SHAPES, IShapeBuilder> = {\r\n [SHAPES.POLY]: new PolyBuilder(),\r\n [SHAPES.CIRC]: new CircleBuilder(),\r\n [SHAPES.ELIP]: new CircleBuilder(),\r\n [SHAPES.RECT]: new RectangleBuilder(),\r\n [SHAPES.RREC]: new RoundedRectangleBuilder()\r\n};\r\n\r\nexport { CircleBuilder, RectangleBuilder, RoundedRectangleBuilder, PolyBuilder };\r\n","import { SmoothGraphicsData } from './core/SmoothGraphicsData';\r\n\r\nimport { FILL_COMMANDS } from './shapes';\r\n\r\nimport {\r\n Buffer,\r\n Color,\r\n Geometry,\r\n Texture,\r\n WRAP_MODES,\r\n TYPES,\r\n SHAPES,\r\n Point,\r\n Matrix,\r\n} from '@pixi/core';\r\n\r\nimport { Bounds } from '@pixi/display';\r\n\r\nimport type { Circle, Ellipse, Polygon, Rectangle, RoundedRectangle, IPointData } from '@pixi/core';\r\nimport { BuildData } from './core/BuildData';\r\nimport { SegmentPacker } from './core/SegmentPacker';\r\nimport { LineStyle } from './core/LineStyle';\r\nimport { FillStyle } from './core/FillStyle';\r\nimport { BatchPart } from './core/BatchPart';\r\nimport { BatchDrawCall, IGraphicsBatchSettings, matrixEquals } from './core/BatchDrawCall';\r\n\r\n/*\r\n * Complex shape type\r\n * @todo Move to Math shapes\r\n */\r\nexport type IShape = Circle | Ellipse | Polygon | Rectangle | RoundedRectangle;\r\n\r\nexport const BATCH_POOL: Array<BatchPart> = [];\r\nexport const DRAW_CALL_POOL: Array<BatchDrawCall> = [];\r\n\r\nconst tmpPoint = new Point();\r\nconst tmpBounds = new Bounds();\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class SmoothGraphicsGeometry extends Geometry\r\n{\r\n public static BATCHABLE_SIZE = 100;\r\n\r\n public boundsPadding: number;\r\n\r\n indicesUint16: Uint16Array | Uint32Array = null;\r\n batchable: boolean;\r\n\r\n buildData: BuildData;\r\n\r\n get points()\r\n {\r\n return this.buildData.verts;\r\n }\r\n\r\n get closePointEps()\r\n {\r\n return this.buildData.closePointEps;\r\n }\r\n\r\n graphicsData: Array<SmoothGraphicsData>;\r\n drawCalls: Array<BatchDrawCall>;\r\n batchDirty: number;\r\n batches: Array<BatchPart>;\r\n packer: SegmentPacker;\r\n packSize: number;\r\n pack32index: boolean;\r\n strideFloats: number;\r\n\r\n protected dirty: number;\r\n protected cacheDirty: number;\r\n protected clearDirty: number;\r\n protected shapeBuildIndex: number;\r\n protected shapeBatchIndex: number;\r\n protected _bounds: Bounds;\r\n protected boundsDirty: number;\r\n\r\n _buffer: Buffer;\r\n _indexBuffer: Buffer;\r\n _bufferFloats: Float32Array;\r\n _bufferUint: Uint32Array;\r\n\r\n initAttributes(_static: boolean)\r\n {\r\n this._buffer = new Buffer(null, _static, false);\r\n this._bufferFloats = new Float32Array();\r\n this._bufferUint = new Uint32Array();\r\n\r\n this._indexBuffer = new Buffer(null, _static, true);\r\n this.addAttribute('aPrev', this._buffer, 2, false, TYPES.FLOAT)\r\n .addAttribute('aPoint1', this._buffer, 2, false, TYPES.FLOAT)\r\n .addAttribute('aPoint2', this._buffer, 2, false, TYPES.FLOAT)\r\n .addAttribute('aNext', this._buffer, 2, false, TYPES.FLOAT)\r\n .addAttribute('aTravel', this._buffer, 1, false, TYPES.FLOAT)\r\n // number of vertex\r\n .addAttribute('aVertexJoint', this._buffer, 1, false, TYPES.FLOAT)\r\n // line width, alignment\r\n .addAttribute('aStyleId', this._buffer, 1, false, TYPES.FLOAT)\r\n // the usual\r\n .addAttribute('aColor', this._buffer, 4, true, TYPES.UNSIGNED_BYTE)\r\n .addIndex(this._indexBuffer);\r\n\r\n this.strideFloats = 12;\r\n }\r\n\r\n constructor()\r\n {\r\n super();\r\n\r\n this.initAttributes(false);\r\n\r\n this.buildData = new BuildData();\r\n\r\n this.graphicsData = [];\r\n\r\n this.dirty = 0;\r\n\r\n this.batchDirty = -1;\r\n\r\n this.cacheDirty = -1;\r\n\r\n this.clearDirty = 0;\r\n\r\n this.drawCalls = [];\r\n\r\n this.batches = [];\r\n\r\n this.shapeBuildIndex = 0;\r\n\r\n this.shapeBatchIndex = 0;\r\n\r\n this._bounds = new Bounds();\r\n\r\n this.boundsDirty = -1;\r\n\r\n this.boundsPadding = 0;\r\n\r\n this.batchable = false;\r\n\r\n this.indicesUint16 = null;\r\n\r\n this.packer = null;\r\n this.packSize = 0;\r\n this.pack32index = null;\r\n }\r\n\r\n public checkInstancing(instanced: boolean, allow32Indices: boolean)\r\n {\r\n if (this.packer)\r\n {\r\n return;\r\n }\r\n this.packer = new SegmentPacker();\r\n this.pack32index = allow32Indices;\r\n }\r\n\r\n /**\r\n * Get the current bounds of the graphic geometry.\r\n *\r\n * @member {PIXI.Bounds}\r\n * @readonly\r\n */\r\n public get bounds(): Bounds\r\n {\r\n if (this.boundsDirty !== this.dirty)\r\n {\r\n this.boundsDirty = this.dirty;\r\n this.calculateBounds();\r\n }\r\n\r\n return this._bounds;\r\n }\r\n\r\n /**\r\n * Call if you changed graphicsData manually.\r\n * Empties all batch buffers.\r\n */\r\n protected invalidate(): void\r\n {\r\n this.boundsDirty = -1;\r\n this.dirty++;\r\n this.batchDirty++;\r\n this.shapeBuildIndex = 0;\r\n this.shapeBatchIndex = 0;\r\n this.packSize = 0;\r\n\r\n this.buildData.clear();\r\n\r\n for (let i = 0; i < this.drawCalls.length; i++)\r\n {\r\n this.drawCalls[i].clear();\r\n DRAW_CALL_POOL.push(this.drawCalls[i]);\r\n }\r\n\r\n this.drawCalls.length = 0;\r\n\r\n for (let i = 0; i < this.batches.length; i++)\r\n {\r\n const batchPart = this.batches[i];\r\n\r\n batchPart.reset();\r\n BATCH_POOL.push(batchPart);\r\n }\r\n\r\n this.batches.length = 0;\r\n }\r\n\r\n public clear(): SmoothGraphicsGeometry\r\n {\r\n if (this.graphicsData.length > 0)\r\n {\r\n this.invalidate();\r\n this.clearDirty++;\r\n this.graphicsData.length = 0;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public drawShape(\r\n shape: IShape,\r\n fillStyle: FillStyle = null,\r\n lineStyle: LineStyle = null,\r\n matrix: Matrix = null): SmoothGraphicsGeometry\r\n {\r\n const data = new SmoothGraphicsData(shape, fillStyle, lineStyle, matrix);\r\n\r\n this.graphicsData.push(data);\r\n this.dirty++;\r\n\r\n return this;\r\n }\r\n\r\n public drawHole(shape: IShape, matrix: Matrix = null): SmoothGraphicsGeometry\r\n {\r\n if (!this.graphicsData.length)\r\n {\r\n return null;\r\n }\r\n\r\n const data = new SmoothGraphicsData(shape, null, null, matrix);\r\n\r\n const lastShape = this.graphicsData[this.graphicsData.length - 1];\r\n\r\n data.lineStyle = lastShape.lineStyle;\r\n\r\n lastShape.holes.push(data);\r\n\r\n this.dirty++;\r\n\r\n return this;\r\n }\r\n\r\n public destroy(): void\r\n {\r\n super.destroy();\r\n\r\n // destroy each of the SmoothGraphicsData objects\r\n for (let i = 0; i < this.graphicsData.length; ++i)\r\n {\r\n this.graphicsData[i].destroy();\r\n }\r\n\r\n this.buildData.destroy();\r\n this.buildData = null;\r\n this.indexBuffer.destroy();\r\n this.indexBuffer = null;\r\n this.graphicsData.length = 0;\r\n this.graphicsData = null;\r\n this.drawCalls.length = 0;\r\n this.drawCalls = null;\r\n this.batches.length = 0;\r\n this.batches = null;\r\n this._bounds = null;\r\n }\r\n\r\n /**\r\n * Check to see if a point is contained within this geometry.\r\n *\r\n * @param {PIXI.IPointData} point - Point to check if it's contained.\r\n * @return {Boolean} `true` if the point is contained within geometry.\r\n */\r\n public containsPoint(point: IPointData): boolean\r\n {\r\n const graphicsData = this.graphicsData;\r\n\r\n for (let i = 0; i < graphicsData.length; ++i)\r\n {\r\n const data = graphicsData[i];\r\n\r\n if (!data.fillStyle.visible)\r\n {\r\n continue;\r\n }\r\n\r\n // only deal with fills..\r\n if (data.shape)\r\n {\r\n if (data.matrix)\r\n {\r\n data.matrix.applyInverse(point, tmpPoint);\r\n }\r\n else\r\n {\r\n tmpPoint.copyFrom(point);\r\n }\r\n\r\n if (data.shape.contains(tmpPoint.x, tmpPoint.y))\r\n {\r\n let hitHole = false;\r\n\r\n if (data.holes)\r\n {\r\n for (let i = 0; i < data.holes.length; i++)\r\n {\r\n const hole = data.holes[i];\r\n\r\n if (hole.shape.contains(tmpPoint.x, tmpPoint.y))\r\n {\r\n hitHole = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!hitHole)\r\n {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n updatePoints(): void\r\n {\r\n // do nothing\r\n }\r\n\r\n updateBufferSize(): void\r\n {\r\n this._buffer.update(new Float32Array());\r\n }\r\n\r\n updateBuild(): void\r\n {\r\n const { graphicsData, buildData } = this;\r\n const len = graphicsData.length;\r\n\r\n for (let i = this.shapeBuildIndex; i < len; i++)\r\n {\r\n const data = graphicsData[i];\r\n\r\n data.strokeStart = 0;\r\n data.strokeLen = 0;\r\n data.fillStart = 0;\r\n data.fillLen = 0;\r\n const { fillStyle, lineStyle, holes } = data;\r\n\r\n if (!fillStyle.visible && !lineStyle.visible)\r\n {\r\n continue;\r\n }\r\n\r\n const command = FILL_COMMANDS[data.type];\r\n\r\n data.clearPath();\r\n\r\n command.path(data, buildData);\r\n if (data.matrix)\r\n {\r\n this.transformPoints(data.points, data.matrix);\r\n }\r\n\r\n data.clearBuild();\r\n if (data.points.length <= 2)\r\n {\r\n continue;\r\n }\r\n if (fillStyle.visible || lineStyle.visible)\r\n {\r\n this.processHoles(holes);\r\n }\r\n if (fillStyle.visible)\r\n {\r\n data.fillAA = (data.fillStyle as any).smooth\r\n && data.fillStyle.texture === Texture.WHITE\r\n && holes.length === 0\r\n && !(data.closeStroke\r\n && data.lineStyle.visible\r\n && !data.lineStyle.shader\r\n && data.lineStyle.alpha >= 0.99\r\n && data.lineStyle.width * Math.min(data.lineStyle.alignment, 1 - data.lineStyle.alignment) >= 0.495);\r\n\r\n data.fillStart = buildData.joints.length;\r\n\r\n if (holes.length)\r\n {\r\n FILL_COMMANDS[SHAPES.POLY].fill(data, buildData);\r\n }\r\n else\r\n {\r\n command.fill(data, buildData);\r\n }\r\n\r\n data.fillLen = buildData.joints.length - data.fillStart;\r\n }\r\n if (lineStyle.visible)\r\n {\r\n data.strokeStart = buildData.joints.length;\r\n command.line(data, buildData);\r\n for (let i = 0; i < holes.length; i++)\r\n {\r\n const hole = holes[i];\r\n\r\n FILL_COMMANDS[hole.type].line(hole, buildData);\r\n }\r\n data.strokeLen = buildData.joints.length - data.strokeStart;\r\n }\r\n }\r\n this.shapeBuildIndex = len;\r\n }\r\n\r\n updateBatches(shaderSettings?: IGraphicsBatchSettings): void\r\n {\r\n if (!this.graphicsData.length)\r\n {\r\n this.batchable = true;\r\n\r\n return;\r\n }\r\n this.updateBuild();\r\n\r\n if (!this.validateBatching())\r\n {\r\n return;\r\n }\r\n\r\n const { buildData, graphicsData } = this;\r\n const len = graphicsData.length;\r\n\r\n this.cacheDirty = this.dirty;\r\n\r\n let batchPart: BatchPart = null;\r\n\r\n let currentStyle = null;\r\n\r\n if (this.batches.length > 0)\r\n {\r\n batchPart = this.batches[this.batches.length - 1];\r\n currentStyle = batchPart.style;\r\n }\r\n\r\n for (let i = this.shapeBatchIndex; i < len; i++)\r\n {\r\n const data = graphicsData[i];\r\n const fillStyle = data.fillStyle;\r\n const lineStyle = data.lineStyle;\r\n\r\n if (data.matrix)\r\n {\r\n this.transformPoints(data.points, data.matrix);\r\n }\r\n if (!fillStyle.visible && !lineStyle.visible)\r\n {\r\n continue;\r\n }\r\n for (let j = 0; j < 2; j++)\r\n {\r\n const style = (j === 0) ? fillStyle : lineStyle;\r\n\r\n if (!style.visible) continue;\r\n\r\n const nextTexture = style.texture.baseTexture;\r\n const attribOld = buildData.vertexSize;\r\n const indexOld = buildData.indexSize;\r\n\r\n nextTexture.wrapMode = WRAP_MODES.REPEAT;\r\n if (j === 0)\r\n {\r\n this.packer.updateBufferSize(data.fillStart, data.fillLen, data.triangles.length, buildData);\r\n }\r\n else\r\n {\r\n this.packer.updateBufferSize(data.strokeStart, data.strokeLen, data.triangles.length, buildData);\r\n }\r\n\r\n const attribSize = buildData.vertexSize;\r\n\r\n if (attribSize === attribOld) continue;\r\n // close batch if style is different\r\n if (batchPart && !this._compareStyles(currentStyle, style))\r\n {\r\n batchPart.end(indexOld, attribOld);\r\n batchPart = null;\r\n }\r\n // spawn new batch if its first batch or previous was closed\r\n if (!batchPart)\r\n {\r\n batchPart = BATCH_POOL.pop() || new BatchPart();\r\n batchPart.begin(style, indexOld, attribOld);\r\n this.batches.push(batchPart);\r\n currentStyle = style;\r\n }\r\n\r\n if (j === 0)\r\n {\r\n batchPart.jointEnd = data.fillStart + data.fillLen;\r\n }\r\n else\r\n {\r\n batchPart.jointEnd = data.strokeStart + data.strokeLen;\r\n }\r\n }\r\n }\r\n this.shapeBatchIndex = len;\r\n\r\n if (batchPart)\r\n {\r\n batchPart.end(buildData.indexSize, buildData.vertexSize);\r\n }\r\n\r\n if (this.batches.length === 0)\r\n {\r\n // there are no visible styles in SmoothGraphicsData\r\n // its possible that someone wants Graphics just for the bounds\r\n this.batchable = true;\r\n\r\n return;\r\n }\r\n\r\n // TODO make this a const..\r\n this.batchable = this.isBatchable();\r\n\r\n if (this.batchable)\r\n {\r\n this.packBatches();\r\n }\r\n else\r\n {\r\n this.buildDrawCalls(shaderSettings);\r\n this.updatePack();\r\n }\r\n }\r\n\r\n updatePack()\r\n {\r\n const { vertexSize, indexSize } = this.buildData;\r\n\r\n if (this.packSize === vertexSize)\r\n {\r\n return;\r\n }\r\n\r\n const { strideFloats, packer, buildData, batches } = this;\r\n const buffer = this._buffer;\r\n const index = this._indexBuffer;\r\n const floatsSize = vertexSize * strideFloats;\r\n\r\n if (buffer.data.length !== floatsSize)\r\n {\r\n const arrBuf = new ArrayBuffer(floatsSize * 4);\r\n\r\n this._bufferFloats = new Float32Array(arrBuf);\r\n this._bufferUint = new Uint32Array(arrBuf);\r\n buffer.data = this._bufferFloats;\r\n }\r\n if (index.data.length !== indexSize)\r\n {\r\n if (vertexSize > 0xffff && this.pack32index)\r\n {\r\n index.data = new Uint32Array(indexSize);\r\n }\r\n else\r\n {\r\n index.data = new Uint16Array(indexSize);\r\n }\r\n }\r\n\r\n packer.beginPack(buildData, this._bufferFloats, this._bufferUint, index.data as Uint16Array);\r\n\r\n let j = 0;\r\n\r\n for (let i = 0; i < this.graphicsData.length; i++)\r\n {\r\n const data = this.graphicsData[i];\r\n\r\n if (data.fillLen)\r\n {\r\n while (batches[j].jointEnd <= data.fillStart)\r\n {\r\n j++;\r\n }\r\n packer.packInterleavedGeometry(data.fillStart, data.fillLen, data.triangles,\r\n batches[j].styleId, batches[j].rgba);\r\n }\r\n if (data.strokeLen)\r\n {\r\n while (batches[j].jointEnd <= data.strokeStart)\r\n {\r\n j++;\r\n }\r\n packer.packInterleavedGeometry(data.strokeStart, data.strokeLen, data.triangles,\r\n batches[j].styleId, batches[j].rgba);\r\n }\r\n }\r\n\r\n buffer.update();\r\n index.update();\r\n this.packSize = vertexSize;\r\n }\r\n\r\n /**\r\n * Affinity check\r\n *\r\n * @param {PIXI.FillStyle | PIXI.LineStyle} styleA\r\n * @param {PIXI.FillStyle | PIXI.LineStyle} styleB\r\n */\r\n protected _compareStyles(styleA: FillStyle | LineStyle, styleB: FillStyle | LineStyle): boolean\r\n {\r\n if (!styleA || !styleB)\r\n {\r\n return false;\r\n }\r\n\r\n if (styleA.texture.baseTexture !== styleB.texture.baseTexture)\r\n {\r\n return false;\r\n }\r\n\r\n if (styleA.color + styleA.alpha !== styleB.color + styleB.alpha)\r\n {\r\n return false;\r\n }\r\n\r\n if (styleA.shader !== styleB.shader)\r\n {\r\n return false;\r\n }\r\n // TODO: propagate width for FillStyle\r\n if ((styleA as LineStyle).width !== (styleB as LineStyle).width)\r\n {\r\n return false;\r\n }\r\n if ((styleA as LineStyle).scaleMode !== (styleB as LineStyle).scaleMode)\r\n {\r\n return false;\r\n }\r\n if ((styleA as LineStyle).alignment !== (styleB as LineStyle).alignment)\r\n {\r\n return false;\r\n }\r\n\r\n const mat1 = styleA.matrix || Matrix.IDENTITY;\r\n const mat2 = styleB.matrix || Matrix.IDENTITY;\r\n\r\n return matrixEquals(mat1, mat2);\r\n }\r\n\r\n /**\r\n * Test geometry for batching process.\r\n *\r\n * @protected\r\n */\r\n protected validateBatching(): boolean\r\n {\r\n if (this.dirty === this.cacheDirty || !this.graphicsData.length)\r\n {\r\n return false;\r\n }\r\n\r\n for (let i = 0, l = this.graphicsData.length; i < l; i++)\r\n {\r\n const data = this.graphicsData[i];\r\n const fill = data.fillStyle;\r\n const line = data.lineStyle;\r\n\r\n if (fill && !fill.texture.baseTexture.valid) return false;\r\n if (line && !line.texture.baseTexture.valid) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Offset the indices so that it works with the batcher.\r\n *\r\n * @protected\r\n */\r\n protected packBatches(): void\r\n {\r\n this.batchDirty++;\r\n const batches = this.batches;\r\n\r\n for (let i = 0, l = batches.length; i < l; i++)\r\n {\r\n const batch = batches[i];\r\n\r\n for (let j = 0; j < batch.size; j++)\r\n {\r\n const index = batch.start + j;\r\n\r\n this.indicesUint16[index] = this.indicesUint16[index] - batch.attribStart;\r\n }\r\n }\r\n }\r\n\r\n protected isBatchable(): boolean\r\n {\r\n return false;\r\n\r\n // prevent heavy mesh batching\r\n // if (this.points.length > 0xffff * 2) {\r\n // return false;\r\n // }\r\n //\r\n // const batches = this.batches;\r\n //\r\n // for (let i = 0; i < batches.length; i++) {\r\n // if ((batches[i].style as LineStyle).native) {\r\n // return false;\r\n // }\r\n // }\r\n //\r\n // return (this.points.length < SmoothGraphicsGeometry.BATCHABLE_SIZE * 2);\r\n }\r\n\r\n /**\r\n * Converts intermediate batches data to drawCalls.\r\n *\r\n * @protected\r\n */\r\n protected buildDrawCalls(shaderSettings?: IGraphicsBatchSettings)\r\n {\r\n for (let i = 0; i < this.drawCalls.length; i++)\r\n {\r\n this.drawCalls[i].clear();\r\n DRAW_CALL_POOL.push(this.drawCalls[i]);\r\n }\r\n\r\n this.drawCalls.length = 0;\r\n\r\n let currentGroup = DRAW_CALL_POOL.pop() || new BatchDrawCall();\r\n\r\n currentGroup.begin(shaderSettings, null);\r\n\r\n let index = 0;\r\n\r\n this.drawCalls.push(currentGroup);\r\n\r\n for (let i = 0; i < this.batches.length; i++)\r\n {\r\n const batchData = this.batches[i];\r\n const style = batchData.style as LineStyle;\r\n\r\n if (batchData.attribSize === 0)\r\n {\r\n // I don't know how why do we have size=0 sometimes\r\n continue;\r\n }\r\n\r\n let styleId = -1;\r\n const mat = style.getTextureMatrix();\r\n\r\n if (currentGroup.check(style.shader))\r\n {\r\n styleId = currentGroup.add(style.texture, mat,\r\n style.width, style.alignment || 0, style.packLineScale());\r\n }\r\n if (styleId < 0)\r\n {\r\n currentGroup = DRAW_CALL_POOL.pop() || new BatchDrawCall();\r\n this.drawCalls.push(currentGroup);\r\n currentGroup.begin(shaderSettings, style.shader);\r\n currentGroup.start = index;\r\n styleId = currentGroup.add(style.texture, mat,\r\n style.width, style.alignment || 0, style.packLineScale());\r\n }\r\n currentGroup.size += batchData.size;\r\n index += batchData.size;\r\n\r\n const { color, alpha } = style;\r\n const bgr = Color.shared\r\n .setValue(color)\r\n .toLittleEndianNumber();\r\n\r\n batchData.rgba = Color.shared\r\n .setValue(bgr)\r\n .toPremultiplied(alpha);\r\n batchData.styleId = styleId;\r\n }\r\n }\r\n\r\n protected processHoles(holes: Array<SmoothGraphicsData>): void\r\n {\r\n for (let i = 0; i < holes.length; i++)\r\n {\r\n const hole = holes[i];\r\n const command = FILL_COMMANDS[hole.type];\r\n\r\n hole.clearPath();\r\n\r\n command.path(hole, this.buildData);\r\n\r\n if (hole.matrix)\r\n {\r\n this.transformPoints(hole.points, hole.matrix);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update the local bounds of the object. Expensive to use performance-wise.\r\n *\r\n * @protected\r\n */\r\n protected calculateBounds(): void\r\n {\r\n const bounds = this._bounds;\r\n const sequenceBounds = tmpBounds;\r\n let curMatrix = Matrix.IDENTITY;\r\n\r\n this._bounds.clear();\r\n sequenceBounds.clear();\r\n\r\n for (let i = 0; i < this.graphicsData.length; i++)\r\n {\r\n const data = this.graphicsData[i];\r\n const shape = data.shape;\r\n const type = data.type;\r\n const lineStyle = data.lineStyle;\r\n const nextMatrix = data.matrix || Matrix.IDENTITY;\r\n let lineWidth = 0.0;\r\n\r\n if (lineStyle && lineStyle.visible)\r\n {\r\n lineWidth = lineStyle.width;\r\n\r\n if (type !== SHAPES.POLY || data.fillStyle.visible)\r\n {\r\n lineWidth *= Math.max(0, lineStyle.alignment);\r\n }\r\n else\r\n {\r\n lineWidth *= Math.max(lineStyle.alignment, 1 - lineStyle.alignment);\r\n }\r\n }\r\n\r\n if (curMatrix !== nextMatrix)\r\n {\r\n if (!sequenceBounds.isEmpty())\r\n {\r\n bounds.addBoundsMatrix(sequenceBounds, curMatrix);\r\n sequenceBounds.clear();\r\n }\r\n curMatrix = nextMatrix;\r\n }\r\n\r\n if (type === SHAPES.RECT || type === SHAPES.RREC)\r\n {\r\n const rect = shape as Rectangle | RoundedRectangle;\r\n\r\n sequenceBounds.addFramePad(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height,\r\n lineWidth, lineWidth);\r\n }\r\n else if (type === SHAPES.CIRC)\r\n {\r\n const circle = shape as Circle;\r\n\r\n sequenceBounds.addFramePad(circle.x, circle.y, circle.x, circle.y,\r\n circle.radius + lineWidth, circle.radius + lineWidth);\r\n }\r\n else if (type === SHAPES.ELIP)\r\n {\r\n const ellipse = shape as Ellipse;\r\n\r\n sequenceBounds.addFramePad(ellipse.x, ellipse.y, ellipse.x, ellipse.y,\r\n ellipse.width + lineWidth, ellipse.height + lineWidth);\r\n }\r\n else\r\n {\r\n const poly = shape as Polygon;\r\n // adding directly to the bounds\r\n\r\n bounds.addVerticesMatrix(curMatrix, (poly.points as any), 0, poly.points.length, lineWidth, lineWidth);\r\n }\r\n }\r\n\r\n if (!sequenceBounds.isEmpty())\r\n {\r\n bounds.addBoundsMatrix(sequenceBounds, curMatrix);\r\n }\r\n\r\n bounds.pad(this.boundsPadding, this.boundsPadding);\r\n }\r\n\r\n /**\r\n * Transform points using matrix.\r\n *\r\n * @protected\r\n * @param {number[]} points - Points to transform\r\n * @param {PIXI.Matrix} matrix - Transform matrix\r\n */\r\n protected transformPoints(points: Array<number>, matrix: Matrix): void\r\n {\r\n for (let i = 0; i < points.length / 2; i++)\r\n {\r\n const x = points[(i * 2)];\r\n const y = points[(i * 2) + 1];\r\n\r\n points[(i * 2)] = (matrix.a * x) + (matrix.c * y) + matrix.tx;\r\n points[(i * 2) + 1] = (matrix.b * x) + (matrix.d * y) + matrix.ty;\r\n }\r\n }\r\n}\r\n","import { Program, Shader } from '@pixi/core';\r\nimport { IGraphicsBatchSettings } from './core/BatchDrawCall';\r\n\r\nconst smoothVert = `#version 100\r\nprecision highp float;\r\nconst float FILL = 1.0;\r\nconst float BEVEL = 4.0;\r\nconst float MITER = 8.0;\r\nconst float ROUND = 12.0;\r\nconst float JOINT_CAP_BUTT = 16.0;\r\nconst float JOINT_CAP_SQUARE = 18.0;\r\nconst float JOINT_CAP_ROUND = 20.0;\r\n\r\nconst float FILL_EXPAND = 24.0;\r\n\r\nconst float CAP_BUTT = 1.0;\r\nconst float CAP_SQUARE = 2.0;\r\nconst float CAP_ROUND = 3.0;\r\nconst float CAP_BUTT2 = 4.0;\r\n\r\nconst float MITER_LIMIT = 10.0;\r\n\r\n// === geom ===\r\nattribute vec2 aPrev;\r\nattribute vec2 aPoint1;\r\nattribute vec2 aPoint2;\r\nattribute vec2 aNext;\r\nattribute float aVertexJoint;\r\nattribute float aTravel;\r\n\r\nuniform mat3 projectionMatrix;\r\nuniform mat3 translationMatrix;\r\nuniform vec4 tint;\r\n\r\nvarying vec4 vLine1;\r\nvarying vec4 vLine2;\r\nvarying vec4 vArc;\r\nvarying float vType;\r\n\r\nuniform float resolution;\r\nuniform float expand;\r\n\r\n// === style ===\r\nattribute float aStyleId;\r\nattribute vec4 aColor;\r\n\r\nvarying float vTextureId;\r\nvarying vec4 vColor;\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vTravel;\r\n\r\nuniform vec2 styleLine[%MAX_STYLES%];\r\nuniform vec3 styleMatrix[2 * %MAX_STYLES%];\r\nuniform float styleTextureId[%MAX_STYLES%];\r\nuniform vec2 samplerSize[%MAX_TEXTURES%];\r\n\r\nvec2 doBisect(vec2 norm, float len, vec2 norm2, float len2,\r\n float dy, float inner) {\r\n vec2 bisect = (norm + norm2) / 2.0;\r\n bisect /= dot(norm, bisect);\r\n vec2 shift = dy * bisect;\r\n if (inner > 0.5) {\r\n if (len < len2) {\r\n if (abs(dy * (bisect.x * norm.y - bisect.y * norm.x)) > len) {\r\n return dy * norm;\r\n }\r\n } else {\r\n if (abs(dy * (bisect.x * norm2.y - bisect.y * norm2.x)) > len2) {\r\n return dy * norm;\r\n }\r\n }\r\n }\r\n return dy * bisect;\r\n}\r\n\r\nvoid main(void){\r\n vec2 pointA = (translationMatrix * vec3(aPoint1, 1.0)).xy;\r\n vec2 pointB = (translationMatrix * vec3(aPoint2, 1.0)).xy;\r\n\r\n vec2 xBasis = pointB - pointA;\r\n float len = length(xBasis);\r\n vec2 forward = xBasis / len;\r\n vec2 norm = vec2(forward.y, -forward.x);\r\n\r\n float type = floor(aVertexJoint / 16.0);\r\n float vertexNum = aVertexJoint - type * 16.0;\r\n float dx = 0.0, dy = 1.0;\r\n\r\n float capType = floor(type / 32.0);\r\n type -= capType * 32.0;\r\n\r\n int styleId = int(aStyleId + 0.5);\r\n float lineWidth = styleLine[styleId].x;\r\n vTextureId = floor(styleTextureId[styleId] / 4.0);\r\n float scaleMode = styleTextureId[styleId] - vTextureId * 4.0;\r\n float avgScale = 1.0;\r\n if (scaleMode > 2.5) {\r\n avgScale = length(translationMatrix * vec3(1.0, 0.0, 0.0));\r\n } else if (scaleMode > 1.5) {\r\n avgScale = length(translationMatrix * vec3(0.0, 1.0, 0.0));\r\n } else if (scaleMode > 0.5) {\r\n vec2 avgDiag = (translationMatrix * vec3(1.0, 1.0, 0.0)).xy;\r\n avgScale = sqrt(dot(avgDiag, avgDiag) * 0.5);\r\n }\r\n lineWidth *= 0.5 * avgScale;\r\n float lineAlignment = 2.0 * styleLine[styleId].y - 1.0;\r\n vTextureCoord = vec2(0.0);\r\n\r\n vec2 pos;\r\n\r\n if (capType == CAP_ROUND) {\r\n vertexNum += 4.0;\r\n type = JOINT_CAP_ROUND;\r\n capType = 0.0;\r\n lineAlignment = -lineAlignment;\r\n }\r\n\r\n vLine1 = vec4(0.0, 10.0, 1.0, 0.0);\r\n vLine2 = vec4(0.0, 10.0, 1.0, 0.0);\r\n vArc = vec4(0.0);\r\n if (type == FILL) {\r\n pos = pointA;\r\n vType = 0.0;\r\n vLine2 = vec4(-2.0, -2.0, -2.0, 0.0);\r\n vec2 vTexturePixel;\r\n vTexturePixel.x = dot(vec3(aPoint1, 1.0), styleMatrix[styleId * 2]);\r\n vTexturePixel.y = dot(vec3(aPoint1, 1.0), styleMatrix[styleId * 2 + 1]);\r\n vTextureCoord = vTexturePixel / samplerSize[int(vTextureId)];\r\n } else if (type >= FILL_EXPAND && type < FILL_EXPAND + 7.5) {\r\n // expand vertices\r\n float flags = type - FILL_EXPAND;\r\n float flag3 = floor(flags / 4.0);\r\n float flag2 = floor((flags - flag3 * 4.0) / 2.0);\r\n float flag1 = flags - flag3 * 4.0 - flag2 * 2.0;\r\n\r\n vec2 prev = (translationMatrix * vec3(aPrev, 1.0)).xy;\r\n\r\n if (vertexNum < 0.5) {\r\n pos = prev;\r\n } else if (vertexNum < 1.5) {\r\n pos = pointA;\r\n } else {\r\n pos = pointB;\r\n }\r\n float len2 = length(aNext);\r\n vec2 bisect = (translationMatrix * vec3(aNext, 0.0)).xy;\r\n if (len2 > 0.01) {\r\n bisect = normalize(bisect) * len2;\r\n }\r\n\r\n vec2 n1 = normalize(vec2(pointA.y - prev.y, -(pointA.x - prev.x)));\r\n vec2 n2 = normalize(vec2(pointB.y - pointA.y, -(pointB.x - pointA.x)));\r\n vec2 n3 = normalize(vec2(prev.y - pointB.y, -(prev.x - pointB.x)));\r\n\r\n if (n1.x * n2.y - n1.y * n2.x < 0.0) {\r\n n1 = -n1;\r\n n2 = -n2;\r\n n3 = -n3;\r\n }\r\n pos += bisect * expand;\r\n\r\n vLine1 = vec4(16.0, 16.0, 16.0, -1.0);\r\n if (flag1 > 0.5) {\r\n vLine1.x = -dot(pos - prev, n1);\r\n }\r\n if (flag2 > 0.5) {\r\n vLine1.y = -dot(pos - pointA, n2);\r\n }\r\n if (flag3 > 0.5) {\r\n vLine1.z = -dot(pos - pointB, n3);\r\n }\r\n vLine1.xyz *= resolution;\r\n vType = 2.0;\r\n } else if (type >= BEVEL) {\r\n float dy = lineWidth + expand;\r\n float shift = lineWidth * lineAlignment;\r\n float inner = 0.0;\r\n if (vertexNum >= 1.5) {\r\n dy = -dy;\r\n inner = 1.0;\r\n }\r\n\r\n vec2 base, next, xBasis2, bisect;\r\n float flag = 0.0;\r\n float side2 = 1.0;\r\n if (vertexNum < 0.5 || vertexNum > 2.5 && vertexNum < 3.5) {\r\n next = (translationMatrix * vec3(aPrev, 1.0)).xy;\r\n base = pointA;\r\n flag = type - floor(type / 2.0) * 2.0;\r\n side2 = -1.0;\r\n } else {\r\n next = (translationMatrix * vec3(aNext, 1.0)).xy;\r\n base = pointB;\r\n if (type >= MITER && type < MITER + 3.5) {\r\n flag = step(MITER + 1.5, type);\r\n // check miter limit here?\r\n }\r\n }\r\n xBasis2 = next - base;\r\n float len2 = length(xBasis2);\r\n vec2 norm2 = vec2(xBasis2.y, -xBasis2.x) / len2;\r\n float D = norm.x * norm2.y - norm.y * norm2.x;\r\n if (D < 0.0) {\r\n inner = 1.0 - inner;\r\n }\r\n\r\n norm2 *= side2;\r\n\r\n float collinear = step(0.0, dot(norm, norm2));\r\n\r\n vType = 0.0;\r\n float dy2 = -1000.0;\r\n\r\n if (abs(D) < 0.01 && collinear < 0.5) {\r\n if (type >= ROUND && type < ROUND + 1.5) {\r\n type = JOINT_CAP_ROUND;\r\n }\r\n //TODO: BUTT here too\r\n }\r\n\r\n vLine1 = vec4(0.0, lineWidth, max(abs(norm.x), abs(norm.y)), min(abs(norm.x), abs(norm.y)));\r\n vLine2 = vec4(0.0, lineWidth, max(abs(norm2.x), abs(norm2.y)), min(abs(norm2.x), abs(norm2.y)));\r\n\r\n if (vertexNum < 3.5) {\r\n if (abs(D) < 0.01 && collinear < 0.5) {\r\n pos = (shift + dy) * norm;\r\n } else {\r\n if (flag < 0.5 && inner < 0.5) {\r\n pos = (shift + dy) * norm;\r\n } else {\r\n pos = doBisect(norm, len, norm2, len2, shift + dy, inner);\r\n }\r\n }\r\n vLine2.y = -1000.0;\r\n if (capType >= CAP_BUTT && capType < CAP_ROUND) {\r\n float extra = step(CAP_SQUARE, capType) * lineWidth;\r\n vec2 back = -forward;\r\n if (vertexNum < 0.5 || vertexNum > 2.5) {\r\n pos += back * (expand + extra);\r\n dy2 = expand;\r\n } else {\r\n dy2 = dot(pos + base - pointA, back) - extra;\r\n }\r\n }\r\n if (type >= JOINT_CAP_BUTT && type < JOINT_CAP_SQUARE + 0.5) {\r\n float extra = step(JOINT_CAP_SQUARE, type) * lineWidth;\r\n if (vertexNum < 0.5 || vertexNum > 2.5) {\r\n vLine2.y = dot(pos + base - pointB, forward) - extra;\r\n } else {\r\n pos += forward * (expand + extra);\r\n vLine2.y = expand;\r\n if (capType >= CAP_BUTT) {\r\n dy2 -= expand + extra;\r\n }\r\n }\r\n }\r\n } else if (type >= JOINT_CAP_ROUND && type < JOINT_CAP_ROUND + 1.5) {\r\n base += shift * norm;\r\n if (inner > 0.5) {\r\n dy = -dy;\r\n inner = 0.0;\r\n }\r\n vec2 d2 = abs(dy) * forward;\r\n if (vertexNum < 4.5) {\r\n dy = -dy;\r\n pos = dy * norm;\r\n } else if (vertexNum < 5.5) {\r\n pos = dy * norm;\r\n } else if (vertexNum < 6.5) {\r\n pos = dy * norm + d2;\r\n vArc.x = abs(dy);\r\n } else {\r\n dy = -dy;\r\n pos = dy * norm + d2;\r\n vArc.x = abs(dy);\r\n }\r\n vLine2 = vec4(0.0, lineWidth * 2.0 + 10.0, 1.0 , 0.0); // forget about line2 with type=3\r\n vArc.y = dy;\r\n vArc.z = 0.0;\r\n vArc.w = lineWidth;\r\n vType = 3.0;\r\n } else if (abs(D) < 0.01 && collinear < 0.5) {\r\n pos = dy * norm;\r\n } else {\r\n if (inner > 0.5) {\r\n dy = -dy;\r\n inner = 0.0;\r\n }\r\n float side = sign(dy);\r\n vec2 norm3 = normalize(norm + norm2);\r\n\r\n if (type >= MITER && type < MITER + 3.5) {\r\n vec2 farVertex = doBisect(norm, len, norm2, len2, shift + dy, 0.0);\r\n if (length(farVertex) > abs(shift + dy) * MITER_LIMIT) {\r\n type = BEVEL;\r\n }\r\n }\r\n\r\n if (vertexNum < 4.5) {\r\n pos = doBisect(norm, len, norm2, len2, shift - dy, 1.0);\r\n } else if (vertexNum < 5.5) {\r\n pos = (shift + dy) * norm;\r\n } else if (vertexNum > 7.5) {\r\n pos = (shift + dy) * norm2;\r\n } else {\r\n if (type >= ROUND && type < ROUND + 1.5) {\r\n pos = doBisect(norm, len, norm2, len2, shift + dy, 0.0);\r\n float d2 = abs(shift + dy);\r\n if (length(pos) > abs(shift + dy) * 1.5) {\r\n if (vertexNum < 6.5) {\r\n pos.x = (shift + dy) * norm.x - d2 * norm.y;\r\n pos.y = (shift + dy) * norm.y + d2 * norm.x;\r\n } else {\r\n pos.x = (shift + dy) * norm2.x + d2 * norm2.y;\r\n pos.y = (shift + dy) * norm2.y - d2 * norm2.x;\r\n }\r\n }\r\n } else if (type >= MITER && type < MITER + 3.5) {\r\n pos = doBisect(norm, len, norm2, len2, shift + dy, 0.0); //farVertex\r\n } else if (type >= BEVEL && type < BEVEL + 1.5) {\r\n float d2 = side / resolution;\r\n if (vertexNum < 6.5) {\r\n pos = (shift + dy) * norm + d2 * norm3;\r\n } else {\r\n pos = (shift + dy) * norm2 + d2 * norm3;\r\n }\r\n }\r\n }\r\n\r\n if (type >= ROUND && type < ROUND + 1.5) {\r\n vArc.x = side * dot(pos, norm3);\r\n vArc.y = pos.x * norm3.y - pos.y * norm3.x;\r\n vArc.z = dot(norm, norm3) * (lineWidth + side * shift);\r\n vArc.w = lineWidth + side * shift;\r\n vType = 3.0;\r\n } else if (type >= MITER && type < MITER + 3.5) {\r\n vType = 1.0;\r\n } else if (type >= BEVEL && type < BEVEL + 1.5) {\r\n vType = 4.0;\r\n vArc.z = dot(norm, norm3) * (lineWidth + side * shift) - side * dot(pos, norm3);\r\n }\r\n\r\n dy = side * (dot(pos, norm) - shift);\r\n dy2 = side * (dot(pos, norm2) - shift);\r\n }\r\n\r\n pos += base;\r\n vLine1.xy = vec2(dy, vLine1.y) * resolution;\r\n vLine2.xy = vec2(dy2, vLine2.y) * resolution;\r\n vArc = vArc * resolution;\r\n vTravel = vec2(aTravel * avgScale + dot(pos - pointA, vec2(-norm.y, norm.x)), avgScale);\r\n }\r\n\r\n gl_Position = vec4((projectionMatrix * vec3(pos, 1.0)).xy, 0.0, 1.0);\r\n\r\n vColor = aColor * tint;\r\n}`;\r\n\r\nconst precision = `#version 100\r\n#ifdef GL_FRAGMENT_PRECISION_HIGH\r\n precision highp float;\r\n#else\r\n precision mediump float;\r\n#endif\r\n`;\r\n\r\nconst smoothFrag = `%PRECISION%\r\nvarying vec4 vColor;\r\nvarying vec4 vLine1;\r\nvarying vec4 vLine2;\r\nvarying vec4 vArc;\r\nvarying float vType;\r\nvarying float vTextureId;\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vTravel;\r\nuniform sampler2D uSamplers[%MAX_TEXTURES%];\r\n\r\n%PIXEL_LINE%\r\n\r\nvoid main(void){\r\n %PIXEL_COVERAGE%\r\n\r\n vec4 texColor;\r\n float textureId = floor(vTextureId+0.5);\r\n %FOR_LOOP%\r\n\r\n gl_FragColor = vColor * texColor * alpha;\r\n}\r\n`;\r\n\r\nconst pixelLineFunc = [`\r\nfloat pixelLine(float x, float A, float B) {\r\n return clamp(x + 0.5, 0.0, 1.0);\r\n}\r\n`, `\r\nfloat pixelLine(float x, float A, float B) {\r\n float y = abs(x), s = sign(x);\r\n if (y * 2.0 < A - B) {\r\n return 0.5 + s * y / A;\r\n }\r\n y -= (A - B) * 0.5;\r\n y = max(1.0 - y / B, 0.0);\r\n return (1.0 + s * (1.0 - y * y)) * 0.5;\r\n //return clamp(x + 0.5, 0.0, 1.0);\r\n}\r\n`];\r\n\r\nconst pixelCoverage = `float alpha = 1.0;\r\nif (vType < 0.5) {\r\n float left = pixelLine(-vLine1.y - vLine1.x, vLine1.z, vLine1.w);\r\n float right = pixelLine(vLine1.y - vLine1.x, vLine1.z, vLine1.w);\r\n float near = vLine2.x - 0.5;\r\n float far = min(vLine2.x + 0.5, 0.0);\r\n float top = vLine2.y - 0.5;\r\n float bottom = min(vLine2.y + 0.5, 0.0);\r\n alpha = (right - left) * max(bottom - top, 0.0) * max(far - near, 0.0);\r\n} else if (vType < 1.5) {\r\n float a1 = pixelLine(- vLine1.y - vLine1.x, vLine1.z, vLine1.w);\r\n float a2 = pixelLine(vLine1.y - vLine1.x, vLine1.z, vLine1.w);\r\n float b1 = pixelLine(- vLine2.y - vLine2.x, vLine2.z, vLine2.w);\r\n float b2 = pixelLine(vLine2.y - vLine2.x, vLine2.z, vLine2.w);\r\n alpha = a2 * b2 - a1 * b1;\r\n} else if (vType < 2.5) {\r\n alpha *= max(min(vLine1.x + 0.5, 1.0), 0.0);\r\n alpha *= max(min(vLine1.y + 0.5, 1.0), 0.0);\r\n alpha *= max(min(vLine1.z + 0.5, 1.0), 0.0);\r\n} else if (vType < 3.5) {\r\n float a1 = pixelLine(- vLine1.y - vLine1.x, vLine1.z, vLine1.w);\r\n float a2 = pixelLine(vLine1.y - vLine1.x, vLine1.z, vLine1.w);\r\n float b1 = pixelLine(- vLine2.y - vLine2.x, vLine2.z, vLine2.w);\r\n float b2 = pixelLine(vLine2.y - vLine2.x, vLine2.z, vLine2.w);\r\n float alpha_miter = a2 * b2 - a1 * b1;\r\n float alpha_plane = clamp(vArc.z - vArc.x + 0.5, 0.0, 1.0);\r\n float d = length(vArc.xy);\r\n float circle_hor = max(min(vArc.w, d + 0.5) - max(-vArc.w, d - 0.5), 0.0);\r\n float circle_vert = min(vArc.w * 2.0, 1.0);\r\n float alpha_circle = circle_hor * circle_vert;\r\n alpha = min(alpha_miter, max(alpha_circle, alpha_plane));\r\n} else {\r\n float a1 = pixelLine(- vLine1.y - vLine1.x, vLine1.z, vLine1.w);\r\n float a2 = pixelLine(vLine1.y - vLine1.x, vLine1.z, vLine1.w);\r\n float b1 = pixelLine(- vLine2.y - vLine2.x, vLine2.z, vLine2.w);\r\n float b2 = pixelLine(vLine2.y - vLine2.x, vLine2.z, vLine2.w);\r\n alpha = a2 * b2 - a1 * b1;\r\n alpha *= clamp(vArc.z + 0.5, 0.0, 1.0);\r\n}\r\n`;\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class SmoothGraphicsShader extends Shader\r\n{\r\n settings: IGraphicsBatchSettings;\r\n\r\n constructor(settings: IGraphicsBatchSettings,\r\n vert = smoothVert,\r\n frag = smoothFrag,\r\n uniforms = {})\r\n {\r\n vert = SmoothGraphicsShader.generateVertexSrc(settings, vert);\r\n frag = SmoothGraphicsShader.generateFragmentSrc(settings, frag);\r\n\r\n const { maxStyles, maxTextures } = settings;\r\n const sampleValues = new Int32Array(maxTextures);\r\n\r\n for (let i = 0; i < maxTextures; i++)\r\n {\r\n sampleValues[i] = i;\r\n }\r\n super(Program.from(vert, frag), (Object as any).assign(uniforms, {\r\n styleMatrix: new Float32Array(6 * maxStyles),\r\n styleTextureId: new Float32Array(maxStyles),\r\n styleLine: new Float32Array(2 * maxStyles),\r\n samplerSize: new Float32Array(2 * maxTextures),\r\n uSamplers: sampleValues,\r\n tint: new Float32Array([1, 1, 1, 1]),\r\n resolution: 1,\r\n expand: 1,\r\n }));\r\n this.settings = settings;\r\n }\r\n\r\n static generateVertexSrc(settings: IGraphicsBatchSettings, vertexSrc = smoothVert): string\r\n {\r\n const { maxStyles, maxTextures } = settings;\r\n\r\n vertexSrc = vertexSrc.replace(/%MAX_TEXTURES%/gi, `${maxTextures}`)\r\n .replace(/%MAX_STYLES%/gi, `${maxStyles}`);\r\n\r\n return vertexSrc;\r\n }\r\n\r\n static generateFragmentSrc(settings: IGraphicsBatchSettings, fragmentSrc = smoothFrag): string\r\n {\r\n const { maxTextures, pixelLine } = settings;\r\n\r\n fragmentSrc = fragmentSrc.replace(/%PRECISION%/gi, precision)\r\n .replace(/%PIXEL_LINE%/gi, pixelLineFunc[pixelLine])\r\n .replace(/%PIXEL_COVERAGE%/gi, pixelCoverage)\r\n .replace(/%MAX_TEXTURES%/gi, `${maxTextures}`)\r\n .replace(/%FOR_LOOP%/gi, this.generateSampleSrc(maxTextures));\r\n\r\n return fragmentSrc;\r\n }\r\n\r\n static generateSampleSrc(maxTextures: number): string\r\n {\r\n let src = '';\r\n\r\n src += '\\n';\r\n src += '\\n';\r\n\r\n for (let i = 0; i < maxTextures; i++)\r\n {\r\n if (i > 0)\r\n {\r\n src += '\\nelse ';\r\n }\r\n\r\n if (i < maxTextures - 1)\r\n {\r\n src += `if(textureId < ${i}.5)`;\r\n }\r\n\r\n src += '\\n{';\r\n src += `\\n\\ttexColor = texture2D(uSamplers[${i}], vTextureCoord);`;\r\n src += '\\n}';\r\n }\r\n\r\n src += '\\n';\r\n src += '\\n';\r\n\r\n return src;\r\n }\r\n}\r\n","import { LINE_SCALE_MODE } from './core/LineStyle';\r\n\r\nexport interface ISettings\r\n{\r\n LINE_SCALE_MODE: string;\r\n SHADER_MAX_STYLES: number;\r\n SHADER_MAX_TEXTURES: number;\r\n PIXEL_LINE: number;\r\n}\r\n\r\nexport const settings: ISettings = {\r\n LINE_SCALE_MODE: LINE_SCALE_MODE.NORMAL,\r\n SHADER_MAX_STYLES: 24,\r\n SHADER_MAX_TEXTURES: 4,\r\n PIXEL_LINE: 0,\r\n};\r\n","import {\r\n Circle,\r\n Color,\r\n Ellipse,\r\n PI_2,\r\n Point,\r\n Polygon,\r\n Rectangle,\r\n RoundedRectangle,\r\n Matrix,\r\n SHAPES,\r\n utils,\r\n Texture,\r\n State,\r\n Renderer,\r\n Shader,\r\n BLEND_MODES,\r\n DRAW_MODES,\r\n MSAA_QUALITY,\r\n} from '@pixi/core';\r\n\r\nimport { curves, Graphics, graphicsUtils, LINE_JOIN, LINE_CAP } from '@pixi/graphics';\r\nimport { SmoothGraphicsGeometry } from './SmoothGraphicsGeometry';\r\nimport { Container } from '@pixi/display';\r\n\r\nimport type { ColorSource, IShape, IPointData } from '@pixi/core';\r\nimport type { IDestroyOptions } from '@pixi/display';\r\nimport { IGraphicsBatchSettings } from './core/BatchDrawCall';\r\nimport { FillStyle } from './core/FillStyle';\r\nimport { LINE_SCALE_MODE, LineStyle } from './core/LineStyle';\r\nimport { SmoothGraphicsShader } from './SmoothShader';\r\nimport { settings } from './settings';\r\n\r\nconst UnsmoothGraphics = Graphics;\r\nconst { BezierUtils, QuadraticUtils, ArcUtils } = graphicsUtils;\r\n\r\n// a default shaders map used by graphics..\r\nconst DEFAULT_SHADERS: { [key: string]: Shader } = {};\r\n\r\nexport interface IFillStyleOptions\r\n{\r\n color?: ColorSource;\r\n alpha?: number;\r\n texture?: Texture;\r\n matrix?: Matrix;\r\n smooth?: boolean;\r\n shader?: Shader;\r\n}\r\n\r\nexport interface ILineStyleOptions extends IFillStyleOptions\r\n{\r\n width?: number;\r\n alignment?: number;\r\n scaleMode?: LINE_SCALE_MODE;\r\n cap?: LINE_CAP;\r\n join?: LINE_JOIN;\r\n miterLimit?: number;\r\n}\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class SmoothGraphics extends Container\r\n{\r\n public static readonly curves = curves;\r\n\r\n static _TEMP_POINT = new Point();\r\n\r\n public shader: Shader;\r\n public shaderSettings: IGraphicsBatchSettings;\r\n public pluginName: string;\r\n public currentPath: Polygon;\r\n\r\n protected batches: Array<any>;\r\n protected batchTint: number;\r\n protected batchDirty: number;\r\n protected vertexData: Float32Array;\r\n\r\n protected _fillStyle: FillStyle;\r\n protected _lineStyle: LineStyle;\r\n protected _matrix: Matrix;\r\n protected _holeMode: boolean;\r\n protected _transformID: number;\r\n protected _tintColor: Color;\r\n\r\n private state: State;\r\n private _geometry: SmoothGraphicsGeometry;\r\n\r\n public get geometry(): SmoothGraphicsGeometry\r\n {\r\n return this._geometry;\r\n }\r\n\r\n constructor(geometry: SmoothGraphicsGeometry = null)\r\n {\r\n super();\r\n\r\n this._geometry = geometry || new SmoothGraphicsGeometry();\r\n this._geometry.refCount++;\r\n\r\n this.shader = null;\r\n\r\n this.shaderSettings = {\r\n maxStyles: settings.SHADER_MAX_STYLES,\r\n maxTextures: settings.SHADER_MAX_TEXTURES,\r\n pixelLine: settings.PIXEL_LINE,\r\n };\r\n\r\n this.state = State.for2d();\r\n\r\n this._fillStyle = new FillStyle();\r\n\r\n this._lineStyle = new LineStyle();\r\n\r\n this._matrix = null;\r\n\r\n this._holeMode = false;\r\n\r\n this.currentPath = null;\r\n\r\n this.batches = [];\r\n\r\n this.batchTint = -1;\r\n\r\n this.batchDirty = -1;\r\n\r\n this.vertexData = null;\r\n\r\n this.pluginName = 'smooth';\r\n\r\n this._transformID = -1;\r\n\r\n // Set default\r\n this._tintColor = new Color(0xFFFFFF);\r\n this.blendMode = BLEND_MODES.NORMAL;\r\n }\r\n\r\n public clone(): SmoothGraphics\r\n {\r\n this.finishPoly();\r\n\r\n return new SmoothGraphics(this._geometry);\r\n }\r\n\r\n public set blendMode(value: BLEND_MODES)\r\n {\r\n this.state.blendMode = value;\r\n }\r\n\r\n public get blendMode(): BLEND_MODES\r\n {\r\n return this.state.blendMode;\r\n }\r\n\r\n public get tint(): ColorSource\r\n {\r\n return this._tintColor.value;\r\n }\r\n\r\n public set tint(value: ColorSource)\r\n {\r\n this._tintColor.setValue(value);\r\n }\r\n\r\n public get fill(): FillStyle\r\n {\r\n return this._fillStyle;\r\n }\r\n\r\n public get line(): LineStyle\r\n {\r\n return this._lineStyle;\r\n }\r\n\r\n public lineStyle(width: number, color?: ColorSource, alpha?: number, alignment?: number, scaleMode?: LINE_SCALE_MODE): this;\r\n\r\n public lineStyle(options?: ILineStyleOptions): this;\r\n\r\n public lineStyle(options: ILineStyleOptions | number = null,\r\n color: ColorSource = 0x0, alpha = 1, alignment = 0.5, scaleMode = settings.LINE_SCALE_MODE): this\r\n {\r\n // Support non-object params: (width, color, alpha, alignment, native)\r\n if (typeof options === 'number')\r\n {\r\n if (typeof scaleMode === 'boolean')\r\n {\r\n scaleMode = scaleMode ? LINE_SCALE_MODE.NONE : LINE_SCALE_MODE.NORMAL;\r\n }\r\n options = { width: options, color, alpha, alignment, scaleMode } as ILineStyleOptions;\r\n }\r\n else\r\n {\r\n const native: boolean = (options as any).native;\r\n\r\n if (native !== undefined)\r\n {\r\n options.scaleMode = native ? LINE_SCALE_MODE.NONE : LINE_SCALE_MODE.NORMAL;\r\n }\r\n }\r\n\r\n return this.lineTextureStyle(options);\r\n }\r\n\r\n public lineTextureStyle(options: ILineStyleOptions): this\r\n {\r\n // Apply defaults\r\n options = Object.assign({\r\n width: 0,\r\n texture: Texture.WHITE,\r\n color: (options && options.texture) ? 0xFFFFFF : 0x0,\r\n alpha: 1,\r\n matrix: null,\r\n alignment: 0.5,\r\n native: false,\r\n cap: LINE_CAP.BUTT,\r\n join: LINE_JOIN.MITER,\r\n miterLimit: 10,\r\n shader: null,\r\n scaleMode: settings.LINE_SCALE_MODE,\r\n }, options);\r\n\r\n this.normalizeColor(options);\r\n\r\n if (this.currentPath)\r\n {\r\n this.startPoly();\r\n }\r\n\r\n const visible = options.width > 0 && options.alpha > 0;\r\n\r\n if (!visible)\r\n {\r\n this._lineStyle.reset();\r\n }\r\n else\r\n {\r\n if (options.matrix)\r\n {\r\n options.matrix = options.matrix.clone();\r\n options.matrix.invert();\r\n }\r\n\r\n Object.assign(this._lineStyle, { visible }, options);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n protected startPoly(): void\r\n {\r\n if (this.currentPath)\r\n {\r\n const points = this.currentPath.points;\r\n const len = this.currentPath.points.length;\r\n\r\n if (len > 2)\r\n {\r\n this.drawShape(this.currentPath);\r\n this.currentPath = new Polygon();\r\n this.currentPath.closeStroke = false;\r\n this.currentPath.points.push(points[len - 2], points[len - 1]);\r\n }\r\n }\r\n else\r\n {\r\n this.currentPath = new Polygon();\r\n this.currentPath.closeStroke = false;\r\n }\r\n }\r\n\r\n finishPoly(): void\r\n {\r\n if (this.currentPath)\r\n {\r\n if (this.currentPath.points.length > 2)\r\n {\r\n this.drawShape(this.currentPath);\r\n this.currentPath = null;\r\n }\r\n else\r\n {\r\n this.currentPath.points.length = 0;\r\n }\r\n }\r\n }\r\n\r\n public moveTo(x: number, y: number): this\r\n {\r\n this.startPoly();\r\n this.currentPath.points[0] = x;\r\n this.currentPath.points[1] = y;\r\n\r\n return this;\r\n }\r\n\r\n public lineTo(x: number, y: number): this\r\n {\r\n if (!this.currentPath)\r\n {\r\n this.moveTo(0, 0);\r\n }\r\n\r\n // remove duplicates..\r\n const points = this.currentPath.points;\r\n const fromX = points[points.length - 2];\r\n const fromY = points[points.length - 1];\r\n\r\n if (fromX !== x || fromY !== y)\r\n {\r\n points.push(x, y);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n protected _initCurve(x = 0, y = 0): void\r\n {\r\n if (this.currentPath)\r\n {\r\n if (this.currentPath.points.length === 0)\r\n {\r\n this.currentPath.points = [x, y];\r\n }\r\n }\r\n else\r\n {\r\n this.moveTo(x, y);\r\n }\r\n }\r\n\r\n public quadraticCurveTo(cpX: number, cpY: number, toX: number, toY: number): this\r\n {\r\n this._initCurve();\r\n\r\n const points = this.currentPath.points;\r\n\r\n if (points.length === 0)\r\n {\r\n this.moveTo(0, 0);\r\n }\r\n\r\n QuadraticUtils.curveTo(cpX, cpY, toX, toY, points);\r\n\r\n return this;\r\n }\r\n\r\n public bezierCurveTo(cpX: number, cpY: number, cpX2: number, cpY2: number, toX: number, toY: number): this\r\n {\r\n this._initCurve();\r\n\r\n BezierUtils.curveTo(cpX, cpY, cpX2, cpY2, toX, toY, this.currentPath.points);\r\n\r\n return this;\r\n }\r\n\r\n public arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): this\r\n {\r\n this._initCurve(x1, y1);\r\n\r\n const points = this.currentPath.points;\r\n\r\n const result = ArcUtils.curveTo(x1, y1, x2, y2, radius, points);\r\n\r\n if (result)\r\n {\r\n const { cx, cy, radius, startAngle, endAngle, anticlockwise } = result;\r\n\r\n this.arc(cx, cy, radius, startAngle, endAngle, anticlockwise);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public arc(cx: number, cy: number, radius: number, startAngle: number, endAngle: number, anticlockwise = false): this\r\n {\r\n if (startAngle === endAngle)\r\n {\r\n return this;\r\n }\r\n\r\n if (!anticlockwise && endAngle <= startAngle)\r\n {\r\n endAngle += PI_2;\r\n }\r\n else if (anticlockwise && startAngle <= endAngle)\r\n {\r\n startAngle += PI_2;\r\n }\r\n\r\n const sweep = endAngle - startAngle;\r\n\r\n if (sweep === 0)\r\n {\r\n return this;\r\n }\r\n\r\n const startX = cx + (Math.cos(startAngle) * radius);\r\n const startY = cy + (Math.sin(startAngle) * radius);\r\n const eps = this._geometry.closePointEps;\r\n\r\n // If the currentPath exists, take its points. Otherwise call `moveTo` to start a path.\r\n let points = this.currentPath ? this.currentPath.points : null;\r\n\r\n if (points)\r\n {\r\n // TODO: make a better fix.\r\n\r\n // We check how far our start is from the last existing point\r\n const xDiff = Math.abs(points[points.length - 2] - startX);\r\n const yDiff = Math.abs(points[points.length - 1] - startY);\r\n\r\n if (xDiff < eps && yDiff < eps)\r\n {\r\n // If the point is very close, we don't add it, since this would lead to artifacts\r\n // during tessellation due to floating point imprecision.\r\n }\r\n else\r\n {\r\n points.push(startX, startY);\r\n }\r\n }\r\n else\r\n {\r\n this.moveTo(startX, startY);\r\n points = this.currentPath.points;\r\n }\r\n\r\n ArcUtils.arc(startX, startY, cx, cy, radius, startAngle, endAngle, anticlockwise, points);\r\n\r\n return this;\r\n }\r\n\r\n public beginFill(color: ColorSource = 0, alpha = 1, smooth = false): this\r\n {\r\n return this.beginTextureFill({ texture: Texture.WHITE, color, alpha, smooth });\r\n }\r\n\r\n private normalizeColor(options: Pick<IFillStyleOptions, 'color' | 'alpha'>): void\r\n {\r\n const temp = Color.shared.setValue(options.color ?? 0);\r\n\r\n options.color = temp.toNumber();\r\n options.alpha ??= temp.alpha;\r\n }\r\n\r\n beginTextureFill(options?: IFillStyleOptions): this\r\n {\r\n // Apply defaults\r\n options = Object.assign({\r\n texture: Texture.WHITE,\r\n color: 0xFFFFFF,\r\n alpha: 1,\r\n matrix: null,\r\n smooth: false,\r\n }, options) as IFillStyleOptions;\r\n\r\n this.normalizeColor(options);\r\n\r\n if (this.currentPath)\r\n {\r\n this.startPoly();\r\n }\r\n\r\n const visible = options.alpha > 0;\r\n\r\n if (!visible)\r\n {\r\n this._fillStyle.reset();\r\n }\r\n else\r\n {\r\n if (options.matrix)\r\n {\r\n options.matrix = options.matrix.clone();\r\n options.matrix.invert();\r\n }\r\n\r\n Object.assign(this._fillStyle, { visible }, options);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public endFill(): this\r\n {\r\n this.finishPoly();\r\n\r\n this._fillStyle.reset();\r\n\r\n return this;\r\n }\r\n\r\n public drawRect(x: number, y: number, width: number, height: number): this\r\n {\r\n return this.drawShape(new Rectangle(x, y, width, height));\r\n }\r\n\r\n public drawRoundedRect(x: number, y: number, width: number, height: number, radius: number): this\r\n {\r\n return this.drawShape(new RoundedRectangle(x, y, width, height, radius));\r\n }\r\n\r\n public drawCircle(x: number, y: number, radius: number): this\r\n {\r\n return this.drawShape(new Circle(x, y, radius));\r\n }\r\n\r\n public drawEllipse(x: number, y: number, width: number, height: number): this\r\n {\r\n return this.drawShape(new Ellipse(x, y, width, height));\r\n }\r\n\r\n public drawPolygon(...path: Array<number> | Array<Point>): this;\r\n public drawPolygon(path: Array<number> | Array<Point> | Polygon): this;\r\n\r\n public drawPolygon(...path: any[]): this\r\n {\r\n let points: Array<number> | Array<Point>;\r\n let closeStroke = true;// !!this._fillStyle;\r\n\r\n const poly = path[0] as Polygon;\r\n\r\n // check if data has points..\r\n if (poly.points)\r\n {\r\n closeStroke = poly.closeStroke;\r\n points = poly.points;\r\n }\r\n else if (Array.isArray(path[0]))\r\n {\r\n points = path[0];\r\n }\r\n else\r\n {\r\n points = path;\r\n }\r\n\r\n const shape = new Polygon(points);\r\n\r\n shape.closeStroke = closeStroke;\r\n\r\n this.drawShape(shape);\r\n\r\n return this;\r\n }\r\n\r\n public drawShape(shape: IShape): this\r\n {\r\n if (!this._holeMode)\r\n {\r\n this._geometry.drawShape(\r\n shape,\r\n this._fillStyle.clone(),\r\n this._lineStyle.clone(),\r\n this._matrix\r\n );\r\n }\r\n else\r\n {\r\n this._geometry.drawHole(shape, this._matrix);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public clear(): this\r\n {\r\n this._geometry.clear();\r\n this._lineStyle.reset();\r\n this._fillStyle.reset();\r\n\r\n this._boundsID++;\r\n this._matrix = null;\r\n this._holeMode = false;\r\n this.currentPath = null;\r\n\r\n return this;\r\n }\r\n\r\n public isFastRect(): boolean\r\n {\r\n const data = this._geometry.graphicsData;\r\n\r\n return data.length === 1\r\n && data[0].shape.type === SHAPES.RECT\r\n && !data[0].matrix\r\n && !data[0].holes.length\r\n && !(data[0].lineStyle.visible && data[0].lineStyle.width);\r\n }\r\n\r\n protected _renderCanvas(renderer: any): void\r\n {\r\n (UnsmoothGraphics.prototype as any)._renderCanvas.call(this, renderer);\r\n }\r\n\r\n protected _render(renderer: Renderer): void\r\n {\r\n this.finishPoly();\r\n\r\n const geometry = this._geometry;\r\n const hasuint32 = renderer.context.supports.uint32Indices;\r\n // batch part..\r\n // batch it!\r\n\r\n geometry.checkInstancing(renderer.geometry.hasInstance, hasuint32);\r\n\r\n geometry.updateBatches(this.shaderSettings);\r\n\r\n if (geometry.batchable)\r\n {\r\n if (this.batchDirty !== geometry.batchDirty)\r\n {\r\n this._populateBatches();\r\n }\r\n\r\n this._renderBatched(renderer);\r\n }\r\n else\r\n {\r\n // no batching...\r\n renderer.batch.flush();\r\n\r\n this._renderDirect(renderer);\r\n }\r\n }\r\n\r\n protected _populateBatches(): void\r\n {\r\n const geometry = this._geometry;\r\n const blendMode = this.blendMode;\r\n const len = geometry.batches.length;\r\n\r\n this.batchTint = -1;\r\n this._transformID = -1;\r\n this.batchDirty = geometry.batchDirty;\r\n this.batches.length = len;\r\n\r\n this.vertexData = new Float32Array(geometry.points);\r\n\r\n for (let i = 0; i < len; i++)\r\n {\r\n const gI = geometry.batches[i];\r\n const color = gI.style.color;\r\n const vertexData = new Float32Array(this.vertexData.buffer,\r\n gI.attribStart * 4 * 2,\r\n gI.attribSize * 2);\r\n\r\n // const uvs = new Float32Array(geometry.uvsFloat32.buffer,\r\n // gI.attribStart * 4 * 2,\r\n // gI.attribSize * 2);\r\n\r\n // const indices = new Uint16Array(geometry.indicesUint16.buffer,\r\n // gI.start * 2,\r\n // gI.size);\r\n\r\n const batch = {\r\n vertexData,\r\n blendMode,\r\n // indices,\r\n // uvs,\r\n _batchRGB: utils.hex2rgb(color) as Array<number>,\r\n _tintRGB: color,\r\n _texture: gI.style.texture,\r\n alpha: gI.style.alpha,\r\n worldAlpha: 1\r\n };\r\n\r\n this.batches[i] = batch;\r\n }\r\n }\r\n\r\n protected _renderBatched(renderer: Renderer): void\r\n {\r\n if (!this.batches.length)\r\n {\r\n return;\r\n }\r\n\r\n renderer.batch.setObjectRenderer(renderer.plugins[this.pluginName]);\r\n\r\n this.calculateVertices();\r\n this.calculateTints();\r\n\r\n for (let i = 0, l = this.batches.length; i < l; i++)\r\n {\r\n const batch = this.batches[i];\r\n\r\n batch.worldAlpha = this.worldAlpha * batch.alpha;\r\n\r\n renderer.plugins[this.pluginName].render(batch);\r\n }\r\n }\r\n\r\n protected _renderDirect(renderer: Renderer): void\r\n {\r\n const directShader = this._resolveDirectShader(renderer);\r\n let shader: Shader = directShader;\r\n\r\n const geometry = this._geometry;\r\n const worldAlpha = this.worldAlpha;\r\n const uniforms = shader.uniforms;\r\n const drawCalls = geometry.drawCalls;\r\n\r\n // lets set the transfomr\r\n uniforms.translationMatrix = this.transform.worldTransform;\r\n\r\n // and then lets set the tint..\r\n Color.shared.setValue(this._tintColor)\r\n .premultiply(worldAlpha)\r\n .toArray(uniforms.tint);\r\n\r\n uniforms.resolution = renderer.renderTexture.current\r\n ? renderer.renderTexture.current.resolution : renderer.resolution;\r\n\r\n const projTrans = renderer.projection.transform;\r\n\r\n if (projTrans)\r\n {\r\n // only uniform scale is supported!\r\n const scale = Math.sqrt((projTrans.a * projTrans.a) + (projTrans.b * projTrans.b));\r\n\r\n uniforms.resolution *= scale;\r\n }\r\n\r\n const multisample = renderer.renderTexture.current\r\n ? renderer.renderTexture.current.multisample : renderer.multisample;\r\n\r\n uniforms.expand = (multisample !== MSAA_QUALITY.NONE ? 2 : 1) / uniforms.resolution;\r\n\r\n // the first draw call, we can set the uniforms of the shader directly here.\r\n\r\n // this means that we can tack advantage of the sync function of pixi!\r\n // bind and sync uniforms..\r\n // there is a way to optimise this..\r\n renderer.shader.bind(shader);\r\n renderer.geometry.bind(geometry, shader);\r\n\r\n // set state..\r\n renderer.state.set(this.state);\r\n\r\n shader = null;\r\n // then render the rest of them...\r\n for (let i = 0, l = drawCalls.length; i < l; i++)\r\n {\r\n // TODO: refactor it to another class, that fills uniforms of this shader\r\n const drawCall = geometry.drawCalls[i];\r\n\r\n const shaderChange = shader !== drawCall.shader;\r\n\r\n if (shaderChange)\r\n {\r\n shader = drawCall.shader;\r\n if (shader)\r\n {\r\n shader.uniforms.translationMatrix = this.transform.worldTransform;\r\n if (shader.uniforms.tint)\r\n {\r\n shader.uniforms.tint[0] = uniforms.tint[0];\r\n shader.uniforms.tint[1] = uniforms.tint[1];\r\n shader.uniforms.tint[2] = uniforms.tint[2];\r\n shader.uniforms.tint[3] = uniforms.tint[3];\r\n }\r\n }\r\n }\r\n\r\n const { texArray, styleArray, size, start } = drawCall;\r\n const groupTextureCount = texArray.count;\r\n const shaderHere = shader || directShader;\r\n\r\n const texs = shaderHere.uniforms.styleTextureId;\r\n const mats = shaderHere.uniforms.styleMatrix;\r\n const lines = shaderHere.uniforms.styleLine;\r\n\r\n for (let i = 0; i < styleArray.count; i++)\r\n {\r\n texs[i] = styleArray.textureIds[i];\r\n lines[i * 2] = styleArray.lines[i * 2];\r\n lines[(i * 2) + 1] = styleArray.lines[(i * 2) + 1];\r\n const m = styleArray.matrices[i];\r\n\r\n mats[i * 6] = m.a;\r\n mats[(i * 6) + 1] = m.c;\r\n mats[(i * 6) + 2] = m.tx;\r\n mats[(i * 6) + 3] = m.b;\r\n mats[(i * 6) + 4] = m.d;\r\n mats[(i * 6) + 5] = m.ty;\r\n }\r\n const sizes = shaderHere.uniforms.samplerSize;\r\n\r\n for (let i = 0; i < groupTextureCount; i++)\r\n {\r\n sizes[i * 2] = texArray.elements[i].width;\r\n sizes[(i * 2) + 1] = texArray.elements[i].height;\r\n }\r\n\r\n renderer.shader.bind(shaderHere);\r\n if (shaderChange)\r\n {\r\n renderer.geometry.bind(geometry);\r\n }\r\n\r\n // TODO: bind styles!\r\n for (let j = 0; j < groupTextureCount; j++)\r\n {\r\n renderer.texture.bind(texArray.elements[j], j);\r\n }\r\n\r\n // bind the geometry...\r\n renderer.geometry.draw(DRAW_MODES.TRIANGLES, size, start);\r\n }\r\n }\r\n\r\n protected _resolveDirectShader(_renderer: Renderer): Shader\r\n {\r\n let shader = this.shader;\r\n\r\n const pluginName = this.pluginName;\r\n\r\n if (!shader)\r\n {\r\n if (!DEFAULT_SHADERS[pluginName])\r\n {\r\n DEFAULT_SHADERS[pluginName] = new SmoothGraphicsShader(this.shaderSettings);\r\n }\r\n shader = DEFAULT_SHADERS[pluginName];\r\n }\r\n\r\n return shader;\r\n }\r\n\r\n protected _calculateBounds(): void\r\n {\r\n this.finishPoly();\r\n\r\n const geometry = this._geometry;\r\n\r\n // skipping when graphics is empty, like a container\r\n if (!geometry.graphicsData.length)\r\n {\r\n return;\r\n }\r\n\r\n const { minX, minY, maxX, maxY } = geometry.bounds;\r\n\r\n this._bounds.addFrame(this.transform, minX, minY, maxX, maxY);\r\n }\r\n\r\n public containsPoint(point: IPointData): boolean\r\n {\r\n this.worldTransform.applyInverse(point, SmoothGraphics._TEMP_POINT);\r\n\r\n return this._geometry.containsPoint(SmoothGraphics._TEMP_POINT);\r\n }\r\n\r\n protected calculateTints(): void\r\n {\r\n if (this.batchTint !== this.tint)\r\n {\r\n this.batchTint = this._tintColor.toNumber();\r\n\r\n for (let i = 0; i < this.batches.length; i++)\r\n {\r\n const batch = this.batches[i];\r\n\r\n batch._tintRGB = Color.shared\r\n .setValue(this._tintColor)\r\n .multiply(batch._batchRGB)\r\n .toLittleEndianNumber();\r\n }\r\n }\r\n }\r\n\r\n protected calculateVertices(): void\r\n {\r\n const wtID = this.transform._worldID;\r\n\r\n if (this._transformID === wtID)\r\n {\r\n return;\r\n }\r\n\r\n this._transformID = wtID;\r\n\r\n const wt = this.transform.worldTransform;\r\n const a = wt.a;\r\n const b = wt.b;\r\n const c = wt.c;\r\n const d = wt.d;\r\n const tx = wt.tx;\r\n const ty = wt.ty;\r\n\r\n const data = this._geometry.points;// batch.vertexDataOriginal;\r\n const vertexData = this.vertexData;\r\n\r\n let count = 0;\r\n\r\n for (let i = 0; i < data.length; i += 2)\r\n {\r\n const x = data[i];\r\n const y = data[i + 1];\r\n\r\n vertexData[count++] = (a * x) + (c * y) + tx;\r\n vertexData[count++] = (d * y) + (b * x) + ty;\r\n }\r\n }\r\n\r\n public closePath(): this\r\n {\r\n const currentPath = this.currentPath;\r\n\r\n if (currentPath)\r\n {\r\n // we don't need to add extra point in the end because buildLine will take care of that\r\n currentPath.closeStroke = true;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public setMatrix(matrix: Matrix): this\r\n {\r\n this._matrix = matrix;\r\n\r\n return this;\r\n }\r\n\r\n public beginHole(): this\r\n {\r\n this.finishPoly();\r\n this._holeMode = true;\r\n\r\n return this;\r\n }\r\n\r\n public endHole(): this\r\n {\r\n this.finishPoly();\r\n this._holeMode = false;\r\n\r\n return this;\r\n }\r\n\r\n public destroy(options?: IDestroyOptions | boolean): void\r\n {\r\n this._geometry.refCount--;\r\n if (this._geometry.refCount === 0)\r\n {\r\n this._geometry.dispose();\r\n }\r\n\r\n this._matrix = null;\r\n this.currentPath = null;\r\n this._lineStyle.destroy();\r\n this._lineStyle = null;\r\n this._fillStyle.destroy();\r\n this._fillStyle = null;\r\n this._geometry = null;\r\n this.shader = null;\r\n this.vertexData = null;\r\n this.batches.length = 0;\r\n this.batches = null;\r\n\r\n super.destroy(options);\r\n }\r\n}\r\n","import { SmoothGraphicsShader } from './SmoothShader';\r\n\r\nconst dashFrag = `%PRECISION%\r\nvarying vec4 vColor;\r\nvarying vec4 vLine1;\r\nvarying vec4 vLine2;\r\nvarying vec4 vArc;\r\nvarying float vType;\r\nvarying float vTextureId;\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vTravel;\r\nuniform sampler2D uSamplers[%MAX_TEXTURES%];\r\nuniform float dash;\r\nuniform float gap;\r\n\r\n%PIXEL_LINE%\r\n\r\nvoid main(void){\r\n %PIXEL_COVERAGE%\r\n\r\n float d = dash * vTravel.y;\r\n if (d > 0.0) {\r\n float g = gap * vTravel.y;\r\n if (g > 0.0) {\r\n float t = mod(vTravel.x, d + g);\r\n alpha *= mix(\r\n min(0.5 * d + 0.5 - abs(t - 0.5 * d), 1.0),\r\n max(abs(t - 0.5 * g - d) - 0.5 * g + 0.5, 0.0),\r\n step(d, t)\r\n );\r\n }\r\n } else {\r\n alpha = 0.0;\r\n }\r\n\r\n vec4 texColor;\r\n float textureId = floor(vTextureId+0.5);\r\n %FOR_LOOP%\r\n\r\n gl_FragColor = vColor * texColor * alpha;\r\n}\r\n`;\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport interface IDashParams\r\n{\r\n dash: number;\r\n gap: number;\r\n}\r\n\r\n/**\r\n * @memberof PIXI.smooth\r\n */\r\nexport class DashLineShader extends SmoothGraphicsShader\r\n{\r\n constructor(dashParams?: IDashParams)\r\n {\r\n const settings = { maxStyles: 16, maxTextures: 1, pixelLine: 1 };\r\n\r\n super(settings, undefined, dashFrag,\r\n dashParams || {\r\n dash: 8.0,\r\n gap: 5.0\r\n });\r\n }\r\n}\r\n"],"names":["matrixEquals","th","matrix","eps","BatchStyleArray","i","textureId","lineWidth","lineAlignment","lineScaleMode","settings","textureIds","matrices","lines","count","BatchDrawCall","BatchTextureArray","BLEND_MODES","shader","BaseTexture","texture","texArray","TICK","styleArray","baseTexture","loc","res","Matrix","BatchPart","style","startIndex","attribStart","endIndex","endAttrib","FillStyle","obj","Texture","tex","LINE_SCALE_MODE","LineStyle","LINE_CAP","LINE_JOIN","BuildData","JOINT_TYPE","A","_SegmentPacker","jointStart","jointLen","triangles","target","joints","foundTriangle","vertexSize","indexSize","prevCap","joint","vs","buildData","bufFloat","bufUint","indices","bufferPos","indexPos","lineStyle","color","strideFloats","verts","bufPos","indPos","index","x1","y1","x2","y2","prevX","prevY","nextX","nextY","hasTriangle","travel","j","fullJoint","bis","dist","SegmentPacker","SmoothGraphicsData","shape","fillStyle","cap","CircleBuilder","graphicsData","_target","points","x","y","dx","dy","rx","ry","SHAPES","circle","ellipse","roundedRect","halfWidth","halfHeight","n","m","j1","j2","j3","j4","x0","y0","a","cx","cy","vertPos","center","len","nx1","ny1","n1","bx1","by1","nx2","ny2","n2","bx2","by2","b2","tempArr","fixOrientation","hole","area","i1","i2","i3","i4","PolyBuilder","eps2","firstPoint","Point","lastPoint","closedShape","newLen","flag","x3","y3","closeStroke","endJoint","holes","holeArray","pn","start","finish","utils","ind1","ind2","ind","prev","next","D1","D2","bx","by","D","RectangleBuilder","rectData","width","height","RoundedRectangleBuilder","FILL_COMMANDS","BATCH_POOL","DRAW_CALL_POOL","tmpPoint","tmpBounds","Bounds","SmoothGraphicsGeometry","Geometry","_static","Buffer","TYPES","instanced","allow32Indices","batchPart","data","lastShape","point","hitHole","command","shaderSettings","currentStyle","nextTexture","attribOld","indexOld","WRAP_MODES","packer","batches","buffer","floatsSize","arrBuf","styleA","styleB","mat1","mat2","l","fill","line","batch","currentGroup","batchData","styleId","mat","alpha","bgr","Color","bounds","sequenceBounds","curMatrix","type","nextMatrix","rect","poly","smoothVert","precision","smoothFrag","pixelLineFunc","pixelCoverage","SmoothGraphicsShader","Shader","vert","frag","uniforms","maxStyles","maxTextures","sampleValues","Program","vertexSrc","fragmentSrc","pixelLine","src","UnsmoothGraphics","Graphics","BezierUtils","QuadraticUtils","ArcUtils","graphicsUtils","DEFAULT_SHADERS","_SmoothGraphics","Container","geometry","State","value","options","alignment","scaleMode","native","visible","Polygon","fromX","fromY","cpX","cpY","toX","toY","cpX2","cpY2","radius","result","startAngle","endAngle","anticlockwise","PI_2","startX","startY","xDiff","yDiff","smooth","_a","_b","temp","Rectangle","RoundedRectangle","Circle","Ellipse","path","renderer","hasuint32","blendMode","gI","directShader","worldAlpha","drawCalls","projTrans","scale","multisample","MSAA_QUALITY","drawCall","shaderChange","size","groupTextureCount","shaderHere","texs","mats","sizes","DRAW_MODES","_renderer","pluginName","minX","minY","maxX","maxY","wtID","wt","b","c","d","tx","ty","vertexData","currentPath","SmoothGraphics","curves","dashFrag","DashLineShader","dashParams"],"mappings":";;;;;;;;siBAcgBA,GAAaC,EAAYC,EAAgBC,EAAM,KAC/D,CACI,OAAO,OAASD,GAAW,KAAK,IAAID,EAAG,EAAIC,EAAO,CAAC,EAAIC,GAChD,KAAK,IAAIF,EAAG,EAAIC,EAAO,CAAC,EAAIC,GAC5B,KAAK,IAAIF,EAAG,EAAIC,EAAO,CAAC,EAAIC,GAC5B,KAAK,IAAIF,EAAG,EAAIC,EAAO,CAAC,EAAIC,GAC5B,KAAK,IAAIF,EAAG,GAAKC,EAAO,EAAE,EAAIC,GAC9B,KAAK,IAAIF,EAAG,GAAKC,EAAO,EAAE,EAAIC,CACzC,OAKaC,EACb,CAMI,aACA,CACI,KAAK,WAAa,CAAC,EACnB,KAAK,SAAW,CAAA,EAChB,KAAK,MAAQ,GACb,KAAK,MAAQ,CAGjB,CAEA,OACA,CACI,QAASC,EAAI,EAAGA,EAAI,KAAK,MAAOA,IAE5B,KAAK,WAAWA,CAAC,EAAI,KACrB,KAAK,SAASA,CAAC,EAAI,KAEvB,KAAK,MAAQ,CACjB,CAEA,IAAIC,EAAmBJ,EACnBK,EAAmBC,EAAuBC,EAC1CC,EACJ,CACI,KAAM,CAAE,WAAAC,EAAY,SAAAC,EAAU,MAAAC,EAAO,MAAAC,CAAM,EAAI,KAE/CR,EAAaA,EAAY,EAAKG,EAC9B,QAASJ,EAAI,EAAGA,EAAIS,EAAOT,IAEvB,GAAIQ,EAAMR,EAAI,CAAC,IAAME,GAAaM,EAAOR,EAAI,EAAK,CAAC,IAAMG,GAClDG,EAAWN,CAAC,IAAMC,GAAcN,GAAaY,EAASP,CAAC,EAAGH,CAAM,EAEnE,OAAOG,EAGf,OAAIS,GAASJ,EAAS,UAEX,IAEXC,EAAWG,CAAK,EAAIR,EACpBM,EAASE,CAAK,EAAIZ,EAClBW,EAAMC,EAAQ,CAAC,EAAIP,EACnBM,EAAOC,EAAQ,EAAK,CAAC,EAAIN,EACzB,KAAK,QAEEM,EACX,CACJ,CAKa,MAAAC,EACb,CAWI,aACA,CACI,KAAK,SAAW,IAAIC,GACpB,KAAK,WAAa,IAAIZ,GACtB,KAAK,OAAS,KACd,KAAK,MAAQa,GAAY,OAEzB,KAAK,MAAQ,EACb,KAAK,KAAO,EACZ,KAAK,KAAO,EACZ,KAAK,SAAW,KAKhB,KAAK,KAAO,IAChB,CAEA,OACA,CACI,KAAK,SAAS,QACd,KAAK,WAAW,MAAM,EACtB,KAAK,SAAW,KAChB,KAAK,KAAO,KACZ,KAAK,OAAS,IAClB,CAEA,MAAMP,EAAkCQ,EACxC,CACI,KAAK,KAAO,EAAEC,GAAY,aAC1B,KAAK,SAAWT,EAChB,KAAK,OAASQ,EAEd,KAAK,MAAQ,EACb,KAAK,KAAO,EACZ,KAAK,KAAO,KACRA,GAAWA,EAAe,WAE1B,KAAK,SAAYA,EAAe,SAExC,CAEA,MAAMA,EACN,CACI,OAAI,KAAK,OAAS,GAEd,KAAK,OAASA,EAEP,IAGH,KAAK,SAAWA,CAC5B,CAEA,IAAIE,EAAkBlB,EAAgBK,EAClCC,EAAuBC,EAC3B,CACI,KAAM,CAAE,SAAAY,EAAU,KAAAC,EAAM,WAAAC,EAAY,SAAAb,CAAS,EAAI,KAC3C,CAAE,YAAAc,CAAY,EAAIJ,EAGxB,GAAII,EAAY,gBAAkBF,GAAQD,EAAS,QAAUX,EAAS,YAElE,MAAO,GAEX,MAAMe,EAAMD,EAAY,gBAAkBF,EAAOD,EAAS,MAAQG,EAAY,eAGxEE,EAAMH,EAAW,IAAIE,EAAKvB,GAAUyB,EAAO,SAC7CpB,EAAWC,EAAeC,EAAeC,CAAQ,EAErD,OAAIgB,GAAO,GAIHF,EAAY,gBAAkBF,IAE9BE,EAAY,cAAgBF,EAC5BE,EAAY,eAAiBH,EAAS,MACtCA,EAAS,SAASA,EAAS,OAAO,EAAIG,GAIvCE,CACX,CACJ,CCjLO,MAAME,EACb,CAUI,aACA,CACI,KAAK,MACT,CAAA,CAEO,MAAMC,EAA8BC,EAAoBC,EAC/D,CACI,KAAK,MAAM,EACX,KAAK,MAAQF,EACb,KAAK,MAAQC,EACb,KAAK,YAAcC,EACnB,KAAK,SAAW,CACpB,CAEO,IAAIC,EAAkBC,EAC7B,CACI,KAAK,WAAaA,EAAY,KAAK,YACnC,KAAK,KAAOD,EAAW,KAAK,KAChC,CAEO,OACP,CACI,KAAK,MAAQ,KACb,KAAK,KAAO,EACZ,KAAK,MAAQ,EACb,KAAK,YAAc,EACnB,KAAK,WAAa,EAClB,KAAK,QAAU,GACf,KAAK,KAAO,EACZ,KAAK,SAAW,CACpB,CACJ,CC1Ca,MAAAE,CACb,CACI,aACA,CACI,KAAK,MAAA,CACT,CAWA,QACA,CACI,OAAO,KAAK,OAAO,CAAE,CAAA,CACzB,CAEA,OACA,CACI,OAAO,KAAK,OAAO,IAAIA,CAAW,CACtC,CAEA,OAAOC,EACP,CACI,OAAAA,EAAI,MAAQ,KAAK,MACjBA,EAAI,MAAQ,KAAK,MACjBA,EAAI,QAAU,KAAK,QACnBA,EAAI,OAAS,KAAK,OAClBA,EAAI,OAAS,KAAK,OAClBA,EAAI,QAAU,KAAK,QACnBA,EAAI,OAAS,KAAK,OAClBA,EAAI,UAAY,KAETA,CACX,CAEA,eACA,CACI,MACJ,EAAA,CAEA,OACA,CACI,KAAK,MAAQ,SAEb,KAAK,MAAQ,EAEb,KAAK,QAAUC,EAAQ,MAEvB,KAAK,OAAS,KAEd,KAAK,OAAS,KAEd,KAAK,QAAU,GAEf,KAAK,OAAS,GAEd,KAAK,UAAY,IACrB,CAEA,SACA,CACI,KAAK,QAAU,KACf,KAAK,OAAS,KACd,KAAK,UAAY,IACrB,CAEA,kBACA,CACI,MAAMC,EAAM,KAAK,QAEjB,OAAK,KAAK,OAKNA,EAAI,MAAM,QAAUA,EAAI,YAAY,OACjCA,EAAI,MAAM,SAAWA,EAAI,YAAY,OAEjC,KAAK,QAGX,KAAK,UAMN,KAAK,UAAU,SAAS,KAAK,MAAM,EAJnC,KAAK,UAAY,KAAK,OAAO,QAMjC,KAAK,UAAU,UAAU,OAAOA,EAAI,MAAM,CAAC,EAAG,OAAOA,EAAI,MAAM,CAAC,CAAC,EAE1D,KAAK,WAnBD,IAoBf,CACJ,CClGY,IAAAC,GAAAA,IAERA,EAAA,KAAO,OACPA,EAAA,OAAS,SACTA,EAAA,WAAa,aACbA,EAAA,SAAW,WALHA,IAAAA,GAWL,CAAA,CAAA,EAAA,MAAMC,WAAkBL,CAC/B,CASI,OACA,CACI,OAAO,KAAK,OAAO,IAAIK,EAAW,CACtC,CAGA,OAAOJ,EACP,CACI,OAAAA,EAAI,MAAQ,KAAK,MACjBA,EAAI,MAAQ,KAAK,MACjBA,EAAI,QAAU,KAAK,QACnBA,EAAI,OAAS,KAAK,OAClBA,EAAI,OAAS,KAAK,OAClBA,EAAI,QAAU,KAAK,QACnBA,EAAI,MAAQ,KAAK,MACjBA,EAAI,UAAY,KAAK,UACrBA,EAAI,IAAM,KAAK,IACfA,EAAI,KAAO,KAAK,KAChBA,EAAI,WAAa,KAAK,WACtBA,EAAI,UAAY,KAAK,UAEdA,CACX,CAKA,eACA,CACI,OAAQ,KAAK,UAAA,CAET,IAAK,SAAwB,MAAO,GACpC,IAAK,aAA4B,MACjC,GAAA,IAAK,WAA0B,MAAO,GACtC,QAAS,MACb,EAAA,CACJ,CAEA,OACA,CACI,MAAM,MAEN,EAAA,KAAK,OAAS,GAEd,KAAK,MAAQ,EAEb,KAAK,MAAQ,EAEb,KAAK,UAAY,GAEjB,KAAK,IAAMK,EAAS,KACpB,KAAK,KAAOC,EAAU,MACtB,KAAK,WAAa,GAClB,KAAK,UAAY,QACrB,CACJ,CC/EO,MAAMC,EACb,CADO,aAAA,CAEH,WAAuB,CAAC,EACxB,YAAwB,CAAC,EACzB,gBAAa,EACb,KAAA,UAAY,EACZ,KAAgB,cAAA,IAAA,CAEhB,OACA,CACI,KAAK,MAAM,OAAS,EACpB,KAAK,OAAO,OAAS,EACrB,KAAK,WAAa,EAClB,KAAK,UAAY,CACrB,CAEA,SACA,CACI,KAAK,MAAM,OAAS,EACpB,KAAK,OAAO,OAAS,CACzB,CACJ,CCxBY,IAAAC,GAAAA,IAERA,EAAAA,EAAA,KAAO,CAAA,EAAP,OACAA,EAAAC,EAAA,KAAO,CAAP,EAAA,OACAD,EAAAC,EAAA,YAAc,GAAd,cACAD,EAAAA,EAAA,YAAc,CAAA,EAAd,cACAA,EAAAA,EAAA,YAAc,EAAA,EAAd,cACAA,EAAAA,EAAA,eAAiB,EAAA,EAAjB,iBACAA,EAAAA,EAAA,iBAAmB,EAAnB,EAAA,mBACAA,EAAAC,EAAA,gBAAkB,EAAlB,EAAA,kBACAD,IAAA,YAAc,EAAA,EAAd,cACAA,EAAAA,EAAA,SAAW,EAAA,EAAX,WACAA,EAAAC,EAAA,WAAa,EAAb,EAAA,aACAD,EAAAC,EAAA,UAAY,EAAZ,EAAA,YACAD,EAAAC,EAAA,UAAY,GAAZ,EAAA,YAdQD,IAAAA,GAAA,CAAA,CAAA,ECML,MAAME,EAAN,KACP,CADO,aAIH,CAAA,KAAA,aAAe,GA8Cf,KAAA,UAAY,EACZ,KAAW,SAAA,CAAA,CA7CX,iBAAiBC,EAAoBC,EAAkBC,EAAmBC,EAC1E,CACI,KAAM,CAAE,OAAAC,CAAO,EAAID,EACnB,IAAIE,EAAgB,GAEhBC,EAAa,EACbC,EAAY,EAEhB,QAAShD,EAAIyC,EAAYzC,EAAIyC,EAAaC,EAAU1C,IACpD,CACI,MAAMiD,EAAUJ,EAAO7C,CAAC,EAAI,IACtBkD,EAAQL,EAAO7C,CAAC,EAAI,GAE1B,GAAIkD,IAAUZ,EAAW,KACzB,CACIQ,EAAgB,GAChBC,IACA,SAGJ,GAAIG,GAASZ,EAAW,YACxB,CACIS,GAAc,EACdC,GAAa,EACb,SAGJ,MAAMG,EAAKX,EAAc,aAAaU,CAAK,EAAIV,EAAc,aAAaS,CAAO,EAE7EE,GAAM,IAENJ,GAAcI,EACdH,GAAa,EAAK,EAAI,KAAK,IAAIG,EAAK,EAAG,CAAC,GAG5CL,IAEAE,GAAaL,GAGjBC,EAAO,YAAcG,EACrBH,EAAO,WAAaI,CACxB,CASA,UAAUI,EAAsBC,EAAwBC,EACpDC,EAAsBC,EAAY,EAAGC,EAAW,EACpD,CACI,KAAK,UAAYL,EACjB,KAAK,SAAWC,EAChB,KAAK,QAAUC,EACf,KAAK,QAAUC,EACf,KAAK,UAAYC,EACjB,KAAK,SAAWC,CACpB,CAEA,SACA,CACI,KAAK,UAAY,KACjB,KAAK,SAAW,KAChB,KAAK,QAAU,KACf,KAAK,QAAU,IACnB,CAEA,wBAAwBhB,EAAoBC,EAAkBC,EAC1De,EAAmBC,EACvB,CACI,KAAM,CAAE,SAAAN,EAAU,QAAAC,EAAS,QAAAC,EAAS,UAAAH,EAAW,aAAAQ,CAAa,EAAI,KAC1D,CAAE,OAAAf,EAAQ,MAAAgB,CAAM,EAAIT,EAE1B,IAAIU,EAAS,KAAK,UACdC,EAAS,KAAK,SACdC,EAAQ,KAAK,UAAY,KAAK,aAG9BC,EAAgBC,EAChBC,EAAgBC,EAChBC,EAAmBC,EACnBC,EAAmBC,EAEnBC,EAAc,GAEdC,EAAS,EAEb,QAASC,EAAIlC,EAAYkC,EAAIlC,EAAaC,EAAUiC,IACpD,CACI,MAAMC,EAAY/B,EAAO8B,CAAC,EACpB1B,EAAUJ,EAAO8B,CAAC,EAAI,IACtBzB,EAAQL,EAAO8B,CAAC,EAAI,GAE1B,GAAIzB,IAAUZ,EAAW,KACzB,CAEImC,EAAc,GACdR,EAAKJ,EAAOc,EAAI,CAAE,EAClBT,EAAKL,EAAOc,EAAI,EAAK,CAAC,EACtBtB,EAASS,CAAM,EAAIG,EACnBZ,EAASS,EAAS,CAAC,EAAII,EACvBb,EAASS,EAAS,CAAC,EAAIG,EACvBZ,EAASS,EAAS,CAAC,EAAII,EACvBb,EAASS,EAAS,CAAC,EAAIG,EACvBZ,EAASS,EAAS,CAAC,EAAII,EACvBb,EAASS,EAAS,CAAC,EAAIG,EACvBZ,EAASS,EAAS,CAAC,EAAII,EACvBb,EAASS,EAAS,CAAC,EAAIY,EACvBrB,EAASS,EAAS,CAAC,EAAI,GAAKZ,EAC5BG,EAASS,EAAS,EAAE,EAAIJ,EACxBJ,EAAQQ,EAAS,EAAE,EAAIH,EACvBG,GAAUF,EACV,SAGJ,GAAIV,GAASZ,EAAW,YACxB,CACI+B,EAAQR,EAAMc,EAAI,CAAC,EACnBL,EAAQT,EAAOc,EAAI,EAAK,CAAC,EACzBV,EAAKJ,EAAOc,EAAI,EAAK,CAAC,EACtBT,EAAKL,EAAOc,EAAI,EAAK,CAAC,EACtBR,EAAKN,EAAOc,EAAI,EAAK,CAAC,EACtBP,EAAKP,EAAOc,EAAI,EAAK,CAAC,EAEtB,MAAME,EAAMF,EAAI,EAEhB,QAAS3E,EAAI,EAAGA,EAAI,EAAGA,IAEnBqD,EAASS,CAAM,EAAIO,EACnBhB,EAASS,EAAS,CAAC,EAAIQ,EACvBjB,EAASS,EAAS,CAAC,EAAIG,EACvBZ,EAASS,EAAS,CAAC,EAAII,EACvBb,EAASS,EAAS,CAAC,EAAIK,EACvBd,EAASS,EAAS,CAAC,EAAIM,EACvBf,EAASS,EAAS,CAAC,EAAID,GAAOgB,EAAM7E,GAAK,CAAC,EAC1CqD,EAASS,EAAS,CAAC,EAAID,GAAQgB,EAAM7E,GAAK,EAAK,CAAC,EAEhDqD,EAASS,EAAS,CAAC,EAAIY,EACvBrB,EAASS,EAAS,CAAC,EAAK,GAAKc,EAAa5E,EAC1CqD,EAASS,EAAS,EAAE,EAAIJ,EACxBJ,EAAQQ,EAAS,EAAE,EAAIH,EACvBG,GAAUF,EAGdL,EAAQQ,CAAM,EAAIC,EAClBT,EAAQQ,EAAS,CAAC,EAAIC,EAAQ,EAC9BT,EAAQQ,EAAS,CAAC,EAAIC,EAAQ,EAC9BD,GAAU,EACVC,GAAS,EACT,SAGJ,MAAMb,EAAKX,EAAc,aAAaU,CAAK,EAAIV,EAAc,aAAaS,CAAO,EAEjF,GAAIE,IAAO,EAEP,SAEJc,EAAKJ,EAAMc,EAAI,CAAC,EAChBT,EAAKL,EAAOc,EAAI,EAAK,CAAC,EACtBR,EAAKN,EAAOc,EAAI,EAAK,CAAC,EACtBP,EAAKP,EAAOc,EAAI,EAAK,CAAC,EAEtBN,EAAQR,EAAOc,EAAI,EAAK,CAAC,EACzBL,EAAQT,EAAOc,EAAI,EAAK,CAAC,EAEzB,MAAMG,EAAO,KAAK,MAAOX,EAAKF,IAAOE,EAAKF,IAASG,EAAKF,IAAOE,EAAKF,EAAI,EAEpE1B,EAAc,aAAaU,CAAK,IAAM,IAEtCwB,GAAUI,IAGT5B,EAAQ,MAAQZ,EAAW,gBAE5BiC,EAAQV,EAAOc,EAAI,EAAK,CAAC,EACzBH,EAAQX,EAAOc,EAAI,EAAK,CAAC,IAIzBJ,EAAQN,EACRO,EAAQN,GAIZ,QAASlE,EAAI,EAAGA,EAAImD,EAAInD,IAEpBqD,EAASS,CAAM,EAAIO,EACnBhB,EAASS,EAAS,CAAC,EAAIQ,EACvBjB,EAASS,EAAS,CAAC,EAAIG,EACvBZ,EAASS,EAAS,CAAC,EAAII,EACvBb,EAASS,EAAS,CAAC,EAAIK,EACvBd,EAASS,EAAS,CAAC,EAAIM,EACvBf,EAASS,EAAS,CAAC,EAAIS,EACvBlB,EAASS,EAAS,CAAC,EAAIU,EACvBnB,EAASS,EAAS,CAAC,EAAIY,EACvBrB,EAASS,EAAS,CAAC,EAAK,GAAKc,EAAa5E,EAC1CqD,EAASS,EAAS,EAAE,EAAIJ,EACxBJ,EAAQQ,EAAS,EAAE,EAAIH,EACvBG,GAAUF,EAGdc,GAAUI,EAEVvB,EAAQQ,CAAM,EAAIC,EAClBT,EAAQQ,EAAS,CAAC,EAAIC,EAAQ,EAC9BT,EAAQQ,EAAS,CAAC,EAAIC,EAAQ,EAC9BT,EAAQQ,EAAS,CAAC,EAAIC,EACtBT,EAAQQ,EAAS,CAAC,EAAIC,EAAQ,EAC9BT,EAAQQ,EAAS,CAAC,EAAIC,EAAQ,EAC9BD,GAAU,EACV,QAASY,EAAI,EAAGA,EAAI,EAAIxB,EAAIwB,IAExBpB,EAAQQ,CAAM,EAAIC,EAAQ,EAC1BT,EAAQQ,EAAS,CAAC,EAAIC,EAAQW,EAC9BpB,EAAQQ,EAAS,CAAC,EAAIC,EAAQW,EAAI,EAClCZ,GAAU,EAEdC,GAASb,EAGb,GAAIsB,EACJ,CACI,QAASzE,EAAI,EAAGA,EAAI2C,EAAU,OAAQ3C,IAElCuD,EAAQQ,EAAS/D,CAAC,EAAI2C,EAAU3C,CAAC,EAAIgE,EAEzCD,GAAUpB,EAAU,OAGxB,KAAK,UAAYmB,EACjB,KAAK,SAAWC,CACpB,CACJ,EAlPO,IAAMgB,EAANvC,EAAMuC,EAEF,aAA8B,GAkPzC,MAAMlB,EAAQkB,EAAc,aAE5B,QAAS/E,EAAI,EAAGA,EAAI,IAAKA,IACvB6D,EAAM,KAAK,CAAC,EAEdA,EAAMvB,EAAW,IAAI,EAAI,EAEzB,QAAStC,EAAI,EAAGA,EAAI,EAAGA,IAEnB6D,EAAMvB,EAAW,YAActC,CAAC,EAAI,EAIxC6D,EAAMvB,EAAW,WAAW,EAAI,EAAI,EACpCuB,EAAMvB,EAAW,YAAc,CAAC,EAAI,EAAI,EACxCuB,EAAMvB,EAAW,YAAc,CAAC,EAAI,EAAI,EACxCuB,EAAMvB,EAAW,YAAc,CAAC,EAAI,EAAI,EACxCuB,EAAMvB,EAAW,WAAW,EAAI,EAAI,EACpCuB,EAAMvB,EAAW,YAAc,CAAC,EAAI,EAAI,EACxCuB,EAAMvB,EAAW,YAAc,CAAC,EAAI,EAAI,EACxCuB,EAAMvB,EAAW,YAAc,CAAC,EAAI,EAAI,EACxCuB,EAAMvB,EAAW,WAAW,EAAI,EAAI,EACpCuB,EAAMvB,EAAW,YAAc,CAAC,EAAI,EAAI,EACxCuB,EAAMvB,EAAW,YAAc,CAAC,EAAI,EACpCuB,EAAMvB,EAAW,YAAc,CAAC,EAAI,EACpCuB,EAAMvB,EAAW,cAAc,EAAI,EACnCuB,EAAMvB,EAAW,eAAiB,CAAC,EAAI,EACvCuB,EAAMvB,EAAW,gBAAgB,EAAI,EACrCuB,EAAMvB,EAAW,iBAAmB,CAAC,EAAI,EACzCuB,EAAMvB,EAAW,eAAe,EAAI,EAAI,EACxCuB,EAAMvB,EAAW,gBAAkB,CAAC,EAAI,EAAI,EAE5CuB,EAAMvB,EAAW,SAAS,EAAI,EC/QvB,MAAM0C,CACb,CAoBI,YAAYC,EAAeC,EAAuB,KAAMxB,EAAuB,KAAM7D,EAAiB,KACtG,CACI,KAAK,MAAQoF,EAEb,KAAK,UAAYvB,EAEjB,KAAK,UAAYwB,EAEjB,KAAK,OAASrF,EAEd,KAAK,KAAOoF,EAAM,KAElB,KAAK,OAAS,GAEd,KAAK,MAAQ,GAEb,KAAK,UAAY,GAEjB,KAAK,YAAc,GAEnB,KAAK,YACT,CAEO,WACP,CACI,KAAK,OAAO,OAAS,EACrB,KAAK,YAAc,EACvB,CAEO,YACP,CACI,KAAK,UAAU,OAAS,EACxB,KAAK,UAAY,EACjB,KAAK,QAAU,EACf,KAAK,YAAc,EACnB,KAAK,UAAY,EACjB,KAAK,OAAS,EAClB,CAEO,OACP,CACI,OAAO,IAAID,EACP,KAAK,MACL,KAAK,UACL,KAAK,UACL,KAAK,MACT,CACJ,CAEO,SACP,CACI,IAAIG,EAEJ,OAAQ,KAAK,UAAU,IACvB,CACI,KAAKhD,EAAS,OACVgD,EAAM7C,EAAW,WACjB,MACJ,KAAKH,EAAS,MACVgD,EAAM7C,EAAW,UACjB,MACJ,QACI6C,EAAM7C,EAAW,SACjB,KACR,CAEA,OAAO6C,CACX,CAEO,eACP,CACI,IAAIjC,EAEJ,OAAQ,KAAK,UAAU,KAAA,CAEnB,KAAKd,EAAU,MACXc,EAAQZ,EAAW,YACnB,MACJ,KAAKF,EAAU,MACXc,EAAQZ,EAAW,YACnB,MACJ,QACIY,EAAQZ,EAAW,YAAc,EACjC,KACR,CAEA,OAAOY,CACX,CAEO,WACP,CACI,IAAIA,EAEJ,OAAQ,KAAK,UAAU,KAEnB,CAAA,KAAKd,EAAU,MACXc,EAAQZ,EAAW,YACnB,MACJ,KAAKF,EAAU,MACXc,EAAQZ,EAAW,YACnB,MACJ,QACIY,EAAQZ,EAAW,YACnB,KACR,CAEA,OAAOY,CACX,CAEO,SACP,CACI,KAAK,MAAQ,KACb,KAAK,MAAM,OAAS,EACpB,KAAK,MAAQ,KACb,KAAK,OAAO,OAAS,EACrB,KAAK,OAAS,KACd,KAAK,UAAY,KACjB,KAAK,UAAY,KACjB,KAAK,UAAY,IACrB,CACJ,CC5Ia,MAAAkC,CACb,CACI,KAAKC,EAAkCC,EACvC,CAEI,MAAMC,EAASF,EAAa,OAE5B,IAAIG,EACAC,EACAC,EACAC,EACAC,EACAC,EAEJ,GAAIR,EAAa,OAASS,EAAO,KACjC,CACI,MAAMC,EAASV,EAAa,MAE5BG,EAAIO,EAAO,EACXN,EAAIM,EAAO,EACXH,EAAKC,EAAKE,EAAO,OACjBL,EAAKC,EAAK,UAELN,EAAa,OAASS,EAAO,KACtC,CACI,MAAME,EAAUX,EAAa,MAE7BG,EAAIQ,EAAQ,EACZP,EAAIO,EAAQ,EACZJ,EAAKI,EAAQ,MACbH,EAAKG,EAAQ,OACbN,EAAKC,EAAK,MAGd,CACI,MAAMM,EAAcZ,EAAa,MAC3Ba,EAAYD,EAAY,MAAQ,EAChCE,EAAaF,EAAY,OAAS,EAExCT,EAAIS,EAAY,EAAIC,EACpBT,EAAIQ,EAAY,EAAIE,EACpBP,EAAKC,EAAK,KAAK,IAAI,EAAG,KAAK,IAAII,EAAY,OAAQ,KAAK,IAAIC,EAAWC,CAAU,CAAC,CAAC,EACnFT,EAAKQ,EAAYN,EACjBD,EAAKQ,EAAaN,EAGtB,GAAI,EAAED,GAAM,GAAKC,GAAM,GAAKH,GAAM,GAAKC,GAAM,GAC7C,CACIJ,EAAO,OAAS,EAEhB,OAIJ,MAAMa,EAAI,KAAK,KAAK,IAAM,KAAK,KAAKR,EAAKC,CAAE,CAAC,EACtCQ,EAAKD,EAAI,GAAMV,EAAK,EAAI,IAAMC,EAAK,EAAI,GAI7C,GAFAJ,EAAO,OAASc,EAEZA,IAAM,EAEN,OAGJ,GAAID,IAAM,EACV,CACIb,EAAO,OAAS,EAChBA,EAAO,CAAC,EAAIA,EAAO,CAAC,EAAIC,EAAIE,EAC5BH,EAAO,CAAC,EAAIA,EAAO,CAAC,EAAIE,EAAIE,EAC5BJ,EAAO,CAAC,EAAIA,EAAO,CAAC,EAAIC,EAAIE,EAC5BH,EAAO,CAAC,EAAIA,EAAO,CAAC,EAAIE,EAAIE,EAE5B,OAGJ,IAAIW,EAAK,EACLC,EAAMH,EAAI,GAAMV,EAAK,EAAI,GAAK,EAC9Bc,EAAKD,EACLE,EAAKJ,EAET,CACI,MAAMK,EAAKhB,EAAKE,EACVe,EAAKhB,EACL1B,EAAKuB,EAAIkB,EACTvC,EAAKqB,EAAIkB,EACTxC,EAAKuB,EAAIkB,EAOf,GALApB,EAAOe,GAAI,EAAIrC,EACfsB,EAAOe,GAAI,EAAIpC,EACfqB,EAAO,EAAEgB,CAAE,EAAIrC,EACfqB,EAAO,EAAEgB,CAAE,EAAIpC,EAEXwB,EACJ,CACI,MAAMvB,EAAKqB,EAAIkB,EAEfpB,EAAOiB,GAAI,EAAIrC,EACfoB,EAAOiB,GAAI,EAAIpC,EACfmB,EAAO,EAAEkB,CAAE,EAAIrC,EACfmB,EAAO,EAAEkB,CAAE,EAAIxC,EAEvB,CAEA,QAASjE,EAAI,EAAGA,EAAIoG,EAAGpG,IACvB,CACI,MAAM4G,EAAI,KAAK,GAAK,GAAK5G,EAAIoG,GACvBM,EAAKhB,EAAM,KAAK,IAAIkB,CAAC,EAAIhB,EACzBe,EAAKhB,EAAM,KAAK,IAAIiB,CAAC,EAAIf,EACzB5B,EAAKuB,EAAIkB,EACTvC,EAAKqB,EAAIkB,EACTxC,EAAKuB,EAAIkB,EACTvC,EAAKqB,EAAIkB,EAEfpB,EAAOe,GAAI,EAAIrC,EACfsB,EAAOe,GAAI,EAAIpC,EACfqB,EAAO,EAAEgB,CAAE,EAAIrC,EACfqB,EAAO,EAAEgB,CAAE,EAAIpC,EACfoB,EAAOiB,GAAI,EAAIrC,EACfoB,EAAOiB,GAAI,EAAIpC,EACfmB,EAAO,EAAEkB,CAAE,EAAIrC,EACfmB,EAAO,EAAEkB,CAAE,EAAIxC,EAGnB,CACI,MAAMyC,EAAKhB,EACLiB,EAAKhB,EAAKE,EACV5B,EAAKuB,EAAIkB,EACTvC,EAAKqB,EAAIkB,EACTxC,EAAKuB,EAAIkB,EACTvC,EAAKqB,EAAIkB,EAEfpB,EAAOe,GAAI,EAAIrC,EACfsB,EAAOe,GAAI,EAAIpC,EACfqB,EAAO,EAAEkB,CAAE,EAAIrC,EACfmB,EAAO,EAAEkB,CAAE,EAAIxC,EAEXyB,IAEAH,EAAOe,GAAI,EAAInC,EACfoB,EAAOe,GAAI,EAAIpC,EACfqB,EAAO,EAAEkB,CAAE,EAAIrC,EACfmB,EAAO,EAAEkB,CAAE,EAAItC,EAEvB,CACJ,CAEA,KAAKkB,EAAkCzC,EACvC,CACI,KAAM,CAAE,MAAAiB,EAAO,OAAAhB,CAAO,EAAID,EACpB,CAAE,OAAA2C,EAAQ,UAAA5C,CAAU,EAAI0C,EAE9B,GAAIE,EAAO,SAAW,EAElB,OAGJ,IAAIC,EACAC,EAEJ,GAAIJ,EAAa,OAASS,EAAO,KACjC,CACI,MAAMC,EAASV,EAAa,MAE5BG,EAAIO,EAAO,EACXN,EAAIM,EAAO,MAGf,CACI,MAAME,EAAcZ,EAAa,MAEjCG,EAAIS,EAAY,EAAKA,EAAY,MAAQ,EACzCR,EAAIQ,EAAY,EAAKA,EAAY,OAAS,EAG9C,MAAMpG,EAASwF,EAAa,OACtBwB,EAAKhH,EAAUA,EAAO,EAAI2F,EAAM3F,EAAO,EAAI4F,EAAK5F,EAAO,GAAK2F,EAC5DsB,EAAKjH,EAAUA,EAAO,EAAI2F,EAAM3F,EAAO,EAAI4F,EAAK5F,EAAO,GAAK4F,EAElE,IAAIsB,EAAU,EACd,MAAMC,EAAS,EAEf,GAAI,CAAC3B,EAAa,OAClB,CACIxB,EAAM,KAAKgD,EAAIC,CAAE,EACjBjE,EAAO,KAAKP,EAAW,IAAI,EAC3BuB,EAAM,KAAK0B,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC/B1C,EAAO,KAAKP,EAAW,IAAI,EAE3B,QAAStC,EAAI,EAAGA,EAAIuF,EAAO,OAAQvF,GAAK,EAEpC6D,EAAM,KAAK0B,EAAOvF,CAAC,EAAGuF,EAAOvF,EAAI,CAAC,CAAC,EACnC6C,EAAO,KAAKP,EAAW,IAAI,EAE3BK,EAAU,KAAKoE,IAAWC,EAAQD,CAAO,EAG7CpE,EAAU,KAAKqE,EAAS,EAAGA,EAAQD,CAAO,EAE1C,OAGJ,MAAME,EAAM1B,EAAO,OAEnB,IAAItB,EAAKsB,EAAO0B,EAAM,CAAC,EACnB/C,EAAKqB,EAAO0B,EAAM,CAAC,EAEnBC,EAAMhD,EAAKqB,EAAO0B,EAAM,CAAC,EACzBE,EAAM5B,EAAO0B,EAAM,CAAC,EAAIhD,EAC5B,MAAMmD,EAAK,KAAK,KAAMF,EAAMA,EAAQC,EAAMA,CAAI,EAE9CD,GAAOE,EACPD,GAAOC,EAEP,IAAIC,EACAC,EAEJ,QAAStH,EAAI,EAAGA,EAAIiH,EAAKjH,GAAK,EAC9B,CACI,MAAMmE,EAAKoB,EAAOvF,CAAC,EACboE,EAAKmB,EAAOvF,EAAI,CAAC,EAEvB,IAAIuH,EAAMnD,EAAKF,EACXsD,EAAMvD,EAAKE,EACf,MAAMsD,EAAK,KAAK,KAAMF,EAAMA,EAAQC,EAAMA,CAAI,EAE9CD,GAAOE,EACPD,GAAOC,EAEP,IAAIC,EAAMR,EAAMK,EACZI,EAAMR,EAAMK,EAChB,MAAMI,EAAML,EAAMG,EAAQF,EAAMG,EAEhCD,GAAOE,EACPD,GAAOC,EAEH5H,EAAI,GAEJ6D,EAAM,KAAK6D,CAAG,EACd7D,EAAM,KAAK8D,CAAG,IAIdN,EAAMK,EACNJ,EAAMK,GAGV9D,EAAM,KAAKgD,CAAE,EACbhD,EAAM,KAAKiD,CAAE,EACbjD,EAAM,KAAKI,CAAE,EACbJ,EAAM,KAAKK,CAAE,EACbL,EAAM,KAAKM,CAAE,EACbN,EAAM,KAAKO,CAAE,EAEbP,EAAM,KAAK,CAAC,EACZA,EAAM,KAAK,CAAC,EACZA,EAAM,KAAK6D,CAAG,EACd7D,EAAM,KAAK8D,CAAG,EAEd9E,EAAO,KAAKP,EAAW,YAAc,CAAC,EACtCO,EAAO,KAAKP,EAAW,IAAI,EAC3BO,EAAO,KAAKP,EAAW,IAAI,EAC3BO,EAAO,KAAKP,EAAW,IAAI,EAC3BO,EAAO,KAAKP,EAAW,IAAI,EAC3BO,EAAO,KAAKP,EAAW,IAAI,EAE3B2B,EAAKE,EACLD,EAAKE,EACL8C,EAAMK,EACNJ,EAAMK,EAGV3D,EAAM,KAAKwD,CAAG,EACdxD,EAAM,KAAKyD,CAAG,CAClB,CAEA,KAAKjC,EAAkCzC,EACvC,CACI,KAAM,CAAE,MAAAiB,EAAO,OAAAhB,CAAO,EAAID,EACpB,CAAE,OAAA2C,CAAO,EAAIF,EACbnC,EAAQqC,EAAO,SAAW,EAC1BF,EAAa,gBAAkB/C,EAAW,YAAc,EACxD2E,EAAM1B,EAAO,OAEnB,GAAI0B,IAAQ,EAKZ,CAAApD,EAAM,KAAK0B,EAAO0B,EAAM,CAAC,EAAG1B,EAAO0B,EAAM,CAAC,CAAC,EAC3CpE,EAAO,KAAKP,EAAW,IAAI,EAC3B,QAAStC,EAAI,EAAGA,EAAIiH,EAAKjH,GAAK,EAE1B6D,EAAM,KAAK0B,EAAOvF,CAAC,EAAGuF,EAAOvF,EAAI,CAAC,CAAC,EACnC6C,EAAO,KAAKK,CAAK,EAErBW,EAAM,KAAK0B,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC/B1C,EAAO,KAAKP,EAAW,IAAI,EAC3BuB,EAAM,KAAK0B,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC/B1C,EAAO,KAAKP,EAAW,IAAI,EAC/B,CACJ,CClTA,MAAMuF,GAAyB,GAE/B,SAASC,GAAevC,EAAkBwC,EAAO,GACjD,CACI,MAAM1B,EAAId,EAAO,OAEjB,GAAIc,EAAI,EAEJ,OAGJ,IAAI2B,EAAO,EAEX,QAAShI,EAAI,EAAGiE,EAAKsB,EAAOc,EAAI,CAAC,EAAGnC,EAAKqB,EAAOc,EAAI,CAAC,EAAGrG,EAAIqG,EAAGrG,GAAK,EACpE,CACI,MAAMmE,EAAKoB,EAAOvF,CAAC,EACboE,EAAKmB,EAAOvF,EAAI,CAAC,EAEvBgI,IAAS7D,EAAKF,IAAOG,EAAKF,GAE1BD,EAAKE,EACLD,EAAKE,EAGT,GAAK,CAAC2D,GAAQC,EAAO,GAAOD,GAAQC,GAAQ,EAC5C,CACI,MAAM5B,EAAIC,EAAI,EAEd,QAASrG,EAAIoG,EAAKA,EAAI,EAAIpG,EAAIqG,EAAGrG,GAAK,EACtC,CACI,MAAMiI,EAAK5B,EAAIrG,EAAI,EACbkI,EAAK7B,EAAIrG,EAAI,EACbmI,EAAKnI,EACLoI,EAAKpI,EAAI,EAEf,CAACuF,EAAO0C,CAAE,EAAG1C,EAAO4C,CAAE,CAAC,EAAI,CAAC5C,EAAO4C,CAAE,EAAG5C,EAAO0C,CAAE,CAAC,EAClD,CAAC1C,EAAO2C,CAAE,EAAG3C,EAAO6C,CAAE,CAAC,EAAI,CAAC7C,EAAO6C,CAAE,EAAG7C,EAAO2C,CAAE,CAAC,GAG9D,CAKO,MAAMG,EACb,CACI,KAAKhD,EAAkCjC,EACvC,CACI,MAAM6B,EAAQI,EAAa,MACrBE,EAASF,EAAa,OAASJ,EAAM,OAAO,MAAM,EAClDnF,EAAMsD,EAAU,cAChBkF,EAAOxI,EAAMA,EAEnB,GAAIyF,EAAO,SAAW,EAElB,OAGJ,MAAMgD,EAAa,IAAIC,EAAMjD,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC3CkD,EAAY,IAAID,EAAMjD,EAAOA,EAAO,OAAS,CAAC,EAAGA,EAAOA,EAAO,OAAS,CAAC,CAAC,EAC1EmD,EAAcrD,EAAa,YAAcJ,EAAM,YAErD,IAAIgC,EAAM1B,EAAO,OACboD,EAAS,EAGb,QAAS3I,EAAI,EAAGA,EAAIiH,EAAKjH,GAAK,EAC9B,CACI,MAAMiE,EAAKsB,EAAOvF,EAAI,CAAC,EACjBkE,EAAKqB,EAAOvF,EAAI,CAAC,EACjBmE,EAAKoB,EAAOvF,CAAC,EACboE,EAAKmB,EAAOvF,EAAI,CAAC,EACvB,IAAI4I,EAAO,GAEP,KAAK,IAAI3E,EAAKE,CAAE,EAAIrE,GACjB,KAAK,IAAIoE,EAAKE,CAAE,EAAItE,IAEvB8I,EAAO,IAGPA,IAEArD,EAAOoD,CAAM,EAAIpD,EAAOvF,CAAC,EACzBuF,EAAOoD,EAAS,CAAC,EAAIpD,EAAOvF,EAAI,CAAC,EACjC2I,GAAU,GAGlBpD,EAAO,OAAS0B,EAAM0B,EAEtBA,EAAS,EAET,QAAS3I,EAAI,EAAGA,EAAI,EAAIiH,EAAKjH,GAAK,EAClC,CACI,IAAIiE,EAAKsB,EAAOvF,EAAI,CAAC,EACjBkE,EAAKqB,EAAOvF,EAAI,CAAC,EACrB,MAAMmE,EAAKoB,EAAOvF,CAAC,EACboE,EAAKmB,EAAOvF,EAAI,CAAC,EACvB,IAAI6I,EAAKtD,EAAOvF,EAAI,CAAC,EACjB8I,EAAKvD,EAAOvF,EAAI,CAAC,EAErBiE,GAAME,EACND,GAAME,EACNyE,GAAM1E,EACN2E,GAAM1E,EACN,IAAIwE,EAAO,GAEP,KAAK,IAAKC,EAAK3E,EAAO4E,EAAK7E,CAAG,EAAIqE,GAE7BrE,EAAK4E,EAAO3E,EAAK4E,EAAM,CAACR,IAEzBM,EAAO,IAIXA,IAEArD,EAAOoD,CAAM,EAAIpD,EAAOvF,CAAC,EACzBuF,EAAOoD,EAAS,CAAC,EAAIpD,EAAOvF,EAAI,CAAC,EACjC2I,GAAU,GAGlBpD,EAAOoD,CAAM,EAAIpD,EAAO0B,EAAM,CAAC,EAC/B1B,EAAOoD,EAAS,CAAC,EAAIpD,EAAO0B,EAAM,CAAC,EACnC0B,GAAU,EAEVpD,EAAO,OAAS0B,EAAM0B,EAElB,EAAA1B,GAAO,IAMPyB,GAGmB,KAAK,IAAIH,EAAW,EAAIE,EAAU,CAAC,EAAI3I,GACnD,KAAK,IAAIyI,EAAW,EAAIE,EAAU,CAAC,EAAI3I,IAI1CyF,EAAO,MACPA,EAAO,IAAI,EAGvB,CAEA,KAAKF,EAAkCjC,EACvC,CACI,KAAM,CAAE,YAAA2F,EAAa,OAAAxD,CAAO,EAAIF,EAG1B4B,EAAM1B,EAAO,OAGnB,GAAI0B,GAAO,EAEP,OAEJ,KAAM,CAAE,MAAApD,EAAO,OAAAhB,CAAO,EAAIO,EAIpBF,EAAQmC,EAAa,UAAA,EACrBF,EAAME,EAAa,QAAQ,EACjC,IAAIpC,EAAU,EAEVoB,EACAC,EAEAyE,GAEA1E,EAAQkB,EAAO0B,EAAM,CAAC,EACtB3C,EAAQiB,EAAO0B,EAAM,CAAC,EACtBpE,EAAO,KAAKP,EAAW,IAAI,IAI3B+B,EAAQkB,EAAO,CAAC,EAChBjB,EAAQiB,EAAO,CAAC,EACZJ,IAAQ7C,EAAW,WAEnBuB,EAAM,KAAK0B,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC/B1C,EAAO,KAAKP,EAAW,IAAI,EAC3BO,EAAO,KAAKP,EAAW,SAAS,EAChCW,EAAU,IAIVA,EAAUkC,EACVtC,EAAO,KAAKP,EAAW,IAAI,IAGnCuB,EAAM,KAAKQ,EAAOC,CAAK,EAGvB,QAAStE,EAAI,EAAGA,EAAIiH,EAAKjH,GAAK,EAC9B,CACI,MAAMiE,EAAKsB,EAAOvF,CAAC,EACfkE,EAAKqB,EAAOvF,EAAI,CAAC,EAqBrB,IAAIgJ,EAAW9F,EAEXlD,EAAI,GAAKiH,EAIJ8B,IAEDC,EAAW1G,EAAW,MAGrBtC,EAAI,GAAKiH,IAIT8B,IAEG5D,IAAQ7C,EAAW,YAEnB0G,EAAW1G,EAAW,iBAEtB6C,IAAQ7C,EAAW,WAEnB0G,EAAW1G,EAAW,gBAEtB6C,IAAQ7C,EAAW,aAEnB0G,EAAW1G,EAAW,oBAalC0G,GAAY/F,EACZA,EAAU,EAEVY,EAAM,KAAKI,EAAIC,CAAE,EACjBrB,EAAO,KAAKmG,CAAQ,EAEpB3E,EAAQJ,EACRK,EAAQJ,EAGR6E,GAEAlF,EAAM,KAAK0B,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC/B1C,EAAO,KAAKP,EAAW,IAAI,EAC3BuB,EAAM,KAAK0B,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC/B1C,EAAO,KAAKP,EAAW,IAAI,IAI3BuB,EAAM,KAAK0B,EAAO0B,EAAM,CAAC,EAAG1B,EAAO0B,EAAM,CAAC,CAAC,EAC3CpE,EAAO,KAAKP,EAAW,IAAI,EAEnC,CAEA,KAAK+C,EAAkCjC,EACvC,CACI,IAAImC,EAASF,EAAa,OAE1B,MAAM4D,EAAQ5D,EAAa,MACrBvF,EAAMsD,EAAU,cAEhB,CAAE,MAAAS,EAAO,OAAAhB,CAAO,EAAIO,EAE1B,GAAImC,EAAO,OAAS,EAEhB,OAEJ,MAAM2D,EAAY,CAAA,EAClB,IAAIjC,EAAM1B,EAAO,OAEjBuC,GAAevC,EAAQ,EAAK,EAG5B,QAASvF,EAAI,EAAGA,EAAIiJ,EAAM,OAAQjJ,IAClC,CACI,MAAM+H,EAAOkB,EAAMjJ,CAAC,EAEpB8H,GAAeC,EAAK,OAAQ,EAAI,EAEhCmB,EAAU,KAAK3D,EAAO,OAAS,CAAC,EAChCA,EAASA,EAAO,OAAOwC,EAAK,MAAM,EAItC,MAAMoB,EAAKtB,GAEPsB,EAAG,OAAS5D,EAAO,SAEnB4D,EAAG,OAAS5D,EAAO,QAEvB,IAAI6D,EAAQ,EAEZ,QAASpJ,EAAI,EAAGA,GAAKkJ,EAAU,OAAQlJ,IACvC,CACI,IAAIqJ,EAASpC,EAAM,EAEfjH,EAAI,IAEAA,EAAIkJ,EAAU,OAEdG,EAASH,EAAUlJ,CAAC,EAIpBqJ,EAAU9D,EAAO,QAAU,GAGnC4D,EAAGC,EAAQ,CAAC,EAAIC,EAAS,EACzBF,GAAKE,EAAS,GAAK,EAAK,CAAC,EAAID,EAC7B,QAASzE,EAAIyE,EAAOzE,EAAI,EAAI0E,EAAQ1E,IAEhCwE,EAAIxE,EAAI,EAAK,CAAC,EAAIA,EAAI,EACtBwE,EAAIxE,EAAI,EAAK,CAAC,EAAIA,EAEtByE,EAAQC,EAMZ,GAFAhE,EAAa,UAAYiE,GAAM,OAAO/D,EAAQ2D,EAAW,CAAC,EAEtD,CAAC7D,EAAa,UAEd,OAGJ,GAAI,CAACA,EAAa,OAClB,CACI,QAASrF,EAAI,EAAGA,EAAIuF,EAAO,OAAQvF,GAAK,EAEpC6D,EAAM,KAAK0B,EAAOvF,CAAC,EAAGuF,EAAOvF,EAAI,CAAC,CAAC,EACnC6C,EAAO,KAAKP,EAAW,IAAI,EAG/B,OAGJ,KAAM,CAAE,UAAAK,CAAU,EAAI0C,EAEtB4B,EAAM1B,EAAO,OAEb,QAASvF,EAAI,EAAGA,EAAI2C,EAAU,OAAQ3C,GAAK,EAC3C,CAEI,IAAI4I,EAAO,EAEX,QAASjE,EAAI,EAAGA,EAAI,EAAGA,IACvB,CACI,MAAM4E,EAAO5G,EAAU3C,EAAI2E,CAAC,EACtB6E,EAAO7G,EAAU3C,GAAM2E,EAAI,GAAK,CAAE,GAEpCwE,EAAGI,EAAO,CAAC,IAAMC,GAAQL,EAAII,EAAO,EAAK,CAAC,IAAMC,KAEhDZ,GAAS,GAAKjE,GAGtB9B,EAAO,KAAKP,EAAW,YAAcsG,CAAI,EACzC/F,EAAO,KAAKP,EAAW,IAAI,EAC3BO,EAAO,KAAKP,EAAW,IAAI,EAC3BO,EAAO,KAAKP,EAAW,IAAI,EAC3BO,EAAO,KAAKP,EAAW,IAAI,EAC3BO,EAAO,KAAKP,EAAW,IAAI,EAI/B,QAASmH,EAAM,EAAGA,EAAMxC,EAAM,EAAGwC,IACjC,CACI,MAAMC,EAAOP,EAAGM,EAAM,CAAC,EACjBE,EAAOR,EAAIM,EAAM,EAAK,CAAC,EAC7B,IAAIvC,EAAO3B,EAAQoE,EAAO,EAAK,CAAC,EAAIpE,EAAQkE,EAAM,EAAK,CAAC,EACpDtC,EAAM,EAAE5B,EAAOoE,EAAO,CAAC,EAAIpE,EAAOkE,EAAM,CAAC,GACzClC,EAAOhC,EAAQkE,EAAM,EAAK,CAAC,EAAIlE,EAAQmE,EAAO,EAAK,CAAC,EACpDlC,EAAM,EAAEjC,EAAOkE,EAAM,CAAC,EAAIlE,EAAOmE,EAAO,CAAC,GAC7C,MAAME,EAAK,KAAK,KAAM1C,EAAMA,EAAQC,EAAMA,CAAI,EAE9CD,GAAO0C,EACPzC,GAAOyC,EACP,MAAMC,EAAK,KAAK,KAAMtC,EAAMA,EAAQC,EAAMA,CAAI,EAE9CD,GAAOsC,EACPrC,GAAOqC,EAEP,IAAIC,EAAM5C,EAAMK,EACZwC,EAAM5C,EAAMK,EAChB,MAAMwC,EAAKF,EAAK5C,EAAQ6C,EAAK5C,EAEzB,KAAK,IAAI6C,CAAC,EAAIlK,GAEdgK,EAAK5C,EACL6C,EAAK5C,IAIL2C,GAAME,EACND,GAAMC,GAEVb,EAAGM,EAAM,CAAC,EAAIK,EACdX,EAAIM,EAAM,EAAK,CAAC,EAAIM,EAGxB,QAAS/J,EAAI,EAAGA,EAAI2C,EAAU,OAAQ3C,GAAK,EAC3C,CACI,MAAM0J,EAAO/G,EAAU3C,CAAC,EAClByJ,EAAM9G,EAAU3C,EAAI,CAAC,EACrB2J,EAAOhH,EAAU3C,EAAI,CAAC,EACtBkH,EAAO3B,EAAQoE,EAAO,EAAK,CAAC,EAAIpE,EAAQkE,EAAM,EAAK,CAAC,EACtDtC,EAAM,EAAE5B,EAAOoE,EAAO,CAAC,EAAIpE,EAAOkE,EAAM,CAAC,GACvClC,EAAOhC,EAAQkE,EAAM,EAAK,CAAC,EAAIlE,EAAQmE,EAAO,EAAK,CAAC,EACtDlC,EAAM,EAAEjC,EAAOkE,EAAM,CAAC,EAAIlE,EAAOmE,EAAO,CAAC,GAE7C,IAAIpD,EAAK,EAEJY,EAAMM,EAAQD,EAAMJ,EAAO,IAE5Bb,EAAK,GAGT,QAAS3B,EAAI,EAAGA,EAAI,EAAGA,IACvB,CACI,MAAM8E,EAAM9G,EAAU3C,EAAM2E,EAAI2B,EAAM,CAAE,EAExCzC,EAAM,KAAK0B,EAAOkE,EAAM,CAAC,EAAGlE,EAAQkE,EAAM,EAAK,CAAC,CAAC,EAErD,QAAS9E,EAAI,EAAGA,EAAI,EAAGA,IACvB,CACI,MAAM8E,EAAM9G,EAAU3C,EAAM2E,EAAI2B,EAAM,CAAE,EAExCzC,EAAM,KAAKsF,EAAGM,EAAM,CAAC,EAAGN,EAAIM,EAAM,EAAK,CAAC,CAAC,GAGrD,CACJ,CCxcO,MAAMQ,EACb,CADO,aAEH,CAAA,KAAA,aAAe,IAAI5B,EAEnB,CAAA,KAAKhD,EAAkCC,EACvC,CAII,MAAM4E,EAAW7E,EAAa,MACxBG,EAAI0E,EAAS,EACbzE,EAAIyE,EAAS,EACbC,EAAQD,EAAS,MACjBE,EAASF,EAAS,OAClB3E,EAASF,EAAa,OAE5BE,EAAO,OAAS,EAEhBA,EAAO,KAAKC,EAAGC,EACXD,EAAI2E,EAAO1E,EACXD,EAAI2E,EAAO1E,EAAI2E,EACf5E,EAAGC,EAAI2E,CAAM,CACrB,CAEA,KAAK/E,EAAkCzC,EACvC,CACI,KAAM,CAAE,MAAAiB,EAAO,OAAAhB,CAAO,EAAID,EACpB,CAAE,OAAA2C,CAAO,EAAIF,EAEbnC,EAAQmC,EAAa,cAAA,EACrB4B,EAAM1B,EAAO,OAEnB1B,EAAM,KAAK0B,EAAO0B,EAAM,CAAC,EAAG1B,EAAO0B,EAAM,CAAC,CAAC,EAC3CpE,EAAO,KAAKP,EAAW,IAAI,EAC3B,QAAStC,EAAI,EAAGA,EAAIiH,EAAKjH,GAAK,EAE1B6D,EAAM,KAAK0B,EAAOvF,CAAC,EAAGuF,EAAOvF,EAAI,CAAC,CAAC,EACnC6C,EAAO,KAAKK,CAAK,EAErBW,EAAM,KAAK0B,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC/B1C,EAAO,KAAKP,EAAW,IAAI,EAC3BuB,EAAM,KAAK0B,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAC/B1C,EAAO,KAAKP,EAAW,IAAI,CAC/B,CAEA,KAAK+C,EAAkCzC,EACvC,CACI,KAAM,CAAE,MAAAiB,EAAO,OAAAhB,CAAO,EAAID,EACpB,CAAE,OAAA2C,EAAQ,UAAA5C,CAAU,EAAI0C,EAI9B,GAFA1C,EAAU,OAAS,EAEf,CAAC0C,EAAa,OAClB,CACIxB,EAAM,KAAK0B,EAAO,CAAC,EAAGA,EAAO,CAAC,EAC1BA,EAAO,CAAC,EAAGA,EAAO,CAAC,EACnBA,EAAO,CAAC,EAAGA,EAAO,CAAC,EACnBA,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAExB1C,EAAO,KAAKP,EAAW,KAAMA,EAAW,KAAMA,EAAW,KAAMA,EAAW,IAAI,EAC9EK,EAAU,KAAK,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAE/B,OAGJ,KAAK,aAAa,KAAK0C,EAAczC,CAAM,CAC/C,CACJ,OCrEayH,EACb,CADO,cAEH,KAAiB,eAAA,IAAIjF,EAErB,KAAKC,EAAkCzC,EACvC,CACI,KAAK,eAAe,KAAKyC,EAAczC,CAAM,CACjD,CAEA,KAAKyC,EAAkCzC,EACvC,CACI,KAAK,eAAe,KAAKyC,EAAczC,CAAM,CACjD,CAEA,KAAKyC,EAAkCzC,EACvC,CACI,KAAK,eAAe,KAAKyC,EAAczC,CAAM,CACjD,CACJ,CCnBO,MAAM0H,EAA+C,CACxD,CAACxE,EAAO,IAAI,EAAG,IAAIuC,GACnB,CAACvC,EAAO,IAAI,EAAG,IAAIV,EACnB,CAACU,EAAO,IAAI,EAAG,IAAIV,EACnB,CAACU,EAAO,IAAI,EAAG,IAAImE,GACnB,CAACnE,EAAO,IAAI,EAAG,IAAIuE,EACvB,ECmBaE,GAA+B,CAC/B,EAAAC,EAAuC,CAAA,EAE9CC,EAAW,IAAIjC,EACfkC,GAAY,IAAIC,SAKTC,WAA+BC,EAC5C,CAiEI,aACA,CACI,QA9DJ,KAA2C,cAAA,KAgEvC,KAAK,eAAe,EAAK,EAEzB,KAAK,UAAY,IAAIxI,GAErB,KAAK,aAAe,CAAC,EAErB,KAAK,MAAQ,EAEb,KAAK,WAAa,GAElB,KAAK,WAAa,GAElB,KAAK,WAAa,EAElB,KAAK,UAAY,CAAA,EAEjB,KAAK,QAAU,CAAC,EAEhB,KAAK,gBAAkB,EAEvB,KAAK,gBAAkB,EAEvB,KAAK,QAAU,IAAIsI,GAEnB,KAAK,YAAc,GAEnB,KAAK,cAAgB,EAErB,KAAK,UAAY,GAEjB,KAAK,cAAgB,KAErB,KAAK,OAAS,KACd,KAAK,SAAW,EAChB,KAAK,YAAc,IACvB,CA9FA,IAAI,QACJ,CACI,OAAO,KAAK,UAAU,KAC1B,CAEA,IAAI,eACJ,CACI,OAAO,KAAK,UAAU,aAC1B,CAwBA,eAAeG,EACf,CACI,KAAK,QAAU,IAAIC,GAAO,KAAMD,EAAS,EAAK,EAC9C,KAAK,cAAgB,IAAI,aACzB,KAAK,YAAc,IAAI,YAEvB,KAAK,aAAe,IAAIC,GAAO,KAAMD,EAAS,EAAI,EAClD,KAAK,aAAa,QAAS,KAAK,QAAS,EAAG,GAAOE,EAAM,KAAK,EACzD,aAAa,UAAW,KAAK,QAAS,EAAG,GAAOA,EAAM,KAAK,EAC3D,aAAa,UAAW,KAAK,QAAS,EAAG,GAAOA,EAAM,KAAK,EAC3D,aAAa,QAAS,KAAK,QAAS,EAAG,GAAOA,EAAM,KAAK,EACzD,aAAa,UAAW,KAAK,QAAS,EAAG,GAAOA,EAAM,KAAK,EAE3D,aAAa,eAAgB,KAAK,QAAS,EAAG,GAAOA,EAAM,KAAK,EAEhE,aAAa,WAAY,KAAK,QAAS,EAAG,GAAOA,EAAM,KAAK,EAE5D,aAAa,SAAU,KAAK,QAAS,EAAG,GAAMA,EAAM,aAAa,EACjE,SAAS,KAAK,YAAY,EAE/B,KAAK,aAAe,EACxB,CA2CO,gBAAgBC,EAAoBC,EAC3C,CACQ,KAAK,SAIT,KAAK,OAAS,IAAInG,EAClB,KAAK,YAAcmG,EACvB,CAQA,IAAW,QACX,CACI,OAAI,KAAK,cAAgB,KAAK,QAE1B,KAAK,YAAc,KAAK,MACxB,KAAK,gBAAA,GAGF,KAAK,OAChB,CAMU,YACV,CACI,KAAK,YAAc,GACnB,KAAK,QACL,KAAK,aACL,KAAK,gBAAkB,EACvB,KAAK,gBAAkB,EACvB,KAAK,SAAW,EAEhB,KAAK,UAAU,QAEf,QAASlL,EAAI,EAAGA,EAAI,KAAK,UAAU,OAAQA,IAEvC,KAAK,UAAUA,CAAC,EAAE,MAAM,EACxBwK,EAAe,KAAK,KAAK,UAAUxK,CAAC,CAAC,EAGzC,KAAK,UAAU,OAAS,EAExB,QAASA,EAAI,EAAGA,EAAI,KAAK,QAAQ,OAAQA,IACzC,CACI,MAAMmL,EAAY,KAAK,QAAQnL,CAAC,EAEhCmL,EAAU,QACVZ,GAAW,KAAKY,CAAS,EAG7B,KAAK,QAAQ,OAAS,CAC1B,CAEO,OACP,CACI,OAAI,KAAK,aAAa,OAAS,IAE3B,KAAK,WAAW,EAChB,KAAK,aACL,KAAK,aAAa,OAAS,GAGxB,IACX,CAEO,UACHlG,EACAC,EAAuB,KACvBxB,EAAuB,KACvB7D,EAAiB,KACrB,CACI,MAAMuL,EAAO,IAAIpG,EAAmBC,EAAOC,EAAWxB,EAAW7D,CAAM,EAEvE,OAAK,KAAA,aAAa,KAAKuL,CAAI,EAC3B,KAAK,QAEE,IACX,CAEO,SAASnG,EAAepF,EAAiB,KAChD,CACI,GAAI,CAAC,KAAK,aAAa,OAEnB,OAAO,KAGX,MAAMuL,EAAO,IAAIpG,EAAmBC,EAAO,KAAM,KAAMpF,CAAM,EAEvDwL,EAAY,KAAK,aAAa,KAAK,aAAa,OAAS,CAAC,EAEhE,OAAAD,EAAK,UAAYC,EAAU,UAE3BA,EAAU,MAAM,KAAKD,CAAI,EAEzB,KAAK,QAEE,IACX,CAEO,SACP,CACI,MAAM,UAGN,QAASpL,EAAI,EAAGA,EAAI,KAAK,aAAa,OAAQ,EAAEA,EAE5C,KAAK,aAAaA,CAAC,EAAE,QAAQ,EAGjC,KAAK,UAAU,QAAA,EACf,KAAK,UAAY,KACjB,KAAK,YAAY,QAAA,EACjB,KAAK,YAAc,KACnB,KAAK,aAAa,OAAS,EAC3B,KAAK,aAAe,KACpB,KAAK,UAAU,OAAS,EACxB,KAAK,UAAY,KACjB,KAAK,QAAQ,OAAS,EACtB,KAAK,QAAU,KACf,KAAK,QAAU,IACnB,CAQO,cAAcsL,EACrB,CACI,MAAMjG,EAAe,KAAK,aAE1B,QAASrF,EAAI,EAAGA,EAAIqF,EAAa,OAAQ,EAAErF,EAC3C,CACI,MAAMoL,EAAO/F,EAAarF,CAAC,EAE3B,GAAKoL,EAAK,UAAU,SAMhBA,EAAK,QAEDA,EAAK,OAELA,EAAK,OAAO,aAAaE,EAAOb,CAAQ,EAIxCA,EAAS,SAASa,CAAK,EAGvBF,EAAK,MAAM,SAASX,EAAS,EAAGA,EAAS,CAAC,GAC9C,CACI,IAAIc,EAAU,GAEd,GAAIH,EAAK,OAEL,QAASpL,EAAI,EAAGA,EAAIoL,EAAK,MAAM,OAAQpL,IAInC,GAFaoL,EAAK,MAAMpL,CAAC,EAEhB,MAAM,SAASyK,EAAS,EAAGA,EAAS,CAAC,EAC9C,CACIc,EAAU,GACV,OAKZ,GAAI,CAACA,EAED,MAAO,IAMvB,MAAO,EACX,CAEA,cACA,CAIA,CAAA,kBACA,CACI,KAAK,QAAQ,OAAO,IAAI,YAAc,CAC1C,CAEA,aACA,CACI,KAAM,CAAE,aAAAlG,EAAc,UAAAjC,CAAU,EAAI,KAC9B6D,EAAM5B,EAAa,OAEzB,QAASrF,EAAI,KAAK,gBAAiBA,EAAIiH,EAAKjH,IAC5C,CACI,MAAMoL,EAAO/F,EAAarF,CAAC,EAE3BoL,EAAK,YAAc,EACnBA,EAAK,UAAY,EACjBA,EAAK,UAAY,EACjBA,EAAK,QAAU,EACf,KAAM,CAAE,UAAAlG,EAAW,UAAAxB,EAAW,MAAAuF,CAAM,EAAImC,EAExC,GAAI,CAAClG,EAAU,SAAW,CAACxB,EAAU,QAEjC,SAGJ,MAAM8H,EAAUlB,EAAcc,EAAK,IAAI,EAWvC,GATAA,EAAK,UAAU,EAEfI,EAAQ,KAAKJ,EAAMhI,CAAS,EACxBgI,EAAK,QAEL,KAAK,gBAAgBA,EAAK,OAAQA,EAAK,MAAM,EAGjDA,EAAK,WAAW,EACZ,EAAAA,EAAK,OAAO,QAAU,MAItBlG,EAAU,SAAWxB,EAAU,UAE/B,KAAK,aAAauF,CAAK,EAEvB/D,EAAU,UAEVkG,EAAK,OAAUA,EAAK,UAAkB,QAC/BA,EAAK,UAAU,UAAYrJ,EAAQ,OACnCkH,EAAM,SAAW,GACjB,EAAEmC,EAAK,aACPA,EAAK,UAAU,SACf,CAACA,EAAK,UAAU,QAChBA,EAAK,UAAU,OAAS,KACxBA,EAAK,UAAU,MAAQ,KAAK,IAAIA,EAAK,UAAU,UAAW,EAAIA,EAAK,UAAU,SAAS,GAAK,MAElGA,EAAK,UAAYhI,EAAU,OAAO,OAE9B6F,EAAM,OAENqB,EAAcxE,EAAO,IAAI,EAAE,KAAKsF,EAAMhI,CAAS,EAI/CoI,EAAQ,KAAKJ,EAAMhI,CAAS,EAGhCgI,EAAK,QAAUhI,EAAU,OAAO,OAASgI,EAAK,WAE9C1H,EAAU,SACd,CACI0H,EAAK,YAAchI,EAAU,OAAO,OACpCoI,EAAQ,KAAKJ,EAAMhI,CAAS,EAC5B,QAASpD,EAAI,EAAGA,EAAIiJ,EAAM,OAAQjJ,IAClC,CACI,MAAM+H,EAAOkB,EAAMjJ,CAAC,EAEpBsK,EAAcvC,EAAK,IAAI,EAAE,KAAKA,EAAM3E,CAAS,EAEjDgI,EAAK,UAAYhI,EAAU,OAAO,OAASgI,EAAK,aAGxD,KAAK,gBAAkBnE,CAC3B,CAEA,cAAcwE,EACd,CACI,GAAI,CAAC,KAAK,aAAa,OACvB,CACI,KAAK,UAAY,GAEjB,OAIJ,GAFA,KAAK,YAAY,EAEb,CAAC,KAAK,iBAAiB,EAEvB,OAGJ,KAAM,CAAE,UAAArI,EAAW,aAAAiC,CAAa,EAAI,KAC9B4B,EAAM5B,EAAa,OAEzB,KAAK,WAAa,KAAK,MAEvB,IAAI8F,EAAuB,KAEvBO,EAAe,KAEf,KAAK,QAAQ,OAAS,IAEtBP,EAAY,KAAK,QAAQ,KAAK,QAAQ,OAAS,CAAC,EAChDO,EAAeP,EAAU,OAG7B,QAASnL,EAAI,KAAK,gBAAiBA,EAAIiH,EAAKjH,IAC5C,CACI,MAAMoL,EAAO/F,EAAarF,CAAC,EACrBkF,EAAYkG,EAAK,UACjB1H,EAAY0H,EAAK,UAMvB,GAJIA,EAAK,QAEL,KAAK,gBAAgBA,EAAK,OAAQA,EAAK,MAAM,EAE7C,GAAClG,EAAU,SAAW,CAACxB,EAAU,SAIrC,QAASiB,EAAI,EAAGA,EAAI,EAAGA,IACvB,CACI,MAAMnD,EAASmD,IAAM,EAAKO,EAAYxB,EAEtC,GAAI,CAAClC,EAAM,QAAS,SAEpB,MAAMmK,EAAcnK,EAAM,QAAQ,YAC5BoK,EAAYxI,EAAU,WACtByI,EAAWzI,EAAU,UAE3BuI,EAAY,SAAWG,GAAW,OAC9BnH,IAAM,EAEN,KAAK,OAAO,iBAAiByG,EAAK,UAAWA,EAAK,QAASA,EAAK,UAAU,OAAQhI,CAAS,EAI3F,KAAK,OAAO,iBAAiBgI,EAAK,YAAaA,EAAK,UAAWA,EAAK,UAAU,OAAQhI,CAAS,EAGhFA,EAAU,aAEVwI,IAEfT,GAAa,CAAC,KAAK,eAAeO,EAAclK,CAAK,IAErD2J,EAAU,IAAIU,EAAUD,CAAS,EACjCT,EAAY,MAGXA,IAEDA,EAAYZ,GAAW,OAAS,IAAIhJ,GACpC4J,EAAU,MAAM3J,EAAOqK,EAAUD,CAAS,EAC1C,KAAK,QAAQ,KAAKT,CAAS,EAC3BO,EAAelK,GAGfmD,IAAM,EAENwG,EAAU,SAAWC,EAAK,UAAYA,EAAK,QAI3CD,EAAU,SAAWC,EAAK,YAAcA,EAAK,YAWzD,GAPA,KAAK,gBAAkBnE,EAEnBkE,GAEAA,EAAU,IAAI/H,EAAU,UAAWA,EAAU,UAAU,EAGvD,KAAK,QAAQ,SAAW,EAC5B,CAGI,KAAK,UAAY,GAEjB,OAIJ,KAAK,UAAY,KAAK,YAAA,EAElB,KAAK,UAEL,KAAK,YAAY,GAIjB,KAAK,eAAeqI,CAAc,EAClC,KAAK,aAEb,CAEA,YACA,CACI,KAAM,CAAE,WAAA1I,EAAY,UAAAC,CAAU,EAAI,KAAK,UAEvC,GAAI,KAAK,WAAaD,EAElB,OAGJ,KAAM,CAAE,aAAAa,EAAc,OAAAmI,EAAQ,UAAA3I,EAAW,QAAA4I,CAAQ,EAAI,KAC/CC,EAAS,KAAK,QACdjI,EAAQ,KAAK,aACbkI,EAAanJ,EAAaa,EAEhC,GAAIqI,EAAO,KAAK,SAAWC,EAC3B,CACI,MAAMC,EAAS,IAAI,YAAYD,EAAa,CAAC,EAE7C,KAAK,cAAgB,IAAI,aAAaC,CAAM,EAC5C,KAAK,YAAc,IAAI,YAAYA,CAAM,EACzCF,EAAO,KAAO,KAAK,cAEnBjI,EAAM,KAAK,SAAWhB,IAElBD,EAAa,OAAU,KAAK,YAE5BiB,EAAM,KAAO,IAAI,YAAYhB,CAAS,EAItCgB,EAAM,KAAO,IAAI,YAAYhB,CAAS,GAI9C+I,EAAO,UAAU3I,EAAW,KAAK,cAAe,KAAK,YAAaY,EAAM,IAAmB,EAE3F,IAAIW,EAAI,EAER,QAAS3E,EAAI,EAAGA,EAAI,KAAK,aAAa,OAAQA,IAC9C,CACI,MAAMoL,EAAO,KAAK,aAAapL,CAAC,EAEhC,GAAIoL,EAAK,QACT,CACI,KAAOY,EAAQrH,CAAC,EAAE,UAAYyG,EAAK,WAE/BzG,IAEJoH,EAAO,wBAAwBX,EAAK,UAAWA,EAAK,QAASA,EAAK,UAC9DY,EAAQrH,CAAC,EAAE,QAASqH,EAAQrH,CAAC,EAAE,IAAI,EAE3C,GAAIyG,EAAK,UACT,CACI,KAAOY,EAAQrH,CAAC,EAAE,UAAYyG,EAAK,aAE/BzG,IAEJoH,EAAO,wBAAwBX,EAAK,YAAaA,EAAK,UAAWA,EAAK,UAClEY,EAAQrH,CAAC,EAAE,QAASqH,EAAQrH,CAAC,EAAE,IAAI,GAI/CsH,EAAO,OAAO,EACdjI,EAAM,OAAO,EACb,KAAK,SAAWjB,CACpB,CAQU,eAAeqJ,EAA+BC,EACxD,CA6BI,GA5BI,CAACD,GAAU,CAACC,GAKZD,EAAO,QAAQ,cAAgBC,EAAO,QAAQ,aAK9CD,EAAO,MAAQA,EAAO,QAAUC,EAAO,MAAQA,EAAO,OAKtDD,EAAO,SAAWC,EAAO,QAKxBD,EAAqB,QAAWC,EAAqB,OAIrDD,EAAqB,YAAeC,EAAqB,WAIzDD,EAAqB,YAAeC,EAAqB,UAE1D,MAAO,GAGX,MAAMC,EAAOF,EAAO,QAAU9K,EAAO,SAC/BiL,EAAOF,EAAO,QAAU/K,EAAO,SAErC,OAAO3B,GAAa2M,EAAMC,CAAI,CAClC,CAOU,kBACV,CACI,GAAI,KAAK,QAAU,KAAK,YAAc,CAAC,KAAK,aAAa,OAErD,MAAO,GAGX,QAASvM,EAAI,EAAGwM,EAAI,KAAK,aAAa,OAAQxM,EAAIwM,EAAGxM,IACrD,CACI,MAAMoL,EAAO,KAAK,aAAapL,CAAC,EAC1ByM,EAAOrB,EAAK,UACZsB,EAAOtB,EAAK,UAGlB,GADIqB,GAAQ,CAACA,EAAK,QAAQ,YAAY,OAClCC,GAAQ,CAACA,EAAK,QAAQ,YAAY,MAAO,MAAO,GAGxD,MAAO,EACX,CAOU,aACV,CACI,KAAK,aACL,MAAMV,EAAU,KAAK,QAErB,QAAShM,EAAI,EAAGwM,EAAIR,EAAQ,OAAQhM,EAAIwM,EAAGxM,IAC3C,CACI,MAAM2M,EAAQX,EAAQhM,CAAC,EAEvB,QAAS2E,EAAI,EAAGA,EAAIgI,EAAM,KAAMhI,IAChC,CACI,MAAMX,EAAQ2I,EAAM,MAAQhI,EAE5B,KAAK,cAAcX,CAAK,EAAI,KAAK,cAAcA,CAAK,EAAI2I,EAAM,aAG1E,CAEU,aACV,CACI,MAAO,EAgBX,CAOU,eAAelB,EACzB,CACI,QAASzL,EAAI,EAAGA,EAAI,KAAK,UAAU,OAAQA,IAEvC,KAAK,UAAUA,CAAC,EAAE,QAClBwK,EAAe,KAAK,KAAK,UAAUxK,CAAC,CAAC,EAGzC,KAAK,UAAU,OAAS,EAExB,IAAI4M,EAAepC,EAAe,IAAI,GAAK,IAAI9J,GAE/CkM,EAAa,MAAMnB,EAAgB,IAAI,EAEvC,IAAIzH,EAAQ,EAEZ,KAAK,UAAU,KAAK4I,CAAY,EAEhC,QAAS5M,EAAI,EAAGA,EAAI,KAAK,QAAQ,OAAQA,IACzC,CACI,MAAM6M,EAAY,KAAK,QAAQ7M,CAAC,EAC1BwB,EAAQqL,EAAU,MAExB,GAAIA,EAAU,aAAe,EAGzB,SAGJ,IAAIC,EAAU,GACd,MAAMC,EAAMvL,EAAM,iBAAA,EAEdoL,EAAa,MAAMpL,EAAM,MAAM,IAE/BsL,EAAUF,EAAa,IAAIpL,EAAM,QAASuL,EACtCvL,EAAM,MAAOA,EAAM,WAAa,EAAGA,EAAM,cAAA,CAAe,GAE5DsL,EAAU,IAEVF,EAAepC,EAAe,IAAA,GAAS,IAAI9J,GAC3C,KAAK,UAAU,KAAKkM,CAAY,EAChCA,EAAa,MAAMnB,EAAgBjK,EAAM,MAAM,EAC/CoL,EAAa,MAAQ5I,EACrB8I,EAAUF,EAAa,IAAIpL,EAAM,QAASuL,EACtCvL,EAAM,MAAOA,EAAM,WAAa,EAAGA,EAAM,cAAc,CAAC,GAEhEoL,EAAa,MAAQC,EAAU,KAC/B7I,GAAS6I,EAAU,KAEnB,KAAM,CAAE,MAAAlJ,EAAO,MAAAqJ,CAAM,EAAIxL,EACnByL,EAAMC,EAAM,OACb,SAASvJ,CAAK,EACd,qBAELkJ,EAAAA,EAAU,KAAOK,EAAM,OAClB,SAASD,CAAG,EACZ,gBAAgBD,CAAK,EAC1BH,EAAU,QAAUC,EAE5B,CAEU,aAAa7D,EACvB,CACI,QAASjJ,EAAI,EAAGA,EAAIiJ,EAAM,OAAQjJ,IAClC,CACI,MAAM+H,EAAOkB,EAAMjJ,CAAC,EACdwL,EAAUlB,EAAcvC,EAAK,IAAI,EAEvCA,EAAK,UAELyD,EAAAA,EAAQ,KAAKzD,EAAM,KAAK,SAAS,EAE7BA,EAAK,QAEL,KAAK,gBAAgBA,EAAK,OAAQA,EAAK,MAAM,EAGzD,CAOU,iBACV,CACI,MAAMoF,EAAS,KAAK,QACdC,EAAiB1C,GACvB,IAAI2C,EAAY/L,EAAO,SAEvB,KAAK,QAAQ,QACb8L,EAAe,MAAM,EAErB,QAASpN,EAAI,EAAGA,EAAI,KAAK,aAAa,OAAQA,IAC9C,CACI,MAAMoL,EAAO,KAAK,aAAapL,CAAC,EAC1BiF,EAAQmG,EAAK,MACbkC,EAAOlC,EAAK,KACZ1H,EAAY0H,EAAK,UACjBmC,EAAanC,EAAK,QAAU9J,EAAO,SACzC,IAAIpB,EAAY,EA0BhB,GAxBIwD,GAAaA,EAAU,UAEvBxD,EAAYwD,EAAU,MAElB4J,IAASxH,EAAO,MAAQsF,EAAK,UAAU,QAEvClL,GAAa,KAAK,IAAI,EAAGwD,EAAU,SAAS,EAI5CxD,GAAa,KAAK,IAAIwD,EAAU,UAAW,EAAIA,EAAU,SAAS,GAItE2J,IAAcE,IAETH,EAAe,QAAQ,IAExBD,EAAO,gBAAgBC,EAAgBC,CAAS,EAChDD,EAAe,SAEnBC,EAAYE,GAGZD,IAASxH,EAAO,MAAQwH,IAASxH,EAAO,KAC5C,CACI,MAAM0H,EAAOvI,EAEbmI,EAAe,YAAYI,EAAK,EAAGA,EAAK,EAAGA,EAAK,EAAIA,EAAK,MAAOA,EAAK,EAAIA,EAAK,OAC1EtN,EAAWA,CAAS,UAEnBoN,IAASxH,EAAO,KACzB,CACI,MAAMC,EAASd,EAEfmI,EAAe,YAAYrH,EAAO,EAAGA,EAAO,EAAGA,EAAO,EAAGA,EAAO,EAC5DA,EAAO,OAAS7F,EAAW6F,EAAO,OAAS7F,CAAS,UAEnDoN,IAASxH,EAAO,KACzB,CACI,MAAME,EAAUf,EAEhBmI,EAAe,YAAYpH,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,EAChEA,EAAQ,MAAQ9F,EAAW8F,EAAQ,OAAS9F,CAAS,MAG7D,CACI,MAAMuN,EAAOxI,EAGbkI,EAAO,kBAAkBE,EAAYI,EAAK,OAAgB,EAAGA,EAAK,OAAO,OAAQvN,EAAWA,CAAS,GAIxGkN,EAAe,QAEhBD,GAAAA,EAAO,gBAAgBC,EAAgBC,CAAS,EAGpDF,EAAO,IAAI,KAAK,cAAe,KAAK,aAAa,CACrD,CASU,gBAAgB5H,EAAuB1F,EACjD,CACI,QAASG,EAAI,EAAGA,EAAIuF,EAAO,OAAS,EAAGvF,IACvC,CACI,MAAMwF,EAAID,EAAQvF,EAAI,CAAE,EAClByF,EAAIF,EAAQvF,EAAI,EAAK,CAAC,EAE5BuF,EAAQvF,EAAI,CAAE,EAAKH,EAAO,EAAI2F,EAAM3F,EAAO,EAAI4F,EAAK5F,EAAO,GAC3D0F,EAAQvF,EAAI,EAAK,CAAC,EAAKH,EAAO,EAAI2F,EAAM3F,EAAO,EAAI4F,EAAK5F,EAAO,GAEvE,CACJ,CA72Ba+K,GAEK,eAAiB,ICxCnC,MAAM8C,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmWbC,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQZC,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBbC,GAAgB,CAAC;AAAA;AAAA;AAAA;AAAA,EAIpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAWF,EAEKC,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QA4CTC,UAA6BC,EAC1C,CAGI,YAAY3N,EACR4N,EAAOP,GACPQ,EAAON,GACPO,EAAW,GACf,CACIF,EAAOF,EAAqB,kBAAkB1N,EAAU4N,CAAI,EAC5DC,EAAOH,EAAqB,oBAAoB1N,EAAU6N,CAAI,EAE9D,KAAM,CAAE,UAAAE,EAAW,YAAAC,CAAY,EAAIhO,EAC7BiO,EAAe,IAAI,WAAWD,CAAW,EAE/C,QAASrO,EAAI,EAAGA,EAAIqO,EAAarO,IAE7BsO,EAAatO,CAAC,EAAIA,EAEtB,MAAMuO,GAAQ,KAAKN,EAAMC,CAAI,EAAI,OAAe,OAAOC,EAAU,CAC7D,YAAa,IAAI,aAAa,EAAIC,CAAS,EAC3C,eAAgB,IAAI,aAAaA,CAAS,EAC1C,UAAW,IAAI,aAAa,EAAIA,CAAS,EACzC,YAAa,IAAI,aAAa,EAAIC,CAAW,EAC7C,UAAWC,EACX,KAAM,IAAI,aAAa,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,EACnC,WAAY,EACZ,OAAQ,CACZ,CAAC,CAAC,EACF,KAAK,SAAWjO,CACpB,CAEA,OAAO,kBAAkBA,EAAkCmO,EAAYd,GACvE,CACI,KAAM,CAAE,UAAAU,EAAW,YAAAC,CAAY,EAAIhO,EAEnC,OAAAmO,EAAYA,EAAU,QAAQ,mBAAoB,GAAGH,GAAa,EAC7D,QAAQ,iBAAkB,GAAGD,GAAW,EAEtCI,CACX,CAEA,OAAO,oBAAoBnO,EAAkCoO,EAAcb,GAC3E,CACI,KAAM,CAAE,YAAAS,EAAa,UAAAK,CAAU,EAAIrO,EAEnC,OAAAoO,EAAcA,EAAY,QAAQ,gBAAiBd,EAAS,EACvD,QAAQ,iBAAkBE,GAAca,CAAS,CAAC,EAClD,QAAQ,qBAAsBZ,EAAa,EAC3C,QAAQ,mBAAoB,GAAGO,GAAa,EAC5C,QAAQ,eAAgB,KAAK,kBAAkBA,CAAW,CAAC,EAEzDI,CACX,CAEA,OAAO,kBAAkBJ,EACzB,CACI,IAAIM,EAAM,GAEVA,GAAO;AAAA,EACPA,GAAO;AAAA,EAEP,QAAS3O,EAAI,EAAGA,EAAIqO,EAAarO,IAEzBA,EAAI,IAEJ2O,GAAO;AAAA,QAGP3O,EAAIqO,EAAc,IAElBM,GAAO,kBAAkB3O,QAG7B2O,GAAO;AAAA,GACPA,GAAO;AAAA,kCAAsC3O,sBAC7C2O,GAAO;AAAA,GAGX,OAAAA,GAAO;AAAA,EACPA,GAAO;AAAA,EAEAA,CACX,CACJ,CC7gBO,MAAMtO,EAAsB,CAC/B,gBAAiB4B,EAAgB,OACjC,kBAAmB,GACnB,oBAAqB,EACrB,WAAY,CAChB,ECkBM2M,GAAmBC,GACnB,CAAE,YAAAC,GAAa,eAAAC,GAAgB,SAAAC,EAAS,EAAIC,GAG5CC,GAA6C,CAAA,EAyBtCC,GAAN,cAA6BC,EACpC,CA8BI,YAAYC,EAAmC,KAC/C,CACI,MAAM,EAEN,KAAK,UAAYA,GAAY,IAAIzE,GACjC,KAAK,UAAU,WAEf,KAAK,OAAS,KAEd,KAAK,eAAiB,CAClB,UAAWvK,EAAS,kBACpB,YAAaA,EAAS,oBACtB,UAAWA,EAAS,UACxB,EAEA,KAAK,MAAQiP,GAAM,MAAA,EAEnB,KAAK,WAAa,IAAIzN,EAEtB,KAAK,WAAa,IAAIK,GAEtB,KAAK,QAAU,KAEf,KAAK,UAAY,GAEjB,KAAK,YAAc,KAEnB,KAAK,QAAU,CAAA,EAEf,KAAK,UAAY,GAEjB,KAAK,WAAa,GAElB,KAAK,WAAa,KAElB,KAAK,WAAa,SAElB,KAAK,aAAe,GAGpB,KAAK,WAAa,IAAIgL,EAAM,QAAQ,EACpC,KAAK,UAAYtM,GAAY,MACjC,CA/CA,IAAW,UACX,CACI,OAAO,KAAK,SAChB,CA8CO,OACP,CACI,OAAK,KAAA,WAAA,EAEE,IAAIuO,GAAe,KAAK,SAAS,CAC5C,CAEA,IAAW,UAAUI,EACrB,CACI,KAAK,MAAM,UAAYA,CAC3B,CAEA,IAAW,WACX,CACI,OAAO,KAAK,MAAM,SACtB,CAEA,IAAW,MACX,CACI,OAAO,KAAK,WAAW,KAC3B,CAEA,IAAW,KAAKA,EAChB,CACI,KAAK,WAAW,SAASA,CAAK,CAClC,CAEA,IAAW,MACX,CACI,OAAO,KAAK,UAChB,CAEA,IAAW,MACX,CACI,OAAO,KAAK,UAChB,CAMO,UAAUC,EAAsC,KACnD7L,EAAqB,EAAKqJ,EAAQ,EAAGyC,EAAY,GAAKC,EAAYrP,EAAS,gBAC/E,CAEI,GAAI,OAAOmP,GAAY,SAEf,OAAOE,GAAc,YAErBA,EAAYA,EAAYzN,EAAgB,KAAOA,EAAgB,QAEnEuN,EAAU,CAAE,MAAOA,EAAS,MAAA7L,EAAO,MAAAqJ,EAAO,UAAAyC,EAAW,UAAAC,CAAU,MAGnE,CACI,MAAMC,EAAmBH,EAAgB,OAErCG,IAAW,SAEXH,EAAQ,UAAYG,EAAS1N,EAAgB,KAAOA,EAAgB,QAI5E,OAAO,KAAK,iBAAiBuN,CAAO,CACxC,CAEO,iBAAiBA,EACxB,CAEIA,EAAU,OAAO,OAAO,CACpB,MAAO,EACP,QAASzN,EAAQ,MACjB,MAAQyN,GAAWA,EAAQ,QAAW,SAAW,EACjD,MAAO,EACP,OAAQ,KACR,UAAW,GACX,OAAQ,GACR,IAAKrN,EAAS,KACd,KAAMC,EAAU,MAChB,WAAY,GACZ,OAAQ,KACR,UAAW/B,EAAS,eACxB,EAAGmP,CAAO,EAEV,KAAK,eAAeA,CAAO,EAEvB,KAAK,aAEL,KAAK,UAAU,EAGnB,MAAMI,EAAUJ,EAAQ,MAAQ,GAAKA,EAAQ,MAAQ,EAErD,OAAKI,GAMGJ,EAAQ,SAERA,EAAQ,OAASA,EAAQ,OAAO,MAAM,EACtCA,EAAQ,OAAO,OAAO,GAG1B,OAAO,OAAO,KAAK,WAAY,CAAE,QAAAI,CAAQ,EAAGJ,CAAO,GAVnD,KAAK,WAAW,MAAA,EAab,IACX,CAEU,WACV,CACI,GAAI,KAAK,YACT,CACI,MAAMjK,EAAS,KAAK,YAAY,OAC1B0B,EAAM,KAAK,YAAY,OAAO,OAEhCA,EAAM,IAEN,KAAK,UAAU,KAAK,WAAW,EAC/B,KAAK,YAAc,IAAI4I,GACvB,KAAK,YAAY,YAAc,GAC/B,KAAK,YAAY,OAAO,KAAKtK,EAAO0B,EAAM,CAAC,EAAG1B,EAAO0B,EAAM,CAAC,CAAC,QAKjE,KAAK,YAAc,IAAI4I,GACvB,KAAK,YAAY,YAAc,EAEvC,CAEA,YACA,CACQ,KAAK,cAED,KAAK,YAAY,OAAO,OAAS,GAEjC,KAAK,UAAU,KAAK,WAAW,EAC/B,KAAK,YAAc,MAInB,KAAK,YAAY,OAAO,OAAS,EAG7C,CAEO,OAAOrK,EAAWC,EACzB,CACI,OAAA,KAAK,YACL,KAAK,YAAY,OAAO,CAAC,EAAID,EAC7B,KAAK,YAAY,OAAO,CAAC,EAAIC,EAEtB,IACX,CAEO,OAAOD,EAAWC,EACzB,CACS,KAAK,aAEN,KAAK,OAAO,EAAG,CAAC,EAIpB,MAAMF,EAAS,KAAK,YAAY,OAC1BuK,EAAQvK,EAAOA,EAAO,OAAS,CAAC,EAChCwK,EAAQxK,EAAOA,EAAO,OAAS,CAAC,EAEtC,OAAIuK,IAAUtK,GAAKuK,IAAUtK,IAEzBF,EAAO,KAAKC,EAAGC,CAAC,EAGb,IACX,CAEU,WAAWD,EAAI,EAAGC,EAAI,EAChC,CACQ,KAAK,YAED,KAAK,YAAY,OAAO,SAAW,IAEnC,KAAK,YAAY,OAAS,CAACD,EAAGC,CAAC,GAKnC,KAAK,OAAOD,EAAGC,CAAC,CAExB,CAEO,iBAAiBuK,EAAaC,EAAaC,EAAaC,EAC/D,CACI,KAAK,WAAW,EAEhB,MAAM5K,EAAS,KAAK,YAAY,OAEhC,OAAIA,EAAO,SAAW,GAElB,KAAK,OAAO,EAAG,CAAC,EAGpBwJ,GAAe,QAAQiB,EAAKC,EAAKC,EAAKC,EAAK5K,CAAM,EAE1C,IACX,CAEO,cAAcyK,EAAaC,EAAaG,EAAcC,EAAcH,EAAaC,EACxF,CACI,OAAA,KAAK,WAAW,EAEhBrB,GAAY,QAAQkB,EAAKC,EAAKG,EAAMC,EAAMH,EAAKC,EAAK,KAAK,YAAY,MAAM,EAEpE,IACX,CAEO,MAAMlM,EAAYC,EAAYC,EAAYC,EAAYkM,EAC7D,CACI,KAAK,WAAWrM,EAAIC,CAAE,EAEtB,MAAMqB,EAAS,KAAK,YAAY,OAE1BgL,EAASvB,GAAS,QAAQ/K,EAAIC,EAAIC,EAAIC,EAAIkM,EAAQ/K,CAAM,EAE9D,GAAIgL,EACJ,CACI,KAAM,CAAE,GAAA1J,EAAI,GAAAC,EAAI,OAAAwJ,EAAQ,WAAAE,EAAY,SAAAC,EAAU,cAAAC,CAAc,EAAIH,EAEhE,KAAK,IAAI1J,EAAIC,EAAIwJ,EAAQE,EAAYC,EAAUC,CAAa,EAGhE,OAAO,IACX,CAEO,IAAI7J,EAAYC,EAAYwJ,EAAgBE,EAAoBC,EAAkBC,EAAgB,GACzG,CACI,GAAIF,IAAeC,EAEf,OAAO,KAcX,GAXI,CAACC,GAAiBD,GAAYD,EAE9BC,GAAYE,GAEPD,GAAiBF,GAAcC,IAEpCD,GAAcG,IAGJF,EAAWD,IAEX,EAEV,OAAO,KAGX,MAAMI,EAAS/J,EAAM,KAAK,IAAI2J,CAAU,EAAIF,EACtCO,EAAS/J,EAAM,KAAK,IAAI0J,CAAU,EAAIF,EACtCxQ,EAAM,KAAK,UAAU,cAG3B,IAAIyF,EAAS,KAAK,YAAc,KAAK,YAAY,OAAS,KAE1D,GAAIA,EACJ,CAII,MAAMuL,EAAQ,KAAK,IAAIvL,EAAOA,EAAO,OAAS,CAAC,EAAIqL,CAAM,EACnDG,EAAQ,KAAK,IAAIxL,EAAOA,EAAO,OAAS,CAAC,EAAIsL,CAAM,EAErDC,EAAQhR,GAAOiR,EAAQjR,GAOvByF,EAAO,KAAKqL,EAAQC,CAAM,OAK9B,KAAK,OAAOD,EAAQC,CAAM,EAC1BtL,EAAS,KAAK,YAAY,OAG9B,OAAAyJ,GAAS,IAAI4B,EAAQC,EAAQhK,EAAIC,EAAIwJ,EAAQE,EAAYC,EAAUC,EAAenL,CAAM,EAEjF,IACX,CAEO,UAAU5B,EAAqB,EAAGqJ,EAAQ,EAAGgE,EAAS,GAC7D,CACI,OAAO,KAAK,iBAAiB,CAAE,QAASjP,EAAQ,MAAO,MAAA4B,EAAO,MAAAqJ,EAAO,OAAAgE,CAAO,CAAC,CACjF,CAEQ,eAAexB,EACvB,CAtbJ,IAAAyB,EAAAC,EAubQ,MAAMC,EAAOjE,EAAM,OAAO,UAAS+D,EAAAzB,EAAQ,QAAR,KAAAyB,EAAiB,CAAC,EAErDzB,EAAQ,MAAQ2B,EAAK,SAAA,GACrBD,EAAA1B,EAAQ,QAAR,OAAAA,EAAQ,MAAU2B,EAAK,MAC3B,CAEA,iBAAiB3B,EACjB,CAEIA,EAAU,OAAO,OAAO,CACpB,QAASzN,EAAQ,MACjB,MAAO,SACP,MAAO,EACP,OAAQ,KACR,OAAQ,EACZ,EAAGyN,CAAO,EAEV,KAAK,eAAeA,CAAO,EAEvB,KAAK,aAEL,KAAK,UAAU,EAGnB,MAAMI,EAAUJ,EAAQ,MAAQ,EAEhC,OAAKI,GAMGJ,EAAQ,SAERA,EAAQ,OAASA,EAAQ,OAAO,MAChCA,EAAAA,EAAQ,OAAO,UAGnB,OAAO,OAAO,KAAK,WAAY,CAAE,QAAAI,CAAQ,EAAGJ,CAAO,GAVnD,KAAK,WAAW,QAab,IACX,CAEO,SACP,CACI,OAAK,KAAA,WAEL,EAAA,KAAK,WAAW,MAET,EAAA,IACX,CAEO,SAAShK,EAAWC,EAAW0E,EAAeC,EACrD,CACI,OAAO,KAAK,UAAU,IAAIgH,GAAU5L,EAAGC,EAAG0E,EAAOC,CAAM,CAAC,CAC5D,CAEO,gBAAgB5E,EAAWC,EAAW0E,EAAeC,EAAgBkG,EAC5E,CACI,OAAO,KAAK,UAAU,IAAIe,GAAiB7L,EAAGC,EAAG0E,EAAOC,EAAQkG,CAAM,CAAC,CAC3E,CAEO,WAAW9K,EAAWC,EAAW6K,EACxC,CACI,OAAO,KAAK,UAAU,IAAIgB,GAAO9L,EAAGC,EAAG6K,CAAM,CAAC,CAClD,CAEO,YAAY9K,EAAWC,EAAW0E,EAAeC,EACxD,CACI,OAAO,KAAK,UAAU,IAAImH,GAAQ/L,EAAGC,EAAG0E,EAAOC,CAAM,CAAC,CAC1D,CAKO,eAAeoH,EACtB,CACI,IAAIjM,EACAwD,EAAc,GAElB,MAAM0E,EAAO+D,EAAK,CAAC,EAGf/D,EAAK,QAEL1E,EAAc0E,EAAK,YACnBlI,EAASkI,EAAK,QAET,MAAM,QAAQ+D,EAAK,CAAC,CAAC,EAE1BjM,EAASiM,EAAK,CAAC,EAIfjM,EAASiM,EAGb,MAAMvM,EAAQ,IAAI4K,GAAQtK,CAAM,EAEhC,OAAAN,EAAM,YAAc8D,EAEpB,KAAK,UAAU9D,CAAK,EAEb,IACX,CAEO,UAAUA,EACjB,CACI,OAAK,KAAK,UAWN,KAAK,UAAU,SAASA,EAAO,KAAK,OAAO,EAT3C,KAAK,UAAU,UACXA,EACA,KAAK,WAAW,MAAA,EAChB,KAAK,WAAW,MAAA,EAChB,KAAK,OACT,EAOG,IACX,CAEO,OACP,CACI,OAAK,KAAA,UAAU,MAAM,EACrB,KAAK,WAAW,MAAM,EACtB,KAAK,WAAW,QAEhB,KAAK,YACL,KAAK,QAAU,KACf,KAAK,UAAY,GACjB,KAAK,YAAc,KAEZ,IACX,CAEO,YACP,CACI,MAAMmG,EAAO,KAAK,UAAU,aAE5B,OAAOA,EAAK,SAAW,GAChBA,EAAK,CAAC,EAAE,MAAM,OAAStF,EAAO,MAC9B,CAACsF,EAAK,CAAC,EAAE,QACT,CAACA,EAAK,CAAC,EAAE,MAAM,QACf,EAAEA,EAAK,CAAC,EAAE,UAAU,SAAWA,EAAK,CAAC,EAAE,UAAU,MAC5D,CAEU,cAAcqG,EACxB,CACK7C,GAAiB,UAAkB,cAAc,KAAK,KAAM6C,CAAQ,CACzE,CAEU,QAAQA,EAClB,CACI,KAAK,WAEL,EAAA,MAAMpC,EAAW,KAAK,UAChBqC,EAAYD,EAAS,QAAQ,SAAS,cAI5CpC,EAAS,gBAAgBoC,EAAS,SAAS,YAAaC,CAAS,EAEjErC,EAAS,cAAc,KAAK,cAAc,EAEtCA,EAAS,WAEL,KAAK,aAAeA,EAAS,YAE7B,KAAK,iBAAA,EAGT,KAAK,eAAeoC,CAAQ,IAK5BA,EAAS,MAAM,MAAA,EAEf,KAAK,cAAcA,CAAQ,EAEnC,CAEU,kBACV,CACI,MAAMpC,EAAW,KAAK,UAChBsC,EAAY,KAAK,UACjB1K,EAAMoI,EAAS,QAAQ,OAE7B,KAAK,UAAY,GACjB,KAAK,aAAe,GACpB,KAAK,WAAaA,EAAS,WAC3B,KAAK,QAAQ,OAASpI,EAEtB,KAAK,WAAa,IAAI,aAAaoI,EAAS,MAAM,EAElD,QAASrP,EAAI,EAAGA,EAAIiH,EAAKjH,IACzB,CACI,MAAM4R,EAAKvC,EAAS,QAAQrP,CAAC,EACvB2D,EAAQiO,EAAG,MAAM,MAajBjF,EAAQ,CACV,WAbe,IAAI,aAAa,KAAK,WAAW,OAChDiF,EAAG,YAAc,EAAI,EACrBA,EAAG,WAAa,CAAC,EAYjB,UAAAD,EAGA,UAAWrI,GAAM,QAAQ3F,CAAK,EAC9B,SAAUA,EACV,SAAUiO,EAAG,MAAM,QACnB,MAAOA,EAAG,MAAM,MAChB,WAAY,CAChB,EAEA,KAAK,QAAQ5R,CAAC,EAAI2M,EAE1B,CAEU,eAAe8E,EACzB,CACI,GAAK,KAAK,QAAQ,OAKlB,CAAAA,EAAS,MAAM,kBAAkBA,EAAS,QAAQ,KAAK,UAAU,CAAC,EAElE,KAAK,kBAAkB,EACvB,KAAK,eAAA,EAEL,QAASzR,EAAI,EAAGwM,EAAI,KAAK,QAAQ,OAAQxM,EAAIwM,EAAGxM,IAChD,CACI,MAAM2M,EAAQ,KAAK,QAAQ3M,CAAC,EAE5B2M,EAAM,WAAa,KAAK,WAAaA,EAAM,MAE3C8E,EAAS,QAAQ,KAAK,UAAU,EAAE,OAAO9E,CAAK,GAEtD,CAEU,cAAc8E,EACxB,CACI,MAAMI,EAAe,KAAK,qBAAqBJ,CAAQ,EACvD,IAAI5Q,EAAiBgR,EAErB,MAAMxC,EAAW,KAAK,UAChByC,EAAa,KAAK,WAClB3D,EAAWtN,EAAO,SAClBkR,EAAY1C,EAAS,UAG3BlB,EAAS,kBAAoB,KAAK,UAAU,eAG5CjB,EAAM,OAAO,SAAS,KAAK,UAAU,EAChC,YAAY4E,CAAU,EACtB,QAAQ3D,EAAS,IAAI,EAE1BA,EAAS,WAAasD,EAAS,cAAc,QACvCA,EAAS,cAAc,QAAQ,WAAaA,EAAS,WAE3D,MAAMO,EAAYP,EAAS,WAAW,UAEtC,GAAIO,EACJ,CAEI,MAAMC,EAAQ,KAAK,KAAMD,EAAU,EAAIA,EAAU,EAAMA,EAAU,EAAIA,EAAU,CAAE,EAEjF7D,EAAS,YAAc8D,EAG3B,MAAMC,EAAcT,EAAS,cAAc,QACrCA,EAAS,cAAc,QAAQ,YAAcA,EAAS,YAE5DtD,EAAS,QAAU+D,IAAgBC,GAAa,KAAO,EAAI,GAAKhE,EAAS,WAOzEsD,EAAS,OAAO,KAAK5Q,CAAM,EAC3B4Q,EAAS,SAAS,KAAKpC,EAAUxO,CAAM,EAGvC4Q,EAAS,MAAM,IAAI,KAAK,KAAK,EAE7B5Q,EAAS,KAET,QAASb,EAAI,EAAGwM,EAAIuF,EAAU,OAAQ/R,EAAIwM,EAAGxM,IAC7C,CAEI,MAAMoS,EAAW/C,EAAS,UAAUrP,CAAC,EAE/BqS,EAAexR,IAAWuR,EAAS,OAErCC,IAEAxR,EAASuR,EAAS,OACdvR,IAEAA,EAAO,SAAS,kBAAoB,KAAK,UAAU,eAC/CA,EAAO,SAAS,OAEhBA,EAAO,SAAS,KAAK,CAAC,EAAIsN,EAAS,KAAK,CAAC,EACzCtN,EAAO,SAAS,KAAK,CAAC,EAAIsN,EAAS,KAAK,CAAC,EACzCtN,EAAO,SAAS,KAAK,CAAC,EAAIsN,EAAS,KAAK,CAAC,EACzCtN,EAAO,SAAS,KAAK,CAAC,EAAIsN,EAAS,KAAK,CAAC,KAKrD,KAAM,CAAE,SAAAnN,EAAU,WAAAE,EAAY,KAAAoR,EAAM,MAAAlJ,CAAM,EAAIgJ,EACxCG,EAAoBvR,EAAS,MAC7BwR,EAAa3R,GAAUgR,EAEvBY,EAAOD,EAAW,SAAS,eAC3BE,EAAOF,EAAW,SAAS,YAC3BhS,EAAQgS,EAAW,SAAS,UAElC,QAASxS,EAAI,EAAGA,EAAIkB,EAAW,MAAOlB,IACtC,CACIyS,EAAKzS,CAAC,EAAIkB,EAAW,WAAWlB,CAAC,EACjCQ,EAAMR,EAAI,CAAC,EAAIkB,EAAW,MAAMlB,EAAI,CAAC,EACrCQ,EAAOR,EAAI,EAAK,CAAC,EAAIkB,EAAW,MAAOlB,EAAI,EAAK,CAAC,EACjD,MAAMqG,EAAInF,EAAW,SAASlB,CAAC,EAE/B0S,EAAK1S,EAAI,CAAC,EAAIqG,EAAE,EAChBqM,EAAM1S,EAAI,EAAK,CAAC,EAAIqG,EAAE,EACtBqM,EAAM1S,EAAI,EAAK,CAAC,EAAIqG,EAAE,GACtBqM,EAAM1S,EAAI,EAAK,CAAC,EAAIqG,EAAE,EACtBqM,EAAM1S,EAAI,EAAK,CAAC,EAAIqG,EAAE,EACtBqM,EAAM1S,EAAI,EAAK,CAAC,EAAIqG,EAAE,GAE1B,MAAMsM,EAAQH,EAAW,SAAS,YAElC,QAASxS,EAAI,EAAGA,EAAIuS,EAAmBvS,IAEnC2S,EAAM3S,EAAI,CAAC,EAAIgB,EAAS,SAAShB,CAAC,EAAE,MACpC2S,EAAO3S,EAAI,EAAK,CAAC,EAAIgB,EAAS,SAAShB,CAAC,EAAE,OAG9CyR,EAAS,OAAO,KAAKe,CAAU,EAC3BH,GAEAZ,EAAS,SAAS,KAAKpC,CAAQ,EAInC,QAAS1K,EAAI,EAAGA,EAAI4N,EAAmB5N,IAEnC8M,EAAS,QAAQ,KAAKzQ,EAAS,SAAS2D,CAAC,EAAGA,CAAC,EAIjD8M,EAAS,SAAS,KAAKmB,GAAW,UAAWN,EAAMlJ,CAAK,EAEhE,CAEU,qBAAqByJ,EAC/B,CACI,IAAIhS,EAAS,KAAK,OAElB,MAAMiS,EAAa,KAAK,WAExB,OAAKjS,IAEIqO,GAAgB4D,CAAU,IAE3B5D,GAAgB4D,CAAU,EAAI,IAAI/E,EAAqB,KAAK,cAAc,GAE9ElN,EAASqO,GAAgB4D,CAAU,GAGhCjS,CACX,CAEU,kBACV,CACI,KAAK,WAEL,EAAA,MAAMwO,EAAW,KAAK,UAGtB,GAAI,CAACA,EAAS,aAAa,OAEvB,OAGJ,KAAM,CAAE,KAAA0D,EAAM,KAAAC,EAAM,KAAAC,EAAM,KAAAC,CAAK,EAAI7D,EAAS,OAE5C,KAAK,QAAQ,SAAS,KAAK,UAAW0D,EAAMC,EAAMC,EAAMC,CAAI,CAChE,CAEO,cAAc5H,EACrB,CACI,OAAA,KAAK,eAAe,aAAaA,EAAO6D,GAAe,WAAW,EAE3D,KAAK,UAAU,cAAcA,GAAe,WAAW,CAClE,CAEU,gBACV,CACI,GAAI,KAAK,YAAc,KAAK,KAC5B,CACI,KAAK,UAAY,KAAK,WAAW,SAEjC,EAAA,QAASnP,EAAI,EAAGA,EAAI,KAAK,QAAQ,OAAQA,IACzC,CACI,MAAM2M,EAAQ,KAAK,QAAQ3M,CAAC,EAE5B2M,EAAM,SAAWO,EAAM,OAClB,SAAS,KAAK,UAAU,EACxB,SAASP,EAAM,SAAS,EACxB,qBAAqB,GAGtC,CAEU,mBACV,CACI,MAAMwG,EAAO,KAAK,UAAU,SAE5B,GAAI,KAAK,eAAiBA,EAEtB,OAGJ,KAAK,aAAeA,EAEpB,MAAMC,EAAK,KAAK,UAAU,eACpBxM,EAAIwM,EAAG,EACPC,EAAID,EAAG,EACPE,EAAIF,EAAG,EACPG,EAAIH,EAAG,EACPI,EAAKJ,EAAG,GACRK,EAAKL,EAAG,GAERhI,EAAO,KAAK,UAAU,OACtBsI,EAAa,KAAK,WAExB,IAAIjT,EAAQ,EAEZ,QAAST,EAAI,EAAGA,EAAIoL,EAAK,OAAQpL,GAAK,EACtC,CACI,MAAMwF,EAAI4F,EAAKpL,CAAC,EACVyF,EAAI2F,EAAKpL,EAAI,CAAC,EAEpB0T,EAAWjT,GAAO,EAAKmG,EAAIpB,EAAM8N,EAAI7N,EAAK+N,EAC1CE,EAAWjT,GAAO,EAAK8S,EAAI9N,EAAM4N,EAAI7N,EAAKiO,EAElD,CAEO,WACP,CACI,MAAME,EAAc,KAAK,YAEzB,OAAIA,IAGAA,EAAY,YAAc,IAGvB,IACX,CAEO,UAAU9T,EACjB,CACI,OAAA,KAAK,QAAUA,EAER,IACX,CAEO,WACP,CACI,OAAK,KAAA,aACL,KAAK,UAAY,GAEV,IACX,CAEO,SACP,CACI,OAAK,KAAA,WAAA,EACL,KAAK,UAAY,GAEV,IACX,CAEO,QAAQ2P,EACf,CACI,KAAK,UAAU,WACX,KAAK,UAAU,WAAa,GAE5B,KAAK,UAAU,QAAQ,EAG3B,KAAK,QAAU,KACf,KAAK,YAAc,KACnB,KAAK,WAAW,QAAQ,EACxB,KAAK,WAAa,KAClB,KAAK,WAAW,QAChB,EAAA,KAAK,WAAa,KAClB,KAAK,UAAY,KACjB,KAAK,OAAS,KACd,KAAK,WAAa,KAClB,KAAK,QAAQ,OAAS,EACtB,KAAK,QAAU,KAEf,MAAM,QAAQA,CAAO,CACzB,CACJ,EAt4Ba,IAAAoE,GAANzE,GAAMyE,GAEc,OAASC,GAFvBD,GAIF,YAAc,IAAIpL,EChE7B,MAAMsL,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqDJ,MAAAC,WAAuBhG,CACpC,CACI,YAAYiG,EACZ,CACI,MAAM3T,EAAW,CAAE,UAAW,GAAI,YAAa,EAAG,UAAW,CAAE,EAE/D,MAAMA,EAAU,OAAWyT,GACvBE,GAAc,CACV,KAAM,EACN,IAAK,CACT,CAAC,CACT,CACJ"} |