cubing 0.63.7 → 0.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/chunks/{chunk-6YZ4AUWL.js → chunk-DQNBCFR3.js} +2 -2
- package/dist/bin/chunks/{chunk-6YZ4AUWL.js.map → chunk-DQNBCFR3.js.map} +1 -1
- package/dist/bin/order.js +1 -1
- package/dist/bin/order.js.map +1 -1
- package/dist/bin/puzzle-geometry-bin.js +1 -1
- package/dist/bin/puzzle-geometry-bin.js.map +1 -1
- package/dist/bin/scramble.js +1 -1
- package/dist/bin/scramble.js.map +1 -1
- package/dist/bin/svg.js +1 -1
- package/dist/bin/svg.js.map +1 -1
- package/dist/lib/cubing/alg/index.d.ts +1 -1
- package/dist/lib/cubing/alg/index.js +1 -1
- package/dist/lib/cubing/bluetooth/index.d.ts +17 -17
- package/dist/lib/cubing/bluetooth/index.js +96 -96
- package/dist/lib/cubing/bluetooth/index.js.map +2 -2
- package/dist/lib/cubing/chunks/{big-puzzle-orientation-ADWIOX6S.js → big-puzzle-orientation-G75BXW2W.js} +2 -2
- package/dist/lib/cubing/chunks/big-puzzle-orientation-G75BXW2W.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-A7FK4XKU.js → chunk-5LBACZOM.js} +173 -144
- package/dist/lib/cubing/chunks/chunk-5LBACZOM.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-5KMTA6PX.js → chunk-7MYDNYZ3.js} +3 -3
- package/dist/lib/cubing/chunks/chunk-7MYDNYZ3.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-7LXHWXCO.js → chunk-ALR6ZQFC.js} +2 -2
- package/dist/lib/cubing/chunks/chunk-ALR6ZQFC.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-H5KMIDAF.js → chunk-DTYBGCI3.js} +5 -5
- package/dist/lib/cubing/chunks/chunk-DTYBGCI3.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-YR72E7KZ.js → chunk-GO2SL6SC.js} +38 -38
- package/dist/lib/cubing/chunks/chunk-GO2SL6SC.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-FUAADKXE.js → chunk-KHUP3BPA.js} +35 -34
- package/dist/lib/cubing/chunks/chunk-KHUP3BPA.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-MQSQDKWH.js → chunk-O2QJENHE.js} +3 -3
- package/dist/lib/cubing/chunks/chunk-O2QJENHE.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-5ONX3JVC.js → chunk-THRYJMRP.js} +8 -8
- package/dist/lib/cubing/chunks/chunk-THRYJMRP.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-UEUJSZTX.js → chunk-UWJ575HH.js} +58 -46
- package/dist/lib/cubing/chunks/chunk-UWJ575HH.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-N5FJ5YIA.js → chunk-YFNXHRNE.js} +37 -31
- package/dist/lib/cubing/chunks/chunk-YFNXHRNE.js.map +7 -0
- package/dist/lib/cubing/chunks/{inside-JAJOK2MI.js → inside-A7LIP56H.js} +14 -14
- package/dist/lib/cubing/chunks/inside-A7LIP56H.js.map +7 -0
- package/dist/lib/cubing/chunks/{puzzles-dynamic-side-events-IMYJ533P.js → puzzles-dynamic-side-events-653A7JCM.js} +1 -1
- package/dist/lib/cubing/chunks/puzzles-dynamic-side-events-653A7JCM.js.map +7 -0
- package/dist/lib/cubing/chunks/{puzzles-dynamic-unofficial-P3TW433I.js → puzzles-dynamic-unofficial-2CY6GVZ4.js} +1 -1
- package/dist/lib/cubing/chunks/{puzzles-dynamic-unofficial-P3TW433I.js.map → puzzles-dynamic-unofficial-2CY6GVZ4.js.map} +1 -1
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-WORUZVF5.js → search-dynamic-sgs-side-events-YSB3MWLK.js} +6 -6
- package/dist/lib/cubing/chunks/search-dynamic-sgs-side-events-YSB3MWLK.js.map +7 -0
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-5JQKPNG2.js → search-dynamic-sgs-unofficial-OLK64DE6.js} +6 -6
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-5JQKPNG2.js.map → search-dynamic-sgs-unofficial-OLK64DE6.js.map} +1 -1
- package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-BGV4AJVT.js → search-dynamic-solve-4x4x4-WWFUMIDG.js} +7 -7
- package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-I5ID5LXD.js → search-dynamic-solve-fto-ZZKLTONP.js} +2 -2
- package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-Y2D3C74Y.js → search-dynamic-solve-kilominx-PUF4PRHS.js} +2 -2
- package/dist/lib/cubing/chunks/search-worker-entry.js +1 -1
- package/dist/lib/cubing/chunks/search-worker-entry.js.map +2 -2
- package/dist/lib/cubing/chunks/{twips-ZNMKGC5U.js → twips-LHO3IYJC.js} +2 -2
- package/dist/lib/cubing/chunks/{twisty-dynamic-3d-4BEQ76PB.js → twisty-dynamic-3d-A2G22YLA.js} +6 -6
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-A2G22YLA.js.map +7 -0
- package/dist/lib/cubing/{index-B2leUGbW.d.ts → index-C2x6Sc62.d.ts} +52 -47
- package/dist/lib/cubing/{index-BLw2OxXo.d.ts → index-Doa1gNE4.d.ts} +1 -1
- package/dist/lib/cubing/kpuzzle/index.d.ts +1 -1
- package/dist/lib/cubing/kpuzzle/index.js +2 -2
- package/dist/lib/cubing/notation/index.d.ts +17 -15
- package/dist/lib/cubing/notation/index.js +4 -4
- package/dist/lib/cubing/{outside-V6_PW1ZK.d.ts → outside-nf-4k7Tp.d.ts} +1 -1
- package/dist/lib/cubing/protocol/index.d.ts +1 -1
- package/dist/lib/cubing/protocol/index.js +4 -4
- package/dist/lib/cubing/puzzle-geometry/index.d.ts +1 -1
- package/dist/lib/cubing/puzzle-geometry/index.js +284 -184
- package/dist/lib/cubing/puzzle-geometry/index.js.map +2 -2
- package/dist/lib/cubing/puzzles/index.d.ts +1 -1
- package/dist/lib/cubing/puzzles/index.js +4 -4
- package/dist/lib/cubing/scramble/index.d.ts +1 -1
- package/dist/lib/cubing/scramble/index.js +6 -6
- package/dist/lib/cubing/search/index.d.ts +1 -1
- package/dist/lib/cubing/search/index.js +6 -6
- package/dist/lib/cubing/search/index.js.map +1 -1
- package/dist/lib/cubing/stream/index.d.ts +1 -1
- package/dist/lib/cubing/stream/index.js +1 -1
- package/dist/lib/cubing/stream/index.js.map +1 -1
- package/dist/lib/cubing/twisty/index.d.ts +1 -1
- package/dist/lib/cubing/twisty/index.js +190 -180
- package/dist/lib/cubing/twisty/index.js.map +2 -2
- package/package.json +2 -2
- package/dist/lib/cubing/chunks/big-puzzle-orientation-ADWIOX6S.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-5KMTA6PX.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-5ONX3JVC.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-7LXHWXCO.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-A7FK4XKU.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-FUAADKXE.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-H5KMIDAF.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-MQSQDKWH.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-N5FJ5YIA.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-UEUJSZTX.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-YR72E7KZ.js.map +0 -7
- package/dist/lib/cubing/chunks/inside-JAJOK2MI.js.map +0 -7
- package/dist/lib/cubing/chunks/puzzles-dynamic-side-events-IMYJ533P.js.map +0 -7
- package/dist/lib/cubing/chunks/search-dynamic-sgs-side-events-WORUZVF5.js.map +0 -7
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-4BEQ76PB.js.map +0 -7
- /package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-BGV4AJVT.js.map → search-dynamic-solve-4x4x4-WWFUMIDG.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-I5ID5LXD.js.map → search-dynamic-solve-fto-ZZKLTONP.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-Y2D3C74Y.js.map → search-dynamic-solve-kilominx-PUF4PRHS.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{twips-ZNMKGC5U.js.map → twips-LHO3IYJC.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/cubing/twisty/views/3D/puzzles/Cube3D.ts", "../../../../src/cubing/twisty/controllers/easing.ts", "../../../../src/cubing/twisty/views/3D/puzzles/PG3D.ts", "../../../../src/cubing/twisty/heavy-code-imports/dynamic-entries/twisty-dynamic-3d.ts", "../../../../src/cubing/twisty/views/3D/Twisty3DScene.ts"],
|
|
4
|
+
"sourcesContent": ["import { BackSide, DoubleSide, FrontSide } from \"three/src/constants.js\";\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry.js\";\nimport { Object3D } from \"three/src/core/Object3D.js\";\nimport { BoxGeometry } from \"three/src/geometries/BoxGeometry.js\";\nimport { TextureLoader } from \"three/src/loaders/TextureLoader.js\";\nimport { MeshBasicMaterial } from \"three/src/materials/MeshBasicMaterial.js\";\nimport { Color } from \"three/src/math/Color.js\";\nimport { Euler } from \"three/src/math/Euler.js\";\nimport { Matrix4 } from \"three/src/math/Matrix4.js\";\nimport { Quaternion } from \"three/src/math/Quaternion.js\";\nimport { Vector2 } from \"three/src/math/Vector2.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\nimport { Group } from \"three/src/objects/Group.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport type { Texture } from \"three/src/textures/Texture.js\";\nimport type { KPuzzle } from \"../../../../kpuzzle/index.ts\";\nimport type { ExperimentalStickeringMask } from \"../../../../puzzles/cubing-private/index.ts\";\nimport type {\n FaceletMeshStickeringMask,\n StickeringMask,\n} from \"../../../../puzzles/stickerings/mask.ts\";\nimport type {\n MillisecondTimestamp,\n PuzzlePosition,\n} from \"../../../controllers/AnimationTypes.ts\";\nimport { smootherStep } from \"../../../controllers/easing.ts\";\nimport type { FaceletScale } from \"../../../model/props/puzzle/display/FaceletScaleProp.ts\";\nimport {\n type HintFaceletStyle,\n hintFaceletStyles,\n} from \"../../../model/props/puzzle/display/HintFaceletProp.ts\";\nimport type { InitialHintFaceletsAnimation } from \"../../../model/props/puzzle/display/InitialHintFaceletsAnimationProp.ts\";\nimport { TAU } from \"../TAU.ts\";\nimport { haveStartedSharingRenderers } from \"../Twisty3DVantage.ts\";\nimport type { Twisty3DPuzzle } from \"./Twisty3DPuzzle.ts\";\n\nconst svgLoader = new TextureLoader();\n\nconst ignoredMaterial = new MeshBasicMaterial({\n color: new Color(0x666666).convertLinearToSRGB(),\n});\n\nconst ignoredMaterialHint = new MeshBasicMaterial({\n color: new Color(0xcccccc).convertLinearToSRGB(),\n side: BackSide,\n transparent: true,\n opacity: 0.75,\n});\n\nconst invisibleMaterial = new MeshBasicMaterial({\n visible: false,\n});\n\nconst orientedMaterial = new MeshBasicMaterial({\n color: 0x44ddcc,\n});\n\nconst orientedMaterialHint = new MeshBasicMaterial({\n color: 0x44ddcc,\n side: BackSide,\n transparent: true,\n opacity: 0.5,\n});\n\nconst experimentalOriented2Material = new MeshBasicMaterial({\n color: 0xfffdaa,\n});\n\nconst experimentalOriented2MaterialHint = new MeshBasicMaterial({\n color: 0xfff979,\n side: BackSide,\n transparent: true,\n opacity: 0.5,\n});\n\nconst mysteryMaterial = new MeshBasicMaterial({\n color: 0xf2cbcb,\n});\n\nconst mysterMaterialHint = new MeshBasicMaterial({\n color: 0xf2cbcb,\n side: BackSide,\n transparent: true,\n opacity: 0.5,\n});\n\ninterface MaterialMap\n extends Record<FaceletMeshStickeringMask, MeshBasicMaterial> {\n regular: MeshBasicMaterial;\n dim: MeshBasicMaterial;\n ignored: MeshBasicMaterial;\n invisible: MeshBasicMaterial;\n}\n\nclass AxisInfo {\n public stickerMaterial: MaterialMap;\n public hintStickerMaterial: MaterialMap;\n constructor(\n public vector: Vector3,\n public fromZ: Euler,\n public color: number,\n public dimColor: number,\n public hintOpacityScale: number, // TODO: make this work better across bright *and* dark backgrounds. Maybe tweak sticker compositing settings?\n options?: { hintColor?: number; hintDimColor?: number },\n ) {\n const colorLinearSRGB = new Color(color).convertLinearToSRGB();\n const dimColorLinearSRGB = new Color(dimColor).convertLinearToSRGB();\n // TODO: Make sticker material single-sided when cubie foundation is opaque?\n this.stickerMaterial = {\n regular: new MeshBasicMaterial({\n color: colorLinearSRGB,\n side: FrontSide, // TODO: set to `DoubleSide` when hint facelets are disabled.\n }),\n dim: new MeshBasicMaterial({\n color: dimColorLinearSRGB,\n side: FrontSide, // TODO: set to `DoubleSide` when hint facelets are disabled.\n }),\n oriented: orientedMaterial,\n experimentalOriented2: experimentalOriented2Material,\n ignored: ignoredMaterial,\n invisible: invisibleMaterial,\n mystery: mysteryMaterial,\n };\n this.hintStickerMaterial = {\n regular: new MeshBasicMaterial({\n color: new Color(options?.hintColor ?? color).convertLinearToSRGB(),\n side: BackSide,\n transparent: true,\n opacity: 0.5 * hintOpacityScale,\n }),\n dim: new MeshBasicMaterial({\n color: new Color(\n options?.hintDimColor ?? dimColor,\n ).convertLinearToSRGB(),\n side: BackSide,\n transparent: true,\n opacity: 0.5 * hintOpacityScale,\n }),\n oriented: orientedMaterialHint,\n experimentalOriented2: experimentalOriented2MaterialHint,\n ignored: ignoredMaterialHint,\n invisible: invisibleMaterial,\n mystery: mysterMaterialHint,\n };\n }\n}\n\nconst axesInfo: AxisInfo[] = [\n new AxisInfo(\n new Vector3(0, 1, 0),\n new Euler(-TAU / 4, 0, 0),\n 0xffffff,\n 0xdddddd,\n 1.25,\n ),\n new AxisInfo(\n new Vector3(-1, 0, 0),\n new Euler(0, -TAU / 4, 0),\n 0xff9900,\n 0x885500,\n 1,\n { hintDimColor: 0x884400 },\n ),\n new AxisInfo(\n new Vector3(0, 0, 1),\n new Euler(0, 0, 0),\n 0x00ff00,\n 0x008800,\n 1,\n { hintDimColor: 0x009900 },\n ),\n new AxisInfo(\n new Vector3(1, 0, 0),\n new Euler(0, TAU / 4, 0),\n 0xff0000,\n 0x660000,\n 1,\n { hintDimColor: 0x660000 },\n ),\n new AxisInfo(\n new Vector3(0, 0, -1),\n new Euler(0, TAU / 2, 0),\n 0x2266ff,\n 0x113388,\n 0.75,\n { hintDimColor: 0x001866 },\n ),\n new AxisInfo(\n new Vector3(0, -1, 0),\n new Euler(TAU / 4, 0, 0),\n 0xffff00,\n 0x888800,\n 1.25,\n { hintDimColor: 0xdddd00 },\n ),\n];\n\nconst face: { [s: string]: number } = {\n U: 0,\n L: 1,\n F: 2,\n R: 3,\n B: 4,\n D: 5,\n};\n\nconst familyToAxis: { [s: string]: number } = {\n U: face[\"U\"],\n u: face[\"U\"],\n Uw: face[\"U\"],\n Uv: face[\"U\"],\n y: face[\"U\"],\n L: face[\"L\"],\n l: face[\"L\"],\n Lw: face[\"L\"],\n Lv: face[\"L\"],\n M: face[\"L\"],\n F: face[\"F\"],\n f: face[\"F\"],\n Fw: face[\"F\"],\n Fv: face[\"F\"],\n S: face[\"F\"],\n z: face[\"F\"],\n R: face[\"R\"],\n r: face[\"R\"],\n Rw: face[\"R\"],\n Rv: face[\"R\"],\n x: face[\"R\"],\n B: face[\"B\"],\n b: face[\"B\"],\n Bw: face[\"B\"],\n Bv: face[\"B\"],\n D: face[\"D\"],\n d: face[\"D\"],\n Dw: face[\"D\"],\n Dv: face[\"D\"],\n E: face[\"D\"],\n};\n\nconst cubieDimensions = {\n // stickerWidth: 0.85, // Now `faceletScale` in options.\n stickerElevation: 0.503,\n foundationWidth: 1,\n defaultHintStickerElevation: 1.45,\n};\nconst EXPERIMENTAL_PICTURE_CUBE_HINT_ELEVATION = 2;\n\nexport interface Cube3DOptions {\n showMainStickers?: boolean;\n hintFacelets?: HintFaceletStyle;\n showFoundation?: boolean; // TODO: better name\n experimentalStickeringMask?: ExperimentalStickeringMask;\n foundationSprite?: Texture | null;\n hintSprite?: Texture | null;\n initialHintFaceletsAnimation?: InitialHintFaceletsAnimation;\n faceletScale?: \"auto\" | number;\n hintFaceletsElevation?: \"auto\" | number;\n}\n\nconst cube3DOptionsDefaults: Cube3DOptions = {\n showMainStickers: true,\n hintFacelets: \"floating\",\n showFoundation: true,\n experimentalStickeringMask: undefined,\n foundationSprite: null,\n hintSprite: null,\n initialHintFaceletsAnimation: \"auto\",\n faceletScale: \"auto\",\n hintFaceletsElevation: \"auto\",\n};\n\nconst DEFAULT_STICKER_SCALE = 0.85;\nfunction getFaceletScale(options: Cube3DOptions): number {\n if (\n typeof options.faceletScale === \"undefined\" ||\n options.faceletScale === \"auto\"\n ) {\n return DEFAULT_STICKER_SCALE;\n }\n return options.faceletScale;\n}\n\n// TODO: Make internal foundation faces one-sided, facing to the outside of the cube.\nconst blackMesh = new MeshBasicMaterial({\n color: 0x000000,\n opacity: 1,\n transparent: true,\n});\n\nconst blackTranslucentMesh = new MeshBasicMaterial({\n color: 0x000000,\n opacity: 0.3,\n transparent: true,\n});\n\nclass CubieDef {\n public matrix: Matrix4;\n public stickerFaces: number[];\n // stickerFaceNames can be e.g. [\"U\", \"F\", \"R\"], \"UFR\" if every face is a single letter.\n constructor(\n public orbit: string,\n stickerFaceNames: string[] | string,\n q: Quaternion,\n ) {\n const individualStickerFaceNames =\n typeof stickerFaceNames === \"string\"\n ? stickerFaceNames.split(\"\")\n : stickerFaceNames;\n this.stickerFaces = individualStickerFaceNames.map((s) => face[s]);\n this.matrix = new Matrix4();\n this.matrix.setPosition(firstPiecePosition[orbit]);\n this.matrix.premultiply(new Matrix4().makeRotationFromQuaternion(q));\n }\n}\n\nfunction t(v: Vector3, t4: number): Quaternion {\n return new Quaternion().setFromAxisAngle(v, (TAU * t4) / 4);\n}\n\nconst r = {\n O: new Vector3(0, 0, 0),\n U: new Vector3(0, -1, 0),\n L: new Vector3(1, 0, 0),\n F: new Vector3(0, 0, -1),\n R: new Vector3(-1, 0, 0),\n B: new Vector3(0, 0, 1),\n D: new Vector3(0, 1, 0),\n};\n\ninterface OrbitIndexed<T> {\n [s: string]: T;\n}\ntype PieceIndexed<T> = OrbitIndexed<T[]>;\n\nconst firstPiecePosition: OrbitIndexed<Vector3> = {\n EDGES: new Vector3(0, 1, 1),\n CORNERS: new Vector3(1, 1, 1),\n CENTERS: new Vector3(0, 1, 0),\n};\nconst orientationRotation: OrbitIndexed<Matrix4[]> = {\n EDGES: [0, 1].map((i) =>\n new Matrix4().makeRotationAxis(\n firstPiecePosition[\"EDGES\"].clone().normalize(),\n (-i * TAU) / 2,\n ),\n ),\n CORNERS: [0, 1, 2].map((i) =>\n new Matrix4().makeRotationAxis(\n firstPiecePosition[\"CORNERS\"].clone().normalize(),\n (-i * TAU) / 3,\n ),\n ),\n CENTERS: [0, 1, 2, 3].map((i) =>\n new Matrix4().makeRotationAxis(\n firstPiecePosition[\"CENTERS\"].clone().normalize(),\n (-i * TAU) / 4,\n ),\n ),\n};\nconst cubieStickerOrder = [face[\"U\"], face[\"F\"], face[\"R\"]];\n\nconst pieceDefs: PieceIndexed<CubieDef> = {\n EDGES: [\n new CubieDef(\"EDGES\", \"UF\", t(r.O, 0)),\n new CubieDef(\"EDGES\", \"UR\", t(r.U, 3)),\n new CubieDef(\"EDGES\", \"UB\", t(r.U, 2)),\n new CubieDef(\"EDGES\", \"UL\", t(r.U, 1)),\n new CubieDef(\"EDGES\", \"DF\", t(r.F, 2)),\n new CubieDef(\"EDGES\", \"DR\", t(r.F, 2).premultiply(t(r.D, 1))),\n new CubieDef(\"EDGES\", \"DB\", t(r.F, 2).premultiply(t(r.D, 2))),\n new CubieDef(\"EDGES\", \"DL\", t(r.F, 2).premultiply(t(r.D, 3))),\n new CubieDef(\"EDGES\", \"FR\", t(r.U, 3).premultiply(t(r.R, 3))),\n new CubieDef(\"EDGES\", \"FL\", t(r.U, 1).premultiply(t(r.R, 3))),\n new CubieDef(\"EDGES\", \"BR\", t(r.U, 3).premultiply(t(r.R, 1))),\n new CubieDef(\"EDGES\", \"BL\", t(r.U, 1).premultiply(t(r.R, 1))),\n ],\n CORNERS: [\n new CubieDef(\"CORNERS\", \"UFR\", t(r.O, 0)),\n new CubieDef(\"CORNERS\", \"URB\", t(r.U, 3)),\n new CubieDef(\"CORNERS\", \"UBL\", t(r.U, 2)),\n new CubieDef(\"CORNERS\", \"ULF\", t(r.U, 1)),\n new CubieDef(\"CORNERS\", \"DRF\", t(r.F, 2).premultiply(t(r.D, 1))),\n new CubieDef(\"CORNERS\", \"DFL\", t(r.F, 2).premultiply(t(r.D, 0))),\n new CubieDef(\"CORNERS\", \"DLB\", t(r.F, 2).premultiply(t(r.D, 3))),\n new CubieDef(\"CORNERS\", \"DBR\", t(r.F, 2).premultiply(t(r.D, 2))),\n ],\n CENTERS: [\n new CubieDef(\"CENTERS\", \"U\", t(r.O, 0)),\n new CubieDef(\"CENTERS\", \"L\", t(r.R, 3).premultiply(t(r.U, 1))),\n new CubieDef(\"CENTERS\", \"F\", t(r.R, 3)),\n new CubieDef(\"CENTERS\", \"R\", t(r.R, 3).premultiply(t(r.D, 1))),\n new CubieDef(\"CENTERS\", \"B\", t(r.R, 3).premultiply(t(r.D, 2))),\n new CubieDef(\"CENTERS\", \"D\", t(r.R, 2)),\n ],\n};\n\nconst CUBE_SCALE = 1 / 3;\n\ninterface FaceletInfo {\n faceIdx: number;\n facelet: Mesh;\n hintFacelet?: Mesh;\n}\n\n// TODO: Compatibility with Randelshofer or standard net layout? Offer a\n// conversion function?\nconst pictureStickerCoords: Record<string, number[][][]> = {\n EDGES: [\n [\n [0, 4, 6],\n [0, 4, 5],\n ],\n [\n [3, 5, 7],\n [0, 7, 5],\n ],\n [\n [2, 4, 8],\n [0, 10, 5],\n ],\n [\n [1, 3, 7],\n [0, 1, 5],\n ],\n [\n [2, 4, 2],\n [2, 4, 3],\n ],\n [\n [3, 5, 1],\n [2, 7, 3],\n ],\n [\n [0, 4, 0],\n [2, 10, 3],\n ],\n [\n [1, 3, 1],\n [2, 1, 3],\n ],\n [\n [3, 5, 4],\n [3, 6, 4],\n ],\n [\n [1, 3, 4],\n [1, 2, 4],\n ],\n [\n [1, 9, 4],\n [1, 8, 4],\n ],\n [\n [3, 11, 4],\n [3, 0, 4],\n ],\n ],\n CORNERS: [\n [\n [0, 5, 6],\n [0, 5, 5],\n [0, 6, 5],\n ],\n [\n [3, 5, 8],\n [0, 8, 5],\n [0, 9, 5],\n ],\n [\n [2, 3, 8],\n [0, 11, 5],\n [0, 0, 5],\n ],\n [\n [1, 3, 6],\n [0, 2, 5],\n [0, 3, 5],\n ],\n [\n [3, 5, 2],\n [2, 6, 3],\n [2, 5, 3],\n ],\n [\n [2, 3, 2],\n [2, 3, 3],\n [2, 2, 3],\n ],\n [\n [1, 3, 0],\n [2, 0, 3],\n [2, 11, 3],\n ],\n [\n [0, 5, 0],\n [2, 9, 3],\n [2, 8, 3],\n ],\n ],\n CENTERS: [\n [[0, 4, 7]],\n [[0, 1, 4]],\n [[0, 4, 4]],\n [[0, 7, 4]],\n [[0, 10, 4]],\n [[0, 4, 1]],\n ],\n};\n\nlet sharedCubieFoundationGeometryCache: BoxGeometry | null = null;\nfunction sharedCubieFoundationGeometry(): BoxGeometry {\n return (\n sharedCubieFoundationGeometryCache ??\n (sharedCubieFoundationGeometryCache = new BoxGeometry(\n cubieDimensions.foundationWidth,\n cubieDimensions.foundationWidth,\n cubieDimensions.foundationWidth,\n ))\n );\n}\n\nfunction newStickerGeometry(): BufferGeometry {\n const r = new BufferGeometry();\n const half = 0.5;\n r.setAttribute(\n \"position\",\n new BufferAttribute(\n new Float32Array([\n half,\n half,\n 0,\n -half,\n half,\n 0,\n half,\n -half,\n 0,\n -half,\n half,\n 0,\n -half,\n -half,\n 0,\n half,\n -half,\n 0,\n ]),\n 3,\n ),\n );\n r.setAttribute(\n \"uv\",\n new BufferAttribute(\n new Float32Array([\n 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1,\n ]),\n 2,\n ),\n );\n // r.setAttribute('normals', new BufferAttribute(new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]), 3));\n return r;\n}\n\nlet sharedStickerGeometryCache: BufferGeometry | undefined;\nfunction sharedStickerGeometry(): BufferGeometry {\n return (sharedStickerGeometryCache ??= newStickerGeometry());\n}\n\n// TODO: Split into \"scene model\" and \"view\".\nexport class Cube3D extends Object3D implements Twisty3DPuzzle {\n kpuzzleFaceletInfo: Record<string, FaceletInfo[][]>;\n private pieces: PieceIndexed<Object3D> = {};\n private options: Cube3DOptions;\n // TODO: Keep track of option-based meshes better.\n private experimentalHintStickerMeshes: Mesh[] = [];\n private experimentalFoundationMeshes: Mesh[] = [];\n\n #setSpriteURL: ((url: string) => void) | undefined;\n private sprite: Texture | Promise<Texture> = new Promise((resolve) => {\n this.#setSpriteURL = (url: string): void => {\n svgLoader.load(url, resolve);\n };\n });\n\n // TODO: Don't overwrite the static function.\n // TODO: This doesn't work dynamically yet.\n setSprite(texture: Texture): void {\n this.sprite = texture;\n }\n\n #setHintSpriteURL: ((url: string) => void) | undefined;\n private hintSprite: Texture | Promise<Texture> = new Promise((resolve) => {\n this.#setHintSpriteURL = (url: string): void => {\n svgLoader.load(url, resolve);\n };\n });\n\n // TODO: Don't overwrite the static function.\n // TODO: This doesn't work dynamically yet.\n setHintSprite(texture: Texture): void {\n this.hintSprite = texture;\n }\n\n constructor(\n private kpuzzle: KPuzzle,\n private scheduleRenderCallback?: () => void,\n options: Cube3DOptions = {},\n ) {\n super();\n\n this.options = { ...cube3DOptionsDefaults };\n Object.assign(this.options, options); // TODO: check if this works\n\n if (this.kpuzzle.name() !== \"3x3x3\") {\n throw new Error(\n `Invalid puzzle for this Cube3D implementation: ${this.kpuzzle.name()}`,\n );\n }\n\n if (options.foundationSprite) {\n this.setSprite(options.foundationSprite);\n }\n if (options.hintSprite) {\n this.setHintSprite(options.hintSprite);\n }\n\n this.kpuzzleFaceletInfo = {};\n for (const orbit in pieceDefs) {\n const orbitFaceletInfo: FaceletInfo[][] = [];\n this.kpuzzleFaceletInfo[orbit] = orbitFaceletInfo;\n this.pieces[orbit] = pieceDefs[orbit].map(\n this.createCubie.bind(this, orbit, orbitFaceletInfo),\n );\n }\n this.scale.set(CUBE_SCALE, CUBE_SCALE, CUBE_SCALE);\n\n // TODO: Can we construct this directly instead of applying it later? Would that be more code-efficient?\n if (this.options.experimentalStickeringMask) {\n this.setStickeringMask(this.options.experimentalStickeringMask);\n }\n void this.#animateRaiseHintFacelets();\n\n if (this.options.faceletScale) {\n this.experimentalSetFaceletScale(this.options.faceletScale);\n }\n\n if (typeof this.options[\"hintFaceletsElevation\"] !== \"undefined\") {\n this.#elevationRequest = this.options.hintFaceletsElevation;\n }\n }\n\n #sharedHintStickerGeometryCache: BufferGeometry | undefined;\n #sharedHintStickerGeometry(): BufferGeometry {\n return (this.#sharedHintStickerGeometryCache ??= newStickerGeometry());\n }\n\n #elevationRequest: \"auto\" | number | undefined;\n setHintFaceletsElevation(elevation: \"auto\" | number) {\n if (elevation === this.#elevationRequest) {\n return;\n }\n this.#cancelAnimateRaiseHintSticker = true;\n this.#setHintFaceletsElevation(\n typeof elevation === \"number\"\n ? elevation\n : cubieDimensions.defaultHintStickerElevation,\n );\n this.#elevationRequest = elevation;\n }\n\n #lastHintStickerElevation = 0;\n #setHintFaceletsElevation(elevation: number) {\n this.#sharedHintStickerGeometry().translate(\n 0,\n 0,\n elevation - this.#lastHintStickerElevation,\n );\n this.#lastHintStickerElevation = elevation;\n }\n\n // TODO: support smooth physics\n #cancelAnimateRaiseHintSticker = false;\n // TODO: Generalize this into an animation mechanism.\n async #animateRaiseHintFacelets(): Promise<void> {\n if (\n this.options.initialHintFaceletsAnimation === \"none\" ||\n (this.options.initialHintFaceletsAnimation !== \"always\" &&\n haveStartedSharingRenderers())\n ) {\n return;\n }\n const targetElevation =\n typeof this.options.hintFaceletsElevation !== \"undefined\" &&\n this.options.hintFaceletsElevation !== \"auto\"\n ? this.options.hintFaceletsElevation\n : cubieDimensions.defaultHintStickerElevation;\n const translationRange = targetElevation - cubieDimensions.stickerElevation;\n this.#setHintFaceletsElevation(cubieDimensions.stickerElevation);\n\n // TODO: constant/config\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n const hintStartTime = performance.now();\n // TODO: constant/config\n const translationDuration = 1000 as MillisecondTimestamp;\n function ease(x: number) {\n return x * (2 - x);\n }\n const animateRaiseHintSticker = () => {\n if (this.#cancelAnimateRaiseHintSticker) {\n return;\n }\n const elapsed = performance.now() - hintStartTime;\n const fraction = Math.min(elapsed / translationDuration, 1);\n const newTranslation =\n ease(fraction) * translationRange + cubieDimensions.stickerElevation;\n this.#setHintFaceletsElevation(newTranslation);\n\n this.scheduleRenderCallback?.();\n if (elapsed < translationDuration) {\n requestAnimationFrame(animateRaiseHintSticker);\n }\n };\n animateRaiseHintSticker();\n }\n\n // Can only be called once.\n /** @deprecated */\n experimentalSetStickerSpriteURL(stickerSpriteURL: string): void {\n this.#setSpriteURL?.(stickerSpriteURL);\n }\n\n // Can only be called once.\n /** @deprecated */\n experimentalSetHintStickerSpriteURL(hintStickerSpriteURL: string): void {\n this.#setHintSpriteURL?.(hintStickerSpriteURL);\n }\n\n setStickeringMask(stickeringMask: StickeringMask): void {\n if (stickeringMask.specialBehaviour === \"picture\") {\n // TODO: if the latest stickering mask was already \"picture\", don't redo work.\n for (const pieceInfos of Object.values(this.kpuzzleFaceletInfo)) {\n for (const faceletInfos of pieceInfos) {\n for (const faceletInfo of faceletInfos) {\n faceletInfo.facelet.material = invisibleMaterial;\n const { hintFacelet } = faceletInfo;\n if (hintFacelet) {\n hintFacelet.material = invisibleMaterial;\n }\n }\n }\n }\n return;\n }\n this.options.experimentalStickeringMask = stickeringMask;\n for (const [orbitName, orbitStickeringMask] of Object.entries(\n stickeringMask.orbits,\n )) {\n for (\n let pieceIdx = 0;\n pieceIdx < orbitStickeringMask.pieces.length;\n pieceIdx++\n ) {\n const pieceStickeringMask = orbitStickeringMask.pieces[pieceIdx];\n if (pieceStickeringMask) {\n const pieceInfo = this.kpuzzleFaceletInfo[orbitName][pieceIdx];\n for (\n let faceletIdx = 0;\n faceletIdx < pieceInfo.length;\n faceletIdx++\n ) {\n const faceletStickeringMask =\n pieceStickeringMask.facelets[faceletIdx];\n if (faceletStickeringMask) {\n const faceletInfo = pieceInfo[faceletIdx];\n\n const stickeringMask =\n typeof faceletStickeringMask === \"string\"\n ? faceletStickeringMask\n : faceletStickeringMask?.mask;\n\n faceletInfo.facelet.material =\n axesInfo[faceletInfo.faceIdx].stickerMaterial[stickeringMask];\n // TODO\n const hintStickeringMask =\n typeof faceletStickeringMask === \"string\"\n ? stickeringMask\n : (faceletStickeringMask.hintMask ?? stickeringMask);\n if (faceletInfo.hintFacelet) {\n faceletInfo.hintFacelet.material =\n axesInfo[faceletInfo.faceIdx].hintStickerMaterial[\n hintStickeringMask\n ];\n }\n }\n }\n }\n }\n }\n if (this.scheduleRenderCallback) {\n this.scheduleRenderCallback();\n }\n }\n\n /** @deprecated */\n public experimentalUpdateOptions(options: Cube3DOptions): void {\n if (\"showMainStickers\" in options) {\n throw new Error(\"Unimplemented\");\n }\n\n const showFoundation = options.showFoundation;\n if (\n typeof showFoundation !== \"undefined\" &&\n this.options.showFoundation !== showFoundation\n ) {\n this.options.showFoundation = showFoundation;\n for (const foundation of this.experimentalFoundationMeshes) {\n foundation.visible = showFoundation;\n }\n }\n\n const hintFacelets = options.hintFacelets;\n if (\n typeof hintFacelets !== \"undefined\" &&\n this.options.hintFacelets !== hintFacelets &&\n hintFaceletStyles[hintFacelets] // TODO: test this\n ) {\n this.options.hintFacelets = hintFacelets;\n for (const hintSticker of this.experimentalHintStickerMeshes) {\n hintSticker.visible = hintFacelets === \"floating\";\n }\n this.scheduleRenderCallback!(); // TODO\n }\n\n const { experimentalStickeringMask } = options;\n if (typeof experimentalStickeringMask !== \"undefined\") {\n this.options.experimentalStickeringMask = experimentalStickeringMask;\n this.setStickeringMask(experimentalStickeringMask);\n this.scheduleRenderCallback!(); // TODO\n }\n\n const { faceletScale } = options;\n if (typeof faceletScale !== \"undefined\") {\n this.experimentalSetFaceletScale(faceletScale);\n }\n\n const { hintFaceletsElevation } = options;\n if (typeof hintFaceletsElevation !== \"undefined\") {\n this.setHintFaceletsElevation(hintFaceletsElevation);\n }\n }\n\n public onPositionChange(p: PuzzlePosition): void {\n const reid333 = p.pattern;\n for (const orbit in pieceDefs) {\n const pieces = pieceDefs[orbit];\n for (let i = 0; i < pieces.length; i++) {\n const j = reid333.patternData[orbit].pieces[i];\n this.pieces[orbit][j].matrix.copy(pieceDefs[orbit][i].matrix);\n this.pieces[orbit][j].matrix.multiply(\n orientationRotation[orbit][reid333.patternData[orbit].orientation[i]],\n );\n }\n for (const moveProgress of p.movesInProgress) {\n const move = moveProgress.move;\n const turnNormal = axesInfo[familyToAxis[move.family]].vector;\n const moveMatrix = new Matrix4().makeRotationAxis(\n turnNormal,\n (-this.ease(moveProgress.fraction) *\n moveProgress.direction *\n move.amount *\n TAU) /\n 4,\n );\n for (let i = 0; i < pieces.length; i++) {\n const quantumTransformation = this.kpuzzle.moveToTransformation(\n move.modified({ amount: 1 }),\n );\n const k =\n quantumTransformation.transformationData[orbit].permutation[i];\n if (\n i !== k ||\n quantumTransformation.transformationData[orbit].orientationDelta[\n i\n ] !== 0\n ) {\n const j = reid333.patternData[orbit].pieces[i];\n this.pieces[orbit][j].matrix.premultiply(moveMatrix);\n }\n }\n }\n }\n this.scheduleRenderCallback!();\n }\n\n // TODO: Always create (but sometimes hide parts) so we can show them later,\n // or (better) support creating puzzle parts on demand.\n private createCubie(\n orbit: string,\n orbitFacelets: FaceletInfo[][],\n piece: CubieDef,\n orbitPieceIdx: number,\n ): Object3D {\n const cubieFaceletInfo: FaceletInfo[] = [];\n orbitFacelets.push(cubieFaceletInfo);\n const cubie = new Group();\n if (this.options.showFoundation) {\n const foundation = this.createCubieFoundation();\n cubie.add(foundation);\n this.experimentalFoundationMeshes.push(foundation);\n }\n for (let i = 0; i < piece.stickerFaces.length; i++) {\n const sticker = this.createSticker(\n axesInfo[cubieStickerOrder[i]],\n axesInfo[piece.stickerFaces[i]],\n false,\n );\n const faceletInfo: FaceletInfo = {\n faceIdx: piece.stickerFaces[i],\n facelet: sticker,\n };\n cubie.add(sticker);\n if (this.options.hintFacelets === \"floating\") {\n const hintSticker = this.createSticker(\n axesInfo[cubieStickerOrder[i]],\n axesInfo[piece.stickerFaces[i]],\n true,\n );\n cubie.add(hintSticker);\n faceletInfo.hintFacelet = hintSticker;\n this.experimentalHintStickerMeshes.push(hintSticker);\n }\n\n if (\n this.options.experimentalStickeringMask?.specialBehaviour ===\n \"picture\" &&\n pictureStickerCoords[orbit] &&\n pictureStickerCoords[orbit][orbitPieceIdx] &&\n pictureStickerCoords[orbit][orbitPieceIdx][i]\n ) {\n const [rotate, offsetX, offsetY] =\n pictureStickerCoords[orbit][orbitPieceIdx][i];\n void (async () => {\n const addImageSticker = async (hint: boolean) => {\n const texture: Texture = await (hint\n ? this.hintSprite\n : this.sprite);\n\n const mesh = this.createSticker(\n axesInfo[cubieStickerOrder[i]],\n axesInfo[piece.stickerFaces[i]],\n hint,\n );\n mesh.material = new MeshBasicMaterial({\n map: texture,\n side: hint ? BackSide : DoubleSide,\n transparent: true,\n });\n\n const x1 = offsetX / 12;\n const x2 = (offsetX + 1) / 12;\n const y1 = offsetY / 9;\n const y2 = (offsetY + 1) / 9;\n\n let v1 = new Vector2(x1, y1);\n let v2 = new Vector2(x1, y2);\n let v3 = new Vector2(x2, y2);\n let v4 = new Vector2(x2, y1);\n\n switch (rotate) {\n case 1: {\n [v1, v2, v3, v4] = [v2, v3, v4, v1];\n break;\n }\n case 2: {\n [v1, v2, v3, v4] = [v3, v4, v1, v2];\n break;\n }\n case 3: {\n [v1, v2, v3, v4] = [v4, v1, v2, v3];\n break;\n }\n }\n mesh.geometry.setAttribute(\n \"uv\",\n new BufferAttribute(\n new Float32Array([\n v3.x,\n v3.y,\n v2.x,\n v2.y,\n v4.x,\n v4.y,\n v2.x,\n v2.y,\n v1.x,\n v1.y,\n v4.x,\n v4.y,\n ]),\n 2,\n ),\n );\n cubie.add(mesh);\n };\n // const delay: number = ({\n // CENTERS: 1000,\n // EDGES: 2000,\n // CORNERS: 3500,\n // } as Record<string, number>)[orbit];\n // if (orbit === \"CENTERS\" && orbitPieceIdx === 5) {\n void addImageSticker(true);\n void addImageSticker(false);\n // } else {\n // await this.sprite;\n // await this.hintSprite;\n // setTimeout(\n // () => addImageSticker(true),\n // delay + orbitPieceIdx * 100,\n // );\n // setTimeout(\n // () => addImageSticker(false),\n // delay + orbitPieceIdx * 100,\n // );\n // }\n })();\n }\n\n cubieFaceletInfo.push(faceletInfo);\n }\n cubie.matrix.copy(piece.matrix);\n cubie.matrixAutoUpdate = false;\n this.add(cubie);\n return cubie;\n }\n\n // TODO: Support creating only the outward-facing parts?\n private createCubieFoundation(): Mesh {\n const box = sharedCubieFoundationGeometry();\n return new Mesh(\n box,\n this.options.experimentalStickeringMask?.specialBehaviour === \"picture\"\n ? blackMesh\n : blackTranslucentMesh,\n );\n }\n\n private createSticker(\n posAxisInfo: AxisInfo,\n materialAxisInfo: AxisInfo,\n isHint: boolean,\n ): Mesh {\n const geo =\n this.options.experimentalStickeringMask?.specialBehaviour === \"picture\"\n ? newStickerGeometry()\n : isHint\n ? this.#sharedHintStickerGeometry()\n : sharedStickerGeometry();\n const stickerMesh = new Mesh(\n geo,\n isHint\n ? materialAxisInfo.hintStickerMaterial.regular\n : materialAxisInfo.stickerMaterial.regular,\n );\n stickerMesh.setRotationFromEuler(posAxisInfo.fromZ);\n stickerMesh.position.copy(posAxisInfo.vector);\n\n const elevation = (() => {\n if (!isHint) {\n return cubieDimensions.stickerElevation;\n }\n if (typeof this.options.hintFaceletsElevation === \"number\") {\n return this.options.hintFaceletsElevation;\n }\n if (\n this.options.experimentalStickeringMask?.specialBehaviour === \"picture\"\n ) {\n return EXPERIMENTAL_PICTURE_CUBE_HINT_ELEVATION;\n }\n return cubieDimensions.defaultHintStickerElevation;\n })();\n if (isHint) {\n this.#lastHintStickerElevation = elevation;\n }\n const scale = getFaceletScale(this.options);\n stickerMesh.scale.setX(scale);\n stickerMesh.scale.setY(scale);\n stickerMesh.translateZ(elevation - 1);\n return stickerMesh;\n }\n\n /** @deprecated */\n experimentalSetFoundationOpacity(opacity: number): void {\n (\n this.experimentalFoundationMeshes[0].material as MeshBasicMaterial\n ).opacity = opacity;\n }\n\n /** @deprecated */\n experimentalSetFaceletScale(faceletScale: FaceletScale): void {\n this.options.faceletScale = faceletScale;\n for (const orbitInfo of Object.values(this.kpuzzleFaceletInfo)) {\n for (const pieceInfo of orbitInfo) {\n for (const faceletInfo of pieceInfo) {\n const scale = getFaceletScale(this.options);\n faceletInfo.facelet.scale.setX(scale);\n faceletInfo.facelet.scale.setY(scale);\n faceletInfo.hintFacelet?.scale.setX(scale);\n faceletInfo.hintFacelet?.scale.setY(scale);\n // faceletInfo.facelet.setRotationFromAxisAngle(new Vector3(0, 1, 0), 0);\n // faceletInfo.facelet.rotateOnAxis(new Vector3(1, 0, 1), TAU / 6);\n }\n }\n }\n }\n\n // /** @deprecated */\n // experimentalSetCenterStickerWidth(width: number): void {\n // for (const orbitInfo of [this.kpuzzleFaceletInfo[\"CENTERS\"]]) {\n // for (const pieceInfo of orbitInfo) {\n // for (const faceletInfo of pieceInfo) {\n // faceletInfo.facelet.scale.setScalar(\n // width / getStickerScale(this.options),\n // );\n // // faceletInfo.facelet.setRotationFromAxisAngle(new Vector3(0, 1, 0), 0);\n // // faceletInfo.facelet.rotateOnAxis(new Vector3(1, 0, 1), TAU / 6);\n // }\n // }\n // }\n // }\n\n private ease(fraction: number): number {\n return smootherStep(fraction);\n }\n}\n", "export function smootherStep(x: number): number {\n return x * x * x * (10 - x * (15 - 6 * x));\n}\n", "import { DoubleSide, FrontSide } from \"three/src/constants.js\";\nimport { BufferAttribute } from \"three/src/core/BufferAttribute.js\";\nimport { BufferGeometry } from \"three/src/core/BufferGeometry.js\";\nimport { Object3D } from \"three/src/core/Object3D.js\";\nimport type { Material } from \"three/src/materials/Material.js\";\nimport { MeshBasicMaterial } from \"three/src/materials/MeshBasicMaterial.js\";\nimport { Color } from \"three/src/math/Color.js\";\nimport { Euler } from \"three/src/math/Euler.js\";\nimport { Vector3 } from \"three/src/math/Vector3.js\";\nimport { Group } from \"three/src/objects/Group.js\";\nimport { Mesh } from \"three/src/objects/Mesh.js\";\nimport type { Texture } from \"three/src/textures/Texture.js\";\nimport { Move } from \"../../../../alg/index.ts\";\nimport type { KPuzzle, KTransformation } from \"../../../../kpuzzle/index.ts\";\nimport type {\n StickerDat,\n StickerDatAxis,\n StickerDatSticker,\n} from \"../../../../puzzle-geometry/index.ts\";\nimport type { TextureMapper } from \"../../../../puzzle-geometry/PuzzleGeometry.ts\";\nimport {\n type ExperimentalFaceletMeshStickeringMask,\n type ExperimentalStickeringMask,\n experimentalGetFaceletStickeringMask,\n} from \"../../../../puzzles/cubing-private/index.ts\";\nimport type { PuzzlePosition } from \"../../../controllers/AnimationTypes.ts\";\nimport { smootherStep } from \"../../../controllers/easing.ts\";\nimport type { HintFaceletStyle } from \"../../../model/props/puzzle/display/HintFaceletProp.ts\";\nimport { TAU } from \"../TAU.ts\";\nimport type { Twisty3DPuzzle } from \"./Twisty3DPuzzle.ts\";\n\nconst foundationMaterial = new MeshBasicMaterial({\n side: DoubleSide,\n color: 0x000000,\n});\nconst invisMaterial = new MeshBasicMaterial({\n visible: false,\n});\nconst basicStickerMaterial = new MeshBasicMaterial({\n vertexColors: true,\n});\n\nfunction dist(coords: number[], a: number, b: number): number {\n return Math.hypot(\n coords[3 * a] - coords[3 * b],\n coords[3 * a + 1] - coords[3 * b + 1],\n coords[3 * a + 2] - coords[3 * b + 2],\n );\n}\n\nfunction triarea(coords: number[], a: number, b: number, c: number): number {\n const ab = dist(coords, a, b);\n const bc = dist(coords, b, c);\n const ac = dist(coords, a, c);\n const p = (ab + bc + ac) / 2;\n return Math.sqrt(p * (p - ab) * (p - bc) * (p - ac));\n}\n\nfunction polyarea(coords: number[]): number {\n let sum = 0;\n for (let i = 2; 3 * i < coords.length; i++) {\n sum += triarea(coords, 0, 1, i);\n }\n return sum;\n}\n\nfunction normalize(r: number[]): number[] {\n const m = Math.hypot(r[0], r[1], r[2]);\n r[0] /= m;\n r[1] /= m;\n r[2] /= m;\n return r;\n}\n\nfunction cross(a: number[], b: number[]): number[] {\n const r = new Array<number>(3);\n r[0] = a[1] * b[2] - a[2] * b[1];\n r[1] = a[2] * b[0] - a[0] * b[2];\n r[2] = a[0] * b[1] - a[1] * b[0];\n return r;\n}\n\nfunction normal(c: number[]): number[] {\n const a: number[] = [c[3] - c[0], c[4] - c[1], c[5] - c[2]];\n const b: number[] = [c[6] - c[3], c[7] - c[4], c[8] - c[5]];\n const r = cross(a, b);\n return normalize(r);\n}\n\nfunction trimEdges(face: number[], tr: number): number[] {\n const r: number[] = [];\n const A: number[] = new Array(3);\n const B: number[] = new Array(3);\n for (let iter = 1; iter < 10; iter++) {\n for (let i = 0; i < face.length; i += 3) {\n const pi = (i + face.length - 3) % face.length;\n const ni = (i + 3) % face.length;\n for (let k = 0; k < 3; k++) {\n A[k] = face[pi + k] - face[i + k];\n B[k] = face[ni + k] - face[i + k];\n }\n const alen = Math.hypot(A[0], A[1], A[2]);\n const blen = Math.hypot(B[0], B[1], B[2]);\n for (let k = 0; k < 3; k++) {\n A[k] /= alen;\n B[k] /= blen;\n }\n const d = A[0] * B[0] + A[1] * B[1] + A[2] * B[2];\n const m = tr / Math.sqrt(1 - d * d);\n for (let k = 0; k < 3; k++) {\n r[i + k] = face[i + k] + (A[k] + B[k]) * m;\n }\n }\n let good = true;\n for (let i = 0; good && i < r.length; i += 3) {\n const ni = (i + 3) % face.length;\n let t = 0;\n for (let k = 0; k < 3; k++) {\n const a = face[ni + k] - face[i + k];\n const b = r[ni + k] - r[i + k];\n t += a * b;\n }\n if (t <= 0) {\n good = false;\n }\n }\n if (good) {\n return r;\n }\n tr /= 2;\n }\n return face;\n}\n\nclass Filler {\n pos: number;\n ipos: number;\n vertices: Float32Array;\n colors: Uint8Array;\n uvs?: Float32Array;\n ind: Uint8Array;\n constructor(\n public sz: number,\n public tm: TextureMapper,\n ) {\n this.vertices = new Float32Array(9 * sz);\n this.uvs = undefined;\n this.colors = new Uint8Array(18 * sz);\n this.ind = new Uint8Array(sz);\n this.pos = 0;\n this.ipos = 0;\n }\n\n add(pt: number[], i: number, c: number) {\n this.vertices[this.pos] = pt[3 * i + 0];\n this.vertices[this.pos + 1] = pt[3 * i + 1];\n this.vertices[this.pos + 2] = pt[3 * i + 2];\n this.colors[this.pos] = c >> 16;\n this.colors[this.pos + 1] = (c >> 8) & 255;\n this.colors[this.pos + 2] = c & 255;\n this.pos += 3;\n }\n\n addUncolored(pt: number[], i: number) {\n this.vertices[this.pos] = pt[3 * i + 0];\n this.vertices[this.pos + 1] = pt[3 * i + 1];\n this.vertices[this.pos + 2] = pt[3 * i + 2];\n this.pos += 3;\n }\n\n setind(i: number) {\n this.ind[this.ipos++] = i;\n }\n\n makePoly(coords: number[], color: number, ind: number): void {\n const ncoords: number[] = coords;\n for (let g = 1; 3 * (g + 1) < ncoords.length; g++) {\n this.add(ncoords, 0, color);\n this.add(ncoords, g, color);\n this.add(ncoords, g + 1, color);\n this.setind(ind);\n }\n }\n\n setAttributes(geo: BufferGeometry) {\n geo.setAttribute(\"position\", new BufferAttribute(this.vertices, 3));\n // the geometry only needs the first half of the array\n const sa2 = this.colors.subarray(0, 9 * this.sz);\n geo.setAttribute(\"color\", new BufferAttribute(sa2, 3, true));\n }\n\n makeGroups(geo: BufferGeometry) {\n geo.clearGroups();\n for (let i = 0; i < this.ipos; ) {\n const si = i++;\n const iv = this.ind[si];\n while (this.ind[i] === iv) {\n i++;\n }\n geo.addGroup(3 * si, 3 * (i - si), iv);\n }\n }\n\n saveOriginalColors() {\n this.colors.copyWithin(this.pos, 0, this.pos);\n }\n}\n\nclass StickerDef {\n private origColor: number;\n private origColorStickeringMask: number;\n private faceColor: number;\n private texturePtr?: StickerDef = undefined;\n public twistVal: number = -1;\n public stickerStart: number;\n public stickerEnd: number;\n public hintStart?: number;\n public hintEnd?: number;\n public foundationStart?: number;\n public foundationEnd?: number;\n private isDup: boolean;\n private faceNum: number;\n constructor(\n filler: Filler,\n stickerDat: StickerDatSticker,\n trim: number,\n options?: {\n stickeringMask?: ExperimentalFaceletMeshStickeringMask;\n },\n ) {\n this.isDup = !!stickerDat.isDup;\n this.faceNum = stickerDat.face;\n this.stickerStart = filler.ipos;\n const sdColor = new Color(stickerDat.color).getHex();\n this.origColor = sdColor;\n this.origColorStickeringMask = sdColor;\n if (options?.stickeringMask) {\n this.setStickeringMask(filler, options.stickeringMask);\n }\n this.faceColor = sdColor;\n const coords = this.stickerCoords(stickerDat.coords, trim);\n filler.makePoly(coords, this.faceColor, this.isDup ? 4 : 0);\n this.stickerEnd = filler.ipos;\n }\n\n private stickerCoords(coords: number[], trim: number): number[] {\n return trimEdges(coords.slice(), trim);\n }\n\n private hintCoords(\n coords: number[],\n hintStickerHeightScale: number,\n trim: number,\n normal: number[],\n ): number[] {\n coords = this.stickerCoords(coords, trim); // pick up trim from stickers\n normal = normal.slice();\n for (let i = 0; i < 3; i++) {\n normal[i] *= 0.5 * hintStickerHeightScale;\n }\n const hCoords = new Array<number>(coords.length);\n for (let i = 0; 3 * i < coords.length; i++) {\n const j = coords.length / 3 - 1 - i;\n hCoords[3 * i] = coords[3 * j] + normal[0];\n hCoords[3 * i + 1] = coords[3 * j + 1] + normal[1];\n hCoords[3 * i + 2] = coords[3 * j + 2] + normal[2];\n }\n return hCoords;\n }\n\n private foundationCoords(coords: number[]): number[] {\n const ncoords = coords.slice();\n for (let i = 0; i < coords.length; i++) {\n ncoords[i] = coords[i] * 0.999;\n }\n return ncoords;\n }\n\n addHint(\n filler: Filler,\n stickerDat: StickerDatSticker,\n hintStickers: boolean,\n hintStickerHeightScale: number,\n trim: number,\n normal: number[],\n ): void {\n this.hintStart = filler.ipos;\n const coords = this.hintCoords(\n stickerDat.coords,\n hintStickerHeightScale,\n trim,\n normal,\n );\n filler.makePoly(\n coords,\n this.faceColor,\n hintStickers && !this.isDup ? 2 : 4,\n );\n this.hintEnd = filler.ipos;\n }\n\n public addFoundation(\n filler: Filler,\n stickerDat: StickerDatSticker,\n black: number,\n ) {\n this.foundationStart = filler.ipos;\n const coords = this.foundationCoords(stickerDat.coords);\n filler.makePoly(coords, black, this.isDup ? 4 : 6);\n this.foundationEnd = filler.ipos;\n }\n\n private setHintStickers(filler: Filler, hintStickers: boolean): void {\n const indv = this.isDup || !hintStickers ? 4 : 2;\n // TODO: refactor to avoid non-null-assertions\n for (let i = this.hintStart!; i < this.hintEnd!; i++) {\n filler.ind[i] = indv | (filler.ind[i] & 1);\n }\n }\n\n setStickeringMask(\n filler: Filler,\n faceletMeshStickeringMask: ExperimentalFaceletMeshStickeringMask,\n ): void {\n let c = 0;\n switch (faceletMeshStickeringMask) {\n case \"regular\": {\n c = this.origColor;\n break;\n }\n case \"dim\": {\n if (this.origColor === 0xffffff) {\n c = 0xdddddd;\n } else {\n c = new Color(this.origColor).multiplyScalar(0.5).getHex();\n }\n break;\n }\n case \"oriented\": {\n c = 0x44ddcc;\n break;\n }\n case \"experimentalOriented2\": {\n c = 0xfffdaa;\n break;\n }\n case \"ignored\": {\n c = 0x444444;\n break;\n }\n case \"mystery\": {\n c = 0xf2cbcb;\n break;\n }\n case \"invisible\":\n c = this.origColor;\n }\n this.origColorStickeringMask = c;\n for (let i = 9 * this.stickerStart; i < 9 * this.stickerEnd; i += 3) {\n filler.colors[filler.pos + i] = c >> 16;\n filler.colors[filler.pos + i + 1] = (c >> 8) & 255;\n filler.colors[filler.pos + i + 2] = c & 255;\n }\n // TODO: refactor to avoid non-null-assertions\n for (let i = 9 * this.hintStart!; i < 9 * this.hintEnd!; i += 3) {\n filler.colors[filler.pos + i] = c >> 16;\n filler.colors[filler.pos + i + 1] = (c >> 8) & 255;\n filler.colors[filler.pos + i + 2] = c & 255;\n }\n this.setHintStickers(\n filler,\n faceletMeshStickeringMask !== \"invisible\" && !this.isDup,\n );\n }\n\n public addUVs(filler: Filler): void {\n const uvs = filler.uvs!;\n const vert = filler.vertices;\n const coords = new Array(3);\n for (let i = 3 * this.stickerStart; i < 3 * this.stickerEnd; i++) {\n coords[0] = vert[3 * i];\n coords[1] = vert[3 * i + 1];\n coords[2] = vert[3 * i + 2];\n const uv = filler.tm.getuv(this.faceNum, coords);\n uvs[2 * i] = uv[0];\n uvs[2 * i + 1] = uv[1];\n }\n // TODO: refactor to avoid non-null-assertions\n for (let i = 3 * this.hintStart!; i < 3 * this.hintEnd!; i++) {\n coords[0] = vert[3 * i];\n coords[1] = vert[3 * i + 1];\n coords[2] = vert[3 * i + 2];\n const uv = filler.tm.getuv(this.faceNum, coords);\n uvs[2 * i] = uv[0];\n uvs[2 * i + 1] = uv[1];\n }\n }\n\n public setTexture(filler: Filler, sd: StickerDef): number {\n if (this.texturePtr === sd) {\n return 0;\n }\n this.texturePtr = sd;\n const sz = 6 * filler.sz;\n filler.uvs!.copyWithin(\n 6 * this.stickerStart,\n 6 * sd.stickerStart + sz,\n 6 * sd.stickerEnd + sz,\n );\n filler.uvs!.copyWithin(\n 6 * this.hintStart!, // TODO: refactor to avoid non-null-assertion\n 6 * sd.hintStart! + sz, // TODO: refactor to avoid non-null-assertion\n 6 * sd.hintEnd! + sz, // TODO: refactor to avoid non-null-assertion\n );\n return 1;\n }\n\n public setColor(filler: Filler, sd: StickerDef): number {\n const c = sd.origColorStickeringMask;\n if (this.faceColor !== c) {\n this.faceColor = c;\n const sz = filler.pos;\n filler.colors.copyWithin(\n 9 * this.stickerStart,\n 9 * sd.stickerStart + sz,\n 9 * sd.stickerEnd + sz,\n );\n filler.colors.copyWithin(\n 9 * this.hintStart!, // TODO: refactor to avoid non-null-assertion\n 9 * sd.hintStart! + sz, // TODO: refactor to avoid non-null-assertion\n 9 * sd.hintEnd! + sz, // TODO: refactor to avoid non-null-assertion\n );\n return 1;\n } else {\n return 0;\n }\n }\n}\n\nclass HitPlaneDef {\n public cubie: Group;\n private geo: BufferGeometry;\n constructor(hitface: any, tm: TextureMapper, stickerDat: StickerDat) {\n this.cubie = new Group();\n const coords = hitface.coords as number[];\n const filler = new Filler(coords.length / 3 - 2, tm);\n for (let g = 1; 3 * g + 3 < coords.length; g++) {\n filler.addUncolored(coords, 0);\n filler.addUncolored(coords, g);\n filler.addUncolored(coords, g + 1);\n }\n this.geo = new BufferGeometry();\n filler.setAttributes(this.geo);\n const obj = new Mesh(this.geo, invisMaterial);\n obj.userData[\"quantumMove\"] = stickerDat.notationMapper.notationToExternal(\n new Move(hitface.name),\n );\n this.cubie.scale.setScalar(0.99);\n this.cubie.add(obj);\n }\n}\n\nclass AxisInfo {\n public axis: Vector3;\n public order: number;\n constructor(axisDat: StickerDatAxis) {\n const vec = axisDat.coordinates;\n this.axis = new Vector3(vec[0], vec[1], vec[2]);\n this.order = axisDat.order;\n }\n}\n\nexport interface PG3DOptions {\n stickeringMask?: ExperimentalStickeringMask;\n}\n\nconst DEFAULT_COLOR_FRACTION = 0.71;\nconst PG_SCALE = 0.5;\n\n// TODO: Split into \"scene model\" and \"view\".\n/*\n * PG3D uses a single geometry for the puzzle, with all the faces for\n * each sticker (including the foundation stickers) in a single\n * geometry. We use the materialIndex in the face to point to a\n * specific entry, which is either a colored sticker, invisible, or\n * black (foundation).\n *\n * To support general twisting of a subset of the puzzle, we then\n * instantiate this same geometry in two different meshes with two\n * distinct material arrays. One, the fixed mesh, has the material\n * array set up like: [colored, invisible, black, invisible].\n * The twisting mesh has the material array set up as\n * [invisible, colored, invislble, black]. When not twisted, the\n * two meshes are directly coincident, and the (shared) materialIndex\n * in each face points to a non-invisible material in exactly one of\n * the two meshes. When we decide to twist some cubies, we make\n * the cubies that move point to visible materials in the moving\n * mesh (which makes them point to invisible materials in the static\n * mesh). This way, we only need to rotate the moving mesh as a\n * single object---this should be very fast, and occur entirely in\n * the GPU. Unfortunately this doesn't quite work as fast as we'd\n * like because three.js makes a draw call every time we have a change\n * in the material index. By moving the foundation triangles separate\n * from the sticker triangles, we enhance the probability that many\n * triangles can be rendered in one call speeding up the render.\n * We also get some assistance from puzzleGeometry to try to keep\n * nearby stickers close to each other.\n */\nexport class PG3D extends Object3D implements Twisty3DPuzzle {\n private stickers: { [key: string]: StickerDef[][] };\n private axesInfo: { [key: string]: AxisInfo };\n\n private stickerTargets: Object3D[] = [];\n private controlTargets: Object3D[] = [];\n\n private movingObj: Object3D;\n private filler: Filler;\n private foundationBound: number; // before this: colored; after: black\n private fixedGeo: BufferGeometry;\n private lastPos?: PuzzlePosition;\n private lastMoveTransformation?: KTransformation;\n private hintMaterial: Material;\n private stickerMaterial: Material;\n private materialArray1: Material[];\n private materialArray2: Material[];\n private textured: boolean = false;\n private showHintStickers: boolean = false;\n private showFoundations: boolean = false;\n private hintMaterialDisposable: boolean;\n private stickerMaterialDisposable: boolean;\n\n #pendingStickeringUpdate: boolean = false;\n\n constructor(\n private scheduleRenderCallback: () => void,\n private kpuzzle: KPuzzle,\n private stickerDat: StickerDat,\n enableFoundationOpt: boolean = false,\n enableHintStickersOpt: boolean = false,\n hintStickerHeightScale: number = 1,\n private faceletScale: \"auto\" | number = 1,\n private params: PG3DOptions = {},\n ) {\n super();\n if (stickerDat.stickers.length === 0) {\n throw Error(\"Reuse of stickerdat from pg; please don't do that.\");\n }\n this.hintMaterial = new MeshBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: 0.5,\n });\n this.hintMaterialDisposable = true;\n this.stickerMaterial = basicStickerMaterial;\n this.stickerMaterialDisposable = false;\n this.axesInfo = {};\n const axesDef = this.stickerDat.axis;\n for (const axis of axesDef) {\n this.axesInfo[axis.quantumMove.family] = new AxisInfo(axis);\n }\n const stickers = this.stickerDat.stickers as any[];\n this.stickers = {};\n this.materialArray1 = new Array(8);\n this.materialArray2 = new Array(8);\n // TODO: the argument enableFoundationOpt really means, do we ever want to display\n // foundations. But it is presently *used* to mean, show foundations initially\n // (and maybe setStickeringMask changes this). So for now we set up the\n // show flag from the enable flag, and turn on the enable flag so later when it's\n // used we will get the foundations. What this means is the geometry always \"pays\"\n // for foundations, even if they aren't displayed.\n this.showFoundation(enableFoundationOpt);\n enableFoundationOpt = true;\n let triangleCount = 0;\n const multiplier = 3;\n for (const sticker of stickers) {\n const sides = sticker.coords.length / 3;\n triangleCount += multiplier * (sides - 2);\n }\n const filler = new Filler(triangleCount, stickerDat.textureMapper);\n const black = 0;\n const normals: number[][] = [];\n let totArea = 0;\n for (const f of stickerDat.faces) {\n normals.push(normal(f.coords));\n totArea += polyarea(f.coords);\n }\n const colorfrac =\n faceletScale !== \"auto\"\n ? faceletScale * faceletScale\n : DEFAULT_COLOR_FRACTION;\n let nonDupStickers = 0;\n for (const sticker of stickers) {\n if (!sticker.isDup) {\n nonDupStickers++;\n }\n }\n const trim =\n (Math.sqrt(totArea / nonDupStickers) * (1 - Math.sqrt(colorfrac))) / 2;\n for (const sticker of stickers) {\n const orbit = sticker.orbit;\n const ord = sticker.ord;\n const ori = sticker.ori;\n if (!this.stickers[orbit]) {\n this.stickers[orbit] = [];\n }\n if (!this.stickers[orbit][ori]) {\n this.stickers[orbit][ori] = [];\n }\n const options: {\n stickeringMask?: ExperimentalFaceletMeshStickeringMask;\n } = {};\n if (params.stickeringMask) {\n options.stickeringMask = experimentalGetFaceletStickeringMask(\n params.stickeringMask,\n orbit,\n ord,\n ori,\n false,\n );\n }\n const stickerdef = new StickerDef(filler, sticker, trim, options);\n this.stickers[orbit][ori][ord] = stickerdef;\n }\n // TODO: the argument enableHintStickersOpt really means, do we ever want to display\n // hint stickers. But it is presently *used* to mean, show hint stickers initially\n // (and maybe setStickeringMask changes this). So for now we set up the\n // show flag from the enable flag, and turn on the enable flag so later when it's\n // used we will get the hint stickers. What this means is the geometry always \"pays\"\n // for hint stickers, even if they aren't displayed.\n this.showHintStickers = enableHintStickersOpt;\n enableHintStickersOpt = true;\n for (const sticker of stickers) {\n const orbit = sticker.orbit;\n const ord = sticker.ord;\n const ori = sticker.ori;\n this.stickers[orbit][ori][ord].addHint(\n filler,\n sticker,\n enableHintStickersOpt,\n hintStickerHeightScale,\n trim,\n normals[sticker.face],\n );\n }\n this.foundationBound = filler.ipos;\n for (const sticker of stickers) {\n const orbit = sticker.orbit;\n const ord = sticker.ord;\n const ori = sticker.ori;\n if (enableFoundationOpt) {\n this.stickers[orbit][ori][ord].addFoundation(filler, sticker, black);\n }\n }\n const fixedGeo = new BufferGeometry();\n filler.setAttributes(fixedGeo);\n filler.makeGroups(fixedGeo);\n const obj = new Mesh(fixedGeo, this.materialArray1);\n obj.scale.set(PG_SCALE, PG_SCALE, PG_SCALE);\n this.add(obj);\n const obj2 = new Mesh(fixedGeo, this.materialArray2);\n obj2.scale.set(PG_SCALE, PG_SCALE, PG_SCALE);\n this.add(obj2);\n const hitfaces = this.stickerDat.faces as any[];\n this.movingObj = obj2;\n this.fixedGeo = fixedGeo;\n this.filler = filler;\n for (const hitface of hitfaces) {\n const facedef = new HitPlaneDef(\n hitface,\n stickerDat.textureMapper,\n this.stickerDat,\n );\n facedef.cubie.scale.set(PG_SCALE, PG_SCALE, PG_SCALE);\n this.add(facedef.cubie);\n this.controlTargets.push(facedef.cubie.children[0]);\n }\n filler.saveOriginalColors();\n stickerDat.stickers = []; // don't need these anymore\n this.updateMaterialArrays();\n /*\n this.experimentalUpdateTexture(\n true,\n new TextureLoader().load(\n \"/experiments.cubing.net/cubing.js/twisty/mkbhd-sprite-red.png\",\n ),\n new TextureLoader().load(\n \"/experiments.cubing.net/cubing.js/twisty/mkbhd-sprite-red-hint.png\",\n ),\n );\n */\n }\n\n public dispose(): void {\n if (this.fixedGeo) {\n this.fixedGeo.dispose();\n }\n if (this.stickerMaterialDisposable) {\n this.stickerMaterial.dispose();\n this.stickerMaterial = basicStickerMaterial;\n this.stickerMaterialDisposable = false;\n }\n if (this.hintMaterialDisposable) {\n this.hintMaterial.dispose();\n this.hintMaterial = basicStickerMaterial;\n this.hintMaterialDisposable = false;\n }\n }\n\n public experimentalGetStickerTargets(): Object3D[] {\n return this.stickerTargets;\n }\n\n public experimentalGetControlTargets(): Object3D[] {\n return this.controlTargets;\n }\n\n #isValidMove(move: Move): boolean {\n try {\n this.kpuzzle.moveToTransformation(move);\n return true;\n } catch (_) {\n return false;\n }\n }\n\n getClosestMoveToAxis(\n point: Vector3,\n transformations: {\n invert: boolean;\n depth?: \"secondSlice\" | \"rotation\" | \"none\";\n },\n ): { move: Move; order: number } | null {\n let closestMove: Move | null = null;\n let closestMoveDotProduct: number = 0;\n\n let modify: (move: Move) => Move = (m) => m;\n switch (transformations.depth) {\n case \"secondSlice\": {\n modify = (m: Move) => m.modified({ innerLayer: 2 });\n break;\n }\n case \"rotation\": {\n modify = (m: Move) => m.modified({ family: `${m.family}v` });\n break;\n }\n }\n\n for (const axis of this.stickerDat.axis) {\n const product = point.dot(new Vector3(...axis.coordinates));\n if (product > closestMoveDotProduct) {\n const modified = this.stickerDat.notationMapper.notationToExternal(\n modify(axis.quantumMove),\n );\n if (!modified) {\n continue;\n }\n // Special case: for the FTO, there is a rotation that is defined\n // as T. This is a rotation (without the v), and it does not have\n // a v on the end nor does it correspond to a geometry. So, if\n // depth is \"none\", we'll pick up \"T\" as a normal move; we\n // shouldn't.\n console.log(modified.family);\n if (modified.family === \"T\" && transformations.depth === \"none\") {\n continue;\n }\n if (this.#isValidMove(modified)) {\n closestMoveDotProduct = product;\n closestMove = modified;\n }\n }\n }\n\n if (!closestMove) {\n return null;\n }\n\n if (transformations.invert) {\n closestMove = closestMove.invert();\n }\n const order = this.kpuzzle\n .moveToTransformation(closestMove)\n .repetitionOrder();\n return { move: closestMove, order }; // TODO: push this down\n }\n\n setStickeringMask(stickeringMask: ExperimentalStickeringMask): void {\n this.params.stickeringMask = stickeringMask;\n if (stickeringMask.specialBehaviour !== \"picture\") {\n for (const orbitDefinition of this.kpuzzle.definition.orbits) {\n // This isn't strictly necessary, but it keeps the following lines more\n // readable by fitting each `for` loop onto a single line when running\n // `make format`.\n const { numPieces, numOrientations } = orbitDefinition;\n for (let pieceIdx = 0; pieceIdx < numPieces; pieceIdx++) {\n for (let faceletIdx = 0; faceletIdx < numOrientations; faceletIdx++) {\n const faceletStickeringMask = experimentalGetFaceletStickeringMask(\n stickeringMask,\n orbitDefinition.orbitName,\n pieceIdx,\n faceletIdx,\n false,\n );\n const stickerDef =\n this.stickers[orbitDefinition.orbitName][faceletIdx][pieceIdx];\n if (\n this.textured &&\n this.hintMaterialDisposable &&\n faceletStickeringMask === \"invisible\"\n ) {\n // ignore \"invisible\" if textured hints\n } else {\n stickerDef.setStickeringMask(this.filler, faceletStickeringMask);\n }\n }\n }\n }\n }\n this.#pendingStickeringUpdate = true;\n if (this.lastPos) {\n this.onPositionChange(this.lastPos);\n }\n }\n\n public onPositionChange(p: PuzzlePosition): void {\n const { pattern } = p;\n const noRotation = new Euler();\n this.movingObj.rotation.copy(noRotation);\n let colormods = 0;\n const filler = this.filler;\n const ind = filler.ind;\n if (\n !this.lastPos ||\n this.#pendingStickeringUpdate ||\n !this.lastPos.pattern.isIdentical(pattern)\n ) {\n for (const orbit in this.stickers) {\n const pieces = this.stickers[orbit];\n const pos2 = pattern.patternData[orbit];\n const orin = pieces.length;\n if (orin === 1) {\n const pieces2 = pieces[0];\n for (let i = 0; i < pieces2.length; i++) {\n const ni = pos2.pieces[i];\n if (this.textured) {\n colormods += pieces2[i].setTexture(filler, pieces2[ni]);\n } else {\n colormods += pieces2[i].setColor(filler, pieces2[ni]);\n }\n }\n } else {\n for (let ori = 0; ori < orin; ori++) {\n const pieces2 = pieces[ori];\n for (let i = 0; i < pieces2.length; i++) {\n const nori = (ori + orin - pos2.orientation[i]) % orin;\n const ni = pos2.pieces[i];\n if (this.textured) {\n colormods += pieces2[i].setTexture(filler, pieces[nori][ni]);\n } else {\n colormods += pieces2[i].setColor(filler, pieces[nori][ni]);\n }\n }\n }\n }\n }\n this.lastPos = p;\n }\n let vismods = 0;\n for (const moveProgress of p.movesInProgress) {\n const externalMove = moveProgress.move;\n // TODO: unswizzle goes external to internal, and so does the call after that\n // and so does the stateForBlockMove call\n const unswizzled = this.stickerDat.unswizzle(externalMove);\n if (!unswizzled) {\n // bad times, but let's not throw.\n return;\n }\n\n const move = externalMove;\n let quantumTransformation: KTransformation | undefined;\n try {\n quantumTransformation = this.kpuzzle.moveToTransformation(\n move.modified({ amount: 1 }),\n );\n } catch (e) {\n // couldn't get it from a quantum of the external move. Let's try\n // getting it from a quantum of the internal move, translated back\n // to external so we can get the transformation. This happens for\n // instance when working with \"x2\" on megaminx.\n const move1 = this.stickerDat.notationMapper.notationToInternal(move);\n if (move1) {\n const move2 = this.stickerDat.notationMapper.notationToExternal(\n move1.modified({ amount: 1 }),\n );\n if (move2) {\n quantumTransformation = this.kpuzzle.moveToTransformation(move2);\n }\n }\n if (!quantumTransformation) {\n console.log(e);\n throw e;\n }\n }\n const ax = this.axesInfo[unswizzled.family];\n const turnNormal = ax.axis;\n const angle =\n (-this.ease(moveProgress.fraction) *\n moveProgress.direction *\n unswizzled.amount *\n TAU) /\n ax.order;\n this.movingObj.rotateOnAxis(turnNormal, angle);\n if (this.lastMoveTransformation !== quantumTransformation) {\n for (const orbit in this.stickers) {\n const pieces = this.stickers[orbit];\n const orin = pieces.length;\n const bmv = quantumTransformation.transformationData[orbit];\n for (let ori = 0; ori < orin; ori++) {\n const pieces2 = pieces[ori];\n for (let i = 0; i < pieces2.length; i++) {\n const p2 = pieces2[i];\n const ni = bmv.permutation[i];\n let tv = 0;\n if (ni !== i || bmv.orientationDelta[i] !== 0) {\n tv = 1;\n }\n if (tv !== p2.twistVal) {\n if (tv) {\n for (let j = p2.stickerStart; j < p2.stickerEnd; j++) {\n ind[j] |= 1;\n }\n // TODO: refactor to avoid non-null-assertion\n for (let j = p2.hintStart!; j < p2.hintEnd!; j++) {\n ind[j] |= 1;\n }\n // TODO: refactor to avoid non-null-assertion\n for (\n let j = p2.foundationStart!;\n j < p2.foundationEnd!;\n j++\n ) {\n ind[j] |= 1;\n }\n } else {\n for (let j = p2.stickerStart!; j < p2.stickerEnd; j++) {\n ind[j] &= ~1;\n }\n // TODO: refactor to avoid non-null-assertion\n for (let j = p2.hintStart!; j < p2.hintEnd!; j++) {\n ind[j] &= ~1;\n }\n // TODO: refactor to avoid non-null-assertion\n for (\n let j = p2.foundationStart!;\n j < p2.foundationEnd!;\n j++\n ) {\n ind[j] &= ~1;\n }\n }\n p2.twistVal = tv;\n vismods++;\n }\n }\n }\n }\n this.lastMoveTransformation = quantumTransformation;\n }\n }\n if (this.#pendingStickeringUpdate || vismods) {\n this.filler.makeGroups(this.fixedGeo);\n }\n if (this.#pendingStickeringUpdate || colormods) {\n if (this.textured) {\n (this.fixedGeo.getAttribute(\"uv\") as BufferAttribute).addUpdateRange(\n 0,\n 6 * this.foundationBound,\n );\n (this.fixedGeo.getAttribute(\"uv\") as BufferAttribute).needsUpdate =\n true;\n }\n if (this.#pendingStickeringUpdate || !this.textured) {\n (this.fixedGeo.getAttribute(\"color\") as BufferAttribute).addUpdateRange(\n 0,\n 9 * this.foundationBound,\n );\n (this.fixedGeo.getAttribute(\"color\") as BufferAttribute).needsUpdate =\n true;\n }\n }\n this.scheduleRenderCallback();\n this.#pendingStickeringUpdate = false;\n }\n\n private ease(fraction: number): number {\n return smootherStep(fraction);\n }\n\n private showHintFacelets(v: boolean) {\n this.showHintStickers = v;\n }\n\n private updateMaterialArrays() {\n for (let i = 0; i < 8; i++) {\n this.materialArray1[i] = invisMaterial;\n this.materialArray2[i] = invisMaterial;\n }\n this.materialArray1[0] = this.stickerMaterial;\n this.materialArray2[1] = this.stickerMaterial;\n if (this.showHintStickers) {\n this.materialArray1[2] = this.hintMaterial;\n this.materialArray2[3] = this.hintMaterial;\n } else {\n this.materialArray1[2] = invisMaterial;\n this.materialArray2[3] = invisMaterial;\n }\n if (this.showFoundations) {\n this.materialArray1[6] = foundationMaterial;\n this.materialArray2[7] = foundationMaterial;\n } else {\n this.materialArray1[6] = invisMaterial;\n this.materialArray2[7] = invisMaterial;\n }\n }\n\n private showFoundation(v: boolean) {\n this.showFoundations = v;\n }\n\n private setHintStickerOpacity(v: number): void {\n if (this.hintMaterialDisposable) {\n this.hintMaterial.dispose();\n this.hintMaterialDisposable = false;\n }\n if (v === 0) {\n this.hintMaterial = invisMaterial;\n } else if (v === 1) {\n this.hintMaterial = this.stickerMaterial;\n } else {\n this.hintMaterial = new MeshBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: v,\n });\n this.hintMaterialDisposable = true;\n }\n }\n\n public experimentalUpdateOptions(options: {\n showMainStickers?: boolean;\n hintFacelets?: HintFaceletStyle;\n showFoundation?: boolean; // TODO: better name\n hintStickerOpacity?: number;\n faceletScale?: \"auto\" | number;\n }): void {\n if (options.hintFacelets !== undefined) {\n this.showHintFacelets(options.hintFacelets !== \"none\");\n }\n if (options.showFoundation !== undefined) {\n this.showFoundation(options.showFoundation);\n }\n if (options.hintStickerOpacity !== undefined) {\n this.setHintStickerOpacity(options.hintStickerOpacity);\n }\n this.#pendingStickeringUpdate = true;\n if (this.lastPos) {\n this.onPositionChange(this.lastPos);\n }\n if (\n typeof options.faceletScale !== \"undefined\" &&\n options.faceletScale !== this.faceletScale\n ) {\n console.warn(\n \"Dynamic facelet scale is not yet supported for PG3D. For now, re-create the TwistyPlayer to change the facelet scale.\",\n );\n }\n this.updateMaterialArrays();\n this.scheduleRenderCallback();\n }\n\n private adduvs() {\n const filler = this.filler;\n if (filler.uvs) {\n return;\n }\n this.filler.uvs = new Float32Array(12 * filler.sz);\n for (const orbit in this.stickers) {\n const pieces = this.stickers[orbit];\n const orin = pieces.length;\n for (let ori = 0; ori < orin; ori++) {\n const pieces2 = pieces[ori];\n for (const piece2 of pieces2) {\n piece2.addUVs(this.filler);\n }\n }\n }\n filler.uvs!.copyWithin(6 * filler.sz, 0, 6 * filler.sz);\n const sa1 = filler.uvs!.subarray(0, 6 * filler.sz);\n this.fixedGeo.setAttribute(\"uv\", new BufferAttribute(sa1, 2, true));\n }\n\n public experimentalUpdateTexture(\n enabled: boolean,\n stickerTexture?: Texture | null,\n hintTexture?: Texture | null,\n ) {\n if (!stickerTexture) {\n enabled = false;\n }\n if (enabled && !this.filler.uvs) {\n this.adduvs();\n }\n this.textured = enabled;\n if (this.stickerMaterialDisposable) {\n this.stickerMaterial.dispose();\n this.stickerMaterialDisposable = false;\n }\n if (enabled) {\n this.stickerMaterial = new MeshBasicMaterial({\n map: stickerTexture,\n side: FrontSide,\n transparent: false,\n });\n this.stickerMaterialDisposable = true;\n } else {\n this.stickerMaterial = basicStickerMaterial;\n }\n if (this.hintMaterialDisposable) {\n this.hintMaterial.dispose();\n this.hintMaterialDisposable = false;\n }\n if (enabled) {\n this.hintMaterial = new MeshBasicMaterial({\n map: hintTexture,\n side: FrontSide,\n transparent: true,\n });\n this.hintMaterialDisposable = true;\n } else {\n this.hintMaterial = basicStickerMaterial;\n }\n if (enabled) {\n this.showHintFacelets(hintTexture !== null);\n }\n this.updateMaterialArrays();\n this.#pendingStickeringUpdate = true;\n if (this.lastPos) {\n this.onPositionChange(this.lastPos);\n }\n this.scheduleRenderCallback();\n }\n}\n", "import { cube3x3x3, type PuzzleLoader } from \"../../../puzzles/index.ts\";\nimport type { FaceletScale } from \"../../model/props/puzzle/display/FaceletScaleProp.ts\";\nimport type { HintFaceletStyle } from \"../../model/props/puzzle/display/HintFaceletProp.ts\";\nimport { Cube3D, type Cube3DOptions } from \"../../views/3D/puzzles/Cube3D.ts\";\nimport { PG3D } from \"../../views/3D/puzzles/PG3D.ts\";\n\n// TODO: figure out how to load these dynamically without a bottleneck.\nexport { PerspectiveCamera as ThreePerspectiveCamera } from \"three/src/cameras/PerspectiveCamera.js\";\nexport { Raycaster as ThreeRaycaster } from \"three/src/core/Raycaster.js\";\nexport { TextureLoader as ThreeTextureLoader } from \"three/src/loaders/TextureLoader.js\";\nexport { Spherical as ThreeSpherical } from \"three/src/math/Spherical.js\";\nexport { Vector2 as ThreeVector2 } from \"three/src/math/Vector2.js\";\nexport { Vector3 as ThreeVector3 } from \"three/src/math/Vector3.js\";\nexport { WebGLRenderer as ThreeWebGLRenderer } from \"three/src/renderers/WebGLRenderer.js\";\nexport { Scene as ThreeScene } from \"three/src/scenes/Scene.js\";\n\nexport { Cube3D } from \"../../views/3D/puzzles/Cube3D.ts\";\nexport { PG3D } from \"../../views/3D/puzzles/PG3D.ts\";\nexport { Twisty3DScene } from \"../../views/3D/Twisty3DScene.ts\";\n\nexport async function cube3DShim(\n renderCallback: () => void,\n options?: Cube3DOptions,\n): Promise<Cube3D> {\n return new Cube3D(await cube3x3x3.kpuzzle(), renderCallback, options);\n}\n\n// TODO: take loader?\nexport async function pg3dShim(\n renderCallback: () => void,\n puzzleLoader: PuzzleLoader,\n hintFacelets: HintFaceletStyle,\n faceletScale: FaceletScale,\n darkIgnoredOrbits: boolean,\n): Promise<PG3D> {\n return new PG3D(\n renderCallback,\n await puzzleLoader.kpuzzle(),\n (await puzzleLoader.pg!()).get3d({ darkIgnoredOrbits }),\n true,\n hintFacelets === \"floating\",\n undefined,\n faceletScale,\n );\n}\n", "import type { Scene as ThreeScene } from \"three/src/Three.js\";\nimport { bulk3DCode } from \"../../heavy-code-imports/3d.ts\";\nimport type { Twisty3DPuzzle } from \"./puzzles/Twisty3DPuzzle.ts\";\nimport type { Twisty3DRenderTarget } from \"./Twisty3DRenderTarget.ts\";\n\nexport class Twisty3DScene implements Twisty3DRenderTarget {\n private renderTargets: Set<Twisty3DRenderTarget> = new Set();\n public twisty3Ds: Set<Twisty3DPuzzle> = new Set();\n\n threeJSScene: Promise<ThreeScene> = (async () =>\n new (await bulk3DCode).ThreeScene())();\n\n addRenderTarget(renderTarget: Twisty3DRenderTarget): void {\n this.renderTargets.add(renderTarget);\n }\n\n scheduleRender(): void {\n for (const renderTarget of this.renderTargets) {\n renderTarget.scheduleRender();\n }\n }\n\n async addTwisty3DPuzzle(twisty3DPuzzle: Twisty3DPuzzle): Promise<void> {\n this.twisty3Ds.add(twisty3DPuzzle);\n (await this.threeJSScene).add(twisty3DPuzzle);\n // TODO: scheduleRender?\n }\n\n async removeTwisty3DPuzzle(twisty3DPuzzle: Twisty3DPuzzle): Promise<void> {\n this.twisty3Ds.delete(twisty3DPuzzle);\n (await this.threeJSScene).remove(twisty3DPuzzle);\n // TODO: scheduleRender?\n }\n\n async clearPuzzles(): Promise<void> {\n for (const puz of this.twisty3Ds) {\n (await this.threeJSScene).remove(puz);\n }\n this.twisty3Ds.clear();\n // TODO: scheduleRender?\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;AAAA,SAAS,UAAU,YAAY,iBAAiB;AAChD,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAClC,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,YAAY;;;ACdd,SAAS,aAAa,GAAmB;AAC9C,SAAO,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI;AACzC;;;ADmCA,IAAM,YAAY,IAAI,cAAc;AAEpC,IAAM,kBAAkB,IAAI,kBAAkB;AAAA,EAC5C,OAAO,IAAI,MAAM,OAAQ,EAAE,oBAAoB;AACjD,CAAC;AAED,IAAM,sBAAsB,IAAI,kBAAkB;AAAA,EAChD,OAAO,IAAI,MAAM,QAAQ,EAAE,oBAAoB;AAAA,EAC/C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAED,IAAM,oBAAoB,IAAI,kBAAkB;AAAA,EAC9C,SAAS;AACX,CAAC;AAED,IAAM,mBAAmB,IAAI,kBAAkB;AAAA,EAC7C,OAAO;AACT,CAAC;AAED,IAAM,uBAAuB,IAAI,kBAAkB;AAAA,EACjD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAED,IAAM,gCAAgC,IAAI,kBAAkB;AAAA,EAC1D,OAAO;AACT,CAAC;AAED,IAAM,oCAAoC,IAAI,kBAAkB;AAAA,EAC9D,OAAO;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAED,IAAM,kBAAkB,IAAI,kBAAkB;AAAA,EAC5C,OAAO;AACT,CAAC;AAED,IAAM,qBAAqB,IAAI,kBAAkB;AAAA,EAC/C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAUD,IAAM,WAAN,MAAe;AAAA,EAGb,YACS,QACA,OACA,OACA,UACA,kBACP,SACA;AANO;AACA;AACA;AACA;AACA;AAGP,UAAM,kBAAkB,IAAI,MAAM,KAAK,EAAE,oBAAoB;AAC7D,UAAM,qBAAqB,IAAI,MAAM,QAAQ,EAAE,oBAAoB;AAEnE,SAAK,kBAAkB;AAAA,MACrB,SAAS,IAAI,kBAAkB;AAAA,QAC7B,OAAO;AAAA,QACP,MAAM;AAAA;AAAA,MACR,CAAC;AAAA,MACD,KAAK,IAAI,kBAAkB;AAAA,QACzB,OAAO;AAAA,QACP,MAAM;AAAA;AAAA,MACR,CAAC;AAAA,MACD,UAAU;AAAA,MACV,uBAAuB;AAAA,MACvB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AACA,SAAK,sBAAsB;AAAA,MACzB,SAAS,IAAI,kBAAkB;AAAA,QAC7B,OAAO,IAAI,MAAM,SAAS,aAAa,KAAK,EAAE,oBAAoB;AAAA,QAClE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,MACD,KAAK,IAAI,kBAAkB;AAAA,QACzB,OAAO,IAAI;AAAA,UACT,SAAS,gBAAgB;AAAA,QAC3B,EAAE,oBAAoB;AAAA,QACtB,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,MACD,UAAU;AAAA,MACV,uBAAuB;AAAA,MACvB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EA9CS;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAPF;AAAA,EACA;AAiDT;AAEA,IAAM,WAAuB;AAAA,EAC3B,IAAI;AAAA,IACF,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,IACnB,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,IAAI;AAAA,IACF,IAAI,QAAQ,IAAI,GAAG,CAAC;AAAA,IACpB,IAAI,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,cAAc,QAAS;AAAA,EAC3B;AAAA,EACA,IAAI;AAAA,IACF,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,IACnB,IAAI,MAAM,GAAG,GAAG,CAAC;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,cAAc,MAAS;AAAA,EAC3B;AAAA,EACA,IAAI;AAAA,IACF,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,IACnB,IAAI,MAAM,GAAG,MAAM,GAAG,CAAC;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,cAAc,QAAS;AAAA,EAC3B;AAAA,EACA,IAAI;AAAA,IACF,IAAI,QAAQ,GAAG,GAAG,EAAE;AAAA,IACpB,IAAI,MAAM,GAAG,MAAM,GAAG,CAAC;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,cAAc,KAAS;AAAA,EAC3B;AAAA,EACA,IAAI;AAAA,IACF,IAAI,QAAQ,GAAG,IAAI,CAAC;AAAA,IACpB,IAAI,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,cAAc,SAAS;AAAA,EAC3B;AACF;AAEA,IAAM,OAAgC;AAAA,EACpC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEA,IAAM,eAAwC;AAAA,EAC5C,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AAAA,EACX,GAAG,KAAK,GAAG;AAAA,EACX,IAAI,KAAK,GAAG;AAAA,EACZ,IAAI,KAAK,GAAG;AAAA,EACZ,GAAG,KAAK,GAAG;AACb;AAEA,IAAM,kBAAkB;AAAA;AAAA,EAEtB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,6BAA6B;AAC/B;AACA,IAAM,2CAA2C;AAcjD,IAAM,wBAAuC;AAAA,EAC3C,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,4BAA4B;AAAA,EAC5B,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,8BAA8B;AAAA,EAC9B,cAAc;AAAA,EACd,uBAAuB;AACzB;AAEA,IAAM,wBAAwB;AAC9B,SAAS,gBAAgB,SAAgC;AACvD,MACE,OAAO,QAAQ,iBAAiB,eAChC,QAAQ,iBAAiB,QACzB;AACA,WAAO;AAAA,EACT;AACA,SAAO,QAAQ;AACjB;AAGA,IAAM,YAAY,IAAI,kBAAkB;AAAA,EACtC,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AACf,CAAC;AAED,IAAM,uBAAuB,IAAI,kBAAkB;AAAA,EACjD,OAAO;AAAA,EACP,SAAS;AAAA,EACT,aAAa;AACf,CAAC;AAED,IAAM,WAAN,MAAe;AAAA;AAAA,EAIb,YACS,OACP,kBACA,GACA;AAHO;AAIP,UAAM,6BACJ,OAAO,qBAAqB,WACxB,iBAAiB,MAAM,EAAE,IACzB;AACN,SAAK,eAAe,2BAA2B,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AACjE,SAAK,SAAS,IAAI,QAAQ;AAC1B,SAAK,OAAO,YAAY,mBAAmB,KAAK,CAAC;AACjD,SAAK,OAAO,YAAY,IAAI,QAAQ,EAAE,2BAA2B,CAAC,CAAC;AAAA,EACrE;AAAA,EAZS;AAAA,EAJF;AAAA,EACA;AAgBT;AAEA,SAAS,EAAE,GAAY,IAAwB;AAC7C,SAAO,IAAI,WAAW,EAAE,iBAAiB,GAAI,MAAM,KAAM,CAAC;AAC5D;AAEA,IAAM,IAAI;AAAA,EACR,GAAG,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,EACtB,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC;AAAA,EACvB,GAAG,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,EACtB,GAAG,IAAI,QAAQ,GAAG,GAAG,EAAE;AAAA,EACvB,GAAG,IAAI,QAAQ,IAAI,GAAG,CAAC;AAAA,EACvB,GAAG,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,EACtB,GAAG,IAAI,QAAQ,GAAG,GAAG,CAAC;AACxB;AAOA,IAAM,qBAA4C;AAAA,EAChD,OAAO,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,EAC1B,SAAS,IAAI,QAAQ,GAAG,GAAG,CAAC;AAAA,EAC5B,SAAS,IAAI,QAAQ,GAAG,GAAG,CAAC;AAC9B;AACA,IAAM,sBAA+C;AAAA,EACnD,OAAO,CAAC,GAAG,CAAC,EAAE;AAAA,IAAI,CAAC,MACjB,IAAI,QAAQ,EAAE;AAAA,MACZ,mBAAmB,OAAO,EAAE,MAAM,EAAE,UAAU;AAAA,MAC7C,CAAC,IAAI,MAAO;AAAA,IACf;AAAA,EACF;AAAA,EACA,SAAS,CAAC,GAAG,GAAG,CAAC,EAAE;AAAA,IAAI,CAAC,MACtB,IAAI,QAAQ,EAAE;AAAA,MACZ,mBAAmB,SAAS,EAAE,MAAM,EAAE,UAAU;AAAA,MAC/C,CAAC,IAAI,MAAO;AAAA,IACf;AAAA,EACF;AAAA,EACA,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,IAAI,CAAC,MACzB,IAAI,QAAQ,EAAE;AAAA,MACZ,mBAAmB,SAAS,EAAE,MAAM,EAAE,UAAU;AAAA,MAC/C,CAAC,IAAI,MAAO;AAAA,IACf;AAAA,EACF;AACF;AACA,IAAM,oBAAoB,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC;AAE1D,IAAM,YAAoC;AAAA,EACxC,OAAO;AAAA,IACL,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACrC,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACrC,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACrC,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACrC,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACrC,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC5D,IAAI,SAAS,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,EAC9D;AAAA,EACA,SAAS;AAAA,IACP,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACxC,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACxC,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACxC,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACxC,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC/D,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC/D,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC/D,IAAI,SAAS,WAAW,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,EACjE;AAAA,EACA,SAAS;AAAA,IACP,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACtC,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC7D,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,IACtC,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC7D,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAAA,IAC7D,IAAI,SAAS,WAAW,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;AAAA,EACxC;AACF;AAEA,IAAM,aAAa,IAAI;AAUvB,IAAM,uBAAqD;AAAA,EACzD,OAAO;AAAA,IACL;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,IAAI,CAAC;AAAA,IACX;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,IAAI,CAAC;AAAA,IACX;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,IAAI,CAAC;AAAA,MACT,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,IAAI,CAAC;AAAA,MACT,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,IAAI,CAAC;AAAA,IACX;AAAA,IACA;AAAA,MACE,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,MACR,CAAC,GAAG,GAAG,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IACV,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IACV,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IACV,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IACV,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAAA,IACX,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,EACZ;AACF;AAEA,IAAI,qCAAyD;AAC7D,SAAS,gCAA6C;AACpD,SACE,uCACC,qCAAqC,IAAI;AAAA,IACxC,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AAEJ;AAEA,SAAS,qBAAqC;AAC5C,QAAMA,KAAI,IAAI,eAAe;AAC7B,QAAM,OAAO;AACb,EAAAA,GAAE;AAAA,IACA;AAAA,IACA,IAAI;AAAA,MACF,IAAI,aAAa;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC;AAAA,QACD;AAAA,QACA,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA,CAAC;AAAA,QACD,CAAC;AAAA,QACD;AAAA,QACA;AAAA,QACA,CAAC;AAAA,QACD;AAAA,MACF,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AACA,EAAAA,GAAE;AAAA,IACA;AAAA,IACA,IAAI;AAAA,MACF,IAAI,aAAa;AAAA,QACf;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,MACvE,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAEA,SAAOA;AACT;AAEA,IAAI;AACJ,SAAS,wBAAwC;AAC/C,SAAQ,+BAA+B,mBAAmB;AAC5D;AAGO,IAAM,SAAN,cAAqB,SAAmC;AAAA,EAkC7D,YACU,SACA,wBACR,UAAyB,CAAC,GAC1B;AACA,UAAM;AAJE;AACA;AAKR,SAAK,UAAU,EAAE,GAAG,sBAAsB;AAC1C,WAAO,OAAO,KAAK,SAAS,OAAO;AAEnC,QAAI,KAAK,QAAQ,KAAK,MAAM,SAAS;AACnC,YAAM,IAAI;AAAA,QACR,kDAAkD,KAAK,QAAQ,KAAK,CAAC;AAAA,MACvE;AAAA,IACF;AAEA,QAAI,QAAQ,kBAAkB;AAC5B,WAAK,UAAU,QAAQ,gBAAgB;AAAA,IACzC;AACA,QAAI,QAAQ,YAAY;AACtB,WAAK,cAAc,QAAQ,UAAU;AAAA,IACvC;AAEA,SAAK,qBAAqB,CAAC;AAC3B,eAAW,SAAS,WAAW;AAC7B,YAAM,mBAAoC,CAAC;AAC3C,WAAK,mBAAmB,KAAK,IAAI;AACjC,WAAK,OAAO,KAAK,IAAI,UAAU,KAAK,EAAE;AAAA,QACpC,KAAK,YAAY,KAAK,MAAM,OAAO,gBAAgB;AAAA,MACrD;AAAA,IACF;AACA,SAAK,MAAM,IAAI,YAAY,YAAY,UAAU;AAGjD,QAAI,KAAK,QAAQ,4BAA4B;AAC3C,WAAK,kBAAkB,KAAK,QAAQ,0BAA0B;AAAA,IAChE;AACA,SAAK,KAAK,0BAA0B;AAEpC,QAAI,KAAK,QAAQ,cAAc;AAC7B,WAAK,4BAA4B,KAAK,QAAQ,YAAY;AAAA,IAC5D;AAEA,QAAI,OAAO,KAAK,QAAQ,uBAAuB,MAAM,aAAa;AAChE,WAAK,oBAAoB,KAAK,QAAQ;AAAA,IACxC;AAAA,EACF;AAAA,EA7CU;AAAA,EACA;AAAA,EAnCV;AAAA,EACQ,SAAiC,CAAC;AAAA,EAClC;AAAA;AAAA,EAEA,gCAAwC,CAAC;AAAA,EACzC,+BAAuC,CAAC;AAAA,EAEhD;AAAA,EACQ,SAAqC,IAAI,QAAQ,CAAC,YAAY;AACpE,SAAK,gBAAgB,CAAC,QAAsB;AAC1C,gBAAU,KAAK,KAAK,OAAO;AAAA,IAC7B;AAAA,EACF,CAAC;AAAA;AAAA;AAAA,EAID,UAAU,SAAwB;AAChC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA;AAAA,EACQ,aAAyC,IAAI,QAAQ,CAAC,YAAY;AACxE,SAAK,oBAAoB,CAAC,QAAsB;AAC9C,gBAAU,KAAK,KAAK,OAAO;AAAA,IAC7B;AAAA,EACF,CAAC;AAAA;AAAA;AAAA,EAID,cAAc,SAAwB;AACpC,SAAK,aAAa;AAAA,EACpB;AAAA,EAkDA;AAAA,EACA,6BAA6C;AAC3C,WAAQ,KAAK,oCAAoC,mBAAmB;AAAA,EACtE;AAAA,EAEA;AAAA,EACA,yBAAyB,WAA4B;AACnD,QAAI,cAAc,KAAK,mBAAmB;AACxC;AAAA,IACF;AACA,SAAK,iCAAiC;AACtC,SAAK;AAAA,MACH,OAAO,cAAc,WACjB,YACA,gBAAgB;AAAA,IACtB;AACA,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,4BAA4B;AAAA,EAC5B,0BAA0B,WAAmB;AAC3C,SAAK,2BAA2B,EAAE;AAAA,MAChC;AAAA,MACA;AAAA,MACA,YAAY,KAAK;AAAA,IACnB;AACA,SAAK,4BAA4B;AAAA,EACnC;AAAA;AAAA,EAGA,iCAAiC;AAAA;AAAA,EAEjC,MAAM,4BAA2C;AAC/C,QACE,KAAK,QAAQ,iCAAiC,UAC7C,KAAK,QAAQ,iCAAiC,YAC7C,4BAA4B,GAC9B;AACA;AAAA,IACF;AACA,UAAM,kBACJ,OAAO,KAAK,QAAQ,0BAA0B,eAC9C,KAAK,QAAQ,0BAA0B,SACnC,KAAK,QAAQ,wBACb,gBAAgB;AACtB,UAAM,mBAAmB,kBAAkB,gBAAgB;AAC3D,SAAK,0BAA0B,gBAAgB,gBAAgB;AAG/D,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAEvD,UAAM,gBAAgB,YAAY,IAAI;AAEtC,UAAM,sBAAsB;AAC5B,aAAS,KAAK,GAAW;AACvB,aAAO,KAAK,IAAI;AAAA,IAClB;AACA,UAAM,0BAA0B,MAAM;AACpC,UAAI,KAAK,gCAAgC;AACvC;AAAA,MACF;AACA,YAAM,UAAU,YAAY,IAAI,IAAI;AACpC,YAAM,WAAW,KAAK,IAAI,UAAU,qBAAqB,CAAC;AAC1D,YAAM,iBACJ,KAAK,QAAQ,IAAI,mBAAmB,gBAAgB;AACtD,WAAK,0BAA0B,cAAc;AAE7C,WAAK,yBAAyB;AAC9B,UAAI,UAAU,qBAAqB;AACjC,8BAAsB,uBAAuB;AAAA,MAC/C;AAAA,IACF;AACA,4BAAwB;AAAA,EAC1B;AAAA;AAAA;AAAA,EAIA,gCAAgC,kBAAgC;AAC9D,SAAK,gBAAgB,gBAAgB;AAAA,EACvC;AAAA;AAAA;AAAA,EAIA,oCAAoC,sBAAoC;AACtE,SAAK,oBAAoB,oBAAoB;AAAA,EAC/C;AAAA,EAEA,kBAAkB,gBAAsC;AACtD,QAAI,eAAe,qBAAqB,WAAW;AAEjD,iBAAW,cAAc,OAAO,OAAO,KAAK,kBAAkB,GAAG;AAC/D,mBAAW,gBAAgB,YAAY;AACrC,qBAAW,eAAe,cAAc;AACtC,wBAAY,QAAQ,WAAW;AAC/B,kBAAM,EAAE,YAAY,IAAI;AACxB,gBAAI,aAAa;AACf,0BAAY,WAAW;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,SAAK,QAAQ,6BAA6B;AAC1C,eAAW,CAAC,WAAW,mBAAmB,KAAK,OAAO;AAAA,MACpD,eAAe;AAAA,IACjB,GAAG;AACD,eACM,WAAW,GACf,WAAW,oBAAoB,OAAO,QACtC,YACA;AACA,cAAM,sBAAsB,oBAAoB,OAAO,QAAQ;AAC/D,YAAI,qBAAqB;AACvB,gBAAM,YAAY,KAAK,mBAAmB,SAAS,EAAE,QAAQ;AAC7D,mBACM,aAAa,GACjB,aAAa,UAAU,QACvB,cACA;AACA,kBAAM,wBACJ,oBAAoB,SAAS,UAAU;AACzC,gBAAI,uBAAuB;AACzB,oBAAM,cAAc,UAAU,UAAU;AAExC,oBAAMC,kBACJ,OAAO,0BAA0B,WAC7B,wBACA,uBAAuB;AAE7B,0BAAY,QAAQ,WAClB,SAAS,YAAY,OAAO,EAAE,gBAAgBA,eAAc;AAE9D,oBAAM,qBACJ,OAAO,0BAA0B,WAC7BA,kBACC,sBAAsB,YAAYA;AACzC,kBAAI,YAAY,aAAa;AAC3B,4BAAY,YAAY,WACtB,SAAS,YAAY,OAAO,EAAE,oBAC5B,kBACF;AAAA,cACJ;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,wBAAwB;AAC/B,WAAK,uBAAuB;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA,EAGO,0BAA0B,SAA8B;AAC7D,QAAI,sBAAsB,SAAS;AACjC,YAAM,IAAI,MAAM,eAAe;AAAA,IACjC;AAEA,UAAM,iBAAiB,QAAQ;AAC/B,QACE,OAAO,mBAAmB,eAC1B,KAAK,QAAQ,mBAAmB,gBAChC;AACA,WAAK,QAAQ,iBAAiB;AAC9B,iBAAW,cAAc,KAAK,8BAA8B;AAC1D,mBAAW,UAAU;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,eAAe,QAAQ;AAC7B,QACE,OAAO,iBAAiB,eACxB,KAAK,QAAQ,iBAAiB,gBAC9B,kBAAkB,YAAY,GAC9B;AACA,WAAK,QAAQ,eAAe;AAC5B,iBAAW,eAAe,KAAK,+BAA+B;AAC5D,oBAAY,UAAU,iBAAiB;AAAA,MACzC;AACA,WAAK,uBAAwB;AAAA,IAC/B;AAEA,UAAM,EAAE,2BAA2B,IAAI;AACvC,QAAI,OAAO,+BAA+B,aAAa;AACrD,WAAK,QAAQ,6BAA6B;AAC1C,WAAK,kBAAkB,0BAA0B;AACjD,WAAK,uBAAwB;AAAA,IAC/B;AAEA,UAAM,EAAE,aAAa,IAAI;AACzB,QAAI,OAAO,iBAAiB,aAAa;AACvC,WAAK,4BAA4B,YAAY;AAAA,IAC/C;AAEA,UAAM,EAAE,sBAAsB,IAAI;AAClC,QAAI,OAAO,0BAA0B,aAAa;AAChD,WAAK,yBAAyB,qBAAqB;AAAA,IACrD;AAAA,EACF;AAAA,EAEO,iBAAiB,GAAyB;AAC/C,UAAM,UAAU,EAAE;AAClB,eAAW,SAAS,WAAW;AAC7B,YAAM,SAAS,UAAU,KAAK;AAC9B,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAM,IAAI,QAAQ,YAAY,KAAK,EAAE,OAAO,CAAC;AAC7C,aAAK,OAAO,KAAK,EAAE,CAAC,EAAE,OAAO,KAAK,UAAU,KAAK,EAAE,CAAC,EAAE,MAAM;AAC5D,aAAK,OAAO,KAAK,EAAE,CAAC,EAAE,OAAO;AAAA,UAC3B,oBAAoB,KAAK,EAAE,QAAQ,YAAY,KAAK,EAAE,YAAY,CAAC,CAAC;AAAA,QACtE;AAAA,MACF;AACA,iBAAW,gBAAgB,EAAE,iBAAiB;AAC5C,cAAM,OAAO,aAAa;AAC1B,cAAM,aAAa,SAAS,aAAa,KAAK,MAAM,CAAC,EAAE;AACvD,cAAM,aAAa,IAAI,QAAQ,EAAE;AAAA,UAC/B;AAAA,UACC,CAAC,KAAK,KAAK,aAAa,QAAQ,IAC/B,aAAa,YACb,KAAK,SACL,MACA;AAAA,QACJ;AACA,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,gBAAM,wBAAwB,KAAK,QAAQ;AAAA,YACzC,KAAK,SAAS,EAAE,QAAQ,EAAE,CAAC;AAAA,UAC7B;AACA,gBAAM,IACJ,sBAAsB,mBAAmB,KAAK,EAAE,YAAY,CAAC;AAC/D,cACE,MAAM,KACN,sBAAsB,mBAAmB,KAAK,EAAE,iBAC9C,CACF,MAAM,GACN;AACA,kBAAM,IAAI,QAAQ,YAAY,KAAK,EAAE,OAAO,CAAC;AAC7C,iBAAK,OAAO,KAAK,EAAE,CAAC,EAAE,OAAO,YAAY,UAAU;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,SAAK,uBAAwB;AAAA,EAC/B;AAAA;AAAA;AAAA,EAIQ,YACN,OACA,eACA,OACA,eACU;AACV,UAAM,mBAAkC,CAAC;AACzC,kBAAc,KAAK,gBAAgB;AACnC,UAAM,QAAQ,IAAI,MAAM;AACxB,QAAI,KAAK,QAAQ,gBAAgB;AAC/B,YAAM,aAAa,KAAK,sBAAsB;AAC9C,YAAM,IAAI,UAAU;AACpB,WAAK,6BAA6B,KAAK,UAAU;AAAA,IACnD;AACA,aAAS,IAAI,GAAG,IAAI,MAAM,aAAa,QAAQ,KAAK;AAClD,YAAM,UAAU,KAAK;AAAA,QACnB,SAAS,kBAAkB,CAAC,CAAC;AAAA,QAC7B,SAAS,MAAM,aAAa,CAAC,CAAC;AAAA,QAC9B;AAAA,MACF;AACA,YAAM,cAA2B;AAAA,QAC/B,SAAS,MAAM,aAAa,CAAC;AAAA,QAC7B,SAAS;AAAA,MACX;AACA,YAAM,IAAI,OAAO;AACjB,UAAI,KAAK,QAAQ,iBAAiB,YAAY;AAC5C,cAAM,cAAc,KAAK;AAAA,UACvB,SAAS,kBAAkB,CAAC,CAAC;AAAA,UAC7B,SAAS,MAAM,aAAa,CAAC,CAAC;AAAA,UAC9B;AAAA,QACF;AACA,cAAM,IAAI,WAAW;AACrB,oBAAY,cAAc;AAC1B,aAAK,8BAA8B,KAAK,WAAW;AAAA,MACrD;AAEA,UACE,KAAK,QAAQ,4BAA4B,qBACvC,aACF,qBAAqB,KAAK,KAC1B,qBAAqB,KAAK,EAAE,aAAa,KACzC,qBAAqB,KAAK,EAAE,aAAa,EAAE,CAAC,GAC5C;AACA,cAAM,CAAC,QAAQ,SAAS,OAAO,IAC7B,qBAAqB,KAAK,EAAE,aAAa,EAAE,CAAC;AAC9C,cAAM,YAAY;AAChB,gBAAM,kBAAkB,OAAO,SAAkB;AAC/C,kBAAM,UAAmB,OAAO,OAC5B,KAAK,aACL,KAAK;AAET,kBAAM,OAAO,KAAK;AAAA,cAChB,SAAS,kBAAkB,CAAC,CAAC;AAAA,cAC7B,SAAS,MAAM,aAAa,CAAC,CAAC;AAAA,cAC9B;AAAA,YACF;AACA,iBAAK,WAAW,IAAI,kBAAkB;AAAA,cACpC,KAAK;AAAA,cACL,MAAM,OAAO,WAAW;AAAA,cACxB,aAAa;AAAA,YACf,CAAC;AAED,kBAAM,KAAK,UAAU;AACrB,kBAAM,MAAM,UAAU,KAAK;AAC3B,kBAAM,KAAK,UAAU;AACrB,kBAAM,MAAM,UAAU,KAAK;AAE3B,gBAAI,KAAK,IAAI,QAAQ,IAAI,EAAE;AAC3B,gBAAI,KAAK,IAAI,QAAQ,IAAI,EAAE;AAC3B,gBAAI,KAAK,IAAI,QAAQ,IAAI,EAAE;AAC3B,gBAAI,KAAK,IAAI,QAAQ,IAAI,EAAE;AAE3B,oBAAQ,QAAQ;AAAA,cACd,KAAK,GAAG;AACN,iBAAC,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;AAClC;AAAA,cACF;AAAA,cACA,KAAK,GAAG;AACN,iBAAC,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;AAClC;AAAA,cACF;AAAA,cACA,KAAK,GAAG;AACN,iBAAC,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;AAClC;AAAA,cACF;AAAA,YACF;AACA,iBAAK,SAAS;AAAA,cACZ;AAAA,cACA,IAAI;AAAA,gBACF,IAAI,aAAa;AAAA,kBACf,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,GAAG;AAAA,gBACL,CAAC;AAAA,gBACD;AAAA,cACF;AAAA,YACF;AACA,kBAAM,IAAI,IAAI;AAAA,UAChB;AAOA,eAAK,gBAAgB,IAAI;AACzB,eAAK,gBAAgB,KAAK;AAAA,QAa5B,GAAG;AAAA,MACL;AAEA,uBAAiB,KAAK,WAAW;AAAA,IACnC;AACA,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,UAAM,mBAAmB;AACzB,SAAK,IAAI,KAAK;AACd,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,wBAA8B;AACpC,UAAM,MAAM,8BAA8B;AAC1C,WAAO,IAAI;AAAA,MACT;AAAA,MACA,KAAK,QAAQ,4BAA4B,qBAAqB,YAC1D,YACA;AAAA,IACN;AAAA,EACF;AAAA,EAEQ,cACN,aACA,kBACA,QACM;AACN,UAAM,MACJ,KAAK,QAAQ,4BAA4B,qBAAqB,YAC1D,mBAAmB,IACnB,SACE,KAAK,2BAA2B,IAChC,sBAAsB;AAC9B,UAAM,cAAc,IAAI;AAAA,MACtB;AAAA,MACA,SACI,iBAAiB,oBAAoB,UACrC,iBAAiB,gBAAgB;AAAA,IACvC;AACA,gBAAY,qBAAqB,YAAY,KAAK;AAClD,gBAAY,SAAS,KAAK,YAAY,MAAM;AAE5C,UAAM,aAAa,MAAM;AACvB,UAAI,CAAC,QAAQ;AACX,eAAO,gBAAgB;AAAA,MACzB;AACA,UAAI,OAAO,KAAK,QAAQ,0BAA0B,UAAU;AAC1D,eAAO,KAAK,QAAQ;AAAA,MACtB;AACA,UACE,KAAK,QAAQ,4BAA4B,qBAAqB,WAC9D;AACA,eAAO;AAAA,MACT;AACA,aAAO,gBAAgB;AAAA,IACzB,GAAG;AACH,QAAI,QAAQ;AACV,WAAK,4BAA4B;AAAA,IACnC;AACA,UAAM,QAAQ,gBAAgB,KAAK,OAAO;AAC1C,gBAAY,MAAM,KAAK,KAAK;AAC5B,gBAAY,MAAM,KAAK,KAAK;AAC5B,gBAAY,WAAW,YAAY,CAAC;AACpC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,iCAAiC,SAAuB;AACtD,IACE,KAAK,6BAA6B,CAAC,EAAE,SACrC,UAAU;AAAA,EACd;AAAA;AAAA,EAGA,4BAA4B,cAAkC;AAC5D,SAAK,QAAQ,eAAe;AAC5B,eAAW,aAAa,OAAO,OAAO,KAAK,kBAAkB,GAAG;AAC9D,iBAAW,aAAa,WAAW;AACjC,mBAAW,eAAe,WAAW;AACnC,gBAAM,QAAQ,gBAAgB,KAAK,OAAO;AAC1C,sBAAY,QAAQ,MAAM,KAAK,KAAK;AACpC,sBAAY,QAAQ,MAAM,KAAK,KAAK;AACpC,sBAAY,aAAa,MAAM,KAAK,KAAK;AACzC,sBAAY,aAAa,MAAM,KAAK,KAAK;AAAA,QAG3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBQ,KAAK,UAA0B;AACrC,WAAO,aAAa,QAAQ;AAAA,EAC9B;AACF;;;AE/mCA,SAAS,cAAAC,aAAY,aAAAC,kBAAiB;AACtC,SAAS,mBAAAC,wBAAuB;AAChC,SAAS,kBAAAC,uBAAsB;AAC/B,SAAS,YAAAC,iBAAgB;AAEzB,SAAS,qBAAAC,0BAAyB;AAClC,SAAS,SAAAC,cAAa;AACtB,SAAS,SAAAC,cAAa;AACtB,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAAC,cAAa;AACtB,SAAS,QAAAC,aAAY;AAqBrB,IAAM,qBAAqB,IAAIC,mBAAkB;AAAA,EAC/C,MAAMC;AAAA,EACN,OAAO;AACT,CAAC;AACD,IAAM,gBAAgB,IAAID,mBAAkB;AAAA,EAC1C,SAAS;AACX,CAAC;AACD,IAAM,uBAAuB,IAAIA,mBAAkB;AAAA,EACjD,cAAc;AAChB,CAAC;AAED,SAAS,KAAK,QAAkB,GAAW,GAAmB;AAC5D,SAAO,KAAK;AAAA,IACV,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC;AAAA,IAC5B,OAAO,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,CAAC;AAAA,IACpC,OAAO,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,CAAC;AAAA,EACtC;AACF;AAEA,SAAS,QAAQ,QAAkB,GAAW,GAAW,GAAmB;AAC1E,QAAM,KAAK,KAAK,QAAQ,GAAG,CAAC;AAC5B,QAAM,KAAK,KAAK,QAAQ,GAAG,CAAC;AAC5B,QAAM,KAAK,KAAK,QAAQ,GAAG,CAAC;AAC5B,QAAM,KAAK,KAAK,KAAK,MAAM;AAC3B,SAAO,KAAK,KAAK,KAAK,IAAI,OAAO,IAAI,OAAO,IAAI,GAAG;AACrD;AAEA,SAAS,SAAS,QAA0B;AAC1C,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,OAAO,QAAQ,KAAK;AAC1C,WAAO,QAAQ,QAAQ,GAAG,GAAG,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,UAAUE,IAAuB;AACxC,QAAM,IAAI,KAAK,MAAMA,GAAE,CAAC,GAAGA,GAAE,CAAC,GAAGA,GAAE,CAAC,CAAC;AACrC,EAAAA,GAAE,CAAC,KAAK;AACR,EAAAA,GAAE,CAAC,KAAK;AACR,EAAAA,GAAE,CAAC,KAAK;AACR,SAAOA;AACT;AAEA,SAAS,MAAM,GAAa,GAAuB;AACjD,QAAMA,KAAI,IAAI,MAAc,CAAC;AAC7B,EAAAA,GAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/B,EAAAA,GAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/B,EAAAA,GAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/B,SAAOA;AACT;AAEA,SAAS,OAAO,GAAuB;AACrC,QAAM,IAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1D,QAAM,IAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1D,QAAMA,KAAI,MAAM,GAAG,CAAC;AACpB,SAAO,UAAUA,EAAC;AACpB;AAEA,SAAS,UAAUC,OAAgB,IAAsB;AACvD,QAAMD,KAAc,CAAC;AACrB,QAAM,IAAc,IAAI,MAAM,CAAC;AAC/B,QAAM,IAAc,IAAI,MAAM,CAAC;AAC/B,WAAS,OAAO,GAAG,OAAO,IAAI,QAAQ;AACpC,aAAS,IAAI,GAAG,IAAIC,MAAK,QAAQ,KAAK,GAAG;AACvC,YAAM,MAAM,IAAIA,MAAK,SAAS,KAAKA,MAAK;AACxC,YAAM,MAAM,IAAI,KAAKA,MAAK;AAC1B,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAE,CAAC,IAAIA,MAAK,KAAK,CAAC,IAAIA,MAAK,IAAI,CAAC;AAChC,UAAE,CAAC,IAAIA,MAAK,KAAK,CAAC,IAAIA,MAAK,IAAI,CAAC;AAAA,MAClC;AACA,YAAM,OAAO,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACxC,YAAM,OAAO,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACxC,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAE,CAAC,KAAK;AACR,UAAE,CAAC,KAAK;AAAA,MACV;AACA,YAAM,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAChD,YAAM,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC;AAClC,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAAD,GAAE,IAAI,CAAC,IAAIC,MAAK,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;AAAA,MAC3C;AAAA,IACF;AACA,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,QAAQ,IAAID,GAAE,QAAQ,KAAK,GAAG;AAC5C,YAAM,MAAM,IAAI,KAAKC,MAAK;AAC1B,UAAIC,KAAI;AACR,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,IAAID,MAAK,KAAK,CAAC,IAAIA,MAAK,IAAI,CAAC;AACnC,cAAM,IAAID,GAAE,KAAK,CAAC,IAAIA,GAAE,IAAI,CAAC;AAC7B,QAAAE,MAAK,IAAI;AAAA,MACX;AACA,UAAIA,MAAK,GAAG;AACV,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,MAAM;AACR,aAAOF;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACA,SAAOC;AACT;AAEA,IAAM,SAAN,MAAa;AAAA,EAOX,YACS,IACA,IACP;AAFO;AACA;AAEP,SAAK,WAAW,IAAI,aAAa,IAAI,EAAE;AACvC,SAAK,MAAM;AACX,SAAK,SAAS,IAAI,WAAW,KAAK,EAAE;AACpC,SAAK,MAAM,IAAI,WAAW,EAAE;AAC5B,SAAK,MAAM;AACX,SAAK,OAAO;AAAA,EACd;AAAA,EATS;AAAA,EACA;AAAA,EART;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAaA,IAAI,IAAc,GAAW,GAAW;AACtC,SAAK,SAAS,KAAK,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC;AACtC,SAAK,SAAS,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAC1C,SAAK,SAAS,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAC1C,SAAK,OAAO,KAAK,GAAG,IAAI,KAAK;AAC7B,SAAK,OAAO,KAAK,MAAM,CAAC,IAAK,KAAK,IAAK;AACvC,SAAK,OAAO,KAAK,MAAM,CAAC,IAAI,IAAI;AAChC,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,aAAa,IAAc,GAAW;AACpC,SAAK,SAAS,KAAK,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC;AACtC,SAAK,SAAS,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAC1C,SAAK,SAAS,KAAK,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAC1C,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,OAAO,GAAW;AAChB,SAAK,IAAI,KAAK,MAAM,IAAI;AAAA,EAC1B;AAAA,EAEA,SAAS,QAAkB,OAAe,KAAmB;AAC3D,UAAM,UAAoB;AAC1B,aAAS,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,QAAQ,KAAK;AACjD,WAAK,IAAI,SAAS,GAAG,KAAK;AAC1B,WAAK,IAAI,SAAS,GAAG,KAAK;AAC1B,WAAK,IAAI,SAAS,IAAI,GAAG,KAAK;AAC9B,WAAK,OAAO,GAAG;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,cAAc,KAAqB;AACjC,QAAI,aAAa,YAAY,IAAIE,iBAAgB,KAAK,UAAU,CAAC,CAAC;AAElE,UAAM,MAAM,KAAK,OAAO,SAAS,GAAG,IAAI,KAAK,EAAE;AAC/C,QAAI,aAAa,SAAS,IAAIA,iBAAgB,KAAK,GAAG,IAAI,CAAC;AAAA,EAC7D;AAAA,EAEA,WAAW,KAAqB;AAC9B,QAAI,YAAY;AAChB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ;AAC/B,YAAM,KAAK;AACX,YAAM,KAAK,KAAK,IAAI,EAAE;AACtB,aAAO,KAAK,IAAI,CAAC,MAAM,IAAI;AACzB;AAAA,MACF;AACA,UAAI,SAAS,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,qBAAqB;AACnB,SAAK,OAAO,WAAW,KAAK,KAAK,GAAG,KAAK,GAAG;AAAA,EAC9C;AACF;AAEA,IAAM,aAAN,MAAiB;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAA0B;AAAA,EAC3B,WAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACC;AAAA,EACA;AAAA,EACR,YACE,QACA,YACA,MACA,SAGA;AACA,SAAK,QAAQ,CAAC,CAAC,WAAW;AAC1B,SAAK,UAAU,WAAW;AAC1B,SAAK,eAAe,OAAO;AAC3B,UAAM,UAAU,IAAIC,OAAM,WAAW,KAAK,EAAE,OAAO;AACnD,SAAK,YAAY;AACjB,SAAK,0BAA0B;AAC/B,QAAI,SAAS,gBAAgB;AAC3B,WAAK,kBAAkB,QAAQ,QAAQ,cAAc;AAAA,IACvD;AACA,SAAK,YAAY;AACjB,UAAM,SAAS,KAAK,cAAc,WAAW,QAAQ,IAAI;AACzD,WAAO,SAAS,QAAQ,KAAK,WAAW,KAAK,QAAQ,IAAI,CAAC;AAC1D,SAAK,aAAa,OAAO;AAAA,EAC3B;AAAA,EAEQ,cAAc,QAAkB,MAAwB;AAC9D,WAAO,UAAU,OAAO,MAAM,GAAG,IAAI;AAAA,EACvC;AAAA,EAEQ,WACN,QACA,wBACA,MACAC,SACU;AACV,aAAS,KAAK,cAAc,QAAQ,IAAI;AACxC,IAAAA,UAASA,QAAO,MAAM;AACtB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,MAAAA,QAAO,CAAC,KAAK,MAAM;AAAA,IACrB;AACA,UAAM,UAAU,IAAI,MAAc,OAAO,MAAM;AAC/C,aAAS,IAAI,GAAG,IAAI,IAAI,OAAO,QAAQ,KAAK;AAC1C,YAAM,IAAI,OAAO,SAAS,IAAI,IAAI;AAClC,cAAQ,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAIA,QAAO,CAAC;AACzC,cAAQ,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,CAAC,IAAIA,QAAO,CAAC;AACjD,cAAQ,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI,CAAC,IAAIA,QAAO,CAAC;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,QAA4B;AACnD,UAAM,UAAU,OAAO,MAAM;AAC7B,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAQ,CAAC,IAAI,OAAO,CAAC,IAAI;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QACE,QACA,YACA,cACA,wBACA,MACAA,SACM;AACN,SAAK,YAAY,OAAO;AACxB,UAAM,SAAS,KAAK;AAAA,MAClB,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACAA;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,gBAAgB,CAAC,KAAK,QAAQ,IAAI;AAAA,IACpC;AACA,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA,EAEO,cACL,QACA,YACA,OACA;AACA,SAAK,kBAAkB,OAAO;AAC9B,UAAM,SAAS,KAAK,iBAAiB,WAAW,MAAM;AACtD,WAAO,SAAS,QAAQ,OAAO,KAAK,QAAQ,IAAI,CAAC;AACjD,SAAK,gBAAgB,OAAO;AAAA,EAC9B;AAAA,EAEQ,gBAAgB,QAAgB,cAA6B;AACnE,UAAM,OAAO,KAAK,SAAS,CAAC,eAAe,IAAI;AAE/C,aAAS,IAAI,KAAK,WAAY,IAAI,KAAK,SAAU,KAAK;AACpD,aAAO,IAAI,CAAC,IAAI,OAAQ,OAAO,IAAI,CAAC,IAAI;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,kBACE,QACA,2BACM;AACN,QAAI,IAAI;AACR,YAAQ,2BAA2B;AAAA,MACjC,KAAK,WAAW;AACd,YAAI,KAAK;AACT;AAAA,MACF;AAAA,MACA,KAAK,OAAO;AACV,YAAI,KAAK,cAAc,UAAU;AAC/B,cAAI;AAAA,QACN,OAAO;AACL,cAAI,IAAID,OAAM,KAAK,SAAS,EAAE,eAAe,GAAG,EAAE,OAAO;AAAA,QAC3D;AACA;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,YAAI;AACJ;AAAA,MACF;AAAA,MACA,KAAK,yBAAyB;AAC5B,YAAI;AACJ;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,YAAI;AACJ;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,YAAI;AACJ;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI,KAAK;AAAA,IACb;AACA,SAAK,0BAA0B;AAC/B,aAAS,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,YAAY,KAAK,GAAG;AACnE,aAAO,OAAO,OAAO,MAAM,CAAC,IAAI,KAAK;AACrC,aAAO,OAAO,OAAO,MAAM,IAAI,CAAC,IAAK,KAAK,IAAK;AAC/C,aAAO,OAAO,OAAO,MAAM,IAAI,CAAC,IAAI,IAAI;AAAA,IAC1C;AAEA,aAAS,IAAI,IAAI,KAAK,WAAY,IAAI,IAAI,KAAK,SAAU,KAAK,GAAG;AAC/D,aAAO,OAAO,OAAO,MAAM,CAAC,IAAI,KAAK;AACrC,aAAO,OAAO,OAAO,MAAM,IAAI,CAAC,IAAK,KAAK,IAAK;AAC/C,aAAO,OAAO,OAAO,MAAM,IAAI,CAAC,IAAI,IAAI;AAAA,IAC1C;AACA,SAAK;AAAA,MACH;AAAA,MACA,8BAA8B,eAAe,CAAC,KAAK;AAAA,IACrD;AAAA,EACF;AAAA,EAEO,OAAO,QAAsB;AAClC,UAAM,MAAM,OAAO;AACnB,UAAM,OAAO,OAAO;AACpB,UAAM,SAAS,IAAI,MAAM,CAAC;AAC1B,aAAS,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,YAAY,KAAK;AAChE,aAAO,CAAC,IAAI,KAAK,IAAI,CAAC;AACtB,aAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC;AAC1B,aAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC;AAC1B,YAAM,KAAK,OAAO,GAAG,MAAM,KAAK,SAAS,MAAM;AAC/C,UAAI,IAAI,CAAC,IAAI,GAAG,CAAC;AACjB,UAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;AAAA,IACvB;AAEA,aAAS,IAAI,IAAI,KAAK,WAAY,IAAI,IAAI,KAAK,SAAU,KAAK;AAC5D,aAAO,CAAC,IAAI,KAAK,IAAI,CAAC;AACtB,aAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC;AAC1B,aAAO,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC;AAC1B,YAAM,KAAK,OAAO,GAAG,MAAM,KAAK,SAAS,MAAM;AAC/C,UAAI,IAAI,CAAC,IAAI,GAAG,CAAC;AACjB,UAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;AAAA,IACvB;AAAA,EACF;AAAA,EAEO,WAAW,QAAgB,IAAwB;AACxD,QAAI,KAAK,eAAe,IAAI;AAC1B,aAAO;AAAA,IACT;AACA,SAAK,aAAa;AAClB,UAAM,KAAK,IAAI,OAAO;AACtB,WAAO,IAAK;AAAA,MACV,IAAI,KAAK;AAAA,MACT,IAAI,GAAG,eAAe;AAAA,MACtB,IAAI,GAAG,aAAa;AAAA,IACtB;AACA,WAAO,IAAK;AAAA,MACV,IAAI,KAAK;AAAA;AAAA,MACT,IAAI,GAAG,YAAa;AAAA;AAAA,MACpB,IAAI,GAAG,UAAW;AAAA;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,QAAgB,IAAwB;AACtD,UAAM,IAAI,GAAG;AACb,QAAI,KAAK,cAAc,GAAG;AACxB,WAAK,YAAY;AACjB,YAAM,KAAK,OAAO;AAClB,aAAO,OAAO;AAAA,QACZ,IAAI,KAAK;AAAA,QACT,IAAI,GAAG,eAAe;AAAA,QACtB,IAAI,GAAG,aAAa;AAAA,MACtB;AACA,aAAO,OAAO;AAAA,QACZ,IAAI,KAAK;AAAA;AAAA,QACT,IAAI,GAAG,YAAa;AAAA;AAAA,QACpB,IAAI,GAAG,UAAW;AAAA;AAAA,MACpB;AACA,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,cAAN,MAAkB;AAAA,EACT;AAAA,EACC;AAAA,EACR,YAAY,SAAc,IAAmB,YAAwB;AACnE,SAAK,QAAQ,IAAIE,OAAM;AACvB,UAAM,SAAS,QAAQ;AACvB,UAAM,SAAS,IAAI,OAAO,OAAO,SAAS,IAAI,GAAG,EAAE;AACnD,aAAS,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,QAAQ,KAAK;AAC9C,aAAO,aAAa,QAAQ,CAAC;AAC7B,aAAO,aAAa,QAAQ,CAAC;AAC7B,aAAO,aAAa,QAAQ,IAAI,CAAC;AAAA,IACnC;AACA,SAAK,MAAM,IAAIC,gBAAe;AAC9B,WAAO,cAAc,KAAK,GAAG;AAC7B,UAAM,MAAM,IAAIC,MAAK,KAAK,KAAK,aAAa;AAC5C,QAAI,SAAS,aAAa,IAAI,WAAW,eAAe;AAAA,MACtD,IAAI,KAAK,QAAQ,IAAI;AAAA,IACvB;AACA,SAAK,MAAM,MAAM,UAAU,IAAI;AAC/B,SAAK,MAAM,IAAI,GAAG;AAAA,EACpB;AACF;AAEA,IAAMC,YAAN,MAAe;AAAA,EACN;AAAA,EACA;AAAA,EACP,YAAY,SAAyB;AACnC,UAAM,MAAM,QAAQ;AACpB,SAAK,OAAO,IAAIC,SAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9C,SAAK,QAAQ,QAAQ;AAAA,EACvB;AACF;AAMA,IAAM,yBAAyB;AAC/B,IAAM,WAAW;AA+BV,IAAM,OAAN,cAAmBC,UAAmC;AAAA,EAyB3D,YACU,wBACA,SACA,YACR,sBAA+B,OAC/B,wBAAiC,OACjC,yBAAiC,GACzB,eAAgC,GAChC,SAAsB,CAAC,GAC/B;AACA,UAAM;AATE;AACA;AACA;AAIA;AACA;AAGR,QAAI,WAAW,SAAS,WAAW,GAAG;AACpC,YAAM,MAAM,oDAAoD;AAAA,IAClE;AACA,SAAK,eAAe,IAAIb,mBAAkB;AAAA,MACxC,cAAc;AAAA,MACd,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AACD,SAAK,yBAAyB;AAC9B,SAAK,kBAAkB;AACvB,SAAK,4BAA4B;AACjC,SAAK,WAAW,CAAC;AACjB,UAAM,UAAU,KAAK,WAAW;AAChC,eAAW,QAAQ,SAAS;AAC1B,WAAK,SAAS,KAAK,YAAY,MAAM,IAAI,IAAIW,UAAS,IAAI;AAAA,IAC5D;AACA,UAAM,WAAW,KAAK,WAAW;AACjC,SAAK,WAAW,CAAC;AACjB,SAAK,iBAAiB,IAAI,MAAM,CAAC;AACjC,SAAK,iBAAiB,IAAI,MAAM,CAAC;AAOjC,SAAK,eAAe,mBAAmB;AACvC,0BAAsB;AACtB,QAAI,gBAAgB;AACpB,UAAM,aAAa;AACnB,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,QAAQ,OAAO,SAAS;AACtC,uBAAiB,cAAc,QAAQ;AAAA,IACzC;AACA,UAAM,SAAS,IAAI,OAAO,eAAe,WAAW,aAAa;AACjE,UAAM,QAAQ;AACd,UAAM,UAAsB,CAAC;AAC7B,QAAI,UAAU;AACd,eAAW,KAAK,WAAW,OAAO;AAChC,cAAQ,KAAK,OAAO,EAAE,MAAM,CAAC;AAC7B,iBAAW,SAAS,EAAE,MAAM;AAAA,IAC9B;AACA,UAAM,YACJ,iBAAiB,SACb,eAAe,eACf;AACN,QAAI,iBAAiB;AACrB,eAAW,WAAW,UAAU;AAC9B,UAAI,CAAC,QAAQ,OAAO;AAClB;AAAA,MACF;AAAA,IACF;AACA,UAAM,OACH,KAAK,KAAK,UAAU,cAAc,KAAK,IAAI,KAAK,KAAK,SAAS,KAAM;AACvE,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ;AACpB,YAAM,MAAM,QAAQ;AACpB,UAAI,CAAC,KAAK,SAAS,KAAK,GAAG;AACzB,aAAK,SAAS,KAAK,IAAI,CAAC;AAAA,MAC1B;AACA,UAAI,CAAC,KAAK,SAAS,KAAK,EAAE,GAAG,GAAG;AAC9B,aAAK,SAAS,KAAK,EAAE,GAAG,IAAI,CAAC;AAAA,MAC/B;AACA,YAAM,UAEF,CAAC;AACL,UAAI,OAAO,gBAAgB;AACzB,gBAAQ,iBAAiB;AAAA,UACvB,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,aAAa,IAAI,WAAW,QAAQ,SAAS,MAAM,OAAO;AAChE,WAAK,SAAS,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI;AAAA,IACnC;AAOA,SAAK,mBAAmB;AACxB,4BAAwB;AACxB,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ;AACpB,YAAM,MAAM,QAAQ;AACpB,WAAK,SAAS,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ,IAAI;AAAA,MACtB;AAAA,IACF;AACA,SAAK,kBAAkB,OAAO;AAC9B,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM,QAAQ;AACpB,YAAM,MAAM,QAAQ;AACpB,UAAI,qBAAqB;AACvB,aAAK,SAAS,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,cAAc,QAAQ,SAAS,KAAK;AAAA,MACrE;AAAA,IACF;AACA,UAAM,WAAW,IAAIF,gBAAe;AACpC,WAAO,cAAc,QAAQ;AAC7B,WAAO,WAAW,QAAQ;AAC1B,UAAM,MAAM,IAAIC,MAAK,UAAU,KAAK,cAAc;AAClD,QAAI,MAAM,IAAI,UAAU,UAAU,QAAQ;AAC1C,SAAK,IAAI,GAAG;AACZ,UAAM,OAAO,IAAIA,MAAK,UAAU,KAAK,cAAc;AACnD,SAAK,MAAM,IAAI,UAAU,UAAU,QAAQ;AAC3C,SAAK,IAAI,IAAI;AACb,UAAM,WAAW,KAAK,WAAW;AACjC,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,eAAW,WAAW,UAAU;AAC9B,YAAM,UAAU,IAAI;AAAA,QAClB;AAAA,QACA,WAAW;AAAA,QACX,KAAK;AAAA,MACP;AACA,cAAQ,MAAM,MAAM,IAAI,UAAU,UAAU,QAAQ;AACpD,WAAK,IAAI,QAAQ,KAAK;AACtB,WAAK,eAAe,KAAK,QAAQ,MAAM,SAAS,CAAC,CAAC;AAAA,IACpD;AACA,WAAO,mBAAmB;AAC1B,eAAW,WAAW,CAAC;AACvB,SAAK,qBAAqB;AAAA,EAY5B;AAAA,EA5JU;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EAhCF;AAAA,EACA;AAAA,EAEA,iBAA6B,CAAC;AAAA,EAC9B,iBAA6B,CAAC;AAAA,EAE9B;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAoB;AAAA,EACpB,mBAA4B;AAAA,EAC5B,kBAA2B;AAAA,EAC3B;AAAA,EACA;AAAA,EAER,2BAAoC;AAAA,EAiK7B,UAAgB;AACrB,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,QAAQ;AAAA,IACxB;AACA,QAAI,KAAK,2BAA2B;AAClC,WAAK,gBAAgB,QAAQ;AAC7B,WAAK,kBAAkB;AACvB,WAAK,4BAA4B;AAAA,IACnC;AACA,QAAI,KAAK,wBAAwB;AAC/B,WAAK,aAAa,QAAQ;AAC1B,WAAK,eAAe;AACpB,WAAK,yBAAyB;AAAA,IAChC;AAAA,EACF;AAAA,EAEO,gCAA4C;AACjD,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,gCAA4C;AACjD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAa,MAAqB;AAChC,QAAI;AACF,WAAK,QAAQ,qBAAqB,IAAI;AACtC,aAAO;AAAA,IACT,SAAS,GAAG;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,qBACE,OACA,iBAIsC;AACtC,QAAI,cAA2B;AAC/B,QAAI,wBAAgC;AAEpC,QAAI,SAA+B,CAAC,MAAM;AAC1C,YAAQ,gBAAgB,OAAO;AAAA,MAC7B,KAAK,eAAe;AAClB,iBAAS,CAAC,MAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAClD;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,iBAAS,CAAC,MAAY,EAAE,SAAS,EAAE,QAAQ,GAAG,EAAE,MAAM,IAAI,CAAC;AAC3D;AAAA,MACF;AAAA,IACF;AAEA,eAAW,QAAQ,KAAK,WAAW,MAAM;AACvC,YAAM,UAAU,MAAM,IAAI,IAAIE,SAAQ,GAAG,KAAK,WAAW,CAAC;AAC1D,UAAI,UAAU,uBAAuB;AACnC,cAAM,WAAW,KAAK,WAAW,eAAe;AAAA,UAC9C,OAAO,KAAK,WAAW;AAAA,QACzB;AACA,YAAI,CAAC,UAAU;AACb;AAAA,QACF;AAMA,gBAAQ,IAAI,SAAS,MAAM;AAC3B,YAAI,SAAS,WAAW,OAAO,gBAAgB,UAAU,QAAQ;AAC/D;AAAA,QACF;AACA,YAAI,KAAK,aAAa,QAAQ,GAAG;AAC/B,kCAAwB;AACxB,wBAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAEA,QAAI,gBAAgB,QAAQ;AAC1B,oBAAc,YAAY,OAAO;AAAA,IACnC;AACA,UAAM,QAAQ,KAAK,QAChB,qBAAqB,WAAW,EAChC,gBAAgB;AACnB,WAAO,EAAE,MAAM,aAAa,MAAM;AAAA,EACpC;AAAA,EAEA,kBAAkB,gBAAkD;AAClE,SAAK,OAAO,iBAAiB;AAC7B,QAAI,eAAe,qBAAqB,WAAW;AACjD,iBAAW,mBAAmB,KAAK,QAAQ,WAAW,QAAQ;AAI5D,cAAM,EAAE,WAAW,gBAAgB,IAAI;AACvC,iBAAS,WAAW,GAAG,WAAW,WAAW,YAAY;AACvD,mBAAS,aAAa,GAAG,aAAa,iBAAiB,cAAc;AACnE,kBAAM,wBAAwB;AAAA,cAC5B;AAAA,cACA,gBAAgB;AAAA,cAChB;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,kBAAM,aACJ,KAAK,SAAS,gBAAgB,SAAS,EAAE,UAAU,EAAE,QAAQ;AAC/D,gBACE,KAAK,YACL,KAAK,0BACL,0BAA0B,aAC1B;AAAA,YAEF,OAAO;AACL,yBAAW,kBAAkB,KAAK,QAAQ,qBAAqB;AAAA,YACjE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,SAAK,2BAA2B;AAChC,QAAI,KAAK,SAAS;AAChB,WAAK,iBAAiB,KAAK,OAAO;AAAA,IACpC;AAAA,EACF;AAAA,EAEO,iBAAiB,GAAyB;AAC/C,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,aAAa,IAAIE,OAAM;AAC7B,SAAK,UAAU,SAAS,KAAK,UAAU;AACvC,QAAI,YAAY;AAChB,UAAM,SAAS,KAAK;AACpB,UAAM,MAAM,OAAO;AACnB,QACE,CAAC,KAAK,WACN,KAAK,4BACL,CAAC,KAAK,QAAQ,QAAQ,YAAY,OAAO,GACzC;AACA,iBAAW,SAAS,KAAK,UAAU;AACjC,cAAM,SAAS,KAAK,SAAS,KAAK;AAClC,cAAM,OAAO,QAAQ,YAAY,KAAK;AACtC,cAAM,OAAO,OAAO;AACpB,YAAI,SAAS,GAAG;AACd,gBAAM,UAAU,OAAO,CAAC;AACxB,mBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,kBAAM,KAAK,KAAK,OAAO,CAAC;AACxB,gBAAI,KAAK,UAAU;AACjB,2BAAa,QAAQ,CAAC,EAAE,WAAW,QAAQ,QAAQ,EAAE,CAAC;AAAA,YACxD,OAAO;AACL,2BAAa,QAAQ,CAAC,EAAE,SAAS,QAAQ,QAAQ,EAAE,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,QACF,OAAO;AACL,mBAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,kBAAM,UAAU,OAAO,GAAG;AAC1B,qBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,oBAAM,QAAQ,MAAM,OAAO,KAAK,YAAY,CAAC,KAAK;AAClD,oBAAM,KAAK,KAAK,OAAO,CAAC;AACxB,kBAAI,KAAK,UAAU;AACjB,6BAAa,QAAQ,CAAC,EAAE,WAAW,QAAQ,OAAO,IAAI,EAAE,EAAE,CAAC;AAAA,cAC7D,OAAO;AACL,6BAAa,QAAQ,CAAC,EAAE,SAAS,QAAQ,OAAO,IAAI,EAAE,EAAE,CAAC;AAAA,cAC3D;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,WAAK,UAAU;AAAA,IACjB;AACA,QAAI,UAAU;AACd,eAAW,gBAAgB,EAAE,iBAAiB;AAC5C,YAAM,eAAe,aAAa;AAGlC,YAAM,aAAa,KAAK,WAAW,UAAU,YAAY;AACzD,UAAI,CAAC,YAAY;AAEf;AAAA,MACF;AAEA,YAAM,OAAO;AACb,UAAI;AACJ,UAAI;AACF,gCAAwB,KAAK,QAAQ;AAAA,UACnC,KAAK,SAAS,EAAE,QAAQ,EAAE,CAAC;AAAA,QAC7B;AAAA,MACF,SAAS,GAAG;AAKV,cAAM,QAAQ,KAAK,WAAW,eAAe,mBAAmB,IAAI;AACpE,YAAI,OAAO;AACT,gBAAM,QAAQ,KAAK,WAAW,eAAe;AAAA,YAC3C,MAAM,SAAS,EAAE,QAAQ,EAAE,CAAC;AAAA,UAC9B;AACA,cAAI,OAAO;AACT,oCAAwB,KAAK,QAAQ,qBAAqB,KAAK;AAAA,UACjE;AAAA,QACF;AACA,YAAI,CAAC,uBAAuB;AAC1B,kBAAQ,IAAI,CAAC;AACb,gBAAM;AAAA,QACR;AAAA,MACF;AACA,YAAM,KAAK,KAAK,SAAS,WAAW,MAAM;AAC1C,YAAM,aAAa,GAAG;AACtB,YAAM,QACH,CAAC,KAAK,KAAK,aAAa,QAAQ,IAC/B,aAAa,YACb,WAAW,SACX,MACF,GAAG;AACL,WAAK,UAAU,aAAa,YAAY,KAAK;AAC7C,UAAI,KAAK,2BAA2B,uBAAuB;AACzD,mBAAW,SAAS,KAAK,UAAU;AACjC,gBAAM,SAAS,KAAK,SAAS,KAAK;AAClC,gBAAM,OAAO,OAAO;AACpB,gBAAM,MAAM,sBAAsB,mBAAmB,KAAK;AAC1D,mBAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,kBAAM,UAAU,OAAO,GAAG;AAC1B,qBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,oBAAM,KAAK,QAAQ,CAAC;AACpB,oBAAM,KAAK,IAAI,YAAY,CAAC;AAC5B,kBAAI,KAAK;AACT,kBAAI,OAAO,KAAK,IAAI,iBAAiB,CAAC,MAAM,GAAG;AAC7C,qBAAK;AAAA,cACP;AACA,kBAAI,OAAO,GAAG,UAAU;AACtB,oBAAI,IAAI;AACN,2BAAS,IAAI,GAAG,cAAc,IAAI,GAAG,YAAY,KAAK;AACpD,wBAAI,CAAC,KAAK;AAAA,kBACZ;AAEA,2BAAS,IAAI,GAAG,WAAY,IAAI,GAAG,SAAU,KAAK;AAChD,wBAAI,CAAC,KAAK;AAAA,kBACZ;AAEA,2BACM,IAAI,GAAG,iBACX,IAAI,GAAG,eACP,KACA;AACA,wBAAI,CAAC,KAAK;AAAA,kBACZ;AAAA,gBACF,OAAO;AACL,2BAAS,IAAI,GAAG,cAAe,IAAI,GAAG,YAAY,KAAK;AACrD,wBAAI,CAAC,KAAK,CAAC;AAAA,kBACb;AAEA,2BAAS,IAAI,GAAG,WAAY,IAAI,GAAG,SAAU,KAAK;AAChD,wBAAI,CAAC,KAAK,CAAC;AAAA,kBACb;AAEA,2BACM,IAAI,GAAG,iBACX,IAAI,GAAG,eACP,KACA;AACA,wBAAI,CAAC,KAAK,CAAC;AAAA,kBACb;AAAA,gBACF;AACA,mBAAG,WAAW;AACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,aAAK,yBAAyB;AAAA,MAChC;AAAA,IACF;AACA,QAAI,KAAK,4BAA4B,SAAS;AAC5C,WAAK,OAAO,WAAW,KAAK,QAAQ;AAAA,IACtC;AACA,QAAI,KAAK,4BAA4B,WAAW;AAC9C,UAAI,KAAK,UAAU;AACjB,QAAC,KAAK,SAAS,aAAa,IAAI,EAAsB;AAAA,UACpD;AAAA,UACA,IAAI,KAAK;AAAA,QACX;AACA,QAAC,KAAK,SAAS,aAAa,IAAI,EAAsB,cACpD;AAAA,MACJ;AACA,UAAI,KAAK,4BAA4B,CAAC,KAAK,UAAU;AACnD,QAAC,KAAK,SAAS,aAAa,OAAO,EAAsB;AAAA,UACvD;AAAA,UACA,IAAI,KAAK;AAAA,QACX;AACA,QAAC,KAAK,SAAS,aAAa,OAAO,EAAsB,cACvD;AAAA,MACJ;AAAA,IACF;AACA,SAAK,uBAAuB;AAC5B,SAAK,2BAA2B;AAAA,EAClC;AAAA,EAEQ,KAAK,UAA0B;AACrC,WAAO,aAAa,QAAQ;AAAA,EAC9B;AAAA,EAEQ,iBAAiB,GAAY;AACnC,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,uBAAuB;AAC7B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AAAA,IAC3B;AACA,SAAK,eAAe,CAAC,IAAI,KAAK;AAC9B,SAAK,eAAe,CAAC,IAAI,KAAK;AAC9B,QAAI,KAAK,kBAAkB;AACzB,WAAK,eAAe,CAAC,IAAI,KAAK;AAC9B,WAAK,eAAe,CAAC,IAAI,KAAK;AAAA,IAChC,OAAO;AACL,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AAAA,IAC3B;AACA,QAAI,KAAK,iBAAiB;AACxB,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AAAA,IAC3B,OAAO;AACL,WAAK,eAAe,CAAC,IAAI;AACzB,WAAK,eAAe,CAAC,IAAI;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,eAAe,GAAY;AACjC,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,sBAAsB,GAAiB;AAC7C,QAAI,KAAK,wBAAwB;AAC/B,WAAK,aAAa,QAAQ;AAC1B,WAAK,yBAAyB;AAAA,IAChC;AACA,QAAI,MAAM,GAAG;AACX,WAAK,eAAe;AAAA,IACtB,WAAW,MAAM,GAAG;AAClB,WAAK,eAAe,KAAK;AAAA,IAC3B,OAAO;AACL,WAAK,eAAe,IAAId,mBAAkB;AAAA,QACxC,cAAc;AAAA,QACd,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AACD,WAAK,yBAAyB;AAAA,IAChC;AAAA,EACF;AAAA,EAEO,0BAA0B,SAMxB;AACP,QAAI,QAAQ,iBAAiB,QAAW;AACtC,WAAK,iBAAiB,QAAQ,iBAAiB,MAAM;AAAA,IACvD;AACA,QAAI,QAAQ,mBAAmB,QAAW;AACxC,WAAK,eAAe,QAAQ,cAAc;AAAA,IAC5C;AACA,QAAI,QAAQ,uBAAuB,QAAW;AAC5C,WAAK,sBAAsB,QAAQ,kBAAkB;AAAA,IACvD;AACA,SAAK,2BAA2B;AAChC,QAAI,KAAK,SAAS;AAChB,WAAK,iBAAiB,KAAK,OAAO;AAAA,IACpC;AACA,QACE,OAAO,QAAQ,iBAAiB,eAChC,QAAQ,iBAAiB,KAAK,cAC9B;AACA,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AACA,SAAK,qBAAqB;AAC1B,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,SAAS;AACf,UAAM,SAAS,KAAK;AACpB,QAAI,OAAO,KAAK;AACd;AAAA,IACF;AACA,SAAK,OAAO,MAAM,IAAI,aAAa,KAAK,OAAO,EAAE;AACjD,eAAW,SAAS,KAAK,UAAU;AACjC,YAAM,SAAS,KAAK,SAAS,KAAK;AAClC,YAAM,OAAO,OAAO;AACpB,eAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,cAAM,UAAU,OAAO,GAAG;AAC1B,mBAAW,UAAU,SAAS;AAC5B,iBAAO,OAAO,KAAK,MAAM;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AACA,WAAO,IAAK,WAAW,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,EAAE;AACtD,UAAM,MAAM,OAAO,IAAK,SAAS,GAAG,IAAI,OAAO,EAAE;AACjD,SAAK,SAAS,aAAa,MAAM,IAAIK,iBAAgB,KAAK,GAAG,IAAI,CAAC;AAAA,EACpE;AAAA,EAEO,0BACL,SACA,gBACA,aACA;AACA,QAAI,CAAC,gBAAgB;AACnB,gBAAU;AAAA,IACZ;AACA,QAAI,WAAW,CAAC,KAAK,OAAO,KAAK;AAC/B,WAAK,OAAO;AAAA,IACd;AACA,SAAK,WAAW;AAChB,QAAI,KAAK,2BAA2B;AAClC,WAAK,gBAAgB,QAAQ;AAC7B,WAAK,4BAA4B;AAAA,IACnC;AACA,QAAI,SAAS;AACX,WAAK,kBAAkB,IAAIL,mBAAkB;AAAA,QAC3C,KAAK;AAAA,QACL,MAAMe;AAAA,QACN,aAAa;AAAA,MACf,CAAC;AACD,WAAK,4BAA4B;AAAA,IACnC,OAAO;AACL,WAAK,kBAAkB;AAAA,IACzB;AACA,QAAI,KAAK,wBAAwB;AAC/B,WAAK,aAAa,QAAQ;AAC1B,WAAK,yBAAyB;AAAA,IAChC;AACA,QAAI,SAAS;AACX,WAAK,eAAe,IAAIf,mBAAkB;AAAA,QACxC,KAAK;AAAA,QACL,MAAMe;AAAA,QACN,aAAa;AAAA,MACf,CAAC;AACD,WAAK,yBAAyB;AAAA,IAChC,OAAO;AACL,WAAK,eAAe;AAAA,IACtB;AACA,QAAI,SAAS;AACX,WAAK,iBAAiB,gBAAgB,IAAI;AAAA,IAC5C;AACA,SAAK,qBAAqB;AAC1B,SAAK,2BAA2B;AAChC,QAAI,KAAK,SAAS;AAChB,WAAK,iBAAiB,KAAK,OAAO;AAAA,IACpC;AACA,SAAK,uBAAuB;AAAA,EAC9B;AACF;;;ACvnCA,SAA8B,yBAA8B;AAC5D,SAAsB,iBAAsB;AAC5C,SAA0B,iBAAjBC,sBAA2C;AACpD,SAAsB,iBAAsB;AAC5C,SAAoB,WAAXC,gBAA+B;AACxC,SAAoB,WAAXC,gBAA+B;AACxC,SAA0B,qBAA0B;AACpD,SAAkB,aAAkB;;;ACT7B,IAAM,gBAAN,MAAoD;AAAA,EACjD,gBAA2C,oBAAI,IAAI;AAAA,EACpD,YAAiC,oBAAI,IAAI;AAAA,EAEhD,gBAAqC,YACnC,KAAK,MAAM,YAAY,WAAW,GAAG;AAAA,EAEvC,gBAAgB,cAA0C;AACxD,SAAK,cAAc,IAAI,YAAY;AAAA,EACrC;AAAA,EAEA,iBAAuB;AACrB,eAAW,gBAAgB,KAAK,eAAe;AAC7C,mBAAa,eAAe;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,gBAA+C;AACrE,SAAK,UAAU,IAAI,cAAc;AACjC,KAAC,MAAM,KAAK,cAAc,IAAI,cAAc;AAAA,EAE9C;AAAA,EAEA,MAAM,qBAAqB,gBAA+C;AACxE,SAAK,UAAU,OAAO,cAAc;AACpC,KAAC,MAAM,KAAK,cAAc,OAAO,cAAc;AAAA,EAEjD;AAAA,EAEA,MAAM,eAA8B;AAClC,eAAW,OAAO,KAAK,WAAW;AAChC,OAAC,MAAM,KAAK,cAAc,OAAO,GAAG;AAAA,IACtC;AACA,SAAK,UAAU,MAAM;AAAA,EAEvB;AACF;;;ADrBA,eAAsB,WACpB,gBACA,SACiB;AACjB,SAAO,IAAI,OAAO,MAAM,UAAU,QAAQ,GAAG,gBAAgB,OAAO;AACtE;AAGA,eAAsB,SACpB,gBACA,cACA,cACA,cACA,mBACe;AACf,SAAO,IAAI;AAAA,IACT;AAAA,IACA,MAAM,aAAa,QAAQ;AAAA,KAC1B,MAAM,aAAa,GAAI,GAAG,MAAM,EAAE,kBAAkB,CAAC;AAAA,IACtD;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
+
"names": ["r", "stickeringMask", "DoubleSide", "FrontSide", "BufferAttribute", "BufferGeometry", "Object3D", "MeshBasicMaterial", "Color", "Euler", "Vector3", "Group", "Mesh", "MeshBasicMaterial", "DoubleSide", "r", "face", "t", "BufferAttribute", "Color", "normal", "Group", "BufferGeometry", "Mesh", "AxisInfo", "Vector3", "Object3D", "Euler", "FrontSide", "TextureLoader", "Vector2", "Vector3"]
|
|
7
|
+
}
|
|
@@ -2,10 +2,11 @@ import { Tagged } from "type-fest";
|
|
|
2
2
|
import { Object3D, PerspectiveCamera, Raycaster, Scene, Texture, WebGLRenderer } from "three/src/Three.js";
|
|
3
3
|
|
|
4
4
|
//#region src/cubing/alg/iteration.d.ts
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
type IterationDirection = (typeof IterationDirection)[keyof typeof IterationDirection];
|
|
6
|
+
declare const IterationDirection: {
|
|
7
|
+
Forwards: number;
|
|
8
|
+
Backwards: number;
|
|
9
|
+
};
|
|
9
10
|
//#endregion
|
|
10
11
|
//#region src/cubing/alg/SerializationOptions.d.ts
|
|
11
12
|
type ExperimentalNotationType = "auto" | "LGN";
|
|
@@ -487,17 +488,18 @@ declare class PGOrbitsDef {
|
|
|
487
488
|
reassemblySize(): bigint;
|
|
488
489
|
}
|
|
489
490
|
declare class PGOrbit {
|
|
491
|
+
private static ktransformationCache;
|
|
492
|
+
static e(n: number, mod: number): PGOrbit;
|
|
490
493
|
perm: number[];
|
|
491
494
|
ori: number[];
|
|
492
495
|
orimod: number;
|
|
493
|
-
private static ktransformationCache;
|
|
494
|
-
static e(n: number, mod: number): PGOrbit;
|
|
495
496
|
constructor(perm: number[], ori: number[], orimod: number);
|
|
496
497
|
mul(b: PGOrbit): PGOrbit;
|
|
497
498
|
inv(): PGOrbit;
|
|
498
499
|
equal(b: PGOrbit): boolean;
|
|
499
500
|
killOri(): this;
|
|
500
501
|
toPerm(): Perm;
|
|
502
|
+
renumberPieces(): PGOrbit;
|
|
501
503
|
identicalPieces(): number[][];
|
|
502
504
|
order(): number;
|
|
503
505
|
isIdentity(): boolean;
|
|
@@ -630,7 +632,6 @@ declare function getPuzzleGeometryByName(puzzleName: PuzzleName, options?: Puzzl
|
|
|
630
632
|
type MoveSetGeo = [string, string, string, string, number];
|
|
631
633
|
/** @category PuzzleGeometry */
|
|
632
634
|
declare class PuzzleGeometry {
|
|
633
|
-
puzzleDescription: PuzzleDescription;
|
|
634
635
|
private rotations;
|
|
635
636
|
basePlaneRotations: Quat[];
|
|
636
637
|
private basePlanes;
|
|
@@ -678,6 +679,7 @@ declare class PuzzleGeometry {
|
|
|
678
679
|
private addNotationMapper;
|
|
679
680
|
private setReidOrSpeffzOrder;
|
|
680
681
|
private options;
|
|
682
|
+
puzzleDescription: PuzzleDescription;
|
|
681
683
|
constructor(puzzleDescription: PuzzleDescription, options: PuzzleGeometryOptions);
|
|
682
684
|
private keyface;
|
|
683
685
|
private keyface2;
|
|
@@ -712,6 +714,7 @@ declare class PuzzleGeometry {
|
|
|
712
714
|
private getOrientationRotation;
|
|
713
715
|
private getInitial3DRotation;
|
|
714
716
|
private generate2dmapping;
|
|
717
|
+
generateUserFriendly2D(w: number, h: number, trim: number): ((fn: number, q: Quat) => number[]) | null;
|
|
715
718
|
generatesvg(w?: number, h?: number, trim?: number, threed?: boolean): string;
|
|
716
719
|
get3d(options?: {
|
|
717
720
|
stickerColors?: string[];
|
|
@@ -723,8 +726,8 @@ declare class PuzzleGeometry {
|
|
|
723
726
|
writeSchreierSims(tw: (s: string) => void): void;
|
|
724
727
|
}
|
|
725
728
|
declare class PGNotation {
|
|
726
|
-
private pg;
|
|
727
729
|
private orbitNames;
|
|
730
|
+
private pg;
|
|
728
731
|
constructor(pg: PuzzleGeometry, od: PGOrbitsDef);
|
|
729
732
|
lookupMove(move: Move): KTransformationData | null;
|
|
730
733
|
remapKPuzzleDefinition(kpuzzleDefinition: KPuzzleDefinition): KPuzzleDefinition;
|
|
@@ -963,11 +966,12 @@ declare function schreierSims(g: Perm[], disp: (s: string) => void): bigint;
|
|
|
963
966
|
//#region src/cubing/twisty/controllers/AnimationTypes.d.ts
|
|
964
967
|
type MillisecondTimestamp = Tagged<DOMHighResTimeStamp, "MillisecondTimestamp">;
|
|
965
968
|
type MillisecondDuration = Tagged<number, "MillisecondDuration">;
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
969
|
+
type Direction = (typeof Direction)[keyof typeof Direction];
|
|
970
|
+
declare const Direction: {
|
|
971
|
+
Forwards: number;
|
|
972
|
+
Paused: number;
|
|
973
|
+
Backwards: number;
|
|
974
|
+
};
|
|
971
975
|
interface MoveInProgress {
|
|
972
976
|
move: Move;
|
|
973
977
|
direction: Direction;
|
|
@@ -977,10 +981,11 @@ type PuzzlePosition = {
|
|
|
977
981
|
pattern: KPattern;
|
|
978
982
|
movesInProgress: MoveInProgress[];
|
|
979
983
|
};
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
+
type BoundaryType = (typeof BoundaryType)[keyof typeof BoundaryType];
|
|
985
|
+
declare const BoundaryType: {
|
|
986
|
+
Move: string;
|
|
987
|
+
EntireTimeline: string;
|
|
988
|
+
};
|
|
984
989
|
interface TimeRange {
|
|
985
990
|
start: MillisecondTimestamp;
|
|
986
991
|
end: MillisecondTimestamp;
|
|
@@ -1042,8 +1047,8 @@ declare const NO_VALUE: unique symbol;
|
|
|
1042
1047
|
type NoValueType = typeof NO_VALUE;
|
|
1043
1048
|
declare abstract class TwistyPropDerived<InputTypes extends InputRecord, OutputType> extends TwistyPropParent<OutputType> {
|
|
1044
1049
|
#private;
|
|
1045
|
-
protected userVisibleErrorTracker?: UserVisibleErrorTracker
|
|
1046
|
-
constructor(parents: InputProps<InputTypes>, userVisibleErrorTracker?: UserVisibleErrorTracker
|
|
1050
|
+
protected userVisibleErrorTracker?: UserVisibleErrorTracker;
|
|
1051
|
+
constructor(parents: InputProps<InputTypes>, userVisibleErrorTracker?: UserVisibleErrorTracker);
|
|
1047
1052
|
get(): Promise<OutputType>;
|
|
1048
1053
|
protected abstract derive(input: InputTypes): PromiseOrValue<OutputType>;
|
|
1049
1054
|
}
|
|
@@ -1096,9 +1101,9 @@ interface AlgIndexer {
|
|
|
1096
1101
|
//#endregion
|
|
1097
1102
|
//#region src/cubing/twisty/controllers/indexer/SimpleAlgIndexer.d.ts
|
|
1098
1103
|
declare class SimpleAlgIndexer implements AlgIndexer {
|
|
1099
|
-
private kpuzzle;
|
|
1100
1104
|
private moves;
|
|
1101
1105
|
private durationFn;
|
|
1106
|
+
private kpuzzle;
|
|
1102
1107
|
constructor(kpuzzle: KPuzzle, alg: Alg);
|
|
1103
1108
|
getAnimLeaf(index: number): Move;
|
|
1104
1109
|
indexToMoveStartTimestamp(index: number): MillisecondTimestamp;
|
|
@@ -1112,9 +1117,9 @@ declare class SimpleAlgIndexer implements AlgIndexer {
|
|
|
1112
1117
|
//#endregion
|
|
1113
1118
|
//#region src/cubing/twisty/controllers/indexer/tree/TreeAlgIndexer.d.ts
|
|
1114
1119
|
declare class TreeAlgIndexer implements AlgIndexer {
|
|
1115
|
-
private kpuzzle;
|
|
1116
1120
|
private decoration;
|
|
1117
1121
|
private walker;
|
|
1122
|
+
private kpuzzle;
|
|
1118
1123
|
constructor(kpuzzle: KPuzzle, alg: Alg);
|
|
1119
1124
|
getAnimLeaf(index: LeafIndex): Move | null;
|
|
1120
1125
|
indexToMoveStartTimestamp(index: LeafIndex): MillisecondTimestamp;
|
|
@@ -1221,14 +1226,14 @@ declare class VisualizationFormatProp extends SimpleTwistyPropSource<Visualizati
|
|
|
1221
1226
|
//#endregion
|
|
1222
1227
|
//#region src/cubing/twisty/views/2D/TwistyAnimatedSVG.d.ts
|
|
1223
1228
|
declare class TwistyAnimatedSVG {
|
|
1224
|
-
kpuzzle: KPuzzle;
|
|
1225
|
-
private showUnknownOrientations;
|
|
1226
1229
|
wrapperElement: HTMLElement;
|
|
1227
1230
|
svgElement: SVGElement;
|
|
1228
1231
|
gradientDefs: SVGDefsElement;
|
|
1229
1232
|
private originalColors;
|
|
1230
1233
|
private gradients;
|
|
1231
1234
|
private svgID;
|
|
1235
|
+
kpuzzle: KPuzzle;
|
|
1236
|
+
private showUnknownOrientations;
|
|
1232
1237
|
constructor(kpuzzle: KPuzzle, svgSource: string, experimentalStickeringMask?: StickeringMask, showUnknownOrientations?: boolean);
|
|
1233
1238
|
drawPattern(pattern: KPattern, nextPattern?: KPattern, fraction?: number): void;
|
|
1234
1239
|
draw(pattern: KPattern, nextPattern?: KPattern, fraction?: number): void;
|
|
@@ -1265,7 +1270,7 @@ declare class CatchUpMoveProp extends SimpleTwistyPropSource<CatchUpMove> {
|
|
|
1265
1270
|
}
|
|
1266
1271
|
//#endregion
|
|
1267
1272
|
//#region src/cubing/twisty/model/props/timeline/PlayingInfoProp.d.ts
|
|
1268
|
-
type SimpleDirection = Direction.Forwards | Direction.Backwards;
|
|
1273
|
+
type SimpleDirection = typeof Direction.Forwards | typeof Direction.Backwards;
|
|
1269
1274
|
interface PlayingInfo {
|
|
1270
1275
|
playing: boolean;
|
|
1271
1276
|
direction: SimpleDirection;
|
|
@@ -1563,8 +1568,8 @@ declare class PuzzleLoaderProp extends TwistyPropDerived<PuzzleLoaderPropInputs,
|
|
|
1563
1568
|
//#endregion
|
|
1564
1569
|
//#region src/cubing/twisty/controllers/TwistyPlayerController.d.ts
|
|
1565
1570
|
declare class TwistyPlayerController {
|
|
1566
|
-
private model;
|
|
1567
1571
|
animationController: TwistyAnimationController;
|
|
1572
|
+
model: TwistyPlayerModel;
|
|
1568
1573
|
constructor(model: TwistyPlayerModel, delegate: TwistyAnimationControllerDelegate);
|
|
1569
1574
|
jumpToStart(options?: {
|
|
1570
1575
|
flash: boolean;
|
|
@@ -1630,11 +1635,11 @@ declare const buttonCommands: {
|
|
|
1630
1635
|
type ButtonCommand = keyof typeof buttonCommands;
|
|
1631
1636
|
declare class TwistyButtons extends ManagedCustomElement {
|
|
1632
1637
|
#private;
|
|
1633
|
-
model?: TwistyPlayerModel | undefined;
|
|
1634
|
-
controller?: TwistyPlayerController | undefined;
|
|
1635
|
-
private defaultFullscreenElement?;
|
|
1636
1638
|
buttons: Record<ButtonCommand, TwistyButton> | null;
|
|
1637
|
-
|
|
1639
|
+
model?: TwistyPlayerModel;
|
|
1640
|
+
controller?: TwistyPlayerController;
|
|
1641
|
+
private defaultFullscreenElement?;
|
|
1642
|
+
constructor(model?: TwistyPlayerModel, controller?: TwistyPlayerController, defaultFullscreenElement?: HTMLElement);
|
|
1638
1643
|
connectedCallback(): void;
|
|
1639
1644
|
onFullscreenButton(): Promise<void>;
|
|
1640
1645
|
update(buttonAppearances: ButtonAppearances): Promise<void>;
|
|
@@ -1833,7 +1838,6 @@ declare class OrbitCoordinatesProp extends TwistyPropDerived<OrbitCoordinatesPro
|
|
|
1833
1838
|
//#endregion
|
|
1834
1839
|
//#region src/cubing/twisty/model/TwistySceneModel.d.ts
|
|
1835
1840
|
declare class TwistySceneModel {
|
|
1836
|
-
twistyPlayerModel: TwistyPlayerModel;
|
|
1837
1841
|
background: BackgroundProp;
|
|
1838
1842
|
colorSchemeRequest: ColorSchemeRequestProp;
|
|
1839
1843
|
dragInput: DragInputProp;
|
|
@@ -1856,6 +1860,7 @@ declare class TwistySceneModel {
|
|
|
1856
1860
|
hintStickerSprite: SpriteProp;
|
|
1857
1861
|
orbitCoordinates: OrbitCoordinatesProp;
|
|
1858
1862
|
stickeringMask: StickeringMaskProp;
|
|
1863
|
+
twistyPlayerModel: TwistyPlayerModel;
|
|
1859
1864
|
constructor(twistyPlayerModel: TwistyPlayerModel);
|
|
1860
1865
|
}
|
|
1861
1866
|
//#endregion
|
|
@@ -1958,7 +1963,6 @@ interface TwistyAnimationControllerDelegate {
|
|
|
1958
1963
|
}
|
|
1959
1964
|
declare class TwistyAnimationController {
|
|
1960
1965
|
#private;
|
|
1961
|
-
private delegate;
|
|
1962
1966
|
private playing;
|
|
1963
1967
|
private direction;
|
|
1964
1968
|
private catchUpHelper;
|
|
@@ -1966,6 +1970,7 @@ declare class TwistyAnimationController {
|
|
|
1966
1970
|
private lastDatestamp;
|
|
1967
1971
|
private lastTimestampPromise;
|
|
1968
1972
|
private scheduler;
|
|
1973
|
+
private delegate;
|
|
1969
1974
|
constructor(model: TwistyPlayerModel, delegate: TwistyAnimationControllerDelegate);
|
|
1970
1975
|
onPlayingProp(playingInfo: PlayingInfo): Promise<void>;
|
|
1971
1976
|
onCatchUpMoveProp(catchUpMove: CatchUpMove): Promise<void>;
|
|
@@ -2009,13 +2014,13 @@ declare class Stats {
|
|
|
2009
2014
|
update(): void;
|
|
2010
2015
|
}
|
|
2011
2016
|
declare class StatsPanel {
|
|
2012
|
-
private name;
|
|
2013
|
-
private fg;
|
|
2014
|
-
private bg;
|
|
2015
2017
|
min: number;
|
|
2016
2018
|
max: number;
|
|
2017
2019
|
dom: HTMLCanvasElement;
|
|
2018
2020
|
context: CanvasRenderingContext2D;
|
|
2021
|
+
private name;
|
|
2022
|
+
private fg;
|
|
2023
|
+
private bg;
|
|
2019
2024
|
constructor(name: string, fg: string, bg: string);
|
|
2020
2025
|
update(value: number, maxValue: number): void;
|
|
2021
2026
|
}
|
|
@@ -2080,9 +2085,9 @@ declare class Twisty3DPuzzleWrapper extends EventTarget implements Schedulable {
|
|
|
2080
2085
|
//#region src/cubing/twisty/views/3D/Twisty3DSceneWrapper.d.ts
|
|
2081
2086
|
declare class Twisty3DSceneWrapper extends ManagedCustomElement implements Schedulable {
|
|
2082
2087
|
#private;
|
|
2083
|
-
model?: TwistyPlayerModel | undefined;
|
|
2084
2088
|
disconnect(): void;
|
|
2085
|
-
|
|
2089
|
+
model?: TwistyPlayerModel;
|
|
2090
|
+
constructor(model?: TwistyPlayerModel);
|
|
2086
2091
|
connectedCallback(): Promise<void>;
|
|
2087
2092
|
setBackView(backView: BackViewLayout): void;
|
|
2088
2093
|
onPress(e: CustomEvent<{
|
|
@@ -2102,14 +2107,14 @@ declare class Twisty3DSceneWrapper extends ManagedCustomElement implements Sched
|
|
|
2102
2107
|
//#endregion
|
|
2103
2108
|
//#region src/cubing/twisty/views/3D/TwistyOrbitControls.d.ts
|
|
2104
2109
|
declare class TwistyOrbitControls {
|
|
2105
|
-
private model;
|
|
2106
|
-
private mirror;
|
|
2107
|
-
private canvas;
|
|
2108
|
-
private dragTracker;
|
|
2109
2110
|
/** @deprecated */
|
|
2110
2111
|
experimentalInertia: boolean;
|
|
2111
2112
|
private onMovementBound;
|
|
2112
2113
|
experimentalHasBeenMoved: boolean;
|
|
2114
|
+
private model;
|
|
2115
|
+
private mirror;
|
|
2116
|
+
private canvas;
|
|
2117
|
+
private dragTracker;
|
|
2113
2118
|
constructor(model: TwistyPlayerModel, mirror: boolean, canvas: HTMLCanvasElement, dragTracker: DragTracker);
|
|
2114
2119
|
temperMovement(f: number): number;
|
|
2115
2120
|
onMove(e: CustomEvent<DragMovementInfo>): void;
|
|
@@ -2123,15 +2128,15 @@ declare class TwistyOrbitControls {
|
|
|
2123
2128
|
//#region src/cubing/twisty/views/3D/Twisty3DVantage.d.ts
|
|
2124
2129
|
declare class Twisty3DVantage extends ManagedCustomElement {
|
|
2125
2130
|
#private;
|
|
2126
|
-
private model?;
|
|
2127
|
-
private options?;
|
|
2128
2131
|
scene: Twisty3DSceneWrapper | null;
|
|
2129
2132
|
stats: Stats | null;
|
|
2130
2133
|
private rendererIsShared;
|
|
2131
2134
|
loadingElement: HTMLDivElement | null;
|
|
2132
|
-
|
|
2135
|
+
private model?;
|
|
2136
|
+
private options?;
|
|
2137
|
+
constructor(model?: TwistyPlayerModel, scene?: Twisty3DSceneWrapper, options?: {
|
|
2133
2138
|
backView?: boolean;
|
|
2134
|
-
}
|
|
2139
|
+
});
|
|
2135
2140
|
connectedCallback(): Promise<void>;
|
|
2136
2141
|
clearCanvas(): Promise<void>;
|
|
2137
2142
|
renderer(): Promise<WebGLRenderer>;
|
|
@@ -2495,8 +2500,8 @@ declare class TwistyAlgLeafElem extends HTMLElementShim {
|
|
|
2495
2500
|
setCurrentMove(current: boolean): void;
|
|
2496
2501
|
}
|
|
2497
2502
|
declare class TwistyAlgWrapperElem extends HTMLElementShim {
|
|
2498
|
-
algOrAlgNode: Alg | AlgNode;
|
|
2499
2503
|
private queue;
|
|
2504
|
+
algOrAlgNode: Alg | AlgNode;
|
|
2500
2505
|
constructor(className: string, algOrAlgNode: Alg | AlgNode);
|
|
2501
2506
|
addString(str: string): void;
|
|
2502
2507
|
addElem(dataUp: DataUp): number;
|
|
@@ -2534,13 +2539,13 @@ declare global {
|
|
|
2534
2539
|
//#region src/cubing/twisty/views/twizzle/TwizzleLink.d.ts
|
|
2535
2540
|
declare class TwizzleLink extends ManagedCustomElement {
|
|
2536
2541
|
#private;
|
|
2537
|
-
private options?;
|
|
2538
2542
|
twistyPlayer: TwistyPlayer | null;
|
|
2539
2543
|
a: HTMLAnchorElement | null;
|
|
2544
|
+
private options?;
|
|
2540
2545
|
constructor(options?: {
|
|
2541
2546
|
cdnForumTweaks?: boolean;
|
|
2542
2547
|
colorScheme?: ColorSchemeWithAuto;
|
|
2543
|
-
}
|
|
2548
|
+
});
|
|
2544
2549
|
connectedCallback(): Promise<void>;
|
|
2545
2550
|
}
|
|
2546
2551
|
declare global {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { B as KTransformation, G as KTransformationData, H as KPatternData, K as KTransformationOrbitData, R as KPattern, U as KPatternOrbitData, V as KPuzzleDefinition, W as KPuzzleOrbitDefinition, z as KPuzzle } from "../index-
|
|
1
|
+
import { B as KTransformation, G as KTransformationData, H as KPatternData, K as KTransformationOrbitData, R as KPattern, U as KPatternOrbitData, V as KPuzzleDefinition, W as KPuzzleOrbitDefinition, z as KPuzzle } from "../index-C2x6Sc62.js";
|
|
2
2
|
export { KPattern, KPatternData, KPatternOrbitData, KPuzzle, KPuzzleDefinition, KPuzzleOrbitDefinition, KTransformation, KTransformationData, KTransformationOrbitData };
|