@eyeon/map 2.0.19 → 2.0.26
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/assets/MapViewer.css +1 -1
- package/dist/assets/index.css +1 -1
- package/dist/chunks/MapViewer.js +449 -446
- package/dist/chunks/MapViewer.js.map +1 -1
- package/dist/chunks/responsive.js +967 -929
- package/dist/chunks/responsive.js.map +1 -1
- package/dist/chunks/wheelZoom.js +33 -33
- package/dist/chunks/wheelZoom.js.map +1 -1
- package/dist/core/assignment.d.ts +6 -2
- package/dist/core/assignment.d.ts.map +1 -1
- package/dist/core/index.js +185 -183
- package/dist/core/layerStyles.d.ts +19 -5
- package/dist/core/layerStyles.d.ts.map +1 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/editor/GridPrefsControl.d.ts +16 -0
- package/dist/editor/GridPrefsControl.d.ts.map +1 -0
- package/dist/editor/MapEditor.d.ts +17 -1
- package/dist/editor/MapEditor.d.ts.map +1 -1
- package/dist/editor/canvas/EditorCanvas.d.ts +5 -1
- package/dist/editor/canvas/EditorCanvas.d.ts.map +1 -1
- package/dist/editor/canvas/editorHover.d.ts +12 -0
- package/dist/editor/canvas/editorHover.d.ts.map +1 -1
- package/dist/editor/dirty.d.ts +24 -0
- package/dist/editor/dirty.d.ts.map +1 -0
- package/dist/editor/draftOps.d.ts.map +1 -1
- package/dist/editor/geometryEdit.d.ts +2 -0
- package/dist/editor/geometryEdit.d.ts.map +1 -1
- package/dist/editor/index.css +70 -4
- package/dist/editor/index.d.ts +1 -0
- package/dist/editor/index.d.ts.map +1 -1
- package/dist/editor/index.js +4326 -3923
- package/dist/editor/index.js.map +1 -1
- package/dist/editor/labels.d.ts.map +1 -1
- package/dist/editor/ortho.d.ts +20 -0
- package/dist/editor/ortho.d.ts.map +1 -0
- package/dist/editor/panels/AssignForm.d.ts.map +1 -1
- package/dist/editor/panels/EntranceIconForm.d.ts.map +1 -1
- package/dist/editor/panels/LeftRail.d.ts +1 -1
- package/dist/editor/panels/LeftRail.d.ts.map +1 -1
- package/dist/editor/railAssignments.d.ts +5 -1
- package/dist/editor/railAssignments.d.ts.map +1 -1
- package/dist/editor/railListCopy.d.ts +1 -1
- package/dist/editor/railListCopy.d.ts.map +1 -1
- package/dist/editor/routeStubs.d.ts +10 -0
- package/dist/editor/routeStubs.d.ts.map +1 -1
- package/dist/editor/shapeCopy.d.ts.map +1 -1
- package/dist/editor/tools.d.ts +12 -4
- package/dist/editor/tools.d.ts.map +1 -1
- package/dist/viewer/components/SvgVectorLayer.d.ts.map +1 -1
- package/dist/viewer/index.js +2 -2
- package/dist/viewer/pointer.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/test-maps/shops-at-south-town/BASE - Shops At South Town.ai +42 -26689
- package/dist/test-maps/shops-at-south-town/LF - Shops At South Town.ai +0 -4459
- package/dist/test-maps/shops-at-south-town/SVG/BASE - Shops At South Town.svg +0 -567
- package/dist/test-maps/shops-at-south-town/SVG/LF - Shops At South Town.svg +0 -238
- package/dist/test-maps/shops-at-south-town/SVG/escalator.svg +0 -13
- package/dist/test-maps/shops-at-south-town/UF - Shops At South Town.ai +2 -4130
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapViewer.js","sources":["../../src/viewer/ui/MapControls.tsx","../../src/fonts/mapFont.ts","../../../threejs-map/src/helpers/svgIcons.helper.ts","../../../threejs-map/src/helpers/amenities.helper.ts","../../../threejs-map/src/amenities.ts","../../src/specialIcons.ts","../../src/fonts/Montserrat-Regular.woff?url","../../src/fonts/mapFontUrl.ts","../../src/ui/selectSearch.ts","../../src/ui/ModernSelect.tsx","../../src/viewer/components/openingGeometry.ts","../../src/viewer/components/OpeningWell.tsx","../../src/viewer/pointer.ts","../../src/viewer/components/LevelMeshes.tsx","../../src/viewer/routeFloorChanges.ts","../../src/viewer/components/RouteLine.tsx","../../../../node_modules/three/examples/jsm/loaders/SVGLoader.js","../../src/viewer/components/SvgVectorLayer.tsx","../../src/viewer/camera.ts","../../src/viewer/components/CameraRig.tsx","../../src/viewer/orbitWheelZoom.ts","../../src/viewer/components/MapScene.tsx","../../src/viewer/ui/RuntimeChrome.tsx","../../src/viewer/ui/WebsiteInfoModal.tsx","../../src/viewer/ui/HoverTooltip.tsx","../../src/viewer/fetchWebsiteRetailers.ts","../../src/viewer/MapViewer.tsx"],"sourcesContent":["import React from 'react';\nimport type { StackLevel } from '../../core';\nimport {\n floorSwitcherDisplayLevels,\n hasBuildingFloors,\n hasOutdoorLevel,\n shouldShowFloorSwitcher,\n} from '../../core';\n\nexport interface MapControlLevel {\n id: number;\n name: string;\n}\n\nexport interface MapControlsProps {\n levels: Array<MapControlLevel & Partial<StackLevel>>;\n activeLevelId: number | null;\n onActiveLevelChange: (id: number) => void;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onReset: () => void;\n showFloors?: boolean;\n showZoomReset?: boolean;\n /** Override the viewer building-floor list (e.g. Edit Map + Outdoor). */\n floorOptions?: MapControlLevel[];\n /** Show the floor list even when there is only one floor. */\n alwaysShowFloors?: boolean;\n}\n\nexport function MapControls({\n levels,\n activeLevelId,\n onActiveLevelChange,\n onZoomIn,\n onZoomOut,\n onReset,\n showFloors = true,\n showZoomReset = true,\n floorOptions,\n alwaysShowFloors = false,\n}: MapControlsProps) {\n const stackLevels = levels.filter(\n (level): level is MapControlLevel & StackLevel =>\n level.kind != null &&\n level.ordering != null &&\n level.levelIndex != null,\n );\n const switcher = floorOptions ?? floorSwitcherDisplayLevels(stackLevels);\n const showFloorList =\n showFloors &&\n (alwaysShowFloors\n ? switcher.length > 0\n : shouldShowFloorSwitcher(stackLevels));\n const showZoom =\n showZoomReset &&\n (hasBuildingFloors(stackLevels) || hasOutdoorLevel(stackLevels));\n if (!showFloorList && !showZoom) return null;\n\n return (\n <div className=\"eyeon-map-controls\">\n <div className=\"eyeon-map-controls__stack\">\n {showFloorList && (\n <div className=\"eyeon-map-controls__floors\" role=\"tablist\" aria-label=\"Floors\">\n {switcher.map((level) => {\n const active = level.id === activeLevelId;\n return (\n <button\n key={level.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n className={\n active\n ? 'eyeon-map-controls__floor is-active'\n : 'eyeon-map-controls__floor'\n }\n onClick={() => onActiveLevelChange(level.id)}\n >\n {level.name}\n </button>\n );\n })}\n </div>\n )}\n\n {showZoom && (\n <>\n <button\n type=\"button\"\n className=\"eyeon-map-controls__reset\"\n onClick={onReset}\n aria-label=\"Reset map\"\n >\n Reset\n </button>\n\n <div className=\"eyeon-map-controls__zoom\">\n <button\n type=\"button\"\n className=\"eyeon-map-controls__zoom-btn\"\n onClick={onZoomOut}\n aria-label=\"Zoom out\"\n >\n −\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-controls__zoom-btn\"\n onClick={onZoomIn}\n aria-label=\"Zoom in\"\n >\n +\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","/** CSS family — same Montserrat as admin-portal / Edit Map chrome. */\nexport const MAP_FONT_FAMILY = 'Montserrat, sans-serif';\n\n/** Shared by Edit Map SVG tspans and default-map troika `<Text>`. */\nexport const MAP_LABEL_LINE_HEIGHT = 1.15;\n","const SVGIcons = {\n Entrance: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke=\"#444444\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.25 3.75h8.25A3.5 3.5 0 0 1 20 7.25v9.5a3.5 3.5 0 0 1-3.5 3.5H8.25\"/>\n <path fill=\"none\" stroke=\"#444444\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.5 12h12.35M12.2 7.85 16.4 12l-4.2 4.15\"/>\n </svg>`,\n\n Kiosk: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 443.83 787.21\">\n <path fill=\"#444444\" d=\"M451,587.7V8.14H7.14V589.5H111.43V730.89H71.27L38.59,763.58v31.78H416.36V764.93l-34.05-34H345.78V587.7ZM396.91,71.23v452.7H59.85V71.23Z\" transform=\"translate(-7.14 -8.14)\" />\n </svg>`,\n\n Escalator: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n </svg>`,\n\n EscalatorUp: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n <path fill=\"#444444\" d=\"M165.81,131.14l-56.28-74.94c-1.74-2.31-5.21-2.31-6.95,0l-56.28,74.94c-2.15,2.87-.1,6.97,3.49,6.95l41.87-.17v129.17c0,2.4,1.94,4.34,4.34,4.34h20.1c2.4,0,4.34-1.94,4.34-4.34v-129.17l41.87.17c3.59.01,5.64-4.08,3.49-6.95Z\"/>\n </svg>`,\n\n EscalatorDown: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n <path fill=\"#444444\" d=\"M165.81,194.77l-56.28,74.94c-1.74,2.31-5.21,2.31-6.95,0l-56.28-74.94c-2.15-2.87-.1-6.97,3.49-6.95l41.87.17V58.81c0-2.4,1.94-4.34,4.34-4.34h20.1c2.4,0,4.34,1.94,4.34,4.34v129.17l41.87-.17c3.59-.01,5.64,4.08,3.49,6.95Z\"/>\n </svg>`,\n\n ATM: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 577.8 577\">\n <path fill=\"#444444\" d=\"M388.7,314c-3.7-10.3-10.3-19.8-17.7-27.2c-7.4-7.4-17.7-14-29.5-19.1c-6.6-2.9-19.2-6.6-39.1-11.8V144.2 c13.3,2.2,22.8,8.1,30.2,16.2c7.4,8.1,11.8,19.9,14,35.3l39.8-5.9c-2.9-24.3-13.3-44.1-30.2-58.1c-13.3-11-31-17.7-53.8-19.8V93.4 h-24.3v18.4c-25.8,2.2-45,9.6-58.2,21.3c-19.9,17.7-29.5,39.7-29.5,67.6c0,15.5,3.7,29.4,10.3,41.9s16.2,22,28.7,28.7 c17,9.6,33.2,16.2,49.4,20.6v121.3c-14.8-1.5-28-8.8-39.1-22.8c-7.4-9.6-13.3-25-16.2-46.3l-39.1,7.4c1.5,20.6,6.6,37.5,15.5,51.5 s19.9,23.5,31.7,30.1c12.5,6.6,28,11,47.9,13.2v39v-0.1V483h22.1v-39c28-0.7,50.1-11,67.1-28.7c17-18.4,25.8-40.4,25.8-67.6 C394.6,336,392.4,324.3,388.7,314z M278.9,145.1v107.2c-17.7-5.2-30.2-11.8-37.6-20.6s-11.1-19.8-11.1-33.1c0-14,4.4-25.7,13.3-35.3 C252.2,153.9,263.7,147.4,278.9,145.1V145h0.7C279.3,145,279.1,145,278.9,145.1z M340,394.2c-9.6,11-22.1,18.4-37.6,19.8l0,0V297.9 c20.6,5.2,34.6,11.8,42,20.6c6.6,8.1,10.3,19.8,10.3,33.8C354.8,369.2,349.6,383.1,340,394.2z\" />\n <path fill=\"#444444\" d=\"M289.8,2.5c-158.7,0-288,128-288,287.2c0,158.3,129.3,287.2,288,287.2s288-128.9,288-287.2S448.6,2.5,289.8,2.5z M289.9,533.9C155,533.9,45.2,424.3,45.2,289.8C45.2,154.5,155,45.7,289.9,45.7s244.7,109.5,244.7,244.1S424.8,533.9,289.9,533.9z\" />\n </svg>`,\n\n Management: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 414.6\">\n <path fill=\"#444444\" d=\"M371.6,180.4c66.8,0,101,58.5,121.4,121.9l16.4,50.4c2.7,8.8-7.5,16.3-16.4,16.3h-56.6l-7.5-27.2 c-17.7-53.1-45-106.2-94.8-125.9c13-8.8,23.9-21.1,30.7-35.4C366.1,180.4,368.8,180.4,371.6,180.4z M441.2,145.7 c64.8,2,98.2,59.2,118.7,121.9l15.7,49.7c2.7,8.8-7.5,17.7-16.4,17.7h-35.5l-12.3-38.1c-16.4-53.1-44.3-106.2-94.8-125.9 C426.2,162.7,434.3,155.2,441.2,145.7z M51.6,334.3H16.8c-9.6,0-19.1-8.2-16.4-17.7l15.7-49.7C35.9,204.2,70.1,147.1,134.9,145 c6.1,9.5,15,18.4,24.6,24.5c-49.8,19.7-77.8,72.8-94.8,125.9L51.6,334.3L51.6,334.3z M437.7,0c35.5,0,64.8,28.6,64.8,64.7 c0,31.3-22.5,57.2-52.5,62.6c3.4-8.8,5.5-18.4,5.5-27.9c0-39.5-27.3-71.5-62.8-81C403.6,6.8,419.3,0,437.7,0L437.7,0z M137.6,0 c17.7,0,34.1,6.8,45,18.4c-35.5,9.5-62.8,41.5-62.8,81c0,9.5,2.1,19.1,5.5,27.9C96,121.9,72.8,96,72.8,64.7 C73.5,28.6,102.1,0,137.6,0L137.6,0z M287.7,0c19.8,0,37.5,8.8,49.8,22.5c-15.7,6.8-29.3,19.1-38.2,34l-3.4,5.5c-2.7,0-5.5,0-7.5,0 c-2,0-6.1,0-8.9,0l-3.4-5.5c-9.6-15-22.5-27.2-38.2-34C250.2,8.9,267.9,0,287.7,0L287.7,0z M287.7,226c66.8,0,101,58.5,122.1,121.9 l15.7,50.4c2.7,8.8-8.2,16.3-16.4,16.3H166.2c-9.6,0-19.8-8.2-16.4-16.3l15.7-50.4C186,284.6,220.8,226,287.7,226z M287.7,81 c35.5,0,64.8,28.6,64.8,64.7s-28.7,64.7-64.8,64.7c-35.5,0-64.8-28.6-64.8-64.7S252.2,81,287.7,81z M138.3,369H82.3 c-9.6,0-19.1-8.2-16.4-16.3l15.7-50.4c21.1-63.3,55.3-121.9,122.1-121.9c2.7,0,5.5,0,7.5,0c6.1,15,17.7,27.2,30.7,35.4 c-49.8,19.7-78.5,72.8-94.8,125.9C147.1,341.8,138.3,369,138.3,369z M203.8,34.7c23.9,0,44.3,12.9,55.9,31.3 c-32.1,12.2-55.9,42.9-55.9,79c0,6.1,0.7,12.2,2.1,18.4h-2.1c-35.5,0-64.8-28.6-64.8-64.7S168.3,34.7,203.8,34.7z M371.6,34.7 c35.5,0,64.8,28.6,64.8,64.7s-29.3,64-64.8,64h-2.7c2.1-6.1,2.7-12.2,2.7-18.4c0-36.8-23.9-66.7-55.9-79 C327.2,47.7,347,34.7,371.6,34.7z\" />\n </svg>`,\n\n PlayArea: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 537.9\">\n <path fill=\"#444444\" d=\"M384.3,137c38,0,68.8-30.7,68.8-68.5S422.3,0,384.3,0s-68.8,30.7-68.8,68.5S346.4,137,384.3,137z\" />\n <path fill=\"#444444\" d=\"M283.3,96c20,26.3,35.9,53.3,67.6,64.4c31.2,11.1,60.5,11.1,83.5-5.3c22.9-16.4,34.7-46.8,54.1-87.2 c18.8-40.4,34.1-48,57-48c23.5,0,31.2,28.1,30.6,39.8s-10.6,31-40,52.7c-49.4,36.3-57.6,108.3-59.4,127.7 c-1.8,19.3-2.9,50.4,17.6,169.2c20.6,118.9-20,125.9-25.3,127.1c-5.3,0.6-21.2,8.2-31.1-16.4c-10-24.6-11.8-91.3-14.1-120 c-2.9-28.7-6.5-70.9-35.9-79c-30-8.2-40.6,39.8-51.7,76.1c-10.6,36.9-40,71.4-72.3,59.1s-29.4-50.4-10-78.5 c19.4-27.5,61.7-57.4,67.6-124.1c5.9-66.8-11.8-69.1-68.2-90.8c-55.8-22.3-60.5-33.4-67.6-48.6s7.6-46.8,31.1-52.7 C239.2,55.1,259.1,63.9,283.3,96L283.3,96z\" />\n <path fill=\"#444444\" d=\"M134.7,251.7c26.9,0,48.8-21.8,48.8-48.6s-21.8-48.6-48.8-48.6s-48.8,21.8-48.8,48.6S107.7,251.7,134.7,251.7z\" />\n <path fill=\"#444444\" d=\"M204,227.8c-15.3,17.6-28.2,35.7-51.1,41.6c-22.9,6.4-43.5,4.7-58.8-8.2c-15.3-12.9-21.7-35.1-32.9-64.4S40,161,23.5,159.8 C7.1,158.7,0,178,0,186.2c-0.6,8.2,5.9,22.3,25.3,39.2C58.2,253.5,60,305.1,60,318.5c0.6,13.5-0.6,35.7-21.7,118.3 s7.1,89.6,10.6,90.8s14.7,7,22.9-10s12.9-63.8,16.5-83.7c3.5-19.9,8.2-49.8,29.4-53.9s26.5,30.4,32.3,56.8 c5.9,26.3,24.7,52.7,47.6,45.7c22.9-7,23.5-34,11.2-54.4c-12.3-20.5-40-43.9-40.6-90.8c-0.6-47.4,12.3-48,52.9-60.3 c40.6-12.3,44.7-20.5,50.5-30.4c5.9-10-2.9-33.4-18.8-38.6C237.5,201.4,222.8,206.7,204,227.8L204,227.8z\" />\n </svg>`,\n\n RestRoom: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 533.9\">\n <path fill=\"#444444\" d=\"M282.3,533.9h9.2V0h-9.2V533.9z\" />\n <path fill=\"#444444\" d=\"M118.2,97.1c25.4-4.6,41.6-30.1,34.7-55.5C146,16.2,122.9,2.3,97.4,6.9S58.1,39.3,62.8,62.4S95.1,104,118.2,97.1z\" />\n <path fill=\"#444444\" d=\"M159.8,145.6h4.6c0,0,2.3,0,2.3,2.3L183,270.4c2.3,9.2,9.2,16.2,18.5,16.2c11.6,0,18.5-9.2,18.5-20.8l-18.5-129.4 c-2.3-13.9-13.9-23.1-27.7-23.1H44.3c-13.9,0-25.4,9.2-27.7,23.1L0.4,265.8c-2.3,11.6,6.9,20.8,18.5,20.8c9.2,0,16.2-6.9,18.5-16.2 l16.2-122.5c0,0,0-2.3,2.3-2.3h4.6c0,0,2.3,0,2.3,2.3L30.4,390.6c0,0,0,2.3,2.3,2.3h37c0,0,2.3,0,2.3,2.3v117.9 c0,9.2,6.9,16.2,16.2,16.2s16.2-6.9,16.2-16.2V393c0,0,0-2.3,2.3-2.3h11.6c0,0,2.3,0,2.3,2.3v117.9c0,9.2,6.9,16.2,16.2,16.2 c9.2,0,16.2-6.9,16.2-16.2V393c0,0,0-2.3,2.3-2.3h30.1c0,0,2.3,0,2.3-2.3l-27.7-242.7l0,0l0,0L159.8,145.6z\" />\n <path fill=\"#444444\" d=\"M497.3,76.3c13.9-23.1,4.6-50.9-16.2-62.4s-50.9-6.9-64.7,16.2c-13.9,23.1-4.6,50.9,16.2,62.4 C455.7,106.3,483.5,99.4,497.3,76.3z\" />\n <path fill=\"#444444\" d=\"M545.9,113.3h-178c-13.9,0-25.4,9.2-27.7,23.1v129.4c0,11.6,9.2,20.8,20.8,20.8s18.5-9.2,18.5-20.8V159.5c0,0,0-2.3,2.3-2.3 h2.3c0,0,2.3,0,2.3,2.3l25.4,161.8v187.2c0,11.6,9.2,20.8,20.8,20.8l0,0c11.6,0,20.8-9.2,20.8-20.8V323.6c0,0,0-2.3,2.3-2.3h6.9 c0,0,2.3,0,2.3,2.3v184.9c0,11.6,9.2,20.8,20.8,20.8l0,0c11.6,0,20.8-9.2,20.8-20.8V321.3l25.4-161.8c0,0,0-2.3,2.3-2.3h-2.3 c0,0,2.3,0,2.3,2.3v106.3c0,11.6,9.2,20.8,20.8,20.8s20.8-9.2,20.8-20.8V136.4C571.4,122.5,559.8,113.3,545.9,113.3L545.9,113.3 L545.9,113.3z\" />\n </svg>`,\n\n FamilyRestRoom: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 522.5\">\n <path fill=\"#444444\" d=\"M119.8,91.5c25-5.9,40.5-30.8,34.6-55.7c-5.9-24.9-30.9-40.4-55.9-34.5S58,32,63.9,56.9S94.8,97.3,119.8,91.5z\" />\n <path fill=\"#444444\" d=\"M160.6,139.1h4.5c0.6,0,1.3,0.6,1.3,1.3l15.3,123.1c1.3,8.9,8.9,15.9,17.8,15.9c10.8,0,19.1-9.5,17.8-20.3l-15.9-128.9 c-1.9-13.3-13.4-24.1-27.4-24.1H43.4c-14,0-25.5,10.2-27.4,24.1L0.1,259.1c-1.3,10.8,7,20.3,17.8,20.3c8.9,0,16.5-7,17.8-15.9 l15.3-123.8c0-0.6,0.6-1.3,1.3-1.3h4.5c0.6,0,1.3,0.6,1.3,1.3L29.4,384.1c0,0.6,0.6,1.3,1.3,1.3H67c0.6,0,1.3,0.6,1.3,1.3v118.1 c0,9.5,7.6,16.5,16.5,16.5c9.5,0,16.5-7.6,16.5-16.5V387.3c0-0.6,0.6-1.3,1.3-1.3h10.8c0.6,0,1.3,0.6,1.3,1.3v118.1 c0,9.5,7.6,16.5,16.5,16.5c9.5,0,16.5-7.6,16.5-16.5V387.3c0-0.6,0.6-1.3,1.3-1.3h36.3c0.6,0,1.3-0.6,1.3-1.3L158,140.3 C159.3,139.7,159.9,139.1,160.6,139.1L160.6,139.1z\" />\n <path fill=\"#444444\" d=\"M498.9,69.8c12.9-22.1,5.4-50.5-16.8-63.4c-22.2-12.9-50.6-5.4-63.6,16.7c-12.9,22.1-5.4,50.5,16.8,63.4 C457.5,99.4,486,91.9,498.9,69.8z\" />\n <path fill=\"#444444\" d=\"M547.9,106.1H369.6c-14,0-25.5,10.2-27.4,24.1v128.9c0,10.8,8.9,19.7,19.7,19.7s19.7-8.9,19.7-19.7v-106 c0-0.6,0.6-1.3,1.3-1.3h2.5c0.6,0,1.3,0.6,1.3,1.3l25.5,162.5v187.3c0,10.8,8.9,19.7,19.7,19.7h0.6c10.8,0,19.7-8.9,19.7-19.7v-186 c0-0.6,0.6-1.3,1.3-1.3h10.8c0.6,0,1.3,0.6,1.3,1.3v186c0,10.8,8.9,19.7,19.7,19.7h0.6c10.8,0,19.7-8.9,19.7-19.7V315.6l25.5-162.5 c0-0.6,0.6-1.3,1.3-1.3h2.6c0.6,0,1.3,0.6,1.3,1.3v106c0,10.8,8.9,19.7,19.7,19.7s19.7-8.9,19.7-19.7V130.2 C573.4,116.2,562,106.1,547.9,106.1L547.9,106.1z\" />\n <path fill=\"#444444\" d=\"M259.6,480l19.7-19.7L251.9,433L229,455.8c-7.6,7.6-5.7,20.3,1.3,27.3l32.5,33.6c12.7,12.7,29.3-5.1,17.2-17.1L259.6,480 L259.6,480z M288.9,347.9c19.1,0,34.4-15.2,34.4-34.3s-15.3-34.3-34.4-34.3s-34.4,15.2-34.4,34.3S269.7,347.9,288.9,347.9z M369.7,405.7l-46.5-46.3c-3.8-3.8-8.3-6.3-14.7-6.3h-41.4c-6.4,0-10.8,2.5-14,6.3l-45.9,45.7c-12.7,12.7,4.5,28.6,17.2,15.9 l28-27.9v26h72.6v-26l28.6,28.6C364.6,433.6,381.8,417.1,369.7,405.7L369.7,405.7z M324.5,433l-27.4,27.3l19.7,19.7l-20.4,20.3 c-12.1,12.1,4.5,29.2,17.2,17.1l32.5-33.6c7-7,8.9-20.3,1.3-27.3C347.4,455.9,324.5,433,324.5,433z\" />\n </svg>`,\n\n Elevator: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 576\">\n <path fill=\"#444444\" d=\"M576,145.2v268.6c-0.1,1.6-0.3,3.1-0.3,4.7c-0.3,33.3-0.6,66.6-0.8,99.9c-0.1,21.1-9.7,37.2-26.7,49 c-7.7,5.4-15.9,9.3-25.9,8c-3.8-0.5-7.7-0.1-11.5-0.1c-115.3,0.1-230.6,0.2-345.9,0.3c-1.1,0-2.2,0.2-3.3,0.3h-16.9 c-1.2-0.1-2.4-0.3-3.6-0.3c-30.2-0.3-60.4-0.6-90.7-0.8c-11.1-0.1-20.7-4.1-29.1-11.2c-8.7-7.4-15.5-16.7-19.9-27.3l-0.2-0.5 c-0.7-1.6-1.1-3.4-1.2-5.4v0C0,492.8,0,455.1,0,417.4c0-124.1,0-248.1,0-372.2c0-0.2,0-0.3,0-0.5c0-1.5,0.3-2.9,0.7-4.2l0,0.1 C8.3,22.5,20.5,8.9,38.7,1c1.2-0.5,2.6-0.9,4-0.9h0c162.8,0,325.6,0,488.4,0c1.5,0,2.8,0.4,4.1,0.9l-0.1,0c3.4,1.4,6.1,2.7,8.8,4.2 l-0.4-0.2c19.7,11.2,30.9,27.8,31.3,50.8c0.4,28.2,0.6,56.3,0.8,84.5C575.7,141.8,575.8,143.5,576,145.2L576,145.2z M536.4,288.6 h0.3c0-56.7,0-113.4,0-170c0-18.2-0.4-36.4-0.7-54.6c-0.1-8-8.4-19.8-15.9-22.7c-1-0.4-2.1-0.6-3.2-0.7h0c-3.2-0.3-6.4-0.6-9.5-0.6 c-25.5-0.4-51-0.9-76.6-1c-96.4-0.2-192.7-0.4-289.1-0.4c-22.9,0-45.8,0.1-68.7,0.3c-3.4,0-6.8,0.1-10,0.9 c-9.9,2.3-17.1,8.3-21.7,17.3c-1,1.9-2,3.9-2.1,5.9c-0.1,149.8-0.1,299.6-0.1,449.4c0,0.9-0.1,2,0.3,2.7c2.7,4.2,5.1,8.6,8.3,12.3 c5.6,6.3,13.2,8.4,21.6,8.4c23.7,0.1,47.5,0.6,71.2,0.6c123.5,0,247,0,370.5,0c0.1,0,0.2,0,0.3,0c1.1,0,2.1-0.2,3-0.6l-0.1,0 c8.3-3.5,15.4-8.4,20.2-16.3c1.2-1.8,2-4.1,2-6.5l0,0C536.4,438.2,536.4,363.4,536.4,288.6L536.4,288.6z\" />\n <path fill=\"#444444\" d=\"M307,277.5l75.9,68.4l0.9-0.2V150.9h49.7v194.8l1,0.3l78.2-67.4c0.1,1,0.2,1.7,0.3,2.4c0.3,19.9,0.6,39.8,0.8,59.7 c0,0,0,0,0,0.1c0,1.4-0.5,2.6-1.4,3.6l0,0c-34.1,32.7-68.2,65.3-102.3,97.9c-0.3,0.3-0.6,0.5-1,0.9c-0.6-0.5-1.3-1-1.9-1.5 c-32.7-30.7-65.5-61.4-98.2-92c-1.4-1.2-2.3-3-2.3-5c0-0.1,0-0.3,0-0.4v0c0.2-20.9,0.3-41.9,0.4-62.8C307,280.5,307,279.4,307,277.5 L307,277.5z\" />\n <path fill=\"#444444\" d=\"M142.2,234.5L67,301.8c-0.1-1.2-0.3-1.9-0.3-2.7c-0.3-20.7-0.7-41.5-1-62.2c0-1.3,0.5-2.5,1.3-3.4l0,0 c33.3-31.4,66.7-62.8,100.1-94.1c0.3-0.3,0.6-0.5,1-0.8c5.9,5.7,11.8,11.3,17.7,16.9c28.1,26.9,56.2,53.9,84.3,80.9 c0.9,0.8,1.4,2,1.5,3.3v0c-0.5,20.2-1.1,40.3-1.6,60.5c0,0.3-0.1,0.7-0.2,1.7l-77.4-67.1l-0.9,0.1v193.9h-48.3v-194L142.2,234.5z\" />\n </svg>`,\n\n Security: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 597.6\">\n <path fill=\"#444444\" d=\"M554,80.7L298.5,1.5c-6.6-2-13.2-2-19.9,0L23.2,80.7C9.3,84.7,0,97.9,0,112.4c0,352.5,178.7,436.4,274,481.9 c4.6,2,9.3,3.3,13.9,3.3c4.6,0,9.9-1.3,13.9-3.3c96-45.5,274-129.4,274-481.9C577.2,97.9,567.9,85.3,554,80.7z M288.6,527.6 C197.2,484.1,73.5,411.4,66.2,136.2l222.4-68.6L511,136.8C503.7,412.1,379.3,484.1,288.6,527.6z\" />\n <path fill=\"#444444\" d=\"M278.7,152l-26.5,87.1l-90.7-2.6c-4.6,0-8.6,2.6-9.9,7.3c-1.3,4.6,0,9.2,4,11.9l74.8,51.5L200.6,393c-1.3,4.6,0,9.2,4,11.9 c4,2.6,8.6,2.6,12.6,0l72.1-54.8l72.1,54.8c4,2.6,8.6,2.6,12.6,0c4-2.6,5.3-7.3,4-11.9l-29.8-85.8l74.8-51.5c4-2.6,5.3-7.3,4-11.9 c-1.3-4.6-5.3-7.3-9.9-7.3l-90.7,2l-26.5-87.1c-1.3-4.6-5.3-7.3-9.9-7.3C283.9,144.1,280,147.4,278.7,152L278.7,152z\" />\n </svg>`,\n\n ChildStroller: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 432 370.06\">\n <path fill=\"#444444\" d=\"M130.29,178.61l-42.67,34L33.24,254.13c-15.48,12.09-28.32-2.64-28.32-2.64-12.08-15.86,1.89-26.06,1.89-26.06l68-53.24s7.55-7.93,26.81-2.26l28.7,8.68\"/>\n <path fill=\"#444444\" d=\"M210,111A38.52,38.52,0,1,1,248.48,72.5,38.68,38.68,0,0,1,210,111\"/>\n <path fill=\"#444444\" d=\"M390.84,0a42.88,42.88,0,0,0-24.92,8.31L80.44,235.63a43.71,43.71,0,0,0-13.59,22.28,40.67,40.67,0,0,0,1.89,23.41,47.9,47.9,0,0,0-22.28,41.16A47.58,47.58,0,1,0,94,274.9,41.43,41.43,0,0,0,84.22,276a22.77,22.77,0,0,1-1.51-14.35,25.82,25.82,0,0,1,8.68-13.59l17.37-14,88,29.08a33.54,33.54,0,0,0,42.67-21.53l1.51-4.91,18.88,45.32a47.09,47.09,0,0,0-22.28,40.4,47.58,47.58,0,1,0,47.58-47.58,41.43,41.43,0,0,0-9.82,1.13l-26.43-62.68,43.8-126.12,83.08-66.08a23.7,23.7,0,0,1,15.1-5.29,25.3,25.3,0,0,1,25.3,25.3,25.72,25.72,0,0,1-10.2,20.39,8,8,0,0,0,10.58,12.08A41.37,41.37,0,0,0,390.84,0ZM93.66,301.33A20.77,20.77,0,1,1,72.89,322.1,20.71,20.71,0,0,1,93.66,301.33Zm191.07,0A20.77,20.77,0,1,1,264,322.1,20.71,20.71,0,0,1,284.73,301.33Z\"/>\n </svg>`,\n\n VendingMachine: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 594\">\n <circle fill=\"#444444\" cx=\"324\" cy=\"175.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"175.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"324\" cy=\"243\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"243\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"324\" cy=\"310.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"310.5\" r=\"13.5\"/>\n <path fill=\"#444444\" d=\"M216,94.5H67.5C59.4,94.5,54,99.9,54,108c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,99.9,224.1,94.5,216,94.5z\"/>\n <path fill=\"#444444\" d=\"M216,162H67.5c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,167.4,224.1,162,216,162z\"/>\n <path fill=\"#444444\" d=\"M216,229.5H67.5c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,234.9,224.1,229.5,216,229.5z\"/>\n <path fill=\"#444444\" d=\"M216,297H67.5c-8.1,0-13.5,5.4-13.5,13.5S59.4,324,67.5,324H216c8.1,0,13.5-5.4,13.5-13.5S224.1,297,216,297z\"/>\n <path fill=\"#444444\" d=\"M391.5,0H324c-8.1,0-13.5,5.4-13.5,13.5S315.9,27,324,27h67.5c8.1,0,13.5,5.4,13.5,13.5V567H27V40.5 C27,32.4,32.4,27,40.5,27h216v499.5c0,8.1,5.4,13.5,13.5,13.5s13.5-5.4,13.5-13.5v-513C283.5,5.4,278.1,0,270,0H40.5 C17.5,0,0,17.5,0,40.5v540c0,8.1,5.4,13.5,13.5,13.5h405c8.1,0,13.5-5.4,13.5-13.5v-540C432,17.5,414.5,0,391.5,0z\"/>\n <path fill=\"#444444\" d=\"M364.5,94.5H324c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5h40.5c8.1,0,13.5-5.4,13.5-13.5 C378,99.9,372.6,94.5,364.5,94.5z\"/>\n <path fill=\"#444444\" d=\"M216,432H67.5c-8.1,0-13.5,5.4-13.5,13.5V513c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5v-67.5 C229.5,437.4,224.1,432,216,432z M81,499.5V459h121.5v40.5H81z\"/>\n </svg>`,\n\n Stairs: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 448.5\">\n <path fill=\"#444444\" d=\"M432,243.3h-81.7v33.1h-72.2v33.1h-72.2v33.1h-72.2v33.1H61.5v33.1H0v39.7h101.2v-33.1h72.2v-33.1h72.2v-33.1h72.2v-33.1 h72.2V283H432L432,243.3\"/>\n <path fill=\"#444444\" d=\"M99.9,109.3c12,0,21.8-9.7,21.8-21.8c0-12-9.8-21.8-21.8-21.8c-12,0-21.8,9.7-21.8,21.8C78.1,99.6,87.9,109.3,99.9,109.3\"/>\n <path fill=\"#444444\" d=\"M179.4,299.8l-56.5-47.4l11.7-82.9c12.5,14.8,20.7,33.4,22.7,53.8l17.8-4.8c-0.9-32.2-14.2-61.3-35.3-82.6 c-14.4-14.5-32.9-19.2-45.9-20.6c-0.1,0-0.2,0-0.3,0c-1.6,0-2.9,1.2-3.2,2.7c-6.5,34.7-27.7,64.2-56.9,81.9l9.3,16.1 c15.6-6.6,29.5-16.4,40.9-28.6v177.3H107l10.4-73.7l57.7,33.3L179.4,299.8\"/>\n <path fill=\"#444444\" d=\"M294.1,43.6c12,0,21.8-9.8,21.8-21.8c0-12-9.8-21.8-21.8-21.8c-12,0-21.8,9.8-21.8,21.8C272.3,33.8,282.1,43.6,294.1,43.6\" />\n <path fill=\"#444444\" d=\"M337.2,154.3l-41.8-24.1l3.9-20c1.4-7.5,2.2-15.2,2.2-23.1c0-12-1.8-23.7-5-34.6c-0.4-1.4-1.7-2.4-3.1-2.4c0,0-0.1,0-0.1,0 c-46.7,1.6-84.1,40-84.1,87.1c0,2.3,0.1,4.6,0.3,6.9l18.3,3.2c0-0.5,0-0.9,0-1.4c0-19.5,8.6-36.9,22.3-48.7l-10.5,201.1h23.3 l24.9-128l23,10.7L294.9,240l16.6,16.6l34.6-74.3c1.3-2.8,2-5.9,2-9.2C348.1,165.1,343.8,158,337.2,154.3\"/>\n </svg>`,\n\n ChargingStation: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 627.4\">\n <polygon fill=\"#444444\" points=\"314.4,282.1 133.8,467.8 188.6,334.2 114.9,334.2 225.6,148.6 314.4,148.6 236.7,282.1 \"/>\n <path fill=\"#444444\" d=\"M374.2,0H63.3C28.4,0.1,0.1,28.4,0,63.3v503.6c0,32.8,30.1,60.5,62.6,60.5h309.2c33.3,0,60.3-27,60.3-60.3V374.2l0,0V57.8 C432,25.9,406.1,0,374.2,0z M220.3,600.4c-8.3,0.2-15.2-6.4-15.4-14.7c0-0.2,0-0.5,0-0.7c0.1-8.5,6.9-15.3,15.4-15.4 c8.3-0.2,15.2,6.4,15.4,14.7c0,0.2,0,0.5,0,0.7C235.4,593.8,229.1,600.4,220.3,600.4z M391.1,544.8H44v-465h346.7v294.4l0.4,55 V544.8z\"/>\n </svg>`,\n\n WheelChair: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 492.2\">\n <path fill=\"#444444\" d=\"M134.7,80.1l9.5,103h104.6v33.3H146.6l3.2,30.9h147.4l66.6,157l56.3-23.8l11.9,27l-84,36.4l-69.7-163.3H118.9l-19-221.9 c-3.2-5.5-4.7-11.9-4.7-18.2C95.1,18.2,112.5,0,134.7,0c22.2,0,40.4,18.2,40.4,40.4C175.2,61.8,156.9,80.1,134.7,80.1L134.7,80.1z\" />\n <path fill=\"#444444\" d=\"M306.7,397.1c-25.3,56.3-81.6,95.1-146.6,95.1C72.1,492.2,0,420.9,0,332.1C0,268.7,37.2,214,91.1,187.9l3.2,36.5 c-36.5,22.2-61,61.8-61,107.8c0,69.8,57.1,126.8,126.8,126.8c65,0,118.1-48.3,126-110.2L306.7,397.1\"/>\n </svg>`,\n\n};\n\nexport default SVGIcons;","import SVGIcons from \"./svgIcons.helper\";\n\nexport type MapAmenityID = 'atm' | 'management' | 'playarea' | 'restroom' | 'family-restroom' | 'elevator' | 'escalator' | 'security' | 'dog-poop-station' | 'child-stroller' | 'vending-machine' | 'stairs' | 'charging-station' | 'wheelchair';\n\nexport interface MapAmenity {\n name: string;\n type: MapAmenityID;\n svgCode: string;\n}\n\nexport const AllAmenities: MapAmenity[] = [\n {\n name: \"ATM\",\n type: \"atm\",\n svgCode: SVGIcons.ATM\n },\n {\n name: \"Management\",\n type: \"management\",\n svgCode: SVGIcons.Management\n },\n {\n name: \"Kids Area\",\n type: \"playarea\",\n svgCode: SVGIcons.PlayArea\n },\n {\n name: \"Restroom\",\n type: \"restroom\",\n svgCode: SVGIcons.RestRoom\n },\n {\n name: \"Family Restroom\",\n type: \"family-restroom\",\n svgCode: SVGIcons.FamilyRestRoom\n },\n {\n name: \"Elevator\",\n type: \"elevator\",\n svgCode: SVGIcons.Elevator\n },\n {\n name: \"Security\",\n type: \"security\",\n svgCode: SVGIcons.Security\n },\n {\n name: \"Escalator\",\n type: \"escalator\",\n svgCode: SVGIcons.Escalator\n },\n {\n name: 'Child Stroller',\n type: 'child-stroller',\n svgCode: SVGIcons.ChildStroller\n },\n {\n name: 'Vending Machine',\n type: 'vending-machine',\n svgCode: SVGIcons.VendingMachine\n },\n {\n name: 'Stairs',\n type: 'stairs',\n svgCode: SVGIcons.Stairs\n },\n {\n name: 'Charging Station',\n type: 'charging-station',\n svgCode: SVGIcons.ChargingStation\n },\n {\n name: 'Wheelchair',\n type: 'wheelchair',\n svgCode: SVGIcons.WheelChair\n },\n];\n\n","/**\n * Lightweight amenity + kiosk icon catalog for every EyeOn surface.\n * Import from `@eyeon/threejs-map/amenities` (or `@eyeon/threejs-map`) —\n * do not copy these SVGs into other packages.\n */\nimport SVGIcons from './helpers/svgIcons.helper';\nimport {\n AllAmenities,\n type MapAmenity,\n type MapAmenityID,\n} from './helpers/amenities.helper';\n\nexport { AllAmenities };\nexport type { MapAmenity, MapAmenityID };\n\n/** Elevator / escalator are their own v1 modules, not amenity assignments. */\nconst CONNECTOR_AMENITY_TYPES = new Set<MapAmenityID>([\n 'elevator',\n 'escalator',\n]);\n\nexport const AssignAmenities: MapAmenity[] = AllAmenities.filter(\n (item) => !CONNECTOR_AMENITY_TYPES.has(item.type),\n);\n\nexport const KioskSvg = SVGIcons.Kiosk;\nexport const EntranceSvg = SVGIcons.Entrance;\nexport const EscalatorUpSvg = SVGIcons.EscalatorUp;\nexport const EscalatorDownSvg = SVGIcons.EscalatorDown;\n\nexport function isAssignAmenity(type: string): boolean {\n return AssignAmenities.some((item) => item.type === type);\n}\n\nexport function getAmenityByType(type: string): MapAmenity | undefined {\n return AssignAmenities.find((item) => item.type === type) ??\n AllAmenities.find((item) => item.type === type);\n}\n\nexport function getMapSpecialSvg(id: string): string | undefined {\n if (id === 'kiosk') return KioskSvg;\n if (id === 'entrance') return EntranceSvg;\n if (id === 'escalator-up') return EscalatorUpSvg;\n if (id === 'escalator-down') return EscalatorDownSvg;\n return getAmenityByType(id)?.svgCode;\n}\n\nexport function recolorMapSvg(svg: string, color: string): string {\n const hex = color.startsWith('#') ? color : `#${color}`;\n return svg\n .replace(/fill=\"(?!none\")[^\"]*\"/gi, `fill=\"${hex}\"`)\n .replace(/stroke=\"(?!none\")[^\"]*\"/gi, `stroke=\"${hex}\"`);\n}\n\nexport function mapSpecialSvgToDataUrl(\n svg: string,\n color?: string | null,\n): string {\n const colored = color ? recolorMapSvg(svg, color) : svg;\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(colored)}`;\n}\n","/**\n * v2 render helpers for amenity / kiosk icons.\n * SVG markup lives only in `@eyeon/threejs-map/amenities`.\n */\nimport {\n AllAmenities,\n AssignAmenities,\n getAmenityByType,\n getMapSpecialSvg,\n isAssignAmenity,\n mapSpecialSvgToDataUrl,\n recolorMapSvg,\n} from '@eyeon/threejs-map/amenities';\nimport type { CmAmenityCatalogItem, CmShapeAssignment } from './core';\nimport { assignmentSpecialIconId, STATIC_ICON_COLORS } from './core';\n\nexport {\n AllAmenities,\n AssignAmenities,\n getAmenityByType,\n isAssignAmenity,\n getMapSpecialSvg,\n mapSpecialSvgToDataUrl,\n recolorMapSvg,\n};\n\nexport function entranceIconDataUrl(color?: string | null): string | undefined {\n const svg = getMapSpecialSvg('entrance');\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, color);\n}\n\n/** v1 amenity list for the assign dropdown — elevator / escalator are separate modules. */\nexport function amenityAssignOptions(): { value: string; label: string }[] {\n return AssignAmenities.map((item) => ({\n value: item.type,\n label: item.name,\n }));\n}\n\nexport function amenityTypeFromCatalogId(\n amenityId: number | null | undefined,\n amenities: CmAmenityCatalogItem[],\n): string {\n if (amenityId == null) return '';\n return amenities.find((item) => item.id === amenityId)?.code ?? '';\n}\n\nexport function amenityCatalogIdForType(\n type: string,\n amenities: CmAmenityCatalogItem[],\n): number | null {\n const row = amenities.find(\n (item) => item.isActive !== false && item.code === type,\n );\n return row?.id ?? null;\n}\n\nexport function assignmentSpecialIconDataUrl(\n assignment: CmShapeAssignment | null | undefined,\n amenities: Array<{ id: number; code: string }>,\n color?: string | null,\n): string | undefined {\n const id = assignmentSpecialIconId(assignment, amenities);\n if (!id) return undefined;\n const svg = getMapSpecialSvg(id);\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, color);\n}\n\nexport type ConnectorSpecialKind = 'escalator' | 'elevator';\nexport type EscalatorTravel = 'up' | 'down';\nexport type ConnectorIconId =\n | ConnectorSpecialKind\n | 'escalator-up'\n | 'escalator-down';\n\nconst ASSIGNED_CONNECTOR_ICON = STATIC_ICON_COLORS.connector;\nconst UNASSIGNED_CONNECTOR_ICON = '#94a3b8';\n\ntype LevelTravelInput = {\n id: number;\n levelIndex?: number;\n ordering?: number;\n anchors?: Array<{ shapeId?: number | null; connectorId?: number | null }>;\n};\n\n/** Compare two floors — higher index / ordering is up. */\nexport function levelTravel(\n from: Pick<LevelTravelInput, 'levelIndex' | 'ordering'>,\n to: Pick<LevelTravelInput, 'levelIndex' | 'ordering'>,\n): EscalatorTravel | null {\n const fromIndex = from.levelIndex ?? from.ordering;\n const toIndex = to.levelIndex ?? to.ordering;\n if (fromIndex == null || toIndex == null || toIndex === fromIndex) {\n const fromOrder = from.ordering ?? from.levelIndex;\n const toOrder = to.ordering ?? to.levelIndex;\n if (fromOrder == null || toOrder == null || toOrder === fromOrder) {\n return null;\n }\n return toOrder > fromOrder ? 'up' : 'down';\n }\n return toIndex > fromIndex ? 'up' : 'down';\n}\n\n/**\n * From this linked landing, which way does the ride go? Used for the\n * EscalatorUp / EscalatorDown overlay. Lists keep the plain Escalator icon.\n */\nexport function escalatorLandingTravel(\n shapeId: number,\n levelId: number,\n levels: readonly LevelTravelInput[],\n): EscalatorTravel | null {\n const here = levels.find((level) => level.id === levelId);\n if (!here) return null;\n const connectorId = here.anchors?.find(\n (anchor) => anchor.shapeId === shapeId && anchor.connectorId != null,\n )?.connectorId;\n if (connectorId == null) return null;\n\n const partner = levels.find((level) => {\n if (level.id === here.id) return false;\n return Boolean(\n level.anchors?.some(\n (anchor) =>\n anchor.connectorId === connectorId &&\n anchor.shapeId != null &&\n anchor.shapeId !== shapeId,\n ),\n );\n });\n if (!partner) return null;\n return levelTravel(here, partner);\n}\n\n/** Linked map overlays use the arrow variants; UI lists pass no travel. */\nexport function escalatorConnectorIconId(\n travel?: EscalatorTravel | null,\n): ConnectorIconId {\n if (travel === 'up') return 'escalator-up';\n if (travel === 'down') return 'escalator-down';\n return 'escalator';\n}\n\n/** Escalator / elevator SVG ids from the floor file (`escalator-5-up-start`). */\nexport function connectorSpecialKind(shape: {\n key: string;\n sourceSvgId?: string | null;\n}): ConnectorSpecialKind | null {\n const raw = (shape.sourceSvgId ?? shape.key)\n .trim()\n .toLowerCase()\n .replace(/_/g, '-');\n if (raw === 'escalator' || raw.startsWith('escalator-')) return 'escalator';\n if (raw === 'elevator' || raw.startsWith('elevator-')) return 'elevator';\n return null;\n}\n\nexport function connectorSpecialIconDataUrl(\n kind: ConnectorIconId,\n assigned: boolean,\n color?: string | null,\n): string | undefined {\n const svg = getMapSpecialSvg(kind);\n if (!svg) return undefined;\n const fill = color?.trim()\n ? color.trim()\n : assigned\n ? ASSIGNED_CONNECTOR_ICON\n : UNASSIGNED_CONNECTOR_ICON;\n return mapSpecialSvgToDataUrl(svg, fill);\n}\n\nexport function connectorMapIconDataUrl(\n kind: ConnectorSpecialKind,\n assigned: boolean,\n color?: string | null,\n travel?: EscalatorTravel | null,\n): string | undefined {\n const iconId = kind === 'escalator' ? escalatorConnectorIconId(travel) : kind;\n return connectorSpecialIconDataUrl(iconId, assigned, color);\n}\n\n/** Landings that belong to a linked escalator ride / elevator shaft. */\nexport function assignedConnectorShapeIds(\n anchors: Array<{ shapeId?: number | null; connectorId?: number | null }>,\n): Set<number> {\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (anchor.shapeId != null && anchor.connectorId != null) {\n ids.add(anchor.shapeId);\n }\n }\n return ids;\n}\n\n/**\n * Map overlay: only a linked landing gets an icon. Unassigned escalators\n * and elevators stay as empty polygons on PORTAL assign; WEBSITE / DISPLAY_APP\n * hide those polygons entirely.\n */\nexport function connectorMapIconKind(\n shape: {\n id: number;\n key: string;\n sourceSvgId?: string | null;\n orphanedAt?: string | Date | null;\n },\n assignedShapeIds: Set<number>,\n): ConnectorSpecialKind | null {\n if (shape.orphanedAt) return null;\n const kind = connectorSpecialKind(shape);\n if (!kind || !assignedShapeIds.has(shape.id)) return null;\n return kind;\n}\n","export default \"data:font/woff;base64,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\"","import mapFontUrl from './Montserrat-Regular.woff?url';\n\n/**\n * Troika (drei `<Text>`) cannot use CSS `font-family`; it needs a font file.\n * Latin 400 WOFF, same face as `@fontsource/montserrat` / admin-portal.\n */\nexport const MAP_FONT_URL = mapFontUrl;\n\nlet registered = false;\n\n/** Register Montserrat so SVG + canvas measurement match the 3D overlay. */\nexport function ensureMapFont(): void {\n if (registered || typeof document === 'undefined' || !('fonts' in document)) {\n return;\n }\n registered = true;\n const face = new FontFace('Montserrat', `url(${MAP_FONT_URL})`);\n void face.load().then((loaded) => {\n document.fonts.add(loaded);\n });\n}\n\nensureMapFont();\n","export interface ModernSelectOption {\n value: string;\n label: string;\n hint?: string;\n iconUrl?: string;\n iconMuted?: boolean;\n}\n\n/** Show a search field once a list is long enough to scan by eye. */\nexport const MODERN_SELECT_SEARCH_AFTER = 8;\n\nexport function filterModernSelectOptions(\n options: ModernSelectOption[],\n query: string,\n): ModernSelectOption[] {\n const q = query.trim().toLowerCase();\n if (!q) return options;\n return options.filter((o) => {\n const haystack = `${o.label} ${o.hint ?? ''}`.toLowerCase();\n return haystack.includes(q);\n });\n}\n\nexport function modernSelectIsSearchable(\n optionCount: number,\n searchable?: boolean,\n): boolean {\n return searchable ?? optionCount >= MODERN_SELECT_SEARCH_AFTER;\n}\n","import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport './modern-select.css';\nimport {\n filterModernSelectOptions,\n modernSelectIsSearchable,\n type ModernSelectOption,\n} from './selectSearch';\n\nexport type { ModernSelectOption } from './selectSearch';\nexport { filterModernSelectOptions } from './selectSearch';\n\nfunction Chevron() {\n return (\n <svg\n className=\"eyeon-map-select__chevron\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden\n >\n <path\n d=\"M2.5 4.5 6 8l3.5-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function ModernSelect({\n value,\n options,\n onChange,\n disabled = false,\n placeholder = 'Select…',\n searchable,\n ariaLabel,\n}: {\n value: string;\n options: ModernSelectOption[];\n onChange: (value: string) => void;\n disabled?: boolean;\n placeholder?: string;\n searchable?: boolean;\n ariaLabel?: string;\n}) {\n const listId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const [menuPos, setMenuPos] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n\n const withSearch = modernSelectIsSearchable(options.length, searchable);\n const selected = options.find((o) => o.value === value);\n const filtered = useMemo(\n () => filterModernSelectOptions(options, withSearch && open ? query : ''),\n [open, options, query, withSearch],\n );\n\n const close = useCallback(() => {\n setOpen(false);\n setQuery('');\n setActiveIndex(0);\n }, []);\n\n const pick = useCallback(\n (next: string) => {\n onChange(next);\n close();\n },\n [close, onChange],\n );\n\n const updateMenuPos = useCallback(() => {\n const el = triggerRef.current ?? buttonRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const maxHeight = Math.min(280, Math.max(spaceBelow, spaceAbove, 120));\n const openAbove = spaceBelow < 160 && spaceAbove > spaceBelow;\n setMenuPos({\n top: openAbove ? Math.max(8, rect.top - maxHeight - 4) : rect.bottom + 4,\n left: rect.left,\n width: Math.max(rect.width, 160),\n maxHeight,\n });\n }, []);\n\n useEffect(() => {\n if (!open) {\n setMenuPos(null);\n return;\n }\n updateMenuPos();\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (rootRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n (withSearch ? searchRef.current : buttonRef.current)?.blur();\n }\n };\n const onMove = () => updateMenuPos();\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('resize', onMove);\n window.addEventListener('scroll', onMove, true);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', onMove);\n window.removeEventListener('scroll', onMove, true);\n };\n }, [close, open, updateMenuPos, withSearch]);\n\n useEffect(() => {\n if (!open || !withSearch) return;\n requestAnimationFrame(() => searchRef.current?.focus());\n }, [open, withSearch]);\n\n useEffect(() => {\n setActiveIndex(0);\n }, [query, filtered.length]);\n\n const moveActive = (delta: number) => {\n if (filtered.length === 0) return;\n setActiveIndex((i) => (i + delta + filtered.length) % filtered.length);\n };\n\n const onSearchKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n if (!open) setOpen(true);\n else moveActive(1);\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n if (!open) setOpen(true);\n else moveActive(-1);\n return;\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n const option = filtered[activeIndex];\n if (open && option) pick(option.value);\n else setOpen(true);\n }\n };\n\n const menu =\n open && menuPos && !disabled\n ? createPortal(\n <div\n ref={menuRef}\n id={listId}\n className=\"eyeon-map-select__menu\"\n role=\"listbox\"\n aria-label={ariaLabel}\n style={{\n top: menuPos.top,\n left: menuPos.left,\n width: menuPos.width,\n maxHeight: menuPos.maxHeight,\n }}\n >\n <ul className=\"eyeon-map-select__list\">\n {filtered.length === 0 ? (\n <li className=\"eyeon-map-select__empty\">No matches</li>\n ) : (\n filtered.map((option, index) => {\n const active = option.value === value;\n const highlighted = index === activeIndex;\n return (\n <li\n key={option.value}\n id={`${listId}-${option.value}`}\n role=\"option\"\n aria-selected={active}\n >\n <button\n type=\"button\"\n className={[\n 'eyeon-map-select__option',\n active ? 'is-active' : '',\n highlighted ? 'is-highlight' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => pick(option.value)}\n >\n {option.iconUrl ? (\n <img\n className={\n option.iconMuted\n ? 'eyeon-map-select__option-icon is-muted'\n : 'eyeon-map-select__option-icon'\n }\n src={option.iconUrl}\n alt=\"\"\n />\n ) : null}\n <span className=\"eyeon-map-select__option-copy\">\n <span>{option.label}</span>\n {option.hint ? (\n <span className=\"eyeon-map-select__option-hint\">\n {option.hint}\n </span>\n ) : null}\n </span>\n </button>\n </li>\n );\n })\n )}\n </ul>\n </div>,\n document.body,\n )\n : null;\n\n return (\n <div ref={rootRef} className=\"eyeon-map-select\">\n {withSearch ? (\n <div\n ref={triggerRef}\n className={\n open\n ? 'eyeon-map-select__trigger is-open'\n : 'eyeon-map-select__trigger'\n }\n onMouseDown={(e) => {\n if (disabled) return;\n const target = e.target as HTMLElement;\n if (target.closest('.eyeon-map-select__chevron-btn')) return;\n if (target !== searchRef.current) {\n e.preventDefault();\n searchRef.current?.focus();\n }\n if (!open) setOpen(true);\n }}\n >\n <input\n ref={searchRef}\n className=\"eyeon-map-select__input\"\n type=\"text\"\n role=\"combobox\"\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n open && filtered[activeIndex]\n ? `${listId}-${filtered[activeIndex].value}`\n : undefined\n }\n disabled={disabled}\n placeholder={placeholder}\n value={open ? query : (selected?.label ?? '')}\n onChange={(e) => {\n setQuery(e.target.value);\n if (!open) setOpen(true);\n }}\n onFocus={() => {\n if (!disabled) setOpen(true);\n }}\n onKeyDown={onSearchKeyDown}\n />\n <button\n type=\"button\"\n className=\"eyeon-map-select__chevron-btn\"\n tabIndex={-1}\n aria-hidden\n disabled={disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (disabled) return;\n setOpen((v) => !v);\n }}\n >\n <Chevron />\n </button>\n </div>\n ) : (\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"eyeon-map-select__trigger\"\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setOpen((v) => !v);\n }}\n >\n <span\n className={\n selected\n ? 'eyeon-map-select__value'\n : 'eyeon-map-select__placeholder'\n }\n >\n {selected?.iconUrl ? (\n <img\n className={\n selected.iconMuted\n ? 'eyeon-map-select__option-icon is-muted'\n : 'eyeon-map-select__option-icon'\n }\n src={selected.iconUrl}\n alt=\"\"\n />\n ) : null}\n {selected?.label ?? placeholder}\n </span>\n <Chevron />\n </button>\n )}\n {menu}\n </div>\n );\n}\n","import * as THREE from 'three';\nimport type { Vec2 } from '../../core';\nimport { holesOverlappingOuter } from '../../core';\n\nexport function polygonToThreeShape(points: Vec2[]): THREE.Shape | null {\n if (points.length < 3) return null;\n const shape = new THREE.Shape();\n shape.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n shape.lineTo(points[i].x, points[i].y);\n }\n shape.closePath();\n return shape;\n}\n\nexport function polygonToThreePath(points: Vec2[]): THREE.Path | null {\n if (points.length < 3) return null;\n const path = new THREE.Path();\n path.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n path.lineTo(points[i].x, points[i].y);\n }\n path.closePath();\n return path;\n}\n\n/** Punch overlapping openings out of a slab polygon. */\nexport function slabShapeWithHoles(\n outer: Vec2[],\n holes: Vec2[][],\n): THREE.Shape | null {\n const shape = polygonToThreeShape(outer);\n if (!shape) return null;\n for (const hole of holesOverlappingOuter(outer, holes)) {\n const path = polygonToThreePath(hole);\n if (path) shape.holes.push(path);\n }\n return shape;\n}\n","import React, { useEffect, useMemo } from 'react';\nimport * as THREE from 'three';\nimport type { Vec2 } from '../../core';\nimport {\n OPENING_VOID_FILL,\n OPENING_VOID_MARK,\n OPENING_VOID_STROKE,\n polygonBBox,\n} from '../../core';\nimport { polygonToThreeShape } from './openingGeometry';\n\nfunction skipRaycast() {}\n\n/** X mark in bbox UV space — ShapeGeometry clips it to the opening. */\nfunction createOpeningMarkTexture(aspect: number): THREE.CanvasTexture {\n const height = 256;\n const width = Math.max(48, Math.round(height * Math.max(aspect, 0.2)));\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return new THREE.CanvasTexture(canvas);\n ctx.clearRect(0, 0, width, height);\n const pad = Math.min(width, height) * 0.14;\n ctx.strokeStyle = OPENING_VOID_MARK;\n ctx.globalAlpha = 0.82;\n ctx.lineWidth = Math.max(5, Math.min(width, height) * 0.045);\n ctx.lineCap = 'round';\n ctx.beginPath();\n ctx.moveTo(pad, pad);\n ctx.lineTo(width - pad, height - pad);\n ctx.moveTo(width - pad, pad);\n ctx.lineTo(pad, height - pad);\n ctx.stroke();\n const texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n texture.anisotropy = 4;\n texture.needsUpdate = true;\n return texture;\n}\n\nfunction OpeningVoidMesh({ polygon }: { polygon: Vec2[] }) {\n const shape = useMemo(() => polygonToThreeShape(polygon), [polygon]);\n const box = useMemo(() => polygonBBox(polygon), [polygon]);\n const dash = Math.max(8, openingSpanDash(box));\n const outline = useMemo(() => {\n if (polygon.length < 2) return null;\n const first = polygon[0];\n const points = [\n ...polygon.map((p) => new THREE.Vector3(p.x, p.y, 0.05)),\n new THREE.Vector3(first.x, first.y, 0.05),\n ];\n const geometry = new THREE.BufferGeometry().setFromPoints(points);\n const material = new THREE.LineDashedMaterial({\n color: OPENING_VOID_STROKE,\n dashSize: dash,\n gapSize: dash * 0.65,\n });\n const line = new THREE.Line(geometry, material);\n line.renderOrder = 8;\n line.computeLineDistances();\n line.raycast = skipRaycast;\n return line;\n }, [dash, polygon]);\n\n useEffect(\n () => () => {\n if (!outline) return;\n outline.geometry.dispose();\n const material = outline.material;\n if (Array.isArray(material)) material.forEach((item) => item.dispose());\n else material.dispose();\n },\n [outline],\n );\n const mark = useMemo(() => {\n const width = Math.max(box.maxX - box.minX, 1);\n const height = Math.max(box.maxY - box.minY, 1);\n return createOpeningMarkTexture(width / height);\n }, [box]);\n\n useEffect(() => () => mark.dispose(), [mark]);\n\n if (!shape || !outline) return null;\n\n return (\n <group>\n <mesh\n position={[0, 0, 0.02]}\n renderOrder={6}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <shapeGeometry args={[shape]} />\n <meshBasicMaterial\n color={OPENING_VOID_FILL}\n side={THREE.DoubleSide}\n depthWrite={false}\n />\n </mesh>\n <mesh position={[0, 0, 0.03]} renderOrder={7} raycast={skipRaycast}>\n <shapeGeometry args={[shape]} />\n <meshBasicMaterial\n map={mark}\n transparent\n depthWrite={false}\n side={THREE.DoubleSide}\n toneMapped={false}\n />\n </mesh>\n {outline ? <primitive object={outline} /> : null}\n </group>\n );\n}\n\nfunction openingSpanDash(bbox: {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}): number {\n const span = Math.min(bbox.maxX - bbox.minX, bbox.maxY - bbox.minY);\n return Math.min(18, Math.max(7, span * 0.08));\n}\n\nexport function OpeningWells({\n polygons,\n}: {\n polygons: Vec2[][];\n is3d?: boolean;\n}) {\n if (polygons.length === 0) return null;\n return (\n <group>\n {polygons.map((polygon, index) => (\n <OpeningVoidMesh key={`opening-void-${index}`} polygon={polygon} />\n ))}\n </group>\n );\n}\n","import {\n darkenShapeFill,\n viewerShapeHoverableOnHost,\n type MapViewerHost,\n type PublicServiceShape,\n type ShapeKind,\n} from '../core';\n\n/** Kinds that select (or Shift-add) on the assign / public map. */\nexport const VIEWER_SELECTABLE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'entrance',\n 'parking_zone',\n];\n\nexport function isViewerSelectableKind(kind: string): boolean {\n return (VIEWER_SELECTABLE_KINDS as readonly string[]).includes(kind);\n}\n\n/** Assign map: any selectable kind. Public hosts: only assigned items. */\nexport function isViewerInteractiveShape(\n kind: string,\n host: MapViewerHost = 'PORTAL_ASSIGN',\n assignment?: PublicServiceShape['assignment'] | null,\n): boolean {\n return (\n isViewerSelectableKind(kind) &&\n viewerShapeHoverableOnHost({ assignment: assignment ?? undefined }, host)\n );\n}\n\n/** Hover and the current selection share the same assign-map highlight. */\nexport function viewerShapeHighlighted(\n shapeId: number,\n hoveredShapeId: number | null,\n selectedShapeIds: readonly number[],\n): boolean {\n return hoveredShapeId === shapeId || selectedShapeIds.includes(shapeId);\n}\n\n/** Map pointer hover wins over a leftover list hover. */\nexport function resolvedViewerHoverId(\n listHoverId: number | null | undefined,\n pointerHoverId: number | null,\n): number | null {\n return pointerHoverId ?? listHoverId ?? null;\n}\n\nexport function viewerHoverCursor(\n kind: string,\n host: MapViewerHost = 'PORTAL_ASSIGN',\n assignment?: PublicServiceShape['assignment'] | null,\n): 'pointer' | '' {\n return isViewerInteractiveShape(kind, host, assignment) ? 'pointer' : '';\n}\n\n/** R3F `eventSource` hosts the cursor — the WebGL canvas has pointer-events: none. */\nexport function applyViewerHoverCursor(\n host: HTMLElement | null | undefined,\n cursor: 'pointer' | '',\n): void {\n if (!host) return;\n host.classList.toggle('is-hover-shape', cursor === 'pointer');\n}\n\n/** Near-invisible fills (legacy amenity 0.01) still need a readable hover. */\nexport function viewerHoverFillOpacity(\n kind: string,\n base: number,\n hovered: boolean,\n): number {\n if (!hovered || !isViewerSelectableKind(kind)) return base;\n if (base < 0.08) return 0.28;\n return base;\n}\n\n/** Hover and the current selection use the same darker shade of this fill. */\nexport function viewerHoverFillColor(fill: string, hovered: boolean): string {\n if (!hovered) return fill;\n return darkenShapeFill(fill);\n}\n\n/** Canvas-host coordinates — MapScene uses `eventPrefix=\"offset\"`. */\nexport function viewerPointerOffset(event: {\n offsetX?: number;\n offsetY?: number;\n nativeEvent?: { offsetX?: number; offsetY?: number };\n}): { x: number; y: number } | null {\n const native = event.nativeEvent;\n const x = typeof event.offsetX === 'number' ? event.offsetX : native?.offsetX;\n const y = typeof event.offsetY === 'number' ? event.offsetY : native?.offsetY;\n if (typeof x !== 'number' || typeof y !== 'number') return null;\n if (!Number.isFinite(x) || !Number.isFinite(y)) return null;\n return { x, y };\n}\n\n/** Pan farther than this and a pointer-up is not a click/tap. */\nexport const VIEWER_CLICK_DRAG_PX = 5;\n\nexport type ViewerPointerGesture = {\n pointerId: number | null;\n x: number;\n y: number;\n maxDist: number;\n active: boolean;\n};\n\nexport function createViewerPointerGesture(): ViewerPointerGesture {\n return { pointerId: null, x: 0, y: 0, maxDist: 0, active: false };\n}\n\nexport function viewerPointerClientXY(e: {\n clientX?: number;\n clientY?: number;\n pointerId?: number;\n}): { x: number; y: number; pointerId: number | null } | null {\n const x = e.clientX;\n const y = e.clientY;\n if (typeof x !== 'number' || typeof y !== 'number' || !Number.isFinite(x) || !Number.isFinite(y)) {\n return null;\n }\n return { x, y, pointerId: e.pointerId ?? null };\n}\n\nexport function beginViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (gesture.active) return;\n gesture.active = true;\n gesture.pointerId = pointerId;\n gesture.x = x;\n gesture.y = y;\n gesture.maxDist = 0;\n}\n\nexport function moveViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (!gesture.active) return;\n if (gesture.pointerId != null && pointerId != null && pointerId !== gesture.pointerId) return;\n const dist = Math.hypot(x - gesture.x, y - gesture.y);\n if (dist > gesture.maxDist) gesture.maxDist = dist;\n}\n\nexport function endViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (!gesture.active) return;\n if (gesture.pointerId != null && pointerId != null && pointerId !== gesture.pointerId) return;\n moveViewerPointerGesture(gesture, x, y, pointerId);\n gesture.active = false;\n gesture.pointerId = null;\n}\n\n/** True when the pointer barely moved — R3F delta alone is unreliable on touch. */\nexport function viewerPointerClickIsTap(maxDist: number, r3fDelta?: number): boolean {\n const delta = Number.isFinite(r3fDelta) ? r3fDelta! : 0;\n return Math.max(maxDist, delta) <= VIEWER_CLICK_DRAG_PX;\n}\n\nexport function pointerMissClearsSelection(\n down: { x: number; y: number } | null,\n up: { x: number; y: number; button?: number },\n): boolean {\n if ((up.button ?? 0) !== 0) return false;\n if (!down) return true;\n const dx = up.x - down.x;\n const dy = up.y - down.y;\n return dx * dx + dy * dy <= VIEWER_CLICK_DRAG_PX * VIEWER_CLICK_DRAG_PX;\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport * as THREE from 'three';\nimport { Html, Text } from '@react-three/drei';\nimport type {\n CmAmenityCatalogItem,\n MapViewerHost,\n PublishedLevel,\n PublishedRetailer,\n ThemeDefaults,\n ShapeKind,\n ViewerHoverTooltipHandler,\n} from '../../core';\nimport {\n assignmentOverlayImageUrl,\n assignmentOverlayRenderSize,\n assignmentOverlayVisible,\n connectorIconLayout,\n darkenShapeFill,\n DEFAULT_ASSIGNMENT_SIZE,\n DEFAULT_ENTRANCE_SIZE,\n filletPolygon,\n geometryBBox,\n INTERACTIVE_SHAPE_KINDS,\n isEntranceIcon,\n isSlabShapeKind,\n isTransparentColor,\n labelAlignX,\n normalizeLabelAlign,\n resolveFetchUrl,\n resolveLayerStyle,\n resolvedAssignmentIconColor,\n resolvedViewerShapeFill,\n viewerHoverTooltipLabel,\n viewerShapeBaseOpacity,\n viewerShapeVisibleOnHost,\n voidPolygonsOnLevel,\n} from '../../core';\nimport { polygonToThreeShape, slabShapeWithHoles } from './openingGeometry';\nimport { OpeningWells } from './OpeningWell';\nimport { MAP_LABEL_LINE_HEIGHT } from '../../fonts/mapFont';\nimport { MAP_FONT_URL } from '../../fonts/mapFontUrl';\nimport {\n applyViewerHoverCursor,\n isViewerInteractiveShape,\n viewerHoverCursor,\n viewerHoverFillOpacity,\n resolvedViewerHoverId,\n viewerPointerClickIsTap,\n viewerPointerOffset,\n viewerShapeHighlighted,\n type ViewerPointerGesture,\n} from '../pointer';\nimport {\n assignedConnectorShapeIds,\n assignmentSpecialIconDataUrl,\n connectorMapIconDataUrl,\n connectorMapIconKind,\n escalatorLandingTravel,\n entranceIconDataUrl,\n} from '../../specialIcons';\n\nfunction kindColor(\n kind: ShapeKind,\n theme: ThemeDefaults,\n host: MapViewerHost,\n fill?: string,\n assignment?: { bgColor?: string | null } | null,\n): string {\n return resolvedViewerShapeFill(kind, theme, host, fill, assignment);\n}\n\nfunction polygonShape(points: { x: number; y: number }[]): THREE.Shape | null {\n return polygonToThreeShape(points);\n}\n\nexport interface LevelMeshesProps {\n level: PublishedLevel;\n /** All floors — used to pick EscalatorUp / EscalatorDown from the linked landing. */\n levels?: readonly PublishedLevel[];\n theme: ThemeDefaults;\n is3d: boolean;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n /** Assign-map selection — same highlight as hover so staff can see the set. */\n selectedShapeIds?: readonly number[];\n /** Rail / search hover — same darker fill as pointer hover. */\n hoveredShapeId?: number | null;\n /** Host that owns pointer events (and therefore the CSS cursor). */\n eventSource?: React.RefObject<HTMLElement | null>;\n /** Tracks pointer travel so pan-release on a store is not treated as a click. */\n pointerGestureRef?: React.RefObject<ViewerPointerGesture>;\n /**\n * When true (outdoor with live SVG), only interactive shapes are drawn —\n * decoration comes from SvgVectorLayer.\n */\n interactiveOnly?: boolean;\n /** Same media proxy as outdoor SVGs — remote retailer logos only, not data URLs. */\n imageProxyUrl?: string | null;\n /** Published amenity catalog — used to resolve v1 amenity icons by code. */\n amenities?: CmAmenityCatalogItem[];\n /** Live / published retailers — logo-only stores have no label text. */\n retailers?: PublishedRetailer[];\n /** Public hosts hide unassigned amenity / kiosk / elevator / escalator polygons. */\n host?: MapViewerHost;\n /** Assigned kiosk shape currently running this DISPLAY_APP viewer. */\n kioskOriginShapeId?: number | null;\n /** WEBSITE / DISPLAY_APP store and amenity name pop-out. */\n showHoverTooltip?: boolean;\n onHoverTooltip?: ViewerHoverTooltipHandler;\n}\n\nfunction HoverOutline({\n shape,\n extrude,\n color,\n}: {\n shape: THREE.Shape;\n extrude: number;\n color: string;\n}) {\n const sourceGeometry = useMemo(\n () =>\n extrude > 0\n ? new THREE.ExtrudeGeometry(shape, {\n depth: extrude,\n bevelEnabled: false,\n })\n : new THREE.ShapeGeometry(shape),\n [extrude, shape],\n );\n\n useEffect(() => () => sourceGeometry.dispose(), [sourceGeometry]);\n\n return (\n <lineSegments renderOrder={40}>\n <edgesGeometry args={[sourceGeometry]} />\n <lineBasicMaterial color={color} depthTest={false} />\n </lineSegments>\n );\n}\n\nfunction CurrentLocationPulse({\n position,\n}: {\n position: [number, number, number];\n}) {\n return (\n <Html\n position={position}\n center\n zIndexRange={[10, 0]}\n style={{ pointerEvents: 'none' }}\n >\n <span\n className=\"eyeon-map-current-location-marker\"\n aria-hidden=\"true\"\n />\n </Html>\n );\n}\n\nexport function LevelMeshes({\n level,\n levels,\n theme,\n is3d,\n onSelectShape,\n selectedShapeIds = [],\n hoveredShapeId: hoveredShapeIdProp = null,\n eventSource,\n pointerGestureRef,\n interactiveOnly = false,\n imageProxyUrl = null,\n amenities = [],\n retailers = [],\n host = 'PORTAL_ASSIGN',\n kioskOriginShapeId = null,\n showHoverTooltip = false,\n onHoverTooltip,\n}: LevelMeshesProps) {\n const [pointerHoverId, setPointerHoverId] = useState<number | null>(null);\n const hoveredShapeId = resolvedViewerHoverId(\n hoveredShapeIdProp,\n pointerHoverId,\n );\n useEffect(\n () => () => {\n applyViewerHoverCursor(eventSource?.current, '');\n onHoverTooltip?.(null);\n },\n [eventSource, onHoverTooltip],\n );\n const publishHoverTooltip = (\n shape: PublishedLevel['shapes'][number],\n event: {\n buttons?: number;\n offsetX?: number;\n offsetY?: number;\n nativeEvent?: { offsetX?: number; offsetY?: number; buttons?: number };\n },\n ) => {\n if (!showHoverTooltip || !onHoverTooltip) return;\n const buttons = event.buttons ?? event.nativeEvent?.buttons ?? 0;\n if (buttons > 0) {\n onHoverTooltip(null);\n return;\n }\n const offset = viewerPointerOffset(event);\n const text = viewerHoverTooltipLabel(shape, retailers, amenities);\n if (!offset || !text) {\n onHoverTooltip(null, { leavingShapeId: shape.id });\n return;\n }\n onHoverTooltip({ shapeId: shape.id, text, x: offset.x, y: offset.y });\n };\n\n const openings = useMemo(() => voidPolygonsOnLevel(level), [level]);\n const assignedConnectorIds = useMemo(\n () => assignedConnectorShapeIds(level.anchors),\n [level.anchors],\n );\n const visibleShapes = useMemo(\n () =>\n level.shapes.filter((s) =>\n viewerShapeVisibleOnHost(s, host, assignedConnectorIds),\n ),\n [assignedConnectorIds, host, level.shapes],\n );\n const meshes = useMemo(() => {\n return visibleShapes\n .filter((s) => s.kind !== 'void')\n .filter((s) => !(s.kind === 'label' && s.label?.text?.trim()))\n .filter((s) => !isEntranceIcon(s))\n .filter(\n (s) =>\n !interactiveOnly ||\n INTERACTIVE_SHAPE_KINDS.includes(s.kind) ||\n (s.kind === 'label' && Boolean(s.label?.text?.trim())) ||\n (s.kind === 'walkable' && !resolveLayerStyle(s.sourceSvgId)),\n )\n .filter((s) => !s.orphanedAt)\n .map((shape) => {\n const radius = shape.kind === 'unit' ? theme.STORE_RADIUS : 0;\n const punch = isSlabShapeKind(shape.kind) && openings.length > 0;\n const polys = shape.geometry.polygons.map((poly) =>\n radius > 0 ? filletPolygon(poly, radius) : poly,\n );\n const threeShapes = polys\n .map((poly) =>\n punch ? slabShapeWithHoles(poly, openings) : polygonShape(poly),\n )\n .filter((s): s is THREE.Shape => s != null);\n if (threeShapes.length === 0) return null;\n\n const color = kindColor(\n shape.kind,\n theme,\n host,\n shape.style.fill,\n shape.assignment,\n );\n const extrude =\n is3d && (shape.kind === 'unit' || shape.kind === 'wall')\n ? shape.style.extrudeHeight ??\n (shape.kind === 'unit' ? theme.STORE_HEIGHT : 2)\n : 0;\n\n return { shape, threeShapes, color, extrude };\n })\n .filter(Boolean) as Array<{\n shape: (typeof visibleShapes)[number];\n threeShapes: THREE.Shape[];\n color: string;\n extrude: number;\n }>;\n }, [visibleShapes, theme, is3d, interactiveOnly, openings, host]);\n\n const labels = useMemo(\n () =>\n visibleShapes.filter(\n (s) => !s.orphanedAt && s.kind === 'label' && Boolean(s.label?.text?.trim()),\n ),\n [visibleShapes],\n );\n\n const entranceIcons = useMemo(\n () => visibleShapes.filter((s) => !s.orphanedAt && isEntranceIcon(s)),\n [visibleShapes],\n );\n\n const overlays = useMemo(\n () =>\n visibleShapes.filter(\n (s) =>\n !s.orphanedAt &&\n s.kind !== 'label' &&\n !isEntranceIcon(s) &&\n assignmentOverlayVisible(s.assignment, s.label),\n ),\n [visibleShapes],\n );\n\n const connectorOverlays = useMemo(() => {\n return visibleShapes.flatMap((shape) => {\n const kind = connectorMapIconKind(shape, assignedConnectorIds);\n if (!kind) return [];\n const layout = connectorIconLayout(shape);\n const iconColor = resolvedAssignmentIconColor(\n shape.assignment,\n theme,\n layout.iconColor,\n shape.kind,\n );\n const travel =\n kind === 'escalator'\n ? escalatorLandingTravel(shape.id, level.id, levels ?? [level])\n : null;\n const url = connectorMapIconDataUrl(kind, true, iconColor, travel);\n if (!url) return [];\n const box = geometryBBox(shape.geometry);\n return [\n {\n shape,\n url,\n width: layout.size,\n rotation: (layout.rotate * Math.PI) / 180,\n x: (box.minX + box.maxX) / 2 + layout.offsetX,\n y: (box.minY + box.maxY) / 2 + layout.offsetY,\n },\n ];\n });\n }, [assignedConnectorIds, level.id, levels, theme, visibleShapes]);\n\n return (\n <group>\n {labels.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const align = normalizeLabelAlign(shape.label.align);\n const cx = (box.minX + box.maxX) / 2;\n const cy = (box.minY + box.maxY) / 2;\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n return (\n <group\n key={`label-${shape.id}`}\n position={[cx, cy, 0.15]}\n rotation={[0, 0, tilt]}\n >\n <Text\n font={MAP_FONT_URL}\n position={[labelAlignX(box, align) - cx, 0, 0]}\n fontSize={shape.label.size ?? 24}\n color={shape.label.color ?? theme.STORE_TEXT_COLOR}\n anchorX={align}\n anchorY=\"middle\"\n textAlign={align}\n lineHeight={MAP_LABEL_LINE_HEIGHT}\n scale={[1, -1, 1]}\n >\n {shape.label.text}\n </Text>\n </group>\n );\n })}\n {entranceIcons.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const cx = (box.minX + box.maxX) / 2 + (shape.label.offsetX ?? 0);\n const cy = (box.minY + box.maxY) / 2 + (shape.label.offsetY ?? 0);\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n const size = shape.label.size || DEFAULT_ENTRANCE_SIZE;\n const url = entranceIconDataUrl(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n );\n if (!url) return null;\n return (\n <AssignmentImageOverlay\n key={`entrance-${shape.id}`}\n url={url}\n width={size}\n position={[cx, cy, 0.18]}\n rotation={tilt}\n />\n );\n })}\n {overlays.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const cx = (box.minX + box.maxX) / 2 + (shape.label.offsetX ?? 0);\n const cy = (box.minY + box.maxY) / 2 + (shape.label.offsetY ?? 0);\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n const fontSize = shape.label.size || shape.assignment?.size || DEFAULT_ASSIGNMENT_SIZE;\n const extrude =\n is3d && (shape.kind === 'unit' || shape.kind === 'wall')\n ? shape.style.extrudeHeight ??\n (shape.kind === 'unit' ? theme.STORE_HEIGHT : 2)\n : 0;\n const z = extrude > 0 ? extrude + 0.15 : 0.2;\n const iconColor = resolvedAssignmentIconColor(\n shape.assignment,\n theme,\n shape.label.color,\n shape.kind,\n );\n const imageKey =\n assignmentOverlayImageUrl(shape.assignment, null, shape.label) ??\n assignmentSpecialIconDataUrl(\n shape.assignment,\n amenities,\n iconColor,\n );\n const text = shape.label.text?.trim();\n const align = normalizeLabelAlign(shape.label.align);\n const position: [number, number, number] = [cx, cy, z];\n return (\n <React.Fragment key={`overlay-${shape.id}`}>\n {imageKey ? (\n <AssignmentImageOverlay\n url={imageKey}\n width={assignmentOverlayRenderSize(fontSize, shape.assignment)}\n position={position}\n rotation={tilt}\n imageProxyUrl={imageProxyUrl}\n />\n ) : (\n <Text\n font={MAP_FONT_URL}\n position={position}\n rotation={[0, 0, tilt]}\n fontSize={fontSize}\n color={iconColor}\n anchorX=\"center\"\n anchorY=\"middle\"\n textAlign={align}\n lineHeight={MAP_LABEL_LINE_HEIGHT}\n scale={[1, -1, 1]}\n raycast={skipRaycast}\n >\n {text}\n </Text>\n )}\n {shape.id === kioskOriginShapeId ? (\n <CurrentLocationPulse position={[cx, cy, z + 0.02]} />\n ) : null}\n </React.Fragment>\n );\n })}\n {connectorOverlays.map(({ shape, url, width, rotation, x, y }) => (\n <AssignmentImageOverlay\n key={`connector-icon-${shape.id}`}\n url={url}\n width={width}\n position={[x, y, 0.22]}\n rotation={rotation}\n />\n ))}\n <OpeningWells polygons={openings} />\n {meshes.map(({ shape, threeShapes, color, extrude }) => {\n const selectable = isViewerInteractiveShape(\n shape.kind,\n host,\n shape.assignment,\n );\n const hovered =\n selectable &&\n viewerShapeHighlighted(shape.id, hoveredShapeId, selectedShapeIds);\n const baseOpacity = viewerShapeBaseOpacity(\n shape.kind,\n shape.style.opacity,\n );\n const fillTransparent = isTransparentColor(color);\n const opacity = fillTransparent\n ? hovered\n ? 0.2\n : 0\n : viewerHoverFillOpacity(\n shape.kind,\n baseOpacity,\n hovered,\n );\n const emphasisFill = darkenShapeFill(\n fillTransparent ? theme.STORE_DEFAULT_COLOR : color,\n );\n const fill = hovered\n ? emphasisFill\n : fillTransparent\n ? '#000000'\n : color;\n return (\n <group key={shape.id}>\n {threeShapes.map((geoShape, idx) => (\n <mesh\n key={`${shape.id}-${idx}`}\n position={[0, 0, shape.zIndex * 0.01]}\n onPointerOver={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n setPointerHoverId(shape.id);\n applyViewerHoverCursor(\n eventSource?.current,\n viewerHoverCursor(shape.kind, host, shape.assignment),\n );\n publishHoverTooltip(shape, e);\n }}\n onPointerMove={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n publishHoverTooltip(shape, e);\n }}\n onPointerOut={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n setPointerHoverId((id) => (id === shape.id ? null : id));\n applyViewerHoverCursor(eventSource?.current, '');\n if (showHoverTooltip) {\n onHoverTooltip?.(null, { leavingShapeId: shape.id });\n }\n }}\n onPointerDown={(e) => {\n const additive = Boolean(\n e.shiftKey ||\n (e.nativeEvent as MouseEvent | undefined)?.shiftKey,\n );\n if (additive) e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n const maxDist = pointerGestureRef?.current.maxDist ?? 0;\n if (!viewerPointerClickIsTap(maxDist, e.delta)) return;\n if (selectable) {\n onSelectShape?.(shape.id, {\n additive: Boolean(\n e.shiftKey ||\n (e.nativeEvent as MouseEvent | undefined)?.shiftKey,\n ),\n });\n return;\n }\n onSelectShape?.(null);\n }}\n >\n {extrude > 0 ? (\n <extrudeGeometry\n args={[\n geoShape,\n { depth: extrude, bevelEnabled: false },\n ]}\n />\n ) : (\n <shapeGeometry args={[geoShape]} />\n )}\n <meshBasicMaterial\n color={fill}\n transparent={\n shape.style.transparent ||\n shape.kind === 'amenity' ||\n opacity < 1\n }\n opacity={opacity}\n side={THREE.DoubleSide}\n />\n {hovered ? (\n <HoverOutline\n shape={geoShape}\n extrude={extrude}\n color={emphasisFill}\n />\n ) : null}\n </mesh>\n ))}\n </group>\n );\n })}\n </group>\n );\n}\n\nfunction skipRaycast() {}\n\nfunction loadCanvasTexture(\n url: string,\n signal?: AbortSignal,\n): Promise<{ texture: THREE.CanvasTexture; aspect: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const cleanup = () => {\n signal?.removeEventListener('abort', onAbort);\n img.onload = null;\n img.onerror = null;\n };\n const onAbort = () => {\n cleanup();\n img.src = '';\n reject(new DOMException('Image load aborted', 'AbortError'));\n };\n if (signal?.aborted) {\n onAbort();\n return;\n }\n signal?.addEventListener('abort', onAbort, { once: true });\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n cleanup();\n const width = img.naturalWidth || img.width;\n const height = img.naturalHeight || img.height;\n if (!width || !height) {\n reject(new Error('empty image'));\n return;\n }\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n reject(new Error('canvas'));\n return;\n }\n ctx.drawImage(img, 0, 0);\n const texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n texture.needsUpdate = true;\n resolve({ texture, aspect: height / width });\n };\n img.onerror = () => {\n cleanup();\n reject(new Error(`Failed to load ${url}`));\n };\n img.src = url;\n });\n}\n\nfunction AssignmentImageOverlay({\n url,\n width,\n position,\n rotation,\n imageProxyUrl,\n}: {\n url: string;\n width: number;\n position: [number, number, number];\n rotation: number;\n imageProxyUrl?: string | null;\n}) {\n const [texture, setTexture] = useState<THREE.CanvasTexture | null>(null);\n const [aspect, setAspect] = useState(1);\n\n useEffect(() => {\n let disposed = false;\n let loaded: THREE.CanvasTexture | null = null;\n const controller = new AbortController();\n setTexture(null);\n const proxied = resolveFetchUrl(url, imageProxyUrl);\n const candidates = proxied === url ? [url] : [proxied, url];\n const load = async () => {\n let lastError: unknown;\n for (const src of candidates) {\n try {\n const next = await loadCanvasTexture(src, controller.signal);\n if (disposed) {\n next.texture.dispose();\n return;\n }\n loaded = next.texture;\n setAspect(next.aspect);\n setTexture(next.texture);\n return;\n } catch (error) {\n if (controller.signal.aborted) return;\n lastError = error;\n }\n }\n if (!disposed) {\n setTexture(null);\n if (lastError) console.warn('Retail logo failed to load', url, lastError);\n }\n };\n void load();\n return () => {\n disposed = true;\n controller.abort();\n loaded?.dispose();\n };\n }, [url, imageProxyUrl]);\n\n if (!texture || width <= 0) return null;\n\n return (\n <mesh\n position={position}\n rotation={[0, 0, rotation]}\n scale={[1, -1, 1]}\n renderOrder={30}\n raycast={skipRaycast}\n >\n <planeGeometry args={[width, width * aspect]} />\n <meshBasicMaterial\n map={texture}\n transparent\n depthTest={false}\n depthWrite={false}\n side={THREE.DoubleSide}\n toneMapped={false}\n />\n </mesh>\n );\n}\n","import type { PathResult, Vec2 } from '../core';\n\nexport type RouteChangeIntent = 'forward' | 'back';\n\nexport interface RouteLevelChangeMarker {\n x: number;\n y: number;\n displayX: number;\n displayY: number;\n connectorId: number | null;\n targetLevelId: number;\n /** v1 label: To = continue toward the destination, From = go back. */\n direction: 'To' | 'From';\n intent: RouteChangeIntent;\n}\n\nexport const ROUTE_CHANGE_MARKER_GAP = 44;\nexport const ROUTE_CHANGE_MARKER_CLUSTER = 8;\n\nexport function routeOriginLevelId(\n route: PathResult | null | undefined,\n): number | null {\n return route?.points[0]?.levelId ?? null;\n}\n\n/** Pin the camera to the start floor only when the trip itself changes. */\nexport function shouldPinViewToRouteOrigin(\n previousFrom: number | null,\n previousTo: number | null,\n nextFrom: number | null,\n nextTo: number | null,\n): boolean {\n if (nextFrom == null || nextTo == null) return false;\n return previousFrom !== nextFrom || previousTo !== nextTo;\n}\n\nexport function routeVisitedLevelIds(route: PathResult): number[] {\n const ids: number[] = [];\n for (const point of route.points) {\n if (ids[ids.length - 1] !== point.levelId) ids.push(point.levelId);\n }\n return ids;\n}\n\nexport function routeChangeLabel(\n intent: RouteChangeIntent,\n floorName: string,\n): string {\n return intent === 'forward' ? `Continue to ${floorName}` : `Back to ${floorName}`;\n}\n\nexport function routePointsOnLevel(\n route: PathResult,\n levelId: number,\n): Vec2[] {\n return route.points\n .filter((point) => point.levelId === levelId)\n .map((point) => ({ x: point.x, y: point.y }));\n}\n\n/** Contiguous walks on one floor — a later revisit starts a new segment. */\nexport function routeSegmentsForLevel(\n route: PathResult,\n levelId: number,\n): Vec2[][] {\n const segments: Vec2[][] = [];\n let current: Vec2[] = [];\n for (const point of route.points) {\n if (point.levelId === levelId) {\n current.push({ x: point.x, y: point.y });\n continue;\n }\n if (current.length > 0) {\n segments.push(current);\n current = [];\n }\n }\n if (current.length > 0) segments.push(current);\n return segments;\n}\n\nfunction markerDistance(a: Vec2, b: Vec2): number {\n return Math.hypot(a.x - b.x, a.y - b.y);\n}\n\nexport function layoutRouteLevelChangeMarkers<\n T extends { x: number; y: number; intent: RouteChangeIntent },\n>(markers: T[]): Array<T & { displayX: number; displayY: number }> {\n const placed = markers.map((marker) => ({\n ...marker,\n displayX: marker.x,\n displayY: marker.y,\n }));\n const used = new Set<number>();\n\n for (let i = 0; i < placed.length; i += 1) {\n if (used.has(i)) continue;\n const group = [i];\n for (let j = i + 1; j < placed.length; j += 1) {\n if (used.has(j)) continue;\n if (markerDistance(placed[i], placed[j]) <= ROUTE_CHANGE_MARKER_CLUSTER) {\n group.push(j);\n }\n }\n for (const index of group) used.add(index);\n\n if (group.length === 1) continue;\n\n const ordered = [...group].sort((a, b) => {\n const rank = (intent: RouteChangeIntent) => (intent === 'back' ? 0 : 1);\n return rank(placed[a].intent) - rank(placed[b].intent);\n });\n const span = ROUTE_CHANGE_MARKER_GAP * (ordered.length - 1);\n ordered.forEach((index, offset) => {\n placed[index].displayX =\n placed[index].x - span / 2 + offset * ROUTE_CHANGE_MARKER_GAP;\n placed[index].displayY = placed[index].y;\n });\n }\n\n return placed;\n}\n\nexport function routeLevelChangeMarkers(\n route: PathResult,\n levelId: number,\n): RouteLevelChangeMarker[] {\n const raw: Array<Omit<RouteLevelChangeMarker, 'displayX' | 'displayY'>> = [];\n let changeIndex = 0;\n for (let index = 1; index < route.points.length; index += 1) {\n const from = route.points[index - 1];\n const to = route.points[index];\n if (from.levelId === to.levelId) continue;\n const change = route.levelChanges[changeIndex];\n changeIndex += 1;\n if (from.levelId === levelId) {\n raw.push({\n x: from.x,\n y: from.y,\n connectorId: change?.connectorId ?? null,\n targetLevelId: to.levelId,\n direction: 'To',\n intent: 'forward',\n });\n } else if (to.levelId === levelId) {\n raw.push({\n x: to.x,\n y: to.y,\n connectorId: change?.connectorId ?? null,\n targetLevelId: from.levelId,\n direction: 'From',\n intent: 'back',\n });\n }\n }\n return layoutRouteLevelChangeMarkers(raw);\n}\n","import React, { useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport { Html } from '@react-three/drei';\nimport * as THREE from 'three';\nimport type { CmConnector, PathResult } from '../../core';\nimport {\n DEFAULT_THEME,\n isTransparentColor,\n isVerticalRouteConnectorKind,\n} from '../../core';\nimport {\n connectorMapIconDataUrl,\n levelTravel,\n} from '../../specialIcons';\nimport {\n routeChangeLabel,\n routeLevelChangeMarkers,\n routePointsOnLevel,\n routeSegmentsForLevel,\n type RouteLevelChangeMarker,\n} from '../routeFloorChanges';\n\nexport const V1_ROUTE_COLOR = '#4ea5ff';\nexport const V1_ROUTE_RADIUS = 6;\nexport const V1_ROUTE_TUBULAR_SEGMENTS = 400;\nexport const V1_ROUTE_RADIAL_SEGMENTS = 8;\nexport const V1_ROUTE_REVEAL_MS = 1000;\nexport const V1_ROUTE_TEXTURE_MS = 2000;\n\nexport {\n routeChangeLabel,\n routeLevelChangeMarkers,\n routeSegmentsForLevel,\n type RouteLevelChangeMarker,\n} from '../routeFloorChanges';\n\nexport function routePointsForLevel(\n route: PathResult,\n levelId: number,\n): THREE.Vector3[] {\n return routePointsOnLevel(route, levelId).map(\n (point) => new THREE.Vector3(point.x, point.y, 0),\n );\n}\n\nexport function resolveRouteColor(color?: string | null): string {\n if (!color || isTransparentColor(color)) return V1_ROUTE_COLOR;\n return color;\n}\n\nexport const ROUTE_CHANGE_RING_COLOR = '#444444';\n\nexport function resolveRouteChangeCircleColor(): string {\n return ROUTE_CHANGE_RING_COLOR;\n}\n\nexport function resolveRouteThickness(thickness?: number | null): number {\n if (thickness == null || !Number.isFinite(thickness) || thickness <= 0) {\n return DEFAULT_THEME.ROUTE_THICKNESS;\n }\n return thickness;\n}\n\nconst _routeScale = new THREE.Vector3();\nconst _routeWorldPoint = new THREE.Vector3();\n\n/**\n * World-space tube radius that keeps `screenRadius` pixels on screen.\n * Orthographic: `1 / zoom` world units per CSS pixel.\n * Perspective: uses vertical fov, camera distance, and viewport height.\n * `worldScale` undoes a parent level transform so the line stays the same\n * after the group scale is applied.\n */\nexport function routeWorldRadiusForView(options: {\n screenRadius: number;\n orthoZoom?: number;\n perspectiveFov?: number;\n perspectiveDistance?: number;\n viewportHeight?: number;\n worldScale?: number;\n}): number {\n const screenRadius = Math.max(options.screenRadius, 0);\n let world = screenRadius;\n const zoom = options.orthoZoom;\n if (zoom != null && Number.isFinite(zoom) && zoom > 0) {\n world = screenRadius / zoom;\n } else if (\n options.perspectiveFov != null &&\n options.perspectiveDistance != null &&\n options.viewportHeight != null &&\n options.perspectiveFov > 0 &&\n options.perspectiveDistance > 0 &&\n options.viewportHeight > 0\n ) {\n const worldHeight =\n 2 *\n Math.tan((options.perspectiveFov * Math.PI) / 360) *\n options.perspectiveDistance;\n world = (screenRadius * worldHeight) / options.viewportHeight;\n }\n const scale = Math.abs(options.worldScale ?? 1);\n return world / Math.max(scale, 1e-6);\n}\n\nexport function routeWorldRadiusForCamera(\n camera: THREE.Camera,\n screenRadius: number,\n viewportHeight: number,\n worldScale: number,\n samplePoint?: THREE.Vector3,\n): number {\n if (camera instanceof THREE.OrthographicCamera) {\n return routeWorldRadiusForView({\n screenRadius,\n orthoZoom: camera.zoom,\n worldScale,\n });\n }\n if (camera instanceof THREE.PerspectiveCamera) {\n const distance = samplePoint\n ? camera.position.distanceTo(samplePoint)\n : camera.position.length();\n return routeWorldRadiusForView({\n screenRadius,\n perspectiveFov: camera.fov,\n perspectiveDistance: Math.max(distance, 1e-6),\n viewportHeight,\n worldScale,\n });\n }\n return routeWorldRadiusForView({ screenRadius, worldScale });\n}\n\n/** Tube vertices sit `baseRadius` along their normals from the path. */\nexport function applyRouteTubeRadius(\n geometry: THREE.BufferGeometry,\n basePositions: ArrayLike<number>,\n baseRadius: number,\n targetRadius: number,\n): void {\n const position = geometry.getAttribute('position');\n const normal = geometry.getAttribute('normal');\n if (!position || !normal) return;\n const delta = targetRadius - baseRadius;\n for (let i = 0; i < position.count; i += 1) {\n const i3 = i * 3;\n position.setXYZ(\n i,\n basePositions[i3] + normal.getX(i) * delta,\n basePositions[i3 + 1] + normal.getY(i) * delta,\n basePositions[i3 + 2] + normal.getZ(i) * delta,\n );\n }\n position.needsUpdate = true;\n}\n\nfunction createRouteTexture(distance: number, color: string): THREE.CanvasTexture {\n const canvas = document.createElement('canvas');\n const width = Math.max(1, Math.floor(distance));\n canvas.width = width;\n canvas.height = 80;\n const context = canvas.getContext('2d');\n\n if (context) {\n context.fillStyle = color;\n context.fillRect(0, 0, width, canvas.height);\n\n const gradientWidth = Math.min(120, Math.max(60, distance * 0.1));\n const gradient = context.createLinearGradient(0, 0, gradientWidth, 0);\n gradient.addColorStop(0, color);\n gradient.addColorStop(0.4, 'white');\n gradient.addColorStop(0.6, 'white');\n gradient.addColorStop(1, color);\n context.fillStyle = gradient;\n context.fillRect(10, 0, gradientWidth, canvas.height);\n }\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.offset.x = 1;\n texture.colorSpace = THREE.SRGBColorSpace;\n return texture;\n}\n\nfunction easeInOutCubic(value: number): number {\n const x = Math.min(1, Math.max(0, value));\n return x < 0.5 ? 4 * x ** 3 : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nfunction RouteTube({\n points,\n color,\n radius,\n}: {\n points: THREE.Vector3[];\n color: string;\n radius: number;\n}) {\n const invalidate = useThree((state) => state.invalidate);\n const camera = useThree((state) => state.camera);\n const viewportHeight = useThree((state) => state.size.height);\n const meshRef = useRef<THREE.Mesh>(null);\n const animationStartedAt = useRef(0);\n const appliedRadius = useRef<number | null>(null);\n const routeShape = useMemo(() => {\n if (points.length < 2) return null;\n const path = new THREE.CurvePath<THREE.Vector3>();\n let distance = 0;\n for (let index = 1; index < points.length; index += 1) {\n path.add(new THREE.LineCurve3(points[index - 1], points[index]));\n distance += points[index - 1].distanceTo(points[index]);\n }\n const geometry = new THREE.TubeGeometry(\n path,\n V1_ROUTE_TUBULAR_SEGMENTS,\n radius,\n V1_ROUTE_RADIAL_SEGMENTS,\n );\n geometry.setDrawRange(0, 0);\n return {\n distance,\n geometry,\n texture: createRouteTexture(distance, color),\n basePositions: new Float32Array(geometry.attributes.position.array),\n baseRadius: radius,\n };\n }, [color, points, radius]);\n\n const syncScreenRadius = () => {\n const mesh = meshRef.current;\n if (!routeShape || !mesh) return;\n const worldScale = Math.abs(mesh.getWorldScale(_routeScale).x);\n _routeWorldPoint.copy(points[0]);\n mesh.localToWorld(_routeWorldPoint);\n const target = routeWorldRadiusForCamera(\n camera,\n radius,\n viewportHeight,\n worldScale,\n _routeWorldPoint,\n );\n if (appliedRadius.current === target) return;\n applyRouteTubeRadius(\n routeShape.geometry,\n routeShape.basePositions,\n routeShape.baseRadius,\n target,\n );\n appliedRadius.current = target;\n };\n\n useLayoutEffect(() => {\n appliedRadius.current = null;\n syncScreenRadius();\n }, [camera, radius, routeShape, viewportHeight]);\n\n useEffect(() => {\n if (!routeShape) return;\n animationStartedAt.current = performance.now();\n routeShape.geometry.setDrawRange(0, 0);\n routeShape.texture.offset.x = 1;\n invalidate();\n return () => {\n routeShape.geometry.dispose();\n routeShape.texture.dispose();\n };\n }, [invalidate, routeShape]);\n\n useFrame(() => {\n if (!routeShape) return;\n syncScreenRadius();\n const elapsed = performance.now() - animationStartedAt.current;\n const indexCount = routeShape.geometry.index?.count ?? 0;\n if (elapsed < V1_ROUTE_REVEAL_MS) {\n const progress = easeInOutCubic(elapsed / V1_ROUTE_REVEAL_MS);\n routeShape.geometry.setDrawRange(0, Math.floor(progress * indexCount));\n } else {\n routeShape.geometry.setDrawRange(0, indexCount);\n const progress = (elapsed / V1_ROUTE_TEXTURE_MS) % 1;\n routeShape.texture.offset.x = 0.1 - 1.1 * easeInOutCubic(progress);\n }\n invalidate();\n });\n\n if (!routeShape) return null;\n return (\n <mesh ref={meshRef} geometry={routeShape.geometry} renderOrder={20}>\n <meshBasicMaterial\n map={routeShape.texture}\n transparent\n side={THREE.DoubleSide}\n depthTest={false}\n depthWrite={false}\n />\n </mesh>\n );\n}\n\nfunction RouteChangeButton({\n change,\n levelId,\n levels,\n connectors,\n color,\n onActiveLevelChange,\n}: {\n change: RouteLevelChangeMarker;\n levelId: number;\n levels?: ReadonlyArray<{\n id: number;\n name: string;\n levelIndex?: number;\n ordering?: number;\n }>;\n connectors?: readonly CmConnector[];\n color: string;\n onActiveLevelChange?: (levelId: number) => void;\n}) {\n const connector = connectors?.find((item) => item.id === change.connectorId);\n const iconKind = isVerticalRouteConnectorKind(connector?.kind)\n ? connector.kind\n : null;\n const here = levels?.find((item) => item.id === levelId);\n const there = levels?.find((item) => item.id === change.targetLevelId);\n const travel =\n iconKind === 'escalator' && here && there\n ? levelTravel(here, there)\n : null;\n const icon = iconKind\n ? connectorMapIconDataUrl(iconKind, true, '#ffffff', travel)\n : undefined;\n const targetName =\n levels?.find((level) => level.id === change.targetLevelId)?.name ??\n String(change.targetLevelId);\n const label = routeChangeLabel(change.intent, targetName);\n const ringColor = resolveRouteChangeCircleColor();\n return (\n <Html\n position={[change.displayX, change.displayY, 7]}\n zIndexRange={[30, 20]}\n style={{ pointerEvents: 'none' }}\n >\n <button\n type=\"button\"\n className={`eyeon-map-route-change eyeon-map-route-change--${change.intent}`}\n style={\n {\n backgroundColor: color,\n borderColor: ringColor,\n '--eyeon-route-change-intent': ringColor,\n pointerEvents: 'auto',\n } as React.CSSProperties\n }\n aria-label={label}\n onClick={(event) => {\n event.stopPropagation();\n onActiveLevelChange?.(change.targetLevelId);\n }}\n >\n <span className=\"eyeon-map-route-change__icon\">\n {icon ? <img src={icon} alt=\"\" /> : <span aria-hidden>↕</span>}\n </span>\n <span className=\"eyeon-map-route-change__intent\" aria-hidden>\n {change.intent === 'forward' ? '→' : '←'}\n </span>\n <span className=\"eyeon-map-hover-tooltip eyeon-map-route-change__tooltip\">\n <span className=\"eyeon-map-hover-tooltip__pop\">\n <span className=\"eyeon-map-hover-tooltip__label\">{label}</span>\n <span className=\"eyeon-map-hover-tooltip__arrow\" aria-hidden=\"true\" />\n </span>\n </span>\n </button>\n </Html>\n );\n}\n\nexport function RouteLine({\n route,\n levelId,\n levels,\n connectors,\n color,\n thickness,\n onActiveLevelChange,\n}: {\n route: PathResult;\n levelId: number;\n levels?: ReadonlyArray<{\n id: number;\n name: string;\n levelIndex?: number;\n ordering?: number;\n }>;\n connectors?: readonly CmConnector[];\n color?: string;\n thickness?: number;\n onActiveLevelChange?: (levelId: number) => void;\n}) {\n const routeColor = resolveRouteColor(color);\n const routeRadius = resolveRouteThickness(thickness);\n const segments = useMemo(\n () =>\n routeSegmentsForLevel(route, levelId).map((segment) =>\n segment.map((point) => new THREE.Vector3(point.x, point.y, 0)),\n ),\n [levelId, route],\n );\n const levelChanges = useMemo(\n () => routeLevelChangeMarkers(route, levelId),\n [levelId, route],\n );\n\n if (segments.every((segment) => segment.length < 2) && levelChanges.length === 0) {\n return null;\n }\n\n return (\n <>\n {segments.map((points, index) =>\n points.length >= 2 ? (\n <RouteTube\n key={`route-seg-${levelId}-${index}`}\n points={points}\n color={routeColor}\n radius={routeRadius}\n />\n ) : null,\n )}\n {levelChanges.map((change, index) => (\n <RouteChangeButton\n key={`${change.intent}-${change.targetLevelId}-${index}`}\n change={change}\n levelId={levelId}\n levels={levels}\n connectors={connectors}\n color={routeColor}\n onActiveLevelChange={onActiveLevelChange}\n />\n ))}\n </>\n );\n}\n","import {\n\tBox2,\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tMatrix3,\n\tPath,\n\tShape,\n\tShapePath,\n\tShapeUtils,\n\tSRGBColorSpace,\n\tVector2,\n\tVector3\n} from 'three';\n\nconst COLOR_SPACE_SVG = SRGBColorSpace;\n\n/**\n * A loader for the SVG format.\n *\n * Scalable Vector Graphics is an XML-based vector image format for two-dimensional graphics\n * with support for interactivity and animation.\n *\n * ```js\n * const loader = new SVGLoader();\n * const data = await loader.loadAsync( 'data/svgSample.svg' );\n *\n * const paths = data.paths;\n * const group = new THREE.Group();\n *\n * for ( let i = 0; i < paths.length; i ++ ) {\n *\n * \tconst path = paths[ i ];\n * \tconst material = new THREE.MeshBasicMaterial( {\n * \t\tcolor: path.color,\n * \t\tside: THREE.DoubleSide,\n * \t\tdepthWrite: false\n * \t} );\n *\n * \tconst shapes = SVGLoader.createShapes( path );\n *\n * \tfor ( let j = 0; j < shapes.length; j ++ ) {\n *\n * \t\tconst shape = shapes[ j ];\n * \t\tconst geometry = new THREE.ShapeGeometry( shape );\n * \t\tconst mesh = new THREE.Mesh( geometry, material );\n * \t\tgroup.add( mesh );\n *\n * \t}\n *\n * }\n *\n * scene.add( group );\n * ```\n *\n * @augments Loader\n * @three_import import { SVGLoader } from 'three/addons/loaders/SVGLoader.js';\n */\nclass SVGLoader extends Loader {\n\n\t/**\n\t * Constructs a new SVG loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Default dots per inch.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 90\n\t\t */\n\t\tthis.defaultDPI = 90;\n\n\t\t/**\n\t\t * Default unit.\n\t\t *\n\t\t * @type {('mm'|'cm'|'in'|'pt'|'pc'|'px')}\n\t\t * @default 'px'\n\t\t */\n\t\tthis.defaultUnit = 'px';\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded SVG asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({paths:Array<ShapePath>,xml:string})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given SVG data and returns the resulting data.\n\t *\n\t * @param {string} text - The raw SVG data as a string.\n\t * @return {{paths:Array<ShapePath>,xml:string}} An object holding an array of shape paths and the\n\t * SVG XML document.\n\t */\n\tparse( text ) {\n\n\t\tconst scope = this;\n\n\t\tfunction parseNode( node, style ) {\n\n\t\t\tif ( node.nodeType !== 1 ) return;\n\n\t\t\tconst transform = getNodeTransform( node );\n\n\t\t\tlet isDefsNode = false;\n\n\t\t\tlet path = null;\n\n\t\t\tswitch ( node.nodeName ) {\n\n\t\t\t\tcase 'svg':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'style':\n\t\t\t\t\tparseCSSStylesheet( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'g':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'path':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tif ( node.hasAttribute( 'd' ) ) path = parsePathNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rect':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseRectNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polygon':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolygonNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polyline':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolylineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'circle':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseCircleNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ellipse':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseEllipseNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'line':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseLineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'defs':\n\t\t\t\t\tisDefsNode = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'use':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\n\t\t\t\t\tconst href = node.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ) || '';\n\t\t\t\t\tconst usedNodeId = href.substring( 1 );\n\t\t\t\t\tconst usedNode = node.viewportElement.getElementById( usedNodeId );\n\t\t\t\t\tif ( usedNode ) {\n\n\t\t\t\t\t\tparseNode( usedNode, style );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'SVGLoader: \\'use node\\' references non-existent node id: ' + usedNodeId );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// console.log( node );\n\n\t\t\t}\n\n\t\t\tif ( path ) {\n\n\t\t\t\tif ( style.fill !== undefined && style.fill !== 'none' ) {\n\n\t\t\t\t\tpath.color.setStyle( style.fill, COLOR_SPACE_SVG );\n\n\t\t\t\t}\n\n\t\t\t\ttransformPath( path, currentTransform );\n\n\t\t\t\tpaths.push( path );\n\n\t\t\t\tpath.userData = { node: node, style: style };\n\n\t\t\t}\n\n\t\t\tconst childNodes = node.childNodes;\n\n\t\t\tfor ( let i = 0; i < childNodes.length; i ++ ) {\n\n\t\t\t\tconst node = childNodes[ i ];\n\n\t\t\t\tif ( isDefsNode && node.nodeName !== 'style' && node.nodeName !== 'defs' ) {\n\n\t\t\t\t\t// Ignore everything in defs except CSS style definitions\n\t\t\t\t\t// and nested defs, because it is OK by the standard to have\n\t\t\t\t\t// <style/> there.\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tparseNode( node, style );\n\n\t\t\t}\n\n\n\t\t\tif ( transform ) {\n\n\t\t\t\ttransformStack.pop();\n\n\t\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\t\tcurrentTransform.copy( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parsePathNode( node ) {\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tconst point = new Vector2();\n\t\t\tconst control = new Vector2();\n\n\t\t\tconst firstPoint = new Vector2();\n\t\t\tlet isFirstPoint = true;\n\t\t\tlet doSetFirstPoint = false;\n\n\t\t\tconst d = node.getAttribute( 'd' );\n\n\t\t\tif ( d === '' || d === 'none' ) return null;\n\n\t\t\t// console.log( d );\n\n\t\t\tconst commands = d.match( /[a-df-z][^a-df-z]*/ig );\n\n\t\t\tfor ( let i = 0, l = commands.length; i < l; i ++ ) {\n\n\t\t\t\tconst command = commands[ i ];\n\n\t\t\t\tconst type = command.charAt( 0 );\n\t\t\t\tconst data = command.slice( 1 ).trim();\n\n\t\t\t\tif ( isFirstPoint === true ) {\n\n\t\t\t\t\tdoSetFirstPoint = true;\n\t\t\t\t\tisFirstPoint = false;\n\n\t\t\t\t}\n\n\t\t\t\tlet numbers;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'M':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'H':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'V':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'L':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'C':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 4 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'S':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'T':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if start point == end point\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == point.x && numbers[ j + 6 ] == point.y ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'h':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'l':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 4 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = point.y + numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if no displacement\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == 0 && numbers[ j + 6 ] == 0 ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\tcase 'z':\n\t\t\t\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\t\t\t\tif ( path.currentPath.curves.length > 0 ) {\n\n\t\t\t\t\t\t\t// Reset point to beginning of Path\n\t\t\t\t\t\t\tpoint.copy( firstPoint );\n\t\t\t\t\t\t\tpath.currentPath.currentPoint.copy( point );\n\t\t\t\t\t\t\tisFirstPoint = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( command );\n\n\t\t\t\t}\n\n\t\t\t\t// console.log( type, parseFloats( data ), parseFloats( data ).length )\n\n\t\t\t\tdoSetFirstPoint = false;\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCSSStylesheet( node ) {\n\n\t\t\tif ( ! node.sheet || ! node.sheet.cssRules || ! node.sheet.cssRules.length ) return;\n\n\t\t\tfor ( let i = 0; i < node.sheet.cssRules.length; i ++ ) {\n\n\t\t\t\tconst stylesheet = node.sheet.cssRules[ i ];\n\n\t\t\t\tif ( stylesheet.type !== 1 ) continue;\n\n\t\t\t\tconst selectorList = stylesheet.selectorText\n\t\t\t\t\t.split( /,/gm )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let j = 0; j < selectorList.length; j ++ ) {\n\n\t\t\t\t\t// Remove empty rules\n\t\t\t\t\tconst definitions = Object.fromEntries(\n\t\t\t\t\t\tObject.entries( stylesheet.style ).filter( ( [ , v ] ) => v !== '' )\n\t\t\t\t\t);\n\n\t\t\t\t\tstylesheets[ selectorList[ j ] ] = Object.assign(\n\t\t\t\t\t\tstylesheets[ selectorList[ j ] ] || {},\n\t\t\t\t\t\tdefinitions\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes\n\t\t * https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion\n\t\t * From\n\t\t * rx ry x-axis-rotation large-arc-flag sweep-flag x y\n\t\t * To\n\t\t * aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation\n\t\t */\n\n\t\tfunction parseArcCommand( path, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, start, end ) {\n\n\t\t\tif ( rx == 0 || ry == 0 ) {\n\n\t\t\t\t// draw a line if either of the radii == 0\n\t\t\t\tpath.lineTo( end.x, end.y );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tx_axis_rotation = x_axis_rotation * Math.PI / 180;\n\n\t\t\t// Ensure radii are positive\n\t\t\trx = Math.abs( rx );\n\t\t\try = Math.abs( ry );\n\n\t\t\t// Compute (x1', y1')\n\t\t\tconst dx2 = ( start.x - end.x ) / 2.0;\n\t\t\tconst dy2 = ( start.y - end.y ) / 2.0;\n\t\t\tconst x1p = Math.cos( x_axis_rotation ) * dx2 + Math.sin( x_axis_rotation ) * dy2;\n\t\t\tconst y1p = - Math.sin( x_axis_rotation ) * dx2 + Math.cos( x_axis_rotation ) * dy2;\n\n\t\t\t// Compute (cx', cy')\n\t\t\tlet rxs = rx * rx;\n\t\t\tlet rys = ry * ry;\n\t\t\tconst x1ps = x1p * x1p;\n\t\t\tconst y1ps = y1p * y1p;\n\n\t\t\t// Ensure radii are large enough\n\t\t\tconst cr = x1ps / rxs + y1ps / rys;\n\n\t\t\tif ( cr > 1 ) {\n\n\t\t\t\t// scale up rx,ry equally so cr == 1\n\t\t\t\tconst s = Math.sqrt( cr );\n\t\t\t\trx = s * rx;\n\t\t\t\try = s * ry;\n\t\t\t\trxs = rx * rx;\n\t\t\t\trys = ry * ry;\n\n\t\t\t}\n\n\t\t\tconst dq = ( rxs * y1ps + rys * x1ps );\n\t\t\tconst pq = ( rxs * rys - dq ) / dq;\n\t\t\tlet q = Math.sqrt( Math.max( 0, pq ) );\n\t\t\tif ( large_arc_flag === sweep_flag ) q = - q;\n\t\t\tconst cxp = q * rx * y1p / ry;\n\t\t\tconst cyp = - q * ry * x1p / rx;\n\n\t\t\t// Step 3: Compute (cx, cy) from (cx', cy')\n\t\t\tconst cx = Math.cos( x_axis_rotation ) * cxp - Math.sin( x_axis_rotation ) * cyp + ( start.x + end.x ) / 2;\n\t\t\tconst cy = Math.sin( x_axis_rotation ) * cxp + Math.cos( x_axis_rotation ) * cyp + ( start.y + end.y ) / 2;\n\n\t\t\t// Step 4: Compute θ1 and Δθ\n\t\t\tconst theta = svgAngle( 1, 0, ( x1p - cxp ) / rx, ( y1p - cyp ) / ry );\n\t\t\tconst delta = svgAngle( ( x1p - cxp ) / rx, ( y1p - cyp ) / ry, ( - x1p - cxp ) / rx, ( - y1p - cyp ) / ry ) % ( Math.PI * 2 );\n\n\t\t\tpath.currentPath.absellipse( cx, cy, rx, ry, theta, theta + delta, sweep_flag === 0, x_axis_rotation );\n\n\t\t}\n\n\t\tfunction svgAngle( ux, uy, vx, vy ) {\n\n\t\t\tconst dot = ux * vx + uy * vy;\n\t\t\tconst len = Math.sqrt( ux * ux + uy * uy ) * Math.sqrt( vx * vx + vy * vy );\n\t\t\tlet ang = Math.acos( Math.max( - 1, Math.min( 1, dot / len ) ) ); // floating point precision, slightly over values appear\n\t\t\tif ( ( ux * vy - uy * vx ) < 0 ) ang = - ang;\n\t\t\treturn ang;\n\n\t\t}\n\n\t\t/*\n\t\t* According to https://www.w3.org/TR/SVG/shapes.html#RectElementRXAttribute\n\t\t* rounded corner should be rendered to elliptical arc, but bezier curve does the job well enough\n\t\t*/\n\n\t\tfunction parseRectNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'x' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'y' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || node.getAttribute( 'ry' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst w = parseFloatWithUnits( node.getAttribute( 'width' ) );\n\t\t\tconst h = parseFloatWithUnits( node.getAttribute( 'height' ) );\n\n\t\t\t// Ellipse arc to Bezier approximation Coefficient (Inversed). See:\n\t\t\t// https://spencermortensen.com/articles/bezier-circle/\n\t\t\tconst bci = 1 - 0.551915024494;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\t// top left\n\t\t\tpath.moveTo( x + rx, y );\n\n\t\t\t// top right\n\t\t\tpath.lineTo( x + w - rx, y );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry * bci,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom right\n\t\t\tpath.lineTo( x + w, y + h - ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx + w - rx,\n\t\t\t\t\ty + h\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom left\n\t\t\tpath.lineTo( x + rx, y + h );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// back to top left\n\t\t\tpath.lineTo( x, y + ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo( x, y + ry * bci, x + rx * bci, y, x + rx, y );\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolygonNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolylineNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCircleNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst r = parseFloatWithUnits( node.getAttribute( 'r' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absarc( x, y, r, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseEllipseNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absellipse( x, y, rx, ry, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseLineNode( node ) {\n\n\t\t\tconst x1 = parseFloatWithUnits( node.getAttribute( 'x1' ) || 0 );\n\t\t\tconst y1 = parseFloatWithUnits( node.getAttribute( 'y1' ) || 0 );\n\t\t\tconst x2 = parseFloatWithUnits( node.getAttribute( 'x2' ) || 0 );\n\t\t\tconst y2 = parseFloatWithUnits( node.getAttribute( 'y2' ) || 0 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.moveTo( x1, y1 );\n\t\t\tpath.lineTo( x2, y2 );\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction parseStyle( node, style ) {\n\n\t\t\tstyle = Object.assign( {}, style ); // clone style\n\n\t\t\tlet stylesheetStyles = {};\n\n\t\t\tif ( node.hasAttribute( 'class' ) ) {\n\n\t\t\t\tconst classSelectors = node.getAttribute( 'class' )\n\t\t\t\t\t.split( /\\s/ )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let i = 0; i < classSelectors.length; i ++ ) {\n\n\t\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '.' + classSelectors[ i ] ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'id' ) ) {\n\n\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '#' + node.getAttribute( 'id' ) ] );\n\n\t\t\t}\n\n\t\t\tfunction addStyle( svgName, jsName, adjustFunction ) {\n\n\t\t\t\tif ( adjustFunction === undefined ) adjustFunction = function copy( v ) {\n\n\t\t\t\t\tif ( v.startsWith( 'url' ) ) console.warn( 'SVGLoader: url access in attributes is not implemented.' );\n\n\t\t\t\t\treturn v;\n\n\t\t\t\t};\n\n\t\t\t\tif ( node.hasAttribute( svgName ) ) style[ jsName ] = adjustFunction( node.getAttribute( svgName ) );\n\t\t\t\tif ( stylesheetStyles[ svgName ] ) style[ jsName ] = adjustFunction( stylesheetStyles[ svgName ] );\n\t\t\t\tif ( node.style && node.style[ svgName ] !== '' ) style[ jsName ] = adjustFunction( node.style[ svgName ] );\n\n\t\t\t}\n\n\t\t\tfunction clamp( v ) {\n\n\t\t\t\treturn Math.max( 0, Math.min( 1, parseFloatWithUnits( v ) ) );\n\n\t\t\t}\n\n\t\t\tfunction positive( v ) {\n\n\t\t\t\treturn Math.max( 0, parseFloatWithUnits( v ) );\n\n\t\t\t}\n\n\t\t\taddStyle( 'fill', 'fill' );\n\t\t\taddStyle( 'fill-opacity', 'fillOpacity', clamp );\n\t\t\taddStyle( 'fill-rule', 'fillRule' );\n\t\t\taddStyle( 'opacity', 'opacity', clamp );\n\t\t\taddStyle( 'stroke', 'stroke' );\n\t\t\taddStyle( 'stroke-opacity', 'strokeOpacity', clamp );\n\t\t\taddStyle( 'stroke-width', 'strokeWidth', positive );\n\t\t\taddStyle( 'stroke-linejoin', 'strokeLineJoin' );\n\t\t\taddStyle( 'stroke-linecap', 'strokeLineCap' );\n\t\t\taddStyle( 'stroke-miterlimit', 'strokeMiterLimit', positive );\n\t\t\taddStyle( 'visibility', 'visibility' );\n\n\t\t\treturn style;\n\n\t\t}\n\n\t\t// http://www.w3.org/TR/SVG11/implnote.html#PathElementImplementationNotes\n\n\t\tfunction getReflection( a, b ) {\n\n\t\t\treturn a - ( b - a );\n\n\t\t}\n\n\t\t// from https://github.com/ppvg/svg-numbers (MIT License)\n\n\t\tfunction parseFloats( input, flags, stride ) {\n\n\t\t\tif ( typeof input !== 'string' ) {\n\n\t\t\t\tthrow new TypeError( 'Invalid input: ' + typeof input );\n\n\t\t\t}\n\n\t\t\t// Character groups\n\t\t\tconst RE = {\n\t\t\t\tSEPARATOR: /[ \\t\\r\\n\\,.\\-+]/,\n\t\t\t\tWHITESPACE: /[ \\t\\r\\n]/,\n\t\t\t\tDIGIT: /[\\d]/,\n\t\t\t\tSIGN: /[-+]/,\n\t\t\t\tPOINT: /\\./,\n\t\t\t\tCOMMA: /,/,\n\t\t\t\tEXP: /e/i,\n\t\t\t\tFLAGS: /[01]/\n\t\t\t};\n\n\t\t\t// States\n\t\t\tconst SEP = 0;\n\t\t\tconst INT = 1;\n\t\t\tconst FLOAT = 2;\n\t\t\tconst EXP = 3;\n\n\t\t\tlet state = SEP;\n\t\t\tlet seenComma = true;\n\t\t\tlet number = '', exponent = '';\n\t\t\tconst result = [];\n\n\t\t\tfunction throwSyntaxError( current, i, partial ) {\n\n\t\t\t\tconst error = new SyntaxError( 'Unexpected character \"' + current + '\" at index ' + i + '.' );\n\t\t\t\terror.partial = partial;\n\t\t\t\tthrow error;\n\n\t\t\t}\n\n\t\t\tfunction newNumber() {\n\n\t\t\t\tif ( number !== '' ) {\n\n\t\t\t\t\tif ( exponent === '' ) result.push( Number( number ) );\n\t\t\t\t\telse result.push( Number( number ) * Math.pow( 10, Number( exponent ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tnumber = '';\n\t\t\t\texponent = '';\n\n\t\t\t}\n\n\t\t\tlet current;\n\t\t\tconst length = input.length;\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tcurrent = input[ i ];\n\n\t\t\t\t// check for flags\n\t\t\t\tif ( Array.isArray( flags ) && flags.includes( result.length % stride ) && RE.FLAGS.test( current ) ) {\n\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// parse until next number\n\t\t\t\tif ( state === SEP ) {\n\n\t\t\t\t\t// eat whitespace\n\t\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// start new number\n\t\t\t\t\tif ( RE.DIGIT.test( current ) || RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tstate = INT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double commas (e.g. \"1, , 2\")\n\t\t\t\t\tif ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\t\tif ( seenComma ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tseenComma = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse integer part\n\t\t\t\tif ( state === INT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double signs (\"-+1\"), but not on sign as separator (\"-1-2\")\n\t\t\t\t\tif ( RE.SIGN.test( current )\n\t\t\t\t\t\t\t&& number.length === 1\n\t\t\t\t\t\t\t&& RE.SIGN.test( number[ 0 ] ) ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse decimal part\n\t\t\t\tif ( state === FLOAT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double decimal points (e.g. \"1..2\")\n\t\t\t\t\tif ( RE.POINT.test( current ) && number[ number.length - 1 ] === '.' ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse exponent part\n\t\t\t\tif ( state === EXP ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tif ( exponent === '' ) {\n\n\t\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( exponent.length === 1 && RE.SIGN.test( exponent ) ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t// end of number\n\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = false;\n\n\t\t\t\t} else if ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = true;\n\n\t\t\t\t} else if ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else if ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add the last number found (if any)\n\t\t\tnewNumber();\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\t// Units\n\n\t\tconst units = [ 'mm', 'cm', 'in', 'pt', 'pc', 'px' ];\n\n\t\t// Conversion: [ fromUnit ][ toUnit ] (-1 means dpi dependent)\n\t\tconst unitConversion = {\n\n\t\t\t'mm': {\n\t\t\t\t'mm': 1,\n\t\t\t\t'cm': 0.1,\n\t\t\t\t'in': 1 / 25.4,\n\t\t\t\t'pt': 72 / 25.4,\n\t\t\t\t'pc': 6 / 25.4,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'cm': {\n\t\t\t\t'mm': 10,\n\t\t\t\t'cm': 1,\n\t\t\t\t'in': 1 / 2.54,\n\t\t\t\t'pt': 72 / 2.54,\n\t\t\t\t'pc': 6 / 2.54,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'in': {\n\t\t\t\t'mm': 25.4,\n\t\t\t\t'cm': 2.54,\n\t\t\t\t'in': 1,\n\t\t\t\t'pt': 72,\n\t\t\t\t'pc': 6,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pt': {\n\t\t\t\t'mm': 25.4 / 72,\n\t\t\t\t'cm': 2.54 / 72,\n\t\t\t\t'in': 1 / 72,\n\t\t\t\t'pt': 1,\n\t\t\t\t'pc': 6 / 72,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pc': {\n\t\t\t\t'mm': 25.4 / 6,\n\t\t\t\t'cm': 2.54 / 6,\n\t\t\t\t'in': 1 / 6,\n\t\t\t\t'pt': 72 / 6,\n\t\t\t\t'pc': 1,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'px': {\n\t\t\t\t'px': 1\n\t\t\t}\n\n\t\t};\n\n\t\tfunction parseFloatWithUnits( string ) {\n\n\t\t\tlet theUnit = 'px';\n\n\t\t\tif ( typeof string === 'string' || string instanceof String ) {\n\n\t\t\t\tfor ( let i = 0, n = units.length; i < n; i ++ ) {\n\n\t\t\t\t\tconst u = units[ i ];\n\n\t\t\t\t\tif ( string.endsWith( u ) ) {\n\n\t\t\t\t\t\ttheUnit = u;\n\t\t\t\t\t\tstring = string.substring( 0, string.length - u.length );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet scale = undefined;\n\n\t\t\tif ( theUnit === 'px' && scope.defaultUnit !== 'px' ) {\n\n\t\t\t\t// Conversion scale from pixels to inches, then to default units\n\n\t\t\t\tscale = unitConversion[ 'in' ][ scope.defaultUnit ] / scope.defaultDPI;\n\n\t\t\t} else {\n\n\t\t\t\tscale = unitConversion[ theUnit ][ scope.defaultUnit ];\n\n\t\t\t\tif ( scale < 0 ) {\n\n\t\t\t\t\t// Conversion scale to pixels\n\n\t\t\t\t\tscale = unitConversion[ theUnit ][ 'in' ] * scope.defaultDPI;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn scale * parseFloat( string );\n\n\t\t}\n\n\t\t// Transforms\n\n\t\tfunction getNodeTransform( node ) {\n\n\t\t\tif ( ! ( node.hasAttribute( 'transform' ) || ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) ) ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst transform = parseNodeTransform( node );\n\n\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\ttransform.premultiply( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tcurrentTransform.copy( transform );\n\t\t\ttransformStack.push( transform );\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction parseNodeTransform( node ) {\n\n\t\t\tconst transform = new Matrix3();\n\t\t\tconst currentTransform = tempTransform0;\n\n\t\t\tif ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) {\n\n\t\t\t\tconst tx = parseFloatWithUnits( node.getAttribute( 'x' ) );\n\t\t\t\tconst ty = parseFloatWithUnits( node.getAttribute( 'y' ) );\n\n\t\t\t\ttransform.translate( tx, ty );\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'transform' ) ) {\n\n\t\t\t\tconst transformsTexts = node.getAttribute( 'transform' ).split( ')' );\n\n\t\t\t\tfor ( let tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex -- ) {\n\n\t\t\t\t\tconst transformText = transformsTexts[ tIndex ].trim();\n\n\t\t\t\t\tif ( transformText === '' ) continue;\n\n\t\t\t\t\tconst openParPos = transformText.indexOf( '(' );\n\t\t\t\t\tconst closeParPos = transformText.length;\n\n\t\t\t\t\tif ( openParPos > 0 && openParPos < closeParPos ) {\n\n\t\t\t\t\t\tconst transformType = transformText.slice( 0, openParPos );\n\n\t\t\t\t\t\tconst array = parseFloats( transformText.slice( openParPos + 1 ) );\n\n\t\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t\t\tswitch ( transformType ) {\n\n\t\t\t\t\t\t\tcase 'translate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst tx = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet ty = 0;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tty = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.translate( tx, ty );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'rotate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tlet angle = 0;\n\t\t\t\t\t\t\t\t\tlet cx = 0;\n\t\t\t\t\t\t\t\t\tlet cy = 0;\n\n\t\t\t\t\t\t\t\t\t// Angle\n\t\t\t\t\t\t\t\t\tangle = array[ 0 ] * Math.PI / 180;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 3 ) {\n\n\t\t\t\t\t\t\t\t\t\t// Center x, y\n\t\t\t\t\t\t\t\t\t\tcx = array[ 1 ];\n\t\t\t\t\t\t\t\t\t\tcy = array[ 2 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Rotate around center (cx, cy)\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( - cx, - cy );\n\t\t\t\t\t\t\t\t\ttempTransform2.makeRotation( angle );\n\t\t\t\t\t\t\t\t\ttempTransform3.multiplyMatrices( tempTransform2, tempTransform1 );\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( cx, cy );\n\t\t\t\t\t\t\t\t\tcurrentTransform.multiplyMatrices( tempTransform1, tempTransform3 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'scale':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst scaleX = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet scaleY = scaleX;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tscaleY = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.scale( scaleX, scaleY );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewX':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, Math.tan( array[ 0 ] * Math.PI / 180 ), 0,\n\t\t\t\t\t\t\t\t\t\t0, 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewY':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, 0, 0,\n\t\t\t\t\t\t\t\t\t\tMath.tan( array[ 0 ] * Math.PI / 180 ), 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'matrix':\n\n\t\t\t\t\t\t\t\tif ( array.length === 6 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\tarray[ 0 ], array[ 2 ], array[ 4 ],\n\t\t\t\t\t\t\t\t\t\tarray[ 1 ], array[ 3 ], array[ 5 ],\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttransform.premultiply( currentTransform );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction transformPath( path, m ) {\n\n\t\t\tfunction transfVec2( v2 ) {\n\n\t\t\t\ttempV3.set( v2.x, v2.y, 1 ).applyMatrix3( m );\n\n\t\t\t\tv2.set( tempV3.x, tempV3.y );\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseGeneric( curve ) {\n\n\t\t\t\t// For math description see:\n\t\t\t\t// https://math.stackexchange.com/questions/4544164\n\n\t\t\t\tconst a = curve.xRadius;\n\t\t\t\tconst b = curve.yRadius;\n\n\t\t\t\tconst cosTheta = Math.cos( curve.aRotation );\n\t\t\t\tconst sinTheta = Math.sin( curve.aRotation );\n\n\t\t\t\tconst v1 = new Vector3( a * cosTheta, a * sinTheta, 0 );\n\t\t\t\tconst v2 = new Vector3( - b * sinTheta, b * cosTheta, 0 );\n\n\t\t\t\tconst f1 = v1.applyMatrix3( m );\n\t\t\t\tconst f2 = v2.applyMatrix3( m );\n\n\t\t\t\tconst mF = tempTransform0.set(\n\t\t\t\t\tf1.x, f2.x, 0,\n\t\t\t\t\tf1.y, f2.y, 0,\n\t\t\t\t\t0, 0, 1,\n\t\t\t\t);\n\n\t\t\t\tconst mFInv = tempTransform1.copy( mF ).invert();\n\t\t\t\tconst mFInvT = tempTransform2.copy( mFInv ).transpose();\n\t\t\t\tconst mQ = mFInvT.multiply( mFInv );\n\t\t\t\tconst mQe = mQ.elements;\n\n\t\t\t\tconst ed = eigenDecomposition( mQe[ 0 ], mQe[ 1 ], mQe[ 4 ] );\n\t\t\t\tconst rt1sqrt = Math.sqrt( ed.rt1 );\n\t\t\t\tconst rt2sqrt = Math.sqrt( ed.rt2 );\n\n\t\t\t\tcurve.xRadius = 1 / rt1sqrt;\n\t\t\t\tcurve.yRadius = 1 / rt2sqrt;\n\t\t\t\tcurve.aRotation = Math.atan2( ed.sn, ed.cs );\n\n\t\t\t\tconst isFullEllipse =\n\t\t\t\t\t( curve.aEndAngle - curve.aStartAngle ) % ( 2 * Math.PI ) < Number.EPSILON;\n\n\t\t\t\t// Do not touch angles of a full ellipse because after transformation they\n\t\t\t\t// would converge to a single value effectively removing the whole curve\n\n\t\t\t\tif ( ! isFullEllipse ) {\n\n\t\t\t\t\tconst mDsqrt = tempTransform1.set(\n\t\t\t\t\t\trt1sqrt, 0, 0,\n\t\t\t\t\t\t0, rt2sqrt, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mRT = tempTransform2.set(\n\t\t\t\t\t\ted.cs, ed.sn, 0,\n\t\t\t\t\t\t- ed.sn, ed.cs, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mDRF = mDsqrt.multiply( mRT ).multiply( mF );\n\n\t\t\t\t\tconst transformAngle = phi => {\n\n\t\t\t\t\t\tconst { x: cosR, y: sinR } =\n\t\t\t\t\t\t\tnew Vector3( Math.cos( phi ), Math.sin( phi ), 0 ).applyMatrix3( mDRF );\n\n\t\t\t\t\t\treturn Math.atan2( sinR, cosR );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tcurve.aStartAngle = transformAngle( curve.aStartAngle );\n\t\t\t\t\tcurve.aEndAngle = transformAngle( curve.aEndAngle );\n\n\t\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseNoSkew( curve ) {\n\n\t\t\t\t// Faster shortcut if no skew is applied\n\t\t\t\t// (e.g, a euclidean transform of a group containing the ellipse)\n\n\t\t\t\tconst sx = getTransformScaleX( m );\n\t\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\t\tcurve.xRadius *= sx;\n\t\t\t\tcurve.yRadius *= sy;\n\n\t\t\t\t// Extract rotation angle from the matrix of form:\n\t\t\t\t//\n\t\t\t\t// | cosθ sx -sinθ sy |\n\t\t\t\t// | sinθ sx cosθ sy |\n\t\t\t\t//\n\t\t\t\t// Remembering that tanθ = sinθ / cosθ; and that\n\t\t\t\t// `sx`, `sy`, or both might be zero.\n\t\t\t\tconst theta =\n\t\t\t\t\tsx > Number.EPSILON\n\t\t\t\t\t\t? Math.atan2( m.elements[ 1 ], m.elements[ 0 ] )\n\t\t\t\t\t\t: Math.atan2( - m.elements[ 3 ], m.elements[ 4 ] );\n\n\t\t\t\tcurve.aRotation += theta;\n\n\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\tcurve.aStartAngle *= - 1;\n\t\t\t\t\tcurve.aEndAngle *= - 1;\n\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst subPaths = path.subPaths;\n\n\t\t\tfor ( let i = 0, n = subPaths.length; i < n; i ++ ) {\n\n\t\t\t\tconst subPath = subPaths[ i ];\n\t\t\t\tconst curves = subPath.curves;\n\n\t\t\t\tfor ( let j = 0; j < curves.length; j ++ ) {\n\n\t\t\t\t\tconst curve = curves[ j ];\n\n\t\t\t\t\tif ( curve.isLineCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isCubicBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\t\t\t\t\t\ttransfVec2( curve.v3 );\n\n\t\t\t\t\t} else if ( curve.isQuadraticBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isEllipseCurve ) {\n\n\t\t\t\t\t\t// Transform ellipse center point\n\n\t\t\t\t\t\ttempV2.set( curve.aX, curve.aY );\n\t\t\t\t\t\ttransfVec2( tempV2 );\n\t\t\t\t\t\tcurve.aX = tempV2.x;\n\t\t\t\t\t\tcurve.aY = tempV2.y;\n\n\t\t\t\t\t\t// Transform ellipse shape parameters\n\n\t\t\t\t\t\tif ( isTransformSkewed( m ) ) {\n\n\t\t\t\t\t\t\ttransfEllipseGeneric( curve );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttransfEllipseNoSkew( curve );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction isTransformFlipped( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn te[ 0 ] * te[ 4 ] - te[ 1 ] * te[ 3 ] < 0;\n\n\t\t}\n\n\t\tfunction isTransformSkewed( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\tconst basisDot = te[ 0 ] * te[ 3 ] + te[ 1 ] * te[ 4 ];\n\n\t\t\t// Shortcut for trivial rotations and transformations\n\t\t\tif ( basisDot === 0 ) return false;\n\n\t\t\tconst sx = getTransformScaleX( m );\n\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\treturn Math.abs( basisDot / ( sx * sy ) ) > Number.EPSILON;\n\n\t\t}\n\n\t\tfunction getTransformScaleX( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] );\n\n\t\t}\n\n\t\tfunction getTransformScaleY( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 3 ] * te[ 3 ] + te[ 4 ] * te[ 4 ] );\n\n\t\t}\n\n\t\t// Calculates the eigensystem of a real symmetric 2x2 matrix\n\t\t// [ A B ]\n\t\t// [ B C ]\n\t\t// in the form\n\t\t// [ A B ] = [ cs -sn ] [ rt1 0 ] [ cs sn ]\n\t\t// [ B C ] [ sn cs ] [ 0 rt2 ] [ -sn cs ]\n\t\t// where rt1 >= rt2.\n\t\t//\n\t\t// Adapted from: https://www.mpi-hd.mpg.de/personalhomes/globes/3x3/index.html\n\t\t// -> Algorithms for real symmetric matrices -> Analytical (2x2 symmetric)\n\t\tfunction eigenDecomposition( A, B, C ) {\n\n\t\t\tlet rt1, rt2, cs, sn, t;\n\t\t\tconst sm = A + C;\n\t\t\tconst df = A - C;\n\t\t\tconst rt = Math.sqrt( df * df + 4 * B * B );\n\n\t\t\tif ( sm > 0 ) {\n\n\t\t\t\trt1 = 0.5 * ( sm + rt );\n\t\t\t\tt = 1 / rt1;\n\t\t\t\trt2 = A * t * C - B * t * B;\n\n\t\t\t} else if ( sm < 0 ) {\n\n\t\t\t\trt2 = 0.5 * ( sm - rt );\n\n\t\t\t} else {\n\n\t\t\t\t// This case needs to be treated separately to avoid div by 0\n\n\t\t\t\trt1 = 0.5 * rt;\n\t\t\t\trt2 = - 0.5 * rt;\n\n\t\t\t}\n\n\t\t\t// Calculate eigenvectors\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tcs = df + rt;\n\n\t\t\t} else {\n\n\t\t\t\tcs = df - rt;\n\n\t\t\t}\n\n\t\t\tif ( Math.abs( cs ) > 2 * Math.abs( B ) ) {\n\n\t\t\t\tt = - 2 * B / cs;\n\t\t\t\tsn = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tcs = t * sn;\n\n\t\t\t} else if ( Math.abs( B ) === 0 ) {\n\n\t\t\t\tcs = 1;\n\t\t\t\tsn = 0;\n\n\t\t\t} else {\n\n\t\t\t\tt = - 0.5 * cs / B;\n\t\t\t\tcs = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tsn = t * cs;\n\n\t\t\t}\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tt = cs;\n\t\t\t\tcs = - sn;\n\t\t\t\tsn = t;\n\n\t\t\t}\n\n\t\t\treturn { rt1, rt2, cs, sn };\n\n\t\t}\n\n\t\t//\n\n\t\tconst paths = [];\n\t\tconst stylesheets = {};\n\n\t\tconst transformStack = [];\n\n\t\tconst tempTransform0 = new Matrix3();\n\t\tconst tempTransform1 = new Matrix3();\n\t\tconst tempTransform2 = new Matrix3();\n\t\tconst tempTransform3 = new Matrix3();\n\t\tconst tempV2 = new Vector2();\n\t\tconst tempV3 = new Vector3();\n\n\t\tconst currentTransform = new Matrix3();\n\n\t\tconst xml = new DOMParser().parseFromString( text, 'image/svg+xml' ); // application/xml\n\n\t\tparseNode( xml.documentElement, {\n\t\t\tfill: '#000',\n\t\t\tfillOpacity: 1,\n\t\t\tstrokeOpacity: 1,\n\t\t\tstrokeWidth: 1,\n\t\t\tstrokeLineJoin: 'miter',\n\t\t\tstrokeLineCap: 'butt',\n\t\t\tstrokeMiterLimit: 4\n\t\t} );\n\n\t\tconst data = { paths: paths, xml: xml.documentElement };\n\n\t\t// console.log( paths );\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Creates from the given shape path and array of shapes.\n\t *\n\t * @param {ShapePath} shapePath - The shape path.\n\t * @return {Array<Shape>} An array of shapes.\n\t */\n\tstatic createShapes( shapePath ) {\n\n\t\tconst BIGNUMBER = 999999999;\n\n\t\tconst IntersectionLocationType = {\n\t\t\tORIGIN: 0,\n\t\t\tDESTINATION: 1,\n\t\t\tBETWEEN: 2,\n\t\t\tLEFT: 3,\n\t\t\tRIGHT: 4,\n\t\t\tBEHIND: 5,\n\t\t\tBEYOND: 6\n\t\t};\n\n\t\tconst classifyResult = {\n\t\t\tloc: IntersectionLocationType.ORIGIN,\n\t\t\tt: 0\n\t\t};\n\n\t\tfunction findEdgeIntersection( a0, a1, b0, b1 ) {\n\n\t\t\tconst x1 = a0.x;\n\t\t\tconst x2 = a1.x;\n\t\t\tconst x3 = b0.x;\n\t\t\tconst x4 = b1.x;\n\t\t\tconst y1 = a0.y;\n\t\t\tconst y2 = a1.y;\n\t\t\tconst y3 = b0.y;\n\t\t\tconst y4 = b1.y;\n\t\t\tconst nom1 = ( x4 - x3 ) * ( y1 - y3 ) - ( y4 - y3 ) * ( x1 - x3 );\n\t\t\tconst nom2 = ( x2 - x1 ) * ( y1 - y3 ) - ( y2 - y1 ) * ( x1 - x3 );\n\t\t\tconst denom = ( y4 - y3 ) * ( x2 - x1 ) - ( x4 - x3 ) * ( y2 - y1 );\n\t\t\tconst t1 = nom1 / denom;\n\t\t\tconst t2 = nom2 / denom;\n\n\t\t\tif ( ( ( denom === 0 ) && ( nom1 !== 0 ) ) || ( t1 <= 0 ) || ( t1 >= 1 ) || ( t2 < 0 ) || ( t2 > 1 ) ) {\n\n\t\t\t\t//1. lines are parallel or edges don't intersect\n\n\t\t\t\treturn null;\n\n\t\t\t} else if ( ( nom1 === 0 ) && ( denom === 0 ) ) {\n\n\t\t\t\t//2. lines are colinear\n\n\t\t\t\t//check if endpoints of edge2 (b0-b1) lies on edge1 (a0-a1)\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\t\t\t\t\t//find position of this endpoints relatively to edge1\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t} else if ( classifyResult.loc == IntersectionLocationType.BETWEEN ) {\n\n\t\t\t\t\t\tconst x = + ( ( x1 + classifyResult.t * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\tconst y = + ( ( y1 + classifyResult.t * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\treturn { x: x, y: y, t: classifyResult.t, };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t} else {\n\n\t\t\t\t//3. edges intersect\n\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst x = + ( ( x1 + t1 * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\tconst y = + ( ( y1 + t1 * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\treturn { x: x, y: y, t: t1 };\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction classifyPoint( p, edgeStart, edgeEnd ) {\n\n\t\t\tconst ax = edgeEnd.x - edgeStart.x;\n\t\t\tconst ay = edgeEnd.y - edgeStart.y;\n\t\t\tconst bx = p.x - edgeStart.x;\n\t\t\tconst by = p.y - edgeStart.y;\n\t\t\tconst sa = ax * by - bx * ay;\n\n\t\t\tif ( ( p.x === edgeStart.x ) && ( p.y === edgeStart.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.ORIGIN;\n\t\t\t\tclassifyResult.t = 0;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( p.x === edgeEnd.x ) && ( p.y === edgeEnd.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.DESTINATION;\n\t\t\t\tclassifyResult.t = 1;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa < - Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.LEFT;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa > Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.RIGHT;\n\t\t\t\treturn;\n\n\n\t\t\t}\n\n\t\t\tif ( ( ( ax * bx ) < 0 ) || ( ( ay * by ) < 0 ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEHIND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( Math.sqrt( ax * ax + ay * ay ) ) < ( Math.sqrt( bx * bx + by * by ) ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEYOND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet t;\n\n\t\t\tif ( ax !== 0 ) {\n\n\t\t\t\tt = bx / ax;\n\n\t\t\t} else {\n\n\t\t\t\tt = by / ay;\n\n\t\t\t}\n\n\t\t\tclassifyResult.loc = IntersectionLocationType.BETWEEN;\n\t\t\tclassifyResult.t = t;\n\n\t\t}\n\n\t\tfunction getIntersections( path1, path2 ) {\n\n\t\t\tconst intersectionsRaw = [];\n\t\t\tconst intersections = [];\n\n\t\t\tfor ( let index = 1; index < path1.length; index ++ ) {\n\n\t\t\t\tconst path1EdgeStart = path1[ index - 1 ];\n\t\t\t\tconst path1EdgeEnd = path1[ index ];\n\n\t\t\t\tfor ( let index2 = 1; index2 < path2.length; index2 ++ ) {\n\n\t\t\t\t\tconst path2EdgeStart = path2[ index2 - 1 ];\n\t\t\t\t\tconst path2EdgeEnd = path2[ index2 ];\n\n\t\t\t\t\tconst intersection = findEdgeIntersection( path1EdgeStart, path1EdgeEnd, path2EdgeStart, path2EdgeEnd );\n\n\t\t\t\t\tif ( intersection !== null && intersectionsRaw.find( i => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON ) === undefined ) {\n\n\t\t\t\t\t\tintersectionsRaw.push( intersection );\n\t\t\t\t\t\tintersections.push( new Vector2( intersection.x, intersection.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn intersections;\n\n\t\t}\n\n\t\tfunction getScanlineIntersections( scanline, boundingBox, paths ) {\n\n\t\t\tconst center = new Vector2();\n\t\t\tboundingBox.getCenter( center );\n\n\t\t\tconst allIntersections = [];\n\n\t\t\tpaths.forEach( path => {\n\n\t\t\t\t// check if the center of the bounding box is in the bounding box of the paths.\n\t\t\t\t// this is a pruning method to limit the search of intersections in paths that can't envelop of the current path.\n\t\t\t\t// if a path envelops another path. The center of that other path, has to be inside the bounding box of the enveloping path.\n\t\t\t\tif ( path.boundingBox.containsPoint( center ) ) {\n\n\t\t\t\t\tconst intersections = getIntersections( scanline, path.points );\n\n\t\t\t\t\tintersections.forEach( p => {\n\n\t\t\t\t\t\tallIntersections.push( { identifier: path.identifier, isCW: path.isCW, point: p } );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tallIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\treturn allIntersections;\n\n\t\t}\n\n\t\tfunction isHoleTo( simplePath, allPaths, scanlineMinX, scanlineMaxX, _fillRule ) {\n\n\t\t\tif ( _fillRule === null || _fillRule === undefined || _fillRule === '' ) {\n\n\t\t\t\t_fillRule = 'nonzero';\n\n\t\t\t}\n\n\t\t\tconst centerBoundingBox = new Vector2();\n\t\t\tsimplePath.boundingBox.getCenter( centerBoundingBox );\n\n\t\t\tconst scanline = [ new Vector2( scanlineMinX, centerBoundingBox.y ), new Vector2( scanlineMaxX, centerBoundingBox.y ) ];\n\n\t\t\tconst scanlineIntersections = getScanlineIntersections( scanline, simplePath.boundingBox, allPaths );\n\n\t\t\tscanlineIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\tconst baseIntersections = [];\n\t\t\tconst otherIntersections = [];\n\n\t\t\tscanlineIntersections.forEach( i => {\n\n\t\t\t\tif ( i.identifier === simplePath.identifier ) {\n\n\t\t\t\t\tbaseIntersections.push( i );\n\n\t\t\t\t} else {\n\n\t\t\t\t\totherIntersections.push( i );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tconst firstXOfPath = baseIntersections[ 0 ].point.x;\n\n\t\t\t// build up the path hierarchy\n\t\t\tconst stack = [];\n\t\t\tlet i = 0;\n\n\t\t\twhile ( i < otherIntersections.length && otherIntersections[ i ].point.x < firstXOfPath ) {\n\n\t\t\t\tif ( stack.length > 0 && stack[ stack.length - 1 ] === otherIntersections[ i ].identifier ) {\n\n\t\t\t\t\tstack.pop();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstack.push( otherIntersections[ i ].identifier );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\tstack.push( simplePath.identifier );\n\n\t\t\tif ( _fillRule === 'evenodd' ) {\n\n\t\t\t\tconst isHole = stack.length % 2 === 0 ? true : false;\n\t\t\t\tconst isHoleFor = stack[ stack.length - 2 ];\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else if ( _fillRule === 'nonzero' ) {\n\n\t\t\t\t// check if path is a hole by counting the amount of paths with alternating rotations it has to cross.\n\t\t\t\tlet isHole = true;\n\t\t\t\tlet isHoleFor = null;\n\t\t\t\tlet lastCWValue = null;\n\n\t\t\t\tfor ( let i = 0; i < stack.length; i ++ ) {\n\n\t\t\t\t\tconst identifier = stack[ i ];\n\t\t\t\t\tif ( isHole ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = false;\n\t\t\t\t\t\tisHoleFor = identifier;\n\n\t\t\t\t\t} else if ( lastCWValue !== allPaths[ identifier ].isCW ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'fill-rule: \"' + _fillRule + '\" is currently not implemented.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check for self intersecting paths\n\t\t// TODO\n\n\t\t// check intersecting paths\n\t\t// TODO\n\n\t\t// prepare paths for hole detection\n\t\tlet scanlineMinX = BIGNUMBER;\n\t\tlet scanlineMaxX = - BIGNUMBER;\n\n\t\tlet simplePaths = shapePath.subPaths.map( p => {\n\n\t\t\tconst points = p.getPoints();\n\t\t\tlet maxY = - BIGNUMBER;\n\t\t\tlet minY = BIGNUMBER;\n\t\t\tlet maxX = - BIGNUMBER;\n\t\t\tlet minX = BIGNUMBER;\n\n\t \t//points.forEach(p => p.y *= -1);\n\n\t\t\tfor ( let i = 0; i < points.length; i ++ ) {\n\n\t\t\t\tconst p = points[ i ];\n\n\t\t\t\tif ( p.y > maxY ) {\n\n\t\t\t\t\tmaxY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.y < minY ) {\n\n\t\t\t\t\tminY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x > maxX ) {\n\n\t\t\t\t\tmaxX = p.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x < minX ) {\n\n\t\t\t\t\tminX = p.x;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scanlineMaxX <= maxX ) {\n\n\t\t\t\tscanlineMaxX = maxX + 1;\n\n\t\t\t}\n\n\t\t\tif ( scanlineMinX >= minX ) {\n\n\t\t\t\tscanlineMinX = minX - 1;\n\n\t\t\t}\n\n\t\t\treturn { curves: p.curves, points: points, isCW: ShapeUtils.isClockWise( points ), identifier: - 1, boundingBox: new Box2( new Vector2( minX, minY ), new Vector2( maxX, maxY ) ) };\n\n\t\t} );\n\n\t\tsimplePaths = simplePaths.filter( sp => sp.points.length > 1 );\n\n\t\tfor ( let identifier = 0; identifier < simplePaths.length; identifier ++ ) {\n\n\t\t\tsimplePaths[ identifier ].identifier = identifier;\n\n\t\t}\n\n\t\t// check if path is solid or a hole\n\t\tconst isAHole = simplePaths.map( p => isHoleTo( p, simplePaths, scanlineMinX, scanlineMaxX, ( shapePath.userData ? shapePath.userData.style.fillRule : undefined ) ) );\n\n\n\t\tconst shapesToReturn = [];\n\t\tsimplePaths.forEach( p => {\n\n\t\t\tconst amIAHole = isAHole[ p.identifier ];\n\n\t\t\tif ( ! amIAHole.isHole ) {\n\n\t\t\t\tconst shape = new Shape();\n\t\t\t\tshape.curves = p.curves;\n\t\t\t\tconst holes = isAHole.filter( h => h.isHole && h.for === p.identifier );\n\t\t\t\tholes.forEach( h => {\n\n\t\t\t\t\tconst hole = simplePaths[ h.identifier ];\n\t\t\t\t\tconst path = new Path();\n\t\t\t\t\tpath.curves = hole.curves;\n\t\t\t\t\tshape.holes.push( path );\n\n\t\t\t\t} );\n\t\t\t\tshapesToReturn.push( shape );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn shapesToReturn;\n\n\t}\n\n\t/**\n\t * Returns a stroke style object from the given parameters.\n\t *\n\t * @param {number} [width=1] - The stroke width.\n\t * @param {string} [color='#000'] - The stroke color, as returned by {@link Color#getStyle}.\n\t * @param {'round'|'bevel'|'miter'|'miter-limit'} [lineJoin='miter'] - The line join style.\n\t * @param {'round'|'square'|'butt'} [lineCap='butt'] - The line cap style.\n\t * @param {number} [miterLimit=4] - Maximum join length, in multiples of the `width` parameter (join is truncated if it exceeds that distance).\n\t * @return {Object} The style object.\n\t */\n\tstatic getStrokeStyle( width, color, lineJoin, lineCap, miterLimit ) {\n\n\t\twidth = width !== undefined ? width : 1;\n\t\tcolor = color !== undefined ? color : '#000';\n\t\tlineJoin = lineJoin !== undefined ? lineJoin : 'miter';\n\t\tlineCap = lineCap !== undefined ? lineCap : 'butt';\n\t\tmiterLimit = miterLimit !== undefined ? miterLimit : 4;\n\n\t\treturn {\n\t\t\tstrokeColor: color,\n\t\t\tstrokeWidth: width,\n\t\t\tstrokeLineJoin: lineJoin,\n\t\t\tstrokeLineCap: lineCap,\n\t\t\tstrokeMiterLimit: miterLimit\n\t\t};\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points. The path can be open or closed (last point equals to first point).\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @return {?BufferGeometry} The stroke geometry. UV coordinates are generated ('u' along path. 'v' across it, from left to right).\n\t * Returns `null` if not geometry was generated.\n\t */\n\tstatic pointsToStroke( points, style, arcDivisions, minDistance ) {\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tif ( SVGLoader.pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs ) === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\treturn geometry;\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points.\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @param {Array<number>} vertices - An array holding vertices.\n\t * @param {Array<number>} normals - An array holding normals.\n\t * @param {Array<number>} uvs - An array holding uvs.\n\t * @param {number} [vertexOffset=0] - The vertex offset.\n\t * @return {number} The number of vertices.\n\t */\n\tstatic pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs, vertexOffset ) {\n\n\t\t// This function can be called to update existing arrays or buffers.\n\t\t// Accepts same parameters as pointsToStroke, plus the buffers and optional offset.\n\t\t// Param vertexOffset: Offset vertices to start writing in the buffers (3 elements/vertex for vertices and normals, and 2 elements/vertex for uvs)\n\t\t// Returns number of written vertices / normals / uvs pairs\n\t\t// if 'vertices' parameter is undefined no triangles will be generated, but the returned vertices count will still be valid (useful to preallocate the buffers)\n\t\t// 'normals' and 'uvs' buffers are optional\n\n\t\tconst tempV2_1 = new Vector2();\n\t\tconst tempV2_2 = new Vector2();\n\t\tconst tempV2_3 = new Vector2();\n\t\tconst tempV2_4 = new Vector2();\n\t\tconst tempV2_5 = new Vector2();\n\t\tconst tempV2_6 = new Vector2();\n\t\tconst tempV2_7 = new Vector2();\n\t\tconst lastPointL = new Vector2();\n\t\tconst lastPointR = new Vector2();\n\t\tconst point0L = new Vector2();\n\t\tconst point0R = new Vector2();\n\t\tconst currentPointL = new Vector2();\n\t\tconst currentPointR = new Vector2();\n\t\tconst nextPointL = new Vector2();\n\t\tconst nextPointR = new Vector2();\n\t\tconst innerPoint = new Vector2();\n\t\tconst outerPoint = new Vector2();\n\n\t\tarcDivisions = arcDivisions !== undefined ? arcDivisions : 12;\n\t\tminDistance = minDistance !== undefined ? minDistance : 0.001;\n\t\tvertexOffset = vertexOffset !== undefined ? vertexOffset : 0;\n\n\t\t// First ensure there are no duplicated points\n\t\tpoints = removeDuplicatedPoints( points );\n\n\t\tconst numPoints = points.length;\n\n\t\tif ( numPoints < 2 ) return 0;\n\n\t\tconst isClosed = points[ 0 ].equals( points[ numPoints - 1 ] );\n\n\t\tlet currentPoint;\n\t\tlet previousPoint = points[ 0 ];\n\t\tlet nextPoint;\n\n\t\tconst strokeWidth2 = style.strokeWidth / 2;\n\n\t\tconst deltaU = 1 / ( numPoints - 1 );\n\t\tlet u0 = 0, u1;\n\n\t\tlet innerSideModified;\n\t\tlet joinIsOnLeftSide;\n\t\tlet isMiter;\n\t\tlet initialJoinIsOnLeftSide = false;\n\n\t\tlet numVertices = 0;\n\t\tlet currentCoordinate = vertexOffset * 3;\n\t\tlet currentCoordinateUV = vertexOffset * 2;\n\n\t\t// Get initial left and right stroke points\n\t\tgetNormal( points[ 0 ], points[ 1 ], tempV2_1 ).multiplyScalar( strokeWidth2 );\n\t\tlastPointL.copy( points[ 0 ] ).sub( tempV2_1 );\n\t\tlastPointR.copy( points[ 0 ] ).add( tempV2_1 );\n\t\tpoint0L.copy( lastPointL );\n\t\tpoint0R.copy( lastPointR );\n\n\t\tfor ( let iPoint = 1; iPoint < numPoints; iPoint ++ ) {\n\n\t\t\tcurrentPoint = points[ iPoint ];\n\n\t\t\t// Get next point\n\t\t\tif ( iPoint === numPoints - 1 ) {\n\n\t\t\t\tif ( isClosed ) {\n\n\t\t\t\t\t// Skip duplicated initial point\n\t\t\t\t\tnextPoint = points[ 1 ];\n\n\t\t\t\t} else nextPoint = undefined;\n\n\t\t\t} else {\n\n\t\t\t\tnextPoint = points[ iPoint + 1 ];\n\n\t\t\t}\n\n\t\t\t// Normal of previous segment in tempV2_1\n\t\t\tconst normal1 = tempV2_1;\n\t\t\tgetNormal( previousPoint, currentPoint, normal1 );\n\n\t\t\ttempV2_3.copy( normal1 ).multiplyScalar( strokeWidth2 );\n\t\t\tcurrentPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\tcurrentPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\tu1 = u0 + deltaU;\n\n\t\t\tinnerSideModified = false;\n\n\t\t\tif ( nextPoint !== undefined ) {\n\n\t\t\t\t// Normal of next segment in tempV2_2\n\t\t\t\tgetNormal( currentPoint, nextPoint, tempV2_2 );\n\n\t\t\t\ttempV2_3.copy( tempV2_2 ).multiplyScalar( strokeWidth2 );\n\t\t\t\tnextPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\t\tnextPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\t\tjoinIsOnLeftSide = true;\n\t\t\t\ttempV2_3.subVectors( nextPoint, previousPoint );\n\t\t\t\tif ( normal1.dot( tempV2_3 ) < 0 ) {\n\n\t\t\t\t\tjoinIsOnLeftSide = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( iPoint === 1 ) initialJoinIsOnLeftSide = joinIsOnLeftSide;\n\n\t\t\t\ttempV2_3.subVectors( nextPoint, currentPoint );\n\t\t\t\ttempV2_3.normalize();\n\t\t\t\tconst dot = Math.abs( normal1.dot( tempV2_3 ) );\n\n\t\t\t\t// If path is straight, don't create join\n\t\t\t\tif ( dot > Number.EPSILON ) {\n\n\t\t\t\t\t// Compute inner and outer segment intersections\n\t\t\t\t\tconst miterSide = strokeWidth2 / dot;\n\t\t\t\t\ttempV2_3.multiplyScalar( - miterSide );\n\t\t\t\t\ttempV2_4.subVectors( currentPoint, previousPoint );\n\t\t\t\t\ttempV2_5.copy( tempV2_4 ).setLength( miterSide ).add( tempV2_3 );\n\t\t\t\t\tinnerPoint.copy( tempV2_5 ).negate();\n\t\t\t\t\tconst miterLength2 = tempV2_5.length();\n\t\t\t\t\tconst segmentLengthPrev = tempV2_4.length();\n\t\t\t\t\ttempV2_4.divideScalar( segmentLengthPrev );\n\t\t\t\t\ttempV2_6.subVectors( nextPoint, currentPoint );\n\t\t\t\t\tconst segmentLengthNext = tempV2_6.length();\n\t\t\t\t\ttempV2_6.divideScalar( segmentLengthNext );\n\t\t\t\t\t// Check that previous and next segments doesn't overlap with the innerPoint of intersection\n\t\t\t\t\tif ( tempV2_4.dot( innerPoint ) < segmentLengthPrev && tempV2_6.dot( innerPoint ) < segmentLengthNext ) {\n\n\t\t\t\t\t\tinnerSideModified = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\touterPoint.copy( tempV2_5 ).add( currentPoint );\n\t\t\t\t\tinnerPoint.add( currentPoint );\n\n\t\t\t\t\tisMiter = false;\n\n\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\tnextPointR.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointR.copy( innerPoint );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tnextPointL.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointL.copy( innerPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// The segment triangles are generated here if there was overlapping\n\n\t\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch ( style.strokeLineJoin ) {\n\n\t\t\t\t\t\tcase 'bevel':\n\n\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'round':\n\n\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t// Join triangles\n\n\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, currentPointL, nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, nextPointR, currentPointR, u1, 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'miter':\n\t\t\t\t\t\tcase 'miter-clip':\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconst miterFraction = ( strokeWidth2 * style.strokeMiterLimit ) / miterLength2;\n\n\t\t\t\t\t\t\tif ( miterFraction < 1 ) {\n\n\t\t\t\t\t\t\t\t// The join miter length exceeds the miter limit\n\n\t\t\t\t\t\t\t\tif ( style.strokeLineJoin !== 'miter-clip' ) {\n\n\t\t\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t\t\t// Miter-clip join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointL ).multiplyScalar( miterFraction ).add( currentPointL );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointL ).multiplyScalar( miterFraction ).add( nextPointL );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointR ).multiplyScalar( miterFraction ).add( currentPointR );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointR ).multiplyScalar( miterFraction ).add( nextPointR );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Miter join segment triangles\n\n\t\t\t\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\t\t\t\t// Optimized segment + join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\tnextPointL.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tnextPointR.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Add extra miter join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tisMiter = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// The segment triangles are generated here when two consecutive points are collinear\n\n\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// The segment triangles are generated here if it is the ending segment\n\n\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t}\n\n\t\t\tif ( ! isClosed && iPoint === numPoints - 1 ) {\n\n\t\t\t\t// Start line endcap\n\t\t\t\taddCapGeometry( points[ 0 ], point0L, point0R, joinIsOnLeftSide, true, u0 );\n\n\t\t\t}\n\n\t\t\t// Increment loop variables\n\n\t\t\tu0 = u1;\n\n\t\t\tpreviousPoint = currentPoint;\n\n\t\t\tlastPointL.copy( nextPointL );\n\t\t\tlastPointR.copy( nextPointR );\n\n\t\t}\n\n\t\tif ( ! isClosed ) {\n\n\t\t\t// Ending line endcap\n\t\t\taddCapGeometry( currentPoint, currentPointL, currentPointR, joinIsOnLeftSide, false, u1 );\n\n\t\t} else if ( innerSideModified && vertices ) {\n\n\t\t\t// Modify path first segment vertices to adjust to the segments inner and outer intersections\n\n\t\t\tlet lastOuter = outerPoint;\n\t\t\tlet lastInner = innerPoint;\n\n\t\t\tif ( initialJoinIsOnLeftSide !== joinIsOnLeftSide ) {\n\n\t\t\t\tlastOuter = innerPoint;\n\t\t\t\tlastInner = outerPoint;\n\n\t\t\t}\n\n\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\tif ( isMiter || initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 0 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 1 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( isMiter || ! initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 1 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn numVertices;\n\n\t\t// -- End of algorithm\n\n\t\t// -- Functions\n\n\t\tfunction getNormal( p1, p2, result ) {\n\n\t\t\tresult.subVectors( p2, p1 );\n\t\t\treturn result.set( - result.y, result.x ).normalize();\n\n\t\t}\n\n\t\tfunction addVertex( position, u, v ) {\n\n\t\t\tif ( vertices ) {\n\n\t\t\t\tvertices[ currentCoordinate ] = position.x;\n\t\t\t\tvertices[ currentCoordinate + 1 ] = position.y;\n\t\t\t\tvertices[ currentCoordinate + 2 ] = 0;\n\n\t\t\t\tif ( normals ) {\n\n\t\t\t\t\tnormals[ currentCoordinate ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 1 ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 2 ] = 1;\n\n\t\t\t\t}\n\n\t\t\t\tcurrentCoordinate += 3;\n\n\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\tuvs[ currentCoordinateUV ] = u;\n\t\t\t\t\tuvs[ currentCoordinateUV + 1 ] = v;\n\n\t\t\t\t\tcurrentCoordinateUV += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnumVertices += 3;\n\n\t\t}\n\n\t\tfunction makeCircularSector( center, p1, p2, u, v ) {\n\n\t\t\t// param p1, p2: Points in the circle arc.\n\t\t\t// p1 and p2 are in clockwise direction.\n\n\t\t\ttempV2_1.copy( p1 ).sub( center ).normalize();\n\t\t\ttempV2_2.copy( p2 ).sub( center ).normalize();\n\n\t\t\tlet angle = Math.PI;\n\t\t\tconst dot = tempV2_1.dot( tempV2_2 );\n\t\t\tif ( Math.abs( dot ) < 1 ) angle = Math.abs( Math.acos( dot ) );\n\n\t\t\tangle /= arcDivisions;\n\n\t\t\ttempV2_3.copy( p1 );\n\n\t\t\tfor ( let i = 0, il = arcDivisions - 1; i < il; i ++ ) {\n\n\t\t\t\ttempV2_4.copy( tempV2_3 ).rotateAround( center, angle );\n\n\t\t\t\taddVertex( tempV2_3, u, v );\n\t\t\t\taddVertex( tempV2_4, u, v );\n\t\t\t\taddVertex( center, u, 0.5 );\n\n\t\t\t\ttempV2_3.copy( tempV2_4 );\n\n\t\t\t}\n\n\t\t\taddVertex( tempV2_4, u, v );\n\t\t\taddVertex( p2, u, v );\n\t\t\taddVertex( center, u, 0.5 );\n\n\t\t}\n\n\t\tfunction makeSegmentTriangles() {\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t}\n\n\t\tfunction makeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t// Optimized segment + bevel triangles\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( innerPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( innerPoint, u, 0 );\n\t\t\t\t\taddVertex( nextPointR, u, 1 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bevel join triangle. The segment triangles are done in the main loop\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( nextPointR, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( nextPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointR, u0, 1 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( nextPointR, u0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addCapGeometry( center, p1, p2, joinIsOnLeftSide, start, u ) {\n\n\t\t\t// param center: End point of the path\n\t\t\t// param p1, p2: Left and right cap points\n\n\t\t\tswitch ( style.strokeLineCap ) {\n\n\t\t\t\tcase 'round':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\tmakeCircularSector( center, p2, p1, u, 0.5 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmakeCircularSector( center, p1, p2, u, 0.5 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'square':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p1, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\t// using tempV2_4 to update 3rd vertex if the uv.y of 3rd vertex is 1\n\t\t\t\t\t\t\tuvs[ 3 * 2 + 1 ] === 1 ? tempV2_4.toArray( vertices, 3 * 3 ) : tempV2_3.toArray( vertices, 3 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p2, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\tconst vl = vertices.length;\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'butt':\n\t\t\t\tdefault:\n\n\t\t\t\t\t// Nothing to do here\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeDuplicatedPoints( points ) {\n\n\t\t\t// Creates a new array if necessary with duplicated points removed.\n\t\t\t// This does not remove duplicated initial and ending points of a closed path.\n\n\t\t\tlet dupPoints = false;\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) < minDistance ) {\n\n\t\t\t\t\tdupPoints = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! dupPoints ) return points;\n\n\t\t\tconst newPoints = [];\n\t\t\tnewPoints.push( points[ 0 ] );\n\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) >= minDistance ) {\n\n\t\t\t\t\tnewPoints.push( points[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnewPoints.push( points[ points.length - 1 ] );\n\n\t\t\treturn newPoints;\n\n\t\t}\n\n\t}\n\n\n}\n\nexport { SVGLoader };\n","import React, { useEffect, useMemo, useState } from 'react';\nimport * as THREE from 'three';\nimport { SVGLoader, type SVGResult } from 'three/examples/jsm/loaders/SVGLoader.js';\nimport {\n inlineSvgStyles,\n isInteractiveGroupLabel,\n isRouteFolderLabel,\n isRoutePathLabel,\n isStoreFolderLabel,\n isTransparentColor,\n outdoorSvgPaintOrder,\n resolveFetchUrl,\n amenityHouseFill,\n isAmenityLayerId,\n resolveLayerStyle,\n sortByOutdoorSvgPaintOrder,\n} from '../../core';\n\nexport { resolveFetchUrl };\n\nconst BASE_Z = -2;\n\nfunction getLayerNameFromNode(node: Element | undefined): string | undefined {\n if (!node || node.nodeType !== 1) return undefined;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id');\n if (id) return id;\n current = current.parentElement;\n }\n return undefined;\n}\n\nfunction isInteractiveAncestor(node: Element | undefined): boolean {\n if (!node) return false;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id') ?? '';\n const dataName = current.getAttribute('data-name') ?? '';\n if (isInteractiveGroupLabel(id) || isInteractiveGroupLabel(dataName)) return true;\n if (isStoreFolderLabel(id) || isStoreFolderLabel(dataName)) return true;\n current = current.parentElement;\n }\n return false;\n}\n\nfunction isRouteAncestor(node: Element | undefined): boolean {\n if (!node) return false;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id') ?? '';\n const dataName = current.getAttribute('data-name') ?? '';\n if (isRouteFolderLabel(id) || isRouteFolderLabel(dataName)) return true;\n current = current.parentElement;\n }\n return false;\n}\n\nexport interface SvgVectorLayerProps {\n url: string;\n /** sourceSvgId values held in cm_shapes — skip drawing these (DB owns them). */\n suppressIds?: ReadonlySet<string>;\n imageProxyUrl?: string | null;\n is3d?: boolean;\n /** Settings overrides for house outdoor colors. */\n theme?: Partial<Record<string, string>> | null;\n}\n\ninterface PreparedMesh {\n key: string;\n layerName?: string;\n shapes: THREE.Shape[];\n color: THREE.Color;\n opacity: number;\n extrude: number;\n renderOrder: number;\n}\n\n/**\n * Live outdoor SVG as real vector geometry (not a raster texture).\n * Applies house-style colors for reserved layer names; otherwise keeps\n * Illustrator fills. Skips ROUTES-group lines and interactive ids owned by the DB.\n * Coordinates stay in SVG user space — `MapScene` flips the whole scene.\n */\nexport function SvgVectorLayer({\n url,\n suppressIds,\n imageProxyUrl,\n is3d = false,\n theme,\n}: SvgVectorLayerProps) {\n const [result, setResult] = useState<SVGResult | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n fetch(fetchUrl, { signal: controller.signal })\n .then((res) => {\n if (!res.ok) throw new Error(`SVG fetch ${res.status}`);\n return res.text();\n })\n .then((text) => {\n if (cancelled) return;\n const inlined = inlineSvgStyles(text);\n const loader = new SVGLoader();\n setResult(loader.parse(inlined));\n })\n .catch((err) => {\n if (cancelled) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setResult(null);\n // Silence here used to hide CORS failures as \"outdoor has no decoration\".\n console.warn(\n `[eyeon-map] Outdoor SVG failed to load from ${fetchUrl}. ` +\n 'If this is a cross-origin error, pass `imageProxyUrl` to MapViewer.',\n err,\n );\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [url, imageProxyUrl]);\n\n const meshes = useMemo(() => {\n if (!result) return [] as PreparedMesh[];\n const out: PreparedMesh[] = [];\n let idx = 0;\n for (const path of result.paths) {\n const node = path.userData?.node as Element | undefined;\n const layerName = getLayerNameFromNode(node);\n if (layerName?.toLowerCase().startsWith('route-path')) continue;\n if (layerName && (isRoutePathLabel(layerName) || isRouteFolderLabel(layerName))) {\n continue;\n }\n if (node && isRouteAncestor(node)) continue;\n if (layerName && suppressIds?.has(layerName)) continue;\n if (isInteractiveAncestor(node) && !layerName) continue;\n // Whole INTERACTIVE / STORES folders are owned by DB shapes.\n if (layerName && (isInteractiveGroupLabel(layerName) || isStoreFolderLabel(layerName))) {\n continue;\n }\n if (node && isInteractiveAncestor(node) && layerName && suppressIds?.has(layerName)) {\n continue;\n }\n // Skip paths inside INTERACTIVE/STORES even when not yet in DB (assignable units).\n if (node && isInteractiveAncestor(node)) continue;\n\n const shapes = SVGLoader.createShapes(path);\n if (shapes.length === 0) continue;\n\n const layerStyle = resolveLayerStyle(layerName, theme);\n const amenityFill = isAmenityLayerId(layerName)\n ? amenityHouseFill(theme)\n : null;\n const fillTransparent = isTransparentColor(layerStyle?.fill);\n const strokeTransparent = isTransparentColor(layerStyle?.stroke);\n const color = new THREE.Color();\n if (layerStyle?.fill && !fillTransparent) {\n color.set(layerStyle.fill);\n } else if (amenityFill) {\n color.set(amenityFill);\n } else if (path.color && !fillTransparent) {\n color.copy(path.color);\n } else {\n color.set('#cccccc');\n }\n if (layerStyle?.stroke && !layerStyle.fill && !strokeTransparent) {\n color.set(layerStyle.stroke);\n }\n\n const opacity =\n fillTransparent || (strokeTransparent && !layerStyle?.fill)\n ? 0\n : typeof path.userData?.style?.opacity === 'number'\n ? path.userData.style.opacity\n : 1;\n const extrude =\n is3d && layerStyle?.extrudeHeight != null ? layerStyle.extrudeHeight : 0;\n\n out.push({\n key: `${layerName ?? 'path'}-${idx++}`,\n layerName,\n shapes,\n color,\n opacity,\n extrude,\n renderOrder: outdoorSvgPaintOrder(layerName),\n });\n }\n return sortByOutdoorSvgPaintOrder(out, (mesh) => mesh.layerName);\n }, [result, suppressIds, is3d, theme]);\n\n if (!result || meshes.length === 0) return null;\n\n return (\n <group position={[0, 0, BASE_Z]} renderOrder={-20}>\n {meshes.map((m) =>\n m.shapes.map((shape, si) => (\n <mesh\n key={`${m.key}-${si}`}\n renderOrder={m.renderOrder}\n raycast={() => {}}\n >\n {m.extrude > 0 ? (\n <extrudeGeometry\n args={[shape, { depth: m.extrude, bevelEnabled: false }]}\n />\n ) : (\n <shapeGeometry args={[shape]} />\n )}\n <meshBasicMaterial\n color={m.color}\n transparent={m.opacity < 1}\n opacity={m.opacity}\n depthWrite={false}\n toneMapped={false}\n side={THREE.DoubleSide}\n />\n </mesh>\n )),\n )}\n </group>\n );\n}\n","import {\n expandBounds,\n applyLevelTransform,\n sceneBoundsFromBBox,\n type BBox,\n type LevelTransform,\n type PathResult,\n type SceneBounds,\n type Vec2,\n} from '../core';\n\n/**\n * Stored geometry is raw SVG user space, where Y grows downward. The scene\n * mirrors Y once so the camera can keep a conventional `up = [0, 1, 0]`.\n *\n * Do not \"fix\" orientation by setting `up = [0, -1, 0]` instead: three.js\n * derives the camera's right axis from `up × forward`, so a negative up also\n * mirrors X and the map renders rotated 180° rather than flipped.\n */\nexport const SCENE_FLIP_SCALE: [number, number, number] = [1, -1, 1];\n\n/** Stored SVG-space point → view space, matching `SCENE_FLIP_SCALE`. */\nexport function dataToViewPoint(point: Vec2): Vec2 {\n return { x: point.x, y: -point.y };\n}\n\n/** Stored SVG-space bounds → view space, for camera and controls placement. */\nexport function viewBoundsFromData(bounds: SceneBounds): SceneBounds {\n return {\n ...bounds,\n minY: -bounds.maxY,\n maxY: -bounds.minY,\n cy: -bounds.cy,\n };\n}\n\n/**\n * Fit an orthographic camera so the map fills the canvas on the limiting\n * axis (width or height) with no extra inset.\n */\nexport function fitOrthoZoom(\n viewWidth: number,\n viewHeight: number,\n worldWidth: number,\n worldHeight: number,\n): number {\n const zoomX = Math.max(viewWidth, 1) / Math.max(worldWidth, 1);\n const zoomY = Math.max(viewHeight, 1) / Math.max(worldHeight, 1);\n return Math.min(zoomX, zoomY);\n}\n\nexport function boundsExtent(bounds: SceneBounds): { width: number; height: number } {\n return {\n width: Math.max(bounds.maxX - bounds.minX, 1),\n height: Math.max(bounds.maxY - bounds.minY, 1),\n };\n}\n\nexport const VIEWER_ZOOM_ANIM_MS = 240;\n/**\n * Selection pan/zoom. v1 used 0.2s of linear travel (`CAMERA.animSpeed`).\n * Ease-in-out over 200ms bunched the motion into the last frames and looked\n * like a snap; ease-out over 400ms reads as a short, smooth glide.\n */\nexport const VIEWER_FOCUS_ANIM_MS = 400;\n\n/** Extra space around a small focused shape so it does not fill the canvas. */\nexport const FOCUS_BOUNDS_PADDING = 1;\n/**\n * Padding for a large store (extent ≥ `FOCUS_LARGE_EXTENT`).\n * 2.0 → the store occupies about a third of the frame, so neighbors stay visible.\n */\nexport const FOCUS_LARGE_PADDING = 2;\n/** World size at which padding reaches `FOCUS_LARGE_PADDING`. */\nexport const FOCUS_LARGE_EXTENT = 400;\n/**\n * Padding stays tight until this size (typical small store). Kiosks and\n * amenities below this still zoom closer via `FOCUS_MIN_EXTENT`.\n */\nexport const FOCUS_PAD_SMALL_EXTENT = 80;\n/**\n * Floor for the framed world size. Tiny amenities keep neighbors in view\n * instead of filling the canvas; anything larger frames to its own bbox.\n */\nexport const FOCUS_MIN_EXTENT = 52;\n/**\n * Click-to-focus cap vs the full-map fit. A typical store stays at a\n * neighborhood view; 64× filled the canvas on the default assign map.\n */\nexport const FOCUS_MAX_ZOOM_MULTIPLE = 8;\n/**\n * Tiny kiosks/amenities may go closer than a store so they stay readable.\n * Still far below a canvas-filling close-up.\n */\nexport const FOCUS_SMALL_MAX_ZOOM_MULTIPLE = 14;\n/** Manual +/− ceiling, independent of selection focus. */\nexport const VIEWER_MAX_ZOOM_MULTIPLE = 16;\n\n/** More margin as the store grows so a department store is not edge-to-edge. */\nexport function focusPaddingRatio(\n width: number,\n height: number,\n paddingRatio = FOCUS_BOUNDS_PADDING,\n smallExtent = FOCUS_PAD_SMALL_EXTENT,\n largePadding = FOCUS_LARGE_PADDING,\n largeExtent = FOCUS_LARGE_EXTENT,\n): number {\n const extent = Math.max(width, height);\n if (extent <= smallExtent) return paddingRatio;\n const span = Math.max(largeExtent - smallExtent, 1);\n const t = Math.min(1, (extent - smallExtent) / span);\n return paddingRatio + (largePadding - paddingRatio) * t;\n}\n\n/**\n * Expand a shape's bounds for a \"click to assign\" camera frame.\n * Small units keep a tighter frame; large stores pull the camera back.\n */\nexport function paddedFocusBounds(\n bounds: SceneBounds,\n paddingRatio = FOCUS_BOUNDS_PADDING,\n minExtent = FOCUS_MIN_EXTENT,\n): SceneBounds {\n const rawW = bounds.maxX - bounds.minX;\n const rawH = bounds.maxY - bounds.minY;\n const width = Math.max(rawW, minExtent);\n const height = Math.max(rawH, minExtent);\n const pad = focusPaddingRatio(rawW, rawH, paddingRatio);\n const halfW = (width + width * pad) / 2;\n const halfH = (height + height * pad) / 2;\n return {\n minX: bounds.cx - halfW,\n minY: bounds.cy - halfH,\n maxX: bounds.cx + halfW,\n maxY: bounds.cy + halfH,\n cx: bounds.cx,\n cy: bounds.cy,\n size: Math.max(halfW, halfH) * 2,\n };\n}\n\n/**\n * How far a click may zoom relative to the fitted map. Smaller padded\n * frames (kiosks) get more zoom; store-sized frames stay at 8×.\n */\nexport function focusMaxZoomMultiple(\n paddedWidth: number,\n paddedHeight: number,\n typicalMultiple = FOCUS_MAX_ZOOM_MULTIPLE,\n smallMultiple = FOCUS_SMALL_MAX_ZOOM_MULTIPLE,\n): number {\n const extent = Math.max(paddedWidth, paddedHeight);\n const typicalFrame = FOCUS_PAD_SMALL_EXTENT * (1 + FOCUS_BOUNDS_PADDING);\n if (extent >= typicalFrame) return typicalMultiple;\n const tinyFrame = FOCUS_MIN_EXTENT * (1 + FOCUS_BOUNDS_PADDING);\n if (extent <= tinyFrame) return smallMultiple;\n const span = Math.max(typicalFrame - tinyFrame, 1);\n const t = (extent - tinyFrame) / span;\n return smallMultiple + (typicalMultiple - smallMultiple) * t;\n}\n\nexport function clampFocusZoom(\n shapeFitZoom: number,\n mapFitZoom: number,\n maxMultiple = FOCUS_MAX_ZOOM_MULTIPLE,\n): number {\n const cap = Math.max(mapFitZoom, 0.001) * maxMultiple;\n return Math.min(shapeFitZoom, cap);\n}\n\ntype FocusLevel = {\n shapes: Array<{ id: number; bbox: BBox }>;\n transform: LevelTransform;\n};\n\n/** Stable key so adding/removing a Shift-selected shape re-frames the camera. */\nexport function selectionFocusKey(shapeIds: number[]): string | null {\n const ids = [...new Set(shapeIds.filter((id) => Number.isFinite(id)))].sort(\n (a, b) => a - b,\n );\n return ids.length > 0 ? ids.join(',') : null;\n}\n\n/** View-space frame for one or more published shapes. */\nexport function viewFocusBoundsForShapes(\n levels: FocusLevel[],\n shapeIds: number[],\n): SceneBounds | null {\n const wanted = new Set(shapeIds);\n if (wanted.size === 0) return null;\n let combined: SceneBounds | null = null;\n for (const level of levels) {\n for (const shape of level.shapes) {\n if (!wanted.has(shape.id)) continue;\n const next = sceneBoundsFromBBox(shape.bbox, level.transform);\n combined = combined ? expandBounds(combined, next) : next;\n }\n }\n return combined ? viewBoundsFromData(paddedFocusBounds(combined)) : null;\n}\n\n/** View-space frame for a published shape, ready for `CameraRig.focusBounds`. */\nexport function viewFocusBoundsForShape(\n levels: FocusLevel[],\n shapeId: number,\n): SceneBounds | null {\n return viewFocusBoundsForShapes(levels, [shapeId]);\n}\n\ntype RouteFocusLevel = FocusLevel & {\n id: number;\n anchors: Array<{ id: number; shapeId?: number | null; kind?: string }>;\n};\n\n/** Match v1: frame the current-floor route and its endpoint shapes. */\nexport function viewFocusBoundsForRoute(\n levels: RouteFocusLevel[],\n route: PathResult,\n levelId: number | null,\n): SceneBounds | null {\n if (levelId == null) return null;\n const level = levels.find((item) => item.id === levelId);\n if (!level) return null;\n const routePoints = route.points\n .filter((point) => point.levelId === levelId)\n .map((point) => applyLevelTransform(point, level.transform));\n\n let bounds: SceneBounds | null = null;\n if (routePoints.length >= 2) {\n const minX = Math.min(...routePoints.map((point) => point.x));\n const minY = Math.min(...routePoints.map((point) => point.y));\n const maxX = Math.max(...routePoints.map((point) => point.x));\n const maxY = Math.max(...routePoints.map((point) => point.y));\n bounds = {\n minX,\n minY,\n maxX,\n maxY,\n cx: (minX + maxX) / 2,\n cy: (minY + maxY) / 2,\n size: Math.max(maxX - minX, maxY - minY, 1),\n };\n } else if (routePoints.length === 1) {\n const point = routePoints[0];\n bounds = {\n minX: point.x,\n minY: point.y,\n maxX: point.x,\n maxY: point.y,\n cx: point.x,\n cy: point.y,\n size: 1,\n };\n }\n\n const endpointIds = new Set(\n [route.anchorIds[0], route.anchorIds.at(-1)].filter(\n (id): id is number => id != null,\n ),\n );\n const routeAnchorIds = new Set(route.anchorIds);\n const focusShapeIds = new Set<number>();\n for (const anchor of level.anchors) {\n if (!routeAnchorIds.has(anchor.id) || anchor.shapeId == null) continue;\n if (endpointIds.has(anchor.id) || anchor.kind === 'connector') {\n focusShapeIds.add(anchor.shapeId);\n }\n }\n for (const shape of level.shapes) {\n if (!focusShapeIds.has(shape.id)) continue;\n const shapeBounds = sceneBoundsFromBBox(shape.bbox, level.transform);\n bounds = bounds ? expandBounds(bounds, shapeBounds) : shapeBounds;\n }\n\n if (!bounds) return null;\n return viewBoundsFromData(paddedFocusBounds(bounds, 0.1, 1));\n}\n\nexport function easeOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return 1 - (1 - x) ** 3;\n}\n\n/** Symmetric ease so a selection pan is visible the whole way, like v1's lerp. */\nexport function easeInOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return x < 0.5 ? 4 * x * x * x : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nexport interface CameraPose {\n zoom: number;\n position: [number, number, number];\n target: [number, number, number];\n}\n\n/** Interpolate zoom + pan/orbit for a smooth +/− / Reset / selection focus. */\nexport function interpolateCameraPose(\n from: CameraPose,\n to: CameraPose,\n t: number,\n ease: (t: number) => number = easeOutCubic,\n): CameraPose {\n const e = ease(t);\n return {\n zoom: lerp(from.zoom, to.zoom, e),\n position: [\n lerp(from.position[0], to.position[0], e),\n lerp(from.position[1], to.position[1], e),\n lerp(from.position[2], to.position[2], e),\n ],\n target: [\n lerp(from.target[0], to.target[0], e),\n lerp(from.target[1], to.target[1], e),\n lerp(from.target[2], to.target[2], e),\n ],\n };\n}\n\nexport function cameraPosesNear(\n a: CameraPose,\n b: CameraPose,\n epsilon = 1e-3,\n): boolean {\n return (\n Math.abs(a.zoom - b.zoom) < epsilon &&\n Math.abs(a.position[0] - b.position[0]) < epsilon &&\n Math.abs(a.position[1] - b.position[1]) < epsilon &&\n Math.abs(a.position[2] - b.position[2]) < epsilon &&\n Math.abs(a.target[0] - b.target[0]) < epsilon &&\n Math.abs(a.target[1] - b.target[1]) < epsilon &&\n Math.abs(a.target[2] - b.target[2]) < epsilon\n );\n}\n\n/** Zoom `0` means “use the current fit zoom”. */\nexport function withFitZoom(\n pose: CameraPose | null | undefined,\n fitZoom: number,\n): CameraPose | null {\n if (!pose) return null;\n if (pose.zoom > 0) return pose;\n return { ...pose, zoom: fitZoom };\n}\n\n/**\n * RESET destination.\n * Staff capture (`fitToMap`) always returns the fitted full-map view so\n * authors can see every unit and start over. Portal / website / kiosk RESET\n * restores the configured slot pose, or that same fit when the slot is empty.\n */\nexport function resolveResetPose(\n fitToMap: boolean,\n home: CameraPose | null | undefined,\n fit: CameraPose,\n): CameraPose {\n if (fitToMap) return fit;\n return withFitZoom(home, fit.zoom) ?? fit;\n}\n\n/**\n * Chrome Reset clears the store highlight (`focusKey` → null) in the same\n * tick as the ease-home. Restoring the last snap would cancel that ease\n * and leave the camera on the store (first click only un-highlights).\n */\nexport function skipPersistedViewRestore(input: {\n resetInFlight: boolean;\n focusKey: string | number | null;\n}): boolean {\n return input.resetInFlight && input.focusKey == null;\n}\n\nexport function nextOrthoZoom(\n current: number,\n direction: 1 | -1,\n step: number,\n min: number,\n max: number,\n): number {\n const factor = 1 + Math.min(Math.max(step, 0.15), 1) * 0.5;\n const next = direction > 0 ? current * factor : current / factor;\n return Math.min(max, Math.max(min, next));\n}\n\n/** three.js `MOUSE` / `TOUCH` enums — left-drag pans the 2D admin/public map. */\nconst MOUSE_ROTATE = 0;\nconst MOUSE_DOLLY = 1;\nconst MOUSE_PAN = 2;\nconst TOUCH_ROTATE = 0;\nconst TOUCH_PAN = 1;\nconst TOUCH_DOLLY_PAN = 2;\n\n/**\n * Wheel zoom keeps the pointer over the same map point (Google Maps-style).\n * Speed is three-stdlib `pow(0.95, zoomSpeed)` per event — same helper as\n * Edit Map / Wayfinding (`nextZoomFromWheel`).\n * +/− still zooms about the view centre because those buttons have no cursor.\n */\nexport const ORBIT_ZOOM_TO_CURSOR = true;\n\nexport function orbitMouseButtons(is3d: boolean): {\n LEFT: number;\n MIDDLE: number;\n RIGHT: number;\n} {\n if (is3d) {\n return { LEFT: MOUSE_ROTATE, MIDDLE: MOUSE_DOLLY, RIGHT: MOUSE_PAN };\n }\n return { LEFT: MOUSE_PAN, MIDDLE: MOUSE_DOLLY, RIGHT: MOUSE_PAN };\n}\n\nexport function orbitTouches(is3d: boolean): { ONE: number; TWO: number } {\n if (is3d) {\n return { ONE: TOUCH_ROTATE, TWO: TOUCH_DOLLY_PAN };\n }\n return { ONE: TOUCH_PAN, TWO: TOUCH_DOLLY_PAN };\n}\n","import React, { useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport type { OrbitControls } from 'three-stdlib';\nimport * as THREE from 'three';\nimport type { SceneBounds, ThemeDefaults } from '../../core';\nimport {\n boundsExtent,\n cameraPosesNear,\n clampFocusZoom,\n easeOutCubic,\n fitOrthoZoom,\n focusMaxZoomMultiple,\n VIEWER_MAX_ZOOM_MULTIPLE,\n interpolateCameraPose,\n lerp,\n nextOrthoZoom,\n resolveResetPose,\n skipPersistedViewRestore,\n VIEWER_FOCUS_ANIM_MS,\n VIEWER_ZOOM_ANIM_MS,\n type CameraPose,\n} from '../camera';\n\nexport interface MapCameraHandle {\n zoomIn: () => void;\n zoomOut: () => void;\n reset: () => void;\n /** View-space bounds (already Y-flipped). Animates pan + zoom onto the shape. */\n focusBounds: (focus: SceneBounds) => void;\n getView: () => CameraViewSnapshot;\n applyView: (snap: CameraViewSnapshot) => void;\n}\n\n/** Survives Canvas / camera remounts so Settings color tweaks keep the view. */\nexport interface CameraViewSnapshot {\n is3d: boolean;\n boundsKey: string;\n zoom: number;\n position: [number, number, number];\n target: [number, number, number];\n userAdjusted: boolean;\n focusKey?: string | number | null;\n}\n\nexport function cameraBoundsKey(bounds: SceneBounds, is3d: boolean): string {\n return [\n bounds.cx,\n bounds.cy,\n bounds.minX,\n bounds.minY,\n bounds.maxX,\n bounds.maxY,\n bounds.size,\n is3d ? '3d' : '2d',\n ].join('|');\n}\n\nexport interface CameraRigProps {\n /** View-space bounds — already Y-flipped by the scene, so up is +Y. */\n bounds: SceneBounds;\n theme: ThemeDefaults;\n is3d: boolean;\n controlsRef: React.RefObject<OrbitControls | null>;\n cameraRef?: React.Ref<MapCameraHandle | null>;\n persistedViewRef: React.MutableRefObject<CameraViewSnapshot | null>;\n /** Selection key; when it changes the camera eases onto `focusViewBounds`. */\n focusKey?: string | number | null;\n focusViewBounds?: SceneBounds | null;\n /** Saved floor+device pose. Zoom `0` means use the current fit zoom. */\n homePose?: CameraPose | null;\n /** Changes when the staff/runtime slot changes (level + device). */\n homePoseKey?: string | null;\n /** Staff capture: RESET fits the full map. Hosts restore `homePose`. */\n resetFitsMap?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n}\n\nexport function CameraRig({\n bounds,\n theme,\n is3d,\n controlsRef,\n cameraRef,\n persistedViewRef,\n focusKey = null,\n focusViewBounds = null,\n homePose = null,\n homePoseKey = null,\n resetFitsMap = false,\n onCameraChange,\n onCameraReset,\n}: CameraRigProps) {\n const { camera, size, invalidate } = useThree();\n const userAdjusted = useRef(false);\n const applyingView = useRef(false);\n const zoomAnimRef = useRef<number | null>(null);\n const appliedFocusKey = useRef<string | number | null>(null);\n const focusKeyRef = useRef(focusKey);\n focusKeyRef.current = focusKey;\n const focusViewBoundsRef = useRef(focusViewBounds);\n focusViewBoundsRef.current = focusViewBounds;\n const homePoseRef = useRef(homePose);\n homePoseRef.current = homePose;\n const homePoseKeyRef = useRef(homePoseKey);\n homePoseKeyRef.current = homePoseKey;\n const resetFitsMapRef = useRef(resetFitsMap);\n resetFitsMapRef.current = resetFitsMap;\n const onCameraChangeRef = useRef(onCameraChange);\n onCameraChangeRef.current = onCameraChange;\n const onCameraResetRef = useRef(onCameraReset);\n onCameraResetRef.current = onCameraReset;\n const appliedHomeKey = useRef<string | null>(null);\n const ignoreUserChangeUntil = useRef(0);\n /** Chrome Reset also clears the store highlight; skip the following layout restore. */\n const resetInFlight = useRef(false);\n const focusAnimRef = useRef<{\n from: CameraPose;\n dest: CameraPose;\n started: number;\n lookAt: boolean;\n } | null>(null);\n const boundsKey = cameraBoundsKey(bounds, is3d);\n\n const cancelZoomAnim = useCallback(() => {\n if (zoomAnimRef.current == null) return;\n cancelAnimationFrame(zoomAnimRef.current);\n zoomAnimRef.current = null;\n }, []);\n\n const captureView = useCallback(\n (adjusted = userAdjusted.current): CameraViewSnapshot => {\n const controls = controlsRef.current;\n return {\n is3d,\n boundsKey,\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [camera.position.x, camera.position.y, camera.position.z],\n target: controls\n ? [controls.target.x, controls.target.y, controls.target.z]\n : [bounds.cx, bounds.cy, 0],\n userAdjusted: adjusted,\n focusKey: focusKeyRef.current,\n };\n },\n [bounds.cx, bounds.cy, boundsKey, camera, controlsRef, is3d],\n );\n\n const restoreView = useCallback(\n (snap: CameraViewSnapshot) => {\n applyingView.current = true;\n cancelZoomAnim();\n camera.up.set(0, 1, 0);\n camera.position.set(snap.position[0], snap.position[1], snap.position[2]);\n if (camera instanceof THREE.OrthographicCamera) {\n camera.zoom = snap.zoom;\n camera.updateProjectionMatrix();\n } else {\n camera.lookAt(snap.target[0], snap.target[1], snap.target[2]);\n }\n const controls = controlsRef.current;\n if (controls) {\n controls.target.set(snap.target[0], snap.target[1], snap.target[2]);\n controls.update();\n }\n persistedViewRef.current = { ...snap, boundsKey, is3d };\n userAdjusted.current = snap.userAdjusted;\n invalidate();\n applyingView.current = false;\n },\n [boundsKey, camera, cancelZoomAnim, controlsRef, invalidate, is3d, persistedViewRef],\n );\n\n const animateOrthoZoom = useCallback(\n (targetZoom: number) => {\n if (!(camera instanceof THREE.OrthographicCamera)) return;\n cancelZoomAnim();\n const startZoom = camera.zoom;\n if (startZoom === targetZoom) return;\n const started = performance.now();\n const step = (now: number) => {\n if (!(camera instanceof THREE.OrthographicCamera)) return;\n const t = Math.min(1, (now - started) / VIEWER_ZOOM_ANIM_MS);\n camera.zoom = lerp(startZoom, targetZoom, easeOutCubic(t));\n camera.updateProjectionMatrix();\n persistedViewRef.current = captureView();\n invalidate();\n if (t < 1) {\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n onCameraChangeRef.current?.(captureView(true));\n };\n zoomAnimRef.current = requestAnimationFrame(step);\n },\n [camera, cancelZoomAnim, captureView, invalidate, persistedViewRef],\n );\n\n const currentPose = useCallback((): CameraPose => {\n const controls = controlsRef.current;\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [camera.position.x, camera.position.y, camera.position.z],\n target: controls\n ? [controls.target.x, controls.target.y, controls.target.z]\n : [bounds.cx, bounds.cy, 0],\n };\n }, [bounds.cx, bounds.cy, camera, controlsRef]);\n\n const fitPose = useCallback((): CameraPose => {\n const { width, height } = boundsExtent(bounds);\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n return {\n zoom: fitOrthoZoom(size.width, size.height, width, height),\n position: [bounds.cx, bounds.cy, 500],\n target: [bounds.cx, bounds.cy, 0],\n };\n }\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [bounds.cx, bounds.cy - bounds.size * 0.35, bounds.size * 0.85],\n target: [bounds.cx, bounds.cy, 0],\n };\n }, [bounds, camera, is3d, size.height, size.width]);\n\n const applyPose = useCallback(\n (pose: CameraPose, lookAt: boolean) => {\n applyingView.current = true;\n camera.up.set(0, 1, 0);\n camera.position.set(pose.position[0], pose.position[1], pose.position[2]);\n if (camera instanceof THREE.OrthographicCamera) {\n camera.zoom = pose.zoom;\n camera.updateProjectionMatrix();\n }\n if (lookAt) {\n camera.lookAt(pose.target[0], pose.target[1], pose.target[2]);\n }\n const controls = controlsRef.current;\n if (controls) {\n controls.target.set(pose.target[0], pose.target[1], pose.target[2]);\n controls.update();\n }\n invalidate();\n applyingView.current = false;\n },\n [camera, controlsRef, invalidate],\n );\n\n const poseForFocusBounds = useCallback(\n (focus: SceneBounds): CameraPose => {\n const { width, height } = boundsExtent(focus);\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n const mapExtent = boundsExtent(bounds);\n const mapFit = fitOrthoZoom(\n size.width,\n size.height,\n mapExtent.width,\n mapExtent.height,\n );\n return {\n zoom: clampFocusZoom(\n fitOrthoZoom(size.width, size.height, width, height),\n mapFit,\n focusMaxZoomMultiple(width, height),\n ),\n position: [focus.cx, focus.cy, 500],\n target: [focus.cx, focus.cy, 0],\n };\n }\n const sizeHint = Math.max(focus.size, 1);\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [focus.cx, focus.cy - sizeHint * 0.35, sizeHint * 0.85],\n target: [focus.cx, focus.cy, 0],\n };\n },\n [bounds, camera, is3d, size.height, size.width],\n );\n\n const resolvedHomePose = useCallback((): CameraPose | null => {\n const saved = homePoseRef.current;\n if (!saved) return null;\n if (saved.zoom > 0) return saved;\n return { ...saved, zoom: fitPose().zoom };\n }, [fitPose]);\n\n const resetDestination = useCallback((): CameraPose => {\n const fit = fitPose();\n return resolveResetPose(resetFitsMapRef.current, homePoseRef.current, fit);\n }, [fitPose]);\n\n const applyHomeOrFit = useCallback(() => {\n cancelZoomAnim();\n focusAnimRef.current = null;\n const dest = resolvedHomePose() ?? fitPose();\n applyPose(dest, is3d);\n persistedViewRef.current = captureView(false);\n userAdjusted.current = false;\n ignoreUserChangeUntil.current = performance.now() + 160;\n }, [\n applyPose,\n cancelZoomAnim,\n captureView,\n fitPose,\n is3d,\n persistedViewRef,\n resolvedHomePose,\n ]);\n\n const applyFit = useCallback(() => {\n applyHomeOrFit();\n }, [applyHomeOrFit]);\n\n const animateFocus = useCallback(\n (focus: SceneBounds) => {\n const dest = poseForFocusBounds(focus);\n const from = currentPose();\n userAdjusted.current = true;\n appliedFocusKey.current = focusKeyRef.current;\n cancelZoomAnim();\n if (cameraPosesNear(from, dest)) {\n focusAnimRef.current = null;\n persistedViewRef.current = captureView(true);\n return;\n }\n // Drive the pan in useFrame so a later layout effect cannot snap to dest.\n focusAnimRef.current = {\n from,\n dest,\n started: performance.now(),\n lookAt: is3d,\n };\n applyingView.current = true;\n invalidate();\n },\n [\n cancelZoomAnim,\n captureView,\n currentPose,\n invalidate,\n is3d,\n persistedViewRef,\n poseForFocusBounds,\n ],\n );\n\n const animateReset = useCallback(() => {\n const dest = resetDestination();\n const from = currentPose();\n focusAnimRef.current = null;\n if (cameraPosesNear(from, dest)) {\n userAdjusted.current = false;\n persistedViewRef.current = captureView(false);\n resetInFlight.current = false;\n return;\n }\n cancelZoomAnim();\n const started = performance.now();\n const lookAt = is3d;\n const step = (now: number) => {\n const t = Math.min(1, (now - started) / VIEWER_ZOOM_ANIM_MS);\n applyPose(interpolateCameraPose(from, dest, t), lookAt);\n persistedViewRef.current = captureView(false);\n if (t < 1) {\n applyingView.current = true;\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n userAdjusted.current = false;\n applyingView.current = false;\n resetInFlight.current = false;\n };\n applyingView.current = true;\n ignoreUserChangeUntil.current = performance.now() + 400;\n zoomAnimRef.current = requestAnimationFrame(step);\n }, [\n applyPose,\n cancelZoomAnim,\n captureView,\n currentPose,\n is3d,\n persistedViewRef,\n resetDestination,\n ]);\n const applyFitRef = useRef(applyFit);\n applyFitRef.current = applyFit;\n const restoreViewRef = useRef(restoreView);\n restoreViewRef.current = restoreView;\n const animateFocusRef = useRef(animateFocus);\n animateFocusRef.current = animateFocus;\n\n const zoomBy = useCallback(\n (direction: 1 | -1) => {\n userAdjusted.current = true;\n focusAnimRef.current = null;\n const controls = controlsRef.current;\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n const { width, height } = boundsExtent(bounds);\n const fit = fitOrthoZoom(size.width, size.height, width, height);\n animateOrthoZoom(\n nextOrthoZoom(\n camera.zoom,\n direction,\n theme.ZOOM_STEP,\n fit * 0.2,\n fit * VIEWER_MAX_ZOOM_MULTIPLE,\n ),\n );\n } else if (controls) {\n const offset = camera.position.clone().sub(controls.target);\n const factor = 1 + Math.min(Math.max(theme.ZOOM_STEP, 0.15), 1) * 0.5;\n const next = direction > 0 ? offset.length() / factor : offset.length() * factor;\n offset.setLength(\n Math.min(theme.CAMERA_MAX_DISTANCE, Math.max(theme.CAMERA_MIN_DISTANCE, next)),\n );\n camera.position.copy(controls.target).add(offset);\n persistedViewRef.current = captureView();\n onCameraChangeRef.current?.(captureView(true));\n }\n controls?.update();\n invalidate();\n },\n [\n animateOrthoZoom,\n bounds,\n camera,\n captureView,\n controlsRef,\n invalidate,\n is3d,\n persistedViewRef,\n size.height,\n size.width,\n theme,\n ],\n );\n\n useEffect(() => () => cancelZoomAnim(), [cancelZoomAnim]);\n\n useEffect(() => {\n const controls = controlsRef.current;\n if (!controls) return;\n const onChange = () => {\n if (applyingView.current) return;\n if (performance.now() < ignoreUserChangeUntil.current) return;\n userAdjusted.current = true;\n persistedViewRef.current = captureView(true);\n onCameraChangeRef.current?.(persistedViewRef.current);\n };\n const onStart = () => {\n if (applyingView.current) return;\n if (performance.now() < ignoreUserChangeUntil.current) return;\n // Pointer drag — not OrbitControls.update() during a programmed ease.\n userAdjusted.current = true;\n focusAnimRef.current = null;\n persistedViewRef.current = captureView(true);\n onCameraChangeRef.current?.(persistedViewRef.current);\n };\n controls.addEventListener('change', onChange);\n controls.addEventListener('start', onStart);\n return () => {\n controls.removeEventListener('change', onChange);\n controls.removeEventListener('start', onStart);\n };\n }, [camera, captureView, controlsRef, persistedViewRef]);\n\n useImperativeHandle(\n cameraRef,\n () => ({\n zoomIn: () => {\n zoomBy(1);\n },\n zoomOut: () => {\n zoomBy(-1);\n },\n reset: () => {\n userAdjusted.current = false;\n focusAnimRef.current = null;\n appliedFocusKey.current = null;\n focusKeyRef.current = null;\n resetInFlight.current = true;\n onCameraResetRef.current?.();\n animateReset();\n },\n focusBounds: (focus) => {\n animateFocus(focus);\n },\n getView: () => captureView(),\n applyView: (snap) => restoreView(snap),\n }),\n [animateFocus, animateReset, captureView, restoreView, zoomBy],\n );\n\n useLayoutEffect(() => {\n if (size.width < 2 || size.height < 2) return;\n if (focusKey == null) {\n appliedFocusKey.current = null;\n focusAnimRef.current = null;\n }\n if (skipPersistedViewRestore({ resetInFlight: resetInFlight.current, focusKey })) {\n return;\n }\n if (resetInFlight.current) resetInFlight.current = false;\n const snap = persistedViewRef.current;\n const focus = focusViewBoundsRef.current;\n const isNewFocus =\n focusKey != null && focus != null && appliedFocusKey.current !== focusKey;\n const snapMatchesFocus =\n snap != null &&\n snap.is3d === is3d &&\n snap.boundsKey === boundsKey &&\n snap.focusKey === focusKey;\n\n if (focusKey != null && focus != null) {\n if (snapMatchesFocus) {\n appliedFocusKey.current = focusKey;\n if (focusAnimRef.current == null) restoreViewRef.current(snap);\n return;\n }\n if (isNewFocus) {\n // Only the first map paint snaps — otherwise the unfitted camera flashes.\n // Every later selection eases from the current view, like v1.\n if (persistedViewRef.current == null) {\n appliedFocusKey.current = focusKey;\n userAdjusted.current = true;\n cancelZoomAnim();\n applyPose(poseForFocusBounds(focus), is3d);\n persistedViewRef.current = captureView(true);\n return;\n }\n if (snap && !snapMatchesFocus) restoreViewRef.current(snap);\n animateFocusRef.current(focus);\n return;\n }\n // Same selection after a remount / theme swap — keep the current view.\n // Do not snap: that cancelled the ease when this effect re-ran.\n return;\n }\n\n if (homePoseKey && appliedHomeKey.current !== homePoseKey) {\n appliedHomeKey.current = homePoseKey;\n userAdjusted.current = false;\n applyFitRef.current();\n return;\n }\n\n // Theme rebuilds can swap the drei camera or remount this rig. Keep the\n // last view when the map extents and 2D/3D mode have not changed.\n if (snap && snap.is3d === is3d && snap.boundsKey === boundsKey) {\n restoreViewRef.current(snap);\n return;\n }\n userAdjusted.current = false;\n applyFitRef.current();\n }, [\n applyPose,\n boundsKey,\n camera,\n cancelZoomAnim,\n captureView,\n focusKey,\n homePoseKey,\n is3d,\n persistedViewRef,\n poseForFocusBounds,\n ]);\n\n useEffect(() => {\n if (size.width < 2 || size.height < 2 || userAdjusted.current) return;\n applyFitRef.current();\n }, [size.height, size.width]);\n\n useFrame(() => {\n const anim = focusAnimRef.current;\n if (!anim) return;\n const t = Math.min(1, (performance.now() - anim.started) / VIEWER_FOCUS_ANIM_MS);\n applyPose(\n interpolateCameraPose(anim.from, anim.dest, t, easeOutCubic),\n anim.lookAt,\n );\n persistedViewRef.current = captureView(true);\n if (t < 1) {\n invalidate();\n return;\n }\n focusAnimRef.current = null;\n });\n\n return null;\n}\n","/**\n * OrbitControls uses one `enableZoom` flag for wheel and touch pinch.\n * Website maps must swallow wheel only — pinch stays on the controls.\n *\n * R3F sets `events.connected` to `false` until the canvas host is wired,\n * so callers must not treat a falsy connected value as a DOM node.\n */\n\nfunction isEventRoot(value: unknown): value is EventTarget {\n return typeof value === 'object' && value !== null;\n}\n\nexport function orbitEventRoot(\n eventSource: EventTarget | null | undefined,\n connected: unknown,\n canvas: EventTarget | null | undefined,\n): EventTarget | null {\n if (isEventRoot(eventSource)) return eventSource;\n if (isEventRoot(connected)) return connected;\n if (isEventRoot(canvas)) return canvas;\n return null;\n}\n\nexport function viewerWheelEventHitsMap(\n root: EventTarget | null | undefined,\n target: EventTarget | null,\n): boolean {\n if (!isEventRoot(root) || target == null) return false;\n const contains = (root as { contains?: (node: EventTarget) => boolean }).contains;\n return typeof contains === 'function' && contains.call(root, target);\n}\n\n/** Stop OrbitControls without preventDefault so the page can still scroll. */\nexport function suppressViewerWheelZoom(event: Event): void {\n event.stopImmediatePropagation();\n}\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport { Canvas, useThree } from '@react-three/fiber';\nimport { OrthographicCamera, OrbitControls } from '@react-three/drei';\nimport type { OrbitControls as OrbitControlsImpl } from 'three-stdlib';\nimport type {\n MapViewerHost,\n PathResult,\n PublishedDocument,\n PublishedRetailer,\n SceneBounds,\n ThemeDefaults,\n ViewerHoverTooltipHandler,\n} from '../../core';\nimport type { ResponsiveCameraPose } from '../../core';\nimport {\n boundsFromStackedLevels,\n isOutdoorLevel,\n isTransparentColor,\n outdoorSvgSuppressIds,\n viewerAllowsWheelZoom,\n viewerLevelStack,\n} from '../../core';\nimport { LevelMeshes } from './LevelMeshes';\nimport { RouteLine } from './RouteLine';\nimport { SvgVectorLayer } from './SvgVectorLayer';\nimport { CameraRig, type CameraViewSnapshot, type MapCameraHandle } from './CameraRig';\nimport {\n ORBIT_ZOOM_TO_CURSOR,\n SCENE_FLIP_SCALE,\n orbitMouseButtons,\n orbitTouches,\n viewBoundsFromData,\n type CameraPose,\n} from '../camera';\nimport {\n beginViewerPointerGesture,\n createViewerPointerGesture,\n endViewerPointerGesture,\n moveViewerPointerGesture,\n pointerMissClearsSelection,\n viewerPointerClientXY,\n} from '../pointer';\nimport {\n orbitEventRoot,\n suppressViewerWheelZoom,\n viewerWheelEventHitsMap,\n} from '../orbitWheelZoom';\n\nconst OUTDOOR_Z = -1;\nconst CAMERA_UP: [number, number, number] = [0, 1, 0];\nconst CANVAS_DPR: [number, number] = [1, 2];\nconst CANVAS_GL = { antialias: true };\n\n/**\n * OrbitControls uses one `enableZoom` flag for both wheel and touch pinch.\n * Swallow wheel on the document (capture) so the page can scroll and pinch\n * stays available. Listen on `document` because R3F's `events.connected` is\n * `false` until the canvas host is wired — attaching to that value is a no-op.\n */\nfunction OrbitWheelZoomGuard({\n blockWheel,\n eventSource,\n}: {\n blockWheel: boolean;\n eventSource?: React.RefObject<HTMLElement | null>;\n}) {\n const gl = useThree((state) => state.gl);\n const connected = useThree((state) => state.events.connected);\n\n useEffect(() => {\n if (!blockWheel) return;\n\n const onWheel = (event: WheelEvent) => {\n const root = orbitEventRoot(\n eventSource?.current,\n connected,\n gl.domElement,\n );\n if (!viewerWheelEventHitsMap(root, event.target)) return;\n suppressViewerWheelZoom(event);\n };\n\n document.addEventListener('wheel', onWheel, { capture: true });\n return () => document.removeEventListener('wheel', onWheel, { capture: true });\n }, [blockWheel, connected, eventSource, gl.domElement]);\n\n return null;\n}\n\nexport interface MapSceneProps {\n doc: PublishedDocument;\n theme: ThemeDefaults;\n activeLevelId: number | null;\n route: PathResult | null;\n selectedShapeId?: number | null;\n selectedShapeIds?: number[];\n hoveredShapeId?: number | null;\n focusKey?: string | number | null;\n focusViewBounds?: SceneBounds | null;\n cameraRef?: React.Ref<MapCameraHandle | null>;\n onSelectShape?: (\n shapeId: number | null,\n levelId: number,\n opts?: { additive?: boolean },\n ) => void;\n onActiveLevelChange?: (levelId: number) => void;\n imageProxyUrl?: string | null;\n /** Keep pointer events inside the map canvas host so header/footer stay clickable. */\n eventSource?: React.RefObject<HTMLElement | null>;\n /** WEBSITE / DISPLAY_APP hide unassigned amenity, kiosk, elevator, and escalator shapes. */\n host?: MapViewerHost;\n /** Assigned kiosk shape currently running this DISPLAY_APP viewer. */\n kioskOriginShapeId?: number | null;\n retailers?: PublishedRetailer[];\n showHoverTooltip?: boolean;\n onHoverTooltip?: ViewerHoverTooltipHandler;\n homePose?: ResponsiveCameraPose | CameraPose | null;\n homePoseKey?: string | null;\n resetFitsMap?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n /** Override website wheel-block (staff Map Responsiveness capture). */\n allowWheelZoom?: boolean;\n}\n\nexport function MapScene({\n doc,\n theme,\n activeLevelId,\n route,\n selectedShapeId,\n selectedShapeIds,\n hoveredShapeId = null,\n focusKey,\n focusViewBounds,\n cameraRef,\n onSelectShape,\n onActiveLevelChange,\n imageProxyUrl,\n eventSource,\n host = 'PORTAL_ASSIGN',\n homePose = null,\n homePoseKey = null,\n resetFitsMap = false,\n onCameraChange,\n onCameraReset,\n allowWheelZoom,\n kioskOriginShapeId = null,\n retailers = [],\n showHoverTooltip = false,\n onHoverTooltip,\n}: MapSceneProps) {\n const is3d = theme.MAP_STYLE === '3D';\n const controlsRef = useRef<OrbitControlsImpl | null>(null);\n const persistedViewRef = useRef<CameraViewSnapshot | null>(null);\n const pointerDownRef = useRef<{ x: number; y: number } | null>(null);\n const pointerGestureRef = useRef(createViewerPointerGesture());\n\n useEffect(() => {\n const root = eventSource?.current;\n if (!root) return;\n\n const gesture = pointerGestureRef.current;\n\n const onDown = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n pointerDownRef.current = { x: pos.x, y: pos.y };\n beginViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n const onMove = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n moveViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n const onUp = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n endViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n root.addEventListener('pointerdown', onDown, true);\n window.addEventListener('pointermove', onMove, { passive: true });\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n root.removeEventListener('pointerdown', onDown, true);\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [eventSource]);\n\n const stacked = useMemo(\n () => viewerLevelStack(doc.levels, activeLevelId),\n [doc.levels, activeLevelId],\n );\n\n const bounds = useMemo(\n () => boundsFromStackedLevels(doc.levels, activeLevelId, doc.baseViewbox),\n [doc.levels, doc.baseViewbox, activeLevelId],\n );\n\n const view = useMemo(\n () => viewBoundsFromData(bounds),\n [\n bounds.cx,\n bounds.cy,\n bounds.maxX,\n bounds.maxY,\n bounds.minX,\n bounds.minY,\n bounds.size,\n ],\n );\n const cameraPosition = useMemo(\n () => [view.cx, view.cy, 500] as [number, number, number],\n [view.cx, view.cy],\n );\n const camera3dPosition = useMemo(\n () =>\n [view.cx, view.cy - view.size * 0.35, view.size * 0.85] as [\n number,\n number,\n number,\n ],\n [view.cx, view.cy, view.size],\n );\n const mouseButtons = useMemo(() => orbitMouseButtons(is3d), [is3d]);\n const touches = useMemo(() => orbitTouches(is3d), [is3d]);\n\n const outdoorLevel = useMemo(\n () => doc.levels.find((level) => isOutdoorLevel(level)) ?? null,\n [doc.levels],\n );\n\n const outdoorSvgUrl =\n outdoorLevel?.sourceSvgUrl ?? doc.baseSvgUrl ?? null;\n\n const suppressIds = useMemo(\n () => outdoorSvgSuppressIds(doc.levels),\n [doc.levels],\n );\n\n const showOutdoorSvg = stacked.some((level) => isOutdoorLevel(level));\n\n const outdoorTheme = useMemo(\n () => ({\n GREEN_AREA_COLOR: theme.GREEN_AREA_COLOR,\n WATER_COLOR: theme.WATER_COLOR,\n PARKING_LANE_COLOR: theme.PARKING_LANE_COLOR,\n PARKING_ICON_COLOR: theme.PARKING_ICON_COLOR,\n WALKABLE_COLOR: theme.WALKABLE_COLOR,\n }),\n [\n theme.GREEN_AREA_COLOR,\n theme.PARKING_ICON_COLOR,\n theme.PARKING_LANE_COLOR,\n theme.WALKABLE_COLOR,\n theme.WATER_COLOR,\n ],\n );\n\n return (\n <Canvas\n style={{\n width: '100%',\n height: '100%',\n background: isTransparentColor(theme.MAP_BACKGROUND_COLOR)\n ? 'transparent'\n : theme.MAP_BACKGROUND_COLOR,\n }}\n eventSource={eventSource as React.RefObject<HTMLElement> | undefined}\n eventPrefix=\"offset\"\n orthographic={!is3d}\n frameloop=\"demand\"\n dpr={CANVAS_DPR}\n flat\n gl={CANVAS_GL}\n onPointerDown={(e) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n pointerDownRef.current = { x: pos.x, y: pos.y };\n beginViewerPointerGesture(pointerGestureRef.current, pos.x, pos.y, pos.pointerId);\n }}\n onPointerMissed={(e) => {\n if (\n pointerMissClearsSelection(pointerDownRef.current, {\n x: e.clientX,\n y: e.clientY,\n button: e.button,\n })\n ) {\n onSelectShape?.(null, activeLevelId ?? 0);\n }\n }}\n camera={\n is3d\n ? {\n position: camera3dPosition,\n fov: 50,\n near: 1,\n far: 10000,\n up: CAMERA_UP,\n }\n : undefined\n }\n >\n {!is3d && (\n <OrthographicCamera\n makeDefault\n position={cameraPosition}\n up={CAMERA_UP}\n near={0.1}\n far={5000}\n />\n )}\n {isTransparentColor(theme.MAP_BACKGROUND_COLOR) ? null : (\n <color attach=\"background\" args={[theme.MAP_BACKGROUND_COLOR]} />\n )}\n <ambientLight intensity={4} color=\"#c4c4c4\" />\n <directionalLight position={[0, 400, 0]} color=\"#ffffff\" intensity={0.3} />\n <directionalLight position={[0, 0, 400]} color=\"#c4c4c4\" intensity={0.2} />\n <directionalLight position={[0, 0, -400]} color=\"#c4c4c4\" intensity={0.2} />\n\n <group scale={SCENE_FLIP_SCALE}>\n {showOutdoorSvg && outdoorSvgUrl ? (\n <SvgVectorLayer\n url={outdoorSvgUrl}\n suppressIds={suppressIds}\n imageProxyUrl={imageProxyUrl}\n is3d={is3d}\n theme={outdoorTheme}\n />\n ) : null}\n\n {stacked.map((level) => {\n const outdoor = isOutdoorLevel(level);\n const transform = level.transform;\n return (\n <group\n key={level.id}\n position={[\n transform.translateX,\n transform.translateY,\n outdoor ? OUTDOOR_Z : 0,\n ]}\n rotation={[0, 0, (transform.rotate * Math.PI) / 180]}\n scale={transform.scale || 1}\n >\n <LevelMeshes\n level={level}\n levels={doc.levels}\n theme={theme}\n is3d={is3d}\n eventSource={eventSource}\n pointerGestureRef={pointerGestureRef}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n interactiveOnly={outdoor && Boolean(outdoorSvgUrl)}\n imageProxyUrl={imageProxyUrl}\n amenities={doc.amenities}\n retailers={retailers}\n host={host}\n kioskOriginShapeId={kioskOriginShapeId}\n showHoverTooltip={showHoverTooltip}\n onHoverTooltip={onHoverTooltip}\n onSelectShape={(shapeId, opts) =>\n onSelectShape?.(shapeId, level.id, opts)\n }\n />\n {route && level.id === activeLevelId ? (\n <RouteLine\n route={route}\n levelId={level.id}\n levels={doc.levels}\n connectors={doc.connectors}\n color={theme.ROUTE_COLOR}\n thickness={theme.ROUTE_THICKNESS}\n onActiveLevelChange={onActiveLevelChange}\n />\n ) : null}\n </group>\n );\n })}\n </group>\n\n <OrbitWheelZoomGuard\n eventSource={eventSource}\n blockWheel={!(allowWheelZoom ?? viewerAllowsWheelZoom(host))}\n />\n <OrbitControls\n ref={controlsRef}\n makeDefault\n enableDamping={false}\n enableRotate={is3d}\n enablePan\n enableZoom\n screenSpacePanning\n zoomSpeed={1}\n zoomToCursor={ORBIT_ZOOM_TO_CURSOR}\n mouseButtons={mouseButtons}\n touches={touches}\n maxDistance={theme.CAMERA_MAX_DISTANCE}\n minDistance={theme.CAMERA_MIN_DISTANCE}\n />\n <CameraRig\n bounds={view}\n theme={theme}\n is3d={is3d}\n controlsRef={controlsRef}\n cameraRef={cameraRef}\n persistedViewRef={persistedViewRef}\n focusKey={focusKey ?? selectedShapeId ?? null}\n focusViewBounds={focusViewBounds ?? null}\n homePose={homePose}\n homePoseKey={homePoseKey}\n resetFitsMap={resetFitsMap}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n />\n </Canvas>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport {\n STATIC_ICON_COLORS,\n type CmAmenityCatalogItem,\n type PathResult,\n type PublishedDocument,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { getAmenityByType, recolorMapSvg } from '../../specialIcons';\n\nexport interface RuntimeChromeProps {\n doc: PublishedDocument;\n amenities: CmAmenityCatalogItem[];\n activeLevelId: number | null;\n onActiveLevelChange: (id: number) => void;\n fromAnchorId: number | null;\n toAnchorId: number | null;\n onFromChange: (id: number | null) => void;\n onToChange: (id: number | null) => void;\n accessibleOnly: boolean;\n onAccessibleOnlyChange: (v: boolean) => void;\n route: PathResult | null;\n showSearch?: boolean;\n showAmenities?: boolean;\n amenityIconColor?: string;\n}\n\ninterface ListItem {\n id: string;\n label: string;\n group: string;\n anchorId: number | null;\n levelId: number;\n kind: 'store' | 'amenity';\n amenityId: number | null;\n}\n\nfunction itemLabel(\n shape: PublishedDocument['levels'][number]['shapes'][number],\n amenityName?: string,\n): string {\n return (\n shape.assignment?.customLabel ||\n amenityName ||\n shape.label.text ||\n shape.assignment?.unitNumber ||\n shape.key\n );\n}\n\nexport function RuntimeChrome({\n doc,\n amenities,\n fromAnchorId,\n toAnchorId,\n onFromChange,\n onToChange,\n accessibleOnly,\n onAccessibleOnlyChange,\n route,\n showSearch = true,\n showAmenities = true,\n amenityIconColor = STATIC_ICON_COLORS.amenity,\n}: RuntimeChromeProps) {\n const [query, setQuery] = useState('');\n const [selectedItem, setSelectedItem] = useState<ListItem | null>(null);\n\n const items = useMemo(() => {\n const list: ListItem[] = [];\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id) ?? null;\n if (shape.kind === 'unit') {\n list.push({\n id: `store-${shape.id}`,\n label: itemLabel(shape),\n group: level.name,\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'store',\n amenityId: null,\n });\n }\n if (shape.kind === 'amenity' && shape.assignment?.amenityId) {\n const amenity = amenities.find((a) => a.id === shape.assignment!.amenityId);\n list.push({\n id: `amenity-${shape.id}`,\n label: itemLabel(shape, amenity?.name),\n group: 'Amenities',\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'amenity',\n amenityId: amenity?.id ?? shape.assignment.amenityId,\n });\n }\n }\n }\n return list;\n }, [doc, amenities]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter((i) => i.label.toLowerCase().includes(q));\n }, [items, query]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, ListItem[]>();\n for (const item of filtered) {\n const arr = map.get(item.group) ?? [];\n arr.push(item);\n map.set(item.group, arr);\n }\n return Array.from(map.entries());\n }, [filtered]);\n\n const anchorOptions = items.filter((i) => i.anchorId != null);\n const hasQuery = query.trim().length > 0;\n\n const selectItem = (item: ListItem) => {\n setSelectedItem(item);\n if (item.anchorId != null) {\n onToChange(item.anchorId);\n }\n };\n\n if (!showSearch && !(showAmenities && amenities.length > 0)) {\n return null;\n }\n\n return (\n <div className=\"eyeon-map-chrome\">\n <div className=\"eyeon-map-chrome__top\">\n {showSearch && (\n <input\n type=\"search\"\n className=\"eyeon-map-chrome__search-input\"\n placeholder=\"Search...\"\n aria-label=\"Search...\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n )}\n\n {showAmenities && amenities.length > 0 && (\n <div className=\"eyeon-map-chrome__amenities\">\n {amenities.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n className=\"eyeon-map-chrome__amenity\"\n aria-label={a.name}\n onClick={() => {\n const match = items.find(\n (i) =>\n i.kind === 'amenity' &&\n i.amenityId === a.id &&\n i.anchorId != null,\n );\n if (match) selectItem(match);\n }}\n >\n {(() => {\n const amenity = getAmenityByType(a.code);\n return amenity ? (\n <span\n className=\"eyeon-map-chrome__amenity-icon\"\n dangerouslySetInnerHTML={{\n __html: recolorMapSvg(amenity.svgCode, amenityIconColor),\n }}\n />\n ) : (\n <span className=\"eyeon-map-chrome__amenity-label\">\n {a.name.slice(0, 2)}\n </span>\n );\n })()}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {showSearch && hasQuery && (\n <div className=\"eyeon-map-chrome__panel\">\n <div className=\"eyeon-map-chrome__groups\">\n {grouped.length === 0 ? (\n <div className=\"eyeon-map-chrome__empty\">No matching stores</div>\n ) : (\n grouped.map(([group, groupItems]) => (\n <div key={group} className=\"eyeon-map-chrome__group\">\n <div className=\"eyeon-map-chrome__group-title\">{group}</div>\n {groupItems.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={\n selectedItem?.id === item.id\n ? 'eyeon-map-chrome__item is-selected'\n : 'eyeon-map-chrome__item'\n }\n onClick={() => selectItem(item)}\n >\n {item.label}\n </button>\n ))}\n </div>\n ))\n )}\n </div>\n\n {selectedItem && (\n <div className=\"eyeon-map-chrome__detail\">\n <div className=\"eyeon-map-chrome__detail-title\">{selectedItem.label}</div>\n <div className=\"eyeon-map-chrome__detail-meta\">{selectedItem.group}</div>\n </div>\n )}\n\n <div className=\"eyeon-map-chrome__route\">\n <label>\n From\n <ModernSelect\n ariaLabel=\"From\"\n value={fromAnchorId != null ? String(fromAnchorId) : ''}\n placeholder=\"Select start\"\n searchable\n options={anchorOptions.map((i) => ({\n value: String(i.anchorId),\n label: `${i.label} · ${i.group}`,\n }))}\n onChange={(next) => onFromChange(next ? Number(next) : null)}\n />\n </label>\n <label>\n To\n <ModernSelect\n ariaLabel=\"To\"\n value={toAnchorId != null ? String(toAnchorId) : ''}\n placeholder=\"Select destination\"\n searchable\n options={anchorOptions.map((i) => ({\n value: String(i.anchorId),\n label: `${i.label} · ${i.group}`,\n }))}\n onChange={(next) => onToChange(next ? Number(next) : null)}\n />\n </label>\n <label className=\"eyeon-map-chrome__accessible\">\n <input\n type=\"checkbox\"\n checked={accessibleOnly}\n onChange={(e) => onAccessibleOnlyChange(e.target.checked)}\n />\n Accessible route\n </label>\n {route && (\n <div className=\"eyeon-map-chrome__route-meta\">\n {route.levelChanges.length > 0\n ? `${route.levelChanges.length} level change(s)`\n : 'Same level'}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n formatRetailerPhone,\n resolveFetchUrl,\n websiteFromRetailerOptions,\n websiteInfoModalDirections,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport type {\n MapViewerHost,\n WebsiteDestination,\n WebsiteMappedRetailer,\n} from '../../core';\n\nexport function WebsiteInfoModal({\n destination,\n retailers,\n imageProxyUrl,\n host = 'WEBSITE',\n onClose,\n onMapIt,\n}: {\n destination: WebsiteDestination;\n retailers: WebsiteMappedRetailer[];\n imageProxyUrl?: string | null;\n host?: MapViewerHost;\n onClose: () => void;\n onMapIt: (fromRetailerId: number) => void;\n}) {\n const [fromRetailerId, setFromRetailerId] = useState('');\n const retailer =\n destination.kind === 'store' && destination.retailerId != null\n ? retailers.find((item) => item.id === destination.retailerId) ?? null\n : null;\n\n const options = useMemo(\n () => websiteFromRetailerOptions(retailers, destination.retailerId),\n [destination.retailerId, retailers],\n );\n\n useEffect(() => {\n setFromRetailerId('');\n }, [destination.shapeId]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n if (typeof document === 'undefined') return null;\n\n const logo = retailer?.logoUrl\n ? resolveFetchUrl(retailer.logoUrl, imageProxyUrl)\n : null;\n const showDetails = Boolean(\n retailer &&\n (logo ||\n retailer.name ||\n retailer.location ||\n retailer.phone ||\n retailer.description),\n );\n const directions = websiteInfoModalDirections(host, destination);\n const mapItDisabled = directions.mapItDisabled || !fromRetailerId;\n const showForm = directions.showFromRetailers || directions.showMapIt;\n\n return createPortal(\n <div\n className=\"eyeon-map-info-modal\"\n role=\"presentation\"\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div\n className=\"eyeon-map-info-modal__dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"eyeon-map-info-modal-title\"\n >\n <button\n type=\"button\"\n className=\"eyeon-map-info-modal__close\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#000\" />\n <path\n d=\"M8 8l8 8M16 8l-8 8\"\n stroke=\"#fff\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n <div className=\"eyeon-map-info-modal__body\">\n <div className=\"eyeon-map-info-modal__content\">\n {showDetails ? (\n <div className=\"eyeon-map-info-modal__retailer\">\n {logo ? (\n <div className=\"eyeon-map-info-modal__logo\">\n <img src={logo} alt={retailer?.name ?? ''} />\n </div>\n ) : null}\n <div className=\"eyeon-map-info-modal__copy\">\n <div id=\"eyeon-map-info-modal-title\">\n <b>Retailer:</b> {retailer?.name}\n </div>\n {retailer?.location ? (\n <div>\n <b>Location:</b> {retailer.location}\n </div>\n ) : null}\n {retailer?.phone ? (\n <div>\n <b>Phone:</b>{' '}\n <a href={`tel:${retailer.phone}`}>\n {formatRetailerPhone(retailer.phone)}\n </a>\n </div>\n ) : null}\n {retailer?.description ? (\n <div\n dangerouslySetInnerHTML={{ __html: retailer.description }}\n />\n ) : null}\n </div>\n </div>\n ) : (\n <div\n id=\"eyeon-map-info-modal-title\"\n className=\"eyeon-map-info-modal__amenity\"\n >\n {destination.name}\n </div>\n )}\n </div>\n {showForm ? (\n <form\n className=\"eyeon-map-info-modal__form\"\n onSubmit={(e) => {\n e.preventDefault();\n if (mapItDisabled) return;\n const id = Number(fromRetailerId);\n if (Number.isFinite(id) && id > 0) onMapIt(id);\n }}\n >\n {directions.showFromRetailers ? (\n <ModernSelect\n ariaLabel=\"Choose a Retailer\"\n value={fromRetailerId}\n placeholder=\"Get direction from ...\"\n searchable\n options={options}\n onChange={setFromRetailerId}\n />\n ) : null}\n {directions.showMapIt ? (\n <span\n className=\"eyeon-map-info-modal__map-it-tooltip\"\n data-tooltip={directions.mapItTooltip ?? undefined}\n tabIndex={directions.mapItTooltip ? 0 : undefined}\n >\n <button\n type=\"submit\"\n className=\"eyeon-map-info-modal__map-it\"\n disabled={mapItDisabled}\n aria-describedby={\n directions.mapItTooltip\n ? 'eyeon-map-info-modal-map-it-tip'\n : undefined\n }\n >\n Map IT\n </button>\n {directions.mapItTooltip ? (\n <span\n id=\"eyeon-map-info-modal-map-it-tip\"\n className=\"eyeon-map-info-modal__sr-only\"\n >\n {directions.mapItTooltip}\n </span>\n ) : null}\n </span>\n ) : null}\n </form>\n ) : null}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","import React from 'react';\nimport type { ViewerHoverTooltip } from '../../core';\n\nexport function HoverTooltip({\n tooltip,\n}: {\n tooltip: ViewerHoverTooltip | null;\n}) {\n if (!tooltip) return null;\n return (\n <div\n className=\"eyeon-map-hover-tooltip\"\n role=\"tooltip\"\n style={{ left: tooltip.x, top: tooltip.y }}\n >\n <div className=\"eyeon-map-hover-tooltip__pop\">\n <span className=\"eyeon-map-hover-tooltip__label\">{tooltip.text}</span>\n <span className=\"eyeon-map-hover-tooltip__arrow\" aria-hidden=\"true\" />\n </div>\n </div>\n );\n}\n","import {\n normalizeRetailerCatalogItem,\n type PublishedRetailer,\n} from '../core';\n\nexport async function fetchWebsiteRetailers(\n webApiURI: string,\n centerId?: number,\n signal?: AbortSignal,\n): Promise<PublishedRetailer[]> {\n const base = webApiURI.replace(/\\/$/, '');\n const all: unknown[] = [];\n let page = 1;\n while (!signal?.aborted) {\n const params = new URLSearchParams({\n limit: '100',\n page: String(page),\n });\n if (centerId != null && centerId > 0) {\n params.set('center_id', String(centerId));\n }\n const res = await fetch(`${base}/v1/retailers?${params}`, {\n credentials: 'include',\n signal,\n });\n if (!res.ok) break;\n const json = (await res.json()) as { items?: unknown[]; count?: number };\n const items = Array.isArray(json.items)\n ? json.items\n : Array.isArray(json)\n ? json\n : [];\n all.push(...items);\n const count = typeof json.count === 'number' ? json.count : all.length;\n if (all.length >= count || items.length < 100) break;\n page += 1;\n }\n return all\n .map(normalizeRetailerCatalogItem)\n .filter((item): item is PublishedRetailer => item != null);\n}\n","import React, { Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n DeviceType,\n MapViewerHost,\n PathResult,\n PublishedDocument,\n PublishedRetailer,\n ThemeDefaults,\n ViewerHoverTooltip,\n} from '../core';\nimport {\n compileGraph,\n defaultViewerLevelId,\n deviceFromHost,\n findResponsiveOverride,\n findViewerKioskOrigin,\n MAP_NO_FLOORS_MESSAGE,\n mergeTheme,\n findNearestAmenityPath,\n findShortestPlacePath,\n matchingShapeAnchorIds,\n normalizePublishedDocument,\n shapeAnchorIds,\n overrideToCameraPose,\n responsiveViewKey,\n viewerAllowsWheelZoom,\n viewerCanShowScene,\n viewerChrome,\n viewerLevelIdAfterShapeSelect,\n viewerResetPatch,\n websiteClickOpensModal,\n websiteDestination,\n websiteMapItAnchors,\n websiteRetailersOnMap,\n type ViewerResetKind,\n} from '../core';\nimport { MapScene } from './components/MapScene';\nimport { isAssignAmenity } from '../specialIcons';\nimport type { CameraViewSnapshot, MapCameraHandle } from './components/CameraRig';\nimport { RuntimeChrome } from './ui/RuntimeChrome';\nimport { MapControls } from './ui/MapControls';\nimport { WebsiteInfoModal } from './ui/WebsiteInfoModal';\nimport { HoverTooltip } from './ui/HoverTooltip';\nimport { fetchWebsiteRetailers } from './fetchWebsiteRetailers';\nimport {\n selectionFocusKey,\n viewFocusBoundsForShape,\n viewFocusBoundsForShapes,\n viewFocusBoundsForRoute,\n} from './camera';\nimport {\n routeOriginLevelId,\n shouldPinViewToRouteOrigin,\n} from './routeFloorChanges';\nimport { ensureMapFont } from '../fonts/mapFontUrl';\nimport './viewer.css';\n\nexport interface MapViewerProps {\n /** Published (or draft) document. If omitted, fetched from webApiURI. */\n document?: PublishedDocument | null;\n webApiURI?: string;\n /** Prefer fetching /v1/map/document */\n centerId?: number;\n /** Public / preview / kiosk surface. Never includes Map options (editor rail). */\n host?: MapViewerHost;\n kioskId?: number | null;\n selectedRetailerId?: number | null;\n /**\n * Media proxy base for remote http(s) media (v1 `IMAGE_PROXY_URL` contract,\n * e.g. `/eyeon-portal/media?url=`). Needed wherever the outdoor SVG or\n * retailer logos are cross-origin. Inlined amenity / kiosk data URLs skip it.\n */\n imageProxyUrl?: string | null;\n themeOverrides?: Partial<ThemeDefaults>;\n onExtractedAmenities?: (codes: string[]) => void;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n /** Zoom to this shape (PORTAL default-map assign). */\n selectedShapeId?: number | null;\n /** Extra selected shapes when Shift-selecting in PORTAL assign. */\n selectedShapeIds?: number[];\n /** Highlight from the Map options list (same fill as pointer hover). */\n hoveredShapeId?: number | null;\n /**\n * Bump when staff pick a row in the rail so the camera re-frames even if\n * the same shape is already selected.\n */\n focusNonce?: number;\n /** Controlled floor when embedded (e.g. PORTAL default). */\n activeLevelId?: number | null;\n onActiveLevelChange?: (levelId: number) => void;\n /** Click a store/amenity to route. Off when PORTAL is assigning. Default true. */\n routeOnSelect?: boolean;\n createRouteRef?: React.MutableRefObject<{\n createRouteToStore: (retailerId: number) => void;\n createRouteToAmenity: (amenityCode: string) => void;\n clearRoute: () => void;\n /** Kiosk idle reset: clear routing, restore its floor, and reset the camera. */\n resetMap: () => void;\n } | null>;\n className?: string;\n style?: React.CSSProperties;\n /** Force a responsiveness slot (staff editor). Otherwise derived from host + width. */\n device?: DeviceType;\n /** Staff capture: wheel zoom on, no store modal, camera-change events. */\n captureCamera?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n}\n\nasync function fetchDocument(\n webApiURI: string,\n centerId?: number,\n draft?: boolean,\n signal?: AbortSignal,\n): Promise<PublishedDocument> {\n const base = webApiURI.replace(/\\/$/, '');\n const params = new URLSearchParams();\n if (centerId != null && centerId > 0) params.set('center_id', String(centerId));\n if (draft) params.set('draft', '1');\n const qs = params.toString();\n const res = await fetch(`${base}/v1/map/document${qs ? `?${qs}` : ''}`, {\n credentials: 'include',\n signal,\n });\n if (!res.ok) {\n throw new Error(`Failed to load map document (${res.status})`);\n }\n return res.json();\n}\n\nexport function MapViewer(props: MapViewerProps) {\n ensureMapFont();\n const {\n document: documentProp,\n webApiURI,\n centerId,\n host = 'WEBSITE',\n kioskId = null,\n selectedRetailerId = null,\n themeOverrides,\n onExtractedAmenities,\n createRouteRef,\n className,\n style,\n activeLevelId: activeLevelIdProp,\n onActiveLevelChange,\n routeOnSelect = true,\n imageProxyUrl,\n selectedShapeId = null,\n selectedShapeIds,\n hoveredShapeId = null,\n focusNonce,\n device: deviceProp,\n captureCamera = false,\n onCameraChange,\n onCameraReset,\n } = props;\n\n const [rawDoc, setDoc] = useState<PublishedDocument | null>(documentProp ?? null);\n const doc = useMemo(\n () => (rawDoc ? normalizePublishedDocument(rawDoc) : null),\n [rawDoc],\n );\n const [error, setError] = useState<string | null>(null);\n const [route, setRoute] = useState<PathResult | null>(null);\n const [fromAnchorId, setFromAnchorId] = useState<number | null>(null);\n const [toAnchorId, setToAnchorId] = useState<number | null>(null);\n const [accessibleOnly, setAccessibleOnly] = useState(false);\n const [websiteShapeId, setWebsiteShapeId] = useState<number | null>(null);\n const [websiteModalOpen, setWebsiteModalOpen] = useState(false);\n const [hoverTooltip, setHoverTooltip] = useState<ViewerHoverTooltip | null>(\n null,\n );\n const [fetchedRetailers, setFetchedRetailers] = useState<\n PublishedRetailer[] | null\n >(null);\n const [internalLevelId, setInternalLevelId] = useState<number | null>(() => {\n if (!documentProp) return null;\n return defaultViewerLevelId(normalizePublishedDocument(documentProp).levels);\n });\n const cameraApi = useRef<MapCameraHandle | null>(null);\n const canvasHostRef = useRef<HTMLDivElement>(null);\n const routeEndpointsRef = useRef<{ from: number | null; to: number | null }>({\n from: null,\n to: null,\n });\n const [viewportWidth, setViewportWidth] = useState(1280);\n const activeLevelId = activeLevelIdProp ?? internalLevelId;\n const setActiveLevelId = (id: number | null) => {\n setInternalLevelId(id);\n if (id != null) onActiveLevelChange?.(id);\n };\n\n useEffect(() => {\n if (documentProp) {\n setDoc(documentProp);\n return;\n }\n if (!webApiURI) return;\n let cancelled = false;\n const controller = new AbortController();\n const draft = viewerChrome(host).fetchDraft;\n fetchDocument(webApiURI, centerId, draft, controller.signal)\n .then((d) => {\n if (!cancelled) setDoc(d);\n })\n .catch((e) => {\n if (\n !cancelled &&\n !(e instanceof DOMException && e.name === 'AbortError')\n ) {\n setError(e instanceof Error ? e.message : String(e));\n }\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [documentProp, webApiURI, centerId, host]);\n\n useEffect(() => {\n const el = canvasHostRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width;\n if (width && width > 0) setViewportWidth(width);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [doc, host]);\n\n useEffect(() => {\n const chrome = viewerChrome(host);\n if ((!chrome.storeModal && !chrome.hoverTooltip) || !webApiURI) return;\n let cancelled = false;\n const controller = new AbortController();\n fetchWebsiteRetailers(webApiURI, centerId, controller.signal)\n .then((items) => {\n if (!cancelled) setFetchedRetailers(items);\n })\n .catch(() => {\n if (!cancelled) setFetchedRetailers([]);\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [webApiURI, centerId, host]);\n\n useEffect(() => {\n if (!doc) return;\n const ids = new Set(doc.levels.map((level) => level.id));\n if (activeLevelId == null || !ids.has(activeLevelId)) {\n setActiveLevelId(defaultViewerLevelId(doc.levels));\n }\n const codes = new Set<string>();\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.kind === 'amenity' && shape.assignment?.amenityId != null) {\n const amenity = doc.amenities.find((a) => a.id === shape.assignment!.amenityId);\n if (amenity) codes.add(amenity.code);\n }\n }\n }\n onExtractedAmenities?.(Array.from(codes));\n }, [doc, activeLevelId, onExtractedAmenities]);\n\n // Map IT / ?r= — switch to the store's floor so the highlight is visible\n useEffect(() => {\n if (!doc || selectedRetailerId == null) return;\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.assignment?.retailerId === selectedRetailerId) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(doc.levels, activeLevelId, level.id),\n );\n return;\n }\n }\n }\n }, [doc, selectedRetailerId]);\n\n const focusShapeIds = useMemo(() => {\n if (websiteShapeId != null) return [websiteShapeId];\n if (selectedShapeIds && selectedShapeIds.length > 0) return selectedShapeIds;\n return selectedShapeId != null ? [selectedShapeId] : [];\n }, [selectedShapeId, selectedShapeIds, websiteShapeId]);\n const selectionKey = selectionFocusKey(focusShapeIds);\n const selectionFocusKeyWithNonce =\n selectionKey == null\n ? null\n : focusNonce != null\n ? `${selectionKey}#${focusNonce}`\n : selectionKey;\n const selectionFocusBounds = useMemo(() => {\n if (!doc || focusShapeIds.length === 0) return null;\n // Union every selected shape so Shift-select frames the group, not the first id.\n return viewFocusBoundsForShapes(doc.levels, focusShapeIds);\n }, [doc, focusShapeIds]);\n const kioskOrigin = useMemo(\n () => (doc ? findViewerKioskOrigin(doc, host, kioskId) : null),\n [doc, host, kioskId],\n );\n const routeFocusBounds = useMemo(() => {\n if (!doc || !route) return null;\n return viewFocusBoundsForRoute(doc.levels, route, activeLevelId);\n }, [activeLevelId, doc, route]);\n const routeFocusKey = route\n ? `route:${activeLevelId ?? 'none'}:${route.anchorIds.join(',')}`\n : null;\n const focusKey = captureCamera\n ? null\n : routeFocusKey ?? selectionFocusKeyWithNonce;\n const focusViewBounds = captureCamera ? null : routeFocusBounds ?? selectionFocusBounds;\n const resolvedDevice = deviceProp ?? deviceFromHost(host, viewportWidth);\n const homeOverride = doc\n ? findResponsiveOverride(doc.responsiveOverrides, activeLevelId, resolvedDevice)\n : null;\n const homePose = homeOverride ? overrideToCameraPose(homeOverride) : null;\n const homePoseKey = responsiveViewKey(\n activeLevelId,\n resolvedDevice,\n captureCamera,\n );\n\n // DISPLAY_APP starts on the physical kiosk floor and routes from that kiosk.\n useEffect(() => {\n if (!viewerChrome(host).kioskOrigin || !kioskOrigin) return;\n setFromAnchorId(kioskOrigin.anchorId);\n setActiveLevelId(kioskOrigin.levelId);\n // setActiveLevelId intentionally omitted: it is recreated each render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [host, kioskOrigin]);\n\n const compiled = useMemo(() => {\n if (!doc) return null;\n return compileGraph(\n doc.graph.nodes.map((n) => ({\n id: n.id,\n levelId: n.levelId,\n shapeId: n.shapeId,\n kind: n.kind,\n x: n.x,\n y: n.y,\n connectorId: n.connectorId,\n })),\n doc.graph.edges.map((e) => ({\n id: e.id,\n mapId: doc.mapId,\n fromAnchorId: e.from,\n toAnchorId: e.to,\n weight: e.weight,\n directed: e.directed,\n accessible: e.accessible,\n kind: e.kind,\n })),\n doc.connectors,\n );\n }, [doc]);\n\n const websiteRetailers = useMemo(() => {\n if (!doc) return [];\n return websiteRetailersOnMap(\n doc,\n fetchedRetailers && fetchedRetailers.length > 0\n ? fetchedRetailers\n : doc.retailers,\n );\n }, [doc, fetchedRetailers]);\n\n const hoverRetailers = useMemo(() => {\n if (fetchedRetailers && fetchedRetailers.length > 0) return fetchedRetailers;\n return doc?.retailers ?? [];\n }, [doc?.retailers, fetchedRetailers]);\n\n const handleHoverTooltip = useCallback(\n (\n next: ViewerHoverTooltip | null,\n opts?: { leavingShapeId?: number },\n ) => {\n setHoverTooltip((current) => {\n if (next) return next;\n if (opts?.leavingShapeId != null) {\n return current?.shapeId === opts.leavingShapeId ? null : current;\n }\n return null;\n });\n },\n [],\n );\n\n useEffect(() => {\n setHoverTooltip(null);\n }, [host, activeLevelId, websiteModalOpen]);\n\n const websiteDestinationInfo = useMemo(() => {\n if (!doc || websiteShapeId == null) return null;\n return websiteDestination(doc, websiteShapeId);\n }, [doc, websiteShapeId]);\n\n const runRoute = (fromId: number | null, toId: number | null) => {\n const pinOrigin = shouldPinViewToRouteOrigin(\n routeEndpointsRef.current.from,\n routeEndpointsRef.current.to,\n fromId,\n toId,\n );\n routeEndpointsRef.current = { from: fromId, to: toId };\n if (!compiled || fromId == null || toId == null) {\n setRoute(null);\n return;\n }\n const result = findShortestPlacePath(compiled, [fromId], [toId], {\n accessibleOnly,\n });\n setRoute(result);\n // Stay on the start floor. Taps on escalator / elevator icons change floors.\n if (pinOrigin) {\n const originLevelId = routeOriginLevelId(result);\n if (originLevelId != null) setActiveLevelId(originLevelId);\n }\n };\n\n useEffect(() => {\n runRoute(fromAnchorId, toAnchorId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromAnchorId, toAnchorId, accessibleOnly, compiled]);\n\n /** Chrome Reset: loaded default, current floor. Idle: also restore kiosk floor. */\n const applyViewerReset = useCallback(\n (kind: ViewerResetKind) => {\n const patch = viewerResetPatch({\n kind,\n kioskOrigin,\n activeLevelId,\n defaultLevelId: doc ? defaultViewerLevelId(doc.levels) : null,\n });\n setToAnchorId(null);\n setRoute(null);\n setWebsiteModalOpen(false);\n setWebsiteShapeId(null);\n setFromAnchorId(patch.fromAnchorId);\n if (patch.nextLevelId != null) {\n setActiveLevelId(patch.nextLevelId);\n }\n if (patch.resetCamera) {\n cameraApi.current?.reset();\n }\n },\n [activeLevelId, doc, kioskOrigin],\n );\n\n useEffect(() => {\n if (!createRouteRef || !doc) return;\n const routeApi = {\n createRouteToStore(retailerId: number) {\n const toIds = matchingShapeAnchorIds(\n doc.levels,\n (shape) => shape.assignment?.retailerId === retailerId,\n );\n if (toIds.length === 0) return;\n if (compiled && fromAnchorId != null) {\n const nearest = findShortestPlacePath(\n compiled,\n [fromAnchorId],\n toIds,\n { accessibleOnly },\n );\n const destinationAnchorId = nearest?.anchorIds.at(-1);\n if (destinationAnchorId != null) {\n setToAnchorId(destinationAnchorId);\n return;\n }\n }\n setToAnchorId(toIds[0]);\n },\n createRouteToAmenity(amenityCode: string) {\n const amenity = doc.amenities.find((a) => a.code === amenityCode);\n if (!amenity || !compiled || fromAnchorId == null) return;\n const anchorIds = matchingShapeAnchorIds(\n doc.levels,\n (shape) => shape.assignment?.amenityId === amenity.id,\n );\n const nearest = findNearestAmenityPath(compiled, fromAnchorId, anchorIds, {\n accessibleOnly,\n });\n const destinationAnchorId = nearest?.anchorIds.at(-1);\n if (destinationAnchorId != null) setToAnchorId(destinationAnchorId);\n },\n clearRoute() {\n setToAnchorId(null);\n setRoute(null);\n },\n resetMap() {\n applyViewerReset('idle');\n },\n };\n createRouteRef.current = routeApi;\n return () => {\n if (createRouteRef.current === routeApi) createRouteRef.current = null;\n };\n }, [\n accessibleOnly,\n activeLevelId,\n applyViewerReset,\n compiled,\n createRouteRef,\n doc,\n fromAnchorId,\n ]);\n\n const theme: ThemeDefaults = mergeTheme(doc?.theme, themeOverrides);\n\n if (error) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--error ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__error\">{error}</div>\n </div>\n );\n }\n\n if (!doc) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--loading ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__loading\">Loading map…</div>\n </div>\n );\n }\n\n const amenitiesOnMap: CmAmenityCatalogItem[] = doc.amenities.filter(\n (a) =>\n isAssignAmenity(a.code) &&\n doc.levels.some((l) =>\n l.shapes.some((s) => s.assignment?.amenityId === a.id),\n ),\n );\n const chrome = captureCamera\n ? { ...viewerChrome(host), storeModal: false, hoverTooltip: false }\n : viewerChrome(host);\n // Portal staff (assign + responsiveness capture) can view Outdoor alone.\n // Website and display-app still require a building floor.\n const showMap = viewerCanShowScene(\n captureCamera ? 'PORTAL_ASSIGN' : host,\n doc.levels,\n );\n\n return (\n <div\n className={`eyeon-map-viewer eyeon-map-viewer--${host}${showMap ? '' : ' eyeon-map-viewer--empty'} ${className ?? ''}`}\n style={\n {\n ...style,\n ['--map-bg' as string]: theme.MAP_BACKGROUND_COLOR,\n } as React.CSSProperties\n }\n >\n {!showMap ? (\n <div className=\"eyeon-map-viewer__empty\">{MAP_NO_FLOORS_MESSAGE}</div>\n ) : null}\n\n {showMap && (chrome.search || chrome.amenities) && (\n <RuntimeChrome\n doc={doc}\n amenities={amenitiesOnMap}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n fromAnchorId={fromAnchorId}\n toAnchorId={toAnchorId}\n onFromChange={setFromAnchorId}\n onToChange={setToAnchorId}\n accessibleOnly={accessibleOnly}\n onAccessibleOnlyChange={setAccessibleOnly}\n route={route}\n showSearch={chrome.search}\n showAmenities={chrome.amenities}\n amenityIconColor={theme.AMENITY_ICON_COLOR}\n />\n )}\n\n {showMap ? (\n <MapControls\n levels={doc.levels}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n onZoomIn={() => cameraApi.current?.zoomIn()}\n onZoomOut={() => cameraApi.current?.zoomOut()}\n onReset={() => applyViewerReset('chrome')}\n showFloors={chrome.floors}\n showZoomReset={chrome.zoomReset}\n />\n ) : null}\n\n {showMap ? (\n <div ref={canvasHostRef} className=\"eyeon-map-viewer__canvas\">\n <Suspense fallback={null}>\n <MapScene\n doc={doc}\n theme={theme}\n host={host}\n kioskOriginShapeId={kioskOrigin?.shapeId ?? null}\n activeLevelId={activeLevelId}\n route={route}\n selectedShapeId={captureCamera ? null : websiteShapeId ?? selectedShapeId}\n selectedShapeIds={captureCamera ? [] : focusShapeIds}\n hoveredShapeId={captureCamera ? null : hoveredShapeId}\n focusKey={focusKey}\n focusViewBounds={focusViewBounds}\n cameraRef={cameraApi}\n eventSource={canvasHostRef}\n imageProxyUrl={imageProxyUrl}\n homePose={homePose}\n homePoseKey={homePoseKey}\n resetFitsMap={captureCamera}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n allowWheelZoom={captureCamera || viewerAllowsWheelZoom(host)}\n retailers={hoverRetailers}\n showHoverTooltip={chrome.hoverTooltip}\n onHoverTooltip={handleHoverTooltip}\n onActiveLevelChange={setActiveLevelId}\n onSelectShape={(shapeId, levelId, opts) => {\n if (shapeId == null) {\n if (chrome.storeModal) {\n setWebsiteModalOpen(false);\n setWebsiteShapeId(null);\n }\n props.onSelectShape?.(null);\n return;\n }\n const level = doc.levels.find((l) => l.id === levelId);\n const shape = level?.shapes.find((s) => s.id === shapeId);\n if (chrome.storeModal && websiteClickOpensModal(host, shape)) {\n setWebsiteShapeId(shapeId);\n setWebsiteModalOpen(true);\n if (!opts?.additive) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(\n doc.levels,\n activeLevelId,\n levelId,\n ),\n );\n }\n props.onSelectShape?.(shapeId, opts);\n return;\n }\n if (chrome.storeModal) {\n props.onSelectShape?.(shapeId, opts);\n return;\n }\n if (routeOnSelect) {\n const destIds = shapeAnchorIds(level?.anchors ?? [], shapeId);\n let destId = destIds[0];\n if (compiled && fromAnchorId != null && destIds.length > 1) {\n destId =\n findShortestPlacePath(compiled, [fromAnchorId], destIds, {\n accessibleOnly,\n })?.anchorIds.at(-1) ?? destId;\n }\n if (destId != null) setToAnchorId(destId);\n } else if (!opts?.additive) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(doc.levels, activeLevelId, levelId),\n );\n }\n props.onSelectShape?.(shapeId, opts);\n if (!opts?.additive && shapeId === selectedShapeId) {\n const focus =\n viewFocusBoundsForShapes(doc.levels, focusShapeIds) ??\n viewFocusBoundsForShape(doc.levels, shapeId);\n if (focus) cameraApi.current?.focusBounds(focus);\n }\n }}\n />\n </Suspense>\n </div>\n ) : null}\n\n {chrome.hoverTooltip && !websiteModalOpen ? (\n <HoverTooltip tooltip={hoverTooltip} />\n ) : null}\n\n {chrome.storeModal && websiteModalOpen && websiteDestinationInfo ? (\n <WebsiteInfoModal\n destination={websiteDestinationInfo}\n retailers={websiteRetailers}\n imageProxyUrl={imageProxyUrl}\n host={host}\n onClose={() => setWebsiteModalOpen(false)}\n onMapIt={(fromRetailerId) => {\n const from = websiteRetailers.find((r) => r.id === fromRetailerId);\n const anchors = websiteMapItAnchors(from, websiteDestinationInfo);\n if (anchors) {\n setFromAnchorId(anchors.fromAnchorId);\n setToAnchorId(anchors.toAnchorId);\n setWebsiteModalOpen(false);\n }\n }}\n />\n ) : null}\n </div>\n );\n}\n\nexport default MapViewer;\n"],"names":["MapControls","levels","activeLevelId","onActiveLevelChange","onZoomIn","onZoomOut","onReset","showFloors","showZoomReset","floorOptions","alwaysShowFloors","stackLevels","level","switcher","floorSwitcherDisplayLevels","showFloorList","shouldShowFloorSwitcher","showZoom","hasBuildingFloors","hasOutdoorLevel","jsxs","jsx","active","Fragment","MAP_FONT_FAMILY","MAP_LABEL_LINE_HEIGHT","SVGIcons","AllAmenities","CONNECTOR_AMENITY_TYPES","AssignAmenities","item","KioskSvg","EntranceSvg","EscalatorUpSvg","EscalatorDownSvg","isAssignAmenity","type","getAmenityByType","getMapSpecialSvg","id","_a","recolorMapSvg","svg","color","hex","mapSpecialSvgToDataUrl","colored","entranceIconDataUrl","amenityAssignOptions","amenityTypeFromCatalogId","amenityId","amenities","amenityCatalogIdForType","row","assignmentSpecialIconDataUrl","assignment","assignmentSpecialIconId","ASSIGNED_CONNECTOR_ICON","STATIC_ICON_COLORS","UNASSIGNED_CONNECTOR_ICON","levelTravel","from","to","fromIndex","toIndex","fromOrder","toOrder","escalatorLandingTravel","shapeId","levelId","here","connectorId","_b","anchor","partner","escalatorConnectorIconId","travel","connectorSpecialKind","shape","raw","connectorSpecialIconDataUrl","kind","assigned","fill","connectorMapIconDataUrl","iconId","assignedConnectorShapeIds","anchors","ids","connectorMapIconKind","assignedShapeIds","mapFontUrl","MAP_FONT_URL","registered","ensureMapFont","loaded","MODERN_SELECT_SEARCH_AFTER","filterModernSelectOptions","options","query","q","o","modernSelectIsSearchable","optionCount","searchable","Chevron","ModernSelect","value","onChange","disabled","placeholder","ariaLabel","listId","useId","rootRef","useRef","triggerRef","buttonRef","menuRef","searchRef","open","setOpen","useState","setQuery","activeIndex","setActiveIndex","menuPos","setMenuPos","withSearch","selected","filtered","useMemo","close","useCallback","pick","next","updateMenuPos","el","rect","spaceBelow","spaceAbove","maxHeight","openAbove","useEffect","onDoc","e","t","onKey","onMove","moveActive","delta","i","onSearchKeyDown","option","menu","createPortal","index","highlighted","target","v","polygonToThreeShape","points","THREE","polygonToThreePath","path","slabShapeWithHoles","outer","holes","hole","holesOverlappingOuter","skipRaycast","createOpeningMarkTexture","aspect","width","canvas","ctx","pad","OPENING_VOID_MARK","texture","OpeningVoidMesh","polygon","box","polygonBBox","dash","openingSpanDash","outline","first","p","geometry","material","OPENING_VOID_STROKE","line","mark","height","OPENING_VOID_FILL","bbox","span","OpeningWells","polygons","VIEWER_SELECTABLE_KINDS","isViewerSelectableKind","isViewerInteractiveShape","host","viewerShapeHoverableOnHost","viewerShapeHighlighted","hoveredShapeId","selectedShapeIds","resolvedViewerHoverId","listHoverId","pointerHoverId","viewerHoverCursor","applyViewerHoverCursor","cursor","viewerHoverFillOpacity","base","hovered","viewerPointerOffset","event","native","x","y","VIEWER_CLICK_DRAG_PX","createViewerPointerGesture","viewerPointerClientXY","beginViewerPointerGesture","gesture","pointerId","moveViewerPointerGesture","dist","endViewerPointerGesture","viewerPointerClickIsTap","maxDist","r3fDelta","pointerMissClearsSelection","down","up","dx","dy","kindColor","theme","resolvedViewerShapeFill","polygonShape","HoverOutline","extrude","sourceGeometry","CurrentLocationPulse","position","Html","LevelMeshes","is3d","onSelectShape","hoveredShapeIdProp","eventSource","pointerGestureRef","interactiveOnly","imageProxyUrl","retailers","kioskOriginShapeId","showHoverTooltip","onHoverTooltip","setPointerHoverId","publishHoverTooltip","offset","text","viewerHoverTooltipLabel","openings","voidPolygonsOnLevel","assignedConnectorIds","visibleShapes","s","viewerShapeVisibleOnHost","meshes","isEntranceIcon","INTERACTIVE_SHAPE_KINDS","resolveLayerStyle","radius","punch","isSlabShapeKind","threeShapes","poly","filletPolygon","labels","entranceIcons","overlays","assignmentOverlayVisible","connectorOverlays","layout","connectorIconLayout","iconColor","resolvedAssignmentIconColor","url","geometryBBox","align","normalizeLabelAlign","cx","cy","tilt","Text","labelAlignX","size","DEFAULT_ENTRANCE_SIZE","AssignmentImageOverlay","fontSize","DEFAULT_ASSIGNMENT_SIZE","z","imageKey","assignmentOverlayImageUrl","React","assignmentOverlayRenderSize","rotation","selectable","baseOpacity","viewerShapeBaseOpacity","fillTransparent","isTransparentColor","opacity","emphasisFill","darkenShapeFill","geoShape","idx","loadCanvasTexture","signal","resolve","reject","img","cleanup","onAbort","setTexture","setAspect","disposed","controller","proxied","resolveFetchUrl","candidates","lastError","src","error","ROUTE_CHANGE_MARKER_GAP","ROUTE_CHANGE_MARKER_CLUSTER","routeOriginLevelId","route","shouldPinViewToRouteOrigin","previousFrom","previousTo","nextFrom","nextTo","routeChangeLabel","intent","floorName","routeSegmentsForLevel","segments","current","point","markerDistance","a","b","layoutRouteLevelChangeMarkers","markers","placed","marker","used","group","j","ordered","rank","routeLevelChangeMarkers","changeIndex","change","V1_ROUTE_COLOR","V1_ROUTE_TUBULAR_SEGMENTS","V1_ROUTE_RADIAL_SEGMENTS","V1_ROUTE_REVEAL_MS","V1_ROUTE_TEXTURE_MS","resolveRouteColor","ROUTE_CHANGE_RING_COLOR","resolveRouteChangeCircleColor","resolveRouteThickness","thickness","DEFAULT_THEME","_routeScale","_routeWorldPoint","routeWorldRadiusForView","screenRadius","world","zoom","worldHeight","scale","routeWorldRadiusForCamera","camera","viewportHeight","worldScale","samplePoint","distance","applyRouteTubeRadius","basePositions","baseRadius","targetRadius","normal","i3","createRouteTexture","context","gradientWidth","gradient","easeInOutCubic","RouteTube","invalidate","useThree","state","meshRef","animationStartedAt","appliedRadius","routeShape","syncScreenRadius","mesh","useLayoutEffect","useFrame","elapsed","indexCount","progress","RouteChangeButton","connectors","connector","iconKind","isVerticalRouteConnectorKind","there","icon","targetName","label","ringColor","RouteLine","routeColor","routeRadius","segment","levelChanges","COLOR_SPACE_SVG","SRGBColorSpace","SVGLoader","Loader","manager","onLoad","onProgress","onError","scope","loader","FileLoader","parseNode","node","style","transform","getNodeTransform","isDefsNode","parseStyle","parseCSSStylesheet","parsePathNode","parseRectNode","parsePolygonNode","parsePolylineNode","parseCircleNode","parseEllipseNode","parseLineNode","usedNodeId","usedNode","transformPath","currentTransform","paths","childNodes","transformStack","ShapePath","Vector2","control","firstPoint","isFirstPoint","doSetFirstPoint","d","commands","l","command","data","numbers","parseFloats","jl","getReflection","rx","ry","start","parseArcCommand","stylesheet","selectorList","definitions","stylesheets","x_axis_rotation","large_arc_flag","sweep_flag","end","dx2","dy2","x1p","y1p","rxs","rys","x1ps","y1ps","cr","dq","pq","cxp","cyp","theta","svgAngle","ux","uy","vx","vy","dot","len","ang","parseFloatWithUnits","w","h","bci","iterator","match","regex","subpath","Path","x1","y1","x2","y2","stylesheetStyles","classSelectors","addStyle","svgName","jsName","adjustFunction","clamp","positive","input","flags","stride","RE","SEP","INT","FLOAT","EXP","seenComma","number","exponent","result","throwSyntaxError","partial","newNumber","length","units","unitConversion","string","theUnit","n","u","parseNodeTransform","Matrix3","tempTransform0","tx","ty","transformsTexts","tIndex","transformText","openParPos","closeParPos","transformType","array","angle","tempTransform1","tempTransform2","tempTransform3","scaleX","scaleY","m","transfVec2","v2","tempV3","transfEllipseGeneric","curve","cosTheta","sinTheta","v1","Vector3","f1","f2","mF","mFInv","mQe","ed","eigenDecomposition","rt1sqrt","rt2sqrt","mDsqrt","mRT","mDRF","transformAngle","phi","cosR","sinR","isTransformFlipped","transfEllipseNoSkew","sx","getTransformScaleX","sy","getTransformScaleY","subPaths","curves","tempV2","isTransformSkewed","te","basisDot","A","B","C","rt1","rt2","cs","sn","sm","df","rt","xml","shapePath","IntersectionLocationType","classifyResult","findEdgeIntersection","a0","a1","b0","b1","x3","x4","y3","y4","nom1","nom2","denom","t1","t2","classifyPoint","edgeStart","edgeEnd","ax","ay","bx","by","sa","getIntersections","path1","path2","intersectionsRaw","intersections","path1EdgeStart","path1EdgeEnd","index2","path2EdgeStart","path2EdgeEnd","intersection","getScanlineIntersections","scanline","boundingBox","center","allIntersections","i1","i2","isHoleTo","simplePath","allPaths","scanlineMinX","scanlineMaxX","_fillRule","centerBoundingBox","scanlineIntersections","baseIntersections","otherIntersections","firstXOfPath","stack","isHole","isHoleFor","lastCWValue","identifier","simplePaths","maxY","minY","maxX","minX","ShapeUtils","Box2","sp","isAHole","shapesToReturn","Shape","lineJoin","lineCap","miterLimit","arcDivisions","minDistance","vertices","normals","uvs","BufferGeometry","Float32BufferAttribute","vertexOffset","tempV2_1","tempV2_2","tempV2_3","tempV2_4","tempV2_5","tempV2_6","tempV2_7","lastPointL","lastPointR","point0L","point0R","currentPointL","currentPointR","nextPointL","nextPointR","innerPoint","outerPoint","removeDuplicatedPoints","numPoints","isClosed","currentPoint","previousPoint","nextPoint","strokeWidth2","deltaU","u0","u1","innerSideModified","joinIsOnLeftSide","isMiter","initialJoinIsOnLeftSide","numVertices","currentCoordinate","currentCoordinateUV","getNormal","iPoint","normal1","miterSide","miterLength2","segmentLengthPrev","segmentLengthNext","makeSegmentTriangles","makeSegmentWithBevelJoin","createSegmentTrianglesWithMiddleSection","makeCircularSector","miterFraction","addVertex","addCapGeometry","lastOuter","lastInner","p1","p2","il","vl","dupPoints","newPoints","BASE_Z","getLayerNameFromNode","isInteractiveAncestor","dataName","isInteractiveGroupLabel","isStoreFolderLabel","isRouteAncestor","isRouteFolderLabel","SvgVectorLayer","suppressIds","setResult","cancelled","fetchUrl","res","inlined","inlineSvgStyles","err","out","layerName","isRoutePathLabel","shapes","layerStyle","amenityFill","isAmenityLayerId","amenityHouseFill","strokeTransparent","_c","outdoorSvgPaintOrder","sortByOutdoorSvgPaintOrder","si","SCENE_FLIP_SCALE","viewBoundsFromData","bounds","fitOrthoZoom","viewWidth","viewHeight","worldWidth","zoomX","zoomY","boundsExtent","VIEWER_ZOOM_ANIM_MS","VIEWER_FOCUS_ANIM_MS","FOCUS_BOUNDS_PADDING","FOCUS_LARGE_PADDING","FOCUS_LARGE_EXTENT","FOCUS_PAD_SMALL_EXTENT","FOCUS_MIN_EXTENT","FOCUS_MAX_ZOOM_MULTIPLE","FOCUS_SMALL_MAX_ZOOM_MULTIPLE","VIEWER_MAX_ZOOM_MULTIPLE","focusPaddingRatio","paddingRatio","smallExtent","largePadding","largeExtent","extent","paddedFocusBounds","minExtent","rawW","rawH","halfW","halfH","focusMaxZoomMultiple","paddedWidth","paddedHeight","typicalMultiple","smallMultiple","typicalFrame","tinyFrame","clampFocusZoom","shapeFitZoom","mapFitZoom","maxMultiple","cap","selectionFocusKey","shapeIds","viewFocusBoundsForShapes","wanted","combined","sceneBoundsFromBBox","expandBounds","viewFocusBoundsForShape","viewFocusBoundsForRoute","routePoints","applyLevelTransform","endpointIds","routeAnchorIds","focusShapeIds","shapeBounds","easeOutCubic","lerp","interpolateCameraPose","ease","cameraPosesNear","epsilon","withFitZoom","pose","fitZoom","resolveResetPose","fitToMap","home","fit","skipPersistedViewRestore","nextOrthoZoom","direction","step","min","max","factor","MOUSE_ROTATE","MOUSE_DOLLY","MOUSE_PAN","TOUCH_ROTATE","TOUCH_PAN","TOUCH_DOLLY_PAN","ORBIT_ZOOM_TO_CURSOR","orbitMouseButtons","orbitTouches","cameraBoundsKey","CameraRig","controlsRef","cameraRef","persistedViewRef","focusKey","focusViewBounds","homePose","homePoseKey","resetFitsMap","onCameraChange","onCameraReset","userAdjusted","applyingView","zoomAnimRef","appliedFocusKey","focusKeyRef","focusViewBoundsRef","homePoseRef","homePoseKeyRef","resetFitsMapRef","onCameraChangeRef","onCameraResetRef","appliedHomeKey","ignoreUserChangeUntil","resetInFlight","focusAnimRef","boundsKey","cancelZoomAnim","captureView","adjusted","controls","restoreView","snap","animateOrthoZoom","targetZoom","startZoom","started","now","currentPose","fitPose","applyPose","lookAt","poseForFocusBounds","focus","mapExtent","mapFit","sizeHint","resolvedHomePose","saved","resetDestination","applyHomeOrFit","dest","applyFit","animateFocus","animateReset","applyFitRef","restoreViewRef","animateFocusRef","zoomBy","onStart","useImperativeHandle","isNewFocus","snapMatchesFocus","anim","isEventRoot","orbitEventRoot","connected","viewerWheelEventHitsMap","root","contains","suppressViewerWheelZoom","OUTDOOR_Z","CAMERA_UP","CANVAS_DPR","CANVAS_GL","OrbitWheelZoomGuard","blockWheel","gl","onWheel","MapScene","doc","selectedShapeId","allowWheelZoom","pointerDownRef","onDown","pos","onUp","stacked","viewerLevelStack","boundsFromStackedLevels","view","cameraPosition","camera3dPosition","mouseButtons","touches","outdoorLevel","isOutdoorLevel","outdoorSvgUrl","outdoorSvgSuppressIds","showOutdoorSvg","outdoorTheme","Canvas","OrthographicCamera","outdoor","opts","viewerAllowsWheelZoom","OrbitControls","itemLabel","amenityName","RuntimeChrome","fromAnchorId","toAnchorId","onFromChange","onToChange","accessibleOnly","onAccessibleOnlyChange","showSearch","showAmenities","amenityIconColor","selectedItem","setSelectedItem","items","list","amenity","grouped","map","arr","anchorOptions","hasQuery","selectItem","groupItems","WebsiteInfoModal","destination","onClose","onMapIt","fromRetailerId","setFromRetailerId","retailer","websiteFromRetailerOptions","logo","showDetails","directions","websiteInfoModalDirections","mapItDisabled","showForm","formatRetailerPhone","HoverTooltip","tooltip","fetchWebsiteRetailers","webApiURI","centerId","all","page","params","json","count","normalizeRetailerCatalogItem","fetchDocument","draft","qs","MapViewer","props","documentProp","kioskId","selectedRetailerId","themeOverrides","onExtractedAmenities","createRouteRef","className","activeLevelIdProp","routeOnSelect","focusNonce","deviceProp","captureCamera","rawDoc","setDoc","normalizePublishedDocument","setError","setRoute","setFromAnchorId","setToAnchorId","setAccessibleOnly","websiteShapeId","setWebsiteShapeId","websiteModalOpen","setWebsiteModalOpen","hoverTooltip","setHoverTooltip","fetchedRetailers","setFetchedRetailers","internalLevelId","setInternalLevelId","defaultViewerLevelId","cameraApi","canvasHostRef","routeEndpointsRef","viewportWidth","setViewportWidth","setActiveLevelId","viewerChrome","ro","entries","chrome","codes","viewerLevelIdAfterShapeSelect","selectionKey","selectionFocusKeyWithNonce","selectionFocusBounds","kioskOrigin","findViewerKioskOrigin","routeFocusBounds","routeFocusKey","resolvedDevice","deviceFromHost","homeOverride","findResponsiveOverride","overrideToCameraPose","responsiveViewKey","compiled","compileGraph","websiteRetailers","websiteRetailersOnMap","hoverRetailers","handleHoverTooltip","websiteDestinationInfo","websiteDestination","runRoute","fromId","toId","pinOrigin","findShortestPlacePath","originLevelId","applyViewerReset","patch","viewerResetPatch","routeApi","retailerId","toIds","matchingShapeAnchorIds","nearest","destinationAnchorId","amenityCode","anchorIds","findNearestAmenityPath","mergeTheme","amenitiesOnMap","showMap","viewerCanShowScene","Suspense","websiteClickOpensModal","destIds","shapeAnchorIds","destId","_d","_e","_f","r","websiteMapItAnchors"],"mappings":"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","x_google_ignoreList":[16]}
|
|
1
|
+
{"version":3,"file":"MapViewer.js","sources":["../../src/viewer/ui/MapControls.tsx","../../src/fonts/mapFont.ts","../../../threejs-map/src/helpers/svgIcons.helper.ts","../../../threejs-map/src/helpers/amenities.helper.ts","../../../threejs-map/src/amenities.ts","../../src/specialIcons.ts","../../src/fonts/Montserrat-Regular.woff?url","../../src/fonts/mapFontUrl.ts","../../src/ui/selectSearch.ts","../../src/ui/ModernSelect.tsx","../../src/viewer/components/openingGeometry.ts","../../src/viewer/components/OpeningWell.tsx","../../src/viewer/pointer.ts","../../src/viewer/components/LevelMeshes.tsx","../../src/viewer/routeFloorChanges.ts","../../src/viewer/components/RouteLine.tsx","../../../../node_modules/three/examples/jsm/loaders/SVGLoader.js","../../src/viewer/components/SvgVectorLayer.tsx","../../src/viewer/camera.ts","../../src/viewer/components/CameraRig.tsx","../../src/viewer/orbitWheelZoom.ts","../../src/viewer/components/MapScene.tsx","../../src/viewer/ui/RuntimeChrome.tsx","../../src/viewer/ui/WebsiteInfoModal.tsx","../../src/viewer/ui/HoverTooltip.tsx","../../src/viewer/fetchWebsiteRetailers.ts","../../src/viewer/MapViewer.tsx"],"sourcesContent":["import React from 'react';\nimport type { StackLevel } from '../../core';\nimport {\n floorSwitcherDisplayLevels,\n hasBuildingFloors,\n hasOutdoorLevel,\n shouldShowFloorSwitcher,\n} from '../../core';\n\nexport interface MapControlLevel {\n id: number;\n name: string;\n}\n\nexport interface MapControlsProps {\n levels: Array<MapControlLevel & Partial<StackLevel>>;\n activeLevelId: number | null;\n onActiveLevelChange: (id: number) => void;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onReset: () => void;\n showFloors?: boolean;\n showZoomReset?: boolean;\n /** Override the viewer building-floor list (e.g. Edit Map + Outdoor). */\n floorOptions?: MapControlLevel[];\n /** Show the floor list even when there is only one floor. */\n alwaysShowFloors?: boolean;\n}\n\nexport function MapControls({\n levels,\n activeLevelId,\n onActiveLevelChange,\n onZoomIn,\n onZoomOut,\n onReset,\n showFloors = true,\n showZoomReset = true,\n floorOptions,\n alwaysShowFloors = false,\n}: MapControlsProps) {\n const stackLevels = levels.filter(\n (level): level is MapControlLevel & StackLevel =>\n level.kind != null &&\n level.ordering != null &&\n level.levelIndex != null,\n );\n const switcher = floorOptions ?? floorSwitcherDisplayLevels(stackLevels);\n const showFloorList =\n showFloors &&\n (alwaysShowFloors\n ? switcher.length > 0\n : shouldShowFloorSwitcher(stackLevels));\n const showZoom =\n showZoomReset &&\n (hasBuildingFloors(stackLevels) || hasOutdoorLevel(stackLevels));\n if (!showFloorList && !showZoom) return null;\n\n return (\n <div className=\"eyeon-map-controls\">\n <div className=\"eyeon-map-controls__stack\">\n {showFloorList && (\n <div className=\"eyeon-map-controls__floors\" role=\"tablist\" aria-label=\"Floors\">\n {switcher.map((level) => {\n const active = level.id === activeLevelId;\n return (\n <button\n key={level.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n className={\n active\n ? 'eyeon-map-controls__floor is-active'\n : 'eyeon-map-controls__floor'\n }\n onClick={() => onActiveLevelChange(level.id)}\n >\n {level.name}\n </button>\n );\n })}\n </div>\n )}\n\n {showZoom && (\n <>\n <button\n type=\"button\"\n className=\"eyeon-map-controls__reset\"\n onClick={onReset}\n aria-label=\"Reset map\"\n >\n Reset\n </button>\n\n <div className=\"eyeon-map-controls__zoom\">\n <button\n type=\"button\"\n className=\"eyeon-map-controls__zoom-btn\"\n onClick={onZoomOut}\n aria-label=\"Zoom out\"\n >\n −\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-controls__zoom-btn\"\n onClick={onZoomIn}\n aria-label=\"Zoom in\"\n >\n +\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","/** CSS family — same Montserrat as admin-portal / Edit Map chrome. */\nexport const MAP_FONT_FAMILY = 'Montserrat, sans-serif';\n\n/** Shared by Edit Map SVG tspans and default-map troika `<Text>`. */\nexport const MAP_LABEL_LINE_HEIGHT = 1.15;\n","const SVGIcons = {\n Entrance: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path fill=\"none\" stroke=\"#444444\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.25 3.75h8.25A3.5 3.5 0 0 1 20 7.25v9.5a3.5 3.5 0 0 1-3.5 3.5H8.25\"/>\n <path fill=\"none\" stroke=\"#444444\" stroke-width=\"2.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.5 12h12.35M12.2 7.85 16.4 12l-4.2 4.15\"/>\n </svg>`,\n\n Kiosk: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 443.83 787.21\">\n <path fill=\"#444444\" d=\"M451,587.7V8.14H7.14V589.5H111.43V730.89H71.27L38.59,763.58v31.78H416.36V764.93l-34.05-34H345.78V587.7ZM396.91,71.23v452.7H59.85V71.23Z\" transform=\"translate(-7.14 -8.14)\" />\n </svg>`,\n\n Escalator: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n </svg>`,\n\n EscalatorUp: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n <path fill=\"#444444\" d=\"M165.81,131.14l-56.28-74.94c-1.74-2.31-5.21-2.31-6.95,0l-56.28,74.94c-2.15,2.87-.1,6.97,3.49,6.95l41.87-.17v129.17c0,2.4,1.94,4.34,4.34,4.34h20.1c2.4,0,4.34-1.94,4.34-4.34v-129.17l41.87.17c3.59.01,5.64-4.08,3.49-6.95Z\"/>\n </svg>`,\n\n EscalatorDown: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 445.3\">\n <path fill=\"#444444\" d=\"M243.4,75.9c21.2,0,38.1-16.8,38.1-38S264.6,0,243.4,0c-21.2,0-38.1,16.8-38.1,38S222.1,75.9,243.4,75.9z M508.5,41.2h-88.7 c-18.5,0-41.9,7.6-56.1,21.7l-82.2,81.9V121c0-51-75.7-50.4-75.7,0v98.2l-71.3,71c-6.5,6.5-7.6,7.1-20.7,7.1H70.2 C26.1,297.2,0,336.8,0,369.9c0,33.6,26.1,75.4,74,75.4h77.9c18.5,0,40.8-7.1,58.8-24.4l228.1-226.7c4.9-4.3,7.6-5.4,15.8-5.4h56.1 c27.2,0,65.3-30.4,65.3-74.8C576.5,70.5,537.9,41.2,508.5,41.2z M504.7,150.8h-47.9c-20.1,0-29.4,2.7-41.4,14.7L185.7,394.3 c-9.3,9.2-21.2,13-36.5,13H73.5c-19.6,0-36.5-16.3-36.5-38c0-21.7,16.3-33.6,33.2-33.6H122c15.2,0,25-4.3,33.7-13L389.3,90 c9.8-9.8,19.1-10.9,35.4-10.9h80c19.6,0,32.7,21.7,32.7,34.7C537.9,126.4,528.6,150.8,504.7,150.8z\" />\n <path fill=\"#444444\" d=\"M165.81,194.77l-56.28,74.94c-1.74,2.31-5.21,2.31-6.95,0l-56.28-74.94c-2.15-2.87-.1-6.97,3.49-6.95l41.87.17V58.81c0-2.4,1.94-4.34,4.34-4.34h20.1c2.4,0,4.34,1.94,4.34,4.34v129.17l41.87-.17c3.59-.01,5.64,4.08,3.49,6.95Z\"/>\n </svg>`,\n\n ATM: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 577.8 577\">\n <path fill=\"#444444\" d=\"M388.7,314c-3.7-10.3-10.3-19.8-17.7-27.2c-7.4-7.4-17.7-14-29.5-19.1c-6.6-2.9-19.2-6.6-39.1-11.8V144.2 c13.3,2.2,22.8,8.1,30.2,16.2c7.4,8.1,11.8,19.9,14,35.3l39.8-5.9c-2.9-24.3-13.3-44.1-30.2-58.1c-13.3-11-31-17.7-53.8-19.8V93.4 h-24.3v18.4c-25.8,2.2-45,9.6-58.2,21.3c-19.9,17.7-29.5,39.7-29.5,67.6c0,15.5,3.7,29.4,10.3,41.9s16.2,22,28.7,28.7 c17,9.6,33.2,16.2,49.4,20.6v121.3c-14.8-1.5-28-8.8-39.1-22.8c-7.4-9.6-13.3-25-16.2-46.3l-39.1,7.4c1.5,20.6,6.6,37.5,15.5,51.5 s19.9,23.5,31.7,30.1c12.5,6.6,28,11,47.9,13.2v39v-0.1V483h22.1v-39c28-0.7,50.1-11,67.1-28.7c17-18.4,25.8-40.4,25.8-67.6 C394.6,336,392.4,324.3,388.7,314z M278.9,145.1v107.2c-17.7-5.2-30.2-11.8-37.6-20.6s-11.1-19.8-11.1-33.1c0-14,4.4-25.7,13.3-35.3 C252.2,153.9,263.7,147.4,278.9,145.1V145h0.7C279.3,145,279.1,145,278.9,145.1z M340,394.2c-9.6,11-22.1,18.4-37.6,19.8l0,0V297.9 c20.6,5.2,34.6,11.8,42,20.6c6.6,8.1,10.3,19.8,10.3,33.8C354.8,369.2,349.6,383.1,340,394.2z\" />\n <path fill=\"#444444\" d=\"M289.8,2.5c-158.7,0-288,128-288,287.2c0,158.3,129.3,287.2,288,287.2s288-128.9,288-287.2S448.6,2.5,289.8,2.5z M289.9,533.9C155,533.9,45.2,424.3,45.2,289.8C45.2,154.5,155,45.7,289.9,45.7s244.7,109.5,244.7,244.1S424.8,533.9,289.9,533.9z\" />\n </svg>`,\n\n Management: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 414.6\">\n <path fill=\"#444444\" d=\"M371.6,180.4c66.8,0,101,58.5,121.4,121.9l16.4,50.4c2.7,8.8-7.5,16.3-16.4,16.3h-56.6l-7.5-27.2 c-17.7-53.1-45-106.2-94.8-125.9c13-8.8,23.9-21.1,30.7-35.4C366.1,180.4,368.8,180.4,371.6,180.4z M441.2,145.7 c64.8,2,98.2,59.2,118.7,121.9l15.7,49.7c2.7,8.8-7.5,17.7-16.4,17.7h-35.5l-12.3-38.1c-16.4-53.1-44.3-106.2-94.8-125.9 C426.2,162.7,434.3,155.2,441.2,145.7z M51.6,334.3H16.8c-9.6,0-19.1-8.2-16.4-17.7l15.7-49.7C35.9,204.2,70.1,147.1,134.9,145 c6.1,9.5,15,18.4,24.6,24.5c-49.8,19.7-77.8,72.8-94.8,125.9L51.6,334.3L51.6,334.3z M437.7,0c35.5,0,64.8,28.6,64.8,64.7 c0,31.3-22.5,57.2-52.5,62.6c3.4-8.8,5.5-18.4,5.5-27.9c0-39.5-27.3-71.5-62.8-81C403.6,6.8,419.3,0,437.7,0L437.7,0z M137.6,0 c17.7,0,34.1,6.8,45,18.4c-35.5,9.5-62.8,41.5-62.8,81c0,9.5,2.1,19.1,5.5,27.9C96,121.9,72.8,96,72.8,64.7 C73.5,28.6,102.1,0,137.6,0L137.6,0z M287.7,0c19.8,0,37.5,8.8,49.8,22.5c-15.7,6.8-29.3,19.1-38.2,34l-3.4,5.5c-2.7,0-5.5,0-7.5,0 c-2,0-6.1,0-8.9,0l-3.4-5.5c-9.6-15-22.5-27.2-38.2-34C250.2,8.9,267.9,0,287.7,0L287.7,0z M287.7,226c66.8,0,101,58.5,122.1,121.9 l15.7,50.4c2.7,8.8-8.2,16.3-16.4,16.3H166.2c-9.6,0-19.8-8.2-16.4-16.3l15.7-50.4C186,284.6,220.8,226,287.7,226z M287.7,81 c35.5,0,64.8,28.6,64.8,64.7s-28.7,64.7-64.8,64.7c-35.5,0-64.8-28.6-64.8-64.7S252.2,81,287.7,81z M138.3,369H82.3 c-9.6,0-19.1-8.2-16.4-16.3l15.7-50.4c21.1-63.3,55.3-121.9,122.1-121.9c2.7,0,5.5,0,7.5,0c6.1,15,17.7,27.2,30.7,35.4 c-49.8,19.7-78.5,72.8-94.8,125.9C147.1,341.8,138.3,369,138.3,369z M203.8,34.7c23.9,0,44.3,12.9,55.9,31.3 c-32.1,12.2-55.9,42.9-55.9,79c0,6.1,0.7,12.2,2.1,18.4h-2.1c-35.5,0-64.8-28.6-64.8-64.7S168.3,34.7,203.8,34.7z M371.6,34.7 c35.5,0,64.8,28.6,64.8,64.7s-29.3,64-64.8,64h-2.7c2.1-6.1,2.7-12.2,2.7-18.4c0-36.8-23.9-66.7-55.9-79 C327.2,47.7,347,34.7,371.6,34.7z\" />\n </svg>`,\n\n PlayArea: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 537.9\">\n <path fill=\"#444444\" d=\"M384.3,137c38,0,68.8-30.7,68.8-68.5S422.3,0,384.3,0s-68.8,30.7-68.8,68.5S346.4,137,384.3,137z\" />\n <path fill=\"#444444\" d=\"M283.3,96c20,26.3,35.9,53.3,67.6,64.4c31.2,11.1,60.5,11.1,83.5-5.3c22.9-16.4,34.7-46.8,54.1-87.2 c18.8-40.4,34.1-48,57-48c23.5,0,31.2,28.1,30.6,39.8s-10.6,31-40,52.7c-49.4,36.3-57.6,108.3-59.4,127.7 c-1.8,19.3-2.9,50.4,17.6,169.2c20.6,118.9-20,125.9-25.3,127.1c-5.3,0.6-21.2,8.2-31.1-16.4c-10-24.6-11.8-91.3-14.1-120 c-2.9-28.7-6.5-70.9-35.9-79c-30-8.2-40.6,39.8-51.7,76.1c-10.6,36.9-40,71.4-72.3,59.1s-29.4-50.4-10-78.5 c19.4-27.5,61.7-57.4,67.6-124.1c5.9-66.8-11.8-69.1-68.2-90.8c-55.8-22.3-60.5-33.4-67.6-48.6s7.6-46.8,31.1-52.7 C239.2,55.1,259.1,63.9,283.3,96L283.3,96z\" />\n <path fill=\"#444444\" d=\"M134.7,251.7c26.9,0,48.8-21.8,48.8-48.6s-21.8-48.6-48.8-48.6s-48.8,21.8-48.8,48.6S107.7,251.7,134.7,251.7z\" />\n <path fill=\"#444444\" d=\"M204,227.8c-15.3,17.6-28.2,35.7-51.1,41.6c-22.9,6.4-43.5,4.7-58.8-8.2c-15.3-12.9-21.7-35.1-32.9-64.4S40,161,23.5,159.8 C7.1,158.7,0,178,0,186.2c-0.6,8.2,5.9,22.3,25.3,39.2C58.2,253.5,60,305.1,60,318.5c0.6,13.5-0.6,35.7-21.7,118.3 s7.1,89.6,10.6,90.8s14.7,7,22.9-10s12.9-63.8,16.5-83.7c3.5-19.9,8.2-49.8,29.4-53.9s26.5,30.4,32.3,56.8 c5.9,26.3,24.7,52.7,47.6,45.7c22.9-7,23.5-34,11.2-54.4c-12.3-20.5-40-43.9-40.6-90.8c-0.6-47.4,12.3-48,52.9-60.3 c40.6-12.3,44.7-20.5,50.5-30.4c5.9-10-2.9-33.4-18.8-38.6C237.5,201.4,222.8,206.7,204,227.8L204,227.8z\" />\n </svg>`,\n\n RestRoom: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 533.9\">\n <path fill=\"#444444\" d=\"M282.3,533.9h9.2V0h-9.2V533.9z\" />\n <path fill=\"#444444\" d=\"M118.2,97.1c25.4-4.6,41.6-30.1,34.7-55.5C146,16.2,122.9,2.3,97.4,6.9S58.1,39.3,62.8,62.4S95.1,104,118.2,97.1z\" />\n <path fill=\"#444444\" d=\"M159.8,145.6h4.6c0,0,2.3,0,2.3,2.3L183,270.4c2.3,9.2,9.2,16.2,18.5,16.2c11.6,0,18.5-9.2,18.5-20.8l-18.5-129.4 c-2.3-13.9-13.9-23.1-27.7-23.1H44.3c-13.9,0-25.4,9.2-27.7,23.1L0.4,265.8c-2.3,11.6,6.9,20.8,18.5,20.8c9.2,0,16.2-6.9,18.5-16.2 l16.2-122.5c0,0,0-2.3,2.3-2.3h4.6c0,0,2.3,0,2.3,2.3L30.4,390.6c0,0,0,2.3,2.3,2.3h37c0,0,2.3,0,2.3,2.3v117.9 c0,9.2,6.9,16.2,16.2,16.2s16.2-6.9,16.2-16.2V393c0,0,0-2.3,2.3-2.3h11.6c0,0,2.3,0,2.3,2.3v117.9c0,9.2,6.9,16.2,16.2,16.2 c9.2,0,16.2-6.9,16.2-16.2V393c0,0,0-2.3,2.3-2.3h30.1c0,0,2.3,0,2.3-2.3l-27.7-242.7l0,0l0,0L159.8,145.6z\" />\n <path fill=\"#444444\" d=\"M497.3,76.3c13.9-23.1,4.6-50.9-16.2-62.4s-50.9-6.9-64.7,16.2c-13.9,23.1-4.6,50.9,16.2,62.4 C455.7,106.3,483.5,99.4,497.3,76.3z\" />\n <path fill=\"#444444\" d=\"M545.9,113.3h-178c-13.9,0-25.4,9.2-27.7,23.1v129.4c0,11.6,9.2,20.8,20.8,20.8s18.5-9.2,18.5-20.8V159.5c0,0,0-2.3,2.3-2.3 h2.3c0,0,2.3,0,2.3,2.3l25.4,161.8v187.2c0,11.6,9.2,20.8,20.8,20.8l0,0c11.6,0,20.8-9.2,20.8-20.8V323.6c0,0,0-2.3,2.3-2.3h6.9 c0,0,2.3,0,2.3,2.3v184.9c0,11.6,9.2,20.8,20.8,20.8l0,0c11.6,0,20.8-9.2,20.8-20.8V321.3l25.4-161.8c0,0,0-2.3,2.3-2.3h-2.3 c0,0,2.3,0,2.3,2.3v106.3c0,11.6,9.2,20.8,20.8,20.8s20.8-9.2,20.8-20.8V136.4C571.4,122.5,559.8,113.3,545.9,113.3L545.9,113.3 L545.9,113.3z\" />\n </svg>`,\n\n FamilyRestRoom: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 522.5\">\n <path fill=\"#444444\" d=\"M119.8,91.5c25-5.9,40.5-30.8,34.6-55.7c-5.9-24.9-30.9-40.4-55.9-34.5S58,32,63.9,56.9S94.8,97.3,119.8,91.5z\" />\n <path fill=\"#444444\" d=\"M160.6,139.1h4.5c0.6,0,1.3,0.6,1.3,1.3l15.3,123.1c1.3,8.9,8.9,15.9,17.8,15.9c10.8,0,19.1-9.5,17.8-20.3l-15.9-128.9 c-1.9-13.3-13.4-24.1-27.4-24.1H43.4c-14,0-25.5,10.2-27.4,24.1L0.1,259.1c-1.3,10.8,7,20.3,17.8,20.3c8.9,0,16.5-7,17.8-15.9 l15.3-123.8c0-0.6,0.6-1.3,1.3-1.3h4.5c0.6,0,1.3,0.6,1.3,1.3L29.4,384.1c0,0.6,0.6,1.3,1.3,1.3H67c0.6,0,1.3,0.6,1.3,1.3v118.1 c0,9.5,7.6,16.5,16.5,16.5c9.5,0,16.5-7.6,16.5-16.5V387.3c0-0.6,0.6-1.3,1.3-1.3h10.8c0.6,0,1.3,0.6,1.3,1.3v118.1 c0,9.5,7.6,16.5,16.5,16.5c9.5,0,16.5-7.6,16.5-16.5V387.3c0-0.6,0.6-1.3,1.3-1.3h36.3c0.6,0,1.3-0.6,1.3-1.3L158,140.3 C159.3,139.7,159.9,139.1,160.6,139.1L160.6,139.1z\" />\n <path fill=\"#444444\" d=\"M498.9,69.8c12.9-22.1,5.4-50.5-16.8-63.4c-22.2-12.9-50.6-5.4-63.6,16.7c-12.9,22.1-5.4,50.5,16.8,63.4 C457.5,99.4,486,91.9,498.9,69.8z\" />\n <path fill=\"#444444\" d=\"M547.9,106.1H369.6c-14,0-25.5,10.2-27.4,24.1v128.9c0,10.8,8.9,19.7,19.7,19.7s19.7-8.9,19.7-19.7v-106 c0-0.6,0.6-1.3,1.3-1.3h2.5c0.6,0,1.3,0.6,1.3,1.3l25.5,162.5v187.3c0,10.8,8.9,19.7,19.7,19.7h0.6c10.8,0,19.7-8.9,19.7-19.7v-186 c0-0.6,0.6-1.3,1.3-1.3h10.8c0.6,0,1.3,0.6,1.3,1.3v186c0,10.8,8.9,19.7,19.7,19.7h0.6c10.8,0,19.7-8.9,19.7-19.7V315.6l25.5-162.5 c0-0.6,0.6-1.3,1.3-1.3h2.6c0.6,0,1.3,0.6,1.3,1.3v106c0,10.8,8.9,19.7,19.7,19.7s19.7-8.9,19.7-19.7V130.2 C573.4,116.2,562,106.1,547.9,106.1L547.9,106.1z\" />\n <path fill=\"#444444\" d=\"M259.6,480l19.7-19.7L251.9,433L229,455.8c-7.6,7.6-5.7,20.3,1.3,27.3l32.5,33.6c12.7,12.7,29.3-5.1,17.2-17.1L259.6,480 L259.6,480z M288.9,347.9c19.1,0,34.4-15.2,34.4-34.3s-15.3-34.3-34.4-34.3s-34.4,15.2-34.4,34.3S269.7,347.9,288.9,347.9z M369.7,405.7l-46.5-46.3c-3.8-3.8-8.3-6.3-14.7-6.3h-41.4c-6.4,0-10.8,2.5-14,6.3l-45.9,45.7c-12.7,12.7,4.5,28.6,17.2,15.9 l28-27.9v26h72.6v-26l28.6,28.6C364.6,433.6,381.8,417.1,369.7,405.7L369.7,405.7z M324.5,433l-27.4,27.3l19.7,19.7l-20.4,20.3 c-12.1,12.1,4.5,29.2,17.2,17.1l32.5-33.6c7-7,8.9-20.3,1.3-27.3C347.4,455.9,324.5,433,324.5,433z\" />\n </svg>`,\n\n Elevator: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 576\">\n <path fill=\"#444444\" d=\"M576,145.2v268.6c-0.1,1.6-0.3,3.1-0.3,4.7c-0.3,33.3-0.6,66.6-0.8,99.9c-0.1,21.1-9.7,37.2-26.7,49 c-7.7,5.4-15.9,9.3-25.9,8c-3.8-0.5-7.7-0.1-11.5-0.1c-115.3,0.1-230.6,0.2-345.9,0.3c-1.1,0-2.2,0.2-3.3,0.3h-16.9 c-1.2-0.1-2.4-0.3-3.6-0.3c-30.2-0.3-60.4-0.6-90.7-0.8c-11.1-0.1-20.7-4.1-29.1-11.2c-8.7-7.4-15.5-16.7-19.9-27.3l-0.2-0.5 c-0.7-1.6-1.1-3.4-1.2-5.4v0C0,492.8,0,455.1,0,417.4c0-124.1,0-248.1,0-372.2c0-0.2,0-0.3,0-0.5c0-1.5,0.3-2.9,0.7-4.2l0,0.1 C8.3,22.5,20.5,8.9,38.7,1c1.2-0.5,2.6-0.9,4-0.9h0c162.8,0,325.6,0,488.4,0c1.5,0,2.8,0.4,4.1,0.9l-0.1,0c3.4,1.4,6.1,2.7,8.8,4.2 l-0.4-0.2c19.7,11.2,30.9,27.8,31.3,50.8c0.4,28.2,0.6,56.3,0.8,84.5C575.7,141.8,575.8,143.5,576,145.2L576,145.2z M536.4,288.6 h0.3c0-56.7,0-113.4,0-170c0-18.2-0.4-36.4-0.7-54.6c-0.1-8-8.4-19.8-15.9-22.7c-1-0.4-2.1-0.6-3.2-0.7h0c-3.2-0.3-6.4-0.6-9.5-0.6 c-25.5-0.4-51-0.9-76.6-1c-96.4-0.2-192.7-0.4-289.1-0.4c-22.9,0-45.8,0.1-68.7,0.3c-3.4,0-6.8,0.1-10,0.9 c-9.9,2.3-17.1,8.3-21.7,17.3c-1,1.9-2,3.9-2.1,5.9c-0.1,149.8-0.1,299.6-0.1,449.4c0,0.9-0.1,2,0.3,2.7c2.7,4.2,5.1,8.6,8.3,12.3 c5.6,6.3,13.2,8.4,21.6,8.4c23.7,0.1,47.5,0.6,71.2,0.6c123.5,0,247,0,370.5,0c0.1,0,0.2,0,0.3,0c1.1,0,2.1-0.2,3-0.6l-0.1,0 c8.3-3.5,15.4-8.4,20.2-16.3c1.2-1.8,2-4.1,2-6.5l0,0C536.4,438.2,536.4,363.4,536.4,288.6L536.4,288.6z\" />\n <path fill=\"#444444\" d=\"M307,277.5l75.9,68.4l0.9-0.2V150.9h49.7v194.8l1,0.3l78.2-67.4c0.1,1,0.2,1.7,0.3,2.4c0.3,19.9,0.6,39.8,0.8,59.7 c0,0,0,0,0,0.1c0,1.4-0.5,2.6-1.4,3.6l0,0c-34.1,32.7-68.2,65.3-102.3,97.9c-0.3,0.3-0.6,0.5-1,0.9c-0.6-0.5-1.3-1-1.9-1.5 c-32.7-30.7-65.5-61.4-98.2-92c-1.4-1.2-2.3-3-2.3-5c0-0.1,0-0.3,0-0.4v0c0.2-20.9,0.3-41.9,0.4-62.8C307,280.5,307,279.4,307,277.5 L307,277.5z\" />\n <path fill=\"#444444\" d=\"M142.2,234.5L67,301.8c-0.1-1.2-0.3-1.9-0.3-2.7c-0.3-20.7-0.7-41.5-1-62.2c0-1.3,0.5-2.5,1.3-3.4l0,0 c33.3-31.4,66.7-62.8,100.1-94.1c0.3-0.3,0.6-0.5,1-0.8c5.9,5.7,11.8,11.3,17.7,16.9c28.1,26.9,56.2,53.9,84.3,80.9 c0.9,0.8,1.4,2,1.5,3.3v0c-0.5,20.2-1.1,40.3-1.6,60.5c0,0.3-0.1,0.7-0.2,1.7l-77.4-67.1l-0.9,0.1v193.9h-48.3v-194L142.2,234.5z\" />\n </svg>`,\n\n Security: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 576 597.6\">\n <path fill=\"#444444\" d=\"M554,80.7L298.5,1.5c-6.6-2-13.2-2-19.9,0L23.2,80.7C9.3,84.7,0,97.9,0,112.4c0,352.5,178.7,436.4,274,481.9 c4.6,2,9.3,3.3,13.9,3.3c4.6,0,9.9-1.3,13.9-3.3c96-45.5,274-129.4,274-481.9C577.2,97.9,567.9,85.3,554,80.7z M288.6,527.6 C197.2,484.1,73.5,411.4,66.2,136.2l222.4-68.6L511,136.8C503.7,412.1,379.3,484.1,288.6,527.6z\" />\n <path fill=\"#444444\" d=\"M278.7,152l-26.5,87.1l-90.7-2.6c-4.6,0-8.6,2.6-9.9,7.3c-1.3,4.6,0,9.2,4,11.9l74.8,51.5L200.6,393c-1.3,4.6,0,9.2,4,11.9 c4,2.6,8.6,2.6,12.6,0l72.1-54.8l72.1,54.8c4,2.6,8.6,2.6,12.6,0c4-2.6,5.3-7.3,4-11.9l-29.8-85.8l74.8-51.5c4-2.6,5.3-7.3,4-11.9 c-1.3-4.6-5.3-7.3-9.9-7.3l-90.7,2l-26.5-87.1c-1.3-4.6-5.3-7.3-9.9-7.3C283.9,144.1,280,147.4,278.7,152L278.7,152z\" />\n </svg>`,\n\n ChildStroller: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 432 370.06\">\n <path fill=\"#444444\" d=\"M130.29,178.61l-42.67,34L33.24,254.13c-15.48,12.09-28.32-2.64-28.32-2.64-12.08-15.86,1.89-26.06,1.89-26.06l68-53.24s7.55-7.93,26.81-2.26l28.7,8.68\"/>\n <path fill=\"#444444\" d=\"M210,111A38.52,38.52,0,1,1,248.48,72.5,38.68,38.68,0,0,1,210,111\"/>\n <path fill=\"#444444\" d=\"M390.84,0a42.88,42.88,0,0,0-24.92,8.31L80.44,235.63a43.71,43.71,0,0,0-13.59,22.28,40.67,40.67,0,0,0,1.89,23.41,47.9,47.9,0,0,0-22.28,41.16A47.58,47.58,0,1,0,94,274.9,41.43,41.43,0,0,0,84.22,276a22.77,22.77,0,0,1-1.51-14.35,25.82,25.82,0,0,1,8.68-13.59l17.37-14,88,29.08a33.54,33.54,0,0,0,42.67-21.53l1.51-4.91,18.88,45.32a47.09,47.09,0,0,0-22.28,40.4,47.58,47.58,0,1,0,47.58-47.58,41.43,41.43,0,0,0-9.82,1.13l-26.43-62.68,43.8-126.12,83.08-66.08a23.7,23.7,0,0,1,15.1-5.29,25.3,25.3,0,0,1,25.3,25.3,25.72,25.72,0,0,1-10.2,20.39,8,8,0,0,0,10.58,12.08A41.37,41.37,0,0,0,390.84,0ZM93.66,301.33A20.77,20.77,0,1,1,72.89,322.1,20.71,20.71,0,0,1,93.66,301.33Zm191.07,0A20.77,20.77,0,1,1,264,322.1,20.71,20.71,0,0,1,284.73,301.33Z\"/>\n </svg>`,\n\n VendingMachine: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 594\">\n <circle fill=\"#444444\" cx=\"324\" cy=\"175.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"175.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"324\" cy=\"243\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"243\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"324\" cy=\"310.5\" r=\"13.5\"/>\n <circle fill=\"#444444\" cx=\"364.5\" cy=\"310.5\" r=\"13.5\"/>\n <path fill=\"#444444\" d=\"M216,94.5H67.5C59.4,94.5,54,99.9,54,108c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,99.9,224.1,94.5,216,94.5z\"/>\n <path fill=\"#444444\" d=\"M216,162H67.5c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,167.4,224.1,162,216,162z\"/>\n <path fill=\"#444444\" d=\"M216,229.5H67.5c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5 C229.5,234.9,224.1,229.5,216,229.5z\"/>\n <path fill=\"#444444\" d=\"M216,297H67.5c-8.1,0-13.5,5.4-13.5,13.5S59.4,324,67.5,324H216c8.1,0,13.5-5.4,13.5-13.5S224.1,297,216,297z\"/>\n <path fill=\"#444444\" d=\"M391.5,0H324c-8.1,0-13.5,5.4-13.5,13.5S315.9,27,324,27h67.5c8.1,0,13.5,5.4,13.5,13.5V567H27V40.5 C27,32.4,32.4,27,40.5,27h216v499.5c0,8.1,5.4,13.5,13.5,13.5s13.5-5.4,13.5-13.5v-513C283.5,5.4,278.1,0,270,0H40.5 C17.5,0,0,17.5,0,40.5v540c0,8.1,5.4,13.5,13.5,13.5h405c8.1,0,13.5-5.4,13.5-13.5v-540C432,17.5,414.5,0,391.5,0z\"/>\n <path fill=\"#444444\" d=\"M364.5,94.5H324c-8.1,0-13.5,5.4-13.5,13.5c0,8.1,5.4,13.5,13.5,13.5h40.5c8.1,0,13.5-5.4,13.5-13.5 C378,99.9,372.6,94.5,364.5,94.5z\"/>\n <path fill=\"#444444\" d=\"M216,432H67.5c-8.1,0-13.5,5.4-13.5,13.5V513c0,8.1,5.4,13.5,13.5,13.5H216c8.1,0,13.5-5.4,13.5-13.5v-67.5 C229.5,437.4,224.1,432,216,432z M81,499.5V459h121.5v40.5H81z\"/>\n </svg>`,\n\n Stairs: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 448.5\">\n <path fill=\"#444444\" d=\"M432,243.3h-81.7v33.1h-72.2v33.1h-72.2v33.1h-72.2v33.1H61.5v33.1H0v39.7h101.2v-33.1h72.2v-33.1h72.2v-33.1h72.2v-33.1 h72.2V283H432L432,243.3\"/>\n <path fill=\"#444444\" d=\"M99.9,109.3c12,0,21.8-9.7,21.8-21.8c0-12-9.8-21.8-21.8-21.8c-12,0-21.8,9.7-21.8,21.8C78.1,99.6,87.9,109.3,99.9,109.3\"/>\n <path fill=\"#444444\" d=\"M179.4,299.8l-56.5-47.4l11.7-82.9c12.5,14.8,20.7,33.4,22.7,53.8l17.8-4.8c-0.9-32.2-14.2-61.3-35.3-82.6 c-14.4-14.5-32.9-19.2-45.9-20.6c-0.1,0-0.2,0-0.3,0c-1.6,0-2.9,1.2-3.2,2.7c-6.5,34.7-27.7,64.2-56.9,81.9l9.3,16.1 c15.6-6.6,29.5-16.4,40.9-28.6v177.3H107l10.4-73.7l57.7,33.3L179.4,299.8\"/>\n <path fill=\"#444444\" d=\"M294.1,43.6c12,0,21.8-9.8,21.8-21.8c0-12-9.8-21.8-21.8-21.8c-12,0-21.8,9.8-21.8,21.8C272.3,33.8,282.1,43.6,294.1,43.6\" />\n <path fill=\"#444444\" d=\"M337.2,154.3l-41.8-24.1l3.9-20c1.4-7.5,2.2-15.2,2.2-23.1c0-12-1.8-23.7-5-34.6c-0.4-1.4-1.7-2.4-3.1-2.4c0,0-0.1,0-0.1,0 c-46.7,1.6-84.1,40-84.1,87.1c0,2.3,0.1,4.6,0.3,6.9l18.3,3.2c0-0.5,0-0.9,0-1.4c0-19.5,8.6-36.9,22.3-48.7l-10.5,201.1h23.3 l24.9-128l23,10.7L294.9,240l16.6,16.6l34.6-74.3c1.3-2.8,2-5.9,2-9.2C348.1,165.1,343.8,158,337.2,154.3\"/>\n </svg>`,\n\n ChargingStation: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 627.4\">\n <polygon fill=\"#444444\" points=\"314.4,282.1 133.8,467.8 188.6,334.2 114.9,334.2 225.6,148.6 314.4,148.6 236.7,282.1 \"/>\n <path fill=\"#444444\" d=\"M374.2,0H63.3C28.4,0.1,0.1,28.4,0,63.3v503.6c0,32.8,30.1,60.5,62.6,60.5h309.2c33.3,0,60.3-27,60.3-60.3V374.2l0,0V57.8 C432,25.9,406.1,0,374.2,0z M220.3,600.4c-8.3,0.2-15.2-6.4-15.4-14.7c0-0.2,0-0.5,0-0.7c0.1-8.5,6.9-15.3,15.4-15.4 c8.3-0.2,15.2,6.4,15.4,14.7c0,0.2,0,0.5,0,0.7C235.4,593.8,229.1,600.4,220.3,600.4z M391.1,544.8H44v-465h346.7v294.4l0.4,55 V544.8z\"/>\n </svg>`,\n\n WheelChair: `<svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\" viewBox=\"0 0 432 492.2\">\n <path fill=\"#444444\" d=\"M134.7,80.1l9.5,103h104.6v33.3H146.6l3.2,30.9h147.4l66.6,157l56.3-23.8l11.9,27l-84,36.4l-69.7-163.3H118.9l-19-221.9 c-3.2-5.5-4.7-11.9-4.7-18.2C95.1,18.2,112.5,0,134.7,0c22.2,0,40.4,18.2,40.4,40.4C175.2,61.8,156.9,80.1,134.7,80.1L134.7,80.1z\" />\n <path fill=\"#444444\" d=\"M306.7,397.1c-25.3,56.3-81.6,95.1-146.6,95.1C72.1,492.2,0,420.9,0,332.1C0,268.7,37.2,214,91.1,187.9l3.2,36.5 c-36.5,22.2-61,61.8-61,107.8c0,69.8,57.1,126.8,126.8,126.8c65,0,118.1-48.3,126-110.2L306.7,397.1\"/>\n </svg>`,\n\n};\n\nexport default SVGIcons;","import SVGIcons from \"./svgIcons.helper\";\n\nexport type MapAmenityID = 'atm' | 'management' | 'playarea' | 'restroom' | 'family-restroom' | 'elevator' | 'escalator' | 'security' | 'dog-poop-station' | 'child-stroller' | 'vending-machine' | 'stairs' | 'charging-station' | 'wheelchair';\n\nexport interface MapAmenity {\n name: string;\n type: MapAmenityID;\n svgCode: string;\n}\n\nexport const AllAmenities: MapAmenity[] = [\n {\n name: \"ATM\",\n type: \"atm\",\n svgCode: SVGIcons.ATM\n },\n {\n name: \"Management\",\n type: \"management\",\n svgCode: SVGIcons.Management\n },\n {\n name: \"Kids Area\",\n type: \"playarea\",\n svgCode: SVGIcons.PlayArea\n },\n {\n name: \"Restroom\",\n type: \"restroom\",\n svgCode: SVGIcons.RestRoom\n },\n {\n name: \"Family Restroom\",\n type: \"family-restroom\",\n svgCode: SVGIcons.FamilyRestRoom\n },\n {\n name: \"Elevator\",\n type: \"elevator\",\n svgCode: SVGIcons.Elevator\n },\n {\n name: \"Security\",\n type: \"security\",\n svgCode: SVGIcons.Security\n },\n {\n name: \"Escalator\",\n type: \"escalator\",\n svgCode: SVGIcons.Escalator\n },\n {\n name: 'Child Stroller',\n type: 'child-stroller',\n svgCode: SVGIcons.ChildStroller\n },\n {\n name: 'Vending Machine',\n type: 'vending-machine',\n svgCode: SVGIcons.VendingMachine\n },\n {\n name: 'Stairs',\n type: 'stairs',\n svgCode: SVGIcons.Stairs\n },\n {\n name: 'Charging Station',\n type: 'charging-station',\n svgCode: SVGIcons.ChargingStation\n },\n {\n name: 'Wheelchair',\n type: 'wheelchair',\n svgCode: SVGIcons.WheelChair\n },\n];\n\n","/**\n * Lightweight amenity + kiosk icon catalog for every EyeOn surface.\n * Import from `@eyeon/threejs-map/amenities` (or `@eyeon/threejs-map`) —\n * do not copy these SVGs into other packages.\n */\nimport SVGIcons from './helpers/svgIcons.helper';\nimport {\n AllAmenities,\n type MapAmenity,\n type MapAmenityID,\n} from './helpers/amenities.helper';\n\nexport { AllAmenities };\nexport type { MapAmenity, MapAmenityID };\n\n/** Elevator / escalator are their own v1 modules, not amenity assignments. */\nconst CONNECTOR_AMENITY_TYPES = new Set<MapAmenityID>([\n 'elevator',\n 'escalator',\n]);\n\nexport const AssignAmenities: MapAmenity[] = AllAmenities.filter(\n (item) => !CONNECTOR_AMENITY_TYPES.has(item.type),\n);\n\nexport const KioskSvg = SVGIcons.Kiosk;\nexport const EntranceSvg = SVGIcons.Entrance;\nexport const EscalatorUpSvg = SVGIcons.EscalatorUp;\nexport const EscalatorDownSvg = SVGIcons.EscalatorDown;\n\nexport function isAssignAmenity(type: string): boolean {\n return AssignAmenities.some((item) => item.type === type);\n}\n\nexport function getAmenityByType(type: string): MapAmenity | undefined {\n return AssignAmenities.find((item) => item.type === type) ??\n AllAmenities.find((item) => item.type === type);\n}\n\nexport function getMapSpecialSvg(id: string): string | undefined {\n if (id === 'kiosk') return KioskSvg;\n if (id === 'entrance') return EntranceSvg;\n if (id === 'escalator-up') return EscalatorUpSvg;\n if (id === 'escalator-down') return EscalatorDownSvg;\n return getAmenityByType(id)?.svgCode;\n}\n\nexport function recolorMapSvg(svg: string, color: string): string {\n const hex = color.startsWith('#') ? color : `#${color}`;\n return svg\n .replace(/fill=\"(?!none\")[^\"]*\"/gi, `fill=\"${hex}\"`)\n .replace(/stroke=\"(?!none\")[^\"]*\"/gi, `stroke=\"${hex}\"`);\n}\n\nexport function mapSpecialSvgToDataUrl(\n svg: string,\n color?: string | null,\n): string {\n const colored = color ? recolorMapSvg(svg, color) : svg;\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(colored)}`;\n}\n","/**\n * v2 render helpers for amenity / kiosk icons.\n * SVG markup lives only in `@eyeon/threejs-map/amenities`.\n */\nimport {\n AllAmenities,\n AssignAmenities,\n getAmenityByType,\n getMapSpecialSvg,\n isAssignAmenity,\n mapSpecialSvgToDataUrl,\n recolorMapSvg,\n} from '@eyeon/threejs-map/amenities';\nimport type { CmAmenityCatalogItem, CmShapeAssignment } from './core';\nimport { assignmentSpecialIconId, STATIC_ICON_COLORS } from './core';\n\nexport {\n AllAmenities,\n AssignAmenities,\n getAmenityByType,\n isAssignAmenity,\n getMapSpecialSvg,\n mapSpecialSvgToDataUrl,\n recolorMapSvg,\n};\n\nexport function entranceIconDataUrl(color?: string | null): string | undefined {\n const svg = getMapSpecialSvg('entrance');\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, color);\n}\n\n/** v1 amenity list for the assign dropdown — elevator / escalator are separate modules. */\nexport function amenityAssignOptions(): { value: string; label: string }[] {\n return AssignAmenities.map((item) => ({\n value: item.type,\n label: item.name,\n }));\n}\n\nexport function amenityTypeFromCatalogId(\n amenityId: number | null | undefined,\n amenities: CmAmenityCatalogItem[],\n): string {\n if (amenityId == null) return '';\n return amenities.find((item) => item.id === amenityId)?.code ?? '';\n}\n\nexport function amenityCatalogIdForType(\n type: string,\n amenities: CmAmenityCatalogItem[],\n): number | null {\n const row = amenities.find(\n (item) => item.isActive !== false && item.code === type,\n );\n return row?.id ?? null;\n}\n\nexport function assignmentSpecialIconDataUrl(\n assignment: CmShapeAssignment | null | undefined,\n amenities: Array<{ id: number; code: string }>,\n color?: string | null,\n): string | undefined {\n const id = assignmentSpecialIconId(assignment, amenities);\n if (!id) return undefined;\n const svg = getMapSpecialSvg(id);\n if (!svg) return undefined;\n return mapSpecialSvgToDataUrl(svg, color);\n}\n\nexport type ConnectorSpecialKind = 'escalator' | 'elevator';\nexport type EscalatorTravel = 'up' | 'down';\nexport type ConnectorIconId =\n | ConnectorSpecialKind\n | 'escalator-up'\n | 'escalator-down';\n\nconst ASSIGNED_CONNECTOR_ICON = STATIC_ICON_COLORS.connector;\nconst UNASSIGNED_CONNECTOR_ICON = '#94a3b8';\n\ntype LevelTravelInput = {\n id: number;\n levelIndex?: number;\n ordering?: number;\n anchors?: Array<{ shapeId?: number | null; connectorId?: number | null }>;\n};\n\n/** Compare two floors — higher index / ordering is up. */\nexport function levelTravel(\n from: Pick<LevelTravelInput, 'levelIndex' | 'ordering'>,\n to: Pick<LevelTravelInput, 'levelIndex' | 'ordering'>,\n): EscalatorTravel | null {\n const fromIndex = from.levelIndex ?? from.ordering;\n const toIndex = to.levelIndex ?? to.ordering;\n if (fromIndex == null || toIndex == null || toIndex === fromIndex) {\n const fromOrder = from.ordering ?? from.levelIndex;\n const toOrder = to.ordering ?? to.levelIndex;\n if (fromOrder == null || toOrder == null || toOrder === fromOrder) {\n return null;\n }\n return toOrder > fromOrder ? 'up' : 'down';\n }\n return toIndex > fromIndex ? 'up' : 'down';\n}\n\n/**\n * From this linked landing, which way does the ride go? Used for the\n * EscalatorUp / EscalatorDown overlay. Lists keep the plain Escalator icon.\n */\nexport function escalatorLandingTravel(\n shapeId: number,\n levelId: number,\n levels: readonly LevelTravelInput[],\n): EscalatorTravel | null {\n const here = levels.find((level) => level.id === levelId);\n if (!here) return null;\n const connectorId = here.anchors?.find(\n (anchor) => anchor.shapeId === shapeId && anchor.connectorId != null,\n )?.connectorId;\n if (connectorId == null) return null;\n\n const partner = levels.find((level) => {\n if (level.id === here.id) return false;\n return Boolean(\n level.anchors?.some(\n (anchor) =>\n anchor.connectorId === connectorId &&\n anchor.shapeId != null &&\n anchor.shapeId !== shapeId,\n ),\n );\n });\n if (!partner) return null;\n return levelTravel(here, partner);\n}\n\n/** Linked map overlays use the arrow variants; UI lists pass no travel. */\nexport function escalatorConnectorIconId(\n travel?: EscalatorTravel | null,\n): ConnectorIconId {\n if (travel === 'up') return 'escalator-up';\n if (travel === 'down') return 'escalator-down';\n return 'escalator';\n}\n\n/** Escalator / elevator SVG ids from the floor file (`escalator-5-up-start`). */\nexport function connectorSpecialKind(shape: {\n key: string;\n sourceSvgId?: string | null;\n}): ConnectorSpecialKind | null {\n const raw = (shape.sourceSvgId ?? shape.key)\n .trim()\n .toLowerCase()\n .replace(/_/g, '-');\n if (raw === 'escalator' || raw.startsWith('escalator-')) return 'escalator';\n if (raw === 'elevator' || raw.startsWith('elevator-')) return 'elevator';\n return null;\n}\n\nexport function connectorSpecialIconDataUrl(\n kind: ConnectorIconId,\n assigned: boolean,\n color?: string | null,\n): string | undefined {\n const svg = getMapSpecialSvg(kind);\n if (!svg) return undefined;\n const fill = color?.trim()\n ? color.trim()\n : assigned\n ? ASSIGNED_CONNECTOR_ICON\n : UNASSIGNED_CONNECTOR_ICON;\n return mapSpecialSvgToDataUrl(svg, fill);\n}\n\nexport function connectorMapIconDataUrl(\n kind: ConnectorSpecialKind,\n assigned: boolean,\n color?: string | null,\n travel?: EscalatorTravel | null,\n): string | undefined {\n const iconId = kind === 'escalator' ? escalatorConnectorIconId(travel) : kind;\n return connectorSpecialIconDataUrl(iconId, assigned, color);\n}\n\n/** Landings that belong to a linked escalator ride / elevator shaft. */\nexport function assignedConnectorShapeIds(\n anchors: Array<{ shapeId?: number | null; connectorId?: number | null }>,\n): Set<number> {\n const ids = new Set<number>();\n for (const anchor of anchors) {\n if (anchor.shapeId != null && anchor.connectorId != null) {\n ids.add(anchor.shapeId);\n }\n }\n return ids;\n}\n\n/**\n * Map overlay: only a linked landing gets an icon. Unassigned escalators\n * and elevators stay as empty polygons on PORTAL assign; WEBSITE / DISPLAY_APP\n * hide those polygons entirely.\n */\nexport function connectorMapIconKind(\n shape: {\n id: number;\n key: string;\n sourceSvgId?: string | null;\n orphanedAt?: string | Date | null;\n },\n assignedShapeIds: Set<number>,\n): ConnectorSpecialKind | null {\n if (shape.orphanedAt) return null;\n const kind = connectorSpecialKind(shape);\n if (!kind || !assignedShapeIds.has(shape.id)) return null;\n return kind;\n}\n","export default \"data:font/woff;base64,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\"","import mapFontUrl from './Montserrat-Regular.woff?url';\n\n/**\n * Troika (drei `<Text>`) cannot use CSS `font-family`; it needs a font file.\n * Latin 400 WOFF, same face as `@fontsource/montserrat` / admin-portal.\n */\nexport const MAP_FONT_URL = mapFontUrl;\n\nlet registered = false;\n\n/** Register Montserrat so SVG + canvas measurement match the 3D overlay. */\nexport function ensureMapFont(): void {\n if (registered || typeof document === 'undefined' || !('fonts' in document)) {\n return;\n }\n registered = true;\n const face = new FontFace('Montserrat', `url(${MAP_FONT_URL})`);\n void face.load().then((loaded) => {\n document.fonts.add(loaded);\n });\n}\n\nensureMapFont();\n","export interface ModernSelectOption {\n value: string;\n label: string;\n hint?: string;\n iconUrl?: string;\n iconMuted?: boolean;\n}\n\n/** Show a search field once a list is long enough to scan by eye. */\nexport const MODERN_SELECT_SEARCH_AFTER = 8;\n\nexport function filterModernSelectOptions(\n options: ModernSelectOption[],\n query: string,\n): ModernSelectOption[] {\n const q = query.trim().toLowerCase();\n if (!q) return options;\n return options.filter((o) => {\n const haystack = `${o.label} ${o.hint ?? ''}`.toLowerCase();\n return haystack.includes(q);\n });\n}\n\nexport function modernSelectIsSearchable(\n optionCount: number,\n searchable?: boolean,\n): boolean {\n return searchable ?? optionCount >= MODERN_SELECT_SEARCH_AFTER;\n}\n","import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport './modern-select.css';\nimport {\n filterModernSelectOptions,\n modernSelectIsSearchable,\n type ModernSelectOption,\n} from './selectSearch';\n\nexport type { ModernSelectOption } from './selectSearch';\nexport { filterModernSelectOptions } from './selectSearch';\n\nfunction Chevron() {\n return (\n <svg\n className=\"eyeon-map-select__chevron\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden\n >\n <path\n d=\"M2.5 4.5 6 8l3.5-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function ModernSelect({\n value,\n options,\n onChange,\n disabled = false,\n placeholder = 'Select…',\n searchable,\n ariaLabel,\n}: {\n value: string;\n options: ModernSelectOption[];\n onChange: (value: string) => void;\n disabled?: boolean;\n placeholder?: string;\n searchable?: boolean;\n ariaLabel?: string;\n}) {\n const listId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const [menuPos, setMenuPos] = useState<{\n top: number;\n left: number;\n width: number;\n maxHeight: number;\n } | null>(null);\n\n const withSearch = modernSelectIsSearchable(options.length, searchable);\n const selected = options.find((o) => o.value === value);\n const filtered = useMemo(\n () => filterModernSelectOptions(options, withSearch && open ? query : ''),\n [open, options, query, withSearch],\n );\n\n const close = useCallback(() => {\n setOpen(false);\n setQuery('');\n setActiveIndex(0);\n }, []);\n\n const pick = useCallback(\n (next: string) => {\n onChange(next);\n close();\n },\n [close, onChange],\n );\n\n const updateMenuPos = useCallback(() => {\n const el = triggerRef.current ?? buttonRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const maxHeight = Math.min(280, Math.max(spaceBelow, spaceAbove, 120));\n const openAbove = spaceBelow < 160 && spaceAbove > spaceBelow;\n setMenuPos({\n top: openAbove ? Math.max(8, rect.top - maxHeight - 4) : rect.bottom + 4,\n left: rect.left,\n width: Math.max(rect.width, 160),\n maxHeight,\n });\n }, []);\n\n useEffect(() => {\n if (!open) {\n setMenuPos(null);\n return;\n }\n updateMenuPos();\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (rootRef.current?.contains(t) || menuRef.current?.contains(t)) return;\n close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n (withSearch ? searchRef.current : buttonRef.current)?.blur();\n }\n };\n const onMove = () => updateMenuPos();\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('resize', onMove);\n window.addEventListener('scroll', onMove, true);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('resize', onMove);\n window.removeEventListener('scroll', onMove, true);\n };\n }, [close, open, updateMenuPos, withSearch]);\n\n useEffect(() => {\n if (!open || !withSearch) return;\n requestAnimationFrame(() => searchRef.current?.focus());\n }, [open, withSearch]);\n\n useEffect(() => {\n setActiveIndex(0);\n }, [query, filtered.length]);\n\n const moveActive = (delta: number) => {\n if (filtered.length === 0) return;\n setActiveIndex((i) => (i + delta + filtered.length) % filtered.length);\n };\n\n const onSearchKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n if (!open) setOpen(true);\n else moveActive(1);\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n if (!open) setOpen(true);\n else moveActive(-1);\n return;\n }\n if (e.key === 'Enter') {\n e.preventDefault();\n const option = filtered[activeIndex];\n if (open && option) pick(option.value);\n else setOpen(true);\n }\n };\n\n const menu =\n open && menuPos && !disabled\n ? createPortal(\n <div\n ref={menuRef}\n id={listId}\n className=\"eyeon-map-select__menu\"\n role=\"listbox\"\n aria-label={ariaLabel}\n style={{\n top: menuPos.top,\n left: menuPos.left,\n width: menuPos.width,\n maxHeight: menuPos.maxHeight,\n }}\n >\n <ul className=\"eyeon-map-select__list\">\n {filtered.length === 0 ? (\n <li className=\"eyeon-map-select__empty\">No matches</li>\n ) : (\n filtered.map((option, index) => {\n const active = option.value === value;\n const highlighted = index === activeIndex;\n return (\n <li\n key={option.value}\n id={`${listId}-${option.value}`}\n role=\"option\"\n aria-selected={active}\n >\n <button\n type=\"button\"\n className={[\n 'eyeon-map-select__option',\n active ? 'is-active' : '',\n highlighted ? 'is-highlight' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => pick(option.value)}\n >\n {option.iconUrl ? (\n <img\n className={\n option.iconMuted\n ? 'eyeon-map-select__option-icon is-muted'\n : 'eyeon-map-select__option-icon'\n }\n src={option.iconUrl}\n alt=\"\"\n />\n ) : null}\n <span className=\"eyeon-map-select__option-copy\">\n <span>{option.label}</span>\n {option.hint ? (\n <span className=\"eyeon-map-select__option-hint\">\n {option.hint}\n </span>\n ) : null}\n </span>\n </button>\n </li>\n );\n })\n )}\n </ul>\n </div>,\n document.body,\n )\n : null;\n\n return (\n <div ref={rootRef} className=\"eyeon-map-select\">\n {withSearch ? (\n <div\n ref={triggerRef}\n className={\n open\n ? 'eyeon-map-select__trigger is-open'\n : 'eyeon-map-select__trigger'\n }\n onMouseDown={(e) => {\n if (disabled) return;\n const target = e.target as HTMLElement;\n if (target.closest('.eyeon-map-select__chevron-btn')) return;\n if (target !== searchRef.current) {\n e.preventDefault();\n searchRef.current?.focus();\n }\n if (!open) setOpen(true);\n }}\n >\n <input\n ref={searchRef}\n className=\"eyeon-map-select__input\"\n type=\"text\"\n role=\"combobox\"\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n open && filtered[activeIndex]\n ? `${listId}-${filtered[activeIndex].value}`\n : undefined\n }\n disabled={disabled}\n placeholder={placeholder}\n value={open ? query : (selected?.label ?? '')}\n onChange={(e) => {\n setQuery(e.target.value);\n if (!open) setOpen(true);\n }}\n onFocus={() => {\n if (!disabled) setOpen(true);\n }}\n onKeyDown={onSearchKeyDown}\n />\n <button\n type=\"button\"\n className=\"eyeon-map-select__chevron-btn\"\n tabIndex={-1}\n aria-hidden\n disabled={disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (disabled) return;\n setOpen((v) => !v);\n }}\n >\n <Chevron />\n </button>\n </div>\n ) : (\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"eyeon-map-select__trigger\"\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n setOpen((v) => !v);\n }}\n >\n <span\n className={\n selected\n ? 'eyeon-map-select__value'\n : 'eyeon-map-select__placeholder'\n }\n >\n {selected?.iconUrl ? (\n <img\n className={\n selected.iconMuted\n ? 'eyeon-map-select__option-icon is-muted'\n : 'eyeon-map-select__option-icon'\n }\n src={selected.iconUrl}\n alt=\"\"\n />\n ) : null}\n {selected?.label ?? placeholder}\n </span>\n <Chevron />\n </button>\n )}\n {menu}\n </div>\n );\n}\n","import * as THREE from 'three';\nimport type { Vec2 } from '../../core';\nimport { holesOverlappingOuter } from '../../core';\n\nexport function polygonToThreeShape(points: Vec2[]): THREE.Shape | null {\n if (points.length < 3) return null;\n const shape = new THREE.Shape();\n shape.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n shape.lineTo(points[i].x, points[i].y);\n }\n shape.closePath();\n return shape;\n}\n\nexport function polygonToThreePath(points: Vec2[]): THREE.Path | null {\n if (points.length < 3) return null;\n const path = new THREE.Path();\n path.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n path.lineTo(points[i].x, points[i].y);\n }\n path.closePath();\n return path;\n}\n\n/** Punch overlapping openings out of a slab polygon. */\nexport function slabShapeWithHoles(\n outer: Vec2[],\n holes: Vec2[][],\n): THREE.Shape | null {\n const shape = polygonToThreeShape(outer);\n if (!shape) return null;\n for (const hole of holesOverlappingOuter(outer, holes)) {\n const path = polygonToThreePath(hole);\n if (path) shape.holes.push(path);\n }\n return shape;\n}\n","import React, { useEffect, useMemo } from 'react';\nimport * as THREE from 'three';\nimport type { Vec2 } from '../../core';\nimport {\n OPENING_VOID_FILL,\n OPENING_VOID_MARK,\n OPENING_VOID_STROKE,\n polygonBBox,\n} from '../../core';\nimport { polygonToThreeShape } from './openingGeometry';\n\nfunction skipRaycast() {}\n\n/** X mark in bbox UV space — ShapeGeometry clips it to the opening. */\nfunction createOpeningMarkTexture(aspect: number): THREE.CanvasTexture {\n const height = 256;\n const width = Math.max(48, Math.round(height * Math.max(aspect, 0.2)));\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return new THREE.CanvasTexture(canvas);\n ctx.clearRect(0, 0, width, height);\n const pad = Math.min(width, height) * 0.14;\n ctx.strokeStyle = OPENING_VOID_MARK;\n ctx.globalAlpha = 0.82;\n ctx.lineWidth = Math.max(5, Math.min(width, height) * 0.045);\n ctx.lineCap = 'round';\n ctx.beginPath();\n ctx.moveTo(pad, pad);\n ctx.lineTo(width - pad, height - pad);\n ctx.moveTo(width - pad, pad);\n ctx.lineTo(pad, height - pad);\n ctx.stroke();\n const texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n texture.anisotropy = 4;\n texture.needsUpdate = true;\n return texture;\n}\n\nfunction OpeningVoidMesh({ polygon }: { polygon: Vec2[] }) {\n const shape = useMemo(() => polygonToThreeShape(polygon), [polygon]);\n const box = useMemo(() => polygonBBox(polygon), [polygon]);\n const dash = Math.max(8, openingSpanDash(box));\n const outline = useMemo(() => {\n if (polygon.length < 2) return null;\n const first = polygon[0];\n const points = [\n ...polygon.map((p) => new THREE.Vector3(p.x, p.y, 0.05)),\n new THREE.Vector3(first.x, first.y, 0.05),\n ];\n const geometry = new THREE.BufferGeometry().setFromPoints(points);\n const material = new THREE.LineDashedMaterial({\n color: OPENING_VOID_STROKE,\n dashSize: dash,\n gapSize: dash * 0.65,\n });\n const line = new THREE.Line(geometry, material);\n line.renderOrder = 8;\n line.computeLineDistances();\n line.raycast = skipRaycast;\n return line;\n }, [dash, polygon]);\n\n useEffect(\n () => () => {\n if (!outline) return;\n outline.geometry.dispose();\n const material = outline.material;\n if (Array.isArray(material)) material.forEach((item) => item.dispose());\n else material.dispose();\n },\n [outline],\n );\n const mark = useMemo(() => {\n const width = Math.max(box.maxX - box.minX, 1);\n const height = Math.max(box.maxY - box.minY, 1);\n return createOpeningMarkTexture(width / height);\n }, [box]);\n\n useEffect(() => () => mark.dispose(), [mark]);\n\n if (!shape || !outline) return null;\n\n return (\n <group>\n <mesh\n position={[0, 0, 0.02]}\n renderOrder={6}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <shapeGeometry args={[shape]} />\n <meshBasicMaterial\n color={OPENING_VOID_FILL}\n side={THREE.DoubleSide}\n depthWrite={false}\n />\n </mesh>\n <mesh position={[0, 0, 0.03]} renderOrder={7} raycast={skipRaycast}>\n <shapeGeometry args={[shape]} />\n <meshBasicMaterial\n map={mark}\n transparent\n depthWrite={false}\n side={THREE.DoubleSide}\n toneMapped={false}\n />\n </mesh>\n {outline ? <primitive object={outline} /> : null}\n </group>\n );\n}\n\nfunction openingSpanDash(bbox: {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}): number {\n const span = Math.min(bbox.maxX - bbox.minX, bbox.maxY - bbox.minY);\n return Math.min(18, Math.max(7, span * 0.08));\n}\n\nexport function OpeningWells({\n polygons,\n}: {\n polygons: Vec2[][];\n is3d?: boolean;\n}) {\n if (polygons.length === 0) return null;\n return (\n <group>\n {polygons.map((polygon, index) => (\n <OpeningVoidMesh key={`opening-void-${index}`} polygon={polygon} />\n ))}\n </group>\n );\n}\n","import {\n darkenShapeFill,\n viewerShapeHoverableOnHost,\n type MapViewerHost,\n type PublicServiceShape,\n type ShapeKind,\n} from '../core';\n\n/** Kinds that select (or Shift-add) on the assign / public map. */\nexport const VIEWER_SELECTABLE_KINDS: ShapeKind[] = [\n 'unit',\n 'amenity',\n 'kiosk_screen',\n 'connector',\n 'entrance',\n 'parking_zone',\n 'custom',\n];\n\nexport function isViewerSelectableKind(kind: string): boolean {\n return (VIEWER_SELECTABLE_KINDS as readonly string[]).includes(kind);\n}\n\n/** Assign map: any selectable kind. Public hosts: only assigned items. */\nexport function isViewerInteractiveShape(\n kind: string,\n host: MapViewerHost = 'PORTAL_ASSIGN',\n assignment?: PublicServiceShape['assignment'] | null,\n): boolean {\n return (\n isViewerSelectableKind(kind) &&\n viewerShapeHoverableOnHost({ assignment: assignment ?? undefined }, host)\n );\n}\n\n/** Hover and the current selection share the same assign-map highlight. */\nexport function viewerShapeHighlighted(\n shapeId: number,\n hoveredShapeId: number | null,\n selectedShapeIds: readonly number[],\n): boolean {\n return hoveredShapeId === shapeId || selectedShapeIds.includes(shapeId);\n}\n\n/** Map pointer hover wins over a leftover list hover. */\nexport function resolvedViewerHoverId(\n listHoverId: number | null | undefined,\n pointerHoverId: number | null,\n): number | null {\n return pointerHoverId ?? listHoverId ?? null;\n}\n\nexport function viewerHoverCursor(\n kind: string,\n host: MapViewerHost = 'PORTAL_ASSIGN',\n assignment?: PublicServiceShape['assignment'] | null,\n): 'pointer' | '' {\n return isViewerInteractiveShape(kind, host, assignment) ? 'pointer' : '';\n}\n\n/** R3F `eventSource` hosts the cursor — the WebGL canvas has pointer-events: none. */\nexport function applyViewerHoverCursor(\n host: HTMLElement | null | undefined,\n cursor: 'pointer' | '',\n): void {\n if (!host) return;\n host.classList.toggle('is-hover-shape', cursor === 'pointer');\n}\n\n/** Near-invisible fills (legacy amenity 0.01) still need a readable hover. */\nexport function viewerHoverFillOpacity(\n kind: string,\n base: number,\n hovered: boolean,\n): number {\n if (!hovered || !isViewerSelectableKind(kind)) return base;\n if (base < 0.08) return 0.28;\n return base;\n}\n\n/** Hover and the current selection use the same darker shade of this fill. */\nexport function viewerHoverFillColor(fill: string, hovered: boolean): string {\n if (!hovered) return fill;\n return darkenShapeFill(fill);\n}\n\n/** Canvas-host coordinates — MapScene uses `eventPrefix=\"offset\"`. */\nexport function viewerPointerOffset(event: {\n offsetX?: number;\n offsetY?: number;\n nativeEvent?: { offsetX?: number; offsetY?: number };\n}): { x: number; y: number } | null {\n const native = event.nativeEvent;\n const x = typeof event.offsetX === 'number' ? event.offsetX : native?.offsetX;\n const y = typeof event.offsetY === 'number' ? event.offsetY : native?.offsetY;\n if (typeof x !== 'number' || typeof y !== 'number') return null;\n if (!Number.isFinite(x) || !Number.isFinite(y)) return null;\n return { x, y };\n}\n\n/** Pan farther than this and a pointer-up is not a click/tap. */\nexport const VIEWER_CLICK_DRAG_PX = 5;\n\nexport type ViewerPointerGesture = {\n pointerId: number | null;\n x: number;\n y: number;\n maxDist: number;\n active: boolean;\n};\n\nexport function createViewerPointerGesture(): ViewerPointerGesture {\n return { pointerId: null, x: 0, y: 0, maxDist: 0, active: false };\n}\n\nexport function viewerPointerClientXY(e: {\n clientX?: number;\n clientY?: number;\n pointerId?: number;\n}): { x: number; y: number; pointerId: number | null } | null {\n const x = e.clientX;\n const y = e.clientY;\n if (typeof x !== 'number' || typeof y !== 'number' || !Number.isFinite(x) || !Number.isFinite(y)) {\n return null;\n }\n return { x, y, pointerId: e.pointerId ?? null };\n}\n\nexport function beginViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (gesture.active) return;\n gesture.active = true;\n gesture.pointerId = pointerId;\n gesture.x = x;\n gesture.y = y;\n gesture.maxDist = 0;\n}\n\nexport function moveViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (!gesture.active) return;\n if (gesture.pointerId != null && pointerId != null && pointerId !== gesture.pointerId) return;\n const dist = Math.hypot(x - gesture.x, y - gesture.y);\n if (dist > gesture.maxDist) gesture.maxDist = dist;\n}\n\nexport function endViewerPointerGesture(\n gesture: ViewerPointerGesture,\n x: number,\n y: number,\n pointerId: number | null = null,\n): void {\n if (!gesture.active) return;\n if (gesture.pointerId != null && pointerId != null && pointerId !== gesture.pointerId) return;\n moveViewerPointerGesture(gesture, x, y, pointerId);\n gesture.active = false;\n gesture.pointerId = null;\n}\n\n/** True when the pointer barely moved — R3F delta alone is unreliable on touch. */\nexport function viewerPointerClickIsTap(maxDist: number, r3fDelta?: number): boolean {\n const delta = Number.isFinite(r3fDelta) ? r3fDelta! : 0;\n return Math.max(maxDist, delta) <= VIEWER_CLICK_DRAG_PX;\n}\n\nexport function pointerMissClearsSelection(\n down: { x: number; y: number } | null,\n up: { x: number; y: number; button?: number },\n): boolean {\n if ((up.button ?? 0) !== 0) return false;\n if (!down) return true;\n const dx = up.x - down.x;\n const dy = up.y - down.y;\n return dx * dx + dy * dy <= VIEWER_CLICK_DRAG_PX * VIEWER_CLICK_DRAG_PX;\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport * as THREE from 'three';\nimport { Html, Text } from '@react-three/drei';\nimport type {\n CmAmenityCatalogItem,\n MapViewerHost,\n PublishedLevel,\n PublishedRetailer,\n ThemeDefaults,\n ShapeKind,\n ViewerHoverTooltipHandler,\n} from '../../core';\nimport {\n assignmentOverlayImageUrl,\n assignmentOverlayRenderSize,\n assignmentOverlayVisible,\n connectorIconLayout,\n darkenShapeFill,\n DEFAULT_ASSIGNMENT_SIZE,\n DEFAULT_ENTRANCE_SIZE,\n filletPolygon,\n geometryBBox,\n INTERACTIVE_SHAPE_KINDS,\n isEntranceIcon,\n isSlabShapeKind,\n isTransparentColor,\n labelAlignX,\n normalizeLabelAlign,\n resolveFetchUrl,\n resolveLayerStyle,\n resolvedAssignmentIconColor,\n resolvedViewerShapeFill,\n viewerHoverTooltipLabel,\n viewerShapeBaseOpacity,\n viewerShapeVisibleOnHost,\n voidPolygonsOnLevel,\n} from '../../core';\nimport { polygonToThreeShape, slabShapeWithHoles } from './openingGeometry';\nimport { OpeningWells } from './OpeningWell';\nimport { MAP_LABEL_LINE_HEIGHT } from '../../fonts/mapFont';\nimport { MAP_FONT_URL } from '../../fonts/mapFontUrl';\nimport {\n applyViewerHoverCursor,\n isViewerInteractiveShape,\n viewerHoverCursor,\n viewerHoverFillOpacity,\n resolvedViewerHoverId,\n viewerPointerClickIsTap,\n viewerPointerOffset,\n viewerShapeHighlighted,\n type ViewerPointerGesture,\n} from '../pointer';\nimport {\n assignedConnectorShapeIds,\n assignmentSpecialIconDataUrl,\n connectorMapIconDataUrl,\n connectorMapIconKind,\n escalatorLandingTravel,\n entranceIconDataUrl,\n} from '../../specialIcons';\n\nfunction kindColor(\n kind: ShapeKind,\n theme: ThemeDefaults,\n host: MapViewerHost,\n fill?: string,\n assignment?: { bgColor?: string | null } | null,\n): string {\n return resolvedViewerShapeFill(kind, theme, host, fill, assignment);\n}\n\nfunction polygonShape(points: { x: number; y: number }[]): THREE.Shape | null {\n return polygonToThreeShape(points);\n}\n\nexport interface LevelMeshesProps {\n level: PublishedLevel;\n /** All floors — used to pick EscalatorUp / EscalatorDown from the linked landing. */\n levels?: readonly PublishedLevel[];\n theme: ThemeDefaults;\n is3d: boolean;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n /** Assign-map selection — same highlight as hover so staff can see the set. */\n selectedShapeIds?: readonly number[];\n /** Rail / search hover — same darker fill as pointer hover. */\n hoveredShapeId?: number | null;\n /** Host that owns pointer events (and therefore the CSS cursor). */\n eventSource?: React.RefObject<HTMLElement | null>;\n /** Tracks pointer travel so pan-release on a store is not treated as a click. */\n pointerGestureRef?: React.RefObject<ViewerPointerGesture>;\n /**\n * When true (outdoor with live SVG), only interactive shapes are drawn —\n * decoration comes from SvgVectorLayer.\n */\n interactiveOnly?: boolean;\n /** Same media proxy as outdoor SVGs — remote retailer logos only, not data URLs. */\n imageProxyUrl?: string | null;\n /** Published amenity catalog — used to resolve v1 amenity icons by code. */\n amenities?: CmAmenityCatalogItem[];\n /** Live / published retailers — logo-only stores have no label text. */\n retailers?: PublishedRetailer[];\n /** Public hosts hide unassigned amenity / kiosk / elevator / escalator polygons. */\n host?: MapViewerHost;\n /** Assigned kiosk shape currently running this DISPLAY_APP viewer. */\n kioskOriginShapeId?: number | null;\n /** WEBSITE / DISPLAY_APP store and amenity name pop-out. */\n showHoverTooltip?: boolean;\n onHoverTooltip?: ViewerHoverTooltipHandler;\n}\n\nfunction HoverOutline({\n shape,\n extrude,\n color,\n}: {\n shape: THREE.Shape;\n extrude: number;\n color: string;\n}) {\n const sourceGeometry = useMemo(\n () =>\n extrude > 0\n ? new THREE.ExtrudeGeometry(shape, {\n depth: extrude,\n bevelEnabled: false,\n })\n : new THREE.ShapeGeometry(shape),\n [extrude, shape],\n );\n\n useEffect(() => () => sourceGeometry.dispose(), [sourceGeometry]);\n\n return (\n <lineSegments renderOrder={40}>\n <edgesGeometry args={[sourceGeometry]} />\n <lineBasicMaterial color={color} depthTest={false} />\n </lineSegments>\n );\n}\n\nfunction CurrentLocationPulse({\n position,\n}: {\n position: [number, number, number];\n}) {\n return (\n <Html\n position={position}\n center\n zIndexRange={[10, 0]}\n style={{ pointerEvents: 'none' }}\n >\n <span\n className=\"eyeon-map-current-location-marker\"\n aria-hidden=\"true\"\n />\n </Html>\n );\n}\n\nexport function LevelMeshes({\n level,\n levels,\n theme,\n is3d,\n onSelectShape,\n selectedShapeIds = [],\n hoveredShapeId: hoveredShapeIdProp = null,\n eventSource,\n pointerGestureRef,\n interactiveOnly = false,\n imageProxyUrl = null,\n amenities = [],\n retailers = [],\n host = 'PORTAL_ASSIGN',\n kioskOriginShapeId = null,\n showHoverTooltip = false,\n onHoverTooltip,\n}: LevelMeshesProps) {\n const [pointerHoverId, setPointerHoverId] = useState<number | null>(null);\n const hoveredShapeId = resolvedViewerHoverId(\n hoveredShapeIdProp,\n pointerHoverId,\n );\n useEffect(\n () => () => {\n applyViewerHoverCursor(eventSource?.current, '');\n onHoverTooltip?.(null);\n },\n [eventSource, onHoverTooltip],\n );\n const publishHoverTooltip = (\n shape: PublishedLevel['shapes'][number],\n event: {\n buttons?: number;\n offsetX?: number;\n offsetY?: number;\n nativeEvent?: { offsetX?: number; offsetY?: number; buttons?: number };\n },\n ) => {\n if (!showHoverTooltip || !onHoverTooltip) return;\n const buttons = event.buttons ?? event.nativeEvent?.buttons ?? 0;\n if (buttons > 0) {\n onHoverTooltip(null);\n return;\n }\n const offset = viewerPointerOffset(event);\n const text = viewerHoverTooltipLabel(shape, retailers, amenities);\n if (!offset || !text) {\n onHoverTooltip(null, { leavingShapeId: shape.id });\n return;\n }\n onHoverTooltip({ shapeId: shape.id, text, x: offset.x, y: offset.y });\n };\n\n const openings = useMemo(() => voidPolygonsOnLevel(level), [level]);\n const assignedConnectorIds = useMemo(\n () => assignedConnectorShapeIds(level.anchors),\n [level.anchors],\n );\n const visibleShapes = useMemo(\n () =>\n level.shapes.filter((s) =>\n viewerShapeVisibleOnHost(s, host, assignedConnectorIds),\n ),\n [assignedConnectorIds, host, level.shapes],\n );\n const meshes = useMemo(() => {\n return visibleShapes\n .filter((s) => s.kind !== 'void')\n .filter((s) => !(s.kind === 'label' && s.label?.text?.trim()))\n .filter((s) => !isEntranceIcon(s))\n .filter(\n (s) =>\n !interactiveOnly ||\n INTERACTIVE_SHAPE_KINDS.includes(s.kind) ||\n (s.kind === 'label' && Boolean(s.label?.text?.trim())) ||\n (s.kind === 'walkable' && !resolveLayerStyle(s.sourceSvgId)),\n )\n .filter((s) => !s.orphanedAt)\n .map((shape) => {\n const radius = shape.kind === 'unit' ? theme.STORE_RADIUS : 0;\n const punch = isSlabShapeKind(shape.kind) && openings.length > 0;\n const polys = shape.geometry.polygons.map((poly) =>\n radius > 0 ? filletPolygon(poly, radius) : poly,\n );\n const threeShapes = polys\n .map((poly) =>\n punch ? slabShapeWithHoles(poly, openings) : polygonShape(poly),\n )\n .filter((s): s is THREE.Shape => s != null);\n if (threeShapes.length === 0) return null;\n\n const color = kindColor(\n shape.kind,\n theme,\n host,\n shape.style.fill,\n shape.assignment,\n );\n const extrude =\n is3d && (shape.kind === 'unit' || shape.kind === 'wall')\n ? shape.style.extrudeHeight ??\n (shape.kind === 'unit' ? theme.STORE_HEIGHT : 2)\n : 0;\n\n return { shape, threeShapes, color, extrude };\n })\n .filter(Boolean) as Array<{\n shape: (typeof visibleShapes)[number];\n threeShapes: THREE.Shape[];\n color: string;\n extrude: number;\n }>;\n }, [visibleShapes, theme, is3d, interactiveOnly, openings, host]);\n\n const labels = useMemo(\n () =>\n visibleShapes.filter(\n (s) => !s.orphanedAt && s.kind === 'label' && Boolean(s.label?.text?.trim()),\n ),\n [visibleShapes],\n );\n\n const entranceIcons = useMemo(\n () => visibleShapes.filter((s) => !s.orphanedAt && isEntranceIcon(s)),\n [visibleShapes],\n );\n\n const overlays = useMemo(\n () =>\n visibleShapes.filter(\n (s) =>\n !s.orphanedAt &&\n s.kind !== 'label' &&\n !isEntranceIcon(s) &&\n assignmentOverlayVisible(s.assignment, s.label),\n ),\n [visibleShapes],\n );\n\n const connectorOverlays = useMemo(() => {\n return visibleShapes.flatMap((shape) => {\n const kind = connectorMapIconKind(shape, assignedConnectorIds);\n if (!kind) return [];\n const layout = connectorIconLayout(shape);\n const iconColor = resolvedAssignmentIconColor(\n shape.assignment,\n theme,\n layout.iconColor,\n shape.kind,\n );\n const travel =\n kind === 'escalator'\n ? escalatorLandingTravel(shape.id, level.id, levels ?? [level])\n : null;\n const url = connectorMapIconDataUrl(kind, true, iconColor, travel);\n if (!url) return [];\n const box = geometryBBox(shape.geometry);\n return [\n {\n shape,\n url,\n width: layout.size,\n rotation: (layout.rotate * Math.PI) / 180,\n x: (box.minX + box.maxX) / 2 + layout.offsetX,\n y: (box.minY + box.maxY) / 2 + layout.offsetY,\n },\n ];\n });\n }, [assignedConnectorIds, level.id, levels, theme, visibleShapes]);\n\n return (\n <group>\n {labels.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const align = normalizeLabelAlign(shape.label.align);\n const cx = (box.minX + box.maxX) / 2;\n const cy = (box.minY + box.maxY) / 2;\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n return (\n <group\n key={`label-${shape.id}`}\n position={[cx, cy, 0.15]}\n rotation={[0, 0, tilt]}\n >\n <Text\n font={MAP_FONT_URL}\n position={[labelAlignX(box, align) - cx, 0, 0]}\n fontSize={shape.label.size ?? 24}\n color={shape.label.color ?? theme.STORE_TEXT_COLOR}\n anchorX={align}\n anchorY=\"middle\"\n textAlign={align}\n lineHeight={MAP_LABEL_LINE_HEIGHT}\n scale={[1, -1, 1]}\n >\n {shape.label.text}\n </Text>\n </group>\n );\n })}\n {entranceIcons.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const cx = (box.minX + box.maxX) / 2 + (shape.label.offsetX ?? 0);\n const cy = (box.minY + box.maxY) / 2 + (shape.label.offsetY ?? 0);\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n const size = shape.label.size || DEFAULT_ENTRANCE_SIZE;\n const url = entranceIconDataUrl(\n shape.label.color ?? theme.STORE_TEXT_COLOR,\n );\n if (!url) return null;\n return (\n <AssignmentImageOverlay\n key={`entrance-${shape.id}`}\n url={url}\n width={size}\n position={[cx, cy, 0.18]}\n rotation={tilt}\n />\n );\n })}\n {overlays.map((shape) => {\n const box = geometryBBox(shape.geometry);\n const cx = (box.minX + box.maxX) / 2 + (shape.label.offsetX ?? 0);\n const cy = (box.minY + box.maxY) / 2 + (shape.label.offsetY ?? 0);\n const tilt = ((shape.label.rotate ?? 0) * Math.PI) / 180;\n const fontSize = shape.label.size || shape.assignment?.size || DEFAULT_ASSIGNMENT_SIZE;\n const extrude =\n is3d && (shape.kind === 'unit' || shape.kind === 'wall')\n ? shape.style.extrudeHeight ??\n (shape.kind === 'unit' ? theme.STORE_HEIGHT : 2)\n : 0;\n const z = extrude > 0 ? extrude + 0.15 : 0.2;\n const iconColor = resolvedAssignmentIconColor(\n shape.assignment,\n theme,\n shape.label.color,\n shape.kind,\n );\n const imageKey =\n assignmentOverlayImageUrl(shape.assignment, null, shape.label) ??\n assignmentSpecialIconDataUrl(\n shape.assignment,\n amenities,\n iconColor,\n );\n const text = shape.label.text?.trim();\n const align = normalizeLabelAlign(shape.label.align);\n const position: [number, number, number] = [cx, cy, z];\n return (\n <React.Fragment key={`overlay-${shape.id}`}>\n {imageKey ? (\n <AssignmentImageOverlay\n url={imageKey}\n width={assignmentOverlayRenderSize(fontSize, shape.assignment)}\n position={position}\n rotation={tilt}\n imageProxyUrl={imageProxyUrl}\n />\n ) : (\n <Text\n font={MAP_FONT_URL}\n position={position}\n rotation={[0, 0, tilt]}\n fontSize={fontSize}\n color={iconColor}\n anchorX=\"center\"\n anchorY=\"middle\"\n textAlign={align}\n lineHeight={MAP_LABEL_LINE_HEIGHT}\n scale={[1, -1, 1]}\n raycast={skipRaycast}\n >\n {text}\n </Text>\n )}\n {shape.id === kioskOriginShapeId ? (\n <CurrentLocationPulse position={[cx, cy, z + 0.02]} />\n ) : null}\n </React.Fragment>\n );\n })}\n {connectorOverlays.map(({ shape, url, width, rotation, x, y }) => (\n <AssignmentImageOverlay\n key={`connector-icon-${shape.id}`}\n url={url}\n width={width}\n position={[x, y, 0.22]}\n rotation={rotation}\n />\n ))}\n <OpeningWells polygons={openings} />\n {meshes.map(({ shape, threeShapes, color, extrude }) => {\n const selectable = isViewerInteractiveShape(\n shape.kind,\n host,\n shape.assignment,\n );\n const hovered =\n selectable &&\n viewerShapeHighlighted(shape.id, hoveredShapeId, selectedShapeIds);\n const baseOpacity = viewerShapeBaseOpacity(\n shape.kind,\n shape.style.opacity,\n );\n const fillTransparent = isTransparentColor(color);\n const opacity = fillTransparent\n ? hovered\n ? 0.2\n : 0\n : viewerHoverFillOpacity(\n shape.kind,\n baseOpacity,\n hovered,\n );\n const emphasisFill = darkenShapeFill(\n fillTransparent ? theme.STORE_DEFAULT_COLOR : color,\n );\n const fill = hovered\n ? emphasisFill\n : fillTransparent\n ? '#000000'\n : color;\n return (\n <group key={shape.id}>\n {threeShapes.map((geoShape, idx) => (\n <mesh\n key={`${shape.id}-${idx}`}\n position={[0, 0, shape.zIndex * 0.01]}\n onPointerOver={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n setPointerHoverId(shape.id);\n applyViewerHoverCursor(\n eventSource?.current,\n viewerHoverCursor(shape.kind, host, shape.assignment),\n );\n publishHoverTooltip(shape, e);\n }}\n onPointerMove={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n publishHoverTooltip(shape, e);\n }}\n onPointerOut={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n setPointerHoverId((id) => (id === shape.id ? null : id));\n applyViewerHoverCursor(eventSource?.current, '');\n if (showHoverTooltip) {\n onHoverTooltip?.(null, { leavingShapeId: shape.id });\n }\n }}\n onPointerDown={(e) => {\n const additive = Boolean(\n e.shiftKey ||\n (e.nativeEvent as MouseEvent | undefined)?.shiftKey,\n );\n if (additive) e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n const maxDist = pointerGestureRef?.current.maxDist ?? 0;\n if (!viewerPointerClickIsTap(maxDist, e.delta)) return;\n if (selectable) {\n onSelectShape?.(shape.id, {\n additive: Boolean(\n e.shiftKey ||\n (e.nativeEvent as MouseEvent | undefined)?.shiftKey,\n ),\n });\n return;\n }\n onSelectShape?.(null);\n }}\n >\n {extrude > 0 ? (\n <extrudeGeometry\n args={[\n geoShape,\n { depth: extrude, bevelEnabled: false },\n ]}\n />\n ) : (\n <shapeGeometry args={[geoShape]} />\n )}\n <meshBasicMaterial\n color={fill}\n transparent={\n shape.style.transparent ||\n shape.kind === 'amenity' ||\n opacity < 1\n }\n opacity={opacity}\n side={THREE.DoubleSide}\n />\n {hovered ? (\n <HoverOutline\n shape={geoShape}\n extrude={extrude}\n color={emphasisFill}\n />\n ) : null}\n </mesh>\n ))}\n </group>\n );\n })}\n </group>\n );\n}\n\nfunction skipRaycast() {}\n\nfunction loadCanvasTexture(\n url: string,\n signal?: AbortSignal,\n): Promise<{ texture: THREE.CanvasTexture; aspect: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const cleanup = () => {\n signal?.removeEventListener('abort', onAbort);\n img.onload = null;\n img.onerror = null;\n };\n const onAbort = () => {\n cleanup();\n img.src = '';\n reject(new DOMException('Image load aborted', 'AbortError'));\n };\n if (signal?.aborted) {\n onAbort();\n return;\n }\n signal?.addEventListener('abort', onAbort, { once: true });\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n cleanup();\n const width = img.naturalWidth || img.width;\n const height = img.naturalHeight || img.height;\n if (!width || !height) {\n reject(new Error('empty image'));\n return;\n }\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n reject(new Error('canvas'));\n return;\n }\n ctx.drawImage(img, 0, 0);\n const texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n texture.needsUpdate = true;\n resolve({ texture, aspect: height / width });\n };\n img.onerror = () => {\n cleanup();\n reject(new Error(`Failed to load ${url}`));\n };\n img.src = url;\n });\n}\n\nfunction AssignmentImageOverlay({\n url,\n width,\n position,\n rotation,\n imageProxyUrl,\n}: {\n url: string;\n width: number;\n position: [number, number, number];\n rotation: number;\n imageProxyUrl?: string | null;\n}) {\n const [texture, setTexture] = useState<THREE.CanvasTexture | null>(null);\n const [aspect, setAspect] = useState(1);\n\n useEffect(() => {\n let disposed = false;\n let loaded: THREE.CanvasTexture | null = null;\n const controller = new AbortController();\n setTexture(null);\n const proxied = resolveFetchUrl(url, imageProxyUrl);\n const candidates = proxied === url ? [url] : [proxied, url];\n const load = async () => {\n let lastError: unknown;\n for (const src of candidates) {\n try {\n const next = await loadCanvasTexture(src, controller.signal);\n if (disposed) {\n next.texture.dispose();\n return;\n }\n loaded = next.texture;\n setAspect(next.aspect);\n setTexture(next.texture);\n return;\n } catch (error) {\n if (controller.signal.aborted) return;\n lastError = error;\n }\n }\n if (!disposed) {\n setTexture(null);\n if (lastError) console.warn('Retail logo failed to load', url, lastError);\n }\n };\n void load();\n return () => {\n disposed = true;\n controller.abort();\n loaded?.dispose();\n };\n }, [url, imageProxyUrl]);\n\n if (!texture || width <= 0) return null;\n\n return (\n <mesh\n position={position}\n rotation={[0, 0, rotation]}\n scale={[1, -1, 1]}\n renderOrder={30}\n raycast={skipRaycast}\n >\n <planeGeometry args={[width, width * aspect]} />\n <meshBasicMaterial\n map={texture}\n transparent\n depthTest={false}\n depthWrite={false}\n side={THREE.DoubleSide}\n toneMapped={false}\n />\n </mesh>\n );\n}\n","import type { PathResult, Vec2 } from '../core';\n\nexport type RouteChangeIntent = 'forward' | 'back';\n\nexport interface RouteLevelChangeMarker {\n x: number;\n y: number;\n displayX: number;\n displayY: number;\n connectorId: number | null;\n targetLevelId: number;\n /** v1 label: To = continue toward the destination, From = go back. */\n direction: 'To' | 'From';\n intent: RouteChangeIntent;\n}\n\nexport const ROUTE_CHANGE_MARKER_GAP = 44;\nexport const ROUTE_CHANGE_MARKER_CLUSTER = 8;\n\nexport function routeOriginLevelId(\n route: PathResult | null | undefined,\n): number | null {\n return route?.points[0]?.levelId ?? null;\n}\n\n/** Pin the camera to the start floor only when the trip itself changes. */\nexport function shouldPinViewToRouteOrigin(\n previousFrom: number | null,\n previousTo: number | null,\n nextFrom: number | null,\n nextTo: number | null,\n): boolean {\n if (nextFrom == null || nextTo == null) return false;\n return previousFrom !== nextFrom || previousTo !== nextTo;\n}\n\nexport function routeVisitedLevelIds(route: PathResult): number[] {\n const ids: number[] = [];\n for (const point of route.points) {\n if (ids[ids.length - 1] !== point.levelId) ids.push(point.levelId);\n }\n return ids;\n}\n\nexport function routeChangeLabel(\n intent: RouteChangeIntent,\n floorName: string,\n): string {\n return intent === 'forward' ? `Continue to ${floorName}` : `Back to ${floorName}`;\n}\n\nexport function routePointsOnLevel(\n route: PathResult,\n levelId: number,\n): Vec2[] {\n return route.points\n .filter((point) => point.levelId === levelId)\n .map((point) => ({ x: point.x, y: point.y }));\n}\n\n/** Contiguous walks on one floor — a later revisit starts a new segment. */\nexport function routeSegmentsForLevel(\n route: PathResult,\n levelId: number,\n): Vec2[][] {\n const segments: Vec2[][] = [];\n let current: Vec2[] = [];\n for (const point of route.points) {\n if (point.levelId === levelId) {\n current.push({ x: point.x, y: point.y });\n continue;\n }\n if (current.length > 0) {\n segments.push(current);\n current = [];\n }\n }\n if (current.length > 0) segments.push(current);\n return segments;\n}\n\nfunction markerDistance(a: Vec2, b: Vec2): number {\n return Math.hypot(a.x - b.x, a.y - b.y);\n}\n\nexport function layoutRouteLevelChangeMarkers<\n T extends { x: number; y: number; intent: RouteChangeIntent },\n>(markers: T[]): Array<T & { displayX: number; displayY: number }> {\n const placed = markers.map((marker) => ({\n ...marker,\n displayX: marker.x,\n displayY: marker.y,\n }));\n const used = new Set<number>();\n\n for (let i = 0; i < placed.length; i += 1) {\n if (used.has(i)) continue;\n const group = [i];\n for (let j = i + 1; j < placed.length; j += 1) {\n if (used.has(j)) continue;\n if (markerDistance(placed[i], placed[j]) <= ROUTE_CHANGE_MARKER_CLUSTER) {\n group.push(j);\n }\n }\n for (const index of group) used.add(index);\n\n if (group.length === 1) continue;\n\n const ordered = [...group].sort((a, b) => {\n const rank = (intent: RouteChangeIntent) => (intent === 'back' ? 0 : 1);\n return rank(placed[a].intent) - rank(placed[b].intent);\n });\n const span = ROUTE_CHANGE_MARKER_GAP * (ordered.length - 1);\n ordered.forEach((index, offset) => {\n placed[index].displayX =\n placed[index].x - span / 2 + offset * ROUTE_CHANGE_MARKER_GAP;\n placed[index].displayY = placed[index].y;\n });\n }\n\n return placed;\n}\n\nexport function routeLevelChangeMarkers(\n route: PathResult,\n levelId: number,\n): RouteLevelChangeMarker[] {\n const raw: Array<Omit<RouteLevelChangeMarker, 'displayX' | 'displayY'>> = [];\n let changeIndex = 0;\n for (let index = 1; index < route.points.length; index += 1) {\n const from = route.points[index - 1];\n const to = route.points[index];\n if (from.levelId === to.levelId) continue;\n const change = route.levelChanges[changeIndex];\n changeIndex += 1;\n if (from.levelId === levelId) {\n raw.push({\n x: from.x,\n y: from.y,\n connectorId: change?.connectorId ?? null,\n targetLevelId: to.levelId,\n direction: 'To',\n intent: 'forward',\n });\n } else if (to.levelId === levelId) {\n raw.push({\n x: to.x,\n y: to.y,\n connectorId: change?.connectorId ?? null,\n targetLevelId: from.levelId,\n direction: 'From',\n intent: 'back',\n });\n }\n }\n return layoutRouteLevelChangeMarkers(raw);\n}\n","import React, { useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport { Html } from '@react-three/drei';\nimport * as THREE from 'three';\nimport type { CmConnector, PathResult } from '../../core';\nimport {\n DEFAULT_THEME,\n isTransparentColor,\n isVerticalRouteConnectorKind,\n} from '../../core';\nimport {\n connectorMapIconDataUrl,\n levelTravel,\n} from '../../specialIcons';\nimport {\n routeChangeLabel,\n routeLevelChangeMarkers,\n routePointsOnLevel,\n routeSegmentsForLevel,\n type RouteLevelChangeMarker,\n} from '../routeFloorChanges';\n\nexport const V1_ROUTE_COLOR = '#4ea5ff';\nexport const V1_ROUTE_RADIUS = 6;\nexport const V1_ROUTE_TUBULAR_SEGMENTS = 400;\nexport const V1_ROUTE_RADIAL_SEGMENTS = 8;\nexport const V1_ROUTE_REVEAL_MS = 1000;\nexport const V1_ROUTE_TEXTURE_MS = 2000;\n\nexport {\n routeChangeLabel,\n routeLevelChangeMarkers,\n routeSegmentsForLevel,\n type RouteLevelChangeMarker,\n} from '../routeFloorChanges';\n\nexport function routePointsForLevel(\n route: PathResult,\n levelId: number,\n): THREE.Vector3[] {\n return routePointsOnLevel(route, levelId).map(\n (point) => new THREE.Vector3(point.x, point.y, 0),\n );\n}\n\nexport function resolveRouteColor(color?: string | null): string {\n if (!color || isTransparentColor(color)) return V1_ROUTE_COLOR;\n return color;\n}\n\nexport const ROUTE_CHANGE_RING_COLOR = '#444444';\n\nexport function resolveRouteChangeCircleColor(): string {\n return ROUTE_CHANGE_RING_COLOR;\n}\n\nexport function resolveRouteThickness(thickness?: number | null): number {\n if (thickness == null || !Number.isFinite(thickness) || thickness <= 0) {\n return DEFAULT_THEME.ROUTE_THICKNESS;\n }\n return thickness;\n}\n\nconst _routeScale = new THREE.Vector3();\nconst _routeWorldPoint = new THREE.Vector3();\n\n/**\n * World-space tube radius that keeps `screenRadius` pixels on screen.\n * Orthographic: `1 / zoom` world units per CSS pixel.\n * Perspective: uses vertical fov, camera distance, and viewport height.\n * `worldScale` undoes a parent level transform so the line stays the same\n * after the group scale is applied.\n */\nexport function routeWorldRadiusForView(options: {\n screenRadius: number;\n orthoZoom?: number;\n perspectiveFov?: number;\n perspectiveDistance?: number;\n viewportHeight?: number;\n worldScale?: number;\n}): number {\n const screenRadius = Math.max(options.screenRadius, 0);\n let world = screenRadius;\n const zoom = options.orthoZoom;\n if (zoom != null && Number.isFinite(zoom) && zoom > 0) {\n world = screenRadius / zoom;\n } else if (\n options.perspectiveFov != null &&\n options.perspectiveDistance != null &&\n options.viewportHeight != null &&\n options.perspectiveFov > 0 &&\n options.perspectiveDistance > 0 &&\n options.viewportHeight > 0\n ) {\n const worldHeight =\n 2 *\n Math.tan((options.perspectiveFov * Math.PI) / 360) *\n options.perspectiveDistance;\n world = (screenRadius * worldHeight) / options.viewportHeight;\n }\n const scale = Math.abs(options.worldScale ?? 1);\n return world / Math.max(scale, 1e-6);\n}\n\nexport function routeWorldRadiusForCamera(\n camera: THREE.Camera,\n screenRadius: number,\n viewportHeight: number,\n worldScale: number,\n samplePoint?: THREE.Vector3,\n): number {\n if (camera instanceof THREE.OrthographicCamera) {\n return routeWorldRadiusForView({\n screenRadius,\n orthoZoom: camera.zoom,\n worldScale,\n });\n }\n if (camera instanceof THREE.PerspectiveCamera) {\n const distance = samplePoint\n ? camera.position.distanceTo(samplePoint)\n : camera.position.length();\n return routeWorldRadiusForView({\n screenRadius,\n perspectiveFov: camera.fov,\n perspectiveDistance: Math.max(distance, 1e-6),\n viewportHeight,\n worldScale,\n });\n }\n return routeWorldRadiusForView({ screenRadius, worldScale });\n}\n\n/** Tube vertices sit `baseRadius` along their normals from the path. */\nexport function applyRouteTubeRadius(\n geometry: THREE.BufferGeometry,\n basePositions: ArrayLike<number>,\n baseRadius: number,\n targetRadius: number,\n): void {\n const position = geometry.getAttribute('position');\n const normal = geometry.getAttribute('normal');\n if (!position || !normal) return;\n const delta = targetRadius - baseRadius;\n for (let i = 0; i < position.count; i += 1) {\n const i3 = i * 3;\n position.setXYZ(\n i,\n basePositions[i3] + normal.getX(i) * delta,\n basePositions[i3 + 1] + normal.getY(i) * delta,\n basePositions[i3 + 2] + normal.getZ(i) * delta,\n );\n }\n position.needsUpdate = true;\n}\n\nfunction createRouteTexture(distance: number, color: string): THREE.CanvasTexture {\n const canvas = document.createElement('canvas');\n const width = Math.max(1, Math.floor(distance));\n canvas.width = width;\n canvas.height = 80;\n const context = canvas.getContext('2d');\n\n if (context) {\n context.fillStyle = color;\n context.fillRect(0, 0, width, canvas.height);\n\n const gradientWidth = Math.min(120, Math.max(60, distance * 0.1));\n const gradient = context.createLinearGradient(0, 0, gradientWidth, 0);\n gradient.addColorStop(0, color);\n gradient.addColorStop(0.4, 'white');\n gradient.addColorStop(0.6, 'white');\n gradient.addColorStop(1, color);\n context.fillStyle = gradient;\n context.fillRect(10, 0, gradientWidth, canvas.height);\n }\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.offset.x = 1;\n texture.colorSpace = THREE.SRGBColorSpace;\n return texture;\n}\n\nfunction easeInOutCubic(value: number): number {\n const x = Math.min(1, Math.max(0, value));\n return x < 0.5 ? 4 * x ** 3 : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nfunction RouteTube({\n points,\n color,\n radius,\n}: {\n points: THREE.Vector3[];\n color: string;\n radius: number;\n}) {\n const invalidate = useThree((state) => state.invalidate);\n const camera = useThree((state) => state.camera);\n const viewportHeight = useThree((state) => state.size.height);\n const meshRef = useRef<THREE.Mesh>(null);\n const animationStartedAt = useRef(0);\n const appliedRadius = useRef<number | null>(null);\n const routeShape = useMemo(() => {\n if (points.length < 2) return null;\n const path = new THREE.CurvePath<THREE.Vector3>();\n let distance = 0;\n for (let index = 1; index < points.length; index += 1) {\n path.add(new THREE.LineCurve3(points[index - 1], points[index]));\n distance += points[index - 1].distanceTo(points[index]);\n }\n const geometry = new THREE.TubeGeometry(\n path,\n V1_ROUTE_TUBULAR_SEGMENTS,\n radius,\n V1_ROUTE_RADIAL_SEGMENTS,\n );\n geometry.setDrawRange(0, 0);\n return {\n distance,\n geometry,\n texture: createRouteTexture(distance, color),\n basePositions: new Float32Array(geometry.attributes.position.array),\n baseRadius: radius,\n };\n }, [color, points, radius]);\n\n const syncScreenRadius = () => {\n const mesh = meshRef.current;\n if (!routeShape || !mesh) return;\n const worldScale = Math.abs(mesh.getWorldScale(_routeScale).x);\n _routeWorldPoint.copy(points[0]);\n mesh.localToWorld(_routeWorldPoint);\n const target = routeWorldRadiusForCamera(\n camera,\n radius,\n viewportHeight,\n worldScale,\n _routeWorldPoint,\n );\n if (appliedRadius.current === target) return;\n applyRouteTubeRadius(\n routeShape.geometry,\n routeShape.basePositions,\n routeShape.baseRadius,\n target,\n );\n appliedRadius.current = target;\n };\n\n useLayoutEffect(() => {\n appliedRadius.current = null;\n syncScreenRadius();\n }, [camera, radius, routeShape, viewportHeight]);\n\n useEffect(() => {\n if (!routeShape) return;\n animationStartedAt.current = performance.now();\n routeShape.geometry.setDrawRange(0, 0);\n routeShape.texture.offset.x = 1;\n invalidate();\n return () => {\n routeShape.geometry.dispose();\n routeShape.texture.dispose();\n };\n }, [invalidate, routeShape]);\n\n useFrame(() => {\n if (!routeShape) return;\n syncScreenRadius();\n const elapsed = performance.now() - animationStartedAt.current;\n const indexCount = routeShape.geometry.index?.count ?? 0;\n if (elapsed < V1_ROUTE_REVEAL_MS) {\n const progress = easeInOutCubic(elapsed / V1_ROUTE_REVEAL_MS);\n routeShape.geometry.setDrawRange(0, Math.floor(progress * indexCount));\n } else {\n routeShape.geometry.setDrawRange(0, indexCount);\n const progress = (elapsed / V1_ROUTE_TEXTURE_MS) % 1;\n routeShape.texture.offset.x = 0.1 - 1.1 * easeInOutCubic(progress);\n }\n invalidate();\n });\n\n if (!routeShape) return null;\n return (\n <mesh ref={meshRef} geometry={routeShape.geometry} renderOrder={20}>\n <meshBasicMaterial\n map={routeShape.texture}\n transparent\n side={THREE.DoubleSide}\n depthTest={false}\n depthWrite={false}\n />\n </mesh>\n );\n}\n\nfunction RouteChangeButton({\n change,\n levelId,\n levels,\n connectors,\n color,\n onActiveLevelChange,\n}: {\n change: RouteLevelChangeMarker;\n levelId: number;\n levels?: ReadonlyArray<{\n id: number;\n name: string;\n levelIndex?: number;\n ordering?: number;\n }>;\n connectors?: readonly CmConnector[];\n color: string;\n onActiveLevelChange?: (levelId: number) => void;\n}) {\n const connector = connectors?.find((item) => item.id === change.connectorId);\n const iconKind = isVerticalRouteConnectorKind(connector?.kind)\n ? connector.kind\n : null;\n const here = levels?.find((item) => item.id === levelId);\n const there = levels?.find((item) => item.id === change.targetLevelId);\n const travel =\n iconKind === 'escalator' && here && there\n ? levelTravel(here, there)\n : null;\n const icon = iconKind\n ? connectorMapIconDataUrl(iconKind, true, '#ffffff', travel)\n : undefined;\n const targetName =\n levels?.find((level) => level.id === change.targetLevelId)?.name ??\n String(change.targetLevelId);\n const label = routeChangeLabel(change.intent, targetName);\n const ringColor = resolveRouteChangeCircleColor();\n return (\n <Html\n position={[change.displayX, change.displayY, 7]}\n zIndexRange={[30, 20]}\n style={{ pointerEvents: 'none' }}\n >\n <button\n type=\"button\"\n className={`eyeon-map-route-change eyeon-map-route-change--${change.intent}`}\n style={\n {\n backgroundColor: color,\n borderColor: ringColor,\n '--eyeon-route-change-intent': ringColor,\n pointerEvents: 'auto',\n } as React.CSSProperties\n }\n aria-label={label}\n onClick={(event) => {\n event.stopPropagation();\n onActiveLevelChange?.(change.targetLevelId);\n }}\n >\n <span className=\"eyeon-map-route-change__icon\">\n {icon ? <img src={icon} alt=\"\" /> : <span aria-hidden>↕</span>}\n </span>\n <span className=\"eyeon-map-route-change__intent\" aria-hidden>\n {change.intent === 'forward' ? '→' : '←'}\n </span>\n <span className=\"eyeon-map-hover-tooltip eyeon-map-route-change__tooltip\">\n <span className=\"eyeon-map-hover-tooltip__pop\">\n <span className=\"eyeon-map-hover-tooltip__label\">{label}</span>\n <span className=\"eyeon-map-hover-tooltip__arrow\" aria-hidden=\"true\" />\n </span>\n </span>\n </button>\n </Html>\n );\n}\n\nexport function RouteLine({\n route,\n levelId,\n levels,\n connectors,\n color,\n thickness,\n onActiveLevelChange,\n}: {\n route: PathResult;\n levelId: number;\n levels?: ReadonlyArray<{\n id: number;\n name: string;\n levelIndex?: number;\n ordering?: number;\n }>;\n connectors?: readonly CmConnector[];\n color?: string;\n thickness?: number;\n onActiveLevelChange?: (levelId: number) => void;\n}) {\n const routeColor = resolveRouteColor(color);\n const routeRadius = resolveRouteThickness(thickness);\n const segments = useMemo(\n () =>\n routeSegmentsForLevel(route, levelId).map((segment) =>\n segment.map((point) => new THREE.Vector3(point.x, point.y, 0)),\n ),\n [levelId, route],\n );\n const levelChanges = useMemo(\n () => routeLevelChangeMarkers(route, levelId),\n [levelId, route],\n );\n\n if (segments.every((segment) => segment.length < 2) && levelChanges.length === 0) {\n return null;\n }\n\n return (\n <>\n {segments.map((points, index) =>\n points.length >= 2 ? (\n <RouteTube\n key={`route-seg-${levelId}-${index}`}\n points={points}\n color={routeColor}\n radius={routeRadius}\n />\n ) : null,\n )}\n {levelChanges.map((change, index) => (\n <RouteChangeButton\n key={`${change.intent}-${change.targetLevelId}-${index}`}\n change={change}\n levelId={levelId}\n levels={levels}\n connectors={connectors}\n color={routeColor}\n onActiveLevelChange={onActiveLevelChange}\n />\n ))}\n </>\n );\n}\n","import {\n\tBox2,\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tMatrix3,\n\tPath,\n\tShape,\n\tShapePath,\n\tShapeUtils,\n\tSRGBColorSpace,\n\tVector2,\n\tVector3\n} from 'three';\n\nconst COLOR_SPACE_SVG = SRGBColorSpace;\n\n/**\n * A loader for the SVG format.\n *\n * Scalable Vector Graphics is an XML-based vector image format for two-dimensional graphics\n * with support for interactivity and animation.\n *\n * ```js\n * const loader = new SVGLoader();\n * const data = await loader.loadAsync( 'data/svgSample.svg' );\n *\n * const paths = data.paths;\n * const group = new THREE.Group();\n *\n * for ( let i = 0; i < paths.length; i ++ ) {\n *\n * \tconst path = paths[ i ];\n * \tconst material = new THREE.MeshBasicMaterial( {\n * \t\tcolor: path.color,\n * \t\tside: THREE.DoubleSide,\n * \t\tdepthWrite: false\n * \t} );\n *\n * \tconst shapes = SVGLoader.createShapes( path );\n *\n * \tfor ( let j = 0; j < shapes.length; j ++ ) {\n *\n * \t\tconst shape = shapes[ j ];\n * \t\tconst geometry = new THREE.ShapeGeometry( shape );\n * \t\tconst mesh = new THREE.Mesh( geometry, material );\n * \t\tgroup.add( mesh );\n *\n * \t}\n *\n * }\n *\n * scene.add( group );\n * ```\n *\n * @augments Loader\n * @three_import import { SVGLoader } from 'three/addons/loaders/SVGLoader.js';\n */\nclass SVGLoader extends Loader {\n\n\t/**\n\t * Constructs a new SVG loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Default dots per inch.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 90\n\t\t */\n\t\tthis.defaultDPI = 90;\n\n\t\t/**\n\t\t * Default unit.\n\t\t *\n\t\t * @type {('mm'|'cm'|'in'|'pt'|'pc'|'px')}\n\t\t * @default 'px'\n\t\t */\n\t\tthis.defaultUnit = 'px';\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded SVG asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({paths:Array<ShapePath>,xml:string})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given SVG data and returns the resulting data.\n\t *\n\t * @param {string} text - The raw SVG data as a string.\n\t * @return {{paths:Array<ShapePath>,xml:string}} An object holding an array of shape paths and the\n\t * SVG XML document.\n\t */\n\tparse( text ) {\n\n\t\tconst scope = this;\n\n\t\tfunction parseNode( node, style ) {\n\n\t\t\tif ( node.nodeType !== 1 ) return;\n\n\t\t\tconst transform = getNodeTransform( node );\n\n\t\t\tlet isDefsNode = false;\n\n\t\t\tlet path = null;\n\n\t\t\tswitch ( node.nodeName ) {\n\n\t\t\t\tcase 'svg':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'style':\n\t\t\t\t\tparseCSSStylesheet( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'g':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'path':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tif ( node.hasAttribute( 'd' ) ) path = parsePathNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rect':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseRectNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polygon':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolygonNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polyline':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolylineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'circle':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseCircleNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ellipse':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseEllipseNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'line':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseLineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'defs':\n\t\t\t\t\tisDefsNode = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'use':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\n\t\t\t\t\tconst href = node.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ) || '';\n\t\t\t\t\tconst usedNodeId = href.substring( 1 );\n\t\t\t\t\tconst usedNode = node.viewportElement.getElementById( usedNodeId );\n\t\t\t\t\tif ( usedNode ) {\n\n\t\t\t\t\t\tparseNode( usedNode, style );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'SVGLoader: \\'use node\\' references non-existent node id: ' + usedNodeId );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// console.log( node );\n\n\t\t\t}\n\n\t\t\tif ( path ) {\n\n\t\t\t\tif ( style.fill !== undefined && style.fill !== 'none' ) {\n\n\t\t\t\t\tpath.color.setStyle( style.fill, COLOR_SPACE_SVG );\n\n\t\t\t\t}\n\n\t\t\t\ttransformPath( path, currentTransform );\n\n\t\t\t\tpaths.push( path );\n\n\t\t\t\tpath.userData = { node: node, style: style };\n\n\t\t\t}\n\n\t\t\tconst childNodes = node.childNodes;\n\n\t\t\tfor ( let i = 0; i < childNodes.length; i ++ ) {\n\n\t\t\t\tconst node = childNodes[ i ];\n\n\t\t\t\tif ( isDefsNode && node.nodeName !== 'style' && node.nodeName !== 'defs' ) {\n\n\t\t\t\t\t// Ignore everything in defs except CSS style definitions\n\t\t\t\t\t// and nested defs, because it is OK by the standard to have\n\t\t\t\t\t// <style/> there.\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tparseNode( node, style );\n\n\t\t\t}\n\n\n\t\t\tif ( transform ) {\n\n\t\t\t\ttransformStack.pop();\n\n\t\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\t\tcurrentTransform.copy( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parsePathNode( node ) {\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tconst point = new Vector2();\n\t\t\tconst control = new Vector2();\n\n\t\t\tconst firstPoint = new Vector2();\n\t\t\tlet isFirstPoint = true;\n\t\t\tlet doSetFirstPoint = false;\n\n\t\t\tconst d = node.getAttribute( 'd' );\n\n\t\t\tif ( d === '' || d === 'none' ) return null;\n\n\t\t\t// console.log( d );\n\n\t\t\tconst commands = d.match( /[a-df-z][^a-df-z]*/ig );\n\n\t\t\tfor ( let i = 0, l = commands.length; i < l; i ++ ) {\n\n\t\t\t\tconst command = commands[ i ];\n\n\t\t\t\tconst type = command.charAt( 0 );\n\t\t\t\tconst data = command.slice( 1 ).trim();\n\n\t\t\t\tif ( isFirstPoint === true ) {\n\n\t\t\t\t\tdoSetFirstPoint = true;\n\t\t\t\t\tisFirstPoint = false;\n\n\t\t\t\t}\n\n\t\t\t\tlet numbers;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'M':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'H':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'V':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'L':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'C':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 4 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'S':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'T':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if start point == end point\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == point.x && numbers[ j + 6 ] == point.y ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'h':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'l':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 4 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = point.y + numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if no displacement\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == 0 && numbers[ j + 6 ] == 0 ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\tcase 'z':\n\t\t\t\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\t\t\t\tif ( path.currentPath.curves.length > 0 ) {\n\n\t\t\t\t\t\t\t// Reset point to beginning of Path\n\t\t\t\t\t\t\tpoint.copy( firstPoint );\n\t\t\t\t\t\t\tpath.currentPath.currentPoint.copy( point );\n\t\t\t\t\t\t\tisFirstPoint = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( command );\n\n\t\t\t\t}\n\n\t\t\t\t// console.log( type, parseFloats( data ), parseFloats( data ).length )\n\n\t\t\t\tdoSetFirstPoint = false;\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCSSStylesheet( node ) {\n\n\t\t\tif ( ! node.sheet || ! node.sheet.cssRules || ! node.sheet.cssRules.length ) return;\n\n\t\t\tfor ( let i = 0; i < node.sheet.cssRules.length; i ++ ) {\n\n\t\t\t\tconst stylesheet = node.sheet.cssRules[ i ];\n\n\t\t\t\tif ( stylesheet.type !== 1 ) continue;\n\n\t\t\t\tconst selectorList = stylesheet.selectorText\n\t\t\t\t\t.split( /,/gm )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let j = 0; j < selectorList.length; j ++ ) {\n\n\t\t\t\t\t// Remove empty rules\n\t\t\t\t\tconst definitions = Object.fromEntries(\n\t\t\t\t\t\tObject.entries( stylesheet.style ).filter( ( [ , v ] ) => v !== '' )\n\t\t\t\t\t);\n\n\t\t\t\t\tstylesheets[ selectorList[ j ] ] = Object.assign(\n\t\t\t\t\t\tstylesheets[ selectorList[ j ] ] || {},\n\t\t\t\t\t\tdefinitions\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes\n\t\t * https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion\n\t\t * From\n\t\t * rx ry x-axis-rotation large-arc-flag sweep-flag x y\n\t\t * To\n\t\t * aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation\n\t\t */\n\n\t\tfunction parseArcCommand( path, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, start, end ) {\n\n\t\t\tif ( rx == 0 || ry == 0 ) {\n\n\t\t\t\t// draw a line if either of the radii == 0\n\t\t\t\tpath.lineTo( end.x, end.y );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tx_axis_rotation = x_axis_rotation * Math.PI / 180;\n\n\t\t\t// Ensure radii are positive\n\t\t\trx = Math.abs( rx );\n\t\t\try = Math.abs( ry );\n\n\t\t\t// Compute (x1', y1')\n\t\t\tconst dx2 = ( start.x - end.x ) / 2.0;\n\t\t\tconst dy2 = ( start.y - end.y ) / 2.0;\n\t\t\tconst x1p = Math.cos( x_axis_rotation ) * dx2 + Math.sin( x_axis_rotation ) * dy2;\n\t\t\tconst y1p = - Math.sin( x_axis_rotation ) * dx2 + Math.cos( x_axis_rotation ) * dy2;\n\n\t\t\t// Compute (cx', cy')\n\t\t\tlet rxs = rx * rx;\n\t\t\tlet rys = ry * ry;\n\t\t\tconst x1ps = x1p * x1p;\n\t\t\tconst y1ps = y1p * y1p;\n\n\t\t\t// Ensure radii are large enough\n\t\t\tconst cr = x1ps / rxs + y1ps / rys;\n\n\t\t\tif ( cr > 1 ) {\n\n\t\t\t\t// scale up rx,ry equally so cr == 1\n\t\t\t\tconst s = Math.sqrt( cr );\n\t\t\t\trx = s * rx;\n\t\t\t\try = s * ry;\n\t\t\t\trxs = rx * rx;\n\t\t\t\trys = ry * ry;\n\n\t\t\t}\n\n\t\t\tconst dq = ( rxs * y1ps + rys * x1ps );\n\t\t\tconst pq = ( rxs * rys - dq ) / dq;\n\t\t\tlet q = Math.sqrt( Math.max( 0, pq ) );\n\t\t\tif ( large_arc_flag === sweep_flag ) q = - q;\n\t\t\tconst cxp = q * rx * y1p / ry;\n\t\t\tconst cyp = - q * ry * x1p / rx;\n\n\t\t\t// Step 3: Compute (cx, cy) from (cx', cy')\n\t\t\tconst cx = Math.cos( x_axis_rotation ) * cxp - Math.sin( x_axis_rotation ) * cyp + ( start.x + end.x ) / 2;\n\t\t\tconst cy = Math.sin( x_axis_rotation ) * cxp + Math.cos( x_axis_rotation ) * cyp + ( start.y + end.y ) / 2;\n\n\t\t\t// Step 4: Compute θ1 and Δθ\n\t\t\tconst theta = svgAngle( 1, 0, ( x1p - cxp ) / rx, ( y1p - cyp ) / ry );\n\t\t\tconst delta = svgAngle( ( x1p - cxp ) / rx, ( y1p - cyp ) / ry, ( - x1p - cxp ) / rx, ( - y1p - cyp ) / ry ) % ( Math.PI * 2 );\n\n\t\t\tpath.currentPath.absellipse( cx, cy, rx, ry, theta, theta + delta, sweep_flag === 0, x_axis_rotation );\n\n\t\t}\n\n\t\tfunction svgAngle( ux, uy, vx, vy ) {\n\n\t\t\tconst dot = ux * vx + uy * vy;\n\t\t\tconst len = Math.sqrt( ux * ux + uy * uy ) * Math.sqrt( vx * vx + vy * vy );\n\t\t\tlet ang = Math.acos( Math.max( - 1, Math.min( 1, dot / len ) ) ); // floating point precision, slightly over values appear\n\t\t\tif ( ( ux * vy - uy * vx ) < 0 ) ang = - ang;\n\t\t\treturn ang;\n\n\t\t}\n\n\t\t/*\n\t\t* According to https://www.w3.org/TR/SVG/shapes.html#RectElementRXAttribute\n\t\t* rounded corner should be rendered to elliptical arc, but bezier curve does the job well enough\n\t\t*/\n\n\t\tfunction parseRectNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'x' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'y' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || node.getAttribute( 'ry' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst w = parseFloatWithUnits( node.getAttribute( 'width' ) );\n\t\t\tconst h = parseFloatWithUnits( node.getAttribute( 'height' ) );\n\n\t\t\t// Ellipse arc to Bezier approximation Coefficient (Inversed). See:\n\t\t\t// https://spencermortensen.com/articles/bezier-circle/\n\t\t\tconst bci = 1 - 0.551915024494;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\t// top left\n\t\t\tpath.moveTo( x + rx, y );\n\n\t\t\t// top right\n\t\t\tpath.lineTo( x + w - rx, y );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry * bci,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom right\n\t\t\tpath.lineTo( x + w, y + h - ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx + w - rx,\n\t\t\t\t\ty + h\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom left\n\t\t\tpath.lineTo( x + rx, y + h );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// back to top left\n\t\t\tpath.lineTo( x, y + ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo( x, y + ry * bci, x + rx * bci, y, x + rx, y );\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolygonNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolylineNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCircleNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst r = parseFloatWithUnits( node.getAttribute( 'r' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absarc( x, y, r, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseEllipseNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absellipse( x, y, rx, ry, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseLineNode( node ) {\n\n\t\t\tconst x1 = parseFloatWithUnits( node.getAttribute( 'x1' ) || 0 );\n\t\t\tconst y1 = parseFloatWithUnits( node.getAttribute( 'y1' ) || 0 );\n\t\t\tconst x2 = parseFloatWithUnits( node.getAttribute( 'x2' ) || 0 );\n\t\t\tconst y2 = parseFloatWithUnits( node.getAttribute( 'y2' ) || 0 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.moveTo( x1, y1 );\n\t\t\tpath.lineTo( x2, y2 );\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction parseStyle( node, style ) {\n\n\t\t\tstyle = Object.assign( {}, style ); // clone style\n\n\t\t\tlet stylesheetStyles = {};\n\n\t\t\tif ( node.hasAttribute( 'class' ) ) {\n\n\t\t\t\tconst classSelectors = node.getAttribute( 'class' )\n\t\t\t\t\t.split( /\\s/ )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let i = 0; i < classSelectors.length; i ++ ) {\n\n\t\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '.' + classSelectors[ i ] ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'id' ) ) {\n\n\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '#' + node.getAttribute( 'id' ) ] );\n\n\t\t\t}\n\n\t\t\tfunction addStyle( svgName, jsName, adjustFunction ) {\n\n\t\t\t\tif ( adjustFunction === undefined ) adjustFunction = function copy( v ) {\n\n\t\t\t\t\tif ( v.startsWith( 'url' ) ) console.warn( 'SVGLoader: url access in attributes is not implemented.' );\n\n\t\t\t\t\treturn v;\n\n\t\t\t\t};\n\n\t\t\t\tif ( node.hasAttribute( svgName ) ) style[ jsName ] = adjustFunction( node.getAttribute( svgName ) );\n\t\t\t\tif ( stylesheetStyles[ svgName ] ) style[ jsName ] = adjustFunction( stylesheetStyles[ svgName ] );\n\t\t\t\tif ( node.style && node.style[ svgName ] !== '' ) style[ jsName ] = adjustFunction( node.style[ svgName ] );\n\n\t\t\t}\n\n\t\t\tfunction clamp( v ) {\n\n\t\t\t\treturn Math.max( 0, Math.min( 1, parseFloatWithUnits( v ) ) );\n\n\t\t\t}\n\n\t\t\tfunction positive( v ) {\n\n\t\t\t\treturn Math.max( 0, parseFloatWithUnits( v ) );\n\n\t\t\t}\n\n\t\t\taddStyle( 'fill', 'fill' );\n\t\t\taddStyle( 'fill-opacity', 'fillOpacity', clamp );\n\t\t\taddStyle( 'fill-rule', 'fillRule' );\n\t\t\taddStyle( 'opacity', 'opacity', clamp );\n\t\t\taddStyle( 'stroke', 'stroke' );\n\t\t\taddStyle( 'stroke-opacity', 'strokeOpacity', clamp );\n\t\t\taddStyle( 'stroke-width', 'strokeWidth', positive );\n\t\t\taddStyle( 'stroke-linejoin', 'strokeLineJoin' );\n\t\t\taddStyle( 'stroke-linecap', 'strokeLineCap' );\n\t\t\taddStyle( 'stroke-miterlimit', 'strokeMiterLimit', positive );\n\t\t\taddStyle( 'visibility', 'visibility' );\n\n\t\t\treturn style;\n\n\t\t}\n\n\t\t// http://www.w3.org/TR/SVG11/implnote.html#PathElementImplementationNotes\n\n\t\tfunction getReflection( a, b ) {\n\n\t\t\treturn a - ( b - a );\n\n\t\t}\n\n\t\t// from https://github.com/ppvg/svg-numbers (MIT License)\n\n\t\tfunction parseFloats( input, flags, stride ) {\n\n\t\t\tif ( typeof input !== 'string' ) {\n\n\t\t\t\tthrow new TypeError( 'Invalid input: ' + typeof input );\n\n\t\t\t}\n\n\t\t\t// Character groups\n\t\t\tconst RE = {\n\t\t\t\tSEPARATOR: /[ \\t\\r\\n\\,.\\-+]/,\n\t\t\t\tWHITESPACE: /[ \\t\\r\\n]/,\n\t\t\t\tDIGIT: /[\\d]/,\n\t\t\t\tSIGN: /[-+]/,\n\t\t\t\tPOINT: /\\./,\n\t\t\t\tCOMMA: /,/,\n\t\t\t\tEXP: /e/i,\n\t\t\t\tFLAGS: /[01]/\n\t\t\t};\n\n\t\t\t// States\n\t\t\tconst SEP = 0;\n\t\t\tconst INT = 1;\n\t\t\tconst FLOAT = 2;\n\t\t\tconst EXP = 3;\n\n\t\t\tlet state = SEP;\n\t\t\tlet seenComma = true;\n\t\t\tlet number = '', exponent = '';\n\t\t\tconst result = [];\n\n\t\t\tfunction throwSyntaxError( current, i, partial ) {\n\n\t\t\t\tconst error = new SyntaxError( 'Unexpected character \"' + current + '\" at index ' + i + '.' );\n\t\t\t\terror.partial = partial;\n\t\t\t\tthrow error;\n\n\t\t\t}\n\n\t\t\tfunction newNumber() {\n\n\t\t\t\tif ( number !== '' ) {\n\n\t\t\t\t\tif ( exponent === '' ) result.push( Number( number ) );\n\t\t\t\t\telse result.push( Number( number ) * Math.pow( 10, Number( exponent ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tnumber = '';\n\t\t\t\texponent = '';\n\n\t\t\t}\n\n\t\t\tlet current;\n\t\t\tconst length = input.length;\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tcurrent = input[ i ];\n\n\t\t\t\t// check for flags\n\t\t\t\tif ( Array.isArray( flags ) && flags.includes( result.length % stride ) && RE.FLAGS.test( current ) ) {\n\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// parse until next number\n\t\t\t\tif ( state === SEP ) {\n\n\t\t\t\t\t// eat whitespace\n\t\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// start new number\n\t\t\t\t\tif ( RE.DIGIT.test( current ) || RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tstate = INT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double commas (e.g. \"1, , 2\")\n\t\t\t\t\tif ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\t\tif ( seenComma ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tseenComma = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse integer part\n\t\t\t\tif ( state === INT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double signs (\"-+1\"), but not on sign as separator (\"-1-2\")\n\t\t\t\t\tif ( RE.SIGN.test( current )\n\t\t\t\t\t\t\t&& number.length === 1\n\t\t\t\t\t\t\t&& RE.SIGN.test( number[ 0 ] ) ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse decimal part\n\t\t\t\tif ( state === FLOAT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double decimal points (e.g. \"1..2\")\n\t\t\t\t\tif ( RE.POINT.test( current ) && number[ number.length - 1 ] === '.' ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse exponent part\n\t\t\t\tif ( state === EXP ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tif ( exponent === '' ) {\n\n\t\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( exponent.length === 1 && RE.SIGN.test( exponent ) ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t// end of number\n\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = false;\n\n\t\t\t\t} else if ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = true;\n\n\t\t\t\t} else if ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else if ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add the last number found (if any)\n\t\t\tnewNumber();\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\t// Units\n\n\t\tconst units = [ 'mm', 'cm', 'in', 'pt', 'pc', 'px' ];\n\n\t\t// Conversion: [ fromUnit ][ toUnit ] (-1 means dpi dependent)\n\t\tconst unitConversion = {\n\n\t\t\t'mm': {\n\t\t\t\t'mm': 1,\n\t\t\t\t'cm': 0.1,\n\t\t\t\t'in': 1 / 25.4,\n\t\t\t\t'pt': 72 / 25.4,\n\t\t\t\t'pc': 6 / 25.4,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'cm': {\n\t\t\t\t'mm': 10,\n\t\t\t\t'cm': 1,\n\t\t\t\t'in': 1 / 2.54,\n\t\t\t\t'pt': 72 / 2.54,\n\t\t\t\t'pc': 6 / 2.54,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'in': {\n\t\t\t\t'mm': 25.4,\n\t\t\t\t'cm': 2.54,\n\t\t\t\t'in': 1,\n\t\t\t\t'pt': 72,\n\t\t\t\t'pc': 6,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pt': {\n\t\t\t\t'mm': 25.4 / 72,\n\t\t\t\t'cm': 2.54 / 72,\n\t\t\t\t'in': 1 / 72,\n\t\t\t\t'pt': 1,\n\t\t\t\t'pc': 6 / 72,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pc': {\n\t\t\t\t'mm': 25.4 / 6,\n\t\t\t\t'cm': 2.54 / 6,\n\t\t\t\t'in': 1 / 6,\n\t\t\t\t'pt': 72 / 6,\n\t\t\t\t'pc': 1,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'px': {\n\t\t\t\t'px': 1\n\t\t\t}\n\n\t\t};\n\n\t\tfunction parseFloatWithUnits( string ) {\n\n\t\t\tlet theUnit = 'px';\n\n\t\t\tif ( typeof string === 'string' || string instanceof String ) {\n\n\t\t\t\tfor ( let i = 0, n = units.length; i < n; i ++ ) {\n\n\t\t\t\t\tconst u = units[ i ];\n\n\t\t\t\t\tif ( string.endsWith( u ) ) {\n\n\t\t\t\t\t\ttheUnit = u;\n\t\t\t\t\t\tstring = string.substring( 0, string.length - u.length );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet scale = undefined;\n\n\t\t\tif ( theUnit === 'px' && scope.defaultUnit !== 'px' ) {\n\n\t\t\t\t// Conversion scale from pixels to inches, then to default units\n\n\t\t\t\tscale = unitConversion[ 'in' ][ scope.defaultUnit ] / scope.defaultDPI;\n\n\t\t\t} else {\n\n\t\t\t\tscale = unitConversion[ theUnit ][ scope.defaultUnit ];\n\n\t\t\t\tif ( scale < 0 ) {\n\n\t\t\t\t\t// Conversion scale to pixels\n\n\t\t\t\t\tscale = unitConversion[ theUnit ][ 'in' ] * scope.defaultDPI;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn scale * parseFloat( string );\n\n\t\t}\n\n\t\t// Transforms\n\n\t\tfunction getNodeTransform( node ) {\n\n\t\t\tif ( ! ( node.hasAttribute( 'transform' ) || ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) ) ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst transform = parseNodeTransform( node );\n\n\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\ttransform.premultiply( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tcurrentTransform.copy( transform );\n\t\t\ttransformStack.push( transform );\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction parseNodeTransform( node ) {\n\n\t\t\tconst transform = new Matrix3();\n\t\t\tconst currentTransform = tempTransform0;\n\n\t\t\tif ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) {\n\n\t\t\t\tconst tx = parseFloatWithUnits( node.getAttribute( 'x' ) );\n\t\t\t\tconst ty = parseFloatWithUnits( node.getAttribute( 'y' ) );\n\n\t\t\t\ttransform.translate( tx, ty );\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'transform' ) ) {\n\n\t\t\t\tconst transformsTexts = node.getAttribute( 'transform' ).split( ')' );\n\n\t\t\t\tfor ( let tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex -- ) {\n\n\t\t\t\t\tconst transformText = transformsTexts[ tIndex ].trim();\n\n\t\t\t\t\tif ( transformText === '' ) continue;\n\n\t\t\t\t\tconst openParPos = transformText.indexOf( '(' );\n\t\t\t\t\tconst closeParPos = transformText.length;\n\n\t\t\t\t\tif ( openParPos > 0 && openParPos < closeParPos ) {\n\n\t\t\t\t\t\tconst transformType = transformText.slice( 0, openParPos );\n\n\t\t\t\t\t\tconst array = parseFloats( transformText.slice( openParPos + 1 ) );\n\n\t\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t\t\tswitch ( transformType ) {\n\n\t\t\t\t\t\t\tcase 'translate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst tx = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet ty = 0;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tty = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.translate( tx, ty );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'rotate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tlet angle = 0;\n\t\t\t\t\t\t\t\t\tlet cx = 0;\n\t\t\t\t\t\t\t\t\tlet cy = 0;\n\n\t\t\t\t\t\t\t\t\t// Angle\n\t\t\t\t\t\t\t\t\tangle = array[ 0 ] * Math.PI / 180;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 3 ) {\n\n\t\t\t\t\t\t\t\t\t\t// Center x, y\n\t\t\t\t\t\t\t\t\t\tcx = array[ 1 ];\n\t\t\t\t\t\t\t\t\t\tcy = array[ 2 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Rotate around center (cx, cy)\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( - cx, - cy );\n\t\t\t\t\t\t\t\t\ttempTransform2.makeRotation( angle );\n\t\t\t\t\t\t\t\t\ttempTransform3.multiplyMatrices( tempTransform2, tempTransform1 );\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( cx, cy );\n\t\t\t\t\t\t\t\t\tcurrentTransform.multiplyMatrices( tempTransform1, tempTransform3 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'scale':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst scaleX = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet scaleY = scaleX;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tscaleY = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.scale( scaleX, scaleY );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewX':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, Math.tan( array[ 0 ] * Math.PI / 180 ), 0,\n\t\t\t\t\t\t\t\t\t\t0, 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewY':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, 0, 0,\n\t\t\t\t\t\t\t\t\t\tMath.tan( array[ 0 ] * Math.PI / 180 ), 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'matrix':\n\n\t\t\t\t\t\t\t\tif ( array.length === 6 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\tarray[ 0 ], array[ 2 ], array[ 4 ],\n\t\t\t\t\t\t\t\t\t\tarray[ 1 ], array[ 3 ], array[ 5 ],\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttransform.premultiply( currentTransform );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction transformPath( path, m ) {\n\n\t\t\tfunction transfVec2( v2 ) {\n\n\t\t\t\ttempV3.set( v2.x, v2.y, 1 ).applyMatrix3( m );\n\n\t\t\t\tv2.set( tempV3.x, tempV3.y );\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseGeneric( curve ) {\n\n\t\t\t\t// For math description see:\n\t\t\t\t// https://math.stackexchange.com/questions/4544164\n\n\t\t\t\tconst a = curve.xRadius;\n\t\t\t\tconst b = curve.yRadius;\n\n\t\t\t\tconst cosTheta = Math.cos( curve.aRotation );\n\t\t\t\tconst sinTheta = Math.sin( curve.aRotation );\n\n\t\t\t\tconst v1 = new Vector3( a * cosTheta, a * sinTheta, 0 );\n\t\t\t\tconst v2 = new Vector3( - b * sinTheta, b * cosTheta, 0 );\n\n\t\t\t\tconst f1 = v1.applyMatrix3( m );\n\t\t\t\tconst f2 = v2.applyMatrix3( m );\n\n\t\t\t\tconst mF = tempTransform0.set(\n\t\t\t\t\tf1.x, f2.x, 0,\n\t\t\t\t\tf1.y, f2.y, 0,\n\t\t\t\t\t0, 0, 1,\n\t\t\t\t);\n\n\t\t\t\tconst mFInv = tempTransform1.copy( mF ).invert();\n\t\t\t\tconst mFInvT = tempTransform2.copy( mFInv ).transpose();\n\t\t\t\tconst mQ = mFInvT.multiply( mFInv );\n\t\t\t\tconst mQe = mQ.elements;\n\n\t\t\t\tconst ed = eigenDecomposition( mQe[ 0 ], mQe[ 1 ], mQe[ 4 ] );\n\t\t\t\tconst rt1sqrt = Math.sqrt( ed.rt1 );\n\t\t\t\tconst rt2sqrt = Math.sqrt( ed.rt2 );\n\n\t\t\t\tcurve.xRadius = 1 / rt1sqrt;\n\t\t\t\tcurve.yRadius = 1 / rt2sqrt;\n\t\t\t\tcurve.aRotation = Math.atan2( ed.sn, ed.cs );\n\n\t\t\t\tconst isFullEllipse =\n\t\t\t\t\t( curve.aEndAngle - curve.aStartAngle ) % ( 2 * Math.PI ) < Number.EPSILON;\n\n\t\t\t\t// Do not touch angles of a full ellipse because after transformation they\n\t\t\t\t// would converge to a single value effectively removing the whole curve\n\n\t\t\t\tif ( ! isFullEllipse ) {\n\n\t\t\t\t\tconst mDsqrt = tempTransform1.set(\n\t\t\t\t\t\trt1sqrt, 0, 0,\n\t\t\t\t\t\t0, rt2sqrt, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mRT = tempTransform2.set(\n\t\t\t\t\t\ted.cs, ed.sn, 0,\n\t\t\t\t\t\t- ed.sn, ed.cs, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mDRF = mDsqrt.multiply( mRT ).multiply( mF );\n\n\t\t\t\t\tconst transformAngle = phi => {\n\n\t\t\t\t\t\tconst { x: cosR, y: sinR } =\n\t\t\t\t\t\t\tnew Vector3( Math.cos( phi ), Math.sin( phi ), 0 ).applyMatrix3( mDRF );\n\n\t\t\t\t\t\treturn Math.atan2( sinR, cosR );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tcurve.aStartAngle = transformAngle( curve.aStartAngle );\n\t\t\t\t\tcurve.aEndAngle = transformAngle( curve.aEndAngle );\n\n\t\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseNoSkew( curve ) {\n\n\t\t\t\t// Faster shortcut if no skew is applied\n\t\t\t\t// (e.g, a euclidean transform of a group containing the ellipse)\n\n\t\t\t\tconst sx = getTransformScaleX( m );\n\t\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\t\tcurve.xRadius *= sx;\n\t\t\t\tcurve.yRadius *= sy;\n\n\t\t\t\t// Extract rotation angle from the matrix of form:\n\t\t\t\t//\n\t\t\t\t// | cosθ sx -sinθ sy |\n\t\t\t\t// | sinθ sx cosθ sy |\n\t\t\t\t//\n\t\t\t\t// Remembering that tanθ = sinθ / cosθ; and that\n\t\t\t\t// `sx`, `sy`, or both might be zero.\n\t\t\t\tconst theta =\n\t\t\t\t\tsx > Number.EPSILON\n\t\t\t\t\t\t? Math.atan2( m.elements[ 1 ], m.elements[ 0 ] )\n\t\t\t\t\t\t: Math.atan2( - m.elements[ 3 ], m.elements[ 4 ] );\n\n\t\t\t\tcurve.aRotation += theta;\n\n\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\tcurve.aStartAngle *= - 1;\n\t\t\t\t\tcurve.aEndAngle *= - 1;\n\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst subPaths = path.subPaths;\n\n\t\t\tfor ( let i = 0, n = subPaths.length; i < n; i ++ ) {\n\n\t\t\t\tconst subPath = subPaths[ i ];\n\t\t\t\tconst curves = subPath.curves;\n\n\t\t\t\tfor ( let j = 0; j < curves.length; j ++ ) {\n\n\t\t\t\t\tconst curve = curves[ j ];\n\n\t\t\t\t\tif ( curve.isLineCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isCubicBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\t\t\t\t\t\ttransfVec2( curve.v3 );\n\n\t\t\t\t\t} else if ( curve.isQuadraticBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isEllipseCurve ) {\n\n\t\t\t\t\t\t// Transform ellipse center point\n\n\t\t\t\t\t\ttempV2.set( curve.aX, curve.aY );\n\t\t\t\t\t\ttransfVec2( tempV2 );\n\t\t\t\t\t\tcurve.aX = tempV2.x;\n\t\t\t\t\t\tcurve.aY = tempV2.y;\n\n\t\t\t\t\t\t// Transform ellipse shape parameters\n\n\t\t\t\t\t\tif ( isTransformSkewed( m ) ) {\n\n\t\t\t\t\t\t\ttransfEllipseGeneric( curve );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttransfEllipseNoSkew( curve );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction isTransformFlipped( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn te[ 0 ] * te[ 4 ] - te[ 1 ] * te[ 3 ] < 0;\n\n\t\t}\n\n\t\tfunction isTransformSkewed( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\tconst basisDot = te[ 0 ] * te[ 3 ] + te[ 1 ] * te[ 4 ];\n\n\t\t\t// Shortcut for trivial rotations and transformations\n\t\t\tif ( basisDot === 0 ) return false;\n\n\t\t\tconst sx = getTransformScaleX( m );\n\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\treturn Math.abs( basisDot / ( sx * sy ) ) > Number.EPSILON;\n\n\t\t}\n\n\t\tfunction getTransformScaleX( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] );\n\n\t\t}\n\n\t\tfunction getTransformScaleY( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 3 ] * te[ 3 ] + te[ 4 ] * te[ 4 ] );\n\n\t\t}\n\n\t\t// Calculates the eigensystem of a real symmetric 2x2 matrix\n\t\t// [ A B ]\n\t\t// [ B C ]\n\t\t// in the form\n\t\t// [ A B ] = [ cs -sn ] [ rt1 0 ] [ cs sn ]\n\t\t// [ B C ] [ sn cs ] [ 0 rt2 ] [ -sn cs ]\n\t\t// where rt1 >= rt2.\n\t\t//\n\t\t// Adapted from: https://www.mpi-hd.mpg.de/personalhomes/globes/3x3/index.html\n\t\t// -> Algorithms for real symmetric matrices -> Analytical (2x2 symmetric)\n\t\tfunction eigenDecomposition( A, B, C ) {\n\n\t\t\tlet rt1, rt2, cs, sn, t;\n\t\t\tconst sm = A + C;\n\t\t\tconst df = A - C;\n\t\t\tconst rt = Math.sqrt( df * df + 4 * B * B );\n\n\t\t\tif ( sm > 0 ) {\n\n\t\t\t\trt1 = 0.5 * ( sm + rt );\n\t\t\t\tt = 1 / rt1;\n\t\t\t\trt2 = A * t * C - B * t * B;\n\n\t\t\t} else if ( sm < 0 ) {\n\n\t\t\t\trt2 = 0.5 * ( sm - rt );\n\n\t\t\t} else {\n\n\t\t\t\t// This case needs to be treated separately to avoid div by 0\n\n\t\t\t\trt1 = 0.5 * rt;\n\t\t\t\trt2 = - 0.5 * rt;\n\n\t\t\t}\n\n\t\t\t// Calculate eigenvectors\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tcs = df + rt;\n\n\t\t\t} else {\n\n\t\t\t\tcs = df - rt;\n\n\t\t\t}\n\n\t\t\tif ( Math.abs( cs ) > 2 * Math.abs( B ) ) {\n\n\t\t\t\tt = - 2 * B / cs;\n\t\t\t\tsn = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tcs = t * sn;\n\n\t\t\t} else if ( Math.abs( B ) === 0 ) {\n\n\t\t\t\tcs = 1;\n\t\t\t\tsn = 0;\n\n\t\t\t} else {\n\n\t\t\t\tt = - 0.5 * cs / B;\n\t\t\t\tcs = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tsn = t * cs;\n\n\t\t\t}\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tt = cs;\n\t\t\t\tcs = - sn;\n\t\t\t\tsn = t;\n\n\t\t\t}\n\n\t\t\treturn { rt1, rt2, cs, sn };\n\n\t\t}\n\n\t\t//\n\n\t\tconst paths = [];\n\t\tconst stylesheets = {};\n\n\t\tconst transformStack = [];\n\n\t\tconst tempTransform0 = new Matrix3();\n\t\tconst tempTransform1 = new Matrix3();\n\t\tconst tempTransform2 = new Matrix3();\n\t\tconst tempTransform3 = new Matrix3();\n\t\tconst tempV2 = new Vector2();\n\t\tconst tempV3 = new Vector3();\n\n\t\tconst currentTransform = new Matrix3();\n\n\t\tconst xml = new DOMParser().parseFromString( text, 'image/svg+xml' ); // application/xml\n\n\t\tparseNode( xml.documentElement, {\n\t\t\tfill: '#000',\n\t\t\tfillOpacity: 1,\n\t\t\tstrokeOpacity: 1,\n\t\t\tstrokeWidth: 1,\n\t\t\tstrokeLineJoin: 'miter',\n\t\t\tstrokeLineCap: 'butt',\n\t\t\tstrokeMiterLimit: 4\n\t\t} );\n\n\t\tconst data = { paths: paths, xml: xml.documentElement };\n\n\t\t// console.log( paths );\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Creates from the given shape path and array of shapes.\n\t *\n\t * @param {ShapePath} shapePath - The shape path.\n\t * @return {Array<Shape>} An array of shapes.\n\t */\n\tstatic createShapes( shapePath ) {\n\n\t\tconst BIGNUMBER = 999999999;\n\n\t\tconst IntersectionLocationType = {\n\t\t\tORIGIN: 0,\n\t\t\tDESTINATION: 1,\n\t\t\tBETWEEN: 2,\n\t\t\tLEFT: 3,\n\t\t\tRIGHT: 4,\n\t\t\tBEHIND: 5,\n\t\t\tBEYOND: 6\n\t\t};\n\n\t\tconst classifyResult = {\n\t\t\tloc: IntersectionLocationType.ORIGIN,\n\t\t\tt: 0\n\t\t};\n\n\t\tfunction findEdgeIntersection( a0, a1, b0, b1 ) {\n\n\t\t\tconst x1 = a0.x;\n\t\t\tconst x2 = a1.x;\n\t\t\tconst x3 = b0.x;\n\t\t\tconst x4 = b1.x;\n\t\t\tconst y1 = a0.y;\n\t\t\tconst y2 = a1.y;\n\t\t\tconst y3 = b0.y;\n\t\t\tconst y4 = b1.y;\n\t\t\tconst nom1 = ( x4 - x3 ) * ( y1 - y3 ) - ( y4 - y3 ) * ( x1 - x3 );\n\t\t\tconst nom2 = ( x2 - x1 ) * ( y1 - y3 ) - ( y2 - y1 ) * ( x1 - x3 );\n\t\t\tconst denom = ( y4 - y3 ) * ( x2 - x1 ) - ( x4 - x3 ) * ( y2 - y1 );\n\t\t\tconst t1 = nom1 / denom;\n\t\t\tconst t2 = nom2 / denom;\n\n\t\t\tif ( ( ( denom === 0 ) && ( nom1 !== 0 ) ) || ( t1 <= 0 ) || ( t1 >= 1 ) || ( t2 < 0 ) || ( t2 > 1 ) ) {\n\n\t\t\t\t//1. lines are parallel or edges don't intersect\n\n\t\t\t\treturn null;\n\n\t\t\t} else if ( ( nom1 === 0 ) && ( denom === 0 ) ) {\n\n\t\t\t\t//2. lines are colinear\n\n\t\t\t\t//check if endpoints of edge2 (b0-b1) lies on edge1 (a0-a1)\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\t\t\t\t\t//find position of this endpoints relatively to edge1\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t} else if ( classifyResult.loc == IntersectionLocationType.BETWEEN ) {\n\n\t\t\t\t\t\tconst x = + ( ( x1 + classifyResult.t * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\tconst y = + ( ( y1 + classifyResult.t * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\treturn { x: x, y: y, t: classifyResult.t, };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t} else {\n\n\t\t\t\t//3. edges intersect\n\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst x = + ( ( x1 + t1 * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\tconst y = + ( ( y1 + t1 * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\treturn { x: x, y: y, t: t1 };\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction classifyPoint( p, edgeStart, edgeEnd ) {\n\n\t\t\tconst ax = edgeEnd.x - edgeStart.x;\n\t\t\tconst ay = edgeEnd.y - edgeStart.y;\n\t\t\tconst bx = p.x - edgeStart.x;\n\t\t\tconst by = p.y - edgeStart.y;\n\t\t\tconst sa = ax * by - bx * ay;\n\n\t\t\tif ( ( p.x === edgeStart.x ) && ( p.y === edgeStart.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.ORIGIN;\n\t\t\t\tclassifyResult.t = 0;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( p.x === edgeEnd.x ) && ( p.y === edgeEnd.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.DESTINATION;\n\t\t\t\tclassifyResult.t = 1;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa < - Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.LEFT;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa > Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.RIGHT;\n\t\t\t\treturn;\n\n\n\t\t\t}\n\n\t\t\tif ( ( ( ax * bx ) < 0 ) || ( ( ay * by ) < 0 ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEHIND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( Math.sqrt( ax * ax + ay * ay ) ) < ( Math.sqrt( bx * bx + by * by ) ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEYOND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet t;\n\n\t\t\tif ( ax !== 0 ) {\n\n\t\t\t\tt = bx / ax;\n\n\t\t\t} else {\n\n\t\t\t\tt = by / ay;\n\n\t\t\t}\n\n\t\t\tclassifyResult.loc = IntersectionLocationType.BETWEEN;\n\t\t\tclassifyResult.t = t;\n\n\t\t}\n\n\t\tfunction getIntersections( path1, path2 ) {\n\n\t\t\tconst intersectionsRaw = [];\n\t\t\tconst intersections = [];\n\n\t\t\tfor ( let index = 1; index < path1.length; index ++ ) {\n\n\t\t\t\tconst path1EdgeStart = path1[ index - 1 ];\n\t\t\t\tconst path1EdgeEnd = path1[ index ];\n\n\t\t\t\tfor ( let index2 = 1; index2 < path2.length; index2 ++ ) {\n\n\t\t\t\t\tconst path2EdgeStart = path2[ index2 - 1 ];\n\t\t\t\t\tconst path2EdgeEnd = path2[ index2 ];\n\n\t\t\t\t\tconst intersection = findEdgeIntersection( path1EdgeStart, path1EdgeEnd, path2EdgeStart, path2EdgeEnd );\n\n\t\t\t\t\tif ( intersection !== null && intersectionsRaw.find( i => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON ) === undefined ) {\n\n\t\t\t\t\t\tintersectionsRaw.push( intersection );\n\t\t\t\t\t\tintersections.push( new Vector2( intersection.x, intersection.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn intersections;\n\n\t\t}\n\n\t\tfunction getScanlineIntersections( scanline, boundingBox, paths ) {\n\n\t\t\tconst center = new Vector2();\n\t\t\tboundingBox.getCenter( center );\n\n\t\t\tconst allIntersections = [];\n\n\t\t\tpaths.forEach( path => {\n\n\t\t\t\t// check if the center of the bounding box is in the bounding box of the paths.\n\t\t\t\t// this is a pruning method to limit the search of intersections in paths that can't envelop of the current path.\n\t\t\t\t// if a path envelops another path. The center of that other path, has to be inside the bounding box of the enveloping path.\n\t\t\t\tif ( path.boundingBox.containsPoint( center ) ) {\n\n\t\t\t\t\tconst intersections = getIntersections( scanline, path.points );\n\n\t\t\t\t\tintersections.forEach( p => {\n\n\t\t\t\t\t\tallIntersections.push( { identifier: path.identifier, isCW: path.isCW, point: p } );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tallIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\treturn allIntersections;\n\n\t\t}\n\n\t\tfunction isHoleTo( simplePath, allPaths, scanlineMinX, scanlineMaxX, _fillRule ) {\n\n\t\t\tif ( _fillRule === null || _fillRule === undefined || _fillRule === '' ) {\n\n\t\t\t\t_fillRule = 'nonzero';\n\n\t\t\t}\n\n\t\t\tconst centerBoundingBox = new Vector2();\n\t\t\tsimplePath.boundingBox.getCenter( centerBoundingBox );\n\n\t\t\tconst scanline = [ new Vector2( scanlineMinX, centerBoundingBox.y ), new Vector2( scanlineMaxX, centerBoundingBox.y ) ];\n\n\t\t\tconst scanlineIntersections = getScanlineIntersections( scanline, simplePath.boundingBox, allPaths );\n\n\t\t\tscanlineIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\tconst baseIntersections = [];\n\t\t\tconst otherIntersections = [];\n\n\t\t\tscanlineIntersections.forEach( i => {\n\n\t\t\t\tif ( i.identifier === simplePath.identifier ) {\n\n\t\t\t\t\tbaseIntersections.push( i );\n\n\t\t\t\t} else {\n\n\t\t\t\t\totherIntersections.push( i );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tconst firstXOfPath = baseIntersections[ 0 ].point.x;\n\n\t\t\t// build up the path hierarchy\n\t\t\tconst stack = [];\n\t\t\tlet i = 0;\n\n\t\t\twhile ( i < otherIntersections.length && otherIntersections[ i ].point.x < firstXOfPath ) {\n\n\t\t\t\tif ( stack.length > 0 && stack[ stack.length - 1 ] === otherIntersections[ i ].identifier ) {\n\n\t\t\t\t\tstack.pop();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstack.push( otherIntersections[ i ].identifier );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\tstack.push( simplePath.identifier );\n\n\t\t\tif ( _fillRule === 'evenodd' ) {\n\n\t\t\t\tconst isHole = stack.length % 2 === 0 ? true : false;\n\t\t\t\tconst isHoleFor = stack[ stack.length - 2 ];\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else if ( _fillRule === 'nonzero' ) {\n\n\t\t\t\t// check if path is a hole by counting the amount of paths with alternating rotations it has to cross.\n\t\t\t\tlet isHole = true;\n\t\t\t\tlet isHoleFor = null;\n\t\t\t\tlet lastCWValue = null;\n\n\t\t\t\tfor ( let i = 0; i < stack.length; i ++ ) {\n\n\t\t\t\t\tconst identifier = stack[ i ];\n\t\t\t\t\tif ( isHole ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = false;\n\t\t\t\t\t\tisHoleFor = identifier;\n\n\t\t\t\t\t} else if ( lastCWValue !== allPaths[ identifier ].isCW ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'fill-rule: \"' + _fillRule + '\" is currently not implemented.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check for self intersecting paths\n\t\t// TODO\n\n\t\t// check intersecting paths\n\t\t// TODO\n\n\t\t// prepare paths for hole detection\n\t\tlet scanlineMinX = BIGNUMBER;\n\t\tlet scanlineMaxX = - BIGNUMBER;\n\n\t\tlet simplePaths = shapePath.subPaths.map( p => {\n\n\t\t\tconst points = p.getPoints();\n\t\t\tlet maxY = - BIGNUMBER;\n\t\t\tlet minY = BIGNUMBER;\n\t\t\tlet maxX = - BIGNUMBER;\n\t\t\tlet minX = BIGNUMBER;\n\n\t \t//points.forEach(p => p.y *= -1);\n\n\t\t\tfor ( let i = 0; i < points.length; i ++ ) {\n\n\t\t\t\tconst p = points[ i ];\n\n\t\t\t\tif ( p.y > maxY ) {\n\n\t\t\t\t\tmaxY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.y < minY ) {\n\n\t\t\t\t\tminY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x > maxX ) {\n\n\t\t\t\t\tmaxX = p.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x < minX ) {\n\n\t\t\t\t\tminX = p.x;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scanlineMaxX <= maxX ) {\n\n\t\t\t\tscanlineMaxX = maxX + 1;\n\n\t\t\t}\n\n\t\t\tif ( scanlineMinX >= minX ) {\n\n\t\t\t\tscanlineMinX = minX - 1;\n\n\t\t\t}\n\n\t\t\treturn { curves: p.curves, points: points, isCW: ShapeUtils.isClockWise( points ), identifier: - 1, boundingBox: new Box2( new Vector2( minX, minY ), new Vector2( maxX, maxY ) ) };\n\n\t\t} );\n\n\t\tsimplePaths = simplePaths.filter( sp => sp.points.length > 1 );\n\n\t\tfor ( let identifier = 0; identifier < simplePaths.length; identifier ++ ) {\n\n\t\t\tsimplePaths[ identifier ].identifier = identifier;\n\n\t\t}\n\n\t\t// check if path is solid or a hole\n\t\tconst isAHole = simplePaths.map( p => isHoleTo( p, simplePaths, scanlineMinX, scanlineMaxX, ( shapePath.userData ? shapePath.userData.style.fillRule : undefined ) ) );\n\n\n\t\tconst shapesToReturn = [];\n\t\tsimplePaths.forEach( p => {\n\n\t\t\tconst amIAHole = isAHole[ p.identifier ];\n\n\t\t\tif ( ! amIAHole.isHole ) {\n\n\t\t\t\tconst shape = new Shape();\n\t\t\t\tshape.curves = p.curves;\n\t\t\t\tconst holes = isAHole.filter( h => h.isHole && h.for === p.identifier );\n\t\t\t\tholes.forEach( h => {\n\n\t\t\t\t\tconst hole = simplePaths[ h.identifier ];\n\t\t\t\t\tconst path = new Path();\n\t\t\t\t\tpath.curves = hole.curves;\n\t\t\t\t\tshape.holes.push( path );\n\n\t\t\t\t} );\n\t\t\t\tshapesToReturn.push( shape );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn shapesToReturn;\n\n\t}\n\n\t/**\n\t * Returns a stroke style object from the given parameters.\n\t *\n\t * @param {number} [width=1] - The stroke width.\n\t * @param {string} [color='#000'] - The stroke color, as returned by {@link Color#getStyle}.\n\t * @param {'round'|'bevel'|'miter'|'miter-limit'} [lineJoin='miter'] - The line join style.\n\t * @param {'round'|'square'|'butt'} [lineCap='butt'] - The line cap style.\n\t * @param {number} [miterLimit=4] - Maximum join length, in multiples of the `width` parameter (join is truncated if it exceeds that distance).\n\t * @return {Object} The style object.\n\t */\n\tstatic getStrokeStyle( width, color, lineJoin, lineCap, miterLimit ) {\n\n\t\twidth = width !== undefined ? width : 1;\n\t\tcolor = color !== undefined ? color : '#000';\n\t\tlineJoin = lineJoin !== undefined ? lineJoin : 'miter';\n\t\tlineCap = lineCap !== undefined ? lineCap : 'butt';\n\t\tmiterLimit = miterLimit !== undefined ? miterLimit : 4;\n\n\t\treturn {\n\t\t\tstrokeColor: color,\n\t\t\tstrokeWidth: width,\n\t\t\tstrokeLineJoin: lineJoin,\n\t\t\tstrokeLineCap: lineCap,\n\t\t\tstrokeMiterLimit: miterLimit\n\t\t};\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points. The path can be open or closed (last point equals to first point).\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @return {?BufferGeometry} The stroke geometry. UV coordinates are generated ('u' along path. 'v' across it, from left to right).\n\t * Returns `null` if not geometry was generated.\n\t */\n\tstatic pointsToStroke( points, style, arcDivisions, minDistance ) {\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tif ( SVGLoader.pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs ) === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\treturn geometry;\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points.\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @param {Array<number>} vertices - An array holding vertices.\n\t * @param {Array<number>} normals - An array holding normals.\n\t * @param {Array<number>} uvs - An array holding uvs.\n\t * @param {number} [vertexOffset=0] - The vertex offset.\n\t * @return {number} The number of vertices.\n\t */\n\tstatic pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs, vertexOffset ) {\n\n\t\t// This function can be called to update existing arrays or buffers.\n\t\t// Accepts same parameters as pointsToStroke, plus the buffers and optional offset.\n\t\t// Param vertexOffset: Offset vertices to start writing in the buffers (3 elements/vertex for vertices and normals, and 2 elements/vertex for uvs)\n\t\t// Returns number of written vertices / normals / uvs pairs\n\t\t// if 'vertices' parameter is undefined no triangles will be generated, but the returned vertices count will still be valid (useful to preallocate the buffers)\n\t\t// 'normals' and 'uvs' buffers are optional\n\n\t\tconst tempV2_1 = new Vector2();\n\t\tconst tempV2_2 = new Vector2();\n\t\tconst tempV2_3 = new Vector2();\n\t\tconst tempV2_4 = new Vector2();\n\t\tconst tempV2_5 = new Vector2();\n\t\tconst tempV2_6 = new Vector2();\n\t\tconst tempV2_7 = new Vector2();\n\t\tconst lastPointL = new Vector2();\n\t\tconst lastPointR = new Vector2();\n\t\tconst point0L = new Vector2();\n\t\tconst point0R = new Vector2();\n\t\tconst currentPointL = new Vector2();\n\t\tconst currentPointR = new Vector2();\n\t\tconst nextPointL = new Vector2();\n\t\tconst nextPointR = new Vector2();\n\t\tconst innerPoint = new Vector2();\n\t\tconst outerPoint = new Vector2();\n\n\t\tarcDivisions = arcDivisions !== undefined ? arcDivisions : 12;\n\t\tminDistance = minDistance !== undefined ? minDistance : 0.001;\n\t\tvertexOffset = vertexOffset !== undefined ? vertexOffset : 0;\n\n\t\t// First ensure there are no duplicated points\n\t\tpoints = removeDuplicatedPoints( points );\n\n\t\tconst numPoints = points.length;\n\n\t\tif ( numPoints < 2 ) return 0;\n\n\t\tconst isClosed = points[ 0 ].equals( points[ numPoints - 1 ] );\n\n\t\tlet currentPoint;\n\t\tlet previousPoint = points[ 0 ];\n\t\tlet nextPoint;\n\n\t\tconst strokeWidth2 = style.strokeWidth / 2;\n\n\t\tconst deltaU = 1 / ( numPoints - 1 );\n\t\tlet u0 = 0, u1;\n\n\t\tlet innerSideModified;\n\t\tlet joinIsOnLeftSide;\n\t\tlet isMiter;\n\t\tlet initialJoinIsOnLeftSide = false;\n\n\t\tlet numVertices = 0;\n\t\tlet currentCoordinate = vertexOffset * 3;\n\t\tlet currentCoordinateUV = vertexOffset * 2;\n\n\t\t// Get initial left and right stroke points\n\t\tgetNormal( points[ 0 ], points[ 1 ], tempV2_1 ).multiplyScalar( strokeWidth2 );\n\t\tlastPointL.copy( points[ 0 ] ).sub( tempV2_1 );\n\t\tlastPointR.copy( points[ 0 ] ).add( tempV2_1 );\n\t\tpoint0L.copy( lastPointL );\n\t\tpoint0R.copy( lastPointR );\n\n\t\tfor ( let iPoint = 1; iPoint < numPoints; iPoint ++ ) {\n\n\t\t\tcurrentPoint = points[ iPoint ];\n\n\t\t\t// Get next point\n\t\t\tif ( iPoint === numPoints - 1 ) {\n\n\t\t\t\tif ( isClosed ) {\n\n\t\t\t\t\t// Skip duplicated initial point\n\t\t\t\t\tnextPoint = points[ 1 ];\n\n\t\t\t\t} else nextPoint = undefined;\n\n\t\t\t} else {\n\n\t\t\t\tnextPoint = points[ iPoint + 1 ];\n\n\t\t\t}\n\n\t\t\t// Normal of previous segment in tempV2_1\n\t\t\tconst normal1 = tempV2_1;\n\t\t\tgetNormal( previousPoint, currentPoint, normal1 );\n\n\t\t\ttempV2_3.copy( normal1 ).multiplyScalar( strokeWidth2 );\n\t\t\tcurrentPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\tcurrentPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\tu1 = u0 + deltaU;\n\n\t\t\tinnerSideModified = false;\n\n\t\t\tif ( nextPoint !== undefined ) {\n\n\t\t\t\t// Normal of next segment in tempV2_2\n\t\t\t\tgetNormal( currentPoint, nextPoint, tempV2_2 );\n\n\t\t\t\ttempV2_3.copy( tempV2_2 ).multiplyScalar( strokeWidth2 );\n\t\t\t\tnextPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\t\tnextPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\t\tjoinIsOnLeftSide = true;\n\t\t\t\ttempV2_3.subVectors( nextPoint, previousPoint );\n\t\t\t\tif ( normal1.dot( tempV2_3 ) < 0 ) {\n\n\t\t\t\t\tjoinIsOnLeftSide = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( iPoint === 1 ) initialJoinIsOnLeftSide = joinIsOnLeftSide;\n\n\t\t\t\ttempV2_3.subVectors( nextPoint, currentPoint );\n\t\t\t\ttempV2_3.normalize();\n\t\t\t\tconst dot = Math.abs( normal1.dot( tempV2_3 ) );\n\n\t\t\t\t// If path is straight, don't create join\n\t\t\t\tif ( dot > Number.EPSILON ) {\n\n\t\t\t\t\t// Compute inner and outer segment intersections\n\t\t\t\t\tconst miterSide = strokeWidth2 / dot;\n\t\t\t\t\ttempV2_3.multiplyScalar( - miterSide );\n\t\t\t\t\ttempV2_4.subVectors( currentPoint, previousPoint );\n\t\t\t\t\ttempV2_5.copy( tempV2_4 ).setLength( miterSide ).add( tempV2_3 );\n\t\t\t\t\tinnerPoint.copy( tempV2_5 ).negate();\n\t\t\t\t\tconst miterLength2 = tempV2_5.length();\n\t\t\t\t\tconst segmentLengthPrev = tempV2_4.length();\n\t\t\t\t\ttempV2_4.divideScalar( segmentLengthPrev );\n\t\t\t\t\ttempV2_6.subVectors( nextPoint, currentPoint );\n\t\t\t\t\tconst segmentLengthNext = tempV2_6.length();\n\t\t\t\t\ttempV2_6.divideScalar( segmentLengthNext );\n\t\t\t\t\t// Check that previous and next segments doesn't overlap with the innerPoint of intersection\n\t\t\t\t\tif ( tempV2_4.dot( innerPoint ) < segmentLengthPrev && tempV2_6.dot( innerPoint ) < segmentLengthNext ) {\n\n\t\t\t\t\t\tinnerSideModified = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\touterPoint.copy( tempV2_5 ).add( currentPoint );\n\t\t\t\t\tinnerPoint.add( currentPoint );\n\n\t\t\t\t\tisMiter = false;\n\n\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\tnextPointR.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointR.copy( innerPoint );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tnextPointL.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointL.copy( innerPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// The segment triangles are generated here if there was overlapping\n\n\t\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch ( style.strokeLineJoin ) {\n\n\t\t\t\t\t\tcase 'bevel':\n\n\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'round':\n\n\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t// Join triangles\n\n\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, currentPointL, nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, nextPointR, currentPointR, u1, 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'miter':\n\t\t\t\t\t\tcase 'miter-clip':\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconst miterFraction = ( strokeWidth2 * style.strokeMiterLimit ) / miterLength2;\n\n\t\t\t\t\t\t\tif ( miterFraction < 1 ) {\n\n\t\t\t\t\t\t\t\t// The join miter length exceeds the miter limit\n\n\t\t\t\t\t\t\t\tif ( style.strokeLineJoin !== 'miter-clip' ) {\n\n\t\t\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t\t\t// Miter-clip join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointL ).multiplyScalar( miterFraction ).add( currentPointL );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointL ).multiplyScalar( miterFraction ).add( nextPointL );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointR ).multiplyScalar( miterFraction ).add( currentPointR );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointR ).multiplyScalar( miterFraction ).add( nextPointR );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Miter join segment triangles\n\n\t\t\t\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\t\t\t\t// Optimized segment + join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\tnextPointL.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tnextPointR.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Add extra miter join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tisMiter = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// The segment triangles are generated here when two consecutive points are collinear\n\n\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// The segment triangles are generated here if it is the ending segment\n\n\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t}\n\n\t\t\tif ( ! isClosed && iPoint === numPoints - 1 ) {\n\n\t\t\t\t// Start line endcap\n\t\t\t\taddCapGeometry( points[ 0 ], point0L, point0R, joinIsOnLeftSide, true, u0 );\n\n\t\t\t}\n\n\t\t\t// Increment loop variables\n\n\t\t\tu0 = u1;\n\n\t\t\tpreviousPoint = currentPoint;\n\n\t\t\tlastPointL.copy( nextPointL );\n\t\t\tlastPointR.copy( nextPointR );\n\n\t\t}\n\n\t\tif ( ! isClosed ) {\n\n\t\t\t// Ending line endcap\n\t\t\taddCapGeometry( currentPoint, currentPointL, currentPointR, joinIsOnLeftSide, false, u1 );\n\n\t\t} else if ( innerSideModified && vertices ) {\n\n\t\t\t// Modify path first segment vertices to adjust to the segments inner and outer intersections\n\n\t\t\tlet lastOuter = outerPoint;\n\t\t\tlet lastInner = innerPoint;\n\n\t\t\tif ( initialJoinIsOnLeftSide !== joinIsOnLeftSide ) {\n\n\t\t\t\tlastOuter = innerPoint;\n\t\t\t\tlastInner = outerPoint;\n\n\t\t\t}\n\n\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\tif ( isMiter || initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 0 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 1 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( isMiter || ! initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 1 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn numVertices;\n\n\t\t// -- End of algorithm\n\n\t\t// -- Functions\n\n\t\tfunction getNormal( p1, p2, result ) {\n\n\t\t\tresult.subVectors( p2, p1 );\n\t\t\treturn result.set( - result.y, result.x ).normalize();\n\n\t\t}\n\n\t\tfunction addVertex( position, u, v ) {\n\n\t\t\tif ( vertices ) {\n\n\t\t\t\tvertices[ currentCoordinate ] = position.x;\n\t\t\t\tvertices[ currentCoordinate + 1 ] = position.y;\n\t\t\t\tvertices[ currentCoordinate + 2 ] = 0;\n\n\t\t\t\tif ( normals ) {\n\n\t\t\t\t\tnormals[ currentCoordinate ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 1 ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 2 ] = 1;\n\n\t\t\t\t}\n\n\t\t\t\tcurrentCoordinate += 3;\n\n\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\tuvs[ currentCoordinateUV ] = u;\n\t\t\t\t\tuvs[ currentCoordinateUV + 1 ] = v;\n\n\t\t\t\t\tcurrentCoordinateUV += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnumVertices += 3;\n\n\t\t}\n\n\t\tfunction makeCircularSector( center, p1, p2, u, v ) {\n\n\t\t\t// param p1, p2: Points in the circle arc.\n\t\t\t// p1 and p2 are in clockwise direction.\n\n\t\t\ttempV2_1.copy( p1 ).sub( center ).normalize();\n\t\t\ttempV2_2.copy( p2 ).sub( center ).normalize();\n\n\t\t\tlet angle = Math.PI;\n\t\t\tconst dot = tempV2_1.dot( tempV2_2 );\n\t\t\tif ( Math.abs( dot ) < 1 ) angle = Math.abs( Math.acos( dot ) );\n\n\t\t\tangle /= arcDivisions;\n\n\t\t\ttempV2_3.copy( p1 );\n\n\t\t\tfor ( let i = 0, il = arcDivisions - 1; i < il; i ++ ) {\n\n\t\t\t\ttempV2_4.copy( tempV2_3 ).rotateAround( center, angle );\n\n\t\t\t\taddVertex( tempV2_3, u, v );\n\t\t\t\taddVertex( tempV2_4, u, v );\n\t\t\t\taddVertex( center, u, 0.5 );\n\n\t\t\t\ttempV2_3.copy( tempV2_4 );\n\n\t\t\t}\n\n\t\t\taddVertex( tempV2_4, u, v );\n\t\t\taddVertex( p2, u, v );\n\t\t\taddVertex( center, u, 0.5 );\n\n\t\t}\n\n\t\tfunction makeSegmentTriangles() {\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t}\n\n\t\tfunction makeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t// Optimized segment + bevel triangles\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( innerPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( innerPoint, u, 0 );\n\t\t\t\t\taddVertex( nextPointR, u, 1 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bevel join triangle. The segment triangles are done in the main loop\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( nextPointR, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( nextPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointR, u0, 1 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( nextPointR, u0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addCapGeometry( center, p1, p2, joinIsOnLeftSide, start, u ) {\n\n\t\t\t// param center: End point of the path\n\t\t\t// param p1, p2: Left and right cap points\n\n\t\t\tswitch ( style.strokeLineCap ) {\n\n\t\t\t\tcase 'round':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\tmakeCircularSector( center, p2, p1, u, 0.5 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmakeCircularSector( center, p1, p2, u, 0.5 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'square':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p1, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\t// using tempV2_4 to update 3rd vertex if the uv.y of 3rd vertex is 1\n\t\t\t\t\t\t\tuvs[ 3 * 2 + 1 ] === 1 ? tempV2_4.toArray( vertices, 3 * 3 ) : tempV2_3.toArray( vertices, 3 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p2, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\tconst vl = vertices.length;\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'butt':\n\t\t\t\tdefault:\n\n\t\t\t\t\t// Nothing to do here\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeDuplicatedPoints( points ) {\n\n\t\t\t// Creates a new array if necessary with duplicated points removed.\n\t\t\t// This does not remove duplicated initial and ending points of a closed path.\n\n\t\t\tlet dupPoints = false;\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) < minDistance ) {\n\n\t\t\t\t\tdupPoints = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! dupPoints ) return points;\n\n\t\t\tconst newPoints = [];\n\t\t\tnewPoints.push( points[ 0 ] );\n\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) >= minDistance ) {\n\n\t\t\t\t\tnewPoints.push( points[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnewPoints.push( points[ points.length - 1 ] );\n\n\t\t\treturn newPoints;\n\n\t\t}\n\n\t}\n\n\n}\n\nexport { SVGLoader };\n","import React, { useEffect, useMemo, useState } from 'react';\nimport * as THREE from 'three';\nimport { SVGLoader, type SVGResult } from 'three/examples/jsm/loaders/SVGLoader.js';\nimport {\n inlineSvgStyles,\n isInteractiveGroupLabel,\n isRouteFolderLabel,\n isRoutePathLabel,\n isStoreFolderLabel,\n isTransparentColor,\n resolveFetchUrl,\n amenityHouseFill,\n isAmenityLayerId,\n resolveLayerStyle,\n sortByOutdoorSvgPaintOrder,\n} from '../../core';\n\nexport { resolveFetchUrl };\n\nconst BASE_Z = -2;\n\nfunction getLayerNameFromNode(node: Element | undefined): string | undefined {\n if (!node || node.nodeType !== 1) return undefined;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id');\n if (id) return id;\n current = current.parentElement;\n }\n return undefined;\n}\n\nfunction isInteractiveAncestor(node: Element | undefined): boolean {\n if (!node) return false;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id') ?? '';\n const dataName = current.getAttribute('data-name') ?? '';\n if (isInteractiveGroupLabel(id) || isInteractiveGroupLabel(dataName)) return true;\n if (isStoreFolderLabel(id) || isStoreFolderLabel(dataName)) return true;\n current = current.parentElement;\n }\n return false;\n}\n\nfunction isRouteAncestor(node: Element | undefined): boolean {\n if (!node) return false;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id') ?? '';\n const dataName = current.getAttribute('data-name') ?? '';\n if (isRouteFolderLabel(id) || isRouteFolderLabel(dataName)) return true;\n current = current.parentElement;\n }\n return false;\n}\n\nexport interface SvgVectorLayerProps {\n url: string;\n /** sourceSvgId values held in cm_shapes — skip drawing these (DB owns them). */\n suppressIds?: ReadonlySet<string>;\n imageProxyUrl?: string | null;\n is3d?: boolean;\n /** Settings overrides for house outdoor colors. */\n theme?: Partial<Record<string, string>> | null;\n}\n\ninterface PreparedMesh {\n key: string;\n layerName?: string;\n shapes: THREE.Shape[];\n color: THREE.Color;\n opacity: number;\n extrude: number;\n renderOrder: number;\n}\n\n/**\n * Live outdoor SVG as real vector geometry (not a raster texture).\n * Applies house-style colors for reserved layer names; otherwise keeps\n * Illustrator fills. Skips ROUTES-group lines and interactive ids owned by the DB.\n * Coordinates stay in SVG user space — `MapScene` flips the whole scene.\n */\nexport function SvgVectorLayer({\n url,\n suppressIds,\n imageProxyUrl,\n is3d = false,\n theme,\n}: SvgVectorLayerProps) {\n const [result, setResult] = useState<SVGResult | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n const controller = new AbortController();\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n fetch(fetchUrl, { signal: controller.signal })\n .then((res) => {\n if (!res.ok) throw new Error(`SVG fetch ${res.status}`);\n return res.text();\n })\n .then((text) => {\n if (cancelled) return;\n const inlined = inlineSvgStyles(text);\n const loader = new SVGLoader();\n setResult(loader.parse(inlined));\n })\n .catch((err) => {\n if (cancelled) return;\n if (err instanceof DOMException && err.name === 'AbortError') return;\n setResult(null);\n // Silence here used to hide CORS failures as \"outdoor has no decoration\".\n console.warn(\n `[eyeon-map] Outdoor SVG failed to load from ${fetchUrl}. ` +\n 'If this is a cross-origin error, pass `imageProxyUrl` to MapViewer.',\n err,\n );\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [url, imageProxyUrl]);\n\n const meshes = useMemo(() => {\n if (!result) return [] as PreparedMesh[];\n const out: PreparedMesh[] = [];\n let idx = 0;\n for (const path of result.paths) {\n const node = path.userData?.node as Element | undefined;\n const layerName = getLayerNameFromNode(node);\n if (layerName?.toLowerCase().startsWith('route-path')) continue;\n if (layerName && (isRoutePathLabel(layerName) || isRouteFolderLabel(layerName))) {\n continue;\n }\n if (node && isRouteAncestor(node)) continue;\n if (layerName && suppressIds?.has(layerName)) continue;\n if (isInteractiveAncestor(node) && !layerName) continue;\n // Whole INTERACTIVE / STORES folders are owned by DB shapes.\n if (layerName && (isInteractiveGroupLabel(layerName) || isStoreFolderLabel(layerName))) {\n continue;\n }\n if (node && isInteractiveAncestor(node) && layerName && suppressIds?.has(layerName)) {\n continue;\n }\n // Skip paths inside INTERACTIVE/STORES even when not yet in DB (assignable units).\n if (node && isInteractiveAncestor(node)) continue;\n\n const shapes = SVGLoader.createShapes(path);\n if (shapes.length === 0) continue;\n\n const layerStyle = resolveLayerStyle(layerName, theme);\n const amenityFill = isAmenityLayerId(layerName)\n ? amenityHouseFill(theme)\n : null;\n const fillTransparent = isTransparentColor(layerStyle?.fill);\n const strokeTransparent = isTransparentColor(layerStyle?.stroke);\n const color = new THREE.Color();\n if (layerStyle?.fill && !fillTransparent) {\n color.set(layerStyle.fill);\n } else if (amenityFill) {\n color.set(amenityFill);\n } else if (path.color && !fillTransparent) {\n color.copy(path.color);\n } else {\n color.set('#cccccc');\n }\n if (layerStyle?.stroke && !layerStyle.fill && !strokeTransparent) {\n color.set(layerStyle.stroke);\n }\n\n const opacity =\n fillTransparent || (strokeTransparent && !layerStyle?.fill)\n ? 0\n : typeof path.userData?.style?.opacity === 'number'\n ? path.userData.style.opacity\n : 1;\n const extrude =\n is3d && layerStyle?.extrudeHeight != null ? layerStyle.extrudeHeight : 0;\n\n out.push({\n key: `${layerName ?? 'path'}-${idx++}`,\n layerName,\n shapes,\n color,\n opacity,\n extrude,\n renderOrder: 0,\n });\n }\n // Sequential renderOrder matches the resolved list so same-color meshes\n // cannot batch a green area over a later special shape.\n return sortByOutdoorSvgPaintOrder(out, (mesh) => mesh.layerName).map(\n (mesh, renderOrder) => ({ ...mesh, renderOrder }),\n );\n }, [result, suppressIds, is3d, theme]);\n\n if (!result || meshes.length === 0) return null;\n\n return (\n <group position={[0, 0, BASE_Z]} renderOrder={-20}>\n {meshes.map((m) =>\n m.shapes.map((shape, si) => (\n <mesh\n key={`${m.key}-${si}`}\n renderOrder={m.renderOrder}\n raycast={() => {}}\n >\n {m.extrude > 0 ? (\n <extrudeGeometry\n args={[shape, { depth: m.extrude, bevelEnabled: false }]}\n />\n ) : (\n <shapeGeometry args={[shape]} />\n )}\n <meshBasicMaterial\n color={m.color}\n transparent={m.opacity < 1}\n opacity={m.opacity}\n depthWrite={false}\n toneMapped={false}\n side={THREE.DoubleSide}\n />\n </mesh>\n )),\n )}\n </group>\n );\n}\n","import {\n expandBounds,\n applyLevelTransform,\n sceneBoundsFromBBox,\n type BBox,\n type LevelTransform,\n type PathResult,\n type SceneBounds,\n type Vec2,\n} from '../core';\n\n/**\n * Stored geometry is raw SVG user space, where Y grows downward. The scene\n * mirrors Y once so the camera can keep a conventional `up = [0, 1, 0]`.\n *\n * Do not \"fix\" orientation by setting `up = [0, -1, 0]` instead: three.js\n * derives the camera's right axis from `up × forward`, so a negative up also\n * mirrors X and the map renders rotated 180° rather than flipped.\n */\nexport const SCENE_FLIP_SCALE: [number, number, number] = [1, -1, 1];\n\n/** Stored SVG-space point → view space, matching `SCENE_FLIP_SCALE`. */\nexport function dataToViewPoint(point: Vec2): Vec2 {\n return { x: point.x, y: -point.y };\n}\n\n/** Stored SVG-space bounds → view space, for camera and controls placement. */\nexport function viewBoundsFromData(bounds: SceneBounds): SceneBounds {\n return {\n ...bounds,\n minY: -bounds.maxY,\n maxY: -bounds.minY,\n cy: -bounds.cy,\n };\n}\n\n/**\n * Fit an orthographic camera so the map fills the canvas on the limiting\n * axis (width or height) with no extra inset.\n */\nexport function fitOrthoZoom(\n viewWidth: number,\n viewHeight: number,\n worldWidth: number,\n worldHeight: number,\n): number {\n const zoomX = Math.max(viewWidth, 1) / Math.max(worldWidth, 1);\n const zoomY = Math.max(viewHeight, 1) / Math.max(worldHeight, 1);\n return Math.min(zoomX, zoomY);\n}\n\nexport function boundsExtent(bounds: SceneBounds): { width: number; height: number } {\n return {\n width: Math.max(bounds.maxX - bounds.minX, 1),\n height: Math.max(bounds.maxY - bounds.minY, 1),\n };\n}\n\nexport const VIEWER_ZOOM_ANIM_MS = 240;\n/**\n * Selection pan/zoom. v1 used 0.2s of linear travel (`CAMERA.animSpeed`).\n * Ease-in-out over 200ms bunched the motion into the last frames and looked\n * like a snap; ease-out over 400ms reads as a short, smooth glide.\n */\nexport const VIEWER_FOCUS_ANIM_MS = 400;\n\n/** Extra space around a small focused shape so it does not fill the canvas. */\nexport const FOCUS_BOUNDS_PADDING = 1;\n/**\n * Padding for a large store (extent ≥ `FOCUS_LARGE_EXTENT`).\n * 2.0 → the store occupies about a third of the frame, so neighbors stay visible.\n */\nexport const FOCUS_LARGE_PADDING = 2;\n/** World size at which padding reaches `FOCUS_LARGE_PADDING`. */\nexport const FOCUS_LARGE_EXTENT = 400;\n/**\n * Padding stays tight until this size (typical small store). Kiosks and\n * amenities below this still zoom closer via `FOCUS_MIN_EXTENT`.\n */\nexport const FOCUS_PAD_SMALL_EXTENT = 80;\n/**\n * Floor for the framed world size. Tiny amenities keep neighbors in view\n * instead of filling the canvas; anything larger frames to its own bbox.\n */\nexport const FOCUS_MIN_EXTENT = 52;\n/**\n * Click-to-focus cap vs the full-map fit. A typical store stays at a\n * neighborhood view; 64× filled the canvas on the default assign map.\n */\nexport const FOCUS_MAX_ZOOM_MULTIPLE = 8;\n/**\n * Tiny kiosks/amenities may go closer than a store so they stay readable.\n * Still far below a canvas-filling close-up.\n */\nexport const FOCUS_SMALL_MAX_ZOOM_MULTIPLE = 14;\n/** Manual +/− ceiling, independent of selection focus. */\nexport const VIEWER_MAX_ZOOM_MULTIPLE = 16;\n\n/** More margin as the store grows so a department store is not edge-to-edge. */\nexport function focusPaddingRatio(\n width: number,\n height: number,\n paddingRatio = FOCUS_BOUNDS_PADDING,\n smallExtent = FOCUS_PAD_SMALL_EXTENT,\n largePadding = FOCUS_LARGE_PADDING,\n largeExtent = FOCUS_LARGE_EXTENT,\n): number {\n const extent = Math.max(width, height);\n if (extent <= smallExtent) return paddingRatio;\n const span = Math.max(largeExtent - smallExtent, 1);\n const t = Math.min(1, (extent - smallExtent) / span);\n return paddingRatio + (largePadding - paddingRatio) * t;\n}\n\n/**\n * Expand a shape's bounds for a \"click to assign\" camera frame.\n * Small units keep a tighter frame; large stores pull the camera back.\n */\nexport function paddedFocusBounds(\n bounds: SceneBounds,\n paddingRatio = FOCUS_BOUNDS_PADDING,\n minExtent = FOCUS_MIN_EXTENT,\n): SceneBounds {\n const rawW = bounds.maxX - bounds.minX;\n const rawH = bounds.maxY - bounds.minY;\n const width = Math.max(rawW, minExtent);\n const height = Math.max(rawH, minExtent);\n const pad = focusPaddingRatio(rawW, rawH, paddingRatio);\n const halfW = (width + width * pad) / 2;\n const halfH = (height + height * pad) / 2;\n return {\n minX: bounds.cx - halfW,\n minY: bounds.cy - halfH,\n maxX: bounds.cx + halfW,\n maxY: bounds.cy + halfH,\n cx: bounds.cx,\n cy: bounds.cy,\n size: Math.max(halfW, halfH) * 2,\n };\n}\n\n/**\n * How far a click may zoom relative to the fitted map. Smaller padded\n * frames (kiosks) get more zoom; store-sized frames stay at 8×.\n */\nexport function focusMaxZoomMultiple(\n paddedWidth: number,\n paddedHeight: number,\n typicalMultiple = FOCUS_MAX_ZOOM_MULTIPLE,\n smallMultiple = FOCUS_SMALL_MAX_ZOOM_MULTIPLE,\n): number {\n const extent = Math.max(paddedWidth, paddedHeight);\n const typicalFrame = FOCUS_PAD_SMALL_EXTENT * (1 + FOCUS_BOUNDS_PADDING);\n if (extent >= typicalFrame) return typicalMultiple;\n const tinyFrame = FOCUS_MIN_EXTENT * (1 + FOCUS_BOUNDS_PADDING);\n if (extent <= tinyFrame) return smallMultiple;\n const span = Math.max(typicalFrame - tinyFrame, 1);\n const t = (extent - tinyFrame) / span;\n return smallMultiple + (typicalMultiple - smallMultiple) * t;\n}\n\nexport function clampFocusZoom(\n shapeFitZoom: number,\n mapFitZoom: number,\n maxMultiple = FOCUS_MAX_ZOOM_MULTIPLE,\n): number {\n const cap = Math.max(mapFitZoom, 0.001) * maxMultiple;\n return Math.min(shapeFitZoom, cap);\n}\n\ntype FocusLevel = {\n shapes: Array<{ id: number; bbox: BBox }>;\n transform: LevelTransform;\n};\n\n/** Stable key so adding/removing a Shift-selected shape re-frames the camera. */\nexport function selectionFocusKey(shapeIds: number[]): string | null {\n const ids = [...new Set(shapeIds.filter((id) => Number.isFinite(id)))].sort(\n (a, b) => a - b,\n );\n return ids.length > 0 ? ids.join(',') : null;\n}\n\n/** View-space frame for one or more published shapes. */\nexport function viewFocusBoundsForShapes(\n levels: FocusLevel[],\n shapeIds: number[],\n): SceneBounds | null {\n const wanted = new Set(shapeIds);\n if (wanted.size === 0) return null;\n let combined: SceneBounds | null = null;\n for (const level of levels) {\n for (const shape of level.shapes) {\n if (!wanted.has(shape.id)) continue;\n const next = sceneBoundsFromBBox(shape.bbox, level.transform);\n combined = combined ? expandBounds(combined, next) : next;\n }\n }\n return combined ? viewBoundsFromData(paddedFocusBounds(combined)) : null;\n}\n\n/** View-space frame for a published shape, ready for `CameraRig.focusBounds`. */\nexport function viewFocusBoundsForShape(\n levels: FocusLevel[],\n shapeId: number,\n): SceneBounds | null {\n return viewFocusBoundsForShapes(levels, [shapeId]);\n}\n\ntype RouteFocusLevel = FocusLevel & {\n id: number;\n anchors: Array<{ id: number; shapeId?: number | null; kind?: string }>;\n};\n\n/** Match v1: frame the current-floor route and its endpoint shapes. */\nexport function viewFocusBoundsForRoute(\n levels: RouteFocusLevel[],\n route: PathResult,\n levelId: number | null,\n): SceneBounds | null {\n if (levelId == null) return null;\n const level = levels.find((item) => item.id === levelId);\n if (!level) return null;\n const routePoints = route.points\n .filter((point) => point.levelId === levelId)\n .map((point) => applyLevelTransform(point, level.transform));\n\n let bounds: SceneBounds | null = null;\n if (routePoints.length >= 2) {\n const minX = Math.min(...routePoints.map((point) => point.x));\n const minY = Math.min(...routePoints.map((point) => point.y));\n const maxX = Math.max(...routePoints.map((point) => point.x));\n const maxY = Math.max(...routePoints.map((point) => point.y));\n bounds = {\n minX,\n minY,\n maxX,\n maxY,\n cx: (minX + maxX) / 2,\n cy: (minY + maxY) / 2,\n size: Math.max(maxX - minX, maxY - minY, 1),\n };\n } else if (routePoints.length === 1) {\n const point = routePoints[0];\n bounds = {\n minX: point.x,\n minY: point.y,\n maxX: point.x,\n maxY: point.y,\n cx: point.x,\n cy: point.y,\n size: 1,\n };\n }\n\n const endpointIds = new Set(\n [route.anchorIds[0], route.anchorIds.at(-1)].filter(\n (id): id is number => id != null,\n ),\n );\n const routeAnchorIds = new Set(route.anchorIds);\n const focusShapeIds = new Set<number>();\n for (const anchor of level.anchors) {\n if (!routeAnchorIds.has(anchor.id) || anchor.shapeId == null) continue;\n if (endpointIds.has(anchor.id) || anchor.kind === 'connector') {\n focusShapeIds.add(anchor.shapeId);\n }\n }\n for (const shape of level.shapes) {\n if (!focusShapeIds.has(shape.id)) continue;\n const shapeBounds = sceneBoundsFromBBox(shape.bbox, level.transform);\n bounds = bounds ? expandBounds(bounds, shapeBounds) : shapeBounds;\n }\n\n if (!bounds) return null;\n return viewBoundsFromData(paddedFocusBounds(bounds, 0.1, 1));\n}\n\nexport function easeOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return 1 - (1 - x) ** 3;\n}\n\n/** Symmetric ease so a selection pan is visible the whole way, like v1's lerp. */\nexport function easeInOutCubic(t: number): number {\n const x = Math.min(1, Math.max(0, t));\n return x < 0.5 ? 4 * x * x * x : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nexport interface CameraPose {\n zoom: number;\n position: [number, number, number];\n target: [number, number, number];\n}\n\n/** Interpolate zoom + pan/orbit for a smooth +/− / Reset / selection focus. */\nexport function interpolateCameraPose(\n from: CameraPose,\n to: CameraPose,\n t: number,\n ease: (t: number) => number = easeOutCubic,\n): CameraPose {\n const e = ease(t);\n return {\n zoom: lerp(from.zoom, to.zoom, e),\n position: [\n lerp(from.position[0], to.position[0], e),\n lerp(from.position[1], to.position[1], e),\n lerp(from.position[2], to.position[2], e),\n ],\n target: [\n lerp(from.target[0], to.target[0], e),\n lerp(from.target[1], to.target[1], e),\n lerp(from.target[2], to.target[2], e),\n ],\n };\n}\n\nexport function cameraPosesNear(\n a: CameraPose,\n b: CameraPose,\n epsilon = 1e-3,\n): boolean {\n return (\n Math.abs(a.zoom - b.zoom) < epsilon &&\n Math.abs(a.position[0] - b.position[0]) < epsilon &&\n Math.abs(a.position[1] - b.position[1]) < epsilon &&\n Math.abs(a.position[2] - b.position[2]) < epsilon &&\n Math.abs(a.target[0] - b.target[0]) < epsilon &&\n Math.abs(a.target[1] - b.target[1]) < epsilon &&\n Math.abs(a.target[2] - b.target[2]) < epsilon\n );\n}\n\n/** Zoom `0` means “use the current fit zoom”. */\nexport function withFitZoom(\n pose: CameraPose | null | undefined,\n fitZoom: number,\n): CameraPose | null {\n if (!pose) return null;\n if (pose.zoom > 0) return pose;\n return { ...pose, zoom: fitZoom };\n}\n\n/**\n * RESET destination.\n * Staff capture (`fitToMap`) always returns the fitted full-map view so\n * authors can see every unit and start over. Portal / website / kiosk RESET\n * restores the configured slot pose, or that same fit when the slot is empty.\n */\nexport function resolveResetPose(\n fitToMap: boolean,\n home: CameraPose | null | undefined,\n fit: CameraPose,\n): CameraPose {\n if (fitToMap) return fit;\n return withFitZoom(home, fit.zoom) ?? fit;\n}\n\n/**\n * Chrome Reset clears the store highlight (`focusKey` → null) in the same\n * tick as the ease-home. Restoring the last snap would cancel that ease\n * and leave the camera on the store (first click only un-highlights).\n */\nexport function skipPersistedViewRestore(input: {\n resetInFlight: boolean;\n focusKey: string | number | null;\n}): boolean {\n return input.resetInFlight && input.focusKey == null;\n}\n\nexport function nextOrthoZoom(\n current: number,\n direction: 1 | -1,\n step: number,\n min: number,\n max: number,\n): number {\n const factor = 1 + Math.min(Math.max(step, 0.15), 1) * 0.5;\n const next = direction > 0 ? current * factor : current / factor;\n return Math.min(max, Math.max(min, next));\n}\n\n/** three.js `MOUSE` / `TOUCH` enums — left-drag pans the 2D admin/public map. */\nconst MOUSE_ROTATE = 0;\nconst MOUSE_DOLLY = 1;\nconst MOUSE_PAN = 2;\nconst TOUCH_ROTATE = 0;\nconst TOUCH_PAN = 1;\nconst TOUCH_DOLLY_PAN = 2;\n\n/**\n * Wheel zoom keeps the pointer over the same map point (Google Maps-style).\n * Speed is three-stdlib `pow(0.95, zoomSpeed)` per event — same helper as\n * Edit Map / Wayfinding (`nextZoomFromWheel`).\n * +/− still zooms about the view centre because those buttons have no cursor.\n */\nexport const ORBIT_ZOOM_TO_CURSOR = true;\n\nexport function orbitMouseButtons(is3d: boolean): {\n LEFT: number;\n MIDDLE: number;\n RIGHT: number;\n} {\n if (is3d) {\n return { LEFT: MOUSE_ROTATE, MIDDLE: MOUSE_DOLLY, RIGHT: MOUSE_PAN };\n }\n return { LEFT: MOUSE_PAN, MIDDLE: MOUSE_DOLLY, RIGHT: MOUSE_PAN };\n}\n\nexport function orbitTouches(is3d: boolean): { ONE: number; TWO: number } {\n if (is3d) {\n return { ONE: TOUCH_ROTATE, TWO: TOUCH_DOLLY_PAN };\n }\n return { ONE: TOUCH_PAN, TWO: TOUCH_DOLLY_PAN };\n}\n","import React, { useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport type { OrbitControls } from 'three-stdlib';\nimport * as THREE from 'three';\nimport type { SceneBounds, ThemeDefaults } from '../../core';\nimport {\n boundsExtent,\n cameraPosesNear,\n clampFocusZoom,\n easeOutCubic,\n fitOrthoZoom,\n focusMaxZoomMultiple,\n VIEWER_MAX_ZOOM_MULTIPLE,\n interpolateCameraPose,\n lerp,\n nextOrthoZoom,\n resolveResetPose,\n skipPersistedViewRestore,\n VIEWER_FOCUS_ANIM_MS,\n VIEWER_ZOOM_ANIM_MS,\n type CameraPose,\n} from '../camera';\n\nexport interface MapCameraHandle {\n zoomIn: () => void;\n zoomOut: () => void;\n reset: () => void;\n /** View-space bounds (already Y-flipped). Animates pan + zoom onto the shape. */\n focusBounds: (focus: SceneBounds) => void;\n getView: () => CameraViewSnapshot;\n applyView: (snap: CameraViewSnapshot) => void;\n}\n\n/** Survives Canvas / camera remounts so Settings color tweaks keep the view. */\nexport interface CameraViewSnapshot {\n is3d: boolean;\n boundsKey: string;\n zoom: number;\n position: [number, number, number];\n target: [number, number, number];\n userAdjusted: boolean;\n focusKey?: string | number | null;\n}\n\nexport function cameraBoundsKey(bounds: SceneBounds, is3d: boolean): string {\n return [\n bounds.cx,\n bounds.cy,\n bounds.minX,\n bounds.minY,\n bounds.maxX,\n bounds.maxY,\n bounds.size,\n is3d ? '3d' : '2d',\n ].join('|');\n}\n\nexport interface CameraRigProps {\n /** View-space bounds — already Y-flipped by the scene, so up is +Y. */\n bounds: SceneBounds;\n theme: ThemeDefaults;\n is3d: boolean;\n controlsRef: React.RefObject<OrbitControls | null>;\n cameraRef?: React.Ref<MapCameraHandle | null>;\n persistedViewRef: React.MutableRefObject<CameraViewSnapshot | null>;\n /** Selection key; when it changes the camera eases onto `focusViewBounds`. */\n focusKey?: string | number | null;\n focusViewBounds?: SceneBounds | null;\n /** Saved floor+device pose. Zoom `0` means use the current fit zoom. */\n homePose?: CameraPose | null;\n /** Changes when the staff/runtime slot changes (level + device). */\n homePoseKey?: string | null;\n /** Staff capture: RESET fits the full map. Hosts restore `homePose`. */\n resetFitsMap?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n}\n\nexport function CameraRig({\n bounds,\n theme,\n is3d,\n controlsRef,\n cameraRef,\n persistedViewRef,\n focusKey = null,\n focusViewBounds = null,\n homePose = null,\n homePoseKey = null,\n resetFitsMap = false,\n onCameraChange,\n onCameraReset,\n}: CameraRigProps) {\n const { camera, size, invalidate } = useThree();\n const userAdjusted = useRef(false);\n const applyingView = useRef(false);\n const zoomAnimRef = useRef<number | null>(null);\n const appliedFocusKey = useRef<string | number | null>(null);\n const focusKeyRef = useRef(focusKey);\n focusKeyRef.current = focusKey;\n const focusViewBoundsRef = useRef(focusViewBounds);\n focusViewBoundsRef.current = focusViewBounds;\n const homePoseRef = useRef(homePose);\n homePoseRef.current = homePose;\n const homePoseKeyRef = useRef(homePoseKey);\n homePoseKeyRef.current = homePoseKey;\n const resetFitsMapRef = useRef(resetFitsMap);\n resetFitsMapRef.current = resetFitsMap;\n const onCameraChangeRef = useRef(onCameraChange);\n onCameraChangeRef.current = onCameraChange;\n const onCameraResetRef = useRef(onCameraReset);\n onCameraResetRef.current = onCameraReset;\n const appliedHomeKey = useRef<string | null>(null);\n const ignoreUserChangeUntil = useRef(0);\n /** Chrome Reset also clears the store highlight; skip the following layout restore. */\n const resetInFlight = useRef(false);\n const focusAnimRef = useRef<{\n from: CameraPose;\n dest: CameraPose;\n started: number;\n lookAt: boolean;\n } | null>(null);\n const boundsKey = cameraBoundsKey(bounds, is3d);\n\n const cancelZoomAnim = useCallback(() => {\n if (zoomAnimRef.current == null) return;\n cancelAnimationFrame(zoomAnimRef.current);\n zoomAnimRef.current = null;\n }, []);\n\n const captureView = useCallback(\n (adjusted = userAdjusted.current): CameraViewSnapshot => {\n const controls = controlsRef.current;\n return {\n is3d,\n boundsKey,\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [camera.position.x, camera.position.y, camera.position.z],\n target: controls\n ? [controls.target.x, controls.target.y, controls.target.z]\n : [bounds.cx, bounds.cy, 0],\n userAdjusted: adjusted,\n focusKey: focusKeyRef.current,\n };\n },\n [bounds.cx, bounds.cy, boundsKey, camera, controlsRef, is3d],\n );\n\n const restoreView = useCallback(\n (snap: CameraViewSnapshot) => {\n applyingView.current = true;\n cancelZoomAnim();\n camera.up.set(0, 1, 0);\n camera.position.set(snap.position[0], snap.position[1], snap.position[2]);\n if (camera instanceof THREE.OrthographicCamera) {\n camera.zoom = snap.zoom;\n camera.updateProjectionMatrix();\n } else {\n camera.lookAt(snap.target[0], snap.target[1], snap.target[2]);\n }\n const controls = controlsRef.current;\n if (controls) {\n controls.target.set(snap.target[0], snap.target[1], snap.target[2]);\n controls.update();\n }\n persistedViewRef.current = { ...snap, boundsKey, is3d };\n userAdjusted.current = snap.userAdjusted;\n invalidate();\n applyingView.current = false;\n },\n [boundsKey, camera, cancelZoomAnim, controlsRef, invalidate, is3d, persistedViewRef],\n );\n\n const animateOrthoZoom = useCallback(\n (targetZoom: number) => {\n if (!(camera instanceof THREE.OrthographicCamera)) return;\n cancelZoomAnim();\n const startZoom = camera.zoom;\n if (startZoom === targetZoom) return;\n const started = performance.now();\n const step = (now: number) => {\n if (!(camera instanceof THREE.OrthographicCamera)) return;\n const t = Math.min(1, (now - started) / VIEWER_ZOOM_ANIM_MS);\n camera.zoom = lerp(startZoom, targetZoom, easeOutCubic(t));\n camera.updateProjectionMatrix();\n persistedViewRef.current = captureView();\n invalidate();\n if (t < 1) {\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n onCameraChangeRef.current?.(captureView(true));\n };\n zoomAnimRef.current = requestAnimationFrame(step);\n },\n [camera, cancelZoomAnim, captureView, invalidate, persistedViewRef],\n );\n\n const currentPose = useCallback((): CameraPose => {\n const controls = controlsRef.current;\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [camera.position.x, camera.position.y, camera.position.z],\n target: controls\n ? [controls.target.x, controls.target.y, controls.target.z]\n : [bounds.cx, bounds.cy, 0],\n };\n }, [bounds.cx, bounds.cy, camera, controlsRef]);\n\n const fitPose = useCallback((): CameraPose => {\n const { width, height } = boundsExtent(bounds);\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n return {\n zoom: fitOrthoZoom(size.width, size.height, width, height),\n position: [bounds.cx, bounds.cy, 500],\n target: [bounds.cx, bounds.cy, 0],\n };\n }\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [bounds.cx, bounds.cy - bounds.size * 0.35, bounds.size * 0.85],\n target: [bounds.cx, bounds.cy, 0],\n };\n }, [bounds, camera, is3d, size.height, size.width]);\n\n const applyPose = useCallback(\n (pose: CameraPose, lookAt: boolean) => {\n applyingView.current = true;\n camera.up.set(0, 1, 0);\n camera.position.set(pose.position[0], pose.position[1], pose.position[2]);\n if (camera instanceof THREE.OrthographicCamera) {\n camera.zoom = pose.zoom;\n camera.updateProjectionMatrix();\n }\n if (lookAt) {\n camera.lookAt(pose.target[0], pose.target[1], pose.target[2]);\n }\n const controls = controlsRef.current;\n if (controls) {\n controls.target.set(pose.target[0], pose.target[1], pose.target[2]);\n controls.update();\n }\n invalidate();\n applyingView.current = false;\n },\n [camera, controlsRef, invalidate],\n );\n\n const poseForFocusBounds = useCallback(\n (focus: SceneBounds): CameraPose => {\n const { width, height } = boundsExtent(focus);\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n const mapExtent = boundsExtent(bounds);\n const mapFit = fitOrthoZoom(\n size.width,\n size.height,\n mapExtent.width,\n mapExtent.height,\n );\n return {\n zoom: clampFocusZoom(\n fitOrthoZoom(size.width, size.height, width, height),\n mapFit,\n focusMaxZoomMultiple(width, height),\n ),\n position: [focus.cx, focus.cy, 500],\n target: [focus.cx, focus.cy, 0],\n };\n }\n const sizeHint = Math.max(focus.size, 1);\n return {\n zoom: camera instanceof THREE.OrthographicCamera ? camera.zoom : 1,\n position: [focus.cx, focus.cy - sizeHint * 0.35, sizeHint * 0.85],\n target: [focus.cx, focus.cy, 0],\n };\n },\n [bounds, camera, is3d, size.height, size.width],\n );\n\n const resolvedHomePose = useCallback((): CameraPose | null => {\n const saved = homePoseRef.current;\n if (!saved) return null;\n if (saved.zoom > 0) return saved;\n return { ...saved, zoom: fitPose().zoom };\n }, [fitPose]);\n\n const resetDestination = useCallback((): CameraPose => {\n const fit = fitPose();\n return resolveResetPose(resetFitsMapRef.current, homePoseRef.current, fit);\n }, [fitPose]);\n\n const applyHomeOrFit = useCallback(() => {\n cancelZoomAnim();\n focusAnimRef.current = null;\n const dest = resolvedHomePose() ?? fitPose();\n applyPose(dest, is3d);\n persistedViewRef.current = captureView(false);\n userAdjusted.current = false;\n ignoreUserChangeUntil.current = performance.now() + 160;\n }, [\n applyPose,\n cancelZoomAnim,\n captureView,\n fitPose,\n is3d,\n persistedViewRef,\n resolvedHomePose,\n ]);\n\n const applyFit = useCallback(() => {\n applyHomeOrFit();\n }, [applyHomeOrFit]);\n\n const animateFocus = useCallback(\n (focus: SceneBounds) => {\n const dest = poseForFocusBounds(focus);\n const from = currentPose();\n userAdjusted.current = true;\n appliedFocusKey.current = focusKeyRef.current;\n cancelZoomAnim();\n if (cameraPosesNear(from, dest)) {\n focusAnimRef.current = null;\n persistedViewRef.current = captureView(true);\n return;\n }\n // Drive the pan in useFrame so a later layout effect cannot snap to dest.\n focusAnimRef.current = {\n from,\n dest,\n started: performance.now(),\n lookAt: is3d,\n };\n applyingView.current = true;\n invalidate();\n },\n [\n cancelZoomAnim,\n captureView,\n currentPose,\n invalidate,\n is3d,\n persistedViewRef,\n poseForFocusBounds,\n ],\n );\n\n const animateReset = useCallback(() => {\n const dest = resetDestination();\n const from = currentPose();\n focusAnimRef.current = null;\n if (cameraPosesNear(from, dest)) {\n userAdjusted.current = false;\n persistedViewRef.current = captureView(false);\n resetInFlight.current = false;\n return;\n }\n cancelZoomAnim();\n const started = performance.now();\n const lookAt = is3d;\n const step = (now: number) => {\n const t = Math.min(1, (now - started) / VIEWER_ZOOM_ANIM_MS);\n applyPose(interpolateCameraPose(from, dest, t), lookAt);\n persistedViewRef.current = captureView(false);\n if (t < 1) {\n applyingView.current = true;\n zoomAnimRef.current = requestAnimationFrame(step);\n return;\n }\n zoomAnimRef.current = null;\n userAdjusted.current = false;\n applyingView.current = false;\n resetInFlight.current = false;\n };\n applyingView.current = true;\n ignoreUserChangeUntil.current = performance.now() + 400;\n zoomAnimRef.current = requestAnimationFrame(step);\n }, [\n applyPose,\n cancelZoomAnim,\n captureView,\n currentPose,\n is3d,\n persistedViewRef,\n resetDestination,\n ]);\n const applyFitRef = useRef(applyFit);\n applyFitRef.current = applyFit;\n const restoreViewRef = useRef(restoreView);\n restoreViewRef.current = restoreView;\n const animateFocusRef = useRef(animateFocus);\n animateFocusRef.current = animateFocus;\n\n const zoomBy = useCallback(\n (direction: 1 | -1) => {\n userAdjusted.current = true;\n focusAnimRef.current = null;\n const controls = controlsRef.current;\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n const { width, height } = boundsExtent(bounds);\n const fit = fitOrthoZoom(size.width, size.height, width, height);\n animateOrthoZoom(\n nextOrthoZoom(\n camera.zoom,\n direction,\n theme.ZOOM_STEP,\n fit * 0.2,\n fit * VIEWER_MAX_ZOOM_MULTIPLE,\n ),\n );\n } else if (controls) {\n const offset = camera.position.clone().sub(controls.target);\n const factor = 1 + Math.min(Math.max(theme.ZOOM_STEP, 0.15), 1) * 0.5;\n const next = direction > 0 ? offset.length() / factor : offset.length() * factor;\n offset.setLength(\n Math.min(theme.CAMERA_MAX_DISTANCE, Math.max(theme.CAMERA_MIN_DISTANCE, next)),\n );\n camera.position.copy(controls.target).add(offset);\n persistedViewRef.current = captureView();\n onCameraChangeRef.current?.(captureView(true));\n }\n controls?.update();\n invalidate();\n },\n [\n animateOrthoZoom,\n bounds,\n camera,\n captureView,\n controlsRef,\n invalidate,\n is3d,\n persistedViewRef,\n size.height,\n size.width,\n theme,\n ],\n );\n\n useEffect(() => () => cancelZoomAnim(), [cancelZoomAnim]);\n\n useEffect(() => {\n const controls = controlsRef.current;\n if (!controls) return;\n const onChange = () => {\n if (applyingView.current) return;\n if (performance.now() < ignoreUserChangeUntil.current) return;\n userAdjusted.current = true;\n persistedViewRef.current = captureView(true);\n onCameraChangeRef.current?.(persistedViewRef.current);\n };\n const onStart = () => {\n if (applyingView.current) return;\n if (performance.now() < ignoreUserChangeUntil.current) return;\n // Pointer drag — not OrbitControls.update() during a programmed ease.\n userAdjusted.current = true;\n focusAnimRef.current = null;\n persistedViewRef.current = captureView(true);\n onCameraChangeRef.current?.(persistedViewRef.current);\n };\n controls.addEventListener('change', onChange);\n controls.addEventListener('start', onStart);\n return () => {\n controls.removeEventListener('change', onChange);\n controls.removeEventListener('start', onStart);\n };\n }, [camera, captureView, controlsRef, persistedViewRef]);\n\n useImperativeHandle(\n cameraRef,\n () => ({\n zoomIn: () => {\n zoomBy(1);\n },\n zoomOut: () => {\n zoomBy(-1);\n },\n reset: () => {\n userAdjusted.current = false;\n focusAnimRef.current = null;\n appliedFocusKey.current = null;\n focusKeyRef.current = null;\n resetInFlight.current = true;\n onCameraResetRef.current?.();\n animateReset();\n },\n focusBounds: (focus) => {\n animateFocus(focus);\n },\n getView: () => captureView(),\n applyView: (snap) => restoreView(snap),\n }),\n [animateFocus, animateReset, captureView, restoreView, zoomBy],\n );\n\n useLayoutEffect(() => {\n if (size.width < 2 || size.height < 2) return;\n if (focusKey == null) {\n appliedFocusKey.current = null;\n focusAnimRef.current = null;\n }\n if (skipPersistedViewRestore({ resetInFlight: resetInFlight.current, focusKey })) {\n return;\n }\n if (resetInFlight.current) resetInFlight.current = false;\n const snap = persistedViewRef.current;\n const focus = focusViewBoundsRef.current;\n const isNewFocus =\n focusKey != null && focus != null && appliedFocusKey.current !== focusKey;\n const snapMatchesFocus =\n snap != null &&\n snap.is3d === is3d &&\n snap.boundsKey === boundsKey &&\n snap.focusKey === focusKey;\n\n if (focusKey != null && focus != null) {\n if (snapMatchesFocus) {\n appliedFocusKey.current = focusKey;\n if (focusAnimRef.current == null) restoreViewRef.current(snap);\n return;\n }\n if (isNewFocus) {\n // Only the first map paint snaps — otherwise the unfitted camera flashes.\n // Every later selection eases from the current view, like v1.\n if (persistedViewRef.current == null) {\n appliedFocusKey.current = focusKey;\n userAdjusted.current = true;\n cancelZoomAnim();\n applyPose(poseForFocusBounds(focus), is3d);\n persistedViewRef.current = captureView(true);\n return;\n }\n if (snap && !snapMatchesFocus) restoreViewRef.current(snap);\n animateFocusRef.current(focus);\n return;\n }\n // Same selection after a remount / theme swap — keep the current view.\n // Do not snap: that cancelled the ease when this effect re-ran.\n return;\n }\n\n if (homePoseKey && appliedHomeKey.current !== homePoseKey) {\n appliedHomeKey.current = homePoseKey;\n userAdjusted.current = false;\n applyFitRef.current();\n return;\n }\n\n // Theme rebuilds can swap the drei camera or remount this rig. Keep the\n // last view when the map extents and 2D/3D mode have not changed.\n if (snap && snap.is3d === is3d && snap.boundsKey === boundsKey) {\n restoreViewRef.current(snap);\n return;\n }\n userAdjusted.current = false;\n applyFitRef.current();\n }, [\n applyPose,\n boundsKey,\n camera,\n cancelZoomAnim,\n captureView,\n focusKey,\n homePoseKey,\n is3d,\n persistedViewRef,\n poseForFocusBounds,\n ]);\n\n useEffect(() => {\n if (size.width < 2 || size.height < 2 || userAdjusted.current) return;\n applyFitRef.current();\n }, [size.height, size.width]);\n\n useFrame(() => {\n const anim = focusAnimRef.current;\n if (!anim) return;\n const t = Math.min(1, (performance.now() - anim.started) / VIEWER_FOCUS_ANIM_MS);\n applyPose(\n interpolateCameraPose(anim.from, anim.dest, t, easeOutCubic),\n anim.lookAt,\n );\n persistedViewRef.current = captureView(true);\n if (t < 1) {\n invalidate();\n return;\n }\n focusAnimRef.current = null;\n });\n\n return null;\n}\n","/**\n * OrbitControls uses one `enableZoom` flag for wheel and touch pinch.\n * Website maps must swallow wheel only — pinch stays on the controls.\n *\n * R3F sets `events.connected` to `false` until the canvas host is wired,\n * so callers must not treat a falsy connected value as a DOM node.\n */\n\nfunction isEventRoot(value: unknown): value is EventTarget {\n return typeof value === 'object' && value !== null;\n}\n\nexport function orbitEventRoot(\n eventSource: EventTarget | null | undefined,\n connected: unknown,\n canvas: EventTarget | null | undefined,\n): EventTarget | null {\n if (isEventRoot(eventSource)) return eventSource;\n if (isEventRoot(connected)) return connected;\n if (isEventRoot(canvas)) return canvas;\n return null;\n}\n\nexport function viewerWheelEventHitsMap(\n root: EventTarget | null | undefined,\n target: EventTarget | null,\n): boolean {\n if (!isEventRoot(root) || target == null) return false;\n const contains = (root as { contains?: (node: EventTarget) => boolean }).contains;\n return typeof contains === 'function' && contains.call(root, target);\n}\n\n/** Stop OrbitControls without preventDefault so the page can still scroll. */\nexport function suppressViewerWheelZoom(event: Event): void {\n event.stopImmediatePropagation();\n}\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport { Canvas, useThree } from '@react-three/fiber';\nimport { OrthographicCamera, OrbitControls } from '@react-three/drei';\nimport type { OrbitControls as OrbitControlsImpl } from 'three-stdlib';\nimport type {\n MapViewerHost,\n PathResult,\n PublishedDocument,\n PublishedRetailer,\n SceneBounds,\n ThemeDefaults,\n ViewerHoverTooltipHandler,\n} from '../../core';\nimport type { ResponsiveCameraPose } from '../../core';\nimport {\n boundsFromStackedLevels,\n isOutdoorLevel,\n isTransparentColor,\n outdoorSvgSuppressIds,\n viewerAllowsWheelZoom,\n viewerLevelStack,\n} from '../../core';\nimport { LevelMeshes } from './LevelMeshes';\nimport { RouteLine } from './RouteLine';\nimport { SvgVectorLayer } from './SvgVectorLayer';\nimport { CameraRig, type CameraViewSnapshot, type MapCameraHandle } from './CameraRig';\nimport {\n ORBIT_ZOOM_TO_CURSOR,\n SCENE_FLIP_SCALE,\n orbitMouseButtons,\n orbitTouches,\n viewBoundsFromData,\n type CameraPose,\n} from '../camera';\nimport {\n beginViewerPointerGesture,\n createViewerPointerGesture,\n endViewerPointerGesture,\n moveViewerPointerGesture,\n pointerMissClearsSelection,\n viewerPointerClientXY,\n} from '../pointer';\nimport {\n orbitEventRoot,\n suppressViewerWheelZoom,\n viewerWheelEventHitsMap,\n} from '../orbitWheelZoom';\n\nconst OUTDOOR_Z = -1;\nconst CAMERA_UP: [number, number, number] = [0, 1, 0];\nconst CANVAS_DPR: [number, number] = [1, 2];\nconst CANVAS_GL = { antialias: true };\n\n/**\n * OrbitControls uses one `enableZoom` flag for both wheel and touch pinch.\n * Swallow wheel on the document (capture) so the page can scroll and pinch\n * stays available. Listen on `document` because R3F's `events.connected` is\n * `false` until the canvas host is wired — attaching to that value is a no-op.\n */\nfunction OrbitWheelZoomGuard({\n blockWheel,\n eventSource,\n}: {\n blockWheel: boolean;\n eventSource?: React.RefObject<HTMLElement | null>;\n}) {\n const gl = useThree((state) => state.gl);\n const connected = useThree((state) => state.events.connected);\n\n useEffect(() => {\n if (!blockWheel) return;\n\n const onWheel = (event: WheelEvent) => {\n const root = orbitEventRoot(\n eventSource?.current,\n connected,\n gl.domElement,\n );\n if (!viewerWheelEventHitsMap(root, event.target)) return;\n suppressViewerWheelZoom(event);\n };\n\n document.addEventListener('wheel', onWheel, { capture: true });\n return () => document.removeEventListener('wheel', onWheel, { capture: true });\n }, [blockWheel, connected, eventSource, gl.domElement]);\n\n return null;\n}\n\nexport interface MapSceneProps {\n doc: PublishedDocument;\n theme: ThemeDefaults;\n activeLevelId: number | null;\n route: PathResult | null;\n selectedShapeId?: number | null;\n selectedShapeIds?: number[];\n hoveredShapeId?: number | null;\n focusKey?: string | number | null;\n focusViewBounds?: SceneBounds | null;\n cameraRef?: React.Ref<MapCameraHandle | null>;\n onSelectShape?: (\n shapeId: number | null,\n levelId: number,\n opts?: { additive?: boolean },\n ) => void;\n onActiveLevelChange?: (levelId: number) => void;\n imageProxyUrl?: string | null;\n /** Keep pointer events inside the map canvas host so header/footer stay clickable. */\n eventSource?: React.RefObject<HTMLElement | null>;\n /** WEBSITE / DISPLAY_APP hide unassigned amenity, kiosk, elevator, and escalator shapes. */\n host?: MapViewerHost;\n /** Assigned kiosk shape currently running this DISPLAY_APP viewer. */\n kioskOriginShapeId?: number | null;\n retailers?: PublishedRetailer[];\n showHoverTooltip?: boolean;\n onHoverTooltip?: ViewerHoverTooltipHandler;\n homePose?: ResponsiveCameraPose | CameraPose | null;\n homePoseKey?: string | null;\n resetFitsMap?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n /** Override website wheel-block (staff Map Responsiveness capture). */\n allowWheelZoom?: boolean;\n}\n\nexport function MapScene({\n doc,\n theme,\n activeLevelId,\n route,\n selectedShapeId,\n selectedShapeIds,\n hoveredShapeId = null,\n focusKey,\n focusViewBounds,\n cameraRef,\n onSelectShape,\n onActiveLevelChange,\n imageProxyUrl,\n eventSource,\n host = 'PORTAL_ASSIGN',\n homePose = null,\n homePoseKey = null,\n resetFitsMap = false,\n onCameraChange,\n onCameraReset,\n allowWheelZoom,\n kioskOriginShapeId = null,\n retailers = [],\n showHoverTooltip = false,\n onHoverTooltip,\n}: MapSceneProps) {\n const is3d = theme.MAP_STYLE === '3D';\n const controlsRef = useRef<OrbitControlsImpl | null>(null);\n const persistedViewRef = useRef<CameraViewSnapshot | null>(null);\n const pointerDownRef = useRef<{ x: number; y: number } | null>(null);\n const pointerGestureRef = useRef(createViewerPointerGesture());\n\n useEffect(() => {\n const root = eventSource?.current;\n if (!root) return;\n\n const gesture = pointerGestureRef.current;\n\n const onDown = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n pointerDownRef.current = { x: pos.x, y: pos.y };\n beginViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n const onMove = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n moveViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n const onUp = (e: PointerEvent) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n endViewerPointerGesture(gesture, pos.x, pos.y, pos.pointerId);\n };\n\n root.addEventListener('pointerdown', onDown, true);\n window.addEventListener('pointermove', onMove, { passive: true });\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n root.removeEventListener('pointerdown', onDown, true);\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [eventSource]);\n\n const stacked = useMemo(\n () => viewerLevelStack(doc.levels, activeLevelId),\n [doc.levels, activeLevelId],\n );\n\n const bounds = useMemo(\n () => boundsFromStackedLevels(doc.levels, activeLevelId, doc.baseViewbox),\n [doc.levels, doc.baseViewbox, activeLevelId],\n );\n\n const view = useMemo(\n () => viewBoundsFromData(bounds),\n [\n bounds.cx,\n bounds.cy,\n bounds.maxX,\n bounds.maxY,\n bounds.minX,\n bounds.minY,\n bounds.size,\n ],\n );\n const cameraPosition = useMemo(\n () => [view.cx, view.cy, 500] as [number, number, number],\n [view.cx, view.cy],\n );\n const camera3dPosition = useMemo(\n () =>\n [view.cx, view.cy - view.size * 0.35, view.size * 0.85] as [\n number,\n number,\n number,\n ],\n [view.cx, view.cy, view.size],\n );\n const mouseButtons = useMemo(() => orbitMouseButtons(is3d), [is3d]);\n const touches = useMemo(() => orbitTouches(is3d), [is3d]);\n\n const outdoorLevel = useMemo(\n () => doc.levels.find((level) => isOutdoorLevel(level)) ?? null,\n [doc.levels],\n );\n\n const outdoorSvgUrl =\n outdoorLevel?.sourceSvgUrl ?? doc.baseSvgUrl ?? null;\n\n const suppressIds = useMemo(\n () => outdoorSvgSuppressIds(doc.levels),\n [doc.levels],\n );\n\n const showOutdoorSvg = stacked.some((level) => isOutdoorLevel(level));\n\n const outdoorTheme = useMemo(\n () => ({\n GREEN_AREA_COLOR: theme.GREEN_AREA_COLOR,\n WATER_COLOR: theme.WATER_COLOR,\n PARKING_LANE_COLOR: theme.PARKING_LANE_COLOR,\n PARKING_ICON_COLOR: theme.PARKING_ICON_COLOR,\n WALKABLE_COLOR: theme.WALKABLE_COLOR,\n }),\n [\n theme.GREEN_AREA_COLOR,\n theme.PARKING_ICON_COLOR,\n theme.PARKING_LANE_COLOR,\n theme.WALKABLE_COLOR,\n theme.WATER_COLOR,\n ],\n );\n\n return (\n <Canvas\n style={{\n width: '100%',\n height: '100%',\n background: isTransparentColor(theme.MAP_BACKGROUND_COLOR)\n ? 'transparent'\n : theme.MAP_BACKGROUND_COLOR,\n }}\n eventSource={eventSource as React.RefObject<HTMLElement> | undefined}\n eventPrefix=\"offset\"\n orthographic={!is3d}\n frameloop=\"demand\"\n dpr={CANVAS_DPR}\n flat\n gl={CANVAS_GL}\n onPointerDown={(e) => {\n const pos = viewerPointerClientXY(e);\n if (!pos) return;\n pointerDownRef.current = { x: pos.x, y: pos.y };\n beginViewerPointerGesture(pointerGestureRef.current, pos.x, pos.y, pos.pointerId);\n }}\n onPointerMissed={(e) => {\n if (\n pointerMissClearsSelection(pointerDownRef.current, {\n x: e.clientX,\n y: e.clientY,\n button: e.button,\n })\n ) {\n onSelectShape?.(null, activeLevelId ?? 0);\n }\n }}\n camera={\n is3d\n ? {\n position: camera3dPosition,\n fov: 50,\n near: 1,\n far: 10000,\n up: CAMERA_UP,\n }\n : undefined\n }\n >\n {!is3d && (\n <OrthographicCamera\n makeDefault\n position={cameraPosition}\n up={CAMERA_UP}\n near={0.1}\n far={5000}\n />\n )}\n {isTransparentColor(theme.MAP_BACKGROUND_COLOR) ? null : (\n <color attach=\"background\" args={[theme.MAP_BACKGROUND_COLOR]} />\n )}\n <ambientLight intensity={4} color=\"#c4c4c4\" />\n <directionalLight position={[0, 400, 0]} color=\"#ffffff\" intensity={0.3} />\n <directionalLight position={[0, 0, 400]} color=\"#c4c4c4\" intensity={0.2} />\n <directionalLight position={[0, 0, -400]} color=\"#c4c4c4\" intensity={0.2} />\n\n <group scale={SCENE_FLIP_SCALE}>\n {showOutdoorSvg && outdoorSvgUrl ? (\n <SvgVectorLayer\n url={outdoorSvgUrl}\n suppressIds={suppressIds}\n imageProxyUrl={imageProxyUrl}\n is3d={is3d}\n theme={outdoorTheme}\n />\n ) : null}\n\n {stacked.map((level) => {\n const outdoor = isOutdoorLevel(level);\n const transform = level.transform;\n return (\n <group\n key={level.id}\n position={[\n transform.translateX,\n transform.translateY,\n outdoor ? OUTDOOR_Z : 0,\n ]}\n rotation={[0, 0, (transform.rotate * Math.PI) / 180]}\n scale={transform.scale || 1}\n >\n <LevelMeshes\n level={level}\n levels={doc.levels}\n theme={theme}\n is3d={is3d}\n eventSource={eventSource}\n pointerGestureRef={pointerGestureRef}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n interactiveOnly={outdoor && Boolean(outdoorSvgUrl)}\n imageProxyUrl={imageProxyUrl}\n amenities={doc.amenities}\n retailers={retailers}\n host={host}\n kioskOriginShapeId={kioskOriginShapeId}\n showHoverTooltip={showHoverTooltip}\n onHoverTooltip={onHoverTooltip}\n onSelectShape={(shapeId, opts) =>\n onSelectShape?.(shapeId, level.id, opts)\n }\n />\n {route && level.id === activeLevelId ? (\n <RouteLine\n route={route}\n levelId={level.id}\n levels={doc.levels}\n connectors={doc.connectors}\n color={theme.ROUTE_COLOR}\n thickness={theme.ROUTE_THICKNESS}\n onActiveLevelChange={onActiveLevelChange}\n />\n ) : null}\n </group>\n );\n })}\n </group>\n\n <OrbitWheelZoomGuard\n eventSource={eventSource}\n blockWheel={!(allowWheelZoom ?? viewerAllowsWheelZoom(host))}\n />\n <OrbitControls\n ref={controlsRef}\n makeDefault\n enableDamping={false}\n enableRotate={is3d}\n enablePan\n enableZoom\n screenSpacePanning\n zoomSpeed={1}\n zoomToCursor={ORBIT_ZOOM_TO_CURSOR}\n mouseButtons={mouseButtons}\n touches={touches}\n maxDistance={theme.CAMERA_MAX_DISTANCE}\n minDistance={theme.CAMERA_MIN_DISTANCE}\n />\n <CameraRig\n bounds={view}\n theme={theme}\n is3d={is3d}\n controlsRef={controlsRef}\n cameraRef={cameraRef}\n persistedViewRef={persistedViewRef}\n focusKey={focusKey ?? selectedShapeId ?? null}\n focusViewBounds={focusViewBounds ?? null}\n homePose={homePose}\n homePoseKey={homePoseKey}\n resetFitsMap={resetFitsMap}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n />\n </Canvas>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport {\n STATIC_ICON_COLORS,\n type CmAmenityCatalogItem,\n type PathResult,\n type PublishedDocument,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport { getAmenityByType, recolorMapSvg } from '../../specialIcons';\n\nexport interface RuntimeChromeProps {\n doc: PublishedDocument;\n amenities: CmAmenityCatalogItem[];\n activeLevelId: number | null;\n onActiveLevelChange: (id: number) => void;\n fromAnchorId: number | null;\n toAnchorId: number | null;\n onFromChange: (id: number | null) => void;\n onToChange: (id: number | null) => void;\n accessibleOnly: boolean;\n onAccessibleOnlyChange: (v: boolean) => void;\n route: PathResult | null;\n showSearch?: boolean;\n showAmenities?: boolean;\n amenityIconColor?: string;\n}\n\ninterface ListItem {\n id: string;\n label: string;\n group: string;\n anchorId: number | null;\n levelId: number;\n kind: 'store' | 'amenity';\n amenityId: number | null;\n}\n\nfunction itemLabel(\n shape: PublishedDocument['levels'][number]['shapes'][number],\n amenityName?: string,\n): string {\n return (\n shape.assignment?.customLabel ||\n amenityName ||\n shape.label.text ||\n shape.assignment?.unitNumber ||\n shape.key\n );\n}\n\nexport function RuntimeChrome({\n doc,\n amenities,\n fromAnchorId,\n toAnchorId,\n onFromChange,\n onToChange,\n accessibleOnly,\n onAccessibleOnlyChange,\n route,\n showSearch = true,\n showAmenities = true,\n amenityIconColor = STATIC_ICON_COLORS.amenity,\n}: RuntimeChromeProps) {\n const [query, setQuery] = useState('');\n const [selectedItem, setSelectedItem] = useState<ListItem | null>(null);\n\n const items = useMemo(() => {\n const list: ListItem[] = [];\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id) ?? null;\n if (shape.kind === 'unit') {\n list.push({\n id: `store-${shape.id}`,\n label: itemLabel(shape),\n group: level.name,\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'store',\n amenityId: null,\n });\n }\n if (shape.kind === 'amenity' && shape.assignment?.amenityId) {\n const amenity = amenities.find((a) => a.id === shape.assignment!.amenityId);\n list.push({\n id: `amenity-${shape.id}`,\n label: itemLabel(shape, amenity?.name),\n group: 'Amenities',\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'amenity',\n amenityId: amenity?.id ?? shape.assignment.amenityId,\n });\n }\n }\n }\n return list;\n }, [doc, amenities]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter((i) => i.label.toLowerCase().includes(q));\n }, [items, query]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, ListItem[]>();\n for (const item of filtered) {\n const arr = map.get(item.group) ?? [];\n arr.push(item);\n map.set(item.group, arr);\n }\n return Array.from(map.entries());\n }, [filtered]);\n\n const anchorOptions = items.filter((i) => i.anchorId != null);\n const hasQuery = query.trim().length > 0;\n\n const selectItem = (item: ListItem) => {\n setSelectedItem(item);\n if (item.anchorId != null) {\n onToChange(item.anchorId);\n }\n };\n\n if (!showSearch && !(showAmenities && amenities.length > 0)) {\n return null;\n }\n\n return (\n <div className=\"eyeon-map-chrome\">\n <div className=\"eyeon-map-chrome__top\">\n {showSearch && (\n <input\n type=\"search\"\n className=\"eyeon-map-chrome__search-input\"\n placeholder=\"Search...\"\n aria-label=\"Search...\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n )}\n\n {showAmenities && amenities.length > 0 && (\n <div className=\"eyeon-map-chrome__amenities\">\n {amenities.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n className=\"eyeon-map-chrome__amenity\"\n aria-label={a.name}\n onClick={() => {\n const match = items.find(\n (i) =>\n i.kind === 'amenity' &&\n i.amenityId === a.id &&\n i.anchorId != null,\n );\n if (match) selectItem(match);\n }}\n >\n {(() => {\n const amenity = getAmenityByType(a.code);\n return amenity ? (\n <span\n className=\"eyeon-map-chrome__amenity-icon\"\n dangerouslySetInnerHTML={{\n __html: recolorMapSvg(amenity.svgCode, amenityIconColor),\n }}\n />\n ) : (\n <span className=\"eyeon-map-chrome__amenity-label\">\n {a.name.slice(0, 2)}\n </span>\n );\n })()}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {showSearch && hasQuery && (\n <div className=\"eyeon-map-chrome__panel\">\n <div className=\"eyeon-map-chrome__groups\">\n {grouped.length === 0 ? (\n <div className=\"eyeon-map-chrome__empty\">No matching stores</div>\n ) : (\n grouped.map(([group, groupItems]) => (\n <div key={group} className=\"eyeon-map-chrome__group\">\n <div className=\"eyeon-map-chrome__group-title\">{group}</div>\n {groupItems.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={\n selectedItem?.id === item.id\n ? 'eyeon-map-chrome__item is-selected'\n : 'eyeon-map-chrome__item'\n }\n onClick={() => selectItem(item)}\n >\n {item.label}\n </button>\n ))}\n </div>\n ))\n )}\n </div>\n\n {selectedItem && (\n <div className=\"eyeon-map-chrome__detail\">\n <div className=\"eyeon-map-chrome__detail-title\">{selectedItem.label}</div>\n <div className=\"eyeon-map-chrome__detail-meta\">{selectedItem.group}</div>\n </div>\n )}\n\n <div className=\"eyeon-map-chrome__route\">\n <label>\n From\n <ModernSelect\n ariaLabel=\"From\"\n value={fromAnchorId != null ? String(fromAnchorId) : ''}\n placeholder=\"Select start\"\n searchable\n options={anchorOptions.map((i) => ({\n value: String(i.anchorId),\n label: `${i.label} · ${i.group}`,\n }))}\n onChange={(next) => onFromChange(next ? Number(next) : null)}\n />\n </label>\n <label>\n To\n <ModernSelect\n ariaLabel=\"To\"\n value={toAnchorId != null ? String(toAnchorId) : ''}\n placeholder=\"Select destination\"\n searchable\n options={anchorOptions.map((i) => ({\n value: String(i.anchorId),\n label: `${i.label} · ${i.group}`,\n }))}\n onChange={(next) => onToChange(next ? Number(next) : null)}\n />\n </label>\n <label className=\"eyeon-map-chrome__accessible\">\n <input\n type=\"checkbox\"\n checked={accessibleOnly}\n onChange={(e) => onAccessibleOnlyChange(e.target.checked)}\n />\n Accessible route\n </label>\n {route && (\n <div className=\"eyeon-map-chrome__route-meta\">\n {route.levelChanges.length > 0\n ? `${route.levelChanges.length} level change(s)`\n : 'Same level'}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n formatRetailerPhone,\n resolveFetchUrl,\n websiteFromRetailerOptions,\n websiteInfoModalDirections,\n} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport type {\n MapViewerHost,\n WebsiteDestination,\n WebsiteMappedRetailer,\n} from '../../core';\n\nexport function WebsiteInfoModal({\n destination,\n retailers,\n imageProxyUrl,\n host = 'WEBSITE',\n onClose,\n onMapIt,\n}: {\n destination: WebsiteDestination;\n retailers: WebsiteMappedRetailer[];\n imageProxyUrl?: string | null;\n host?: MapViewerHost;\n onClose: () => void;\n onMapIt: (fromRetailerId: number) => void;\n}) {\n const [fromRetailerId, setFromRetailerId] = useState('');\n const retailer =\n destination.kind === 'store' && destination.retailerId != null\n ? retailers.find((item) => item.id === destination.retailerId) ?? null\n : null;\n\n const options = useMemo(\n () => websiteFromRetailerOptions(retailers, destination.retailerId),\n [destination.retailerId, retailers],\n );\n\n useEffect(() => {\n setFromRetailerId('');\n }, [destination.shapeId]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n if (typeof document === 'undefined') return null;\n\n const logo = retailer?.logoUrl\n ? resolveFetchUrl(retailer.logoUrl, imageProxyUrl)\n : null;\n const showDetails = Boolean(\n retailer &&\n (logo ||\n retailer.name ||\n retailer.location ||\n retailer.phone ||\n retailer.description),\n );\n const directions = websiteInfoModalDirections(host, destination);\n const mapItDisabled = directions.mapItDisabled || !fromRetailerId;\n const showForm = directions.showFromRetailers || directions.showMapIt;\n\n return createPortal(\n <div\n className=\"eyeon-map-info-modal\"\n role=\"presentation\"\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div\n className=\"eyeon-map-info-modal__dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"eyeon-map-info-modal-title\"\n >\n <button\n type=\"button\"\n className=\"eyeon-map-info-modal__close\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#000\" />\n <path\n d=\"M8 8l8 8M16 8l-8 8\"\n stroke=\"#fff\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n <div className=\"eyeon-map-info-modal__body\">\n <div className=\"eyeon-map-info-modal__content\">\n {showDetails ? (\n <div className=\"eyeon-map-info-modal__retailer\">\n {logo ? (\n <div className=\"eyeon-map-info-modal__logo\">\n <img src={logo} alt={retailer?.name ?? ''} />\n </div>\n ) : null}\n <div className=\"eyeon-map-info-modal__copy\">\n <div id=\"eyeon-map-info-modal-title\">\n <b>Retailer:</b> {retailer?.name}\n </div>\n {retailer?.location ? (\n <div>\n <b>Location:</b> {retailer.location}\n </div>\n ) : null}\n {retailer?.phone ? (\n <div>\n <b>Phone:</b>{' '}\n <a href={`tel:${retailer.phone}`}>\n {formatRetailerPhone(retailer.phone)}\n </a>\n </div>\n ) : null}\n {retailer?.description ? (\n <div\n dangerouslySetInnerHTML={{ __html: retailer.description }}\n />\n ) : null}\n </div>\n </div>\n ) : (\n <div\n id=\"eyeon-map-info-modal-title\"\n className=\"eyeon-map-info-modal__amenity\"\n >\n {destination.name}\n </div>\n )}\n </div>\n {showForm ? (\n <form\n className=\"eyeon-map-info-modal__form\"\n onSubmit={(e) => {\n e.preventDefault();\n if (mapItDisabled) return;\n const id = Number(fromRetailerId);\n if (Number.isFinite(id) && id > 0) onMapIt(id);\n }}\n >\n {directions.showFromRetailers ? (\n <ModernSelect\n ariaLabel=\"Choose a Retailer\"\n value={fromRetailerId}\n placeholder=\"Get direction from ...\"\n searchable\n options={options}\n onChange={setFromRetailerId}\n />\n ) : null}\n {directions.showMapIt ? (\n <span\n className=\"eyeon-map-info-modal__map-it-tooltip\"\n data-tooltip={directions.mapItTooltip ?? undefined}\n tabIndex={directions.mapItTooltip ? 0 : undefined}\n >\n <button\n type=\"submit\"\n className=\"eyeon-map-info-modal__map-it\"\n disabled={mapItDisabled}\n aria-describedby={\n directions.mapItTooltip\n ? 'eyeon-map-info-modal-map-it-tip'\n : undefined\n }\n >\n Map IT\n </button>\n {directions.mapItTooltip ? (\n <span\n id=\"eyeon-map-info-modal-map-it-tip\"\n className=\"eyeon-map-info-modal__sr-only\"\n >\n {directions.mapItTooltip}\n </span>\n ) : null}\n </span>\n ) : null}\n </form>\n ) : null}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","import React from 'react';\nimport type { ViewerHoverTooltip } from '../../core';\n\nexport function HoverTooltip({\n tooltip,\n}: {\n tooltip: ViewerHoverTooltip | null;\n}) {\n if (!tooltip) return null;\n return (\n <div\n className=\"eyeon-map-hover-tooltip\"\n role=\"tooltip\"\n style={{ left: tooltip.x, top: tooltip.y }}\n >\n <div className=\"eyeon-map-hover-tooltip__pop\">\n <span className=\"eyeon-map-hover-tooltip__label\">{tooltip.text}</span>\n <span className=\"eyeon-map-hover-tooltip__arrow\" aria-hidden=\"true\" />\n </div>\n </div>\n );\n}\n","import {\n normalizeRetailerCatalogItem,\n type PublishedRetailer,\n} from '../core';\n\nexport async function fetchWebsiteRetailers(\n webApiURI: string,\n centerId?: number,\n signal?: AbortSignal,\n): Promise<PublishedRetailer[]> {\n const base = webApiURI.replace(/\\/$/, '');\n const all: unknown[] = [];\n let page = 1;\n while (!signal?.aborted) {\n const params = new URLSearchParams({\n limit: '100',\n page: String(page),\n });\n if (centerId != null && centerId > 0) {\n params.set('center_id', String(centerId));\n }\n const res = await fetch(`${base}/v1/retailers?${params}`, {\n credentials: 'include',\n signal,\n });\n if (!res.ok) break;\n const json = (await res.json()) as { items?: unknown[]; count?: number };\n const items = Array.isArray(json.items)\n ? json.items\n : Array.isArray(json)\n ? json\n : [];\n all.push(...items);\n const count = typeof json.count === 'number' ? json.count : all.length;\n if (all.length >= count || items.length < 100) break;\n page += 1;\n }\n return all\n .map(normalizeRetailerCatalogItem)\n .filter((item): item is PublishedRetailer => item != null);\n}\n","import React, { Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n DeviceType,\n MapViewerHost,\n PathResult,\n PublishedDocument,\n PublishedRetailer,\n ThemeDefaults,\n ViewerHoverTooltip,\n} from '../core';\nimport {\n compileGraph,\n defaultViewerLevelId,\n deviceFromHost,\n findResponsiveOverride,\n findViewerKioskOrigin,\n MAP_NO_FLOORS_MESSAGE,\n mergeTheme,\n findNearestAmenityPath,\n findShortestPlacePath,\n matchingShapeAnchorIds,\n normalizePublishedDocument,\n shapeAnchorIds,\n overrideToCameraPose,\n responsiveViewKey,\n viewerAllowsWheelZoom,\n viewerCanShowScene,\n viewerChrome,\n viewerLevelIdAfterShapeSelect,\n viewerResetPatch,\n websiteClickOpensModal,\n websiteDestination,\n websiteMapItAnchors,\n websiteRetailersOnMap,\n type ViewerResetKind,\n} from '../core';\nimport { MapScene } from './components/MapScene';\nimport { isAssignAmenity } from '../specialIcons';\nimport type { CameraViewSnapshot, MapCameraHandle } from './components/CameraRig';\nimport { RuntimeChrome } from './ui/RuntimeChrome';\nimport { MapControls } from './ui/MapControls';\nimport { WebsiteInfoModal } from './ui/WebsiteInfoModal';\nimport { HoverTooltip } from './ui/HoverTooltip';\nimport { fetchWebsiteRetailers } from './fetchWebsiteRetailers';\nimport {\n selectionFocusKey,\n viewFocusBoundsForShape,\n viewFocusBoundsForShapes,\n viewFocusBoundsForRoute,\n} from './camera';\nimport {\n routeOriginLevelId,\n shouldPinViewToRouteOrigin,\n} from './routeFloorChanges';\nimport { ensureMapFont } from '../fonts/mapFontUrl';\nimport './viewer.css';\n\nexport interface MapViewerProps {\n /** Published (or draft) document. If omitted, fetched from webApiURI. */\n document?: PublishedDocument | null;\n webApiURI?: string;\n /** Prefer fetching /v1/map/document */\n centerId?: number;\n /** Public / preview / kiosk surface. Never includes Map options (editor rail). */\n host?: MapViewerHost;\n kioskId?: number | null;\n selectedRetailerId?: number | null;\n /**\n * Media proxy base for remote http(s) media (v1 `IMAGE_PROXY_URL` contract,\n * e.g. `/eyeon-portal/media?url=`). Needed wherever the outdoor SVG or\n * retailer logos are cross-origin. Inlined amenity / kiosk data URLs skip it.\n */\n imageProxyUrl?: string | null;\n themeOverrides?: Partial<ThemeDefaults>;\n onExtractedAmenities?: (codes: string[]) => void;\n onSelectShape?: (shapeId: number | null, opts?: { additive?: boolean }) => void;\n /** Zoom to this shape (PORTAL default-map assign). */\n selectedShapeId?: number | null;\n /** Extra selected shapes when Shift-selecting in PORTAL assign. */\n selectedShapeIds?: number[];\n /** Highlight from the Map options list (same fill as pointer hover). */\n hoveredShapeId?: number | null;\n /**\n * Bump when staff pick a row in the rail so the camera re-frames even if\n * the same shape is already selected.\n */\n focusNonce?: number;\n /** Controlled floor when embedded (e.g. PORTAL default). */\n activeLevelId?: number | null;\n onActiveLevelChange?: (levelId: number) => void;\n /** Click a store/amenity to route. Off when PORTAL is assigning. Default true. */\n routeOnSelect?: boolean;\n createRouteRef?: React.MutableRefObject<{\n createRouteToStore: (retailerId: number) => void;\n createRouteToAmenity: (amenityCode: string) => void;\n clearRoute: () => void;\n /** Kiosk idle reset: clear routing, restore its floor, and reset the camera. */\n resetMap: () => void;\n } | null>;\n className?: string;\n style?: React.CSSProperties;\n /** Force a responsiveness slot (staff editor). Otherwise derived from host + width. */\n device?: DeviceType;\n /** Staff capture: wheel zoom on, no store modal, camera-change events. */\n captureCamera?: boolean;\n onCameraChange?: (view: CameraViewSnapshot) => void;\n onCameraReset?: () => void;\n}\n\nasync function fetchDocument(\n webApiURI: string,\n centerId?: number,\n draft?: boolean,\n signal?: AbortSignal,\n): Promise<PublishedDocument> {\n const base = webApiURI.replace(/\\/$/, '');\n const params = new URLSearchParams();\n if (centerId != null && centerId > 0) params.set('center_id', String(centerId));\n if (draft) params.set('draft', '1');\n const qs = params.toString();\n const res = await fetch(`${base}/v1/map/document${qs ? `?${qs}` : ''}`, {\n credentials: 'include',\n signal,\n });\n if (!res.ok) {\n throw new Error(`Failed to load map document (${res.status})`);\n }\n return res.json();\n}\n\nexport function MapViewer(props: MapViewerProps) {\n ensureMapFont();\n const {\n document: documentProp,\n webApiURI,\n centerId,\n host = 'WEBSITE',\n kioskId = null,\n selectedRetailerId = null,\n themeOverrides,\n onExtractedAmenities,\n createRouteRef,\n className,\n style,\n activeLevelId: activeLevelIdProp,\n onActiveLevelChange,\n routeOnSelect = true,\n imageProxyUrl,\n selectedShapeId = null,\n selectedShapeIds,\n hoveredShapeId = null,\n focusNonce,\n device: deviceProp,\n captureCamera = false,\n onCameraChange,\n onCameraReset,\n } = props;\n\n const [rawDoc, setDoc] = useState<PublishedDocument | null>(documentProp ?? null);\n const doc = useMemo(\n () => (rawDoc ? normalizePublishedDocument(rawDoc) : null),\n [rawDoc],\n );\n const [error, setError] = useState<string | null>(null);\n const [route, setRoute] = useState<PathResult | null>(null);\n const [fromAnchorId, setFromAnchorId] = useState<number | null>(null);\n const [toAnchorId, setToAnchorId] = useState<number | null>(null);\n const [accessibleOnly, setAccessibleOnly] = useState(false);\n const [websiteShapeId, setWebsiteShapeId] = useState<number | null>(null);\n const [websiteModalOpen, setWebsiteModalOpen] = useState(false);\n const [hoverTooltip, setHoverTooltip] = useState<ViewerHoverTooltip | null>(\n null,\n );\n const [fetchedRetailers, setFetchedRetailers] = useState<\n PublishedRetailer[] | null\n >(null);\n const [internalLevelId, setInternalLevelId] = useState<number | null>(() => {\n if (!documentProp) return null;\n return defaultViewerLevelId(normalizePublishedDocument(documentProp).levels);\n });\n const cameraApi = useRef<MapCameraHandle | null>(null);\n const canvasHostRef = useRef<HTMLDivElement>(null);\n const routeEndpointsRef = useRef<{ from: number | null; to: number | null }>({\n from: null,\n to: null,\n });\n const [viewportWidth, setViewportWidth] = useState(1280);\n const activeLevelId = activeLevelIdProp ?? internalLevelId;\n const setActiveLevelId = (id: number | null) => {\n setInternalLevelId(id);\n if (id != null) onActiveLevelChange?.(id);\n };\n\n useEffect(() => {\n if (documentProp) {\n setDoc(documentProp);\n return;\n }\n if (!webApiURI) return;\n let cancelled = false;\n const controller = new AbortController();\n const draft = viewerChrome(host).fetchDraft;\n fetchDocument(webApiURI, centerId, draft, controller.signal)\n .then((d) => {\n if (!cancelled) setDoc(d);\n })\n .catch((e) => {\n if (\n !cancelled &&\n !(e instanceof DOMException && e.name === 'AbortError')\n ) {\n setError(e instanceof Error ? e.message : String(e));\n }\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [documentProp, webApiURI, centerId, host]);\n\n useEffect(() => {\n const el = canvasHostRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width;\n if (width && width > 0) setViewportWidth(width);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [doc, host]);\n\n useEffect(() => {\n const chrome = viewerChrome(host);\n if ((!chrome.storeModal && !chrome.hoverTooltip) || !webApiURI) return;\n let cancelled = false;\n const controller = new AbortController();\n fetchWebsiteRetailers(webApiURI, centerId, controller.signal)\n .then((items) => {\n if (!cancelled) setFetchedRetailers(items);\n })\n .catch(() => {\n if (!cancelled) setFetchedRetailers([]);\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n }, [webApiURI, centerId, host]);\n\n useEffect(() => {\n if (!doc) return;\n const ids = new Set(doc.levels.map((level) => level.id));\n if (activeLevelId == null || !ids.has(activeLevelId)) {\n setActiveLevelId(defaultViewerLevelId(doc.levels));\n }\n const codes = new Set<string>();\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.kind === 'amenity' && shape.assignment?.amenityId != null) {\n const amenity = doc.amenities.find((a) => a.id === shape.assignment!.amenityId);\n if (amenity) codes.add(amenity.code);\n }\n }\n }\n onExtractedAmenities?.(Array.from(codes));\n }, [doc, activeLevelId, onExtractedAmenities]);\n\n // Map IT / ?r= — switch to the store's floor so the highlight is visible\n useEffect(() => {\n if (!doc || selectedRetailerId == null) return;\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.assignment?.retailerId === selectedRetailerId) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(doc.levels, activeLevelId, level.id),\n );\n return;\n }\n }\n }\n }, [doc, selectedRetailerId]);\n\n const focusShapeIds = useMemo(() => {\n if (websiteShapeId != null) return [websiteShapeId];\n if (selectedShapeIds && selectedShapeIds.length > 0) return selectedShapeIds;\n return selectedShapeId != null ? [selectedShapeId] : [];\n }, [selectedShapeId, selectedShapeIds, websiteShapeId]);\n const selectionKey = selectionFocusKey(focusShapeIds);\n const selectionFocusKeyWithNonce =\n selectionKey == null\n ? null\n : focusNonce != null\n ? `${selectionKey}#${focusNonce}`\n : selectionKey;\n const selectionFocusBounds = useMemo(() => {\n if (!doc || focusShapeIds.length === 0) return null;\n // Union every selected shape so Shift-select frames the group, not the first id.\n return viewFocusBoundsForShapes(doc.levels, focusShapeIds);\n }, [doc, focusShapeIds]);\n const kioskOrigin = useMemo(\n () => (doc ? findViewerKioskOrigin(doc, host, kioskId) : null),\n [doc, host, kioskId],\n );\n const routeFocusBounds = useMemo(() => {\n if (!doc || !route) return null;\n return viewFocusBoundsForRoute(doc.levels, route, activeLevelId);\n }, [activeLevelId, doc, route]);\n const routeFocusKey = route\n ? `route:${activeLevelId ?? 'none'}:${route.anchorIds.join(',')}`\n : null;\n const focusKey = captureCamera\n ? null\n : routeFocusKey ?? selectionFocusKeyWithNonce;\n const focusViewBounds = captureCamera ? null : routeFocusBounds ?? selectionFocusBounds;\n const resolvedDevice = deviceProp ?? deviceFromHost(host, viewportWidth);\n const homeOverride = doc\n ? findResponsiveOverride(doc.responsiveOverrides, activeLevelId, resolvedDevice)\n : null;\n const homePose = homeOverride ? overrideToCameraPose(homeOverride) : null;\n const homePoseKey = responsiveViewKey(\n activeLevelId,\n resolvedDevice,\n captureCamera,\n );\n\n // DISPLAY_APP starts on the physical kiosk floor and routes from that kiosk.\n useEffect(() => {\n if (!viewerChrome(host).kioskOrigin || !kioskOrigin) return;\n setFromAnchorId(kioskOrigin.anchorId);\n setActiveLevelId(kioskOrigin.levelId);\n // setActiveLevelId intentionally omitted: it is recreated each render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [host, kioskOrigin]);\n\n const compiled = useMemo(() => {\n if (!doc) return null;\n return compileGraph(\n doc.graph.nodes.map((n) => ({\n id: n.id,\n levelId: n.levelId,\n shapeId: n.shapeId,\n kind: n.kind,\n x: n.x,\n y: n.y,\n connectorId: n.connectorId,\n })),\n doc.graph.edges.map((e) => ({\n id: e.id,\n mapId: doc.mapId,\n fromAnchorId: e.from,\n toAnchorId: e.to,\n weight: e.weight,\n directed: e.directed,\n accessible: e.accessible,\n kind: e.kind,\n })),\n doc.connectors,\n );\n }, [doc]);\n\n const websiteRetailers = useMemo(() => {\n if (!doc) return [];\n return websiteRetailersOnMap(\n doc,\n fetchedRetailers && fetchedRetailers.length > 0\n ? fetchedRetailers\n : doc.retailers,\n );\n }, [doc, fetchedRetailers]);\n\n const hoverRetailers = useMemo(() => {\n if (fetchedRetailers && fetchedRetailers.length > 0) return fetchedRetailers;\n return doc?.retailers ?? [];\n }, [doc?.retailers, fetchedRetailers]);\n\n const handleHoverTooltip = useCallback(\n (\n next: ViewerHoverTooltip | null,\n opts?: { leavingShapeId?: number },\n ) => {\n setHoverTooltip((current) => {\n if (next) return next;\n if (opts?.leavingShapeId != null) {\n return current?.shapeId === opts.leavingShapeId ? null : current;\n }\n return null;\n });\n },\n [],\n );\n\n useEffect(() => {\n setHoverTooltip(null);\n }, [host, activeLevelId, websiteModalOpen]);\n\n const websiteDestinationInfo = useMemo(() => {\n if (!doc || websiteShapeId == null) return null;\n return websiteDestination(doc, websiteShapeId);\n }, [doc, websiteShapeId]);\n\n const runRoute = (fromId: number | null, toId: number | null) => {\n const pinOrigin = shouldPinViewToRouteOrigin(\n routeEndpointsRef.current.from,\n routeEndpointsRef.current.to,\n fromId,\n toId,\n );\n routeEndpointsRef.current = { from: fromId, to: toId };\n if (!compiled || fromId == null || toId == null) {\n setRoute(null);\n return;\n }\n const result = findShortestPlacePath(compiled, [fromId], [toId], {\n accessibleOnly,\n });\n setRoute(result);\n // Stay on the start floor. Taps on escalator / elevator icons change floors.\n if (pinOrigin) {\n const originLevelId = routeOriginLevelId(result);\n if (originLevelId != null) setActiveLevelId(originLevelId);\n }\n };\n\n useEffect(() => {\n runRoute(fromAnchorId, toAnchorId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromAnchorId, toAnchorId, accessibleOnly, compiled]);\n\n /** Chrome Reset: loaded default, current floor. Idle: also restore kiosk floor. */\n const applyViewerReset = useCallback(\n (kind: ViewerResetKind) => {\n const patch = viewerResetPatch({\n kind,\n kioskOrigin,\n activeLevelId,\n defaultLevelId: doc ? defaultViewerLevelId(doc.levels) : null,\n });\n setToAnchorId(null);\n setRoute(null);\n setWebsiteModalOpen(false);\n setWebsiteShapeId(null);\n setFromAnchorId(patch.fromAnchorId);\n if (patch.nextLevelId != null) {\n setActiveLevelId(patch.nextLevelId);\n }\n if (patch.resetCamera) {\n cameraApi.current?.reset();\n }\n },\n [activeLevelId, doc, kioskOrigin],\n );\n\n useEffect(() => {\n if (!createRouteRef || !doc) return;\n const routeApi = {\n createRouteToStore(retailerId: number) {\n const toIds = matchingShapeAnchorIds(\n doc.levels,\n (shape) => shape.assignment?.retailerId === retailerId,\n );\n if (toIds.length === 0) return;\n if (compiled && fromAnchorId != null) {\n const nearest = findShortestPlacePath(\n compiled,\n [fromAnchorId],\n toIds,\n { accessibleOnly },\n );\n const destinationAnchorId = nearest?.anchorIds.at(-1);\n if (destinationAnchorId != null) {\n setToAnchorId(destinationAnchorId);\n return;\n }\n }\n setToAnchorId(toIds[0]);\n },\n createRouteToAmenity(amenityCode: string) {\n const amenity = doc.amenities.find((a) => a.code === amenityCode);\n if (!amenity || !compiled || fromAnchorId == null) return;\n const anchorIds = matchingShapeAnchorIds(\n doc.levels,\n (shape) => shape.assignment?.amenityId === amenity.id,\n );\n const nearest = findNearestAmenityPath(compiled, fromAnchorId, anchorIds, {\n accessibleOnly,\n });\n const destinationAnchorId = nearest?.anchorIds.at(-1);\n if (destinationAnchorId != null) setToAnchorId(destinationAnchorId);\n },\n clearRoute() {\n setToAnchorId(null);\n setRoute(null);\n },\n resetMap() {\n applyViewerReset('idle');\n },\n };\n createRouteRef.current = routeApi;\n return () => {\n if (createRouteRef.current === routeApi) createRouteRef.current = null;\n };\n }, [\n accessibleOnly,\n activeLevelId,\n applyViewerReset,\n compiled,\n createRouteRef,\n doc,\n fromAnchorId,\n ]);\n\n const theme: ThemeDefaults = mergeTheme(doc?.theme, themeOverrides);\n\n if (error) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--error ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__error\">{error}</div>\n </div>\n );\n }\n\n if (!doc) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--loading ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__loading\">Loading map…</div>\n </div>\n );\n }\n\n const amenitiesOnMap: CmAmenityCatalogItem[] = doc.amenities.filter(\n (a) =>\n isAssignAmenity(a.code) &&\n doc.levels.some((l) =>\n l.shapes.some((s) => s.assignment?.amenityId === a.id),\n ),\n );\n const chrome = captureCamera\n ? { ...viewerChrome(host), storeModal: false, hoverTooltip: false }\n : viewerChrome(host);\n // Portal staff (assign + responsiveness capture) can view Outdoor alone.\n // Website and display-app still require a building floor.\n const showMap = viewerCanShowScene(\n captureCamera ? 'PORTAL_ASSIGN' : host,\n doc.levels,\n );\n\n return (\n <div\n className={`eyeon-map-viewer eyeon-map-viewer--${host}${showMap ? '' : ' eyeon-map-viewer--empty'} ${className ?? ''}`}\n style={\n {\n ...style,\n ['--map-bg' as string]: theme.MAP_BACKGROUND_COLOR,\n } as React.CSSProperties\n }\n >\n {!showMap ? (\n <div className=\"eyeon-map-viewer__empty\">{MAP_NO_FLOORS_MESSAGE}</div>\n ) : null}\n\n {showMap && (chrome.search || chrome.amenities) && (\n <RuntimeChrome\n doc={doc}\n amenities={amenitiesOnMap}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n fromAnchorId={fromAnchorId}\n toAnchorId={toAnchorId}\n onFromChange={setFromAnchorId}\n onToChange={setToAnchorId}\n accessibleOnly={accessibleOnly}\n onAccessibleOnlyChange={setAccessibleOnly}\n route={route}\n showSearch={chrome.search}\n showAmenities={chrome.amenities}\n amenityIconColor={theme.AMENITY_ICON_COLOR}\n />\n )}\n\n {showMap ? (\n <MapControls\n levels={doc.levels}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n onZoomIn={() => cameraApi.current?.zoomIn()}\n onZoomOut={() => cameraApi.current?.zoomOut()}\n onReset={() => applyViewerReset('chrome')}\n showFloors={chrome.floors}\n showZoomReset={chrome.zoomReset}\n />\n ) : null}\n\n {showMap ? (\n <div ref={canvasHostRef} className=\"eyeon-map-viewer__canvas\">\n <Suspense fallback={null}>\n <MapScene\n doc={doc}\n theme={theme}\n host={host}\n kioskOriginShapeId={kioskOrigin?.shapeId ?? null}\n activeLevelId={activeLevelId}\n route={route}\n selectedShapeId={captureCamera ? null : websiteShapeId ?? selectedShapeId}\n selectedShapeIds={captureCamera ? [] : focusShapeIds}\n hoveredShapeId={captureCamera ? null : hoveredShapeId}\n focusKey={focusKey}\n focusViewBounds={focusViewBounds}\n cameraRef={cameraApi}\n eventSource={canvasHostRef}\n imageProxyUrl={imageProxyUrl}\n homePose={homePose}\n homePoseKey={homePoseKey}\n resetFitsMap={captureCamera}\n onCameraChange={onCameraChange}\n onCameraReset={onCameraReset}\n allowWheelZoom={captureCamera || viewerAllowsWheelZoom(host)}\n retailers={hoverRetailers}\n showHoverTooltip={chrome.hoverTooltip}\n onHoverTooltip={handleHoverTooltip}\n onActiveLevelChange={setActiveLevelId}\n onSelectShape={(shapeId, levelId, opts) => {\n if (shapeId == null) {\n if (chrome.storeModal) {\n setWebsiteModalOpen(false);\n setWebsiteShapeId(null);\n }\n props.onSelectShape?.(null);\n return;\n }\n const level = doc.levels.find((l) => l.id === levelId);\n const shape = level?.shapes.find((s) => s.id === shapeId);\n if (chrome.storeModal && websiteClickOpensModal(host, shape)) {\n setWebsiteShapeId(shapeId);\n setWebsiteModalOpen(true);\n if (!opts?.additive) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(\n doc.levels,\n activeLevelId,\n levelId,\n ),\n );\n }\n props.onSelectShape?.(shapeId, opts);\n return;\n }\n if (chrome.storeModal) {\n props.onSelectShape?.(shapeId, opts);\n return;\n }\n if (routeOnSelect) {\n const destIds = shapeAnchorIds(level?.anchors ?? [], shapeId);\n let destId = destIds[0];\n if (compiled && fromAnchorId != null && destIds.length > 1) {\n destId =\n findShortestPlacePath(compiled, [fromAnchorId], destIds, {\n accessibleOnly,\n })?.anchorIds.at(-1) ?? destId;\n }\n if (destId != null) setToAnchorId(destId);\n } else if (!opts?.additive) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(doc.levels, activeLevelId, levelId),\n );\n }\n props.onSelectShape?.(shapeId, opts);\n if (!opts?.additive && shapeId === selectedShapeId) {\n const focus =\n viewFocusBoundsForShapes(doc.levels, focusShapeIds) ??\n viewFocusBoundsForShape(doc.levels, shapeId);\n if (focus) cameraApi.current?.focusBounds(focus);\n }\n }}\n />\n </Suspense>\n </div>\n ) : null}\n\n {chrome.hoverTooltip && !websiteModalOpen ? (\n <HoverTooltip tooltip={hoverTooltip} />\n ) : null}\n\n {chrome.storeModal && websiteModalOpen && websiteDestinationInfo ? (\n <WebsiteInfoModal\n destination={websiteDestinationInfo}\n retailers={websiteRetailers}\n imageProxyUrl={imageProxyUrl}\n host={host}\n onClose={() => setWebsiteModalOpen(false)}\n onMapIt={(fromRetailerId) => {\n const from = websiteRetailers.find((r) => r.id === fromRetailerId);\n const anchors = websiteMapItAnchors(from, websiteDestinationInfo);\n if (anchors) {\n setFromAnchorId(anchors.fromAnchorId);\n setToAnchorId(anchors.toAnchorId);\n setWebsiteModalOpen(false);\n }\n }}\n />\n ) : null}\n </div>\n );\n}\n\nexport default MapViewer;\n"],"names":["MapControls","levels","activeLevelId","onActiveLevelChange","onZoomIn","onZoomOut","onReset","showFloors","showZoomReset","floorOptions","alwaysShowFloors","stackLevels","level","switcher","floorSwitcherDisplayLevels","showFloorList","shouldShowFloorSwitcher","showZoom","hasBuildingFloors","hasOutdoorLevel","jsxs","jsx","active","Fragment","MAP_FONT_FAMILY","MAP_LABEL_LINE_HEIGHT","SVGIcons","AllAmenities","CONNECTOR_AMENITY_TYPES","AssignAmenities","item","KioskSvg","EntranceSvg","EscalatorUpSvg","EscalatorDownSvg","isAssignAmenity","type","getAmenityByType","getMapSpecialSvg","id","_a","recolorMapSvg","svg","color","hex","mapSpecialSvgToDataUrl","colored","entranceIconDataUrl","amenityAssignOptions","amenityTypeFromCatalogId","amenityId","amenities","amenityCatalogIdForType","row","assignmentSpecialIconDataUrl","assignment","assignmentSpecialIconId","ASSIGNED_CONNECTOR_ICON","STATIC_ICON_COLORS","UNASSIGNED_CONNECTOR_ICON","levelTravel","from","to","fromIndex","toIndex","fromOrder","toOrder","escalatorLandingTravel","shapeId","levelId","here","connectorId","_b","anchor","partner","escalatorConnectorIconId","travel","connectorSpecialKind","shape","raw","connectorSpecialIconDataUrl","kind","assigned","fill","connectorMapIconDataUrl","iconId","assignedConnectorShapeIds","anchors","ids","connectorMapIconKind","assignedShapeIds","mapFontUrl","MAP_FONT_URL","registered","ensureMapFont","loaded","MODERN_SELECT_SEARCH_AFTER","filterModernSelectOptions","options","query","q","o","modernSelectIsSearchable","optionCount","searchable","Chevron","ModernSelect","value","onChange","disabled","placeholder","ariaLabel","listId","useId","rootRef","useRef","triggerRef","buttonRef","menuRef","searchRef","open","setOpen","useState","setQuery","activeIndex","setActiveIndex","menuPos","setMenuPos","withSearch","selected","filtered","useMemo","close","useCallback","pick","next","updateMenuPos","el","rect","spaceBelow","spaceAbove","maxHeight","openAbove","useEffect","onDoc","e","t","onKey","onMove","moveActive","delta","i","onSearchKeyDown","option","menu","createPortal","index","highlighted","target","v","polygonToThreeShape","points","THREE","polygonToThreePath","path","slabShapeWithHoles","outer","holes","hole","holesOverlappingOuter","skipRaycast","createOpeningMarkTexture","aspect","width","canvas","ctx","pad","OPENING_VOID_MARK","texture","OpeningVoidMesh","polygon","box","polygonBBox","dash","openingSpanDash","outline","first","p","geometry","material","OPENING_VOID_STROKE","line","mark","height","OPENING_VOID_FILL","bbox","span","OpeningWells","polygons","VIEWER_SELECTABLE_KINDS","isViewerSelectableKind","isViewerInteractiveShape","host","viewerShapeHoverableOnHost","viewerShapeHighlighted","hoveredShapeId","selectedShapeIds","resolvedViewerHoverId","listHoverId","pointerHoverId","viewerHoverCursor","applyViewerHoverCursor","cursor","viewerHoverFillOpacity","base","hovered","viewerPointerOffset","event","native","x","y","VIEWER_CLICK_DRAG_PX","createViewerPointerGesture","viewerPointerClientXY","beginViewerPointerGesture","gesture","pointerId","moveViewerPointerGesture","dist","endViewerPointerGesture","viewerPointerClickIsTap","maxDist","r3fDelta","pointerMissClearsSelection","down","up","dx","dy","kindColor","theme","resolvedViewerShapeFill","polygonShape","HoverOutline","extrude","sourceGeometry","CurrentLocationPulse","position","Html","LevelMeshes","is3d","onSelectShape","hoveredShapeIdProp","eventSource","pointerGestureRef","interactiveOnly","imageProxyUrl","retailers","kioskOriginShapeId","showHoverTooltip","onHoverTooltip","setPointerHoverId","publishHoverTooltip","offset","text","viewerHoverTooltipLabel","openings","voidPolygonsOnLevel","assignedConnectorIds","visibleShapes","s","viewerShapeVisibleOnHost","meshes","isEntranceIcon","INTERACTIVE_SHAPE_KINDS","resolveLayerStyle","radius","punch","isSlabShapeKind","threeShapes","poly","filletPolygon","labels","entranceIcons","overlays","assignmentOverlayVisible","connectorOverlays","layout","connectorIconLayout","iconColor","resolvedAssignmentIconColor","url","geometryBBox","align","normalizeLabelAlign","cx","cy","tilt","Text","labelAlignX","size","DEFAULT_ENTRANCE_SIZE","AssignmentImageOverlay","fontSize","DEFAULT_ASSIGNMENT_SIZE","z","imageKey","assignmentOverlayImageUrl","React","assignmentOverlayRenderSize","rotation","selectable","baseOpacity","viewerShapeBaseOpacity","fillTransparent","isTransparentColor","opacity","emphasisFill","darkenShapeFill","geoShape","idx","loadCanvasTexture","signal","resolve","reject","img","cleanup","onAbort","setTexture","setAspect","disposed","controller","proxied","resolveFetchUrl","candidates","lastError","src","error","ROUTE_CHANGE_MARKER_GAP","ROUTE_CHANGE_MARKER_CLUSTER","routeOriginLevelId","route","shouldPinViewToRouteOrigin","previousFrom","previousTo","nextFrom","nextTo","routeChangeLabel","intent","floorName","routeSegmentsForLevel","segments","current","point","markerDistance","a","b","layoutRouteLevelChangeMarkers","markers","placed","marker","used","group","j","ordered","rank","routeLevelChangeMarkers","changeIndex","change","V1_ROUTE_COLOR","V1_ROUTE_TUBULAR_SEGMENTS","V1_ROUTE_RADIAL_SEGMENTS","V1_ROUTE_REVEAL_MS","V1_ROUTE_TEXTURE_MS","resolveRouteColor","ROUTE_CHANGE_RING_COLOR","resolveRouteChangeCircleColor","resolveRouteThickness","thickness","DEFAULT_THEME","_routeScale","_routeWorldPoint","routeWorldRadiusForView","screenRadius","world","zoom","worldHeight","scale","routeWorldRadiusForCamera","camera","viewportHeight","worldScale","samplePoint","distance","applyRouteTubeRadius","basePositions","baseRadius","targetRadius","normal","i3","createRouteTexture","context","gradientWidth","gradient","easeInOutCubic","RouteTube","invalidate","useThree","state","meshRef","animationStartedAt","appliedRadius","routeShape","syncScreenRadius","mesh","useLayoutEffect","useFrame","elapsed","indexCount","progress","RouteChangeButton","connectors","connector","iconKind","isVerticalRouteConnectorKind","there","icon","targetName","label","ringColor","RouteLine","routeColor","routeRadius","segment","levelChanges","COLOR_SPACE_SVG","SRGBColorSpace","SVGLoader","Loader","manager","onLoad","onProgress","onError","scope","loader","FileLoader","parseNode","node","style","transform","getNodeTransform","isDefsNode","parseStyle","parseCSSStylesheet","parsePathNode","parseRectNode","parsePolygonNode","parsePolylineNode","parseCircleNode","parseEllipseNode","parseLineNode","usedNodeId","usedNode","transformPath","currentTransform","paths","childNodes","transformStack","ShapePath","Vector2","control","firstPoint","isFirstPoint","doSetFirstPoint","d","commands","l","command","data","numbers","parseFloats","jl","getReflection","rx","ry","start","parseArcCommand","stylesheet","selectorList","definitions","stylesheets","x_axis_rotation","large_arc_flag","sweep_flag","end","dx2","dy2","x1p","y1p","rxs","rys","x1ps","y1ps","cr","dq","pq","cxp","cyp","theta","svgAngle","ux","uy","vx","vy","dot","len","ang","parseFloatWithUnits","w","h","bci","iterator","match","regex","subpath","Path","x1","y1","x2","y2","stylesheetStyles","classSelectors","addStyle","svgName","jsName","adjustFunction","clamp","positive","input","flags","stride","RE","SEP","INT","FLOAT","EXP","seenComma","number","exponent","result","throwSyntaxError","partial","newNumber","length","units","unitConversion","string","theUnit","n","u","parseNodeTransform","Matrix3","tempTransform0","tx","ty","transformsTexts","tIndex","transformText","openParPos","closeParPos","transformType","array","angle","tempTransform1","tempTransform2","tempTransform3","scaleX","scaleY","m","transfVec2","v2","tempV3","transfEllipseGeneric","curve","cosTheta","sinTheta","v1","Vector3","f1","f2","mF","mFInv","mQe","ed","eigenDecomposition","rt1sqrt","rt2sqrt","mDsqrt","mRT","mDRF","transformAngle","phi","cosR","sinR","isTransformFlipped","transfEllipseNoSkew","sx","getTransformScaleX","sy","getTransformScaleY","subPaths","curves","tempV2","isTransformSkewed","te","basisDot","A","B","C","rt1","rt2","cs","sn","sm","df","rt","xml","shapePath","IntersectionLocationType","classifyResult","findEdgeIntersection","a0","a1","b0","b1","x3","x4","y3","y4","nom1","nom2","denom","t1","t2","classifyPoint","edgeStart","edgeEnd","ax","ay","bx","by","sa","getIntersections","path1","path2","intersectionsRaw","intersections","path1EdgeStart","path1EdgeEnd","index2","path2EdgeStart","path2EdgeEnd","intersection","getScanlineIntersections","scanline","boundingBox","center","allIntersections","i1","i2","isHoleTo","simplePath","allPaths","scanlineMinX","scanlineMaxX","_fillRule","centerBoundingBox","scanlineIntersections","baseIntersections","otherIntersections","firstXOfPath","stack","isHole","isHoleFor","lastCWValue","identifier","simplePaths","maxY","minY","maxX","minX","ShapeUtils","Box2","sp","isAHole","shapesToReturn","Shape","lineJoin","lineCap","miterLimit","arcDivisions","minDistance","vertices","normals","uvs","BufferGeometry","Float32BufferAttribute","vertexOffset","tempV2_1","tempV2_2","tempV2_3","tempV2_4","tempV2_5","tempV2_6","tempV2_7","lastPointL","lastPointR","point0L","point0R","currentPointL","currentPointR","nextPointL","nextPointR","innerPoint","outerPoint","removeDuplicatedPoints","numPoints","isClosed","currentPoint","previousPoint","nextPoint","strokeWidth2","deltaU","u0","u1","innerSideModified","joinIsOnLeftSide","isMiter","initialJoinIsOnLeftSide","numVertices","currentCoordinate","currentCoordinateUV","getNormal","iPoint","normal1","miterSide","miterLength2","segmentLengthPrev","segmentLengthNext","makeSegmentTriangles","makeSegmentWithBevelJoin","createSegmentTrianglesWithMiddleSection","makeCircularSector","miterFraction","addVertex","addCapGeometry","lastOuter","lastInner","p1","p2","il","vl","dupPoints","newPoints","BASE_Z","getLayerNameFromNode","isInteractiveAncestor","dataName","isInteractiveGroupLabel","isStoreFolderLabel","isRouteAncestor","isRouteFolderLabel","SvgVectorLayer","suppressIds","setResult","cancelled","fetchUrl","res","inlined","inlineSvgStyles","err","out","layerName","isRoutePathLabel","shapes","layerStyle","amenityFill","isAmenityLayerId","amenityHouseFill","strokeTransparent","_c","sortByOutdoorSvgPaintOrder","renderOrder","si","SCENE_FLIP_SCALE","viewBoundsFromData","bounds","fitOrthoZoom","viewWidth","viewHeight","worldWidth","zoomX","zoomY","boundsExtent","VIEWER_ZOOM_ANIM_MS","VIEWER_FOCUS_ANIM_MS","FOCUS_BOUNDS_PADDING","FOCUS_LARGE_PADDING","FOCUS_LARGE_EXTENT","FOCUS_PAD_SMALL_EXTENT","FOCUS_MIN_EXTENT","FOCUS_MAX_ZOOM_MULTIPLE","FOCUS_SMALL_MAX_ZOOM_MULTIPLE","VIEWER_MAX_ZOOM_MULTIPLE","focusPaddingRatio","paddingRatio","smallExtent","largePadding","largeExtent","extent","paddedFocusBounds","minExtent","rawW","rawH","halfW","halfH","focusMaxZoomMultiple","paddedWidth","paddedHeight","typicalMultiple","smallMultiple","typicalFrame","tinyFrame","clampFocusZoom","shapeFitZoom","mapFitZoom","maxMultiple","cap","selectionFocusKey","shapeIds","viewFocusBoundsForShapes","wanted","combined","sceneBoundsFromBBox","expandBounds","viewFocusBoundsForShape","viewFocusBoundsForRoute","routePoints","applyLevelTransform","endpointIds","routeAnchorIds","focusShapeIds","shapeBounds","easeOutCubic","lerp","interpolateCameraPose","ease","cameraPosesNear","epsilon","withFitZoom","pose","fitZoom","resolveResetPose","fitToMap","home","fit","skipPersistedViewRestore","nextOrthoZoom","direction","step","min","max","factor","MOUSE_ROTATE","MOUSE_DOLLY","MOUSE_PAN","TOUCH_ROTATE","TOUCH_PAN","TOUCH_DOLLY_PAN","ORBIT_ZOOM_TO_CURSOR","orbitMouseButtons","orbitTouches","cameraBoundsKey","CameraRig","controlsRef","cameraRef","persistedViewRef","focusKey","focusViewBounds","homePose","homePoseKey","resetFitsMap","onCameraChange","onCameraReset","userAdjusted","applyingView","zoomAnimRef","appliedFocusKey","focusKeyRef","focusViewBoundsRef","homePoseRef","homePoseKeyRef","resetFitsMapRef","onCameraChangeRef","onCameraResetRef","appliedHomeKey","ignoreUserChangeUntil","resetInFlight","focusAnimRef","boundsKey","cancelZoomAnim","captureView","adjusted","controls","restoreView","snap","animateOrthoZoom","targetZoom","startZoom","started","now","currentPose","fitPose","applyPose","lookAt","poseForFocusBounds","focus","mapExtent","mapFit","sizeHint","resolvedHomePose","saved","resetDestination","applyHomeOrFit","dest","applyFit","animateFocus","animateReset","applyFitRef","restoreViewRef","animateFocusRef","zoomBy","onStart","useImperativeHandle","isNewFocus","snapMatchesFocus","anim","isEventRoot","orbitEventRoot","connected","viewerWheelEventHitsMap","root","contains","suppressViewerWheelZoom","OUTDOOR_Z","CAMERA_UP","CANVAS_DPR","CANVAS_GL","OrbitWheelZoomGuard","blockWheel","gl","onWheel","MapScene","doc","selectedShapeId","allowWheelZoom","pointerDownRef","onDown","pos","onUp","stacked","viewerLevelStack","boundsFromStackedLevels","view","cameraPosition","camera3dPosition","mouseButtons","touches","outdoorLevel","isOutdoorLevel","outdoorSvgUrl","outdoorSvgSuppressIds","showOutdoorSvg","outdoorTheme","Canvas","OrthographicCamera","outdoor","opts","viewerAllowsWheelZoom","OrbitControls","itemLabel","amenityName","RuntimeChrome","fromAnchorId","toAnchorId","onFromChange","onToChange","accessibleOnly","onAccessibleOnlyChange","showSearch","showAmenities","amenityIconColor","selectedItem","setSelectedItem","items","list","amenity","grouped","map","arr","anchorOptions","hasQuery","selectItem","groupItems","WebsiteInfoModal","destination","onClose","onMapIt","fromRetailerId","setFromRetailerId","retailer","websiteFromRetailerOptions","logo","showDetails","directions","websiteInfoModalDirections","mapItDisabled","showForm","formatRetailerPhone","HoverTooltip","tooltip","fetchWebsiteRetailers","webApiURI","centerId","all","page","params","json","count","normalizeRetailerCatalogItem","fetchDocument","draft","qs","MapViewer","props","documentProp","kioskId","selectedRetailerId","themeOverrides","onExtractedAmenities","createRouteRef","className","activeLevelIdProp","routeOnSelect","focusNonce","deviceProp","captureCamera","rawDoc","setDoc","normalizePublishedDocument","setError","setRoute","setFromAnchorId","setToAnchorId","setAccessibleOnly","websiteShapeId","setWebsiteShapeId","websiteModalOpen","setWebsiteModalOpen","hoverTooltip","setHoverTooltip","fetchedRetailers","setFetchedRetailers","internalLevelId","setInternalLevelId","defaultViewerLevelId","cameraApi","canvasHostRef","routeEndpointsRef","viewportWidth","setViewportWidth","setActiveLevelId","viewerChrome","ro","entries","chrome","codes","viewerLevelIdAfterShapeSelect","selectionKey","selectionFocusKeyWithNonce","selectionFocusBounds","kioskOrigin","findViewerKioskOrigin","routeFocusBounds","routeFocusKey","resolvedDevice","deviceFromHost","homeOverride","findResponsiveOverride","overrideToCameraPose","responsiveViewKey","compiled","compileGraph","websiteRetailers","websiteRetailersOnMap","hoverRetailers","handleHoverTooltip","websiteDestinationInfo","websiteDestination","runRoute","fromId","toId","pinOrigin","findShortestPlacePath","originLevelId","applyViewerReset","patch","viewerResetPatch","routeApi","retailerId","toIds","matchingShapeAnchorIds","nearest","destinationAnchorId","amenityCode","anchorIds","findNearestAmenityPath","mergeTheme","amenitiesOnMap","showMap","viewerCanShowScene","Suspense","websiteClickOpensModal","destIds","shapeAnchorIds","destId","_d","_e","_f","r","websiteMapItAnchors"],"mappings":";;;;;;;;AA6BO,SAASA,GAAY;AAAA,EAC1B,QAAAC;AAAA,EACA,eAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,eAAAC,IAAgB;AAAA,EAChB,cAAAC;AAAA,EACA,kBAAAC,IAAmB;AACrB,GAAqB;AACnB,QAAMC,IAAcV,EAAO;AAAA,IACzB,CAACW,MACCA,EAAM,QAAQ,QACdA,EAAM,YAAY,QAClBA,EAAM,cAAc;AAAA,EAAA,GAElBC,IAAWJ,KAAgBK,GAA2BH,CAAW,GACjEI,IACJR,MACCG,IACGG,EAAS,SAAS,IAClBG,GAAwBL,CAAW,IACnCM,IACJT,MACCU,GAAkBP,CAAW,KAAKQ,GAAgBR,CAAW;AAChE,SAAI,CAACI,KAAiB,CAACE,IAAiB,yBAGrC,OAAA,EAAI,WAAU,sBACb,UAAA,gBAAAG,GAAC,OAAA,EAAI,WAAU,6BACZ,UAAA;AAAA,IAAAL,KACC,gBAAAM,EAAC,OAAA,EAAI,WAAU,8BAA6B,MAAK,WAAU,cAAW,UACnE,UAAAR,EAAS,IAAI,CAACD,MAAU;AACvB,YAAMU,IAASV,EAAM,OAAOV;AAC5B,aACE,gBAAAmB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,iBAAeC;AAAA,UACf,WACEA,IACI,wCACA;AAAA,UAEN,SAAS,MAAMnB,EAAoBS,EAAM,EAAE;AAAA,UAE1C,UAAAA,EAAM;AAAA,QAAA;AAAA,QAXFA,EAAM;AAAA,MAAA;AAAA,IAcjB,CAAC,EAAA,CACH;AAAA,IAGDK,KACC,gBAAAG,GAAAG,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAASf;AAAA,UACT,cAAW;AAAA,UACZ,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAID,gBAAAc,GAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAShB;AAAA,YACT,cAAW;AAAA,YACZ,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAgB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAASjB;AAAA,YACT,cAAW;AAAA,YACZ,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CAEJ,EAAA,CACF;AAEJ;ACtHO,MAAMoB,KAAkB,0BAGlBC,KAAwB,MCJ/BC,KAAW;AAAA,EACf,UAAU;AAAA;AAAA;AAAA;AAAA,EAKV,OAAO;AAAA;AAAA;AAAA,EAIP,WAAW;AAAA;AAAA;AAAA,EAIX,aAAa;AAAA;AAAA;AAAA;AAAA,EAKb,eAAe;AAAA;AAAA;AAAA;AAAA,EAKf,KAAK;AAAA;AAAA;AAAA;AAAA,EAKL,YAAY;AAAA;AAAA;AAAA,EAIZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQV,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,UAAU;AAAA;AAAA;AAAA;AAAA,EAKV,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBhB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQR,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAKjB,YAAY;AAAA;AAAA;AAAA;AAKd,GCjGaC,KAA6B;AAAA,EACxC;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASD,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAAA,EAEpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAS;AAAA,EAAA;AAEtB,GC5DME,yBAA8B,IAAkB;AAAA,EACpD;AAAA,EACA;AACF,CAAC,GAEYC,KAAgCF,GAAa;AAAA,EACxD,CAACG,MAAS,CAACF,GAAwB,IAAIE,EAAK,IAAI;AAClD,GAEaC,KAAWL,GAAS,OACpBM,KAAcN,GAAS,UACvBO,KAAiBP,GAAS,aAC1BQ,KAAmBR,GAAS;AAElC,SAASS,GAAgBC,GAAuB;AACrD,SAAOP,GAAgB,KAAK,CAACC,MAASA,EAAK,SAASM,CAAI;AAC1D;AAEO,SAASC,GAAiBD,GAAsC;AACrE,SAAOP,GAAgB,KAAK,CAACC,MAASA,EAAK,SAASM,CAAI,KACtDT,GAAa,KAAK,CAACG,MAASA,EAAK,SAASM,CAAI;AAClD;AAEO,SAASE,GAAiBC,GAAgC;;AAC/D,SAAIA,MAAO,UAAgBR,KACvBQ,MAAO,aAAmBP,KAC1BO,MAAO,iBAAuBN,KAC9BM,MAAO,mBAAyBL,MAC7BM,IAAAH,GAAiBE,CAAE,MAAnB,gBAAAC,EAAsB;AAC/B;AAEO,SAASC,GAAcC,GAAaC,GAAuB;AAChE,QAAMC,IAAMD,EAAM,WAAW,GAAG,IAAIA,IAAQ,IAAIA,CAAK;AACrD,SAAOD,EACJ,QAAQ,2BAA2B,SAASE,CAAG,GAAG,EAClD,QAAQ,6BAA6B,WAAWA,CAAG,GAAG;AAC3D;AAEO,SAASC,GACdH,GACAC,GACQ;AACR,QAAMG,IAAUH,IAAQF,GAAcC,GAAKC,CAAK,IAAID;AACpD,SAAO,oCAAoC,mBAAmBI,CAAO,CAAC;AACxE;AClCO,SAASC,GAAoBJ,GAA2C;AAC7E,QAAMD,IAAMJ,GAAiB,UAAU;AACvC,MAAKI;AACL,WAAOG,GAAuBH,GAAKC,CAAK;AAC1C;AAGO,SAASK,KAA2D;AACzE,SAAOnB,GAAgB,IAAI,CAACC,OAAU;AAAA,IACpC,OAAOA,EAAK;AAAA,IACZ,OAAOA,EAAK;AAAA,EAAA,EACZ;AACJ;AAEO,SAASmB,GACdC,GACAC,GACQ;;AACR,SAAID,KAAa,OAAa,OACvBV,IAAAW,EAAU,KAAK,CAACrB,MAASA,EAAK,OAAOoB,CAAS,MAA9C,gBAAAV,EAAiD,SAAQ;AAClE;AAEO,SAASY,GACdhB,GACAe,GACe;AACf,QAAME,IAAMF,EAAU;AAAA,IACpB,CAACrB,MAASA,EAAK,aAAa,MAASA,EAAK,SAASM;AAAA,EAAA;AAErD,UAAOiB,KAAA,gBAAAA,EAAK,OAAM;AACpB;AAEO,SAASC,GACdC,GACAJ,GACAR,GACoB;AACpB,QAAMJ,IAAKiB,GAAwBD,GAAYJ,CAAS;AACxD,MAAI,CAACZ,EAAI;AACT,QAAMG,IAAMJ,GAAiBC,CAAE;AAC/B,MAAKG;AACL,WAAOG,GAAuBH,GAAKC,CAAK;AAC1C;AASA,MAAMc,KAA0BC,GAAmB,WAC7CC,KAA4B;AAU3B,SAASC,GACdC,GACAC,GACwB;AACxB,QAAMC,IAAYF,EAAK,cAAcA,EAAK,UACpCG,IAAUF,EAAG,cAAcA,EAAG;AACpC,MAAIC,KAAa,QAAQC,KAAW,QAAQA,MAAYD,GAAW;AACjE,UAAME,IAAYJ,EAAK,YAAYA,EAAK,YAClCK,IAAUJ,EAAG,YAAYA,EAAG;AAClC,WAAIG,KAAa,QAAQC,KAAW,QAAQA,MAAYD,IAC/C,OAEFC,IAAUD,IAAY,OAAO;AAAA,EACtC;AACA,SAAOD,IAAUD,IAAY,OAAO;AACtC;AAMO,SAASI,GACdC,GACAC,GACApE,GACwB;;AACxB,QAAMqE,IAAOrE,EAAO,KAAK,CAACW,MAAUA,EAAM,OAAOyD,CAAO;AACxD,MAAI,CAACC,EAAM,QAAO;AAClB,QAAMC,KAAcC,KAAAhC,IAAA8B,EAAK,YAAL,gBAAA9B,EAAc;AAAA,IAChC,CAACiC,MAAWA,EAAO,YAAYL,KAAWK,EAAO,eAAe;AAAA,QAD9C,gBAAAD,EAEjB;AACH,MAAID,KAAe,KAAM,QAAO;AAEhC,QAAMG,IAAUzE,EAAO,KAAK,CAACW,MAAU;;AACrC,WAAIA,EAAM,OAAO0D,EAAK,KAAW,KAC1B,IACL9B,IAAA5B,EAAM,YAAN,QAAA4B,EAAe;AAAA,MACb,CAACiC,MACCA,EAAO,gBAAgBF,KACvBE,EAAO,WAAW,QAClBA,EAAO,YAAYL;AAAA;AAAA,EAG3B,CAAC;AACD,SAAKM,IACEd,GAAYU,GAAMI,CAAO,IADX;AAEvB;AAGO,SAASC,GACdC,GACiB;AACjB,SAAIA,MAAW,OAAa,iBACxBA,MAAW,SAAe,mBACvB;AACT;AAGO,SAASC,GAAqBC,GAGL;AAC9B,QAAMC,KAAOD,EAAM,eAAeA,EAAM,KACrC,KAAA,EACA,YAAA,EACA,QAAQ,MAAM,GAAG;AACpB,SAAIC,MAAQ,eAAeA,EAAI,WAAW,YAAY,IAAU,cAC5DA,MAAQ,cAAcA,EAAI,WAAW,WAAW,IAAU,aACvD;AACT;AAEO,SAASC,GACdC,GACAC,GACAvC,GACoB;AACpB,QAAMD,IAAMJ,GAAiB2C,CAAI;AACjC,MAAI,CAACvC,EAAK;AACV,QAAMyC,IAAOxC,KAAA,QAAAA,EAAO,SAChBA,EAAM,KAAA,IACNuC,IACEzB,KACAE;AACN,SAAOd,GAAuBH,GAAKyC,CAAI;AACzC;AAEO,SAASC,GACdH,GACAC,GACAvC,GACAiC,GACoB;AACpB,QAAMS,IAASJ,MAAS,cAAcN,GAAyBC,CAAM,IAAIK;AACzE,SAAOD,GAA4BK,GAAQH,GAAUvC,CAAK;AAC5D;AAGO,SAAS2C,GACdC,GACa;AACb,QAAMC,wBAAU,IAAA;AAChB,aAAWf,KAAUc;AACnB,IAAId,EAAO,WAAW,QAAQA,EAAO,eAAe,QAClDe,EAAI,IAAIf,EAAO,OAAO;AAG1B,SAAOe;AACT;AAOO,SAASC,GACdX,GAMAY,GAC6B;AAC7B,MAAIZ,EAAM,WAAY,QAAO;AAC7B,QAAMG,IAAOJ,GAAqBC,CAAK;AACvC,SAAI,CAACG,KAAQ,CAACS,EAAiB,IAAIZ,EAAM,EAAE,IAAU,OAC9CG;AACT;ACvNA,MAAAU,KAAe,s61BCMFC,KAAeD;AAE5B,IAAIE,KAAa;AAGV,SAASC,KAAsB;AACpC,MAAID,MAAc,OAAO,WAAa,OAAe,EAAE,WAAW;AAChE;AAEF,EAAAA,KAAa,IACA,IAAI,SAAS,cAAc,OAAOD,EAAY,GAAG,EACpD,KAAA,EAAO,KAAK,CAACG,MAAW;AAChC,aAAS,MAAM,IAAIA,CAAM;AAAA,EAC3B,CAAC;AACH;AAEAD,GAAA;ACbO,MAAME,KAA6B;AAEnC,SAASC,GACdC,GACAC,GACsB;AACtB,QAAMC,IAAID,EAAM,KAAA,EAAO,YAAA;AACvB,SAAKC,IACEF,EAAQ,OAAO,CAACG,MACJ,GAAGA,EAAE,KAAK,IAAIA,EAAE,QAAQ,EAAE,GAAG,YAAA,EAC9B,SAASD,CAAC,CAC3B,IAJcF;AAKjB;AAEO,SAASI,GACdC,GACAC,GACS;AACT,SAAOA,KAAcD,KAAeP;AACtC;AChBA,SAASS,KAAU;AACjB,SACE,gBAAApF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,eAAW;AAAA,MAEX,UAAA,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IACjB;AAAA,EAAA;AAGN;AAEO,SAASqF,GAAa;AAAA,EAC3B,OAAAC;AAAA,EACA,SAAAT;AAAA,EACA,UAAAU;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc;AAAA,EACd,YAAAN;AAAA,EACA,WAAAO;AACF,GAQG;AACD,QAAMC,IAASC,GAAA,GACTC,IAAUC,GAAuB,IAAI,GACrCC,IAAaD,GAAuB,IAAI,GACxCE,IAAYF,GAA0B,IAAI,GAC1CG,IAAUH,GAAuB,IAAI,GACrCI,IAAYJ,GAAyB,IAAI,GACzC,CAACK,GAAMC,CAAO,IAAIC,GAAS,EAAK,GAChC,CAACvB,GAAOwB,CAAQ,IAAID,GAAS,EAAE,GAC/B,CAACE,GAAaC,CAAc,IAAIH,GAAS,CAAC,GAC1C,CAACI,GAASC,CAAU,IAAIL,GAKpB,IAAI,GAERM,IAAa1B,GAAyBJ,EAAQ,QAAQM,CAAU,GAChEyB,IAAW/B,EAAQ,KAAK,CAACG,MAAMA,EAAE,UAAUM,CAAK,GAChDuB,IAAWC;AAAA,IACf,MAAMlC,GAA0BC,GAAS8B,KAAcR,IAAOrB,IAAQ,EAAE;AAAA,IACxE,CAACqB,GAAMtB,GAASC,GAAO6B,CAAU;AAAA,EAAA,GAG7BI,IAAQC,GAAY,MAAM;AAC9B,IAAAZ,EAAQ,EAAK,GACbE,EAAS,EAAE,GACXE,EAAe,CAAC;AAAA,EAClB,GAAG,CAAA,CAAE,GAECS,IAAOD;AAAA,IACX,CAACE,MAAiB;AAChB,MAAA3B,EAAS2B,CAAI,GACbH,EAAA;AAAA,IACF;AAAA,IACA,CAACA,GAAOxB,CAAQ;AAAA,EAAA,GAGZ4B,IAAgBH,GAAY,MAAM;AACtC,UAAMI,IAAKrB,EAAW,WAAWC,EAAU;AAC3C,QAAI,CAACoB,EAAI;AACT,UAAMC,IAAOD,EAAG,sBAAA,GACVE,IAAa,OAAO,cAAcD,EAAK,SAAS,GAChDE,IAAaF,EAAK,MAAM,GACxBG,IAAY,KAAK,IAAI,KAAK,KAAK,IAAIF,GAAYC,GAAY,GAAG,CAAC,GAC/DE,IAAYH,IAAa,OAAOC,IAAaD;AACnD,IAAAZ,EAAW;AAAA,MACT,KAAKe,IAAY,KAAK,IAAI,GAAGJ,EAAK,MAAMG,IAAY,CAAC,IAAIH,EAAK,SAAS;AAAA,MACvE,MAAMA,EAAK;AAAA,MACX,OAAO,KAAK,IAAIA,EAAK,OAAO,GAAG;AAAA,MAC/B,WAAAG;AAAA,IAAA,CACD;AAAA,EACH,GAAG,CAAA,CAAE;AAEL,EAAAE,GAAU,MAAM;AACd,QAAI,CAACvB,GAAM;AACT,MAAAO,EAAW,IAAI;AACf;AAAA,IACF;AACA,IAAAS,EAAA;AACA,UAAMQ,IAAQ,CAACC,MAAkB;;AAC/B,YAAMC,IAAID,EAAE;AACZ,OAAIzG,IAAA0E,EAAQ,YAAR,QAAA1E,EAAiB,SAAS0G,OAAM1E,KAAA8C,EAAQ,YAAR,QAAA9C,GAAiB,SAAS0E,MAC9Dd,EAAA;AAAA,IACF,GACMe,IAAQ,CAACF,MAAqB;;AAClC,MAAIA,EAAE,QAAQ,aACZb,EAAA,IACC5F,IAAAwF,IAAaT,EAAU,UAAUF,EAAU,YAA3C,QAAA7E,EAAqD;AAAA,IAE1D,GACM4G,IAAS,MAAMZ,EAAA;AACrB,oBAAS,iBAAiB,aAAaQ,CAAK,GAC5C,SAAS,iBAAiB,WAAWG,CAAK,GAC1C,OAAO,iBAAiB,UAAUC,CAAM,GACxC,OAAO,iBAAiB,UAAUA,GAAQ,EAAI,GACvC,MAAM;AACX,eAAS,oBAAoB,aAAaJ,CAAK,GAC/C,SAAS,oBAAoB,WAAWG,CAAK,GAC7C,OAAO,oBAAoB,UAAUC,CAAM,GAC3C,OAAO,oBAAoB,UAAUA,GAAQ,EAAI;AAAA,IACnD;AAAA,EACF,GAAG,CAAChB,GAAOZ,GAAMgB,GAAeR,CAAU,CAAC,GAE3Ce,GAAU,MAAM;AACd,IAAI,CAACvB,KAAQ,CAACQ,KACd,sBAAsB,MAAA;;AAAM,cAAAxF,IAAA+E,EAAU,YAAV,gBAAA/E,EAAmB;AAAA,KAAO;AAAA,EACxD,GAAG,CAACgF,GAAMQ,CAAU,CAAC,GAErBe,GAAU,MAAM;AACd,IAAAlB,EAAe,CAAC;AAAA,EAClB,GAAG,CAAC1B,GAAO+B,EAAS,MAAM,CAAC;AAE3B,QAAMmB,KAAa,CAACC,MAAkB;AACpC,IAAIpB,EAAS,WAAW,KACxBL,EAAe,CAAC0B,OAAOA,IAAID,IAAQpB,EAAS,UAAUA,EAAS,MAAM;AAAA,EACvE,GAEMsB,IAAkB,CAACP,MAA6C;AACpE,QAAIA,EAAE,QAAQ,aAAa;AACzB,MAAAA,EAAE,eAAA,GACGzB,OACW,CAAC,IADNC,EAAQ,EAAI;AAEvB;AAAA,IACF;AACA,QAAIwB,EAAE,QAAQ,WAAW;AACvB,MAAAA,EAAE,eAAA,GACGzB,OACW,EAAE,IADPC,EAAQ,EAAI;AAEvB;AAAA,IACF;AACA,QAAIwB,EAAE,QAAQ,SAAS;AACrB,MAAAA,EAAE,eAAA;AACF,YAAMQ,IAASvB,EAASN,CAAW;AACnC,MAAIJ,KAAQiC,IAAQnB,EAAKmB,EAAO,KAAK,MACxB,EAAI;AAAA,IACnB;AAAA,EACF,GAEMC,IACJlC,KAAQM,KAAW,CAACjB,IAChB8C;AAAA,IACE,gBAAAtI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKiG;AAAA,QACL,IAAIN;AAAA,QACJ,WAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAYD;AAAA,QACZ,OAAO;AAAA,UACL,KAAKe,EAAQ;AAAA,UACb,MAAMA,EAAQ;AAAA,UACd,OAAOA,EAAQ;AAAA,UACf,WAAWA,EAAQ;AAAA,QAAA;AAAA,QAGrB,4BAAC,MAAA,EAAG,WAAU,0BACX,UAAAI,EAAS,WAAW,IACnB,gBAAA7G,EAAC,MAAA,EAAG,WAAU,2BAA0B,UAAA,aAAA,CAAU,IAElD6G,EAAS,IAAI,CAACuB,GAAQG,MAAU;AAC9B,gBAAMtI,IAASmI,EAAO,UAAU9C,GAC1BkD,IAAcD,MAAUhC;AAC9B,iBACE,gBAAAvG;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,IAAI,GAAG2F,CAAM,IAAIyC,EAAO,KAAK;AAAA,cAC7B,MAAK;AAAA,cACL,iBAAenI;AAAA,cAEf,UAAA,gBAAAF;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAW;AAAA,oBACT;AAAA,oBACAE,IAAS,cAAc;AAAA,oBACvBuI,IAAc,iBAAiB;AAAA,kBAAA,EAE9B,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,kBACX,aAAa,CAACZ,MAAMA,EAAE,eAAA;AAAA,kBACtB,cAAc,MAAMpB,EAAe+B,CAAK;AAAA,kBACxC,SAAS,MAAMtB,EAAKmB,EAAO,KAAK;AAAA,kBAE/B,UAAA;AAAA,oBAAAA,EAAO,UACN,gBAAApI;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WACEoI,EAAO,YACH,2CACA;AAAA,wBAEN,KAAKA,EAAO;AAAA,wBACZ,KAAI;AAAA,sBAAA;AAAA,oBAAA,IAEJ;AAAA,oBACJ,gBAAArI,GAAC,QAAA,EAAK,WAAU,iCACd,UAAA;AAAA,sBAAA,gBAAAC,EAAC,QAAA,EAAM,YAAO,MAAA,CAAM;AAAA,sBACnBoI,EAAO,OACN,gBAAApI,EAAC,QAAA,EAAK,WAAU,iCACb,UAAAoI,EAAO,MACV,IACE;AAAA,oBAAA,EAAA,CACN;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,YArCKA,EAAO;AAAA,UAAA;AAAA,QAwClB,CAAC,EAAA,CAEL;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,EAAA,IAEX;AAEN,SACE,gBAAArI,GAAC,OAAA,EAAI,KAAK8F,GAAS,WAAU,oBAC1B,UAAA;AAAA,IAAAc,IACC,gBAAA5G;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKgG;AAAA,QACL,WACEI,IACI,sCACA;AAAA,QAEN,aAAa,CAACyB,MAAM;;AAClB,cAAIpC,EAAU;AACd,gBAAMiD,IAASb,EAAE;AACjB,UAAIa,EAAO,QAAQ,gCAAgC,MAC/CA,MAAWvC,EAAU,YACvB0B,EAAE,eAAA,IACFzG,IAAA+E,EAAU,YAAV,QAAA/E,EAAmB,UAEhBgF,KAAMC,EAAQ,EAAI;AAAA,QACzB;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAApG;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAKkG;AAAA,cACL,WAAU;AAAA,cACV,MAAK;AAAA,cACL,MAAK;AAAA,cACL,cAAYR;AAAA,cACZ,iBAAeS;AAAA,cACf,iBAAc;AAAA,cACd,iBAAeR;AAAA,cACf,qBAAkB;AAAA,cAClB,yBACEQ,KAAQU,EAASN,CAAW,IACxB,GAAGZ,CAAM,IAAIkB,EAASN,CAAW,EAAE,KAAK,KACxC;AAAA,cAEN,UAAAf;AAAA,cACA,aAAAC;AAAA,cACA,OAAOU,IAAOrB,KAAS8B,KAAA,gBAAAA,EAAU,UAAS;AAAA,cAC1C,UAAU,CAACgB,MAAM;AACf,gBAAAtB,EAASsB,EAAE,OAAO,KAAK,GAClBzB,KAAMC,EAAQ,EAAI;AAAA,cACzB;AAAA,cACA,SAAS,MAAM;AACb,gBAAKZ,KAAUY,EAAQ,EAAI;AAAA,cAC7B;AAAA,cACA,WAAW+B;AAAA,YAAA;AAAA,UAAA;AAAA,UAEb,gBAAAnI;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,UAAU;AAAA,cACV,eAAW;AAAA,cACX,UAAAwF;AAAA,cACA,aAAa,CAACoC,MAAMA,EAAE,eAAA;AAAA,cACtB,SAAS,MAAM;AACb,gBAAIpC,KACJY,EAAQ,CAACsC,MAAM,CAACA,CAAC;AAAA,cACnB;AAAA,cAEA,4BAACtD,IAAA,CAAA,CAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QACX;AAAA,MAAA;AAAA,IAAA,IAGF,gBAAArF;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKiG;AAAA,QACL,MAAK;AAAA,QACL,WAAU;AAAA,QACV,cAAYN;AAAA,QACZ,iBAAeS;AAAA,QACf,iBAAc;AAAA,QACd,UAAAX;AAAA,QACA,SAAS,MAAM;AACb,UAAIA,KACJY,EAAQ,CAACsC,MAAM,CAACA,CAAC;AAAA,QACnB;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAA3I;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WACE6G,IACI,4BACA;AAAA,cAGL,UAAA;AAAA,gBAAAA,KAAA,QAAAA,EAAU,UACT,gBAAA5G;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WACE4G,EAAS,YACL,2CACA;AAAA,oBAEN,KAAKA,EAAS;AAAA,oBACd,KAAI;AAAA,kBAAA;AAAA,gBAAA,IAEJ;AAAA,iBACHA,KAAA,gBAAAA,EAAU,UAASnB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,4BAErBL,IAAA,CAAA,CAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGZiD;AAAA,EAAA,GACH;AAEJ;ACpVO,SAASM,GAAoBC,GAAoC;AACtE,MAAIA,EAAO,SAAS,EAAG,QAAO;AAC9B,QAAMnF,IAAQ,IAAIoF,GAAM,MAAA;AACxB,EAAApF,EAAM,OAAOmF,EAAO,CAAC,EAAE,GAAGA,EAAO,CAAC,EAAE,CAAC;AACrC,WAASV,IAAI,GAAGA,IAAIU,EAAO,QAAQV;AACjC,IAAAzE,EAAM,OAAOmF,EAAOV,CAAC,EAAE,GAAGU,EAAOV,CAAC,EAAE,CAAC;AAEvC,SAAAzE,EAAM,UAAA,GACCA;AACT;AAEO,SAASqF,GAAmBF,GAAmC;AACpE,MAAIA,EAAO,SAAS,EAAG,QAAO;AAC9B,QAAMG,IAAO,IAAIF,GAAM,KAAA;AACvB,EAAAE,EAAK,OAAOH,EAAO,CAAC,EAAE,GAAGA,EAAO,CAAC,EAAE,CAAC;AACpC,WAASV,IAAI,GAAGA,IAAIU,EAAO,QAAQV;AACjC,IAAAa,EAAK,OAAOH,EAAOV,CAAC,EAAE,GAAGU,EAAOV,CAAC,EAAE,CAAC;AAEtC,SAAAa,EAAK,UAAA,GACEA;AACT;AAGO,SAASC,GACdC,GACAC,GACoB;AACpB,QAAMzF,IAAQkF,GAAoBM,CAAK;AACvC,MAAI,CAACxF,EAAO,QAAO;AACnB,aAAW0F,KAAQC,GAAsBH,GAAOC,CAAK,GAAG;AACtD,UAAMH,IAAOD,GAAmBK,CAAI;AACpC,IAAIJ,KAAMtF,EAAM,MAAM,KAAKsF,CAAI;AAAA,EACjC;AACA,SAAOtF;AACT;AC3BA,SAAS4F,KAAc;AAAC;AAGxB,SAASC,GAAyBC,GAAqC;AAErE,QAAMC,IAAQ,KAAK,IAAI,IAAI,KAAK,MAAM,MAAS,KAAK,IAAID,GAAQ,GAAG,CAAC,CAAC,GAC/DE,IAAS,SAAS,cAAc,QAAQ;AAC9C,EAAAA,EAAO,QAAQD,GACfC,EAAO,SAAS;AAChB,QAAMC,IAAMD,EAAO,WAAW,IAAI;AAClC,MAAI,CAACC,EAAK,QAAO,IAAIb,GAAM,cAAcY,CAAM;AAC/C,EAAAC,EAAI,UAAU,GAAG,GAAGF,GAAO,GAAM;AACjC,QAAMG,IAAM,KAAK,IAAIH,GAAO,GAAM,IAAI;AACtC,EAAAE,EAAI,cAAcE,IAClBF,EAAI,cAAc,MAClBA,EAAI,YAAY,KAAK,IAAI,GAAG,KAAK,IAAIF,GAAO,GAAM,IAAI,KAAK,GAC3DE,EAAI,UAAU,SACdA,EAAI,UAAA,GACJA,EAAI,OAAOC,GAAKA,CAAG,GACnBD,EAAI,OAAOF,IAAQG,GAAK,MAASA,CAAG,GACpCD,EAAI,OAAOF,IAAQG,GAAKA,CAAG,GAC3BD,EAAI,OAAOC,GAAK,MAASA,CAAG,GAC5BD,EAAI,OAAA;AACJ,QAAMG,IAAU,IAAIhB,GAAM,cAAcY,CAAM;AAC9C,SAAAI,EAAQ,aAAahB,GAAM,gBAC3BgB,EAAQ,aAAa,GACrBA,EAAQ,cAAc,IACfA;AACT;AAEA,SAASC,GAAgB,EAAE,SAAAC,KAAgC;AACzD,QAAMtG,IAAQqD,GAAQ,MAAM6B,GAAoBoB,CAAO,GAAG,CAACA,CAAO,CAAC,GAC7DC,IAAMlD,GAAQ,MAAMmD,GAAYF,CAAO,GAAG,CAACA,CAAO,CAAC,GACnDG,IAAO,KAAK,IAAI,GAAGC,GAAgBH,CAAG,CAAC,GACvCI,IAAUtD,GAAQ,MAAM;AAC5B,QAAIiD,EAAQ,SAAS,EAAG,QAAO;AAC/B,UAAMM,IAAQN,EAAQ,CAAC,GACjBnB,IAAS;AAAA,MACb,GAAGmB,EAAQ,IAAI,CAACO,MAAM,IAAIzB,GAAM,QAAQyB,EAAE,GAAGA,EAAE,GAAG,IAAI,CAAC;AAAA,MACvD,IAAIzB,GAAM,QAAQwB,EAAM,GAAGA,EAAM,GAAG,IAAI;AAAA,IAAA,GAEpCE,IAAW,IAAI1B,GAAM,eAAA,EAAiB,cAAcD,CAAM,GAC1D4B,IAAW,IAAI3B,GAAM,mBAAmB;AAAA,MAC5C,OAAO4B;AAAA,MACP,UAAUP;AAAA,MACV,SAASA,IAAO;AAAA,IAAA,CACjB,GACKQ,IAAO,IAAI7B,GAAM,KAAK0B,GAAUC,CAAQ;AAC9C,WAAAE,EAAK,cAAc,GACnBA,EAAK,qBAAA,GACLA,EAAK,UAAUrB,IACRqB;AAAA,EACT,GAAG,CAACR,GAAMH,CAAO,CAAC;AAElB,EAAArC;AAAA,IACE,MAAM,MAAM;AACV,UAAI,CAAC0C,EAAS;AACd,MAAAA,EAAQ,SAAS,QAAA;AACjB,YAAMI,IAAWJ,EAAQ;AACzB,MAAI,MAAM,QAAQI,CAAQ,IAAGA,EAAS,QAAQ,CAAC/J,MAASA,EAAK,SAAS,MACxD,QAAA;AAAA,IAChB;AAAA,IACA,CAAC2J,CAAO;AAAA,EAAA;AAEV,QAAMO,IAAO7D,GAAQ,MAAM;AACzB,UAAM0C,IAAQ,KAAK,IAAIQ,EAAI,OAAOA,EAAI,MAAM,CAAC,GACvCY,IAAS,KAAK,IAAIZ,EAAI,OAAOA,EAAI,MAAM,CAAC;AAC9C,WAAOV,GAAyBE,IAAQoB,CAAM;AAAA,EAChD,GAAG,CAACZ,CAAG,CAAC;AAIR,SAFAtC,GAAU,MAAM,MAAMiD,EAAK,WAAW,CAACA,CAAI,CAAC,GAExC,CAAClH,KAAS,CAAC2G,IAAgB,0BAG5B,SAAA,EACC,UAAA;AAAA,IAAA,gBAAArK;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,UAAU,CAAC,GAAG,GAAG,IAAI;AAAA,QACrB,aAAa;AAAA,QACb,SAAS,CAAC6H,MAAMA,EAAE,gBAAA;AAAA,QAClB,eAAe,CAACA,MAAMA,EAAE,gBAAA;AAAA,QAExB,UAAA;AAAA,UAAA,gBAAA5H,EAAC,iBAAA,EAAc,MAAM,CAACyD,CAAK,EAAA,CAAG;AAAA,UAC9B,gBAAAzD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO6K;AAAA,cACP,MAAMhC,GAAM;AAAA,cACZ,YAAY;AAAA,YAAA;AAAA,UAAA;AAAA,QACd;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,gBAAA9I,GAAC,QAAA,EAAK,UAAU,CAAC,GAAG,GAAG,IAAI,GAAG,aAAa,GAAG,SAASsJ,IACrD,UAAA;AAAA,MAAA,gBAAArJ,EAAC,iBAAA,EAAc,MAAM,CAACyD,CAAK,EAAA,CAAG;AAAA,MAC9B,gBAAAzD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAK2K;AAAA,UACL,aAAW;AAAA,UACX,YAAY;AAAA,UACZ,MAAM9B,GAAM;AAAA,UACZ,YAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IACd,GACF;AAAA,IACCuB,IAAU,gBAAApK,EAAC,aAAA,EAAU,QAAQoK,GAAS,IAAK;AAAA,EAAA,GAC9C;AAEJ;AAEA,SAASD,GAAgBW,GAKd;AACT,QAAMC,IAAO,KAAK,IAAID,EAAK,OAAOA,EAAK,MAAMA,EAAK,OAAOA,EAAK,IAAI;AAClE,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAGC,IAAO,IAAI,CAAC;AAC9C;AAEO,SAASC,GAAa;AAAA,EAC3B,UAAAC;AACF,GAGG;AACD,SAAIA,EAAS,WAAW,IAAU,OAEhC,gBAAAjL,EAAC,SAAA,EACE,UAAAiL,EAAS,IAAI,CAAClB,GAASxB,MACtB,gBAAAvI,EAAC8J,IAAA,EAA8C,SAAAC,KAAzB,gBAAgBxB,CAAK,EAAsB,CAClE,GACH;AAEJ;AClIO,MAAM2C,KAAuC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAASC,GAAuBvH,GAAuB;AAC5D,SAAQsH,GAA8C,SAAStH,CAAI;AACrE;AAGO,SAASwH,GACdxH,GACAyH,IAAsB,iBACtBnJ,GACS;AACT,SACEiJ,GAAuBvH,CAAI,KAC3B0H,GAA2B,EAAE,YAAYpJ,KAAc,OAAA,GAAamJ,CAAI;AAE5E;AAGO,SAASE,GACdxI,GACAyI,GACAC,GACS;AACT,SAAOD,MAAmBzI,KAAW0I,EAAiB,SAAS1I,CAAO;AACxE;AAGO,SAAS2I,GACdC,GACAC,GACe;AACf,SAAOA,KAAkBD,KAAe;AAC1C;AAEO,SAASE,GACdjI,GACAyH,IAAsB,iBACtBnJ,GACgB;AAChB,SAAOkJ,GAAyBxH,GAAMyH,GAAMnJ,CAAU,IAAI,YAAY;AACxE;AAGO,SAAS4J,GACdT,GACAU,GACM;AACN,EAAKV,KACLA,EAAK,UAAU,OAAO,kBAAkBU,MAAW,SAAS;AAC9D;AAGO,SAASC,GACdpI,GACAqI,GACAC,GACQ;AACR,SAAI,CAACA,KAAW,CAACf,GAAuBvH,CAAI,IAAUqI,IAClDA,IAAO,OAAa,OACjBA;AACT;AASO,SAASE,GAAoBC,GAIA;AAClC,QAAMC,IAASD,EAAM,aACfE,IAAI,OAAOF,EAAM,WAAY,WAAWA,EAAM,UAAUC,KAAA,gBAAAA,EAAQ,SAChEE,IAAI,OAAOH,EAAM,WAAY,WAAWA,EAAM,UAAUC,KAAA,gBAAAA,EAAQ;AAEtE,SADI,OAAOC,KAAM,YAAY,OAAOC,KAAM,YACtC,CAAC,OAAO,SAASD,CAAC,KAAK,CAAC,OAAO,SAASC,CAAC,IAAU,OAChD,EAAE,GAAAD,GAAG,GAAAC,EAAA;AACd;AAGO,MAAMC,KAAuB;AAU7B,SAASC,KAAmD;AACjE,SAAO,EAAE,WAAW,MAAM,GAAG,GAAG,GAAG,GAAG,SAAS,GAAG,QAAQ,GAAA;AAC5D;AAEO,SAASC,GAAsB,GAIwB;AAC5D,QAAMJ,IAAI,EAAE,SACNC,IAAI,EAAE;AACZ,SAAI,OAAOD,KAAM,YAAY,OAAOC,KAAM,YAAY,CAAC,OAAO,SAASD,CAAC,KAAK,CAAC,OAAO,SAASC,CAAC,IACtF,OAEF,EAAE,GAAAD,GAAG,GAAAC,GAAG,WAAW,EAAE,aAAa,KAAA;AAC3C;AAEO,SAASI,GACdC,GACAN,GACAC,GACAM,IAA2B,MACrB;AACN,EAAID,EAAQ,WACZA,EAAQ,SAAS,IACjBA,EAAQ,YAAYC,GACpBD,EAAQ,IAAIN,GACZM,EAAQ,IAAIL,GACZK,EAAQ,UAAU;AACpB;AAEO,SAASE,GACdF,GACAN,GACAC,GACAM,IAA2B,MACrB;AAEN,MADI,CAACD,EAAQ,UACTA,EAAQ,aAAa,QAAQC,KAAa,QAAQA,MAAcD,EAAQ,UAAW;AACvF,QAAMG,IAAO,KAAK,MAAMT,IAAIM,EAAQ,GAAGL,IAAIK,EAAQ,CAAC;AACpD,EAAIG,IAAOH,EAAQ,YAASA,EAAQ,UAAUG;AAChD;AAEO,SAASC,GACdJ,GACAN,GACAC,GACAM,IAA2B,MACrB;AACN,EAAKD,EAAQ,WACTA,EAAQ,aAAa,QAAQC,KAAa,QAAQA,MAAcD,EAAQ,cAC5EE,GAAyBF,GAASN,GAAGC,GAAGM,CAAS,GACjDD,EAAQ,SAAS,IACjBA,EAAQ,YAAY;AACtB;AAGO,SAASK,GAAwBC,GAAiBC,GAA4B;AACnF,QAAMlF,IAAQ,OAAO,SAASkF,CAAQ,IAAIA,IAAY;AACtD,SAAO,KAAK,IAAID,GAASjF,CAAK,KAAKuE;AACrC;AAEO,SAASY,GACdC,GACAC,GACS;AACT,OAAKA,EAAG,UAAU,OAAO,EAAG,QAAO;AACnC,MAAI,CAACD,EAAM,QAAO;AAClB,QAAME,IAAKD,EAAG,IAAID,EAAK,GACjBG,IAAKF,EAAG,IAAID,EAAK;AACvB,SAAOE,IAAKA,IAAKC,IAAKA,KAAMhB,KAAuBA;AACrD;ACzHA,SAASiB,GACP7J,GACA8J,GACArC,GACAvH,GACA5B,GACQ;AACR,SAAOyL,GAAwB/J,GAAM8J,GAAOrC,GAAMvH,GAAM5B,CAAU;AACpE;AAEA,SAAS0L,GAAahF,GAAwD;AAC5E,SAAOD,GAAoBC,CAAM;AACnC;AAqCA,SAASiF,GAAa;AAAA,EACpB,OAAApK;AAAA,EACA,SAAAqK;AAAA,EACA,OAAAxM;AACF,GAIG;AACD,QAAMyM,IAAiBjH;AAAA,IACrB,MACEgH,IAAU,IACN,IAAIjF,GAAM,gBAAgBpF,GAAO;AAAA,MAC/B,OAAOqK;AAAA,MACP,cAAc;AAAA,IAAA,CACf,IACD,IAAIjF,GAAM,cAAcpF,CAAK;AAAA,IACnC,CAACqK,GAASrK,CAAK;AAAA,EAAA;AAGjB,SAAAiE,GAAU,MAAM,MAAMqG,EAAe,WAAW,CAACA,CAAc,CAAC,GAG9D,gBAAAhO,GAAC,gBAAA,EAAa,aAAa,IACzB,UAAA;AAAA,IAAA,gBAAAC,EAAC,iBAAA,EAAc,MAAM,CAAC+N,CAAc,EAAA,CAAG;AAAA,IACvC,gBAAA/N,EAAC,qBAAA,EAAkB,OAAAsB,GAAc,WAAW,GAAA,CAAO;AAAA,EAAA,GACrD;AAEJ;AAEA,SAAS0M,GAAqB;AAAA,EAC5B,UAAAC;AACF,GAEG;AACD,SACE,gBAAAjO;AAAA,IAACkO;AAAA,IAAA;AAAA,MACC,UAAAD;AAAA,MACA,QAAM;AAAA,MACN,aAAa,CAAC,IAAI,CAAC;AAAA,MACnB,OAAO,EAAE,eAAe,OAAA;AAAA,MAExB,UAAA,gBAAAjO;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,eAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IACd;AAAA,EAAA;AAGN;AAEO,SAASmO,GAAY;AAAA,EAC1B,OAAA5O;AAAA,EACA,QAAAX;AAAA,EACA,OAAA8O;AAAA,EACA,MAAAU;AAAA,EACA,eAAAC;AAAA,EACA,kBAAA5C,IAAmB,CAAA;AAAA,EACnB,gBAAgB6C,IAAqB;AAAA,EACrC,aAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,eAAAC,IAAgB;AAAA,EAChB,WAAA5M,IAAY,CAAA;AAAA,EACZ,WAAA6M,IAAY,CAAA;AAAA,EACZ,MAAAtD,IAAO;AAAA,EACP,oBAAAuD,IAAqB;AAAA,EACrB,kBAAAC,IAAmB;AAAA,EACnB,gBAAAC;AACF,GAAqB;AACnB,QAAM,CAAClD,GAAgBmD,CAAiB,IAAI1I,GAAwB,IAAI,GAClEmF,IAAiBE;AAAA,IACrB4C;AAAA,IACA1C;AAAA,EAAA;AAEF,EAAAlE;AAAA,IACE,MAAM,MAAM;AACV,MAAAoE,GAAuByC,KAAA,gBAAAA,EAAa,SAAS,EAAE,GAC/CO,KAAA,QAAAA,EAAiB;AAAA,IACnB;AAAA,IACA,CAACP,GAAaO,CAAc;AAAA,EAAA;AAE9B,QAAME,IAAsB,CAC1BvL,GACA2I,MAMG;;AACH,QAAI,CAACyC,KAAoB,CAACC,EAAgB;AAE1C,SADgB1C,EAAM,aAAWjL,IAAAiL,EAAM,gBAAN,gBAAAjL,EAAmB,YAAW,KACjD,GAAG;AACf,MAAA2N,EAAe,IAAI;AACnB;AAAA,IACF;AACA,UAAMG,IAAS9C,GAAoBC,CAAK,GAClC8C,IAAOC,GAAwB1L,GAAOkL,GAAW7M,CAAS;AAChE,QAAI,CAACmN,KAAU,CAACC,GAAM;AACpB,MAAAJ,EAAe,MAAM,EAAE,gBAAgBrL,EAAM,IAAI;AACjD;AAAA,IACF;AACA,IAAAqL,EAAe,EAAE,SAASrL,EAAM,IAAI,MAAAyL,GAAM,GAAGD,EAAO,GAAG,GAAGA,EAAO,EAAA,CAAG;AAAA,EACtE,GAEMG,IAAWtI,GAAQ,MAAMuI,GAAoB9P,CAAK,GAAG,CAACA,CAAK,CAAC,GAC5D+P,IAAuBxI;AAAA,IAC3B,MAAM7C,GAA0B1E,EAAM,OAAO;AAAA,IAC7C,CAACA,EAAM,OAAO;AAAA,EAAA,GAEVgQ,IAAgBzI;AAAA,IACpB,MACEvH,EAAM,OAAO;AAAA,MAAO,CAACiQ,MACnBC,GAAyBD,GAAGnE,GAAMiE,CAAoB;AAAA,IAAA;AAAA,IAE1D,CAACA,GAAsBjE,GAAM9L,EAAM,MAAM;AAAA,EAAA,GAErCmQ,IAAS5I,GAAQ,MACdyI,EACJ,OAAO,CAACC,MAAMA,EAAE,SAAS,MAAM,EAC/B,OAAO,CAACA,MAAA;;AAAM,aAAEA,EAAE,SAAS,aAAWrM,KAAAhC,IAAAqO,EAAE,UAAF,gBAAArO,EAAS,SAAT,QAAAgC,EAAe;AAAA,GAAO,EAC5D,OAAO,CAACqM,MAAM,CAACG,GAAeH,CAAC,CAAC,EAChC;AAAA,IACC,CAACA,MAAA;;AACC,cAACf,KACDmB,GAAwB,SAASJ,EAAE,IAAI,KACtCA,EAAE,SAAS,WAAW,IAAQrM,KAAAhC,IAAAqO,EAAE,UAAF,gBAAArO,EAAS,SAAT,QAAAgC,EAAe,WAC7CqM,EAAE,SAAS,cAAc,CAACK,GAAkBL,EAAE,WAAW;AAAA;AAAA,EAAA,EAE7D,OAAO,CAACA,MAAM,CAACA,EAAE,UAAU,EAC3B,IAAI,CAAC/L,MAAU;AACd,UAAMqM,IAASrM,EAAM,SAAS,SAASiK,EAAM,eAAe,GACtDqC,IAAQC,GAAgBvM,EAAM,IAAI,KAAK2L,EAAS,SAAS,GAIzDa,IAHQxM,EAAM,SAAS,SAAS;AAAA,MAAI,CAACyM,OACzCJ,IAAS,IAAIK,GAAcD,IAAMJ,CAAM,IAAII;AAAA,IAAA,EAG1C;AAAA,MAAI,CAACA,OACJH,IAAQ/G,GAAmBkH,IAAMd,CAAQ,IAAIxB,GAAasC,EAAI;AAAA,IAAA,EAE/D,OAAO,CAACV,OAAwBA,MAAK,IAAI;AAC5C,QAAIS,EAAY,WAAW,EAAG,QAAO;AAErC,UAAM3O,IAAQmM;AAAA,MACZhK,EAAM;AAAA,MACNiK;AAAA,MACArC;AAAA,MACA5H,EAAM,MAAM;AAAA,MACZA,EAAM;AAAA,IAAA,GAEFqK,IACJM,MAAS3K,EAAM,SAAS,UAAUA,EAAM,SAAS,UAC7CA,EAAM,MAAM,kBACXA,EAAM,SAAS,SAASiK,EAAM,eAAe,KAC9C;AAEN,WAAO,EAAE,OAAAjK,GAAO,aAAAwM,GAAa,OAAA3O,GAAO,SAAAwM,EAAA;AAAA,EACtC,CAAC,EACA,OAAO,OAAO,GAMhB,CAACyB,GAAe7B,GAAOU,GAAMK,GAAiBW,GAAU/D,CAAI,CAAC,GAE1D+E,IAAStJ;AAAA,IACb,MACEyI,EAAc;AAAA,MACZ,CAACC,MAAA;;AAAM,gBAACA,EAAE,cAAcA,EAAE,SAAS,WAAW,IAAQrM,KAAAhC,IAAAqO,EAAE,UAAF,gBAAArO,EAAS,SAAT,QAAAgC,EAAe;AAAA;AAAA,IAAM;AAAA,IAE/E,CAACoM,CAAa;AAAA,EAAA,GAGVc,IAAgBvJ;AAAA,IACpB,MAAMyI,EAAc,OAAO,CAACC,MAAM,CAACA,EAAE,cAAcG,GAAeH,CAAC,CAAC;AAAA,IACpE,CAACD,CAAa;AAAA,EAAA,GAGVe,KAAWxJ;AAAA,IACf,MACEyI,EAAc;AAAA,MACZ,CAACC,MACC,CAACA,EAAE,cACHA,EAAE,SAAS,WACX,CAACG,GAAeH,CAAC,KACjBe,GAAyBf,EAAE,YAAYA,EAAE,KAAK;AAAA,IAAA;AAAA,IAEpD,CAACD,CAAa;AAAA,EAAA,GAGViB,IAAoB1J,GAAQ,MACzByI,EAAc,QAAQ,CAAC9L,MAAU;AACtC,UAAMG,IAAOQ,GAAqBX,GAAO6L,CAAoB;AAC7D,QAAI,CAAC1L,EAAM,QAAO,CAAA;AAClB,UAAM6M,IAASC,GAAoBjN,CAAK,GAClCkN,IAAYC;AAAA,MAChBnN,EAAM;AAAA,MACNiK;AAAA,MACA+C,EAAO;AAAA,MACPhN,EAAM;AAAA,IAAA,GAEFF,IACJK,MAAS,cACLd,GAAuBW,EAAM,IAAIlE,EAAM,IAAIX,KAAU,CAACW,CAAK,CAAC,IAC5D,MACAsR,IAAM9M,GAAwBH,GAAM,IAAM+M,GAAWpN,CAAM;AACjE,QAAI,CAACsN,EAAK,QAAO,CAAA;AACjB,UAAM7G,IAAM8G,GAAarN,EAAM,QAAQ;AACvC,WAAO;AAAA,MACL;AAAA,QACE,OAAAA;AAAA,QACA,KAAAoN;AAAA,QACA,OAAOJ,EAAO;AAAA,QACd,UAAWA,EAAO,SAAS,KAAK,KAAM;AAAA,QACtC,IAAIzG,EAAI,OAAOA,EAAI,QAAQ,IAAIyG,EAAO;AAAA,QACtC,IAAIzG,EAAI,OAAOA,EAAI,QAAQ,IAAIyG,EAAO;AAAA,MAAA;AAAA,IACxC;AAAA,EAEJ,CAAC,GACA,CAACnB,GAAsB/P,EAAM,IAAIX,GAAQ8O,GAAO6B,CAAa,CAAC;AAEjE,4BACG,SAAA,EACE,UAAA;AAAA,IAAAa,EAAO,IAAI,CAAC3M,MAAU;AACrB,YAAMuG,IAAM8G,GAAarN,EAAM,QAAQ,GACjCsN,IAAQC,GAAoBvN,EAAM,MAAM,KAAK,GAC7CwN,KAAMjH,EAAI,OAAOA,EAAI,QAAQ,GAC7BkH,KAAMlH,EAAI,OAAOA,EAAI,QAAQ,GAC7BmH,KAAS1N,EAAM,MAAM,UAAU,KAAK,KAAK,KAAM;AACrD,aACE,gBAAAzD;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,UAAU,CAACiR,GAAIC,GAAI,IAAI;AAAA,UACvB,UAAU,CAAC,GAAG,GAAGC,CAAI;AAAA,UAErB,UAAA,gBAAAnR;AAAA,YAACoR;AAAA,YAAA;AAAA,cACC,MAAM7M;AAAA,cACN,UAAU,CAAC8M,GAAYrH,GAAK+G,CAAK,IAAIE,GAAI,GAAG,CAAC;AAAA,cAC7C,UAAUxN,EAAM,MAAM,QAAQ;AAAA,cAC9B,OAAOA,EAAM,MAAM,SAASiK,EAAM;AAAA,cAClC,SAASqD;AAAA,cACT,SAAQ;AAAA,cACR,WAAWA;AAAA,cACX,YAAY3Q;AAAA,cACZ,OAAO,CAAC,GAAG,IAAI,CAAC;AAAA,cAEf,YAAM,MAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QACf;AAAA,QAhBK,SAASqD,EAAM,EAAE;AAAA,MAAA;AAAA,IAmB5B,CAAC;AAAA,IACA4M,EAAc,IAAI,CAAC5M,MAAU;AAC5B,YAAMuG,IAAM8G,GAAarN,EAAM,QAAQ,GACjCwN,KAAMjH,EAAI,OAAOA,EAAI,QAAQ,KAAKvG,EAAM,MAAM,WAAW,IACzDyN,KAAMlH,EAAI,OAAOA,EAAI,QAAQ,KAAKvG,EAAM,MAAM,WAAW,IACzD0N,KAAS1N,EAAM,MAAM,UAAU,KAAK,KAAK,KAAM,KAC/C6N,IAAO7N,EAAM,MAAM,QAAQ8N,IAC3BV,IAAMnP;AAAA,QACV+B,EAAM,MAAM,SAASiK,EAAM;AAAA,MAAA;AAE7B,aAAKmD,IAEH,gBAAA7Q;AAAA,QAACwR;AAAA,QAAA;AAAA,UAEC,KAAAX;AAAA,UACA,OAAOS;AAAA,UACP,UAAU,CAACL,GAAIC,GAAI,IAAI;AAAA,UACvB,UAAUC;AAAA,QAAA;AAAA,QAJL,YAAY1N,EAAM,EAAE;AAAA,MAAA,IAHZ;AAAA,IAUnB,CAAC;AAAA,IACA6M,GAAS,IAAI,CAAC7M,MAAU;;AACvB,YAAMuG,IAAM8G,GAAarN,EAAM,QAAQ,GACjCwN,KAAMjH,EAAI,OAAOA,EAAI,QAAQ,KAAKvG,EAAM,MAAM,WAAW,IACzDyN,KAAMlH,EAAI,OAAOA,EAAI,QAAQ,KAAKvG,EAAM,MAAM,WAAW,IACzD0N,KAAS1N,EAAM,MAAM,UAAU,KAAK,KAAK,KAAM,KAC/CgO,IAAWhO,EAAM,MAAM,UAAQtC,IAAAsC,EAAM,eAAN,gBAAAtC,EAAkB,SAAQuQ,IACzD5D,IACJM,MAAS3K,EAAM,SAAS,UAAUA,EAAM,SAAS,UAC7CA,EAAM,MAAM,kBACXA,EAAM,SAAS,SAASiK,EAAM,eAAe,KAC9C,GACAiE,KAAI7D,IAAU,IAAIA,IAAU,OAAO,KACnC6C,KAAYC;AAAA,QAChBnN,EAAM;AAAA,QACNiK;AAAA,QACAjK,EAAM,MAAM;AAAA,QACZA,EAAM;AAAA,MAAA,GAEFmO,KACJC,GAA0BpO,EAAM,YAAY,MAAMA,EAAM,KAAK,KAC7DxB;AAAA,QACEwB,EAAM;AAAA,QACN3B;AAAA,QACA6O;AAAA,MAAA,GAEEzB,MAAO/L,IAAAM,EAAM,MAAM,SAAZ,gBAAAN,EAAkB,QACzB4N,IAAQC,GAAoBvN,EAAM,MAAM,KAAK,GAC7CwK,IAAqC,CAACgD,GAAIC,GAAIS,EAAC;AACrD,aACE,gBAAA5R,GAAC+R,GAAM,UAAN,EACE,UAAA;AAAA,QAAAF,KACC,gBAAA5R;AAAA,UAACwR;AAAA,UAAA;AAAA,YACC,KAAKI;AAAA,YACL,OAAOG,GAA4BN,GAAUhO,EAAM,UAAU;AAAA,YAC7D,UAAAwK;AAAA,YACA,UAAUkD;AAAA,YACV,eAAAzC;AAAA,UAAA;AAAA,QAAA,IAGF,gBAAA1O;AAAA,UAACoR;AAAA,UAAA;AAAA,YACC,MAAM7M;AAAA,YACN,UAAA0J;AAAA,YACA,UAAU,CAAC,GAAG,GAAGkD,CAAI;AAAA,YACrB,UAAAM;AAAA,YACA,OAAOd;AAAA,YACP,SAAQ;AAAA,YACR,SAAQ;AAAA,YACR,WAAWI;AAAA,YACX,YAAY3Q;AAAA,YACZ,OAAO,CAAC,GAAG,IAAI,CAAC;AAAA,YAChB,SAASiJ;AAAA,YAER,UAAA6F;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJzL,EAAM,OAAOmL,IACZ,gBAAA5O,EAACgO,IAAA,EAAqB,UAAU,CAACiD,GAAIC,GAAIS,KAAI,IAAI,EAAA,CAAG,IAClD;AAAA,MAAA,EAAA,GA5Be,WAAWlO,EAAM,EAAE,EA6BxC;AAAA,IAEJ,CAAC;AAAA,IACA+M,EAAkB,IAAI,CAAC,EAAE,OAAA/M,GAAO,KAAAoN,GAAK,OAAArH,GAAO,UAAAwI,GAAU,GAAA1F,GAAG,GAAAC,EAAA,MACxD,gBAAAvM;AAAA,MAACwR;AAAA,MAAA;AAAA,QAEC,KAAAX;AAAA,QACA,OAAArH;AAAA,QACA,UAAU,CAAC8C,GAAGC,GAAG,IAAI;AAAA,QACrB,UAAAyF;AAAA,MAAA;AAAA,MAJK,kBAAkBvO,EAAM,EAAE;AAAA,IAAA,CAMlC;AAAA,IACD,gBAAAzD,EAACgL,IAAA,EAAa,UAAUoE,EAAA,CAAU;AAAA,IACjCM,EAAO,IAAI,CAAC,EAAE,OAAAjM,GAAO,aAAAwM,GAAa,OAAA3O,GAAO,SAAAwM,QAAc;AACtD,YAAMmE,IAAa7G;AAAA,QACjB3H,EAAM;AAAA,QACN4H;AAAA,QACA5H,EAAM;AAAA,MAAA,GAEFyI,IACJ+F,KACA1G,GAAuB9H,EAAM,IAAI+H,GAAgBC,CAAgB,GAC7DyG,IAAcC;AAAA,QAClB1O,EAAM;AAAA,QACNA,EAAM,MAAM;AAAA,MAAA,GAER2O,KAAkBC,GAAmB/Q,CAAK,GAC1CgR,KAAUF,KACZlG,IACE,MACA,IACFF;AAAA,QACEvI,EAAM;AAAA,QACNyO;AAAA,QACAhG;AAAA,MAAA,GAEAqG,KAAeC;AAAA,QACnBJ,KAAkB1E,EAAM,sBAAsBpM;AAAA,MAAA,GAE1CwC,KAAOoI,IACTqG,KACAH,KACE,YACA9Q;AACN,+BACG,SAAA,EACE,UAAA2O,EAAY,IAAI,CAACwC,GAAUC,MAC1B,gBAAA3S;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,UAAU,CAAC,GAAG,GAAG0D,EAAM,SAAS,IAAI;AAAA,UACpC,eAAe,CAACmE,MAAM;AACpB,YAAKqK,MACLrK,EAAE,gBAAA,GACFmH,EAAkBtL,EAAM,EAAE,GAC1BqI;AAAA,cACEyC,KAAA,gBAAAA,EAAa;AAAA,cACb1C,GAAkBpI,EAAM,MAAM4H,GAAM5H,EAAM,UAAU;AAAA,YAAA,GAEtDuL,EAAoBvL,GAAOmE,CAAC;AAAA,UAC9B;AAAA,UACA,eAAe,CAACA,MAAM;AACpB,YAAKqK,MACLrK,EAAE,gBAAA,GACFoH,EAAoBvL,GAAOmE,CAAC;AAAA,UAC9B;AAAA,UACA,cAAc,CAACA,MAAM;AACnB,YAAKqK,MACLrK,EAAE,gBAAA,GACFmH,EAAkB,CAAC7N,MAAQA,MAAOuC,EAAM,KAAK,OAAOvC,CAAG,GACvD4K,GAAuByC,KAAA,gBAAAA,EAAa,SAAS,EAAE,GAC3CM,MACFC,KAAA,QAAAA,EAAiB,MAAM,EAAE,gBAAgBrL,EAAM;UAEnD;AAAA,UACA,eAAe,CAACmE,MAAM;;AAKpB,YAJiB,GACfA,EAAE,aACCzG,IAAAyG,EAAE,gBAAF,QAAAzG,EAA0C,eAE/B,gBAAA;AAAA,UAClB;AAAA,UACA,SAAS,CAACyG,MAAM;;AACd,YAAAA,EAAE,gBAAA;AACF,kBAAMsF,KAAUsB,KAAA,gBAAAA,EAAmB,QAAQ,YAAW;AACtD,gBAAKvB,GAAwBC,GAAStF,EAAE,KAAK,GAC7C;AAAA,kBAAIqK,GAAY;AACd,gBAAA5D,KAAA,QAAAA,EAAgB5K,EAAM,IAAI;AAAA,kBACxB,UAAU,GACRmE,EAAE,aACCzG,IAAAyG,EAAE,gBAAF,QAAAzG,EAA0C;AAAA,gBAC/C;AAEF;AAAA,cACF;AACA,cAAAkN,KAAA,QAAAA,EAAgB;AAAA;AAAA,UAClB;AAAA,UAEC,UAAA;AAAA,YAAAP,IAAU,IACT,gBAAA9N;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAM;AAAA,kBACJyS;AAAA,kBACA,EAAE,OAAO3E,GAAS,cAAc,GAAA;AAAA,gBAAM;AAAA,cACxC;AAAA,YAAA,IAGF,gBAAA9N,EAAC,iBAAA,EAAc,MAAM,CAACyS,CAAQ,EAAA,CAAG;AAAA,YAEnC,gBAAAzS;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO8D;AAAA,gBACP,aACEL,EAAM,MAAM,eACZA,EAAM,SAAS,aACf6O,KAAU;AAAA,gBAEZ,SAAAA;AAAA,gBACA,MAAMzJ,GAAM;AAAA,cAAA;AAAA,YAAA;AAAA,YAEbqD,IACC,gBAAAlM;AAAA,cAAC6N;AAAA,cAAA;AAAA,gBACC,OAAO4E;AAAA,gBACP,SAAA3E;AAAA,gBACA,OAAOyE;AAAA,cAAA;AAAA,YAAA,IAEP;AAAA,UAAA;AAAA,QAAA;AAAA,QA3EC,GAAG9O,EAAM,EAAE,IAAIiP,CAAG;AAAA,MAAA,CA6E1B,EAAA,GAhFSjP,EAAM,EAiFlB;AAAA,IAEJ,CAAC;AAAA,EAAA,GACH;AAEJ;AAEA,SAAS4F,KAAc;AAAC;AAExB,SAASsJ,GACP9B,GACA+B,GAC2D;AAC3D,SAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AACtC,UAAMC,IAAM,IAAI,MAAA,GACVC,IAAU,MAAM;AACpB,MAAAJ,KAAA,QAAAA,EAAQ,oBAAoB,SAASK,IACrCF,EAAI,SAAS,MACbA,EAAI,UAAU;AAAA,IAChB,GACME,IAAU,MAAM;AACpB,MAAAD,EAAA,GACAD,EAAI,MAAM,IACVD,EAAO,IAAI,aAAa,sBAAsB,YAAY,CAAC;AAAA,IAC7D;AACA,QAAIF,KAAA,QAAAA,EAAQ,SAAS;AACnB,MAAAK,EAAA;AACA;AAAA,IACF;AACA,IAAAL,KAAA,QAAAA,EAAQ,iBAAiB,SAASK,GAAS,EAAE,MAAM,OACnDF,EAAI,cAAc,aAClBA,EAAI,SAAS,MAAM;AACjB,MAAAC,EAAA;AACA,YAAMxJ,IAAQuJ,EAAI,gBAAgBA,EAAI,OAChCnI,IAASmI,EAAI,iBAAiBA,EAAI;AACxC,UAAI,CAACvJ,KAAS,CAACoB,GAAQ;AACrB,QAAAkI,EAAO,IAAI,MAAM,aAAa,CAAC;AAC/B;AAAA,MACF;AACA,YAAMrJ,IAAS,SAAS,cAAc,QAAQ;AAC9C,MAAAA,EAAO,QAAQD,GACfC,EAAO,SAASmB;AAChB,YAAMlB,IAAMD,EAAO,WAAW,IAAI;AAClC,UAAI,CAACC,GAAK;AACR,QAAAoJ,EAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B;AAAA,MACF;AACA,MAAApJ,EAAI,UAAUqJ,GAAK,GAAG,CAAC;AACvB,YAAMlJ,IAAU,IAAIhB,GAAM,cAAcY,CAAM;AAC9C,MAAAI,EAAQ,aAAahB,GAAM,gBAC3BgB,EAAQ,cAAc,IACtBgJ,EAAQ,EAAE,SAAAhJ,GAAS,QAAQe,IAASpB,GAAO;AAAA,IAC7C,GACAuJ,EAAI,UAAU,MAAM;AAClB,MAAAC,EAAA,GACAF,EAAO,IAAI,MAAM,kBAAkBjC,CAAG,EAAE,CAAC;AAAA,IAC3C,GACAkC,EAAI,MAAMlC;AAAA,EACZ,CAAC;AACH;AAEA,SAASW,GAAuB;AAAA,EAC9B,KAAAX;AAAA,EACA,OAAArH;AAAA,EACA,UAAAyE;AAAA,EACA,UAAA+D;AAAA,EACA,eAAAtD;AACF,GAMG;AACD,QAAM,CAAC7E,GAASqJ,CAAU,IAAI7M,GAAqC,IAAI,GACjE,CAACkD,GAAQ4J,CAAS,IAAI9M,GAAS,CAAC;AAwCtC,SAtCAqB,GAAU,MAAM;AACd,QAAI0L,IAAW,IACX1O,IAAqC;AACzC,UAAM2O,IAAa,IAAI,gBAAA;AACvB,IAAAH,EAAW,IAAI;AACf,UAAMI,IAAUC,GAAgB1C,GAAKnC,CAAa,GAC5C8E,IAAaF,MAAYzC,IAAM,CAACA,CAAG,IAAI,CAACyC,GAASzC,CAAG;AAwB1D,YAvBa,YAAY;AACvB,UAAI4C;AACJ,iBAAWC,KAAOF;AAChB,YAAI;AACF,gBAAMtM,IAAO,MAAMyL,GAAkBe,GAAKL,EAAW,MAAM;AAC3D,cAAID,GAAU;AACZ,YAAAlM,EAAK,QAAQ,QAAA;AACb;AAAA,UACF;AACA,UAAAxC,IAASwC,EAAK,SACdiM,EAAUjM,EAAK,MAAM,GACrBgM,EAAWhM,EAAK,OAAO;AACvB;AAAA,QACF,SAASyM,GAAO;AACd,cAAIN,EAAW,OAAO,QAAS;AAC/B,UAAAI,IAAYE;AAAA,QACd;AAEF,MAAKP,MACHF,EAAW,IAAI,GACXO,KAAW,QAAQ,KAAK,8BAA8B5C,GAAK4C,CAAS;AAAA,IAE5E,GACK,GACE,MAAM;AACX,MAAAL,IAAW,IACXC,EAAW,MAAA,GACX3O,KAAA,QAAAA,EAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAACmM,GAAKnC,CAAa,CAAC,GAEnB,CAAC7E,KAAWL,KAAS,IAAU,OAGjC,gBAAAzJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAAkO;AAAA,MACA,UAAU,CAAC,GAAG,GAAG+D,CAAQ;AAAA,MACzB,OAAO,CAAC,GAAG,IAAI,CAAC;AAAA,MAChB,aAAa;AAAA,MACb,SAAS3I;AAAA,MAET,UAAA;AAAA,QAAA,gBAAArJ,EAAC,mBAAc,MAAM,CAACwJ,GAAOA,IAAQD,CAAM,GAAG;AAAA,QAC9C,gBAAAvJ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK6J;AAAA,YACL,aAAW;AAAA,YACX,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,MAAMhB,GAAM;AAAA,YACZ,YAAY;AAAA,UAAA;AAAA,QAAA;AAAA,MACd;AAAA,IAAA;AAAA,EAAA;AAGN;AC9qBO,MAAM+K,KAA0B,IAC1BC,KAA8B;AAEpC,SAASC,GACdC,GACe;;AACf,WAAO5S,IAAA4S,KAAA,gBAAAA,EAAO,OAAO,OAAd,gBAAA5S,EAAkB,YAAW;AACtC;AAGO,SAAS6S,GACdC,GACAC,GACAC,GACAC,GACS;AACT,SAAID,KAAY,QAAQC,KAAU,OAAa,KACxCH,MAAiBE,KAAYD,MAAeE;AACrD;AAUO,SAASC,GACdC,GACAC,GACQ;AACR,SAAOD,MAAW,YAAY,eAAeC,CAAS,KAAK,WAAWA,CAAS;AACjF;AAYO,SAASC,GACdT,GACA/Q,GACU;AACV,QAAMyR,IAAqB,CAAA;AAC3B,MAAIC,IAAkB,CAAA;AACtB,aAAWC,KAASZ,EAAM,QAAQ;AAChC,QAAIY,EAAM,YAAY3R,GAAS;AAC7B,MAAA0R,EAAQ,KAAK,EAAE,GAAGC,EAAM,GAAG,GAAGA,EAAM,GAAG;AACvC;AAAA,IACF;AACA,IAAID,EAAQ,SAAS,MACnBD,EAAS,KAAKC,CAAO,GACrBA,IAAU,CAAA;AAAA,EAEd;AACA,SAAIA,EAAQ,SAAS,KAAGD,EAAS,KAAKC,CAAO,GACtCD;AACT;AAEA,SAASG,GAAeC,GAASC,GAAiB;AAChD,SAAO,KAAK,MAAMD,EAAE,IAAIC,EAAE,GAAGD,EAAE,IAAIC,EAAE,CAAC;AACxC;AAEO,SAASC,GAEdC,GAAiE;AACjE,QAAMC,IAASD,EAAQ,IAAI,CAACE,OAAY;AAAA,IACtC,GAAGA;AAAA,IACH,UAAUA,EAAO;AAAA,IACjB,UAAUA,EAAO;AAAA,EAAA,EACjB,GACIC,wBAAW,IAAA;AAEjB,WAAS,IAAI,GAAG,IAAIF,EAAO,QAAQ,KAAK,GAAG;AACzC,QAAIE,EAAK,IAAI,CAAC,EAAG;AACjB,UAAMC,IAAQ,CAAC,CAAC;AAChB,aAASC,IAAI,IAAI,GAAGA,IAAIJ,EAAO,QAAQI,KAAK;AAC1C,MAAIF,EAAK,IAAIE,CAAC,KACVT,GAAeK,EAAO,CAAC,GAAGA,EAAOI,CAAC,CAAC,KAAKxB,MAC1CuB,EAAM,KAAKC,CAAC;AAGhB,eAAW9M,KAAS6M,EAAO,CAAAD,EAAK,IAAI5M,CAAK;AAEzC,QAAI6M,EAAM,WAAW,EAAG;AAExB,UAAME,IAAU,CAAC,GAAGF,CAAK,EAAE,KAAK,CAACP,GAAGC,MAAM;AACxC,YAAMS,IAAO,CAACjB,MAA+BA,MAAW,SAAS,IAAI;AACrE,aAAOiB,EAAKN,EAAOJ,CAAC,EAAE,MAAM,IAAIU,EAAKN,EAAOH,CAAC,EAAE,MAAM;AAAA,IACvD,CAAC,GACK/J,IAAO6I,MAA2B0B,EAAQ,SAAS;AACzD,IAAAA,EAAQ,QAAQ,CAAC/M,GAAO0G,MAAW;AACjC,MAAAgG,EAAO1M,CAAK,EAAE,WACZ0M,EAAO1M,CAAK,EAAE,IAAIwC,IAAO,IAAIkE,IAAS2E,IACxCqB,EAAO1M,CAAK,EAAE,WAAW0M,EAAO1M,CAAK,EAAE;AAAA,IACzC,CAAC;AAAA,EACH;AAEA,SAAO0M;AACT;AAEO,SAASO,GACdzB,GACA/Q,GAC0B;AAC1B,QAAMU,IAAoE,CAAA;AAC1E,MAAI+R,IAAc;AAClB,WAASlN,IAAQ,GAAGA,IAAQwL,EAAM,OAAO,QAAQxL,KAAS,GAAG;AAC3D,UAAM/F,IAAOuR,EAAM,OAAOxL,IAAQ,CAAC,GAC7B9F,IAAKsR,EAAM,OAAOxL,CAAK;AAC7B,QAAI/F,EAAK,YAAYC,EAAG,QAAS;AACjC,UAAMiT,IAAS3B,EAAM,aAAa0B,CAAW;AAC7C,IAAAA,KAAe,GACXjT,EAAK,YAAYQ,IACnBU,EAAI,KAAK;AAAA,MACP,GAAGlB,EAAK;AAAA,MACR,GAAGA,EAAK;AAAA,MACR,cAAakT,KAAA,gBAAAA,EAAQ,gBAAe;AAAA,MACpC,eAAejT,EAAG;AAAA,MAClB,WAAW;AAAA,MACX,QAAQ;AAAA,IAAA,CACT,IACQA,EAAG,YAAYO,KACxBU,EAAI,KAAK;AAAA,MACP,GAAGjB,EAAG;AAAA,MACN,GAAGA,EAAG;AAAA,MACN,cAAaiT,KAAA,gBAAAA,EAAQ,gBAAe;AAAA,MACpC,eAAelT,EAAK;AAAA,MACpB,WAAW;AAAA,MACX,QAAQ;AAAA,IAAA,CACT;AAAA,EAEL;AACA,SAAOuS,GAA8BrR,CAAG;AAC1C;ACtIO,MAAMiS,KAAiB,WAEjBC,KAA4B,KAC5BC,KAA2B,GAC3BC,KAAqB,KACrBC,KAAsB;AAkB5B,SAASC,GAAkB1U,GAA+B;AAC/D,SAAI,CAACA,KAAS+Q,GAAmB/Q,CAAK,IAAUqU,KACzCrU;AACT;AAEO,MAAM2U,KAA0B;AAEhC,SAASC,KAAwC;AACtD,SAAOD;AACT;AAEO,SAASE,GAAsBC,GAAmC;AACvE,SAAIA,KAAa,QAAQ,CAAC,OAAO,SAASA,CAAS,KAAKA,KAAa,IAC5DC,GAAc,kBAEhBD;AACT;AAEA,MAAME,KAAc,IAAIzN,GAAM,QAAA,GACxB0N,KAAmB,IAAI1N,GAAM,QAAA;AAS5B,SAAS2N,GAAwB3R,GAO7B;AACT,QAAM4R,IAAe,KAAK,IAAI5R,EAAQ,cAAc,CAAC;AACrD,MAAI6R,IAAQD;AACZ,QAAME,IAAO9R,EAAQ;AACrB,MAAI8R,KAAQ,QAAQ,OAAO,SAASA,CAAI,KAAKA,IAAO;AAClD,IAAAD,IAAQD,IAAeE;AAAA,WAEvB9R,EAAQ,kBAAkB,QAC1BA,EAAQ,uBAAuB,QAC/BA,EAAQ,kBAAkB,QAC1BA,EAAQ,iBAAiB,KACzBA,EAAQ,sBAAsB,KAC9BA,EAAQ,iBAAiB,GACzB;AACA,UAAM+R,IACJ,IACA,KAAK,IAAK/R,EAAQ,iBAAiB,KAAK,KAAM,GAAG,IACjDA,EAAQ;AACV,IAAA6R,IAASD,IAAeG,IAAe/R,EAAQ;AAAA,EACjD;AACA,QAAMgS,IAAQ,KAAK,IAAIhS,EAAQ,cAAc,CAAC;AAC9C,SAAO6R,IAAQ,KAAK,IAAIG,GAAO,IAAI;AACrC;AAEO,SAASC,GACdC,GACAN,GACAO,GACAC,GACAC,GACQ;AACR,MAAIH,aAAkBlO,GAAM;AAC1B,WAAO2N,GAAwB;AAAA,MAC7B,cAAAC;AAAA,MACA,WAAWM,EAAO;AAAA,MAClB,YAAAE;AAAA,IAAA,CACD;AAEH,MAAIF,aAAkBlO,GAAM,mBAAmB;AAC7C,UAAMsO,IAAWD,IACbH,EAAO,SAAS,WAAWG,CAAW,IACtCH,EAAO,SAAS,OAAA;AACpB,WAAOP,GAAwB;AAAA,MAC7B,cAAAC;AAAA,MACA,gBAAgBM,EAAO;AAAA,MACvB,qBAAqB,KAAK,IAAII,GAAU,IAAI;AAAA,MAC5C,gBAAAH;AAAA,MACA,YAAAC;AAAA,IAAA,CACD;AAAA,EACH;AACA,SAAOT,GAAwB,EAAE,cAAAC,GAAc,YAAAQ,GAAY;AAC7D;AAGO,SAASG,GACd7M,GACA8M,GACAC,GACAC,GACM;AACN,QAAMtJ,IAAW1D,EAAS,aAAa,UAAU,GAC3CiN,IAASjN,EAAS,aAAa,QAAQ;AAC7C,MAAI,CAAC0D,KAAY,CAACuJ,EAAQ;AAC1B,QAAMvP,IAAQsP,IAAeD;AAC7B,WAASpP,IAAI,GAAGA,IAAI+F,EAAS,OAAO/F,KAAK,GAAG;AAC1C,UAAMuP,IAAKvP,IAAI;AACf,IAAA+F,EAAS;AAAA,MACP/F;AAAA,MACAmP,EAAcI,CAAE,IAAID,EAAO,KAAKtP,CAAC,IAAID;AAAA,MACrCoP,EAAcI,IAAK,CAAC,IAAID,EAAO,KAAKtP,CAAC,IAAID;AAAA,MACzCoP,EAAcI,IAAK,CAAC,IAAID,EAAO,KAAKtP,CAAC,IAAID;AAAA,IAAA;AAAA,EAE7C;AACA,EAAAgG,EAAS,cAAc;AACzB;AAEA,SAASyJ,GAAmBP,GAAkB7V,GAAoC;AAChF,QAAMmI,IAAS,SAAS,cAAc,QAAQ,GACxCD,IAAQ,KAAK,IAAI,GAAG,KAAK,MAAM2N,CAAQ,CAAC;AAC9C,EAAA1N,EAAO,QAAQD,GACfC,EAAO,SAAS;AAChB,QAAMkO,IAAUlO,EAAO,WAAW,IAAI;AAEtC,MAAIkO,GAAS;AACX,IAAAA,EAAQ,YAAYrW,GACpBqW,EAAQ,SAAS,GAAG,GAAGnO,GAAOC,EAAO,MAAM;AAE3C,UAAMmO,IAAgB,KAAK,IAAI,KAAK,KAAK,IAAI,IAAIT,IAAW,GAAG,CAAC,GAC1DU,IAAWF,EAAQ,qBAAqB,GAAG,GAAGC,GAAe,CAAC;AACpE,IAAAC,EAAS,aAAa,GAAGvW,CAAK,GAC9BuW,EAAS,aAAa,KAAK,OAAO,GAClCA,EAAS,aAAa,KAAK,OAAO,GAClCA,EAAS,aAAa,GAAGvW,CAAK,GAC9BqW,EAAQ,YAAYE,GACpBF,EAAQ,SAAS,IAAI,GAAGC,GAAenO,EAAO,MAAM;AAAA,EACtD;AAEA,QAAMI,IAAU,IAAIhB,GAAM,cAAcY,CAAM;AAC9C,SAAAI,EAAQ,OAAO,IAAI,GACnBA,EAAQ,aAAahB,GAAM,gBACpBgB;AACT;AAEA,SAASiO,GAAexS,GAAuB;AAC7C,QAAMgH,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGhH,CAAK,CAAC;AACxC,SAAOgH,IAAI,MAAM,IAAIA,KAAK,IAAI,KAAK,KAAKA,IAAI,MAAM,IAAI;AACxD;AAEA,SAASyL,GAAU;AAAA,EACjB,QAAAnP;AAAA,EACA,OAAAtH;AAAA,EACA,QAAAwO;AACF,GAIG;AACD,QAAMkI,IAAaC,GAAS,CAACC,MAAUA,EAAM,UAAU,GACjDnB,IAASkB,GAAS,CAACC,MAAUA,EAAM,MAAM,GACzClB,IAAiBiB,GAAS,CAACC,MAAUA,EAAM,KAAK,MAAM,GACtDC,IAAUrS,GAAmB,IAAI,GACjCsS,IAAqBtS,GAAO,CAAC,GAC7BuS,IAAgBvS,GAAsB,IAAI,GAC1CwS,IAAaxR,GAAQ,MAAM;AAC/B,QAAI8B,EAAO,SAAS,EAAG,QAAO;AAC9B,UAAMG,IAAO,IAAIF,GAAM,UAAA;AACvB,QAAIsO,IAAW;AACf,aAAS5O,IAAQ,GAAGA,IAAQK,EAAO,QAAQL,KAAS;AAClD,MAAAQ,EAAK,IAAI,IAAIF,GAAM,WAAWD,EAAOL,IAAQ,CAAC,GAAGK,EAAOL,CAAK,CAAC,CAAC,GAC/D4O,KAAYvO,EAAOL,IAAQ,CAAC,EAAE,WAAWK,EAAOL,CAAK,CAAC;AAExD,UAAMgC,IAAW,IAAI1B,GAAM;AAAA,MACzBE;AAAA,MACA6M;AAAA,MACA9F;AAAA,MACA+F;AAAA,IAAA;AAEF,WAAAtL,EAAS,aAAa,GAAG,CAAC,GACnB;AAAA,MACL,UAAA4M;AAAA,MACA,UAAA5M;AAAA,MACA,SAASmN,GAAmBP,GAAU7V,CAAK;AAAA,MAC3C,eAAe,IAAI,aAAaiJ,EAAS,WAAW,SAAS,KAAK;AAAA,MAClE,YAAYuF;AAAA,IAAA;AAAA,EAEhB,GAAG,CAACxO,GAAOsH,GAAQkH,CAAM,CAAC,GAEpByI,IAAmB,MAAM;AAC7B,UAAMC,IAAOL,EAAQ;AACrB,QAAI,CAACG,KAAc,CAACE,EAAM;AAC1B,UAAMvB,IAAa,KAAK,IAAIuB,EAAK,cAAclC,EAAW,EAAE,CAAC;AAC7D,IAAAC,GAAiB,KAAK3N,EAAO,CAAC,CAAC,GAC/B4P,EAAK,aAAajC,EAAgB;AAClC,UAAM9N,IAASqO;AAAA,MACbC;AAAA,MACAjH;AAAA,MACAkH;AAAA,MACAC;AAAA,MACAV;AAAA,IAAA;AAEF,IAAI8B,EAAc,YAAY5P,MAC9B2O;AAAA,MACEkB,EAAW;AAAA,MACXA,EAAW;AAAA,MACXA,EAAW;AAAA,MACX7P;AAAA,IAAA,GAEF4P,EAAc,UAAU5P;AAAA,EAC1B;AAmCA,SAjCAgQ,GAAgB,MAAM;AACpB,IAAAJ,EAAc,UAAU,MACxBE,EAAA;AAAA,EACF,GAAG,CAACxB,GAAQjH,GAAQwI,GAAYtB,CAAc,CAAC,GAE/CtP,GAAU,MAAM;AACd,QAAK4Q;AACL,aAAAF,EAAmB,UAAU,YAAY,IAAA,GACzCE,EAAW,SAAS,aAAa,GAAG,CAAC,GACrCA,EAAW,QAAQ,OAAO,IAAI,GAC9BN,EAAA,GACO,MAAM;AACX,QAAAM,EAAW,SAAS,QAAA,GACpBA,EAAW,QAAQ,QAAA;AAAA,MACrB;AAAA,EACF,GAAG,CAACN,GAAYM,CAAU,CAAC,GAE3BI,GAAS,MAAM;;AACb,QAAI,CAACJ,EAAY;AACjB,IAAAC,EAAA;AACA,UAAMI,IAAU,YAAY,IAAA,IAAQP,EAAmB,SACjDQ,MAAazX,IAAAmX,EAAW,SAAS,UAApB,gBAAAnX,EAA2B,UAAS;AACvD,QAAIwX,IAAU7C,IAAoB;AAChC,YAAM+C,IAAWf,GAAea,IAAU7C,EAAkB;AAC5D,MAAAwC,EAAW,SAAS,aAAa,GAAG,KAAK,MAAMO,IAAWD,CAAU,CAAC;AAAA,IACvE,OAAO;AACL,MAAAN,EAAW,SAAS,aAAa,GAAGM,CAAU;AAC9C,YAAMC,IAAYF,IAAU5C,KAAuB;AACnD,MAAAuC,EAAW,QAAQ,OAAO,IAAI,MAAM,MAAMR,GAAee,CAAQ;AAAA,IACnE;AACA,IAAAb,EAAA;AAAA,EACF,CAAC,GAEIM,IAEH,gBAAAtY,EAAC,UAAK,KAAKmY,GAAS,UAAUG,EAAW,UAAU,aAAa,IAC9D,UAAA,gBAAAtY;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKsY,EAAW;AAAA,MAChB,aAAW;AAAA,MACX,MAAMzP,GAAM;AAAA,MACZ,WAAW;AAAA,MACX,YAAY;AAAA,IAAA;AAAA,EAAA,GAEhB,IAVsB;AAY1B;AAEA,SAASiQ,GAAkB;AAAA,EACzB,QAAApD;AAAA,EACA,SAAA1S;AAAA,EACA,QAAApE;AAAA,EACA,YAAAma;AAAA,EACA,OAAAzX;AAAA,EACA,qBAAAxC;AACF,GAYG;;AACD,QAAMka,IAAYD,KAAA,gBAAAA,EAAY,KAAK,CAACtY,MAASA,EAAK,OAAOiV,EAAO,cAC1DuD,IAAWC,GAA6BF,KAAA,gBAAAA,EAAW,IAAI,IACzDA,EAAU,OACV,MACE/V,IAAOrE,KAAA,gBAAAA,EAAQ,KAAK,CAAC6B,MAASA,EAAK,OAAOuC,IAC1CmW,IAAQva,KAAA,gBAAAA,EAAQ,KAAK,CAAC6B,MAASA,EAAK,OAAOiV,EAAO,gBAClDnS,IACJ0V,MAAa,eAAehW,KAAQkW,IAChC5W,GAAYU,GAAMkW,CAAK,IACvB,MACAC,IAAOH,IACTlV,GAAwBkV,GAAU,IAAM,WAAW1V,CAAM,IACzD,QACE8V,MACJlY,IAAAvC,KAAA,gBAAAA,EAAQ,KAAK,CAACW,MAAUA,EAAM,OAAOmW,EAAO,mBAA5C,gBAAAvU,EAA4D,SAC5D,OAAOuU,EAAO,aAAa,GACvB4D,IAAQjF,GAAiBqB,EAAO,QAAQ2D,CAAU,GAClDE,IAAYrD,GAAA;AAClB,SACE,gBAAAlW;AAAA,IAACkO;AAAA,IAAA;AAAA,MACC,UAAU,CAACwH,EAAO,UAAUA,EAAO,UAAU,CAAC;AAAA,MAC9C,aAAa,CAAC,IAAI,EAAE;AAAA,MACpB,OAAO,EAAE,eAAe,OAAA;AAAA,MAExB,UAAA,gBAAA3V;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,kDAAkD2V,EAAO,MAAM;AAAA,UAC1E,OACE;AAAA,YACE,iBAAiBpU;AAAA,YACjB,aAAaiY;AAAA,YACb,+BAA+BA;AAAA,YAC/B,eAAe;AAAA,UAAA;AAAA,UAGnB,cAAYD;AAAA,UACZ,SAAS,CAAClN,MAAU;AAClB,YAAAA,EAAM,gBAAA,GACNtN,KAAA,QAAAA,EAAsB4W,EAAO;AAAA,UAC/B;AAAA,UAEA,UAAA;AAAA,YAAA,gBAAA1V,EAAC,UAAK,WAAU,gCACb,UAAAoZ,IAAO,gBAAApZ,EAAC,SAAI,KAAKoZ,GAAM,KAAI,GAAA,CAAG,IAAK,gBAAApZ,EAAC,QAAA,EAAK,eAAW,IAAC,eAAC,GACzD;AAAA,YACA,gBAAAA,EAAC,QAAA,EAAK,WAAU,kCAAiC,eAAW,IACzD,UAAA0V,EAAO,WAAW,YAAY,MAAM,IAAA,CACvC;AAAA,8BACC,QAAA,EAAK,WAAU,2DACd,UAAA,gBAAA3V,GAAC,QAAA,EAAK,WAAU,gCACd,UAAA;AAAA,cAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,kCAAkC,UAAAsZ,GAAM;AAAA,cACxD,gBAAAtZ,EAAC,QAAA,EAAK,WAAU,kCAAiC,eAAY,OAAA,CAAO;AAAA,YAAA,EAAA,CACtE,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;AAEO,SAASwZ,GAAU;AAAA,EACxB,OAAAzF;AAAA,EACA,SAAA/Q;AAAA,EACA,QAAApE;AAAA,EACA,YAAAma;AAAA,EACA,OAAAzX;AAAA,EACA,WAAA8U;AAAA,EACA,qBAAAtX;AACF,GAaG;AACD,QAAM2a,IAAazD,GAAkB1U,CAAK,GACpCoY,IAAcvD,GAAsBC,CAAS,GAC7C3B,IAAW3N;AAAA,IACf,MACE0N,GAAsBT,GAAO/Q,CAAO,EAAE;AAAA,MAAI,CAAC2W,MACzCA,EAAQ,IAAI,CAAChF,MAAU,IAAI9L,GAAM,QAAQ8L,EAAM,GAAGA,EAAM,GAAG,CAAC,CAAC;AAAA,IAAA;AAAA,IAEjE,CAAC3R,GAAS+Q,CAAK;AAAA,EAAA,GAEX6F,IAAe9S;AAAA,IACnB,MAAM0O,GAAwBzB,GAAO/Q,CAAO;AAAA,IAC5C,CAACA,GAAS+Q,CAAK;AAAA,EAAA;AAGjB,SAAIU,EAAS,MAAM,CAACkF,MAAYA,EAAQ,SAAS,CAAC,KAAKC,EAAa,WAAW,IACtE,OAIP,gBAAA7Z,GAAAG,IAAA,EACG,UAAA;AAAA,IAAAuU,EAAS;AAAA,MAAI,CAAC7L,GAAQL,MACrBK,EAAO,UAAU,IACf,gBAAA5I;AAAA,QAAC+X;AAAA,QAAA;AAAA,UAEC,QAAAnP;AAAA,UACA,OAAO6Q;AAAA,UACP,QAAQC;AAAA,QAAA;AAAA,QAHH,aAAa1W,CAAO,IAAIuF,CAAK;AAAA,MAAA,IAKlC;AAAA,IAAA;AAAA,IAELqR,EAAa,IAAI,CAAClE,GAAQnN,MACzB,gBAAAvI;AAAA,MAAC8Y;AAAA,MAAA;AAAA,QAEC,QAAApD;AAAA,QACA,SAAA1S;AAAA,QACA,QAAApE;AAAA,QACA,YAAAma;AAAA,QACA,OAAOU;AAAA,QACP,qBAAA3a;AAAA,MAAA;AAAA,MANK,GAAG4W,EAAO,MAAM,IAAIA,EAAO,aAAa,IAAInN,CAAK;AAAA,IAAA,CAQzD;AAAA,EAAA,GACH;AAEJ;ACxaA,MAAMsR,KAAkBC;AA2CxB,MAAMC,WAAkBC,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9B,YAAaC,GAAU;AAEtB,UAAOA,CAAO,GAQd,KAAK,aAAa,IAQlB,KAAK,cAAc;AAAA,EAEpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,KAAMpJ,GAAKqJ,GAAQC,GAAYC,GAAU;AAExC,UAAMC,IAAQ,MAERC,IAAS,IAAIC,GAAYF,EAAM,OAAO;AAC5C,IAAAC,EAAO,QAASD,EAAM,IAAI,GAC1BC,EAAO,iBAAkBD,EAAM,aAAa,GAC5CC,EAAO,mBAAoBD,EAAM,eAAe,GAChDC,EAAO,KAAMzJ,GAAK,SAAW3B,GAAO;AAEnC,UAAI;AAEH,QAAAgL,EAAQG,EAAM,MAAOnL,EAAM;AAAA,MAE5B,SAAUtH,GAAI;AAEb,QAAKwS,IAEJA,EAASxS,CAAC,IAIV,QAAQ,MAAOA,CAAC,GAIjByS,EAAM,QAAQ,UAAWxJ,CAAG;AAAA,MAE7B;AAAA,IAED,GAAGsJ,GAAYC,CAAO;AAAA,EAEvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAOlL,GAAO;AAEb,UAAMmL,IAAQ;AAEd,aAASG,EAAWC,GAAMC,GAAQ;AAEjC,UAAKD,EAAK,aAAa,EAAI;AAE3B,YAAME,IAAYC,EAAkBH,CAAI;AAExC,UAAII,IAAa,IAEb9R,IAAO;AAEX,cAAS0R,EAAK,UAAQ;AAAA,QAErB,KAAK;AACJ,UAAAC,IAAQI,EAAYL,GAAMC,CAAK;AAC/B;AAAA,QAED,KAAK;AACJ,UAAAK,EAAoBN,CAAI;AACxB;AAAA,QAED,KAAK;AACJ,UAAAC,IAAQI,EAAYL,GAAMC,CAAK;AAC/B;AAAA,QAED,KAAK;AACJ,UAAAA,IAAQI,EAAYL,GAAMC,CAAK,GAC1BD,EAAK,aAAc,GAAG,MAAK1R,IAAOiS,EAAeP,CAAI;AAC1D;AAAA,QAED,KAAK;AACJ,UAAAC,IAAQI,EAAYL,GAAMC,CAAK,GAC/B3R,IAAOkS,EAAeR,CAAI;AAC1B;AAAA,QAED,KAAK;AACJ,UAAAC,IAAQI,EAAYL,GAAMC,CAAK,GAC/B3R,IAAOmS,EAAkBT,CAAI;AAC7B;AAAA,QAED,KAAK;AACJ,UAAAC,IAAQI,EAAYL,GAAMC,CAAK,GAC/B3R,IAAOoS,EAAmBV,CAAI;AAC9B;AAAA,QAED,KAAK;AACJ,UAAAC,IAAQI,EAAYL,GAAMC,CAAK,GAC/B3R,IAAOqS,EAAiBX,CAAI;AAC5B;AAAA,QAED,KAAK;AACJ,UAAAC,IAAQI,EAAYL,GAAMC,CAAK,GAC/B3R,IAAOsS,EAAkBZ,CAAI;AAC7B;AAAA,QAED,KAAK;AACJ,UAAAC,IAAQI,EAAYL,GAAMC,CAAK,GAC/B3R,IAAOuS,EAAeb,CAAI;AAC1B;AAAA,QAED,KAAK;AACJ,UAAAI,IAAa;AACb;AAAA,QAED,KAAK;AACJ,UAAAH,IAAQI,EAAYL,GAAMC,CAAK;AAG/B,gBAAMa,KADOd,EAAK,eAAgB,gCAAgC,MAAM,KAAM,IACtD,UAAW,CAAC,GAC9Be,IAAWf,EAAK,gBAAgB,eAAgBc,CAAU;AAChE,UAAKC,IAEJhB,EAAWgB,GAAUd,CAAK,IAI1B,QAAQ,KAAM,4DAA8Da,CAAU;AAIvF;AAAA,MAKL;AAEG,MAAKxS,MAEC2R,EAAM,SAAS,UAAaA,EAAM,SAAS,UAE/C3R,EAAK,MAAM,SAAU2R,EAAM,MAAMb,EAAe,GAIjD4B,EAAe1S,GAAM2S,EAAgB,GAErCC,EAAM,KAAM5S,CAAI,GAEhBA,EAAK,WAAW,EAAE,MAAM0R,GAAM,OAAOC,EAAK;AAI3C,YAAMkB,IAAanB,EAAK;AAExB,eAAUvS,IAAI,GAAGA,IAAI0T,EAAW,QAAQ1T,KAAO;AAE9C,cAAMuS,IAAOmB,EAAY1T,CAAC;AAE1B,QAAK2S,KAAcJ,EAAK,aAAa,WAAWA,EAAK,aAAa,UASlED,EAAWC,GAAMC,CAAK;AAAA,MAEvB;AAGA,MAAKC,MAEJkB,EAAe,IAAG,GAEbA,EAAe,SAAS,IAE5BH,GAAiB,KAAMG,EAAgBA,EAAe,SAAS,CAAC,CAAE,IAIlEH,GAAiB,SAAQ;AAAA,IAM5B;AAEA,aAASV,EAAeP,GAAO;AAE9B,YAAM1R,IAAO,IAAI+S,GAAS,GAEpBnH,IAAQ,IAAIoH,GAAO,GACnBC,IAAU,IAAID,GAAO,GAErBE,IAAa,IAAIF,GAAO;AAC9B,UAAIG,IAAe,IACfC,IAAkB;AAEtB,YAAMC,IAAI3B,EAAK,aAAc,GAAG;AAEhC,UAAK2B,MAAM,MAAMA,MAAM,OAAS,QAAO;AAIvC,YAAMC,IAAWD,EAAE,MAAO,sBAAsB;AAEhD,eAAUlU,IAAI,GAAGoU,IAAID,EAAS,QAAQnU,IAAIoU,GAAGpU,KAAO;AAEnD,cAAMqU,IAAUF,EAAUnU,CAAC,GAErBnH,IAAOwb,EAAQ,OAAQ,CAAC,GACxBC,IAAOD,EAAQ,MAAO,CAAC,EAAG,KAAI;AAEpC,QAAKL,MAAiB,OAErBC,IAAkB,IAClBD,IAAe;AAIhB,YAAIO;AAEJ,gBAAS1b,GAAI;AAAA,UAEZ,KAAK;AACJ,YAAA0b,IAAUC,EAAaF,CAAI;AAC3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK;AAElD,cAAAV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACxB2G,EAAQ,IAAIrH,EAAM,GAClBqH,EAAQ,IAAIrH,EAAM,GAEbU,MAAM,IAEVtM,EAAK,OAAQ4L,EAAM,GAAGA,EAAM,CAAC,IAI7B5L,EAAK,OAAQ4L,EAAM,GAAGA,EAAM,CAAC,GAIzBU,MAAM,KAAI4G,EAAW,KAAMtH,CAAK;AAItC;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH;AAE7C,cAAAV,EAAM,IAAI8H,EAASpH,CAAC,GACpB2G,EAAQ,IAAIrH,EAAM,GAClBqH,EAAQ,IAAIrH,EAAM,GAClB5L,EAAK,OAAQ4L,EAAM,GAAGA,EAAM,CAAC,GAExBU,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH;AAE7C,cAAAV,EAAM,IAAI8H,EAASpH,CAAC,GACpB2G,EAAQ,IAAIrH,EAAM,GAClBqH,EAAQ,IAAIrH,EAAM,GAClB5L,EAAK,OAAQ4L,EAAM,GAAGA,EAAM,CAAC,GAExBU,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK;AAElD,cAAAV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACxB2G,EAAQ,IAAIrH,EAAM,GAClBqH,EAAQ,IAAIrH,EAAM,GAClB5L,EAAK,OAAQ4L,EAAM,GAAGA,EAAM,CAAC,GAExBU,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK;AAElD,cAAAtM,EAAK;AAAA,gBACJ0T,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,cACtB,GACO2G,EAAQ,IAAIS,EAASpH,IAAI,CAAC,GAC1B2G,EAAQ,IAAIS,EAASpH,IAAI,CAAC,GAC1BV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GAEnBA,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK;AAElD,cAAAtM,EAAK;AAAA,gBACJ6T,EAAejI,EAAM,GAAGqH,EAAQ,CAAC;AAAA,gBACjCY,EAAejI,EAAM,GAAGqH,EAAQ,CAAC;AAAA,gBACjCS,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,cACtB,GACO2G,EAAQ,IAAIS,EAASpH,IAAI,CAAC,GAC1B2G,EAAQ,IAAIS,EAASpH,IAAI,CAAC,GAC1BV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GAEnBA,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK;AAElD,cAAAtM,EAAK;AAAA,gBACJ0T,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,cACtB,GACO2G,EAAQ,IAAIS,EAASpH,IAAI,CAAC,GAC1B2G,EAAQ,IAAIS,EAASpH,IAAI,CAAC,GAC1BV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GAEnBA,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK,GAAI;AAEtD,oBAAMwH,KAAKD,EAAejI,EAAM,GAAGqH,EAAQ,CAAC,GACtCc,KAAKF,EAAejI,EAAM,GAAGqH,EAAQ,CAAC;AAC5C,cAAAjT,EAAK;AAAA,gBACJ8T;AAAA,gBACAC;AAAA,gBACAL,EAASpH,IAAI,CAAC;AAAA,gBACdoH,EAASpH,IAAI,CAAC;AAAA,cACtB,GACO2G,EAAQ,IAAIa,IACZb,EAAQ,IAAIc,IACZnI,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GAEnBA,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAAA,YAElE;AAEA;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,GAAM,CAAE,GAAG,CAAC,GAAI,CAAC;AAExC,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK,GAAI;AAGtD,kBAAKoH,EAASpH,IAAI,CAAC,KAAMV,EAAM,KAAK8H,EAASpH,IAAI,MAAOV,EAAM,EAAI;AAElE,oBAAMoI,KAAQpI,EAAM,MAAK;AACzB,cAAAA,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACxB2G,EAAQ,IAAIrH,EAAM,GAClBqH,EAAQ,IAAIrH,EAAM,GAClBqI;AAAA,gBACCjU;AAAA,gBAAM0T,EAASpH;gBAAKoH,EAASpH,IAAI,CAAC;AAAA,gBAAIoH,EAASpH,IAAI,CAAC;AAAA,gBAAIoH,EAASpH,IAAI,CAAC;AAAA,gBAAIoH,EAASpH,IAAI,CAAC;AAAA,gBAAI0H;AAAA,gBAAOpI;AAAA,cAC3G,GAEYU,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAAA,YAElE;AAEA;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK;AAElD,cAAAV,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GACzBV,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GACzB2G,EAAQ,IAAIrH,EAAM,GAClBqH,EAAQ,IAAIrH,EAAM,GAEbU,MAAM,IAEVtM,EAAK,OAAQ4L,EAAM,GAAGA,EAAM,CAAC,IAI7B5L,EAAK,OAAQ4L,EAAM,GAAGA,EAAM,CAAC,GAIzBU,MAAM,KAAI4G,EAAW,KAAMtH,CAAK;AAItC;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH;AAE7C,cAAAV,EAAM,KAAK8H,EAASpH,CAAC,GACrB2G,EAAQ,IAAIrH,EAAM,GAClBqH,EAAQ,IAAIrH,EAAM,GAClB5L,EAAK,OAAQ4L,EAAM,GAAGA,EAAM,CAAC,GAExBU,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH;AAE7C,cAAAV,EAAM,KAAK8H,EAASpH,CAAC,GACrB2G,EAAQ,IAAIrH,EAAM,GAClBqH,EAAQ,IAAIrH,EAAM,GAClB5L,EAAK,OAAQ4L,EAAM,GAAGA,EAAM,CAAC,GAExBU,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK;AAElD,cAAAV,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GACzBV,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GACzB2G,EAAQ,IAAIrH,EAAM,GAClBqH,EAAQ,IAAIrH,EAAM,GAClB5L,EAAK,OAAQ4L,EAAM,GAAGA,EAAM,CAAC,GAExBU,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK;AAElD,cAAAtM,EAAK;AAAA,gBACJ4L,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,cAChC,GACO2G,EAAQ,IAAIrH,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACpC2G,EAAQ,IAAIrH,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACpCV,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GACzBV,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GAEpBA,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK;AAElD,cAAAtM,EAAK;AAAA,gBACJ6T,EAAejI,EAAM,GAAGqH,EAAQ,CAAC;AAAA,gBACjCY,EAAejI,EAAM,GAAGqH,EAAQ,CAAC;AAAA,gBACjCrH,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,cAChC,GACO2G,EAAQ,IAAIrH,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACpC2G,EAAQ,IAAIrH,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACpCV,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GACzBV,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GAEpBA,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK;AAElD,cAAAtM,EAAK;AAAA,gBACJ4L,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,cAChC,GACO2G,EAAQ,IAAIrH,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACpC2G,EAAQ,IAAIrH,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GACpCV,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GACzBV,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GAEpBA,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAIlE;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,CAAI;AAE3B,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK,GAAI;AAEtD,oBAAMwH,KAAKD,EAAejI,EAAM,GAAGqH,EAAQ,CAAC,GACtCc,KAAKF,EAAejI,EAAM,GAAGqH,EAAQ,CAAC;AAC5C,cAAAjT,EAAK;AAAA,gBACJ8T;AAAA,gBACAC;AAAA,gBACAnI,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,gBACxBV,EAAM,IAAI8H,EAASpH,IAAI,CAAC;AAAA,cAChC,GACO2G,EAAQ,IAAIa,IACZb,EAAQ,IAAIc,IACZnI,EAAM,IAAIA,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GAClCV,EAAM,IAAIA,EAAM,IAAI8H,EAASpH,IAAI,CAAC,GAE7BA,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAAA,YAElE;AAEA;AAAA,UAED,KAAK;AACJ,YAAA8H,IAAUC,EAAaF,GAAM,CAAE,GAAG,CAAC,GAAI,CAAC;AAExC,qBAAUnH,IAAI,GAAGsH,IAAKF,EAAQ,QAAQpH,IAAIsH,GAAItH,KAAK,GAAI;AAGtD,kBAAKoH,EAASpH,IAAI,MAAO,KAAKoH,EAASpH,IAAI,CAAC,KAAM,EAAI;AAEtD,oBAAM0H,KAAQpI,EAAM,MAAK;AACzB,cAAAA,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GACzBV,EAAM,KAAK8H,EAASpH,IAAI,CAAC,GACzB2G,EAAQ,IAAIrH,EAAM,GAClBqH,EAAQ,IAAIrH,EAAM,GAClBqI;AAAA,gBACCjU;AAAA,gBAAM0T,EAASpH;gBAAKoH,EAASpH,IAAI,CAAC;AAAA,gBAAIoH,EAASpH,IAAI,CAAC;AAAA,gBAAIoH,EAASpH,IAAI,CAAC;AAAA,gBAAIoH,EAASpH,IAAI,CAAC;AAAA,gBAAI0H;AAAA,gBAAOpI;AAAA,cAC3G,GAEYU,MAAM,KAAK8G,MAAoB,MAAOF,EAAW,KAAMtH,CAAK;AAAA,YAElE;AAEA;AAAA,UAED,KAAK;AAAA,UACL,KAAK;AACJ,YAAA5L,EAAK,YAAY,YAAY,IAExBA,EAAK,YAAY,OAAO,SAAS,MAGrC4L,EAAM,KAAMsH,CAAU,GACtBlT,EAAK,YAAY,aAAa,KAAM4L,CAAK,GACzCuH,IAAe;AAIhB;AAAA,UAED;AACC,oBAAQ,KAAMK,CAAO;AAAA,QAE3B;AAII,QAAAJ,IAAkB;AAAA,MAEnB;AAEA,aAAOpT;AAAA,IAER;AAEA,aAASgS,EAAoBN,GAAO;AAEnC,UAAK,GAAEA,EAAK,SAAS,CAAEA,EAAK,MAAM,YAAY,CAAEA,EAAK,MAAM,SAAS;AAEpE,iBAAUvS,IAAI,GAAGA,IAAIuS,EAAK,MAAM,SAAS,QAAQvS,KAAO;AAEvD,gBAAM+U,IAAaxC,EAAK,MAAM,SAAUvS,CAAC;AAEzC,cAAK+U,EAAW,SAAS,EAAI;AAE7B,gBAAMC,IAAeD,EAAW,aAC9B,MAAO,KAAK,EACZ,OAAQ,OAAO,EACf,IAAK,CAAA/U,MAAKA,EAAE,MAAM;AAEpB,mBAAUmN,IAAI,GAAGA,IAAI6H,EAAa,QAAQ7H,KAAO;AAGhD,kBAAM8H,IAAc,OAAO;AAAA,cAC1B,OAAO,QAASF,EAAW,KAAK,EAAG,OAAQ,CAAE,CAAA,EAAIvU,OAASA,MAAM,EAAE;AAAA,YACxE;AAEK,YAAA0U,EAAaF,EAAc7H,EAAG,IAAK,OAAO;AAAA,cACzC+H,EAAaF,EAAc7H,CAAC,CAAE,KAAM,CAAA;AAAA,cACpC8H;AAAA,YACN;AAAA,UAEI;AAAA,QAED;AAAA,IAED;AAWA,aAASH,EAAiBjU,GAAM8T,GAAIC,GAAIO,GAAiBC,GAAgBC,GAAYR,GAAOS,GAAM;AAEjG,UAAKX,KAAM,KAAKC,KAAM,GAAI;AAGzB,QAAA/T,EAAK,OAAQyU,EAAI,GAAGA,EAAI,CAAC;AACzB;AAAA,MAED;AAEA,MAAAH,IAAkBA,IAAkB,KAAK,KAAK,KAG9CR,IAAK,KAAK,IAAKA,CAAE,GACjBC,IAAK,KAAK,IAAKA,CAAE;AAGjB,YAAMW,KAAQV,EAAM,IAAIS,EAAI,KAAM,GAC5BE,KAAQX,EAAM,IAAIS,EAAI,KAAM,GAC5BG,IAAM,KAAK,IAAKN,CAAe,IAAKI,IAAM,KAAK,IAAKJ,CAAe,IAAKK,GACxEE,IAAM,CAAE,KAAK,IAAKP,CAAe,IAAKI,IAAM,KAAK,IAAKJ,CAAe,IAAKK;AAGhF,UAAIG,IAAMhB,IAAKA,GACXiB,IAAMhB,IAAKA;AACf,YAAMiB,IAAOJ,IAAMA,GACbK,IAAOJ,IAAMA,GAGbK,IAAKF,IAAOF,IAAMG,IAAOF;AAE/B,UAAKG,IAAK,GAAI;AAGb,cAAMzO,KAAI,KAAK,KAAMyO,CAAE;AACvB,QAAApB,IAAKrN,KAAIqN,GACTC,IAAKtN,KAAIsN,GACTe,IAAMhB,IAAKA,GACXiB,IAAMhB,IAAKA;AAAA,MAEZ;AAEA,YAAMoB,KAAOL,IAAMG,IAAOF,IAAMC,GAC1BI,MAAON,IAAMC,IAAMI,MAAOA;AAChC,UAAInZ,KAAI,KAAK,KAAM,KAAK,IAAK,GAAGoZ,GAAI;AACpC,MAAKb,MAAmBC,MAAaxY,KAAI,CAAEA;AAC3C,YAAMqZ,KAAMrZ,KAAI8X,IAAKe,IAAMd,GACrBuB,KAAM,CAAEtZ,KAAI+X,IAAKa,IAAMd,GAGvB5L,KAAK,KAAK,IAAKoM,CAAe,IAAKe,KAAM,KAAK,IAAKf,CAAe,IAAKgB,MAAQtB,EAAM,IAAIS,EAAI,KAAM,GACnGtM,KAAK,KAAK,IAAKmM,CAAe,IAAKe,KAAM,KAAK,IAAKf,CAAe,IAAKgB,MAAQtB,EAAM,IAAIS,EAAI,KAAM,GAGnGc,KAAQC,EAAU,GAAG,IAAKZ,IAAMS,MAAQvB,IAAMe,IAAMS,MAAQvB,CAAE,GAC9D7U,KAAQsW,GAAYZ,IAAMS,MAAQvB,IAAMe,IAAMS,MAAQvB,IAAM,CAAEa,IAAMS,MAAQvB,IAAM,CAAEe,IAAMS,MAAQvB,MAAS,KAAK,KAAK;AAE3H,MAAA/T,EAAK,YAAY,WAAYkI,IAAIC,IAAI2L,GAAIC,GAAIwB,IAAOA,KAAQrW,IAAOsV,MAAe,GAAGF,CAAe;AAAA,IAErG;AAEA,aAASkB,EAAUC,GAAIC,GAAIC,GAAIC,GAAK;AAEnC,YAAMC,IAAMJ,IAAKE,IAAKD,IAAKE,GACrBE,IAAM,KAAK,KAAML,IAAKA,IAAKC,IAAKA,CAAE,IAAK,KAAK,KAAMC,IAAKA,IAAKC,IAAKA,CAAE;AACzE,UAAIG,IAAM,KAAK,KAAM,KAAK,IAAK,IAAK,KAAK,IAAK,GAAGF,IAAMC,CAAG,CAAE,CAAE;AAC9D,aAAOL,IAAKG,IAAKF,IAAKC,IAAO,MAAII,IAAM,CAAEA,IAClCA;AAAA,IAER;AAOA,aAAS7D,EAAeR,GAAO;AAE9B,YAAMnO,IAAIyS,EAAqBtE,EAAK,aAAc,GAAG,KAAM,CAAC,GACtDlO,IAAIwS,EAAqBtE,EAAK,aAAc,GAAG,KAAM,CAAC,GACtDoC,IAAKkC,EAAqBtE,EAAK,aAAc,SAAUA,EAAK,aAAc,IAAI,KAAM,CAAC,GACrFqC,IAAKiC,EAAqBtE,EAAK,aAAc,SAAUA,EAAK,aAAc,IAAI,KAAM,CAAC,GACrFuE,IAAID,EAAqBtE,EAAK,aAAc,OAAO,CAAE,GACrDwE,IAAIF,EAAqBtE,EAAK,aAAc,QAAQ,CAAE,GAItDyE,IAAM,IAAI,gBAEVnW,IAAO,IAAI+S,GAAS;AAG1B,aAAA/S,EAAK,OAAQuD,IAAIuQ,GAAItQ,CAAC,GAGtBxD,EAAK,OAAQuD,IAAI0S,IAAInC,GAAItQ,CAAC,IACrBsQ,MAAO,KAAKC,MAAO,MAEvB/T,EAAK;AAAA,QACJuD,IAAI0S,IAAInC,IAAKqC;AAAA,QACb3S;AAAA,QACAD,IAAI0S;AAAA,QACJzS,IAAIuQ,IAAKoC;AAAA,QACT5S,IAAI0S;AAAA,QACJzS,IAAIuQ;AAAA,MACT,GAKG/T,EAAK,OAAQuD,IAAI0S,GAAGzS,IAAI0S,IAAInC,CAAE,IACzBD,MAAO,KAAKC,MAAO,MAEvB/T,EAAK;AAAA,QACJuD,IAAI0S;AAAA,QACJzS,IAAI0S,IAAInC,IAAKoC;AAAA,QACb5S,IAAI0S,IAAInC,IAAKqC;AAAA,QACb3S,IAAI0S;AAAA,QACJ3S,IAAI0S,IAAInC;AAAA,QACRtQ,IAAI0S;AAAA,MACT,GAKGlW,EAAK,OAAQuD,IAAIuQ,GAAItQ,IAAI0S,CAAC,IACrBpC,MAAO,KAAKC,MAAO,MAEvB/T,EAAK;AAAA,QACJuD,IAAIuQ,IAAKqC;AAAA,QACT3S,IAAI0S;AAAA,QACJ3S;AAAA,QACAC,IAAI0S,IAAInC,IAAKoC;AAAA,QACb5S;AAAA,QACAC,IAAI0S,IAAInC;AAAA,MACb,GAKG/T,EAAK,OAAQuD,GAAGC,IAAIuQ,CAAE,IACjBD,MAAO,KAAKC,MAAO,MAEvB/T,EAAK,cAAeuD,GAAGC,IAAIuQ,IAAKoC,GAAK5S,IAAIuQ,IAAKqC,GAAK3S,GAAGD,IAAIuQ,GAAItQ,CAAC,GAIzDxD;AAAA,IAER;AAEA,aAASmS,EAAkBT,GAAO;AAEjC,eAAS0E,EAAUC,GAAOvK,GAAGC,GAAI;AAEhC,cAAMxI,IAAIyS,EAAqBlK,CAAC,GAC1BtI,IAAIwS,EAAqBjK,CAAC;AAEhC,QAAKvM,MAAU,IAEdQ,EAAK,OAAQuD,GAAGC,CAAC,IAIjBxD,EAAK,OAAQuD,GAAGC,CAAC,GAIlBhE;AAAA,MAED;AAEA,YAAM8W,IAAQ,yEAERtW,IAAO,IAAI+S,GAAS;AAE1B,UAAIvT,IAAQ;AAEZ,aAAAkS,EAAK,aAAc,QAAQ,EAAG,QAAS4E,GAAOF,CAAQ,GAEtDpW,EAAK,YAAY,YAAY,IAEtBA;AAAA,IAER;AAEA,aAASoS,EAAmBV,GAAO;AAElC,eAAS0E,EAAUC,GAAOvK,GAAGC,GAAI;AAEhC,cAAMxI,IAAIyS,EAAqBlK,CAAC,GAC1BtI,IAAIwS,EAAqBjK,CAAC;AAEhC,QAAKvM,MAAU,IAEdQ,EAAK,OAAQuD,GAAGC,CAAC,IAIjBxD,EAAK,OAAQuD,GAAGC,CAAC,GAIlBhE;AAAA,MAED;AAEA,YAAM8W,IAAQ,yEAERtW,IAAO,IAAI+S,GAAS;AAE1B,UAAIvT,IAAQ;AAEZ,aAAAkS,EAAK,aAAc,QAAQ,EAAG,QAAS4E,GAAOF,CAAQ,GAEtDpW,EAAK,YAAY,YAAY,IAEtBA;AAAA,IAER;AAEA,aAASqS,EAAiBX,GAAO;AAEhC,YAAMnO,IAAIyS,EAAqBtE,EAAK,aAAc,IAAI,KAAM,CAAC,GACvDlO,IAAIwS,EAAqBtE,EAAK,aAAc,IAAI,KAAM,CAAC,GACvD,IAAIsE,EAAqBtE,EAAK,aAAc,GAAG,KAAM,CAAC,GAEtD6E,IAAU,IAAIC,GAAI;AACxB,MAAAD,EAAQ,OAAQhT,GAAGC,GAAG,GAAG,GAAG,KAAK,KAAK,CAAC;AAEvC,YAAMxD,IAAO,IAAI+S,GAAS;AAC1B,aAAA/S,EAAK,SAAS,KAAMuW,CAAO,GAEpBvW;AAAA,IAER;AAEA,aAASsS,EAAkBZ,GAAO;AAEjC,YAAMnO,IAAIyS,EAAqBtE,EAAK,aAAc,IAAI,KAAM,CAAC,GACvDlO,IAAIwS,EAAqBtE,EAAK,aAAc,IAAI,KAAM,CAAC,GACvDoC,IAAKkC,EAAqBtE,EAAK,aAAc,IAAI,KAAM,CAAC,GACxDqC,IAAKiC,EAAqBtE,EAAK,aAAc,IAAI,KAAM,CAAC,GAExD6E,IAAU,IAAIC,GAAI;AACxB,MAAAD,EAAQ,WAAYhT,GAAGC,GAAGsQ,GAAIC,GAAI,GAAG,KAAK,KAAK,CAAC;AAEhD,YAAM/T,IAAO,IAAI+S,GAAS;AAC1B,aAAA/S,EAAK,SAAS,KAAMuW,CAAO,GAEpBvW;AAAA,IAER;AAEA,aAASuS,EAAeb,GAAO;AAE9B,YAAM+E,IAAKT,EAAqBtE,EAAK,aAAc,IAAI,KAAM,CAAC,GACxDgF,IAAKV,EAAqBtE,EAAK,aAAc,IAAI,KAAM,CAAC,GACxDiF,IAAKX,EAAqBtE,EAAK,aAAc,IAAI,KAAM,CAAC,GACxDkF,IAAKZ,EAAqBtE,EAAK,aAAc,IAAI,KAAM,CAAC,GAExD1R,IAAO,IAAI+S,GAAS;AAC1B,aAAA/S,EAAK,OAAQyW,GAAIC,CAAE,GACnB1W,EAAK,OAAQ2W,GAAIC,CAAE,GACnB5W,EAAK,YAAY,YAAY,IAEtBA;AAAA,IAER;AAIA,aAAS+R,EAAYL,GAAMC,GAAQ;AAElC,MAAAA,IAAQ,OAAO,OAAQ,CAAA,GAAIA,CAAK;AAEhC,UAAIkF,IAAmB,CAAA;AAEvB,UAAKnF,EAAK,aAAc,UAAY;AAEnC,cAAMoF,IAAiBpF,EAAK,aAAc,OAAO,EAC/C,MAAO,IAAI,EACX,OAAQ,OAAO,EACf,IAAK,CAAAvS,MAAKA,EAAE,MAAM;AAEpB,iBAAUA,IAAI,GAAGA,IAAI2X,EAAe,QAAQ3X;AAE3C,UAAA0X,IAAmB,OAAO,OAAQA,GAAkBxC,EAAa,MAAMyC,EAAgB3X,CAAC,EAAI;AAAA,MAI9F;AAEA,MAAKuS,EAAK,aAAc,UAEvBmF,IAAmB,OAAO,OAAQA,GAAkBxC,EAAa,MAAM3C,EAAK,aAAc,IAAI,EAAI;AAInG,eAASqF,EAAUC,GAASC,GAAQC,GAAiB;AAEpD,QAAKA,MAAmB,WAAYA,IAAiB,SAAevX,GAAI;AAEvE,iBAAKA,EAAE,WAAY,KAAK,KAAK,QAAQ,KAAM,yDAAyD,GAE7FA;AAAA,QAER,IAEK+R,EAAK,aAAcsF,CAAO,MAAKrF,EAAOsF,CAAM,IAAKC,EAAgBxF,EAAK,aAAcsF,CAAO,CAAE,IAC7FH,EAAkBG,CAAO,MAAKrF,EAAOsF,CAAM,IAAKC,EAAgBL,EAAkBG,EAAS,IAC3FtF,EAAK,SAASA,EAAK,MAAOsF,CAAO,MAAO,OAAKrF,EAAOsF,CAAM,IAAKC,EAAgBxF,EAAK,MAAOsF,CAAO,CAAE;AAAA,MAE1G;AAEA,eAASG,EAAOxX,GAAI;AAEnB,eAAO,KAAK,IAAK,GAAG,KAAK,IAAK,GAAGqW,EAAqBrW,CAAC,EAAI;AAAA,MAE5D;AAEA,eAASyX,EAAUzX,GAAI;AAEtB,eAAO,KAAK,IAAK,GAAGqW,EAAqBrW,CAAC,CAAE;AAAA,MAE7C;AAEA,aAAAoX,EAAU,QAAQ,MAAM,GACxBA,EAAU,gBAAgB,eAAeI,CAAK,GAC9CJ,EAAU,aAAa,UAAU,GACjCA,EAAU,WAAW,WAAWI,CAAK,GACrCJ,EAAU,UAAU,QAAQ,GAC5BA,EAAU,kBAAkB,iBAAiBI,CAAK,GAClDJ,EAAU,gBAAgB,eAAeK,CAAQ,GACjDL,EAAU,mBAAmB,gBAAgB,GAC7CA,EAAU,kBAAkB,eAAe,GAC3CA,EAAU,qBAAqB,oBAAoBK,CAAQ,GAC3DL,EAAU,cAAc,YAAY,GAE7BpF;AAAA,IAER;AAIA,aAASkC,EAAe/H,GAAGC,GAAI;AAE9B,aAAOD,KAAMC,IAAID;AAAA,IAElB;AAIA,aAAS6H,EAAa0D,GAAOC,GAAOC,GAAS;AAE5C,UAAK,OAAOF,KAAU;AAErB,cAAM,IAAI,UAAW,oBAAoB,OAAOA,CAAK;AAKtD,YAAMG,IAAK;AAAA,QAEV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,QACP,KAAK;AAAA,QACL,OAAO;AAAA,MACX,GAGSC,IAAM,GACNC,IAAM,GACNC,IAAQ,GACRC,IAAM;AAEZ,UAAIzI,IAAQsI,GACRI,IAAY,IACZC,IAAS,IAAIC,IAAW;AAC5B,YAAMC,IAAS,CAAA;AAEf,eAASC,EAAkBtM,IAASxM,IAAG+Y,IAAU;AAEhD,cAAMtN,KAAQ,IAAI,YAAa,2BAA2Be,KAAU,gBAAgBxM,KAAI,GAAG;AAC3F,cAAAyL,GAAM,UAAUsN,IACVtN;AAAA,MAEP;AAEA,eAASuN,IAAY;AAEpB,QAAKL,MAAW,OAEVC,MAAa,KAAKC,EAAO,KAAM,OAAQF,EAAQ,IAC/CE,EAAO,KAAM,OAAQF,KAAW,KAAK,IAAK,IAAI,OAAQC,CAAQ,EAAI,IAIxED,IAAS,IACTC,IAAW;AAAA,MAEZ;AAEA,UAAIpM;AACJ,YAAMyM,IAASf,EAAM;AAErB,eAAUlY,KAAI,GAAGA,KAAIiZ,GAAQjZ,MAAO;AAKnC,YAHAwM,IAAU0L,EAAOlY,EAAC,GAGb,MAAM,QAASmY,CAAK,KAAMA,EAAM,SAAUU,EAAO,SAAST,CAAM,KAAMC,EAAG,MAAM,KAAM7L,CAAO,GAAK;AAErG,UAAAwD,IAAQuI,GACRI,IAASnM,GACTwM,EAAS;AACT;AAAA,QAED;AAGA,YAAKhJ,MAAUsI,GAAM;AAGpB,cAAKD,EAAG,WAAW,KAAM7L,CAAO;AAE/B;AAKD,cAAK6L,EAAG,MAAM,KAAM7L,CAAO,KAAM6L,EAAG,KAAK,KAAM7L,IAAY;AAE1D,YAAAwD,IAAQuI,GACRI,IAASnM;AACT;AAAA,UAED;AAEA,cAAK6L,EAAG,MAAM,KAAM7L,CAAO,GAAK;AAE/B,YAAAwD,IAAQwI,GACRG,IAASnM;AACT;AAAA,UAED;AAGA,UAAK6L,EAAG,MAAM,KAAM7L,CAAO,MAErBkM,KAEJI,EAAkBtM,GAASxM,IAAG6Y,CAAM,GAIrCH,IAAY;AAAA,QAId;AAGA,YAAK1I,MAAUuI,GAAM;AAEpB,cAAKF,EAAG,MAAM,KAAM7L,CAAO,GAAK;AAE/B,YAAAmM,KAAUnM;AACV;AAAA,UAED;AAEA,cAAK6L,EAAG,MAAM,KAAM7L,CAAO,GAAK;AAE/B,YAAAmM,KAAUnM,GACVwD,IAAQwI;AACR;AAAA,UAED;AAEA,cAAKH,EAAG,IAAI,KAAM7L,CAAO,GAAK;AAE7B,YAAAwD,IAAQyI;AACR;AAAA,UAED;AAGA,UAAKJ,EAAG,KAAK,KAAM7L,CAAO,KACrBmM,EAAO,WAAW,KAClBN,EAAG,KAAK,KAAMM,EAAQ,CAAC,CAAE,KAE7BG,EAAkBtM,GAASxM,IAAG6Y,CAAM;AAAA,QAItC;AAGA,YAAK7I,MAAUwI,GAAQ;AAEtB,cAAKH,EAAG,MAAM,KAAM7L,CAAO,GAAK;AAE/B,YAAAmM,KAAUnM;AACV;AAAA,UAED;AAEA,cAAK6L,EAAG,IAAI,KAAM7L,CAAO,GAAK;AAE7B,YAAAwD,IAAQyI;AACR;AAAA,UAED;AAGA,UAAKJ,EAAG,MAAM,KAAM7L,CAAO,KAAMmM,EAAQA,EAAO,SAAS,CAAC,MAAO,OAEhEG,EAAkBtM,GAASxM,IAAG6Y,CAAM;AAAA,QAItC;AAGA,YAAK7I,MAAUyI,GAAM;AAEpB,cAAKJ,EAAG,MAAM,KAAM7L,CAAO,GAAK;AAE/B,YAAAoM,KAAYpM;AACZ;AAAA,UAED;AAEA,cAAK6L,EAAG,KAAK,KAAM7L,CAAO,GAAK;AAE9B,gBAAKoM,MAAa,IAAK;AAEtB,cAAAA,KAAYpM;AACZ;AAAA,YAED;AAEA,YAAKoM,EAAS,WAAW,KAAKP,EAAG,KAAK,KAAMO,MAE3CE,EAAkBtM,GAASxM,IAAG6Y,CAAM;AAAA,UAItC;AAAA,QAED;AAIA,QAAKR,EAAG,WAAW,KAAM7L,CAAO,KAE/BwM,EAAS,GACThJ,IAAQsI,GACRI,IAAY,MAEDL,EAAG,MAAM,KAAM7L,CAAO,KAEjCwM,EAAS,GACThJ,IAAQsI,GACRI,IAAY,MAEDL,EAAG,KAAK,KAAM7L,CAAO,KAEhCwM,EAAS,GACThJ,IAAQuI,GACRI,IAASnM,KAEE6L,EAAG,MAAM,KAAM7L,CAAO,KAEjCwM,EAAS,GACThJ,IAAQwI,GACRG,IAASnM,KAITsM,EAAkBtM,GAASxM,IAAG6Y,CAAM;AAAA,MAItC;AAGA,aAAAG,EAAS,GAEFH;AAAA,IAER;AAIA,UAAMK,IAAQ,CAAE,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,GAG5CC,IAAiB;AAAA,MAEtB,IAAM;AAAA,QACL,IAAM;AAAA,QACN,IAAM;AAAA,QACN,IAAM,IAAI;AAAA,QACV,IAAM,KAAK;AAAA,QACX,IAAM,IAAI;AAAA,QACV,IAAM;AAAA,MACV;AAAA,MACG,IAAM;AAAA,QACL,IAAM;AAAA,QACN,IAAM;AAAA,QACN,IAAM,IAAI;AAAA,QACV,IAAM,KAAK;AAAA,QACX,IAAM,IAAI;AAAA,QACV,IAAM;AAAA,MACV;AAAA,MACG,IAAM;AAAA,QACL,IAAM;AAAA,QACN,IAAM;AAAA,QACN,IAAM;AAAA,QACN,IAAM;AAAA,QACN,IAAM;AAAA,QACN,IAAM;AAAA,MACV;AAAA,MACG,IAAM;AAAA,QACL,IAAM,OAAO;AAAA,QACb,IAAM,OAAO;AAAA,QACb,IAAM,IAAI;AAAA,QACV,IAAM;AAAA,QACN,IAAM,IAAI;AAAA,QACV,IAAM;AAAA,MACV;AAAA,MACG,IAAM;AAAA,QACL,IAAM,OAAO;AAAA,QACb,IAAM,OAAO;AAAA,QACb,IAAM,IAAI;AAAA,QACV,IAAM,KAAK;AAAA,QACX,IAAM;AAAA,QACN,IAAM;AAAA,MACV;AAAA,MACG,IAAM;AAAA,QACL,IAAM;AAAA,MACV;AAAA,IAEA;AAEE,aAAStC,EAAqBuC,GAAS;AAEtC,UAAIC,IAAU;AAEd,UAAK,OAAOD,KAAW,YAAYA,aAAkB;AAEpD,iBAAUpZ,IAAI,GAAGsZ,IAAIJ,EAAM,QAAQlZ,IAAIsZ,GAAGtZ,KAAO;AAEhD,gBAAMuZ,IAAIL,EAAOlZ,CAAC;AAElB,cAAKoZ,EAAO,SAAUG,IAAM;AAE3B,YAAAF,IAAUE,GACVH,IAASA,EAAO,UAAW,GAAGA,EAAO,SAASG,EAAE,MAAM;AACtD;AAAA,UAED;AAAA,QAED;AAID,UAAI5K;AAEJ,aAAK0K,MAAY,QAAQlH,EAAM,gBAAgB,OAI9CxD,IAAQwK,EAAgB,GAAQhH,EAAM,WAAW,IAAKA,EAAM,cAI5DxD,IAAQwK,EAAgBE,GAAWlH,EAAM,WAAW,GAE/CxD,IAAQ,MAIZA,IAAQwK,EAAgBE,CAAO,EAAI,KAASlH,EAAM,cAM7CxD,IAAQ,WAAYyK,CAAM;AAAA,IAElC;AAIA,aAAS1G,EAAkBH,GAAO;AAEjC,UAAK,EAAIA,EAAK,aAAc,WAAW,KAAQA,EAAK,aAAa,UAAWA,EAAK,aAAc,GAAG,KAAMA,EAAK,aAAc,GAAG;AAE7H,eAAO;AAIR,YAAME,IAAY+G,EAAoBjH,CAAI;AAE1C,aAAKoB,EAAe,SAAS,KAE5BlB,EAAU,YAAakB,EAAgBA,EAAe,SAAS,CAAC,CAAE,GAInEH,GAAiB,KAAMf,CAAS,GAChCkB,EAAe,KAAMlB,CAAS,GAEvBA;AAAA,IAER;AAEA,aAAS+G,EAAoBjH,GAAO;AAEnC,YAAME,IAAY,IAAIgH,GAAO,GACvBjG,IAAmBkG;AAEzB,UAAKnH,EAAK,aAAa,UAAWA,EAAK,aAAc,GAAG,KAAMA,EAAK,aAAc,GAAG,IAAO;AAE1F,cAAMoH,IAAK9C,EAAqBtE,EAAK,aAAc,GAAG,CAAE,GAClDqH,IAAK/C,EAAqBtE,EAAK,aAAc,GAAG,CAAE;AAExD,QAAAE,EAAU,UAAWkH,GAAIC,CAAE;AAAA,MAE5B;AAEA,UAAKrH,EAAK,aAAc,cAAgB;AAEvC,cAAMsH,IAAkBtH,EAAK,aAAc,WAAW,EAAG,MAAO,GAAG;AAEnE,iBAAUuH,IAASD,EAAgB,SAAS,GAAGC,KAAU,GAAGA,KAAY;AAEvE,gBAAMC,IAAgBF,EAAiBC,CAAM,EAAG,KAAI;AAEpD,cAAKC,MAAkB,GAAK;AAE5B,gBAAMC,IAAaD,EAAc,QAAS,GAAG,GACvCE,IAAcF,EAAc;AAElC,cAAKC,IAAa,KAAKA,IAAaC,GAAc;AAEjD,kBAAMC,IAAgBH,EAAc,MAAO,GAAGC,CAAU,GAElDG,IAAQ3F,EAAauF,EAAc,MAAOC,IAAa,EAAG;AAIhE,oBAFAxG,EAAiB,SAAQ,GAEhB0G,GAAa;AAAA,cAErB,KAAK;AAEJ,oBAAKC,EAAM,UAAU,GAAI;AAExB,wBAAMR,IAAKQ,EAAO,CAAC;AACnB,sBAAIP,IAAK;AAET,kBAAKO,EAAM,UAAU,MAEpBP,IAAKO,EAAO,CAAC,IAId3G,EAAiB,UAAWmG,GAAIC,CAAE;AAAA,gBAEnC;AAEA;AAAA,cAED,KAAK;AAEJ,oBAAKO,EAAM,UAAU,GAAI;AAExB,sBAAIC,IAAQ,GACRrR,IAAK,GACLC,IAAK;AAGT,kBAAAoR,IAAQD,EAAO,CAAC,IAAK,KAAK,KAAK,KAE1BA,EAAM,UAAU,MAGpBpR,IAAKoR,EAAO,CAAC,GACbnR,IAAKmR,EAAO,CAAC,IAKdE,EAAe,gBAAiB,CAAEtR,GAAI,CAAEC,CAAE,GAC1CsR,EAAe,aAAcF,CAAK,GAClCG,EAAe,iBAAkBD,GAAgBD,CAAc,GAC/DA,EAAe,gBAAiBtR,GAAIC,CAAE,GACtCwK,EAAiB,iBAAkB6G,GAAgBE,CAAc;AAAA,gBAElE;AAEA;AAAA,cAED,KAAK;AAEJ,oBAAKJ,EAAM,UAAU,GAAI;AAExB,wBAAMK,IAASL,EAAO,CAAC;AACvB,sBAAIM,IAASD;AAEb,kBAAKL,EAAM,UAAU,MAEpBM,IAASN,EAAO,CAAC,IAIlB3G,EAAiB,MAAOgH,GAAQC,CAAM;AAAA,gBAEvC;AAEA;AAAA,cAED,KAAK;AAEJ,gBAAKN,EAAM,WAAW,KAErB3G,EAAiB;AAAA,kBAChB;AAAA,kBAAG,KAAK,IAAK2G,EAAO,CAAC,IAAK,KAAK,KAAK,GAAG;AAAA,kBAAI;AAAA,kBAC3C;AAAA,kBAAG;AAAA,kBAAG;AAAA,kBACN;AAAA,kBAAG;AAAA,kBAAG;AAAA,gBAChB;AAIQ;AAAA,cAED,KAAK;AAEJ,gBAAKA,EAAM,WAAW,KAErB3G,EAAiB;AAAA,kBAChB;AAAA,kBAAG;AAAA,kBAAG;AAAA,kBACN,KAAK,IAAK2G,EAAO,CAAC,IAAK,KAAK,KAAK;kBAAO;AAAA,kBAAG;AAAA,kBAC3C;AAAA,kBAAG;AAAA,kBAAG;AAAA,gBAChB;AAIQ;AAAA,cAED,KAAK;AAEJ,gBAAKA,EAAM,WAAW,KAErB3G,EAAiB;AAAA,kBAChB2G,EAAO,CAAC;AAAA,kBAAIA,EAAO,CAAC;AAAA,kBAAIA,EAAO,CAAC;AAAA,kBAChCA,EAAO,CAAC;AAAA,kBAAIA,EAAO,CAAC;AAAA,kBAAIA,EAAO,CAAC;AAAA,kBAChC;AAAA,kBAAG;AAAA,kBAAG;AAAA,gBAChB;AAIQ;AAAA,YAER;AAAA,UAEK;AAEA,UAAA1H,EAAU,YAAae,CAAgB;AAAA,QAExC;AAAA,MAED;AAEA,aAAOf;AAAA,IAER;AAEA,aAASc,EAAe1S,GAAM6Z,GAAI;AAEjC,eAASC,EAAYC,GAAK;AAEzB,QAAAC,GAAO,IAAKD,EAAG,GAAGA,EAAG,GAAG,CAAC,EAAG,aAAcF,CAAC,GAE3CE,EAAG,IAAKC,GAAO,GAAGA,GAAO,CAAC;AAAA,MAE3B;AAEA,eAASC,EAAsBC,GAAQ;AAKtC,cAAMpO,IAAIoO,EAAM,SACVnO,IAAImO,EAAM,SAEVC,IAAW,KAAK,IAAKD,EAAM,SAAS,GACpCE,IAAW,KAAK,IAAKF,EAAM,SAAS,GAEpCG,IAAK,IAAIC,GAASxO,IAAIqO,GAAUrO,IAAIsO,GAAU,CAAC,GAC/CL,IAAK,IAAIO,GAAS,CAAEvO,IAAIqO,GAAUrO,IAAIoO,GAAU,CAAC,GAEjDI,IAAKF,EAAG,aAAcR,CAAC,GACvBW,IAAKT,EAAG,aAAcF,CAAC,GAEvBY,IAAK5B,EAAe;AAAA,UACzB0B,EAAG;AAAA,UAAGC,EAAG;AAAA,UAAG;AAAA,UACZD,EAAG;AAAA,UAAGC,EAAG;AAAA,UAAG;AAAA,UACZ;AAAA,UAAG;AAAA,UAAG;AAAA,QACX,GAEUE,IAAQlB,EAAe,KAAMiB,CAAE,EAAG,OAAM,GAGxCE,KAFSlB,EAAe,KAAMiB,CAAK,EAAG,UAAS,EACnC,SAAUA,CAAK,EAClB,UAETE,KAAKC,GAAoBF,GAAK,CAAC,GAAIA,GAAK,CAAC,GAAIA,GAAK,EAAG,GACrDG,KAAU,KAAK,KAAMF,GAAG,GAAG,GAC3BG,KAAU,KAAK,KAAMH,GAAG,GAAG;AAYjC,YAVAV,EAAM,UAAU,IAAIY,IACpBZ,EAAM,UAAU,IAAIa,IACpBb,EAAM,YAAY,KAAK,MAAOU,GAAG,IAAIA,GAAG,EAAE,GAQrC,GALFV,EAAM,YAAYA,EAAM,gBAAkB,IAAI,KAAK,MAAO,OAAO,UAK7C;AAEtB,gBAAMc,KAASxB,EAAe;AAAA,YAC7BsB;AAAA,YAAS;AAAA,YAAG;AAAA,YACZ;AAAA,YAAGC;AAAA,YAAS;AAAA,YACZ;AAAA,YAAG;AAAA,YAAG;AAAA,UACZ,GAEWE,KAAMxB,EAAe;AAAA,YAC1BmB,GAAG;AAAA,YAAIA,GAAG;AAAA,YAAI;AAAA,YACd,CAAEA,GAAG;AAAA,YAAIA,GAAG;AAAA,YAAI;AAAA,YAChB;AAAA,YAAG;AAAA,YAAG;AAAA,UACZ,GAEWM,KAAOF,GAAO,SAAUC,EAAG,EAAG,SAAUR,CAAE,GAE1CU,KAAiB,CAAAC,OAAO;AAE7B,kBAAM,EAAE,GAAGC,IAAM,GAAGC,GAAI,IACvB,IAAIhB,GAAS,KAAK,IAAKc,EAAG,GAAI,KAAK,IAAKA,EAAG,GAAI,GAAI,aAAcF,EAAI;AAEtE,mBAAO,KAAK,MAAOI,IAAMD,EAAI;AAAA,UAE9B;AAEA,UAAAnB,EAAM,cAAciB,GAAgBjB,EAAM,WAAW,GACrDA,EAAM,YAAYiB,GAAgBjB,EAAM,SAAS,GAE5CqB,EAAoB1B,OAExBK,EAAM,aAAa,CAAEA,EAAM;AAAA,QAI7B;AAAA,MAED;AAEA,eAASsB,EAAqBtB,GAAQ;AAKrC,cAAMuB,IAAKC,EAAoB7B,CAAC,GAC1B8B,IAAKC,EAAoB/B,CAAC;AAEhC,QAAAK,EAAM,WAAWuB,GACjBvB,EAAM,WAAWyB;AASjB,cAAMpG,IACLkG,IAAK,OAAO,UACT,KAAK,MAAO5B,EAAE,SAAU,CAAC,GAAIA,EAAE,SAAU,CAAC,CAAE,IAC5C,KAAK,MAAO,CAAEA,EAAE,SAAU,CAAC,GAAIA,EAAE,SAAU,EAAG;AAElD,QAAAK,EAAM,aAAa3E,GAEdgG,EAAoB1B,OAExBK,EAAM,eAAe,IACrBA,EAAM,aAAa,IACnBA,EAAM,aAAa,CAAEA,EAAM;AAAA,MAI7B;AAEA,YAAM2B,IAAW7b,EAAK;AAEtB,eAAUb,IAAI,GAAGsZ,IAAIoD,EAAS,QAAQ1c,IAAIsZ,GAAGtZ,KAAO;AAGnD,cAAM2c,IADUD,EAAU1c,CAAC,EACJ;AAEvB,iBAAUmN,IAAI,GAAGA,IAAIwP,EAAO,QAAQxP,KAAO;AAE1C,gBAAM4N,IAAQ4B,EAAQxP,CAAC;AAEvB,UAAK4N,EAAM,eAEVJ,EAAYI,EAAM,EAAE,GACpBJ,EAAYI,EAAM,EAAE,KAETA,EAAM,sBAEjBJ,EAAYI,EAAM,EAAE,GACpBJ,EAAYI,EAAM,EAAE,GACpBJ,EAAYI,EAAM,EAAE,GACpBJ,EAAYI,EAAM,EAAE,KAETA,EAAM,0BAEjBJ,EAAYI,EAAM,EAAE,GACpBJ,EAAYI,EAAM,EAAE,GACpBJ,EAAYI,EAAM,EAAE,KAETA,EAAM,mBAIjB6B,EAAO,IAAK7B,EAAM,IAAIA,EAAM,EAAE,GAC9BJ,EAAYiC,CAAM,GAClB7B,EAAM,KAAK6B,EAAO,GAClB7B,EAAM,KAAK6B,EAAO,GAIbC,EAAmBnC,KAEvBI,EAAsBC,CAAK,IAI3BsB,EAAqBtB,CAAK;AAAA,QAM7B;AAAA,MAED;AAAA,IAED;AAEA,aAASqB,EAAoB,GAAI;AAEhC,YAAMU,IAAK,EAAE;AACb,aAAOA,EAAI,KAAMA,EAAI,CAAC,IAAKA,EAAI,CAAC,IAAKA,EAAI,CAAC,IAAK;AAAA,IAEhD;AAEA,aAASD,EAAmB,GAAI;AAE/B,YAAMC,IAAK,EAAE,UACPC,IAAWD,EAAI,CAAC,IAAKA,EAAI,CAAC,IAAKA,EAAI,KAAMA,EAAI,CAAC;AAGpD,UAAKC,MAAa,EAAI,QAAO;AAE7B,YAAMT,IAAKC,EAAoB,CAAC,GAC1BC,IAAKC,EAAoB,CAAC;AAEhC,aAAO,KAAK,IAAKM,KAAaT,IAAKE,EAAI,IAAK,OAAO;AAAA,IAEpD;AAEA,aAASD,EAAoB,GAAI;AAEhC,YAAMO,IAAK,EAAE;AACb,aAAO,KAAK,KAAMA,EAAI,CAAC,IAAKA,EAAI,CAAC,IAAKA,EAAI,CAAC,IAAKA,EAAI,CAAC,CAAE;AAAA,IAExD;AAEA,aAASL,EAAoB,GAAI;AAEhC,YAAMK,IAAK,EAAE;AACb,aAAO,KAAK,KAAMA,EAAI,CAAC,IAAKA,EAAI,CAAC,IAAKA,EAAI,CAAC,IAAKA,EAAI,CAAC,CAAE;AAAA,IAExD;AAYA,aAASpB,GAAoBsB,GAAGC,GAAGC,GAAI;AAEtC,UAAIC,GAAKC,GAAKC,GAAIC,GAAI3d;AACtB,YAAM4d,IAAKP,IAAIE,GACTM,IAAKR,IAAIE,GACTO,IAAK,KAAK,KAAMD,IAAKA,IAAK,IAAIP,IAAIA,CAAC;AAEzC,aAAKM,IAAK,KAETJ,IAAM,OAAQI,IAAKE,IACnB9d,IAAI,IAAIwd,GACRC,IAAMJ,IAAIrd,IAAIud,IAAID,IAAItd,IAAIsd,KAEfM,IAAK,IAEhBH,IAAM,OAAQG,IAAKE,MAMnBN,IAAM,MAAMM,GACZL,IAAM,OAAQK,IAMVD,IAAK,IAETH,IAAKG,IAAKC,IAIVJ,IAAKG,IAAKC,GAIN,KAAK,IAAKJ,CAAE,IAAK,IAAI,KAAK,IAAKJ,MAEnCtd,IAAI,KAAMsd,IAAII,GACdC,IAAK,IAAI,KAAK,KAAM,IAAI3d,IAAIA,CAAC,GAC7B0d,IAAK1d,IAAI2d,KAEE,KAAK,IAAKL,CAAC,MAAO,KAE7BI,IAAK,GACLC,IAAK,MAIL3d,IAAI,OAAQ0d,IAAKJ,GACjBI,IAAK,IAAI,KAAK,KAAM,IAAI1d,IAAIA,CAAC,GAC7B2d,IAAK3d,IAAI0d,IAILG,IAAK,MAET7d,IAAI0d,GACJA,IAAK,CAAEC,GACPA,IAAK3d,IAIC,EAAE,KAAAwd,GAAK,KAAAC,GAAK,IAAAC,GAAI,IAAAC,EAAE;AAAA,IAE1B;AAIA,UAAM7J,IAAQ,CAAA,GACRyB,IAAc,CAAA,GAEdvB,IAAiB,CAAA,GAEjB+F,IAAiB,IAAID,GAAO,GAC5BY,IAAiB,IAAIZ,GAAO,GAC5Ba,IAAiB,IAAIb,GAAO,GAC5Bc,IAAiB,IAAId,GAAO,GAC5BmD,IAAS,IAAI/I,GAAO,GACpBgH,KAAS,IAAIM,GAAO,GAEpB3H,KAAmB,IAAIiG,GAAO,GAE9BiE,KAAM,IAAI,UAAS,EAAG,gBAAiB1W,GAAM;AAEnD,WAAAsL,EAAWoL,GAAI,iBAAiB;AAAA,MAC/B,MAAM;AAAA,MACN,aAAa;AAAA,MACb,eAAe;AAAA,MACf,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,kBAAkB;AAAA,IACrB,CAAG,GAEY,EAAE,OAAOjK,GAAO,KAAKiK,GAAI,gBAAe;AAAA,EAKtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,aAAcC,GAAY;AAIhC,UAAMC,IAA2B;AAAA,MAChC,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACX,GAEQC,IAAiB;AAAA,MACtB,KAAKD,EAAyB;AAAA,MAC9B,GAAG;AAAA,IACN;AAEE,aAASE,EAAsBC,GAAIC,GAAIC,GAAIC,GAAK;AAE/C,YAAM5G,IAAKyG,EAAG,GACRvG,IAAKwG,EAAG,GACRG,IAAKF,EAAG,GACRG,IAAKF,EAAG,GACR3G,IAAKwG,EAAG,GACRtG,IAAKuG,EAAG,GACRK,IAAKJ,EAAG,GACRK,IAAKJ,EAAG,GACRK,MAASH,IAAKD,MAAS5G,IAAK8G,MAASC,IAAKD,MAAS/G,IAAK6G,IACxDK,KAAShH,IAAKF,MAASC,IAAK8G,MAAS5G,IAAKF,MAASD,IAAK6G,IACxDM,KAAUH,IAAKD,MAAS7G,IAAKF,MAAS8G,IAAKD,MAAS1G,IAAKF,IACzDmH,IAAKH,KAAOE,GACZE,IAAKH,IAAOC;AAElB,UAASA,MAAU,KAASF,OAAS,KAAWG,KAAM,KAASA,KAAM,KAASC,IAAK,KAASA,IAAK;AAIhG,eAAO;AAED,UAAOJ,OAAS,KAASE,MAAU,GAAM;AAK/C,iBAAUze,IAAI,GAAGA,IAAI,GAAGA;AAIvB,cAFA4e,EAAe5e,MAAM,IAAIie,IAAKC,GAAIH,GAAIC,CAAE,GAEnCH,EAAe,OAAOD,EAAyB,QAAS;AAE5D,kBAAMnR,IAAUzM,MAAM,IAAIie,IAAKC;AAC/B,mBAAO,EAAE,GAAGzR,EAAM,GAAG,GAAGA,EAAM,GAAG,GAAGoR,EAAe,EAAC;AAAA,UAErD,WAAYA,EAAe,OAAOD,EAAyB,SAAU;AAEpE,kBAAMxZ,IAAI,EAAMkT,IAAKuG,EAAe,KAAMrG,IAAKF,IAAO,YAAa,KAC7DjT,IAAI,EAAMkT,IAAKsG,EAAe,KAAMpG,IAAKF,IAAO,YAAa;AACnE,mBAAO,EAAE,GAAGnT,GAAG,GAAGC,GAAG,GAAGwZ,EAAe,EAAC;AAAA,UAEzC;AAID,eAAO;AAAA,MAER,OAAO;AAIN,iBAAU7d,IAAI,GAAGA,IAAI,GAAGA;AAIvB,cAFA4e,EAAe5e,MAAM,IAAIie,IAAKC,GAAIH,GAAIC,CAAE,GAEnCH,EAAe,OAAOD,EAAyB,QAAS;AAE5D,kBAAMnR,IAAUzM,MAAM,IAAIie,IAAKC;AAC/B,mBAAO,EAAE,GAAGzR,EAAM,GAAG,GAAGA,EAAM,GAAG,GAAGoR,EAAe,EAAC;AAAA,UAErD;AAID,cAAMzZ,IAAI,EAAMkT,IAAKoH,KAAOlH,IAAKF,IAAO,YAAa,KAC/CjT,IAAI,EAAMkT,IAAKmH,KAAOjH,IAAKF,IAAO,YAAa;AACrD,eAAO,EAAE,GAAGnT,GAAG,GAAGC,GAAG,GAAGqa,EAAE;AAAA,MAE3B;AAAA,IAED;AAEA,aAASE,EAAexc,GAAGyc,GAAWC,GAAU;AAE/C,YAAMC,IAAKD,EAAQ,IAAID,EAAU,GAC3BG,IAAKF,EAAQ,IAAID,EAAU,GAC3BI,IAAK7c,EAAE,IAAIyc,EAAU,GACrBK,IAAK9c,EAAE,IAAIyc,EAAU,GACrBM,IAAKJ,IAAKG,IAAKD,IAAKD;AAE1B,UAAO5c,EAAE,MAAMyc,EAAU,KAASzc,EAAE,MAAMyc,EAAU,GAAM;AAEzD,QAAAhB,EAAe,MAAMD,EAAyB,QAC9CC,EAAe,IAAI;AACnB;AAAA,MAED;AAEA,UAAOzb,EAAE,MAAM0c,EAAQ,KAAS1c,EAAE,MAAM0c,EAAQ,GAAM;AAErD,QAAAjB,EAAe,MAAMD,EAAyB,aAC9CC,EAAe,IAAI;AACnB;AAAA,MAED;AAEA,UAAKsB,IAAK,CAAE,OAAO,SAAU;AAE5B,QAAAtB,EAAe,MAAMD,EAAyB;AAC9C;AAAA,MAED;AAEA,UAAKuB,IAAK,OAAO,SAAU;AAE1B,QAAAtB,EAAe,MAAMD,EAAyB;AAC9C;AAAA,MAGD;AAEA,UAASmB,IAAKE,IAAO,KAAWD,IAAKE,IAAO,GAAM;AAEjD,QAAArB,EAAe,MAAMD,EAAyB;AAC9C;AAAA,MAED;AAEA,UAAO,KAAK,KAAMmB,IAAKA,IAAKC,IAAKA,CAAE,IAAS,KAAK,KAAMC,IAAKA,IAAKC,IAAKA,CAAE,GAAO;AAE9E,QAAArB,EAAe,MAAMD,EAAyB;AAC9C;AAAA,MAED;AAEA,UAAIje;AAEJ,MAAKof,MAAO,IAEXpf,IAAIsf,IAAKF,IAITpf,IAAIuf,IAAKF,GAIVnB,EAAe,MAAMD,EAAyB,SAC9CC,EAAe,IAAIle;AAAA,IAEpB;AAEA,aAASyf,EAAkBC,GAAOC,GAAQ;AAEzC,YAAMC,IAAmB,CAAA,GACnBC,IAAgB,CAAA;AAEtB,eAAUnf,IAAQ,GAAGA,IAAQgf,EAAM,QAAQhf,KAAW;AAErD,cAAMof,IAAiBJ,EAAOhf,IAAQ,CAAC,GACjCqf,IAAeL,EAAOhf,CAAK;AAEjC,iBAAUsf,IAAS,GAAGA,IAASL,EAAM,QAAQK,KAAY;AAExD,gBAAMC,IAAiBN,EAAOK,IAAS,CAAC,GAClCE,IAAeP,EAAOK,CAAM,GAE5BG,IAAehC,EAAsB2B,GAAgBC,GAAcE,GAAgBC,CAAY;AAErG,UAAKC,MAAiB,QAAQP,EAAiB,KAAM,CAAAvf,MAAKA,EAAE,KAAK8f,EAAa,IAAI,OAAO,WAAW9f,EAAE,KAAK8f,EAAa,IAAI,OAAO,OAAO,MAAO,WAEhJP,EAAiB,KAAMO,CAAY,GACnCN,EAAc,KAAM,IAAI3L,GAASiM,EAAa,GAAGA,EAAa,EAAG;AAAA,QAInE;AAAA,MAED;AAEA,aAAON;AAAA,IAER;AAEA,aAASO,EAA0BC,GAAUC,GAAaxM,GAAQ;AAEjE,YAAMyM,IAAS,IAAIrM,GAAO;AAC1B,MAAAoM,EAAY,UAAWC,CAAM;AAE7B,YAAMC,IAAmB,CAAA;AAEzB,aAAA1M,EAAM,QAAS,CAAA5S,MAAQ;AAKtB,QAAKA,EAAK,YAAY,cAAeqf,CAAM,KAEpBd,EAAkBY,GAAUnf,EAAK,MAAM,EAE/C,QAAS,CAAAuB,MAAK;AAE3B,UAAA+d,EAAiB,KAAM,EAAE,YAAYtf,EAAK,YAAY,MAAMA,EAAK,MAAM,OAAOuB,EAAC,CAAE;AAAA,QAElF,CAAC;AAAA,MAIH,CAAC,GAED+d,EAAiB,KAAM,CAAEC,GAAIC,MAErBD,EAAG,MAAM,IAAIC,EAAG,MAAM,CAE7B,GAEMF;AAAA,IAER;AAEA,aAASG,EAAUC,GAAYC,GAAUC,GAAcC,GAAcC,GAAY;AAEhF,OAAKA,KAAc,QAAmCA,MAAc,QAEnEA,IAAY;AAIb,YAAMC,IAAoB,IAAI/M,GAAO;AACrC,MAAA0M,EAAW,YAAY,UAAWK,CAAiB;AAEnD,YAAMZ,IAAW,CAAE,IAAInM,GAAS4M,GAAcG,EAAkB,CAAC,GAAI,IAAI/M,GAAS6M,GAAcE,EAAkB,CAAC,CAAE,GAE/GC,IAAwBd,EAA0BC,GAAUO,EAAW,aAAaC,CAAQ;AAElG,MAAAK,EAAsB,KAAM,CAAET,GAAIC,MAE1BD,EAAG,MAAM,IAAIC,EAAG,MAAM,CAE7B;AAED,YAAMS,IAAoB,CAAA,GACpBC,IAAqB,CAAA;AAE3B,MAAAF,EAAsB,QAAS,CAAA7gB,MAAK;AAEnC,QAAKA,EAAE,eAAeugB,EAAW,aAEhCO,EAAkB,KAAM9gB,CAAC,IAIzB+gB,EAAmB,KAAM/gB,CAAC;AAAA,MAI5B,CAAC;AAED,YAAMghB,IAAeF,EAAmB,CAAC,EAAG,MAAM,GAG5CG,IAAQ,CAAA;AACd,UAAIjhB,KAAI;AAER,aAAQA,KAAI+gB,EAAmB,UAAUA,EAAoB/gB,IAAI,MAAM,IAAIghB;AAE1E,QAAKC,EAAM,SAAS,KAAKA,EAAOA,EAAM,SAAS,OAAQF,EAAoB/gB,EAAC,EAAG,aAE9EihB,EAAM,IAAG,IAITA,EAAM,KAAMF,EAAoB/gB,EAAC,EAAG,UAAU,GAI/CA;AAMD,UAFAihB,EAAM,KAAMV,EAAW,UAAU,GAE5BI,MAAc,WAAY;AAE9B,cAAMO,IAASD,EAAM,SAAS,MAAM,GAC9BE,IAAYF,EAAOA,EAAM,SAAS,CAAC;AAEzC,eAAO,EAAE,YAAYV,EAAW,YAAY,QAAQW,GAAQ,KAAKC,EAAS;AAAA,MAE3E,WAAYR,MAAc,WAAY;AAGrC,YAAIO,IAAS,IACTC,IAAY,MACZC,IAAc;AAElB,iBAAUphB,IAAI,GAAGA,IAAIihB,EAAM,QAAQjhB,KAAO;AAEzC,gBAAMqhB,IAAaJ,EAAOjhB,CAAC;AAC3B,UAAKkhB,KAEJE,IAAcZ,EAAUa,CAAU,EAAG,MACrCH,IAAS,IACTC,IAAYE,KAEDD,MAAgBZ,EAAUa,CAAU,EAAG,SAElDD,IAAcZ,EAAUa,CAAU,EAAG,MACrCH,IAAS;AAAA,QAIX;AAEA,eAAO,EAAE,YAAYX,EAAW,YAAY,QAAQW,GAAQ,KAAKC,EAAS;AAAA,MAE3E;AAEC,gBAAQ,KAAM,iBAAiBR,IAAY,iCAAiC;AAAA,IAI9E;AASA,QAAIF,IAAe,WACfC,IAAe,YAEfY,IAAc3D,EAAU,SAAS,IAAK,CAAAvb,MAAK;AAE9C,YAAM1B,IAAS0B,EAAE,UAAS;AAC1B,UAAImf,IAAO,YACPC,IAAO,WACPC,IAAO,YACPC,IAAO;AAIX,eAAU1hB,IAAI,GAAGA,IAAIU,EAAO,QAAQV,KAAO;AAE1C,cAAMoC,IAAI1B,EAAQV,CAAC;AAEnB,QAAKoC,EAAE,IAAImf,MAEVA,IAAOnf,EAAE,IAILA,EAAE,IAAIof,MAEVA,IAAOpf,EAAE,IAILA,EAAE,IAAIqf,MAEVA,IAAOrf,EAAE,IAILA,EAAE,IAAIsf,MAEVA,IAAOtf,EAAE;AAAA,MAIX;AAGA,aAAKse,KAAgBe,MAEpBf,IAAee,IAAO,IAIlBhB,KAAgBiB,MAEpBjB,IAAeiB,IAAO,IAIhB,EAAE,QAAQtf,EAAE,QAAQ,QAAQ1B,GAAQ,MAAMihB,GAAW,YAAajhB,CAAM,GAAI,YAAY,IAAK,aAAa,IAAIkhB,GAAM,IAAI/N,GAAS6N,GAAMF,CAAI,GAAI,IAAI3N,GAAS4N,GAAMF,CAAI,CAAE,EAAE;AAAA,IAElL,CAAC;AAED,IAAAD,IAAcA,EAAY,OAAQ,CAAAO,MAAMA,EAAG,OAAO,SAAS,CAAC;AAE5D,aAAUR,IAAa,GAAGA,IAAaC,EAAY,QAAQD;AAE1D,MAAAC,EAAaD,GAAa,aAAaA;AAKxC,UAAMS,IAAUR,EAAY,IAAK,CAAAlf,MAAKke,EAAUle,GAAGkf,GAAab,GAAcC,GAAgB/C,EAAU,WAAWA,EAAU,SAAS,MAAM,WAAW,OAAa,GAG9JoE,IAAiB,CAAA;AACvB,WAAAT,EAAY,QAAS,CAAAlf,MAAK;AAIzB,UAAK,CAFY0f,EAAS1f,EAAE,UAAU,EAEtB,QAAS;AAExB,cAAM7G,IAAQ,IAAIymB,GAAK;AACvB,QAAAzmB,EAAM,SAAS6G,EAAE,QACH0f,EAAQ,OAAQ,CAAA/K,MAAKA,EAAE,UAAUA,EAAE,QAAQ3U,EAAE,UAAU,EAC/D,QAAS,CAAA2U,MAAK;AAEnB,gBAAM9V,IAAOqgB,EAAavK,EAAE,UAAU,GAChClW,IAAO,IAAIwW,GAAI;AACrB,UAAAxW,EAAK,SAASI,EAAK,QACnB1F,EAAM,MAAM,KAAMsF,CAAI;AAAA,QAEvB,CAAC,GACDkhB,EAAe,KAAMxmB,CAAK;AAAA,MAE3B;AAAA,IAED,CAAC,GAEMwmB;AAAA,EAER;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,eAAgBzgB,GAAOlI,GAAO6oB,GAAUC,GAASC,GAAa;AAEpE,WAAA7gB,IAAQA,MAAU,SAAYA,IAAQ,GACtClI,IAAQA,MAAU,SAAYA,IAAQ,QACtC6oB,IAAWA,MAAa,SAAYA,IAAW,SAC/CC,IAAUA,MAAY,SAAYA,IAAU,QAC5CC,IAAaA,MAAe,SAAYA,IAAa,GAE9C;AAAA,MACN,aAAa/oB;AAAA,MACb,aAAakI;AAAA,MACb,gBAAgB2gB;AAAA,MAChB,eAAeC;AAAA,MACf,kBAAkBC;AAAA,IACrB;AAAA,EAEC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,eAAgBzhB,GAAQ8R,GAAO4P,GAAcC,GAAc;AAEjE,UAAMC,IAAW,CAAA,GACXC,IAAU,CAAA,GACVC,IAAM,CAAA;AAEZ,QAAK3Q,GAAU,0BAA2BnR,GAAQ8R,GAAO4P,GAAcC,GAAaC,GAAUC,GAASC,CAAG,MAAO;AAEhH,aAAO;AAIR,UAAMngB,IAAW,IAAIogB,GAAc;AACnC,WAAApgB,EAAS,aAAc,YAAY,IAAIqgB,GAAwBJ,GAAU,EAAG,GAC5EjgB,EAAS,aAAc,UAAU,IAAIqgB,GAAwBH,GAAS,EAAG,GACzElgB,EAAS,aAAc,MAAM,IAAIqgB,GAAwBF,GAAK,EAAG,GAE1DngB;AAAA,EAER;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAO,0BAA2B3B,GAAQ8R,GAAO4P,GAAcC,GAAaC,GAAUC,GAASC,GAAKG,GAAe;AASlH,UAAMC,IAAW,IAAI/O,GAAO,GACtBgP,IAAW,IAAIhP,GAAO,GACtBiP,IAAW,IAAIjP,GAAO,GACtBkP,IAAW,IAAIlP,GAAO,GACtBmP,IAAW,IAAInP,GAAO,GACtBoP,IAAW,IAAIpP,GAAO,GACtBqP,IAAW,IAAIrP,GAAO,GACtBsP,IAAa,IAAItP,GAAO,GACxBuP,IAAa,IAAIvP,GAAO,GACxBwP,IAAU,IAAIxP,GAAO,GACrByP,IAAU,IAAIzP,GAAO,GACrB0P,IAAgB,IAAI1P,GAAO,GAC3B2P,IAAgB,IAAI3P,GAAO,GAC3B4P,IAAa,IAAI5P,GAAO,GACxB6P,IAAa,IAAI7P,GAAO,GACxB8P,IAAa,IAAI9P,GAAO,GACxB+P,IAAa,IAAI/P,GAAO;AAE9B,IAAAuO,IAAeA,MAAiB,SAAYA,IAAe,IAC3DC,IAAcA,MAAgB,SAAYA,IAAc,MACxDM,IAAeA,MAAiB,SAAYA,IAAe,GAG3DjiB,IAASmjB,EAAwBnjB,CAAM;AAEvC,UAAMojB,IAAYpjB,EAAO;AAEzB,QAAKojB,IAAY,EAAI,QAAO;AAE5B,UAAMC,KAAWrjB,EAAQ,CAAC,EAAG,OAAQA,EAAQojB,IAAY,EAAG;AAE5D,QAAIE,GACAC,IAAgBvjB,EAAQ,CAAC,GACzBwjB;AAEJ,UAAMC,IAAe3R,EAAM,cAAc,GAEnC4R,IAAS,KAAMN,IAAY;AACjC,QAAIO,IAAK,GAAGC,GAERC,GACAC,IACAC,IACAC,KAA0B,IAE1BC,KAAc,GACdC,IAAoBjC,IAAe,GACnCkC,IAAsBlC,IAAe;AAGzC,IAAAmC,EAAWpkB,EAAQ,CAAC,GAAIA,EAAQ,CAAC,GAAIkiB,CAAQ,EAAG,eAAgBuB,CAAY,GAC5EhB,EAAW,KAAMziB,EAAQ,CAAC,CAAE,EAAG,IAAKkiB,CAAQ,GAC5CQ,EAAW,KAAM1iB,EAAQ,CAAC,CAAE,EAAG,IAAKkiB,CAAQ,GAC5CS,EAAQ,KAAMF,CAAU,GACxBG,EAAQ,KAAMF,CAAU;AAExB,aAAU2B,IAAS,GAAGA,IAASjB,GAAWiB,KAAY;AAErD,MAAAf,IAAetjB,EAAQqkB,CAAM,GAGxBA,MAAWjB,IAAY,IAEtBC,KAGJG,IAAYxjB,EAAQ,CAAC,IAEfwjB,IAAY,SAInBA,IAAYxjB,EAAQqkB,IAAS,CAAC;AAK/B,YAAMC,IAAUpC;AAWhB,UAVAkC,EAAWb,GAAeD,GAAcgB,CAAO,GAE/ClC,EAAS,KAAMkC,GAAU,eAAgBb,CAAY,GACrDZ,EAAc,KAAMS,GAAe,IAAKlB,CAAQ,GAChDU,EAAc,KAAMQ,GAAe,IAAKlB,CAAQ,GAEhDwB,IAAKD,IAAKD,GAEVG,IAAoB,IAEfL,MAAc,QAAY;AAG9B,QAAAY,EAAWd,GAAcE,GAAWrB,CAAQ,GAE5CC,EAAS,KAAMD,GAAW,eAAgBsB,CAAY,GACtDV,EAAW,KAAMO,GAAe,IAAKlB,CAAQ,GAC7CY,EAAW,KAAMM,GAAe,IAAKlB,CAAQ,GAE7C0B,KAAmB,IACnB1B,EAAS,WAAYoB,GAAWD,CAAa,GACxCe,EAAQ,IAAKlC,CAAQ,IAAK,MAE9B0B,KAAmB,KAIfO,MAAW,MAAIL,KAA0BF,KAE9C1B,EAAS,WAAYoB,GAAWF,CAAY,GAC5ClB,EAAS,UAAS;AAClB,cAAMpM,IAAM,KAAK,IAAKsO,EAAQ,IAAKlC,EAAU;AAG7C,YAAKpM,IAAM,OAAO,SAAU;AAG3B,gBAAMuO,IAAYd,IAAezN;AACjC,UAAAoM,EAAS,eAAgB,CAAEmC,CAAS,GACpClC,EAAS,WAAYiB,GAAcC,CAAa,GAChDjB,EAAS,KAAMD,CAAQ,EAAG,UAAWkC,CAAS,EAAG,IAAKnC,CAAQ,GAC9Da,EAAW,KAAMX,CAAQ,EAAG,OAAM;AAClC,gBAAMkC,IAAelC,EAAS,OAAM,GAC9BmC,IAAoBpC,EAAS,OAAM;AACzC,UAAAA,EAAS,aAAcoC,CAAiB,GACxClC,EAAS,WAAYiB,GAAWF,CAAY;AAC5C,gBAAMoB,IAAoBnC,EAAS,OAAM;AAoCzC,kBAnCAA,EAAS,aAAcmC,CAAiB,GAEnCrC,EAAS,IAAKY,KAAewB,KAAqBlC,EAAS,IAAKU,CAAU,IAAKyB,MAEnFb,IAAoB,KAIrBX,EAAW,KAAMZ,GAAW,IAAKgB,CAAY,GAC7CL,EAAW,IAAKK,CAAY,GAE5BS,KAAU,IAELF,IAECC,MAEJd,EAAW,KAAMC,CAAU,GAC3BH,EAAc,KAAMG,CAAU,MAI9BF,EAAW,KAAME,CAAU,GAC3BJ,EAAc,KAAMI,CAAU,KAQ/B0B,EAAoB,GAIZ7S,EAAM,gBAAc;AAAA,YAE5B,KAAK;AAEJ,cAAA8S,EAA0Bd,IAAkBD,GAAmBD,CAAE;AAEjE;AAAA,YAED,KAAK;AAIJ,cAAAiB,EAAyCf,IAAkBD,CAAiB,GAIvEC,KAEJgB,EAAoBxB,GAAcT,GAAeE,GAAYa,GAAI,CAAC,IAIlEkB,EAAoBxB,GAAcN,GAAYF,GAAec,GAAI,CAAC;AAInE;AAAA,YAED,KAAK;AAAA,YACL,KAAK;AAAA,YACL;AAEC,oBAAMmB,KAAkBtB,IAAe3R,EAAM,mBAAqB0S;AAElE,kBAAKO,KAAgB;AAIpB,oBAAKjT,EAAM,mBAAmB,cAAe;AAE5C,kBAAA8S,EAA0Bd,IAAkBD,GAAmBD,CAAE;AACjE;AAAA,gBAED;AAIC,kBAAAiB,EAAyCf,IAAkBD,CAAiB,GAIvEC,MAEJvB,EAAS,WAAYW,GAAYL,CAAa,EAAG,eAAgBkC,EAAa,EAAG,IAAKlC,CAAa,GACnGL,EAAS,WAAYU,GAAYH,CAAU,EAAG,eAAgBgC,EAAa,EAAG,IAAKhC,CAAU,GAE7FiC,EAAWnC,GAAee,GAAI,CAAC,GAC/BoB,EAAWzC,GAAUqB,GAAI,CAAC,GAC1BoB,EAAW1B,GAAcM,GAAI,GAAG,GAEhCoB,EAAW1B,GAAcM,GAAI,GAAG,GAChCoB,EAAWzC,GAAUqB,GAAI,CAAC,GAC1BoB,EAAWxC,GAAUoB,GAAI,CAAC,GAE1BoB,EAAW1B,GAAcM,GAAI,GAAG,GAChCoB,EAAWxC,GAAUoB,GAAI,CAAC,GAC1BoB,EAAWjC,GAAYa,GAAI,CAAC,MAI5BrB,EAAS,WAAYW,GAAYJ,CAAa,EAAG,eAAgBiC,EAAa,EAAG,IAAKjC,CAAa,GACnGN,EAAS,WAAYU,GAAYF,CAAU,EAAG,eAAgB+B,EAAa,EAAG,IAAK/B,CAAU,GAE7FgC,EAAWlC,GAAec,GAAI,CAAC,GAC/BoB,EAAWzC,GAAUqB,GAAI,CAAC,GAC1BoB,EAAW1B,GAAcM,GAAI,GAAG,GAEhCoB,EAAW1B,GAAcM,GAAI,GAAG,GAChCoB,EAAWzC,GAAUqB,GAAI,CAAC,GAC1BoB,EAAWxC,GAAUoB,GAAI,CAAC,GAE1BoB,EAAW1B,GAAcM,GAAI,GAAG,GAChCoB,EAAWxC,GAAUoB,GAAI,CAAC,GAC1BoB,EAAWhC,GAAYY,GAAI,CAAC;AAAA;AAU9B,gBAAKC,KAICC,MAEJkB,EAAWtC,GAAYiB,GAAI,CAAC,GAC5BqB,EAAWvC,GAAYkB,GAAI,CAAC,GAC5BqB,EAAW9B,GAAYU,GAAI,CAAC,GAE5BoB,EAAWtC,GAAYiB,GAAI,CAAC,GAC5BqB,EAAW9B,GAAYU,GAAI,CAAC,GAC5BoB,EAAW/B,GAAYW,GAAI,CAAC,MAI5BoB,EAAWtC,GAAYiB,GAAI,CAAC,GAC5BqB,EAAWvC,GAAYkB,GAAI,CAAC,GAC5BqB,EAAW9B,GAAYU,GAAI,CAAC,GAE5BoB,EAAWvC,GAAYkB,GAAI,CAAC,GAC5BqB,EAAW/B,GAAYW,GAAI,CAAC,GAC5BoB,EAAW9B,GAAYU,GAAI,CAAC,IAKxBE,KAEJf,EAAW,KAAMG,CAAU,IAI3BF,EAAW,KAAME,CAAU,KASvBY,MAEJkB,EAAWnC,GAAee,GAAI,CAAC,GAC/BoB,EAAW9B,GAAYU,GAAI,CAAC,GAC5BoB,EAAW1B,GAAcM,GAAI,GAAG,GAEhCoB,EAAW1B,GAAcM,GAAI,GAAG,GAChCoB,EAAW9B,GAAYU,GAAI,CAAC,GAC5BoB,EAAWjC,GAAYa,GAAI,CAAC,MAI5BoB,EAAWlC,GAAec,GAAI,CAAC,GAC/BoB,EAAW9B,GAAYU,GAAI,CAAC,GAC5BoB,EAAW1B,GAAcM,GAAI,GAAG,GAEhCoB,EAAW1B,GAAcM,GAAI,GAAG,GAChCoB,EAAW9B,GAAYU,GAAI,CAAC,GAC5BoB,EAAWhC,GAAYY,GAAI,CAAC,IAM9BG,KAAU;AAIX;AAAA,UAEP;AAAA,QAEI;AAIC,UAAAY,EAAoB;AAAA,MAItB;AAIC,QAAAA,EAAoB;AAIrB,MAAK,CAAEtB,MAAYgB,MAAWjB,IAAY,KAGzC6B,EAAgBjlB,EAAQ,IAAK2iB,GAASC,GAASkB,IAAkB,IAAMH,CAAE,GAM1EA,IAAKC,GAELL,IAAgBD,GAEhBb,EAAW,KAAMM,CAAU,GAC3BL,EAAW,KAAMM,CAAU;AAAA,IAE5B;AAEA,QAAK,CAAEK;AAGN,MAAA4B,EAAgB3B,GAAcT,GAAeC,GAAegB,IAAkB,IAAOF,CAAE;AAAA,aAE5EC,KAAqBjC,GAAW;AAI3C,UAAIsD,IAAYhC,GACZiC,IAAYlC;AAEhB,MAAKe,OAA4BF,OAEhCoB,IAAYjC,GACZkC,IAAYjC,IAIRY,MAECC,MAAWC,QAEfmB,EAAU,QAASvD,GAAU,CAAK,GAClCuD,EAAU,QAASvD,GAAU,CAAK,GAE7BmC,MAEJmB,EAAU,QAAStD,GAAU,CAAK,MAQ/BmC,MAAW,CAAEC,QAEjBmB,EAAU,QAASvD,GAAU,CAAK,GAClCuD,EAAU,QAASvD,GAAU,CAAK,GAE7BmC,MAEJmB,EAAU,QAAStD,GAAU,CAAK;AAAA,IAQtC;AAEA,WAAOqC;AAMP,aAASG,EAAWgB,GAAIC,GAAIlN,GAAS;AAEpC,aAAAA,EAAO,WAAYkN,GAAID,CAAE,GAClBjN,EAAO,IAAK,CAAEA,EAAO,GAAGA,EAAO,CAAC,EAAG,UAAS;AAAA,IAEpD;AAEA,aAAS6M,EAAW3f,GAAUwT,GAAG/Y,GAAI;AAEpC,MAAK8hB,MAEJA,EAAUsC,KAAsB7e,EAAS,GACzCuc,EAAUsC,IAAoB,CAAC,IAAK7e,EAAS,GAC7Cuc,EAAUsC,IAAoB,CAAC,IAAK,GAE/BrC,MAEJA,EAASqC,CAAiB,IAAK,GAC/BrC,EAASqC,IAAoB,CAAC,IAAK,GACnCrC,EAASqC,IAAoB,CAAC,IAAK,IAIpCA,KAAqB,GAEhBpC,MAEJA,EAAKqC,CAAmB,IAAKtL,GAC7BiJ,EAAKqC,IAAsB,CAAC,IAAKrkB,GAEjCqkB,KAAuB,KAMzBF,MAAe;AAAA,IAEhB;AAEA,aAASa,EAAoBtF,GAAQ4F,GAAIC,GAAIxM,GAAG/Y,GAAI;AAKnD,MAAAoiB,EAAS,KAAMkD,CAAE,EAAG,IAAK5F,CAAM,EAAG,UAAS,GAC3C2C,EAAS,KAAMkD,CAAE,EAAG,IAAK7F,CAAM,EAAG,UAAS;AAE3C,UAAI9F,IAAQ,KAAK;AACjB,YAAM1D,IAAMkM,EAAS,IAAKC,CAAQ;AAClC,MAAK,KAAK,IAAKnM,CAAG,IAAK,MAAI0D,IAAQ,KAAK,IAAK,KAAK,KAAM1D,CAAG,CAAE,IAE7D0D,KAASgI,GAETU,EAAS,KAAMgD,CAAE;AAEjB,eAAU9lB,KAAI,GAAGgmB,KAAK5D,IAAe,GAAGpiB,KAAIgmB,IAAIhmB;AAE/C,QAAA+iB,EAAS,KAAMD,CAAQ,EAAG,aAAc5C,GAAQ9F,CAAK,GAErDsL,EAAW5C,GAAUvJ,GAAG/Y,CAAC,GACzBklB,EAAW3C,GAAUxJ,GAAG/Y,CAAC,GACzBklB,EAAWxF,GAAQ3G,GAAG,GAAG,GAEzBuJ,EAAS,KAAMC,CAAQ;AAIxB,MAAA2C,EAAW3C,GAAUxJ,GAAG/Y,CAAC,GACzBklB,EAAWK,GAAIxM,GAAG/Y,CAAC,GACnBklB,EAAWxF,GAAQ3G,GAAG,GAAG;AAAA,IAE1B;AAEA,aAAS8L,IAAuB;AAE/B,MAAAK,EAAWtC,GAAYiB,GAAI,CAAC,GAC5BqB,EAAWvC,GAAYkB,GAAI,CAAC,GAC5BqB,EAAWnC,GAAee,GAAI,CAAC,GAE/BoB,EAAWtC,GAAYiB,GAAI,CAAC,GAC5BqB,EAAWnC,GAAee,GAAI,CAAC,GAC/BoB,EAAWlC,GAAec,GAAI,CAAC;AAAA,IAEhC;AAEA,aAASgB,EAA0Bd,GAAkBD,GAAmBhL,GAAI;AAE3E,MAAKgL,IAICC,KAIJkB,EAAWtC,GAAYiB,GAAI,CAAC,GAC5BqB,EAAWvC,GAAYkB,GAAI,CAAC,GAC5BqB,EAAWnC,GAAee,GAAI,CAAC,GAE/BoB,EAAWtC,GAAYiB,GAAI,CAAC,GAC5BqB,EAAWnC,GAAee,GAAI,CAAC,GAC/BoB,EAAW/B,GAAYW,GAAI,CAAC,GAI5BoB,EAAWnC,GAAehK,GAAG,CAAC,GAC9BmM,EAAWjC,GAAYlK,GAAG,CAAC,GAC3BmM,EAAW/B,GAAYpK,GAAG,GAAG,MAM7BmM,EAAWtC,GAAYiB,GAAI,CAAC,GAC5BqB,EAAWvC,GAAYkB,GAAI,CAAC,GAC5BqB,EAAWlC,GAAec,GAAI,CAAC,GAE/BoB,EAAWvC,GAAYkB,GAAI,CAAC,GAC5BqB,EAAW/B,GAAYW,GAAI,CAAC,GAC5BoB,EAAWlC,GAAec,GAAI,CAAC,GAI/BoB,EAAWlC,GAAejK,GAAG,CAAC,GAC9BmM,EAAW/B,GAAYpK,GAAG,CAAC,GAC3BmM,EAAWhC,GAAYnK,GAAG,CAAC,KAQvBiL,KAEJkB,EAAWnC,GAAehK,GAAG,CAAC,GAC9BmM,EAAWjC,GAAYlK,GAAG,CAAC,GAC3BmM,EAAW1B,GAAczK,GAAG,GAAG,MAI/BmM,EAAWlC,GAAejK,GAAG,CAAC,GAC9BmM,EAAWhC,GAAYnK,GAAG,CAAC,GAC3BmM,EAAW1B,GAAczK,GAAG,GAAG;AAAA,IAMlC;AAEA,aAASgM,EAAyCf,GAAkBD,GAAoB;AAEvF,MAAKA,MAECC,KAEJkB,EAAWtC,GAAYiB,GAAI,CAAC,GAC5BqB,EAAWvC,GAAYkB,GAAI,CAAC,GAC5BqB,EAAWnC,GAAee,GAAI,CAAC,GAE/BoB,EAAWtC,GAAYiB,GAAI,CAAC,GAC5BqB,EAAWnC,GAAee,GAAI,CAAC,GAC/BoB,EAAW/B,GAAYW,GAAI,CAAC,GAE5BoB,EAAWnC,GAAec,GAAI,CAAC,GAC/BqB,EAAW1B,GAAcM,GAAI,GAAG,GAChCoB,EAAW/B,GAAYW,GAAI,CAAC,GAE5BoB,EAAW1B,GAAcM,GAAI,GAAG,GAChCoB,EAAWjC,GAAYY,GAAI,CAAC,GAC5BqB,EAAW/B,GAAYW,GAAI,CAAC,MAI5BoB,EAAWtC,GAAYiB,GAAI,CAAC,GAC5BqB,EAAWvC,GAAYkB,GAAI,CAAC,GAC5BqB,EAAWlC,GAAec,GAAI,CAAC,GAE/BoB,EAAWvC,GAAYkB,GAAI,CAAC,GAC5BqB,EAAW/B,GAAYW,GAAI,CAAC,GAC5BoB,EAAWlC,GAAec,GAAI,CAAC,GAE/BoB,EAAWlC,GAAea,GAAI,CAAC,GAC/BqB,EAAW/B,GAAYW,GAAI,CAAC,GAC5BoB,EAAW1B,GAAcM,GAAI,GAAG,GAEhCoB,EAAW1B,GAAcM,GAAI,GAAG,GAChCoB,EAAW/B,GAAYW,GAAI,CAAC,GAC5BoB,EAAWhC,GAAYW,GAAI,CAAC;AAAA,IAM/B;AAEA,aAASsB,EAAgBzF,GAAQ4F,GAAIC,GAAIvB,GAAkB3P,GAAO0E,GAAI;AAKrE,cAAS/G,EAAM,eAAa;AAAA,QAE3B,KAAK;AAEJ,UAAKqC,IAEJ2Q,EAAoBtF,GAAQ6F,GAAID,GAAIvM,GAAG,GAAG,IAI1CiM,EAAoBtF,GAAQ4F,GAAIC,GAAIxM,GAAG,GAAG;AAI3C;AAAA,QAED,KAAK;AAEJ,cAAK1E;AAEJ,YAAA+N,EAAS,WAAYkD,GAAI5F,CAAM,GAC/B2C,EAAS,IAAKD,EAAS,GAAG,CAAEA,EAAS,CAAC,GAEtCE,EAAS,WAAYF,GAAUC,CAAQ,EAAG,IAAK3C,CAAM,GACrD6C,EAAS,WAAYF,GAAUD,CAAQ,EAAG,IAAK1C,CAAM,GAGhDsE,KAEJ1B,EAAS,QAASR,GAAU,CAAK,GACjCS,EAAS,QAAST,GAAU,CAAK,GACjCS,EAAS,QAAST,GAAU,CAAK,MAIjCQ,EAAS,QAASR,GAAU,CAAK,GAEjCE,EAAK,CAAS,MAAO,IAAIO,EAAS,QAAST,GAAU,CAAK,IAAKQ,EAAS,QAASR,GAAU,CAAK,GAChGS,EAAS,QAAST,GAAU,CAAK;AAAA,eAI5B;AAEN,YAAAM,EAAS,WAAYmD,GAAI7F,CAAM,GAC/B2C,EAAS,IAAKD,EAAS,GAAG,CAAEA,EAAS,CAAC,GAEtCE,EAAS,WAAYF,GAAUC,CAAQ,EAAG,IAAK3C,CAAM,GACrD6C,EAAS,WAAYF,GAAUD,CAAQ,EAAG,IAAK1C,CAAM;AAErD,kBAAM+F,IAAK3D,EAAS;AAGpB,YAAKkC,KAEJ1B,EAAS,QAASR,GAAU2D,IAAK,CAAK,GACtClD,EAAS,QAAST,GAAU2D,IAAK,CAAK,GACtClD,EAAS,QAAST,GAAU2D,IAAK,EAAK,MAItClD,EAAS,QAAST,GAAU2D,IAAK,CAAK,GACtCnD,EAAS,QAASR,GAAU2D,IAAK,CAAK,GACtClD,EAAS,QAAST,GAAU2D,IAAK,EAAK;AAAA,UAIxC;AAEA;AAAA,MAQL;AAAA,IAEE;AAEA,aAASpC,EAAwBnjB,GAAS;AAKzC,UAAIwlB,IAAY;AAChB,eAAUlmB,IAAI,GAAGsZ,IAAI5Y,EAAO,SAAS,GAAGV,IAAIsZ,GAAGtZ;AAE9C,YAAKU,EAAQV,CAAC,EAAG,WAAYU,EAAQV,IAAI,EAAG,IAAKqiB,GAAc;AAE9D,UAAA6D,IAAY;AACZ;AAAA,QAED;AAID,UAAK,CAAEA,EAAY,QAAOxlB;AAE1B,YAAMylB,IAAY,CAAA;AAClB,MAAAA,EAAU,KAAMzlB,EAAQ,EAAG;AAE3B,eAAUV,IAAI,GAAGsZ,IAAI5Y,EAAO,SAAS,GAAGV,IAAIsZ,GAAGtZ;AAE9C,QAAKU,EAAQV,CAAC,EAAG,WAAYU,EAAQV,IAAI,EAAG,KAAMqiB,KAEjD8D,EAAU,KAAMzlB,EAAQV,EAAG;AAM7B,aAAAmmB,EAAU,KAAMzlB,EAAQA,EAAO,SAAS,CAAC,CAAE,GAEpCylB;AAAA,IAER;AAAA,EAED;AAGD;AC7qGA,MAAMC,KAAS;AAEf,SAASC,GAAqB9T,GAA+C;AAC3E,MAAI,CAACA,KAAQA,EAAK,aAAa,EAAG;AAClC,MAAI/F,IAA0B+F;AAC9B,SAAO/F,KAAS;AACd,UAAMxT,IAAKwT,EAAQ,aAAa,IAAI;AACpC,QAAIxT,EAAI,QAAOA;AACf,IAAAwT,IAAUA,EAAQ;AAAA,EACpB;AAEF;AAEA,SAAS8Z,GAAsB/T,GAAoC;AACjE,MAAI,CAACA,EAAM,QAAO;AAClB,MAAI/F,IAA0B+F;AAC9B,SAAO/F,KAAS;AACd,UAAMxT,IAAKwT,EAAQ,aAAa,IAAI,KAAK,IACnC+Z,IAAW/Z,EAAQ,aAAa,WAAW,KAAK;AAEtD,QADIga,GAAwBxtB,CAAE,KAAKwtB,GAAwBD,CAAQ,KAC/DE,GAAmBztB,CAAE,KAAKytB,GAAmBF,CAAQ,EAAG,QAAO;AACnE,IAAA/Z,IAAUA,EAAQ;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAASka,GAAgBnU,GAAoC;AAC3D,MAAI,CAACA,EAAM,QAAO;AAClB,MAAI/F,IAA0B+F;AAC9B,SAAO/F,KAAS;AACd,UAAMxT,IAAKwT,EAAQ,aAAa,IAAI,KAAK,IACnC+Z,IAAW/Z,EAAQ,aAAa,WAAW,KAAK;AACtD,QAAIma,GAAmB3tB,CAAE,KAAK2tB,GAAmBJ,CAAQ,EAAG,QAAO;AACnE,IAAA/Z,IAAUA,EAAQ;AAAA,EACpB;AACA,SAAO;AACT;AA4BO,SAASoa,GAAe;AAAA,EAC7B,KAAAje;AAAA,EACA,aAAAke;AAAA,EACA,eAAArgB;AAAA,EACA,MAAAN,IAAO;AAAA,EACP,OAAAV;AACF,GAAwB;AACtB,QAAM,CAACqT,GAAQiO,CAAS,IAAI3oB,GAA2B,IAAI;AAE3D,EAAAqB,GAAU,MAAM;AACd,QAAIunB,IAAY;AAChB,UAAM5b,IAAa,IAAI,gBAAA,GACjB6b,IAAW3b,GAAgB1C,GAAKnC,CAAa;AACnD,iBAAMwgB,GAAU,EAAE,QAAQ7b,EAAW,QAAQ,EAC1C,KAAK,CAAC8b,MAAQ;AACb,UAAI,CAACA,EAAI,GAAI,OAAM,IAAI,MAAM,aAAaA,EAAI,MAAM,EAAE;AACtD,aAAOA,EAAI,KAAA;AAAA,IACb,CAAC,EACA,KAAK,CAACjgB,MAAS;AACd,UAAI+f,EAAW;AACf,YAAMG,IAAUC,GAAgBngB,CAAI,GAC9BoL,IAAS,IAAIP,GAAA;AACnB,MAAAiV,EAAU1U,EAAO,MAAM8U,CAAO,CAAC;AAAA,IACjC,CAAC,EACA,MAAM,CAACE,MAAQ;AACd,MAAIL,KACAK,aAAe,gBAAgBA,EAAI,SAAS,iBAChDN,EAAU,IAAI,GAEd,QAAQ;AAAA,QACN,+CAA+CE,CAAQ;AAAA,QAEvDI;AAAA,MAAA;AAAA,IAEJ,CAAC,GACI,MAAM;AACX,MAAAL,IAAY,IACZ5b,EAAW,MAAA;AAAA,IACb;AAAA,EACF,GAAG,CAACxC,GAAKnC,CAAa,CAAC;AAEvB,QAAMgB,IAAS5I,GAAQ,MAAM;;AAC3B,QAAI,CAACia,EAAQ,QAAO,CAAA;AACpB,UAAMwO,IAAsB,CAAA;AAC5B,QAAI7c,IAAM;AACV,eAAW3J,KAAQgY,EAAO,OAAO;AAC/B,YAAMtG,KAAOtZ,IAAA4H,EAAK,aAAL,gBAAA5H,EAAe,MACtBquB,IAAYjB,GAAqB9T,CAAI;AAgB3C,UAfI+U,KAAA,QAAAA,EAAW,cAAc,WAAW,iBACpCA,MAAcC,GAAiBD,CAAS,KAAKX,GAAmBW,CAAS,MAGzE/U,KAAQmU,GAAgBnU,CAAI,KAC5B+U,MAAaT,KAAA,QAAAA,EAAa,IAAIS,OAC9BhB,GAAsB/T,CAAI,KAAK,CAAC+U,KAEhCA,MAAcd,GAAwBc,CAAS,KAAKb,GAAmBa,CAAS,MAGhF/U,KAAQ+T,GAAsB/T,CAAI,KAAK+U,MAAaT,KAAA,QAAAA,EAAa,IAAIS,OAIrE/U,KAAQ+T,GAAsB/T,CAAI,EAAG;AAEzC,YAAMiV,IAAS3V,GAAU,aAAahR,CAAI;AAC1C,UAAI2mB,EAAO,WAAW,EAAG;AAEzB,YAAMC,IAAa9f,GAAkB2f,GAAW9hB,CAAK,GAC/CkiB,IAAcC,GAAiBL,CAAS,IAC1CM,GAAiBpiB,CAAK,IACtB,MACE0E,IAAkBC,GAAmBsd,KAAA,gBAAAA,EAAY,IAAI,GACrDI,IAAoB1d,GAAmBsd,KAAA,gBAAAA,EAAY,MAAM,GACzDruB,IAAQ,IAAIuH,GAAM,MAAA;AACxB,MAAI8mB,KAAA,QAAAA,EAAY,QAAQ,CAACvd,IACvB9Q,EAAM,IAAIquB,EAAW,IAAI,IAChBC,IACTtuB,EAAM,IAAIsuB,CAAW,IACZ7mB,EAAK,SAAS,CAACqJ,IACxB9Q,EAAM,KAAKyH,EAAK,KAAK,IAErBzH,EAAM,IAAI,SAAS,GAEjBquB,KAAA,QAAAA,EAAY,UAAU,CAACA,EAAW,QAAQ,CAACI,KAC7CzuB,EAAM,IAAIquB,EAAW,MAAM;AAG7B,YAAMrd,IACJF,KAAoB2d,KAAqB,EAACJ,KAAA,QAAAA,EAAY,QAClD,IACA,SAAOK,KAAA7sB,IAAA4F,EAAK,aAAL,gBAAA5F,EAAe,UAAf,gBAAA6sB,EAAsB,YAAY,WACvCjnB,EAAK,SAAS,MAAM,UACpB,GACF+E,IACJM,MAAQuhB,KAAA,gBAAAA,EAAY,kBAAiB,OAAOA,EAAW,gBAAgB;AAEzE,MAAAJ,EAAI,KAAK;AAAA,QACP,KAAK,GAAGC,KAAa,MAAM,IAAI9c,GAAK;AAAA,QACpC,WAAA8c;AAAA,QACA,QAAAE;AAAA,QACA,OAAApuB;AAAA,QACA,SAAAgR;AAAA,QACA,SAAAxE;AAAA,QACA,aAAa;AAAA,MAAA,CACd;AAAA,IACH;AAGA,WAAOmiB,GAA2BV,GAAK,CAAC/W,MAASA,EAAK,SAAS,EAAE;AAAA,MAC/D,CAACA,GAAM0X,OAAiB,EAAE,GAAG1X,GAAM,aAAA0X,EAAA;AAAA,IAAY;AAAA,EAEnD,GAAG,CAACnP,GAAQgO,GAAa3gB,GAAMV,CAAK,CAAC;AAErC,SAAI,CAACqT,KAAUrR,EAAO,WAAW,IAAU,OAGzC,gBAAA1P,EAAC,SAAA,EAAM,UAAU,CAAC,GAAG,GAAGsuB,EAAM,GAAG,aAAa,KAC3C,UAAA5e,EAAO;AAAA,IAAI,CAACkT,MACXA,EAAE,OAAO,IAAI,CAACnf,GAAO0sB,MACnB,gBAAApwB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,aAAa6iB,EAAE;AAAA,QACf,SAAS,MAAM;AAAA,QAAC;AAAA,QAEf,UAAA;AAAA,UAAAA,EAAE,UAAU,IACX,gBAAA5iB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM,CAACyD,GAAO,EAAE,OAAOmf,EAAE,SAAS,cAAc,GAAA,CAAO;AAAA,YAAA;AAAA,UAAA,IAGzD,gBAAA5iB,EAAC,iBAAA,EAAc,MAAM,CAACyD,CAAK,EAAA,CAAG;AAAA,UAEhC,gBAAAzD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO4iB,EAAE;AAAA,cACT,aAAaA,EAAE,UAAU;AAAA,cACzB,SAASA,EAAE;AAAA,cACX,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,MAAM/Z,GAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QACd;AAAA,MAAA;AAAA,MAlBK,GAAG+Z,EAAE,GAAG,IAAIuN,CAAE;AAAA,IAAA,CAoBtB;AAAA,EAAA,GAEL;AAEJ;ACjNO,MAAMC,KAA6C,CAAC,GAAG,IAAI,CAAC;AAQ5D,SAASC,GAAmBC,GAAkC;AACnE,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,MAAM,CAACA,EAAO;AAAA,IACd,MAAM,CAACA,EAAO;AAAA,IACd,IAAI,CAACA,EAAO;AAAA,EAAA;AAEhB;AAMO,SAASC,GACdC,GACAC,GACAC,GACA9Z,GACQ;AACR,QAAM+Z,IAAQ,KAAK,IAAIH,GAAW,CAAC,IAAI,KAAK,IAAIE,GAAY,CAAC,GACvDE,IAAQ,KAAK,IAAIH,GAAY,CAAC,IAAI,KAAK,IAAI7Z,GAAa,CAAC;AAC/D,SAAO,KAAK,IAAI+Z,GAAOC,CAAK;AAC9B;AAEO,SAASC,GAAaP,GAAwD;AACnF,SAAO;AAAA,IACL,OAAO,KAAK,IAAIA,EAAO,OAAOA,EAAO,MAAM,CAAC;AAAA,IAC5C,QAAQ,KAAK,IAAIA,EAAO,OAAOA,EAAO,MAAM,CAAC;AAAA,EAAA;AAEjD;AAEO,MAAMQ,KAAsB,KAMtBC,KAAuB,KAGvBC,KAAuB,GAKvBC,KAAsB,GAEtBC,KAAqB,KAKrBC,KAAyB,IAKzBC,KAAmB,IAKnBC,KAA0B,GAK1BC,KAAgC,IAEhCC,KAA2B;AAGjC,SAASC,GACdhoB,GACAoB,GACA6mB,IAAeT,IACfU,IAAcP,IACdQ,IAAeV,IACfW,IAAcV,IACN;AACR,QAAMW,IAAS,KAAK,IAAIroB,GAAOoB,CAAM;AACrC,MAAIinB,KAAUH,EAAa,QAAOD;AAClC,QAAM1mB,IAAO,KAAK,IAAI6mB,IAAcF,GAAa,CAAC,GAC5C7pB,IAAI,KAAK,IAAI,IAAIgqB,IAASH,KAAe3mB,CAAI;AACnD,SAAO0mB,KAAgBE,IAAeF,KAAgB5pB;AACxD;AAMO,SAASiqB,GACdxB,GACAmB,IAAeT,IACfe,IAAYX,IACC;AACb,QAAMY,IAAO1B,EAAO,OAAOA,EAAO,MAC5B2B,IAAO3B,EAAO,OAAOA,EAAO,MAC5B9mB,IAAQ,KAAK,IAAIwoB,GAAMD,CAAS,GAChCnnB,IAAS,KAAK,IAAIqnB,GAAMF,CAAS,GACjCpoB,IAAM6nB,GAAkBQ,GAAMC,GAAMR,CAAY,GAChDS,KAAS1oB,IAAQA,IAAQG,KAAO,GAChCwoB,KAASvnB,IAASA,IAASjB,KAAO;AACxC,SAAO;AAAA,IACL,MAAM2mB,EAAO,KAAK4B;AAAA,IAClB,MAAM5B,EAAO,KAAK6B;AAAA,IAClB,MAAM7B,EAAO,KAAK4B;AAAA,IAClB,MAAM5B,EAAO,KAAK6B;AAAA,IAClB,IAAI7B,EAAO;AAAA,IACX,IAAIA,EAAO;AAAA,IACX,MAAM,KAAK,IAAI4B,GAAOC,CAAK,IAAI;AAAA,EAAA;AAEnC;AAMO,SAASC,GACdC,GACAC,GACAC,IAAkBlB,IAClBmB,IAAgBlB,IACR;AACR,QAAMO,IAAS,KAAK,IAAIQ,GAAaC,CAAY,GAC3CG,IAAetB,MAA0B,IAAIH;AACnD,MAAIa,KAAUY,EAAc,QAAOF;AACnC,QAAMG,IAAYtB,MAAoB,IAAIJ;AAC1C,MAAIa,KAAUa,EAAW,QAAOF;AAChC,QAAMznB,IAAO,KAAK,IAAI0nB,IAAeC,GAAW,CAAC,GAC3C7qB,KAAKgqB,IAASa,KAAa3nB;AACjC,SAAOynB,KAAiBD,IAAkBC,KAAiB3qB;AAC7D;AAEO,SAAS8qB,GACdC,GACAC,GACAC,IAAczB,IACN;AACR,QAAM0B,IAAM,KAAK,IAAIF,GAAY,IAAK,IAAIC;AAC1C,SAAO,KAAK,IAAIF,GAAcG,CAAG;AACnC;AAQO,SAASC,GAAkBC,GAAmC;AACnE,QAAM9uB,IAAM,CAAC,GAAG,IAAI,IAAI8uB,EAAS,OAAO,CAAC/xB,MAAO,OAAO,SAASA,CAAE,CAAC,CAAC,CAAC,EAAE;AAAA,IACrE,CAAC2T,GAAGC,MAAMD,IAAIC;AAAA,EAAA;AAEhB,SAAO3Q,EAAI,SAAS,IAAIA,EAAI,KAAK,GAAG,IAAI;AAC1C;AAGO,SAAS+uB,GACdt0B,GACAq0B,GACoB;AACpB,QAAME,IAAS,IAAI,IAAIF,CAAQ;AAC/B,MAAIE,EAAO,SAAS,EAAG,QAAO;AAC9B,MAAIC,IAA+B;AACnC,aAAW7zB,KAASX;AAClB,eAAW6E,KAASlE,EAAM,QAAQ;AAChC,UAAI,CAAC4zB,EAAO,IAAI1vB,EAAM,EAAE,EAAG;AAC3B,YAAMyD,IAAOmsB,GAAoB5vB,EAAM,MAAMlE,EAAM,SAAS;AAC5D,MAAA6zB,IAAWA,IAAWE,GAAaF,GAAUlsB,CAAI,IAAIA;AAAA,IACvD;AAEF,SAAOksB,IAAW/C,GAAmByB,GAAkBsB,CAAQ,CAAC,IAAI;AACtE;AAGO,SAASG,GACd30B,GACAmE,GACoB;AACpB,SAAOmwB,GAAyBt0B,GAAQ,CAACmE,CAAO,CAAC;AACnD;AAQO,SAASywB,GACd50B,GACAmV,GACA/Q,GACoB;AACpB,MAAIA,KAAW,KAAM,QAAO;AAC5B,QAAMzD,IAAQX,EAAO,KAAK,CAAC6B,MAASA,EAAK,OAAOuC,CAAO;AACvD,MAAI,CAACzD,EAAO,QAAO;AACnB,QAAMk0B,IAAc1f,EAAM,OACvB,OAAO,CAACY,MAAUA,EAAM,YAAY3R,CAAO,EAC3C,IAAI,CAAC2R,MAAU+e,GAAoB/e,GAAOpV,EAAM,SAAS,CAAC;AAE7D,MAAI+wB,IAA6B;AACjC,MAAImD,EAAY,UAAU,GAAG;AAC3B,UAAM7J,IAAO,KAAK,IAAI,GAAG6J,EAAY,IAAI,CAAC9e,MAAUA,EAAM,CAAC,CAAC,GACtD+U,IAAO,KAAK,IAAI,GAAG+J,EAAY,IAAI,CAAC9e,MAAUA,EAAM,CAAC,CAAC,GACtDgV,IAAO,KAAK,IAAI,GAAG8J,EAAY,IAAI,CAAC9e,MAAUA,EAAM,CAAC,CAAC,GACtD8U,IAAO,KAAK,IAAI,GAAGgK,EAAY,IAAI,CAAC9e,MAAUA,EAAM,CAAC,CAAC;AAC5D,IAAA2b,IAAS;AAAA,MACP,MAAA1G;AAAA,MACA,MAAAF;AAAA,MACA,MAAAC;AAAA,MACA,MAAAF;AAAA,MACA,KAAKG,IAAOD,KAAQ;AAAA,MACpB,KAAKD,IAAOD,KAAQ;AAAA,MACpB,MAAM,KAAK,IAAIE,IAAOC,GAAMH,IAAOC,GAAM,CAAC;AAAA,IAAA;AAAA,EAE9C,WAAW+J,EAAY,WAAW,GAAG;AACnC,UAAM9e,IAAQ8e,EAAY,CAAC;AAC3B,IAAAnD,IAAS;AAAA,MACP,MAAM3b,EAAM;AAAA,MACZ,MAAMA,EAAM;AAAA,MACZ,MAAMA,EAAM;AAAA,MACZ,MAAMA,EAAM;AAAA,MACZ,IAAIA,EAAM;AAAA,MACV,IAAIA,EAAM;AAAA,MACV,MAAM;AAAA,IAAA;AAAA,EAEV;AAEA,QAAMgf,IAAc,IAAI;AAAA,IACtB,CAAC5f,EAAM,UAAU,CAAC,GAAGA,EAAM,UAAU,GAAG,EAAE,CAAC,EAAE;AAAA,MAC3C,CAAC7S,MAAqBA,KAAM;AAAA,IAAA;AAAA,EAC9B,GAEI0yB,IAAiB,IAAI,IAAI7f,EAAM,SAAS,GACxC8f,wBAAoB,IAAA;AAC1B,aAAWzwB,KAAU7D,EAAM;AACzB,IAAI,CAACq0B,EAAe,IAAIxwB,EAAO,EAAE,KAAKA,EAAO,WAAW,SACpDuwB,EAAY,IAAIvwB,EAAO,EAAE,KAAKA,EAAO,SAAS,gBAChDywB,EAAc,IAAIzwB,EAAO,OAAO;AAGpC,aAAWK,KAASlE,EAAM,QAAQ;AAChC,QAAI,CAACs0B,EAAc,IAAIpwB,EAAM,EAAE,EAAG;AAClC,UAAMqwB,IAAcT,GAAoB5vB,EAAM,MAAMlE,EAAM,SAAS;AACnE,IAAA+wB,IAASA,IAASgD,GAAahD,GAAQwD,CAAW,IAAIA;AAAA,EACxD;AAEA,SAAKxD,IACED,GAAmByB,GAAkBxB,GAAQ,KAAK,CAAC,CAAC,IADvC;AAEtB;AAEO,SAASyD,GAAalsB,GAAmB;AAE9C,SAAO,KAAK,IADF,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAC,CAAC,MACd;AACxB;AAQO,SAASmsB,GAAKnf,GAAWC,GAAWjN,GAAmB;AAC5D,SAAOgN,KAAKC,IAAID,KAAKhN;AACvB;AASO,SAASosB,GACdzxB,GACAC,GACAoF,GACAqsB,IAA8BH,IAClB;AACZ,QAAMnsB,IAAIssB,EAAKrsB,CAAC;AAChB,SAAO;AAAA,IACL,MAAMmsB,GAAKxxB,EAAK,MAAMC,EAAG,MAAMmF,CAAC;AAAA,IAChC,UAAU;AAAA,MACRosB,GAAKxxB,EAAK,SAAS,CAAC,GAAGC,EAAG,SAAS,CAAC,GAAGmF,CAAC;AAAA,MACxCosB,GAAKxxB,EAAK,SAAS,CAAC,GAAGC,EAAG,SAAS,CAAC,GAAGmF,CAAC;AAAA,MACxCosB,GAAKxxB,EAAK,SAAS,CAAC,GAAGC,EAAG,SAAS,CAAC,GAAGmF,CAAC;AAAA,IAAA;AAAA,IAE1C,QAAQ;AAAA,MACNosB,GAAKxxB,EAAK,OAAO,CAAC,GAAGC,EAAG,OAAO,CAAC,GAAGmF,CAAC;AAAA,MACpCosB,GAAKxxB,EAAK,OAAO,CAAC,GAAGC,EAAG,OAAO,CAAC,GAAGmF,CAAC;AAAA,MACpCosB,GAAKxxB,EAAK,OAAO,CAAC,GAAGC,EAAG,OAAO,CAAC,GAAGmF,CAAC;AAAA,IAAA;AAAA,EACtC;AAEJ;AAEO,SAASusB,GACdtf,GACAC,GACAsf,IAAU,MACD;AACT,SACE,KAAK,IAAIvf,EAAE,OAAOC,EAAE,IAAI,IAAIsf,KAC5B,KAAK,IAAIvf,EAAE,SAAS,CAAC,IAAIC,EAAE,SAAS,CAAC,CAAC,IAAIsf,KAC1C,KAAK,IAAIvf,EAAE,SAAS,CAAC,IAAIC,EAAE,SAAS,CAAC,CAAC,IAAIsf,KAC1C,KAAK,IAAIvf,EAAE,SAAS,CAAC,IAAIC,EAAE,SAAS,CAAC,CAAC,IAAIsf,KAC1C,KAAK,IAAIvf,EAAE,OAAO,CAAC,IAAIC,EAAE,OAAO,CAAC,CAAC,IAAIsf,KACtC,KAAK,IAAIvf,EAAE,OAAO,CAAC,IAAIC,EAAE,OAAO,CAAC,CAAC,IAAIsf,KACtC,KAAK,IAAIvf,EAAE,OAAO,CAAC,IAAIC,EAAE,OAAO,CAAC,CAAC,IAAIsf;AAE1C;AAGO,SAASC,GACdC,GACAC,GACmB;AACnB,SAAKD,IACDA,EAAK,OAAO,IAAUA,IACnB,EAAE,GAAGA,GAAM,MAAMC,EAAA,IAFN;AAGpB;AAQO,SAASC,GACdC,GACAC,GACAC,GACY;AACZ,SAAIF,IAAiBE,IACdN,GAAYK,GAAMC,EAAI,IAAI,KAAKA;AACxC;AAOO,SAASC,GAAyBxU,GAG7B;AACV,SAAOA,EAAM,iBAAiBA,EAAM,YAAY;AAClD;AAEO,SAASyU,GACdngB,GACAogB,GACAC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAS,IAAI,KAAK,IAAI,KAAK,IAAIH,GAAM,IAAI,GAAG,CAAC,IAAI,KACjD7tB,IAAO4tB,IAAY,IAAIpgB,IAAUwgB,IAASxgB,IAAUwgB;AAC1D,SAAO,KAAK,IAAID,GAAK,KAAK,IAAID,GAAK9tB,CAAI,CAAC;AAC1C;AAGA,MAAMiuB,KAAe,GACfC,KAAc,GACdC,KAAY,GACZC,KAAe,GACfC,KAAY,GACZC,KAAkB,GAQXC,KAAuB;AAE7B,SAASC,GAAkBtnB,GAIhC;AACA,SAAIA,IACK,EAAE,MAAM+mB,IAAc,QAAQC,IAAa,OAAOC,GAAA,IAEpD,EAAE,MAAMA,IAAW,QAAQD,IAAa,OAAOC,GAAA;AACxD;AAEO,SAASM,GAAavnB,GAA6C;AACxE,SAAIA,IACK,EAAE,KAAKknB,IAAc,KAAKE,GAAA,IAE5B,EAAE,KAAKD,IAAW,KAAKC,GAAA;AAChC;ACvXO,SAASI,GAAgBtF,GAAqBliB,GAAuB;AAC1E,SAAO;AAAA,IACLkiB,EAAO;AAAA,IACPA,EAAO;AAAA,IACPA,EAAO;AAAA,IACPA,EAAO;AAAA,IACPA,EAAO;AAAA,IACPA,EAAO;AAAA,IACPA,EAAO;AAAA,IACPliB,IAAO,OAAO;AAAA,EAAA,EACd,KAAK,GAAG;AACZ;AAuBO,SAASynB,GAAU;AAAA,EACxB,QAAAvF;AAAA,EACA,OAAA5iB;AAAA,EACA,MAAAU;AAAA,EACA,aAAA0nB;AAAA,EACA,WAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,iBAAAC,IAAkB;AAAA,EAClB,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc;AAAA,EACd,cAAAC,IAAe;AAAA,EACf,gBAAAC;AAAA,EACA,eAAAC;AACF,GAAmB;AACjB,QAAM,EAAE,QAAAxf,GAAQ,MAAAzF,GAAM,YAAA0G,EAAA,IAAeC,GAAA,GAC/Bue,IAAe1wB,GAAO,EAAK,GAC3B2wB,IAAe3wB,GAAO,EAAK,GAC3B4wB,IAAc5wB,GAAsB,IAAI,GACxC6wB,IAAkB7wB,GAA+B,IAAI,GACrD8wB,IAAc9wB,GAAOmwB,CAAQ;AACnC,EAAAW,EAAY,UAAUX;AACtB,QAAMY,IAAqB/wB,GAAOowB,CAAe;AACjD,EAAAW,EAAmB,UAAUX;AAC7B,QAAMY,IAAchxB,GAAOqwB,CAAQ;AACnC,EAAAW,EAAY,UAAUX;AACtB,QAAMY,IAAiBjxB,GAAOswB,CAAW;AACzC,EAAAW,EAAe,UAAUX;AACzB,QAAMY,IAAkBlxB,GAAOuwB,CAAY;AAC3C,EAAAW,EAAgB,UAAUX;AAC1B,QAAMY,IAAoBnxB,GAAOwwB,CAAc;AAC/C,EAAAW,EAAkB,UAAUX;AAC5B,QAAMY,IAAmBpxB,GAAOywB,CAAa;AAC7C,EAAAW,EAAiB,UAAUX;AAC3B,QAAMY,KAAiBrxB,GAAsB,IAAI,GAC3CsxB,IAAwBtxB,GAAO,CAAC,GAEhCuxB,IAAgBvxB,GAAO,EAAK,GAC5BwxB,IAAexxB,GAKX,IAAI,GACRyxB,IAAY3B,GAAgBtF,GAAQliB,CAAI,GAExCopB,IAAiBxwB,GAAY,MAAM;AACvC,IAAI0vB,EAAY,WAAW,SAC3B,qBAAqBA,EAAY,OAAO,GACxCA,EAAY,UAAU;AAAA,EACxB,GAAG,CAAA,CAAE,GAECe,IAAczwB;AAAA,IAClB,CAAC0wB,IAAWlB,EAAa,YAAgC;AACvD,YAAMmB,IAAW7B,EAAY;AAC7B,aAAO;AAAA,QACL,MAAA1nB;AAAA,QACA,WAAAmpB;AAAA,QACA,MAAMxgB,aAAkBlO,GAAM,qBAAqBkO,EAAO,OAAO;AAAA,QACjE,UAAU,CAACA,EAAO,SAAS,GAAGA,EAAO,SAAS,GAAGA,EAAO,SAAS,CAAC;AAAA,QAClE,QAAQ4gB,IACJ,CAACA,EAAS,OAAO,GAAGA,EAAS,OAAO,GAAGA,EAAS,OAAO,CAAC,IACxD,CAACrH,EAAO,IAAIA,EAAO,IAAI,CAAC;AAAA,QAC5B,cAAcoH;AAAA,QACd,UAAUd,EAAY;AAAA,MAAA;AAAA,IAE1B;AAAA,IACA,CAACtG,EAAO,IAAIA,EAAO,IAAIiH,GAAWxgB,GAAQ+e,GAAa1nB,CAAI;AAAA,EAAA,GAGvDwpB,IAAc5wB;AAAA,IAClB,CAAC6wB,MAA6B;AAC5B,MAAApB,EAAa,UAAU,IACvBe,EAAA,GACAzgB,EAAO,GAAG,IAAI,GAAG,GAAG,CAAC,GACrBA,EAAO,SAAS,IAAI8gB,EAAK,SAAS,CAAC,GAAGA,EAAK,SAAS,CAAC,GAAGA,EAAK,SAAS,CAAC,CAAC,GACpE9gB,aAAkBlO,GAAM,sBAC1BkO,EAAO,OAAO8gB,EAAK,MACnB9gB,EAAO,uBAAA,KAEPA,EAAO,OAAO8gB,EAAK,OAAO,CAAC,GAAGA,EAAK,OAAO,CAAC,GAAGA,EAAK,OAAO,CAAC,CAAC;AAE9D,YAAMF,IAAW7B,EAAY;AAC7B,MAAI6B,MACFA,EAAS,OAAO,IAAIE,EAAK,OAAO,CAAC,GAAGA,EAAK,OAAO,CAAC,GAAGA,EAAK,OAAO,CAAC,CAAC,GAClEF,EAAS,OAAA,IAEX3B,EAAiB,UAAU,EAAE,GAAG6B,GAAM,WAAAN,GAAW,MAAAnpB,EAAA,GACjDooB,EAAa,UAAUqB,EAAK,cAC5B7f,EAAA,GACAye,EAAa,UAAU;AAAA,IACzB;AAAA,IACA,CAACc,GAAWxgB,GAAQygB,GAAgB1B,GAAa9d,GAAY5J,GAAM4nB,CAAgB;AAAA,EAAA,GAG/E8B,IAAmB9wB;AAAA,IACvB,CAAC+wB,MAAuB;AACtB,UAAI,EAAEhhB,aAAkBlO,GAAM,oBAAqB;AACnD,MAAA2uB,EAAA;AACA,YAAMQ,IAAYjhB,EAAO;AACzB,UAAIihB,MAAcD,EAAY;AAC9B,YAAME,IAAU,YAAY,IAAA,GACtBlD,IAAO,CAACmD,MAAgB;;AAC5B,YAAI,EAAEnhB,aAAkBlO,GAAM,oBAAqB;AACnD,cAAMhB,IAAI,KAAK,IAAI,IAAIqwB,IAAMD,KAAWnH,EAAmB;AAK3D,YAJA/Z,EAAO,OAAOid,GAAKgE,GAAWD,GAAYhE,GAAalsB,CAAC,CAAC,GACzDkP,EAAO,uBAAA,GACPif,EAAiB,UAAUyB,EAAA,GAC3Bzf,EAAA,GACInQ,IAAI,GAAG;AACT,UAAA6uB,EAAY,UAAU,sBAAsB3B,CAAI;AAChD;AAAA,QACF;AACA,QAAA2B,EAAY,UAAU,OACtBv1B,IAAA81B,EAAkB,YAAlB,QAAA91B,EAAA,KAAA81B,GAA4BQ,EAAY,EAAI;AAAA,MAC9C;AACA,MAAAf,EAAY,UAAU,sBAAsB3B,CAAI;AAAA,IAClD;AAAA,IACA,CAAChe,GAAQygB,GAAgBC,GAAazf,GAAYge,CAAgB;AAAA,EAAA,GAG9DmC,KAAcnxB,GAAY,MAAkB;AAChD,UAAM2wB,IAAW7B,EAAY;AAC7B,WAAO;AAAA,MACL,MAAM/e,aAAkBlO,GAAM,qBAAqBkO,EAAO,OAAO;AAAA,MACjE,UAAU,CAACA,EAAO,SAAS,GAAGA,EAAO,SAAS,GAAGA,EAAO,SAAS,CAAC;AAAA,MAClE,QAAQ4gB,IACJ,CAACA,EAAS,OAAO,GAAGA,EAAS,OAAO,GAAGA,EAAS,OAAO,CAAC,IACxD,CAACrH,EAAO,IAAIA,EAAO,IAAI,CAAC;AAAA,IAAA;AAAA,EAEhC,GAAG,CAACA,EAAO,IAAIA,EAAO,IAAIvZ,GAAQ+e,CAAW,CAAC,GAExCsC,KAAUpxB,GAAY,MAAkB;AAC5C,UAAM,EAAE,OAAAwC,GAAO,QAAAoB,MAAWimB,GAAaP,CAAM;AAC7C,WAAIvZ,aAAkBlO,GAAM,sBAAsB,CAACuF,IAC1C;AAAA,MACL,MAAMmiB,GAAajf,EAAK,OAAOA,EAAK,QAAQ9H,GAAOoB,CAAM;AAAA,MACzD,UAAU,CAAC0lB,EAAO,IAAIA,EAAO,IAAI,GAAG;AAAA,MACpC,QAAQ,CAACA,EAAO,IAAIA,EAAO,IAAI,CAAC;AAAA,IAAA,IAG7B;AAAA,MACL,MAAMvZ,aAAkBlO,GAAM,qBAAqBkO,EAAO,OAAO;AAAA,MACjE,UAAU,CAACuZ,EAAO,IAAIA,EAAO,KAAKA,EAAO,OAAO,MAAMA,EAAO,OAAO,IAAI;AAAA,MACxE,QAAQ,CAACA,EAAO,IAAIA,EAAO,IAAI,CAAC;AAAA,IAAA;AAAA,EAEpC,GAAG,CAACA,GAAQvZ,GAAQ3I,GAAMkD,EAAK,QAAQA,EAAK,KAAK,CAAC,GAE5C+mB,KAAYrxB;AAAA,IAChB,CAACstB,GAAkBgE,MAAoB;AACrC,MAAA7B,EAAa,UAAU,IACvB1f,EAAO,GAAG,IAAI,GAAG,GAAG,CAAC,GACrBA,EAAO,SAAS,IAAIud,EAAK,SAAS,CAAC,GAAGA,EAAK,SAAS,CAAC,GAAGA,EAAK,SAAS,CAAC,CAAC,GACpEvd,aAAkBlO,GAAM,uBAC1BkO,EAAO,OAAOud,EAAK,MACnBvd,EAAO,uBAAA,IAELuhB,KACFvhB,EAAO,OAAOud,EAAK,OAAO,CAAC,GAAGA,EAAK,OAAO,CAAC,GAAGA,EAAK,OAAO,CAAC,CAAC;AAE9D,YAAMqD,IAAW7B,EAAY;AAC7B,MAAI6B,MACFA,EAAS,OAAO,IAAIrD,EAAK,OAAO,CAAC,GAAGA,EAAK,OAAO,CAAC,GAAGA,EAAK,OAAO,CAAC,CAAC,GAClEqD,EAAS,OAAA,IAEX3f,EAAA,GACAye,EAAa,UAAU;AAAA,IACzB;AAAA,IACA,CAAC1f,GAAQ+e,GAAa9d,CAAU;AAAA,EAAA,GAG5BugB,KAAqBvxB;AAAA,IACzB,CAACwxB,MAAmC;AAClC,YAAM,EAAE,OAAAhvB,GAAO,QAAAoB,MAAWimB,GAAa2H,CAAK;AAC5C,UAAIzhB,aAAkBlO,GAAM,sBAAsB,CAACuF,GAAM;AACvD,cAAMqqB,IAAY5H,GAAaP,CAAM,GAC/BoI,IAASnI;AAAA,UACbjf,EAAK;AAAA,UACLA,EAAK;AAAA,UACLmnB,EAAU;AAAA,UACVA,EAAU;AAAA,QAAA;AAEZ,eAAO;AAAA,UACL,MAAM9F;AAAA,YACJpC,GAAajf,EAAK,OAAOA,EAAK,QAAQ9H,GAAOoB,CAAM;AAAA,YACnD8tB;AAAA,YACAtG,GAAqB5oB,GAAOoB,CAAM;AAAA,UAAA;AAAA,UAEpC,UAAU,CAAC4tB,EAAM,IAAIA,EAAM,IAAI,GAAG;AAAA,UAClC,QAAQ,CAACA,EAAM,IAAIA,EAAM,IAAI,CAAC;AAAA,QAAA;AAAA,MAElC;AACA,YAAMG,IAAW,KAAK,IAAIH,EAAM,MAAM,CAAC;AACvC,aAAO;AAAA,QACL,MAAMzhB,aAAkBlO,GAAM,qBAAqBkO,EAAO,OAAO;AAAA,QACjE,UAAU,CAACyhB,EAAM,IAAIA,EAAM,KAAKG,IAAW,MAAMA,IAAW,IAAI;AAAA,QAChE,QAAQ,CAACH,EAAM,IAAIA,EAAM,IAAI,CAAC;AAAA,MAAA;AAAA,IAElC;AAAA,IACA,CAAClI,GAAQvZ,GAAQ3I,GAAMkD,EAAK,QAAQA,EAAK,KAAK;AAAA,EAAA,GAG1CsnB,IAAmB5xB,GAAY,MAAyB;AAC5D,UAAM6xB,IAAQ/B,EAAY;AAC1B,WAAK+B,IACDA,EAAM,OAAO,IAAUA,IACpB,EAAE,GAAGA,GAAO,MAAMT,GAAA,EAAU,KAAA,IAFhB;AAAA,EAGrB,GAAG,CAACA,EAAO,CAAC,GAENU,IAAmB9xB,GAAY,MAAkB;AACrD,UAAM2tB,IAAMyD,GAAA;AACZ,WAAO5D,GAAiBwC,EAAgB,SAASF,EAAY,SAASnC,CAAG;AAAA,EAC3E,GAAG,CAACyD,EAAO,CAAC,GAENW,IAAiB/xB,GAAY,MAAM;AACvC,IAAAwwB,EAAA,GACAF,EAAa,UAAU;AACvB,UAAM0B,IAAOJ,EAAA,KAAsBR,GAAA;AACnC,IAAAC,GAAUW,GAAM5qB,CAAI,GACpB4nB,EAAiB,UAAUyB,EAAY,EAAK,GAC5CjB,EAAa,UAAU,IACvBY,EAAsB,UAAU,YAAY,IAAA,IAAQ;AAAA,EACtD,GAAG;AAAA,IACDiB;AAAA,IACAb;AAAA,IACAC;AAAA,IACAW;AAAA,IACAhqB;AAAA,IACA4nB;AAAA,IACA4C;AAAA,EAAA,CACD,GAEKK,IAAWjyB,GAAY,MAAM;AACjC,IAAA+xB,EAAA;AAAA,EACF,GAAG,CAACA,CAAc,CAAC,GAEbG,IAAelyB;AAAA,IACnB,CAACwxB,MAAuB;AACtB,YAAMQ,IAAOT,GAAmBC,CAAK,GAC/Bh2B,IAAO21B,GAAA;AAIb,UAHA3B,EAAa,UAAU,IACvBG,EAAgB,UAAUC,EAAY,SACtCY,EAAA,GACIrD,GAAgB3xB,GAAMw2B,CAAI,GAAG;AAC/B,QAAA1B,EAAa,UAAU,MACvBtB,EAAiB,UAAUyB,EAAY,EAAI;AAC3C;AAAA,MACF;AAEA,MAAAH,EAAa,UAAU;AAAA,QACrB,MAAA90B;AAAA,QACA,MAAAw2B;AAAA,QACA,SAAS,YAAY,IAAA;AAAA,QACrB,QAAQ5qB;AAAA,MAAA,GAEVqoB,EAAa,UAAU,IACvBze,EAAA;AAAA,IACF;AAAA,IACA;AAAA,MACEwf;AAAA,MACAC;AAAA,MACAU;AAAA,MACAngB;AAAA,MACA5J;AAAA,MACA4nB;AAAA,MACAuC;AAAA,IAAA;AAAA,EACF,GAGIY,IAAenyB,GAAY,MAAM;AACrC,UAAMgyB,IAAOF,EAAA,GACPt2B,IAAO21B,GAAA;AAEb,QADAb,EAAa,UAAU,MACnBnD,GAAgB3xB,GAAMw2B,CAAI,GAAG;AAC/B,MAAAxC,EAAa,UAAU,IACvBR,EAAiB,UAAUyB,EAAY,EAAK,GAC5CJ,EAAc,UAAU;AACxB;AAAA,IACF;AACA,IAAAG,EAAA;AACA,UAAMS,IAAU,YAAY,IAAA,GACtBK,IAASlqB,GACT2mB,IAAO,CAACmD,MAAgB;AAC5B,YAAMrwB,IAAI,KAAK,IAAI,IAAIqwB,IAAMD,KAAWnH,EAAmB;AAG3D,UAFAuH,GAAUpE,GAAsBzxB,GAAMw2B,GAAMnxB,CAAC,GAAGywB,CAAM,GACtDtC,EAAiB,UAAUyB,EAAY,EAAK,GACxC5vB,IAAI,GAAG;AACT,QAAA4uB,EAAa,UAAU,IACvBC,EAAY,UAAU,sBAAsB3B,CAAI;AAChD;AAAA,MACF;AACA,MAAA2B,EAAY,UAAU,MACtBF,EAAa,UAAU,IACvBC,EAAa,UAAU,IACvBY,EAAc,UAAU;AAAA,IAC1B;AACA,IAAAZ,EAAa,UAAU,IACvBW,EAAsB,UAAU,YAAY,IAAA,IAAQ,KACpDV,EAAY,UAAU,sBAAsB3B,CAAI;AAAA,EAClD,GAAG;AAAA,IACDsD;AAAA,IACAb;AAAA,IACAC;AAAA,IACAU;AAAA,IACA/pB;AAAA,IACA4nB;AAAA,IACA8C;AAAA,EAAA,CACD,GACKM,IAActzB,GAAOmzB,CAAQ;AACnC,EAAAG,EAAY,UAAUH;AACtB,QAAMI,IAAiBvzB,GAAO8xB,CAAW;AACzC,EAAAyB,EAAe,UAAUzB;AACzB,QAAM0B,IAAkBxzB,GAAOozB,CAAY;AAC3C,EAAAI,EAAgB,UAAUJ;AAE1B,QAAMK,IAASvyB;AAAA,IACb,CAAC8tB,MAAsB;;AACrB,MAAA0B,EAAa,UAAU,IACvBc,EAAa,UAAU;AACvB,YAAMK,IAAW7B,EAAY;AAC7B,UAAI/e,aAAkBlO,GAAM,sBAAsB,CAACuF,GAAM;AACvD,cAAM,EAAE,OAAA5E,GAAO,QAAAoB,MAAWimB,GAAaP,CAAM,GACvCqE,IAAMpE,GAAajf,EAAK,OAAOA,EAAK,QAAQ9H,GAAOoB,CAAM;AAC/D,QAAAktB;AAAA,UACEjD;AAAA,YACE9d,EAAO;AAAA,YACP+d;AAAA,YACApnB,EAAM;AAAA,YACNinB,IAAM;AAAA,YACNA,IAAMpD;AAAA,UAAA;AAAA,QACR;AAAA,MAEJ,WAAWoG,GAAU;AACnB,cAAM1oB,IAAS8H,EAAO,SAAS,QAAQ,IAAI4gB,EAAS,MAAM,GACpDzC,IAAS,IAAI,KAAK,IAAI,KAAK,IAAIxnB,EAAM,WAAW,IAAI,GAAG,CAAC,IAAI,KAC5DxG,IAAO4tB,IAAY,IAAI7lB,EAAO,WAAWimB,IAASjmB,EAAO,OAAA,IAAWimB;AAC1E,QAAAjmB,EAAO;AAAA,UACL,KAAK,IAAIvB,EAAM,qBAAqB,KAAK,IAAIA,EAAM,qBAAqBxG,CAAI,CAAC;AAAA,QAAA,GAE/E6P,EAAO,SAAS,KAAK4gB,EAAS,MAAM,EAAE,IAAI1oB,CAAM,GAChD+mB,EAAiB,UAAUyB,EAAA,IAC3Bt2B,IAAA81B,EAAkB,YAAlB,QAAA91B,EAAA,KAAA81B,GAA4BQ,EAAY,EAAI;AAAA,MAC9C;AACA,MAAAE,KAAA,QAAAA,EAAU,UACV3f,EAAA;AAAA,IACF;AAAA,IACA;AAAA,MACE8f;AAAA,MACAxH;AAAA,MACAvZ;AAAA,MACA0gB;AAAA,MACA3B;AAAA,MACA9d;AAAA,MACA5J;AAAA,MACA4nB;AAAA,MACA1kB,EAAK;AAAA,MACLA,EAAK;AAAA,MACL5D;AAAA,IAAA;AAAA,EACF;AAGF,SAAAhG,GAAU,MAAM,MAAM8vB,KAAkB,CAACA,CAAc,CAAC,GAExD9vB,GAAU,MAAM;AACd,UAAMiwB,IAAW7B,EAAY;AAC7B,QAAI,CAAC6B,EAAU;AACf,UAAMpyB,IAAW,MAAM;;AACrB,MAAIkxB,EAAa,WACb,YAAY,QAAQW,EAAsB,YAC9CZ,EAAa,UAAU,IACvBR,EAAiB,UAAUyB,EAAY,EAAI,IAC3Ct2B,IAAA81B,EAAkB,YAAlB,QAAA91B,EAAA,KAAA81B,GAA4BjB,EAAiB;AAAA,IAC/C,GACMwD,IAAU,MAAM;;AACpB,MAAI/C,EAAa,WACb,YAAY,QAAQW,EAAsB,YAE9CZ,EAAa,UAAU,IACvBc,EAAa,UAAU,MACvBtB,EAAiB,UAAUyB,EAAY,EAAI,IAC3Ct2B,IAAA81B,EAAkB,YAAlB,QAAA91B,EAAA,KAAA81B,GAA4BjB,EAAiB;AAAA,IAC/C;AACA,WAAA2B,EAAS,iBAAiB,UAAUpyB,CAAQ,GAC5CoyB,EAAS,iBAAiB,SAAS6B,CAAO,GACnC,MAAM;AACX,MAAA7B,EAAS,oBAAoB,UAAUpyB,CAAQ,GAC/CoyB,EAAS,oBAAoB,SAAS6B,CAAO;AAAA,IAC/C;AAAA,EACF,GAAG,CAACziB,GAAQ0gB,GAAa3B,GAAaE,CAAgB,CAAC,GAEvDyD;AAAA,IACE1D;AAAA,IACA,OAAO;AAAA,MACL,QAAQ,MAAM;AACZ,QAAAwD,EAAO,CAAC;AAAA,MACV;AAAA,MACA,SAAS,MAAM;AACb,QAAAA,EAAO,EAAE;AAAA,MACX;AAAA,MACA,OAAO,MAAM;;AACX,QAAA/C,EAAa,UAAU,IACvBc,EAAa,UAAU,MACvBX,EAAgB,UAAU,MAC1BC,EAAY,UAAU,MACtBS,EAAc,UAAU,KACxBl2B,IAAA+1B,EAAiB,YAAjB,QAAA/1B,EAAA,KAAA+1B,IACAiC,EAAA;AAAA,MACF;AAAA,MACA,aAAa,CAACX,MAAU;AACtB,QAAAU,EAAaV,CAAK;AAAA,MACpB;AAAA,MACA,SAAS,MAAMf,EAAA;AAAA,MACf,WAAW,CAACI,MAASD,EAAYC,CAAI;AAAA,IAAA;AAAA,IAEvC,CAACqB,GAAcC,GAAc1B,GAAaG,GAAa2B,CAAM;AAAA,EAAA,GAG/D9gB,GAAgB,MAAM;AAMpB,QALInH,EAAK,QAAQ,KAAKA,EAAK,SAAS,MAChC2kB,KAAY,SACdU,EAAgB,UAAU,MAC1BW,EAAa,UAAU,OAErB1C,GAAyB,EAAE,eAAeyC,EAAc,SAAS,UAAApB,EAAA,CAAU;AAC7E;AAEF,IAAIoB,EAAc,YAASA,EAAc,UAAU;AACnD,UAAMQ,IAAO7B,EAAiB,SACxBwC,IAAQ3B,EAAmB,SAC3B6C,IACJzD,KAAY,QAAQuC,KAAS,QAAQ7B,EAAgB,YAAYV,GAC7D0D,IACJ9B,KAAQ,QACRA,EAAK,SAASzpB,KACdypB,EAAK,cAAcN,KACnBM,EAAK,aAAa5B;AAEpB,QAAIA,KAAY,QAAQuC,KAAS,MAAM;AACrC,UAAImB,GAAkB;AACpB,QAAAhD,EAAgB,UAAUV,GACtBqB,EAAa,WAAW,QAAM+B,EAAe,QAAQxB,CAAI;AAC7D;AAAA,MACF;AACA,UAAI6B,GAAY;AAGd,YAAI1D,EAAiB,WAAW,MAAM;AACpC,UAAAW,EAAgB,UAAUV,GAC1BO,EAAa,UAAU,IACvBgB,EAAA,GACAa,GAAUE,GAAmBC,CAAK,GAAGpqB,CAAI,GACzC4nB,EAAiB,UAAUyB,EAAY,EAAI;AAC3C;AAAA,QACF;AACA,QAAII,KAAQ,CAAC8B,KAAkBN,EAAe,QAAQxB,CAAI,GAC1DyB,EAAgB,QAAQd,CAAK;AAC7B;AAAA,MACF;AAGA;AAAA,IACF;AAEA,QAAIpC,KAAee,GAAe,YAAYf,GAAa;AACzD,MAAAe,GAAe,UAAUf,GACzBI,EAAa,UAAU,IACvB4C,EAAY,QAAA;AACZ;AAAA,IACF;AAIA,QAAIvB,KAAQA,EAAK,SAASzpB,KAAQypB,EAAK,cAAcN,GAAW;AAC9D,MAAA8B,EAAe,QAAQxB,CAAI;AAC3B;AAAA,IACF;AACA,IAAArB,EAAa,UAAU,IACvB4C,EAAY,QAAA;AAAA,EACd,GAAG;AAAA,IACDf;AAAA,IACAd;AAAA,IACAxgB;AAAA,IACAygB;AAAA,IACAC;AAAA,IACAxB;AAAA,IACAG;AAAA,IACAhoB;AAAA,IACA4nB;AAAA,IACAuC;AAAA,EAAA,CACD,GAED7wB,GAAU,MAAM;AACd,IAAI4J,EAAK,QAAQ,KAAKA,EAAK,SAAS,KAAKklB,EAAa,WACtD4C,EAAY,QAAA;AAAA,EACd,GAAG,CAAC9nB,EAAK,QAAQA,EAAK,KAAK,CAAC,GAE5BoH,GAAS,MAAM;AACb,UAAMkhB,IAAOtC,EAAa;AAC1B,QAAI,CAACsC,EAAM;AACX,UAAM/xB,IAAI,KAAK,IAAI,IAAI,YAAY,QAAQ+xB,EAAK,WAAW7I,EAAoB;AAM/E,QALAsH;AAAA,MACEpE,GAAsB2F,EAAK,MAAMA,EAAK,MAAM/xB,GAAGksB,EAAY;AAAA,MAC3D6F,EAAK;AAAA,IAAA,GAEP5D,EAAiB,UAAUyB,EAAY,EAAI,GACvC5vB,IAAI,GAAG;AACT,MAAAmQ,EAAA;AACA;AAAA,IACF;AACA,IAAAsf,EAAa,UAAU;AAAA,EACzB,CAAC,GAEM;AACT;ACvkBA,SAASuC,GAAYv0B,GAAsC;AACzD,SAAO,OAAOA,KAAU,YAAYA,MAAU;AAChD;AAEO,SAASw0B,GACdvrB,GACAwrB,GACAtwB,GACoB;AACpB,SAAIowB,GAAYtrB,CAAW,IAAUA,IACjCsrB,GAAYE,CAAS,IAAUA,IAC/BF,GAAYpwB,CAAM,IAAUA,IACzB;AACT;AAEO,SAASuwB,GACdC,GACAxxB,GACS;AACT,MAAI,CAACoxB,GAAYI,CAAI,KAAKxxB,KAAU,KAAM,QAAO;AACjD,QAAMyxB,IAAYD,EAAuD;AACzE,SAAO,OAAOC,KAAa,cAAcA,EAAS,KAAKD,GAAMxxB,CAAM;AACrE;AAGO,SAAS0xB,GAAwB/tB,GAAoB;AAC1D,EAAAA,EAAM,yBAAA;AACR;ACaA,MAAMguB,KAAY,IACZC,KAAsC,CAAC,GAAG,GAAG,CAAC,GAC9CC,KAA+B,CAAC,GAAG,CAAC,GACpCC,KAAY,EAAE,WAAW,GAAA;AAQ/B,SAASC,GAAoB;AAAA,EAC3B,YAAAC;AAAA,EACA,aAAAlsB;AACF,GAGG;AACD,QAAMmsB,IAAKziB,GAAS,CAACC,MAAUA,EAAM,EAAE,GACjC6hB,IAAY9hB,GAAS,CAACC,MAAUA,EAAM,OAAO,SAAS;AAE5D,SAAAxQ,GAAU,MAAM;AACd,QAAI,CAAC+yB,EAAY;AAEjB,UAAME,IAAU,CAACvuB,MAAsB;AACrC,YAAM6tB,IAAOH;AAAA,QACXvrB,KAAA,gBAAAA,EAAa;AAAA,QACbwrB;AAAA,QACAW,EAAG;AAAA,MAAA;AAEL,MAAKV,GAAwBC,GAAM7tB,EAAM,MAAM,KAC/C+tB,GAAwB/tB,CAAK;AAAA,IAC/B;AAEA,oBAAS,iBAAiB,SAASuuB,GAAS,EAAE,SAAS,IAAM,GACtD,MAAM,SAAS,oBAAoB,SAASA,GAAS,EAAE,SAAS,IAAM;AAAA,EAC/E,GAAG,CAACF,GAAYV,GAAWxrB,GAAamsB,EAAG,UAAU,CAAC,GAE/C;AACT;AAsCO,SAASE,GAAS;AAAA,EACvB,KAAAC;AAAA,EACA,OAAAntB;AAAA,EACA,eAAA7O;AAAA,EACA,OAAAkV;AAAA,EACA,iBAAA+mB;AAAA,EACA,kBAAArvB;AAAA,EACA,gBAAAD,IAAiB;AAAA,EACjB,UAAAyqB;AAAA,EACA,iBAAAC;AAAA,EACA,WAAAH;AAAA,EACA,eAAA1nB;AAAA,EACA,qBAAAvP;AAAA,EACA,eAAA4P;AAAA,EACA,aAAAH;AAAA,EACA,MAAAlD,IAAO;AAAA,EACP,UAAA8qB,IAAW;AAAA,EACX,aAAAC,IAAc;AAAA,EACd,cAAAC,IAAe;AAAA,EACf,gBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAwE;AAAA,EACA,oBAAAnsB,IAAqB;AAAA,EACrB,WAAAD,IAAY,CAAA;AAAA,EACZ,kBAAAE,IAAmB;AAAA,EACnB,gBAAAC;AACF,GAAkB;AAChB,QAAMV,IAAOV,EAAM,cAAc,MAC3BooB,IAAchwB,GAAiC,IAAI,GACnDkwB,KAAmBlwB,GAAkC,IAAI,GACzDk1B,IAAiBl1B,GAAwC,IAAI,GAC7D0I,IAAoB1I,GAAO2G,IAA4B;AAE7D,EAAA/E,GAAU,MAAM;AACd,UAAMuyB,IAAO1rB,KAAA,gBAAAA,EAAa;AAC1B,QAAI,CAAC0rB,EAAM;AAEX,UAAMrtB,IAAU4B,EAAkB,SAE5BysB,IAAS,CAACrzB,MAAoB;AAClC,YAAMszB,IAAMxuB,GAAsB9E,CAAC;AACnC,MAAKszB,MACLF,EAAe,UAAU,EAAE,GAAGE,EAAI,GAAG,GAAGA,EAAI,EAAA,GAC5CvuB,GAA0BC,GAASsuB,EAAI,GAAGA,EAAI,GAAGA,EAAI,SAAS;AAAA,IAChE,GAEMnzB,IAAS,CAACH,MAAoB;AAClC,YAAMszB,IAAMxuB,GAAsB9E,CAAC;AACnC,MAAKszB,KACLpuB,GAAyBF,GAASsuB,EAAI,GAAGA,EAAI,GAAGA,EAAI,SAAS;AAAA,IAC/D,GAEMC,IAAO,CAACvzB,MAAoB;AAChC,YAAMszB,IAAMxuB,GAAsB9E,CAAC;AACnC,MAAKszB,KACLluB,GAAwBJ,GAASsuB,EAAI,GAAGA,EAAI,GAAGA,EAAI,SAAS;AAAA,IAC9D;AAEA,WAAAjB,EAAK,iBAAiB,eAAegB,GAAQ,EAAI,GACjD,OAAO,iBAAiB,eAAelzB,GAAQ,EAAE,SAAS,IAAM,GAChE,OAAO,iBAAiB,aAAaozB,CAAI,GACzC,OAAO,iBAAiB,iBAAiBA,CAAI,GACtC,MAAM;AACX,MAAAlB,EAAK,oBAAoB,eAAegB,GAAQ,EAAI,GACpD,OAAO,oBAAoB,eAAelzB,CAAM,GAChD,OAAO,oBAAoB,aAAaozB,CAAI,GAC5C,OAAO,oBAAoB,iBAAiBA,CAAI;AAAA,IAClD;AAAA,EACF,GAAG,CAAC5sB,CAAW,CAAC;AAEhB,QAAM6sB,IAAUt0B;AAAA,IACd,MAAMu0B,GAAiBR,EAAI,QAAQh8B,CAAa;AAAA,IAChD,CAACg8B,EAAI,QAAQh8B,CAAa;AAAA,EAAA,GAGtByxB,IAASxpB;AAAA,IACb,MAAMw0B,GAAwBT,EAAI,QAAQh8B,GAAeg8B,EAAI,WAAW;AAAA,IACxE,CAACA,EAAI,QAAQA,EAAI,aAAah8B,CAAa;AAAA,EAAA,GAGvC08B,IAAOz0B;AAAA,IACX,MAAMupB,GAAmBC,CAAM;AAAA,IAC/B;AAAA,MACEA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA,EAAO;AAAA,IAAA;AAAA,EACT,GAEIkL,IAAiB10B;AAAA,IACrB,MAAM,CAACy0B,EAAK,IAAIA,EAAK,IAAI,GAAG;AAAA,IAC5B,CAACA,EAAK,IAAIA,EAAK,EAAE;AAAA,EAAA,GAEbE,IAAmB30B;AAAA,IACvB,MACE,CAACy0B,EAAK,IAAIA,EAAK,KAAKA,EAAK,OAAO,MAAMA,EAAK,OAAO,IAAI;AAAA,IAKxD,CAACA,EAAK,IAAIA,EAAK,IAAIA,EAAK,IAAI;AAAA,EAAA,GAExBG,IAAe50B,GAAQ,MAAM4uB,GAAkBtnB,CAAI,GAAG,CAACA,CAAI,CAAC,GAC5DutB,KAAU70B,GAAQ,MAAM6uB,GAAavnB,CAAI,GAAG,CAACA,CAAI,CAAC,GAElDwtB,KAAe90B;AAAA,IACnB,MAAM+zB,EAAI,OAAO,KAAK,CAACt7B,MAAUs8B,GAAet8B,CAAK,CAAC,KAAK;AAAA,IAC3D,CAACs7B,EAAI,MAAM;AAAA,EAAA,GAGPiB,MACJF,MAAA,gBAAAA,GAAc,iBAAgBf,EAAI,cAAc,MAE5C9L,KAAcjoB;AAAA,IAClB,MAAMi1B,GAAsBlB,EAAI,MAAM;AAAA,IACtC,CAACA,EAAI,MAAM;AAAA,EAAA,GAGPmB,IAAiBZ,EAAQ,KAAK,CAAC77B,MAAUs8B,GAAet8B,CAAK,CAAC,GAE9D08B,IAAen1B;AAAA,IACnB,OAAO;AAAA,MACL,kBAAkB4G,EAAM;AAAA,MACxB,aAAaA,EAAM;AAAA,MACnB,oBAAoBA,EAAM;AAAA,MAC1B,oBAAoBA,EAAM;AAAA,MAC1B,gBAAgBA,EAAM;AAAA,IAAA;AAAA,IAExB;AAAA,MACEA,EAAM;AAAA,MACNA,EAAM;AAAA,MACNA,EAAM;AAAA,MACNA,EAAM;AAAA,MACNA,EAAM;AAAA,IAAA;AAAA,EACR;AAGF,SACE,gBAAA3N;AAAA,IAACm8B;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAY7pB,GAAmB3E,EAAM,oBAAoB,IACrD,gBACAA,EAAM;AAAA,MAAA;AAAA,MAEZ,aAAAa;AAAA,MACA,aAAY;AAAA,MACZ,cAAc,CAACH;AAAA,MACf,WAAU;AAAA,MACV,KAAKksB;AAAA,MACL,MAAI;AAAA,MACJ,IAAIC;AAAA,MACJ,eAAe,CAAC3yB,MAAM;AACpB,cAAMszB,IAAMxuB,GAAsB9E,CAAC;AACnC,QAAKszB,MACLF,EAAe,UAAU,EAAE,GAAGE,EAAI,GAAG,GAAGA,EAAI,EAAA,GAC5CvuB,GAA0B6B,EAAkB,SAAS0sB,EAAI,GAAGA,EAAI,GAAGA,EAAI,SAAS;AAAA,MAClF;AAAA,MACA,iBAAiB,CAACtzB,MAAM;AACtB,QACEwF,GAA2B4tB,EAAe,SAAS;AAAA,UACjD,GAAGpzB,EAAE;AAAA,UACL,GAAGA,EAAE;AAAA,UACL,QAAQA,EAAE;AAAA,QAAA,CACX,MAEDyG,KAAA,QAAAA,EAAgB,MAAMxP,KAAiB;AAAA,MAE3C;AAAA,MACA,QACEuP,IACI;AAAA,QACE,UAAUqtB;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,KAAK;AAAA,QACL,IAAIpB;AAAA,MAAA,IAEN;AAAA,MAGL,UAAA;AAAA,QAAA,CAACjsB,KACA,gBAAApO;AAAA,UAACm8B;AAAA,UAAA;AAAA,YACC,aAAW;AAAA,YACX,UAAUX;AAAA,YACV,IAAInB;AAAA,YACJ,MAAM;AAAA,YACN,KAAK;AAAA,UAAA;AAAA,QAAA;AAAA,QAGRhoB,GAAmB3E,EAAM,oBAAoB,IAAI,OAChD,gBAAA1N,EAAC,SAAA,EAAM,QAAO,cAAa,MAAM,CAAC0N,EAAM,oBAAoB,EAAA,CAAG;AAAA,QAEjE,gBAAA1N,EAAC,gBAAA,EAAa,WAAW,GAAG,OAAM,WAAU;AAAA,QAC5C,gBAAAA,EAAC,oBAAA,EAAiB,UAAU,CAAC,GAAG,KAAK,CAAC,GAAG,OAAM,WAAU,WAAW,IAAA,CAAK;AAAA,QACzE,gBAAAA,EAAC,oBAAA,EAAiB,UAAU,CAAC,GAAG,GAAG,GAAG,GAAG,OAAM,WAAU,WAAW,IAAA,CAAK;AAAA,QACzE,gBAAAA,EAAC,oBAAA,EAAiB,UAAU,CAAC,GAAG,GAAG,IAAI,GAAG,OAAM,WAAU,WAAW,IAAA,CAAK;AAAA,QAE1E,gBAAAD,GAAC,SAAA,EAAM,OAAOqwB,IACX,UAAA;AAAA,UAAA4L,KAAkBF,KACjB,gBAAA97B;AAAA,YAAC8uB;AAAA,YAAA;AAAA,cACC,KAAKgN;AAAA,cACL,aAAA/M;AAAA,cACA,eAAArgB;AAAA,cACA,MAAAN;AAAA,cACA,OAAO6tB;AAAA,YAAA;AAAA,UAAA,IAEP;AAAA,UAEHb,EAAQ,IAAI,CAAC77B,MAAU;AACtB,kBAAM68B,IAAUP,GAAet8B,CAAK,GAC9Bob,IAAYpb,EAAM;AACxB,mBACE,gBAAAQ;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,UAAU;AAAA,kBACR4a,EAAU;AAAA,kBACVA,EAAU;AAAA,kBACVyhB,IAAUhC,KAAY;AAAA,gBAAA;AAAA,gBAExB,UAAU,CAAC,GAAG,GAAIzf,EAAU,SAAS,KAAK,KAAM,GAAG;AAAA,gBACnD,OAAOA,EAAU,SAAS;AAAA,gBAE1B,UAAA;AAAA,kBAAA,gBAAA3a;AAAA,oBAACmO;AAAA,oBAAA;AAAA,sBACC,OAAA5O;AAAA,sBACA,QAAQs7B,EAAI;AAAA,sBACZ,OAAAntB;AAAA,sBACA,MAAAU;AAAA,sBACA,aAAAG;AAAA,sBACA,mBAAAC;AAAA,sBACA,kBAAA/C;AAAA,sBACA,gBAAAD;AAAA,sBACA,iBAAiB4wB,KAAW,EAAQN;AAAA,sBACpC,eAAAptB;AAAA,sBACA,WAAWmsB,EAAI;AAAA,sBACf,WAAAlsB;AAAA,sBACA,MAAAtD;AAAA,sBACA,oBAAAuD;AAAA,sBACA,kBAAAC;AAAA,sBACA,gBAAAC;AAAA,sBACA,eAAe,CAAC/L,GAASs5B,MACvBhuB,KAAA,gBAAAA,EAAgBtL,GAASxD,EAAM,IAAI88B;AAAA,oBAAI;AAAA,kBAAA;AAAA,kBAG1CtoB,KAASxU,EAAM,OAAOV,IACrB,gBAAAmB;AAAA,oBAACwZ;AAAA,oBAAA;AAAA,sBACC,OAAAzF;AAAA,sBACA,SAASxU,EAAM;AAAA,sBACf,QAAQs7B,EAAI;AAAA,sBACZ,YAAYA,EAAI;AAAA,sBAChB,OAAOntB,EAAM;AAAA,sBACb,WAAWA,EAAM;AAAA,sBACjB,qBAAA5O;AAAA,oBAAA;AAAA,kBAAA,IAEA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAxCCS,EAAM;AAAA,YAAA;AAAA,UA2CjB,CAAC;AAAA,QAAA,GACH;AAAA,QAEA,gBAAAS;AAAA,UAACw6B;AAAA,UAAA;AAAA,YACC,aAAAjsB;AAAA,YACA,YAAY,EAAEwsB,KAAkBuB,GAAsBjxB,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAE5D,gBAAArL;AAAA,UAACu8B;AAAA,UAAA;AAAA,YACC,KAAKzG;AAAA,YACL,aAAW;AAAA,YACX,eAAe;AAAA,YACf,cAAc1nB;AAAA,YACd,WAAS;AAAA,YACT,YAAU;AAAA,YACV,oBAAkB;AAAA,YAClB,WAAW;AAAA,YACX,cAAcqnB;AAAA,YACd,cAAAiG;AAAA,YACA,SAAAC;AAAA,YACA,aAAajuB,EAAM;AAAA,YACnB,aAAaA,EAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAErB,gBAAA1N;AAAA,UAAC61B;AAAA,UAAA;AAAA,YACC,QAAQ0F;AAAA,YACR,OAAA7tB;AAAA,YACA,MAAAU;AAAA,YACA,aAAA0nB;AAAA,YACA,WAAAC;AAAA,YACA,kBAAAC;AAAA,YACA,UAAUC,KAAY6E,KAAmB;AAAA,YACzC,iBAAiB5E,KAAmB;AAAA,YACpC,UAAAC;AAAA,YACA,aAAAC;AAAA,YACA,cAAAC;AAAA,YACA,gBAAAC;AAAA,YACA,eAAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;ACpYA,SAASiG,GACP/4B,GACAg5B,GACQ;;AACR,WACEt7B,IAAAsC,EAAM,eAAN,gBAAAtC,EAAkB,gBAClBs7B,KACAh5B,EAAM,MAAM,UACZN,IAAAM,EAAM,eAAN,gBAAAN,EAAkB,eAClBM,EAAM;AAEV;AAEO,SAASi5B,GAAc;AAAA,EAC5B,KAAA7B;AAAA,EACA,WAAA/4B;AAAA,EACA,cAAA66B;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,OAAAjpB;AAAA,EACA,YAAAkpB,IAAa;AAAA,EACb,eAAAC,IAAgB;AAAA,EAChB,kBAAAC,IAAmB96B,GAAmB;AACxC,GAAuB;AACrB,QAAM,CAACyC,GAAOwB,CAAQ,IAAID,GAAS,EAAE,GAC/B,CAAC+2B,GAAcC,CAAe,IAAIh3B,GAA0B,IAAI,GAEhEi3B,IAAQx2B,GAAQ,MAAM;;AAC1B,UAAMy2B,IAAmB,CAAA;AACzB,eAAWh+B,KAASs7B,EAAI;AACtB,iBAAWp3B,KAASlE,EAAM,QAAQ;AAChC,cAAM6D,IAAS7D,EAAM,QAAQ,KAAK,CAACsV,OAAMA,GAAE,YAAYpR,EAAM,EAAE,KAAK;AAYpE,YAXIA,EAAM,SAAS,UACjB85B,EAAK,KAAK;AAAA,UACR,IAAI,SAAS95B,EAAM,EAAE;AAAA,UACrB,OAAO+4B,GAAU/4B,CAAK;AAAA,UACtB,OAAOlE,EAAM;AAAA,UACb,WAAU6D,KAAA,gBAAAA,EAAQ,OAAM;AAAA,UACxB,SAAS7D,EAAM;AAAA,UACf,MAAM;AAAA,UACN,WAAW;AAAA,QAAA,CACZ,GAECkE,EAAM,SAAS,eAAatC,IAAAsC,EAAM,eAAN,QAAAtC,EAAkB,YAAW;AAC3D,gBAAMq8B,KAAU17B,EAAU,KAAK,CAAC+S,MAAMA,EAAE,OAAOpR,EAAM,WAAY,SAAS;AAC1E,UAAA85B,EAAK,KAAK;AAAA,YACR,IAAI,WAAW95B,EAAM,EAAE;AAAA,YACvB,OAAO+4B,GAAU/4B,GAAO+5B,MAAA,gBAAAA,GAAS,IAAI;AAAA,YACrC,OAAO;AAAA,YACP,WAAUp6B,KAAA,gBAAAA,EAAQ,OAAM;AAAA,YACxB,SAAS7D,EAAM;AAAA,YACf,MAAM;AAAA,YACN,YAAWi+B,MAAA,gBAAAA,GAAS,OAAM/5B,EAAM,WAAW;AAAA,UAAA,CAC5C;AAAA,QACH;AAAA,MACF;AAEF,WAAO85B;AAAA,EACT,GAAG,CAAC1C,GAAK/4B,CAAS,CAAC,GAEb+E,IAAWC,GAAQ,MAAM;AAC7B,UAAM/B,IAAID,EAAM,KAAA,EAAO,YAAA;AACvB,WAAKC,IACEu4B,EAAM,OAAO,CAACp1B,MAAMA,EAAE,MAAM,YAAA,EAAc,SAASnD,CAAC,CAAC,IAD7Cu4B;AAAA,EAEjB,GAAG,CAACA,GAAOx4B,CAAK,CAAC,GAEX24B,IAAU32B,GAAQ,MAAM;AAC5B,UAAM42B,wBAAU,IAAA;AAChB,eAAWj9B,KAAQoG,GAAU;AAC3B,YAAM82B,IAAMD,EAAI,IAAIj9B,EAAK,KAAK,KAAK,CAAA;AACnC,MAAAk9B,EAAI,KAAKl9B,CAAI,GACbi9B,EAAI,IAAIj9B,EAAK,OAAOk9B,CAAG;AAAA,IACzB;AACA,WAAO,MAAM,KAAKD,EAAI,QAAA,CAAS;AAAA,EACjC,GAAG,CAAC72B,CAAQ,CAAC,GAEP+2B,IAAgBN,EAAM,OAAO,CAACp1B,MAAMA,EAAE,YAAY,IAAI,GACtD21B,IAAW/4B,EAAM,KAAA,EAAO,SAAS,GAEjCg5B,IAAa,CAACr9B,MAAmB;AACrC,IAAA48B,EAAgB58B,CAAI,GAChBA,EAAK,YAAY,QACnBq8B,EAAWr8B,EAAK,QAAQ;AAAA,EAE5B;AAEA,SAAI,CAACw8B,KAAc,EAAEC,KAAiBp7B,EAAU,SAAS,KAChD,OAIP,gBAAA/B,GAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAA,gBAAAA,GAAC,OAAA,EAAI,WAAU,yBACZ,UAAA;AAAA,MAAAk9B,KACC,gBAAAj9B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,aAAY;AAAA,UACZ,cAAW;AAAA,UACX,OAAO8E;AAAA,UACP,UAAU,CAAC8C,MAAMtB,EAASsB,EAAE,OAAO,KAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MAI3Cs1B,KAAiBp7B,EAAU,SAAS,KACnC,gBAAA9B,EAAC,OAAA,EAAI,WAAU,+BACZ,UAAA8B,EAAU,IAAI,CAAC+S,MACd,gBAAA7U;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAY6U,EAAE;AAAA,UACd,SAAS,MAAM;AACb,kBAAMuK,IAAQke,EAAM;AAAA,cAClB,CAACp1B,MACCA,EAAE,SAAS,aACXA,EAAE,cAAc2M,EAAE,MAClB3M,EAAE,YAAY;AAAA,YAAA;AAElB,YAAIkX,OAAkBA,CAAK;AAAA,UAC7B;AAAA,UAEE,WAAA,MAAM;AACN,kBAAMoe,IAAUx8B,GAAiB6T,EAAE,IAAI;AACvC,mBAAO2oB,IACL,gBAAAx9B;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,yBAAyB;AAAA,kBACvB,QAAQoB,GAAco8B,EAAQ,SAASL,CAAgB;AAAA,gBAAA;AAAA,cACzD;AAAA,YAAA,IAGF,gBAAAn9B,EAAC,QAAA,EAAK,WAAU,mCACb,YAAE,KAAK,MAAM,GAAG,CAAC,EAAA,CACpB;AAAA,UAEJ,GAAA;AAAA,QAAG;AAAA,QA5BE6U,EAAE;AAAA,MAAA,CA8BV,EAAA,CACH;AAAA,IAAA,GAEJ;AAAA,IAECooB,KAAcY,KACb,gBAAA99B,GAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,4BACZ,UAAAy9B,EAAQ,WAAW,IAClB,gBAAAz9B,EAAC,OAAA,EAAI,WAAU,2BAA0B,UAAA,qBAAA,CAAkB,IAE3Dy9B,EAAQ,IAAI,CAAC,CAACroB,GAAO2oB,CAAU,MAC7B,gBAAAh+B,GAAC,OAAA,EAAgB,WAAU,2BACzB,UAAA;AAAA,QAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,iCAAiC,UAAAoV,GAAM;AAAA,QACrD2oB,EAAW,IAAI,CAACt9B,MACf,gBAAAT;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,YACEo9B,KAAA,gBAAAA,EAAc,QAAO38B,EAAK,KACtB,uCACA;AAAA,YAEN,SAAS,MAAMq9B,EAAWr9B,CAAI;AAAA,YAE7B,UAAAA,EAAK;AAAA,UAAA;AAAA,UATDA,EAAK;AAAA,QAAA,CAWb;AAAA,MAAA,KAfO2U,CAgBV,CACD,GAEL;AAAA,MAECgoB,KACC,gBAAAr9B,GAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kCAAkC,UAAAo9B,EAAa,OAAM;AAAA,QACpE,gBAAAp9B,EAAC,OAAA,EAAI,WAAU,iCAAiC,YAAa,MAAA,CAAM;AAAA,MAAA,GACrE;AAAA,MAGF,gBAAAD,GAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAA,GAAC,SAAA,EAAM,UAAA;AAAA,UAAA;AAAA,UAEL,gBAAAC;AAAA,YAACqF;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAOs3B,KAAgB,OAAO,OAAOA,CAAY,IAAI;AAAA,cACrD,aAAY;AAAA,cACZ,YAAU;AAAA,cACV,SAASiB,EAAc,IAAI,CAAC11B,OAAO;AAAA,gBACjC,OAAO,OAAOA,EAAE,QAAQ;AAAA,gBACxB,OAAO,GAAGA,EAAE,KAAK,MAAMA,EAAE,KAAK;AAAA,cAAA,EAC9B;AAAA,cACF,UAAU,CAAChB,MAAS21B,EAAa31B,IAAO,OAAOA,CAAI,IAAI,IAAI;AAAA,YAAA;AAAA,UAAA;AAAA,QAC7D,GACF;AAAA,2BACC,SAAA,EAAM,UAAA;AAAA,UAAA;AAAA,UAEL,gBAAAlH;AAAA,YAACqF;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAOu3B,KAAc,OAAO,OAAOA,CAAU,IAAI;AAAA,cACjD,aAAY;AAAA,cACZ,YAAU;AAAA,cACV,SAASgB,EAAc,IAAI,CAAC11B,OAAO;AAAA,gBACjC,OAAO,OAAOA,EAAE,QAAQ;AAAA,gBACxB,OAAO,GAAGA,EAAE,KAAK,MAAMA,EAAE,KAAK;AAAA,cAAA,EAC9B;AAAA,cACF,UAAU,CAAChB,MAAS41B,EAAW51B,IAAO,OAAOA,CAAI,IAAI,IAAI;AAAA,YAAA;AAAA,UAAA;AAAA,QAC3D,GACF;AAAA,QACA,gBAAAnH,GAAC,SAAA,EAAM,WAAU,gCACf,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS+8B;AAAA,cACT,UAAU,CAACn1B,MAAMo1B,EAAuBp1B,EAAE,OAAO,OAAO;AAAA,YAAA;AAAA,UAAA;AAAA,UACxD;AAAA,QAAA,GAEJ;AAAA,QACCmM,KACC,gBAAA/T,EAAC,OAAA,EAAI,WAAU,gCACZ,UAAA+T,EAAM,aAAa,SAAS,IACzB,GAAGA,EAAM,aAAa,MAAM,qBAC5B,aAAA,CACN;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AC5PO,SAASiqB,GAAiB;AAAA,EAC/B,aAAAC;AAAA,EACA,WAAAtvB;AAAA,EACA,eAAAD;AAAA,EACA,MAAArD,IAAO;AAAA,EACP,SAAA6yB;AAAA,EACA,SAAAC;AACF,GAOG;AACD,QAAM,CAACC,GAAgBC,CAAiB,IAAIh4B,GAAS,EAAE,GACjDi4B,IACJL,EAAY,SAAS,WAAWA,EAAY,cAAc,OACtDtvB,EAAU,KAAK,CAAClO,MAASA,EAAK,OAAOw9B,EAAY,UAAU,KAAK,OAChE,MAEAp5B,IAAUiC;AAAA,IACd,MAAMy3B,GAA2B5vB,GAAWsvB,EAAY,UAAU;AAAA,IAClE,CAACA,EAAY,YAAYtvB,CAAS;AAAA,EAAA;AAepC,MAZAjH,GAAU,MAAM;AACd,IAAA22B,EAAkB,EAAE;AAAA,EACtB,GAAG,CAACJ,EAAY,OAAO,CAAC,GAExBv2B,GAAU,MAAM;AACd,UAAMI,IAAQ,CAACF,MAAqB;AAClC,MAAIA,EAAE,QAAQ,YAAUs2B,EAAA;AAAA,IAC1B;AACA,oBAAS,iBAAiB,WAAWp2B,CAAK,GACnC,MAAM,SAAS,oBAAoB,WAAWA,CAAK;AAAA,EAC5D,GAAG,CAACo2B,CAAO,CAAC,GAER,OAAO,WAAa,IAAa,QAAO;AAE5C,QAAMM,IAAOF,KAAA,QAAAA,EAAU,UACnB/qB,GAAgB+qB,EAAS,SAAS5vB,CAAa,IAC/C,MACE+vB,IAAc,GAClBH,MACGE,KACCF,EAAS,QACTA,EAAS,YACTA,EAAS,SACTA,EAAS,eAETI,IAAaC,GAA2BtzB,GAAM4yB,CAAW,GACzDW,IAAgBF,EAAW,iBAAiB,CAACN,GAC7CS,IAAWH,EAAW,qBAAqBA,EAAW;AAE5D,SAAOp2B;AAAA,IACL,gBAAAtI;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAK;AAAA,QACL,aAAa,CAAC4H,MAAM;AAClB,UAAIA,EAAE,WAAWA,EAAE,iBAAes2B,EAAA;AAAA,QACpC;AAAA,QAEA,UAAA,gBAAAn+B;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAW;AAAA,YACX,mBAAgB;AAAA,YAEhB,UAAA;AAAA,cAAA,gBAAAC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,cAAW;AAAA,kBACX,SAASk+B;AAAA,kBAET,UAAA,gBAAAn+B,GAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,eAAW,IACzD,UAAA;AAAA,oBAAA,gBAAAC,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,OAAA,CAAO;AAAA,oBAC3C,gBAAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,GAAE;AAAA,wBACF,QAAO;AAAA,wBACP,aAAY;AAAA,wBACZ,eAAc;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAChB,EAAA,CACF;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEF,gBAAAD,GAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,gBAAA,gBAAAC,EAAC,SAAI,WAAU,iCACZ,cACC,gBAAAD,GAAC,OAAA,EAAI,WAAU,kCACZ,UAAA;AAAA,kBAAAy+B,IACC,gBAAAx+B,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA,gBAAAA,EAAC,OAAA,EAAI,KAAKw+B,GAAM,MAAKF,KAAA,gBAAAA,EAAU,SAAQ,GAAA,CAAI,GAC7C,IACE;AAAA,kBACJ,gBAAAv+B,GAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,oBAAA,gBAAAA,GAAC,OAAA,EAAI,IAAG,8BACN,UAAA;AAAA,sBAAA,gBAAAC,EAAC,OAAE,UAAA,YAAA,CAAS;AAAA,sBAAI;AAAA,sBAAEs+B,KAAA,gBAAAA,EAAU;AAAA,oBAAA,GAC9B;AAAA,oBACCA,KAAA,QAAAA,EAAU,WACT,gBAAAv+B,GAAC,OAAA,EACC,UAAA;AAAA,sBAAA,gBAAAC,EAAC,OAAE,UAAA,YAAA,CAAS;AAAA,sBAAI;AAAA,sBAAEs+B,EAAS;AAAA,oBAAA,EAAA,CAC7B,IACE;AAAA,oBACHA,KAAA,QAAAA,EAAU,QACT,gBAAAv+B,GAAC,OAAA,EACC,UAAA;AAAA,sBAAA,gBAAAC,EAAC,OAAE,UAAA,SAAA,CAAM;AAAA,sBAAK;AAAA,sBACd,gBAAAA,EAAC,KAAA,EAAE,MAAM,OAAOs+B,EAAS,KAAK,IAC3B,UAAAQ,GAAoBR,EAAS,KAAK,EAAA,CACrC;AAAA,oBAAA,EAAA,CACF,IACE;AAAA,oBACHA,KAAA,QAAAA,EAAU,cACT,gBAAAt+B;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,yBAAyB,EAAE,QAAQs+B,EAAS,YAAA;AAAA,sBAAY;AAAA,oBAAA,IAExD;AAAA,kBAAA,EAAA,CACN;AAAA,gBAAA,EAAA,CACF,IAEA,gBAAAt+B;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,IAAG;AAAA,oBACH,WAAU;AAAA,oBAET,UAAAi+B,EAAY;AAAA,kBAAA;AAAA,gBAAA,GAGnB;AAAA,gBACCY,IACC,gBAAA9+B;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,UAAU,CAAC6H,MAAM;AAEf,0BADAA,EAAE,eAAA,GACEg3B,EAAe;AACnB,4BAAM19B,IAAK,OAAOk9B,CAAc;AAChC,sBAAI,OAAO,SAASl9B,CAAE,KAAKA,IAAK,OAAWA,CAAE;AAAA,oBAC/C;AAAA,oBAEC,UAAA;AAAA,sBAAAw9B,EAAW,oBACV,gBAAA1+B;AAAA,wBAACqF;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,OAAO+4B;AAAA,0BACP,aAAY;AAAA,0BACZ,YAAU;AAAA,0BACV,SAAAv5B;AAAA,0BACA,UAAUw5B;AAAA,wBAAA;AAAA,sBAAA,IAEV;AAAA,sBACHK,EAAW,YACV,gBAAA3+B;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAU;AAAA,0BACV,gBAAc2+B,EAAW,gBAAgB;AAAA,0BACzC,UAAUA,EAAW,eAAe,IAAI;AAAA,0BAExC,UAAA;AAAA,4BAAA,gBAAA1+B;AAAA,8BAAC;AAAA,8BAAA;AAAA,gCACC,MAAK;AAAA,gCACL,WAAU;AAAA,gCACV,UAAU4+B;AAAA,gCACV,oBACEF,EAAW,eACP,oCACA;AAAA,gCAEP,UAAA;AAAA,8BAAA;AAAA,4BAAA;AAAA,4BAGAA,EAAW,eACV,gBAAA1+B;AAAA,8BAAC;AAAA,8BAAA;AAAA,gCACC,IAAG;AAAA,gCACH,WAAU;AAAA,gCAET,UAAA0+B,EAAW;AAAA,8BAAA;AAAA,4BAAA,IAEZ;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAAA,IAEJ;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA,IAEJ;AAAA,cAAA,EAAA,CACN;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,EAAA;AAEb;AClMO,SAASK,GAAa;AAAA,EAC3B,SAAAC;AACF,GAEG;AACD,SAAKA,IAEH,gBAAAh/B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,OAAO,EAAE,MAAMg/B,EAAQ,GAAG,KAAKA,EAAQ,EAAA;AAAA,MAEvC,UAAA,gBAAAj/B,GAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,kCAAkC,UAAAg/B,EAAQ,MAAK;AAAA,QAC/D,gBAAAh/B,EAAC,QAAA,EAAK,WAAU,kCAAiC,eAAY,OAAA,CAAO;AAAA,MAAA,EAAA,CACtE;AAAA,IAAA;AAAA,EAAA,IAViB;AAavB;AChBA,eAAsBi/B,GACpBC,GACAC,GACAvsB,GAC8B;AAC9B,QAAM3G,IAAOizB,EAAU,QAAQ,OAAO,EAAE,GAClCE,IAAiB,CAAA;AACvB,MAAIC,IAAO;AACX,SAAO,EAACzsB,KAAA,QAAAA,EAAQ,YAAS;AACvB,UAAM0sB,IAAS,IAAI,gBAAgB;AAAA,MACjC,OAAO;AAAA,MACP,MAAM,OAAOD,CAAI;AAAA,IAAA,CAClB;AACD,IAAIF,KAAY,QAAQA,IAAW,KACjCG,EAAO,IAAI,aAAa,OAAOH,CAAQ,CAAC;AAE1C,UAAMhQ,IAAM,MAAM,MAAM,GAAGljB,CAAI,iBAAiBqzB,CAAM,IAAI;AAAA,MACxD,aAAa;AAAA,MACb,QAAA1sB;AAAA,IAAA,CACD;AACD,QAAI,CAACuc,EAAI,GAAI;AACb,UAAMoQ,IAAQ,MAAMpQ,EAAI,KAAA,GAClBmO,IAAQ,MAAM,QAAQiC,EAAK,KAAK,IAClCA,EAAK,QACL,MAAM,QAAQA,CAAI,IAChBA,IACA,CAAA;AACN,IAAAH,EAAI,KAAK,GAAG9B,CAAK;AACjB,UAAMkC,IAAQ,OAAOD,EAAK,SAAU,WAAWA,EAAK,QAAQH,EAAI;AAChE,QAAIA,EAAI,UAAUI,KAASlC,EAAM,SAAS,IAAK;AAC/C,IAAA+B,KAAQ;AAAA,EACV;AACA,SAAOD,EACJ,IAAIK,EAA4B,EAChC,OAAO,CAACh/B,MAAoCA,KAAQ,IAAI;AAC7D;ACsEA,eAAei/B,GACbR,GACAC,GACAQ,GACA/sB,GAC4B;AAC5B,QAAM3G,IAAOizB,EAAU,QAAQ,OAAO,EAAE,GAClCI,IAAS,IAAI,gBAAA;AACnB,EAAIH,KAAY,QAAQA,IAAW,OAAU,IAAI,aAAa,OAAOA,CAAQ,CAAC,GAC1EQ,KAAOL,EAAO,IAAI,SAAS,GAAG;AAClC,QAAMM,IAAKN,EAAO,SAAA,GACZnQ,IAAM,MAAM,MAAM,GAAGljB,CAAI,mBAAmB2zB,IAAK,IAAIA,CAAE,KAAK,EAAE,IAAI;AAAA,IACtE,aAAa;AAAA,IACb,QAAAhtB;AAAA,EAAA,CACD;AACD,MAAI,CAACuc,EAAI;AACP,UAAM,IAAI,MAAM,gCAAgCA,EAAI,MAAM,GAAG;AAE/D,SAAOA,EAAI,KAAA;AACb;AAEO,SAAS0Q,GAAUC,GAAuB;AAC/C,EAAAr7B,GAAA;AACA,QAAM;AAAA,IACJ,UAAUs7B;AAAA,IACV,WAAAb;AAAA,IACA,UAAAC;AAAA,IACA,MAAA9zB,IAAO;AAAA,IACP,SAAA20B,IAAU;AAAA,IACV,oBAAAC,IAAqB;AAAA,IACrB,gBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,WAAAC;AAAA,IACA,OAAA3lB;AAAA,IACA,eAAe4lB;AAAA,IACf,qBAAAxhC;AAAA,IACA,eAAAyhC,IAAgB;AAAA,IAChB,eAAA7xB;AAAA,IACA,iBAAAosB,IAAkB;AAAA,IAClB,kBAAArvB;AAAA,IACA,gBAAAD,IAAiB;AAAA,IACjB,YAAAg1B;AAAA,IACA,QAAQC;AAAA,IACR,eAAAC,IAAgB;AAAA,IAChB,gBAAApK;AAAA,IACA,eAAAC;AAAA,EAAA,IACEuJ,GAEE,CAACa,GAAQC,CAAM,IAAIv6B,GAAmC05B,KAAgB,IAAI,GAC1ElF,IAAM/zB;AAAA,IACV,MAAO65B,IAASE,GAA2BF,CAAM,IAAI;AAAA,IACrD,CAACA,CAAM;AAAA,EAAA,GAEH,CAAChtB,IAAOmtB,CAAQ,IAAIz6B,GAAwB,IAAI,GAChD,CAAC0N,GAAOgtB,CAAQ,IAAI16B,GAA4B,IAAI,GACpD,CAACs2B,GAAcqE,CAAe,IAAI36B,GAAwB,IAAI,GAC9D,CAACu2B,GAAYqE,CAAa,IAAI56B,GAAwB,IAAI,GAC1D,CAAC02B,GAAgBmE,EAAiB,IAAI76B,GAAS,EAAK,GACpD,CAAC86B,IAAgBC,EAAiB,IAAI/6B,GAAwB,IAAI,GAClE,CAACg7B,IAAkBC,CAAmB,IAAIj7B,GAAS,EAAK,GACxD,CAACk7B,GAAcC,CAAe,IAAIn7B;AAAA,IACtC;AAAA,EAAA,GAEI,CAACo7B,GAAkBC,CAAmB,IAAIr7B,GAE9C,IAAI,GACA,CAACs7B,GAAiBC,CAAkB,IAAIv7B,GAAwB,MAC/D05B,IACE8B,GAAqBhB,GAA2Bd,CAAY,EAAE,MAAM,IADjD,IAE3B,GACK+B,IAAYh8B,GAA+B,IAAI,GAC/Ci8B,IAAgBj8B,GAAuB,IAAI,GAC3Ck8B,IAAoBl8B,GAAmD;AAAA,IAC3E,MAAM;AAAA,IACN,IAAI;AAAA,EAAA,CACL,GACK,CAACm8B,GAAeC,CAAgB,IAAI77B,GAAS,IAAI,GACjDxH,IAAgByhC,KAAqBqB,GACrCQ,IAAmB,CAACjhC,MAAsB;AAC9C,IAAA0gC,EAAmB1gC,CAAE,GACjBA,KAAM,SAAMpC,KAAA,QAAAA,EAAsBoC;AAAA,EACxC;AAEA,EAAAwG,GAAU,MAAM;AACd,QAAIq4B,GAAc;AAChB,MAAAa,EAAOb,CAAY;AACnB;AAAA,IACF;AACA,QAAI,CAACb,EAAW;AAChB,QAAIjQ,IAAY;AAChB,UAAM5b,KAAa,IAAI,gBAAA,GACjBssB,KAAQyC,GAAa/2B,CAAI,EAAE;AACjC,WAAAq0B,GAAcR,GAAWC,GAAUQ,IAAOtsB,GAAW,MAAM,EACxD,KAAK,CAAC+I,OAAM;AACX,MAAK6S,KAAW2R,EAAOxkB,EAAC;AAAA,IAC1B,CAAC,EACA,MAAM,CAACxU,OAAM;AACZ,MACE,CAACqnB,KACD,EAAErnB,cAAa,gBAAgBA,GAAE,SAAS,iBAE1Ck5B,EAASl5B,cAAa,QAAQA,GAAE,UAAU,OAAOA,EAAC,CAAC;AAAA,IAEvD,CAAC,GACI,MAAM;AACX,MAAAqnB,IAAY,IACZ5b,GAAW,MAAA;AAAA,IACb;AAAA,EACF,GAAG,CAAC0sB,GAAcb,GAAWC,GAAU9zB,CAAI,CAAC,GAE5C3D,GAAU,MAAM;AACd,UAAMN,IAAK26B,EAAc;AACzB,QAAI,CAAC36B,EAAI;AACT,UAAMi7B,KAAK,IAAI,eAAe,CAACC,OAAY;;AACzC,YAAM94B,MAAQrI,KAAAmhC,GAAQ,CAAC,MAAT,gBAAAnhC,GAAY,YAAY;AACtC,MAAIqI,MAASA,KAAQ,KAAG04B,EAAiB14B,EAAK;AAAA,IAChD,CAAC;AACD,WAAA64B,GAAG,QAAQj7B,CAAE,GACN,MAAMi7B,GAAG,WAAA;AAAA,EAClB,GAAG,CAACxH,GAAKxvB,CAAI,CAAC,GAEd3D,GAAU,MAAM;AACd,UAAM66B,IAASH,GAAa/2B,CAAI;AAChC,QAAK,CAACk3B,EAAO,cAAc,CAACA,EAAO,gBAAiB,CAACrD,EAAW;AAChE,QAAIjQ,KAAY;AAChB,UAAM5b,KAAa,IAAI,gBAAA;AACvB,WAAA4rB,GAAsBC,GAAWC,GAAU9rB,GAAW,MAAM,EACzD,KAAK,CAACiqB,OAAU;AACf,MAAKrO,MAAWyS,EAAoBpE,EAAK;AAAA,IAC3C,CAAC,EACA,MAAM,MAAM;AACX,MAAKrO,MAAWyS,EAAoB,EAAE;AAAA,IACxC,CAAC,GACI,MAAM;AACX,MAAAzS,KAAY,IACZ5b,GAAW,MAAA;AAAA,IACb;AAAA,EACF,GAAG,CAAC6rB,GAAWC,GAAU9zB,CAAI,CAAC,GAE9B3D,GAAU,MAAM;;AACd,QAAI,CAACmzB,EAAK;AACV,UAAM12B,IAAM,IAAI,IAAI02B,EAAI,OAAO,IAAI,CAACt7B,OAAUA,GAAM,EAAE,CAAC;AACvD,KAAIV,KAAiB,QAAQ,CAACsF,EAAI,IAAItF,CAAa,MACjDsjC,EAAiBN,GAAqBhH,EAAI,MAAM,CAAC;AAEnD,UAAM2H,yBAAY,IAAA;AAClB,eAAWjjC,MAASs7B,EAAI;AACtB,iBAAWp3B,MAASlE,GAAM;AACxB,YAAIkE,GAAM,SAAS,eAAatC,KAAAsC,GAAM,eAAN,gBAAAtC,GAAkB,cAAa,MAAM;AACnE,gBAAMq8B,KAAU3C,EAAI,UAAU,KAAK,CAAChmB,OAAMA,GAAE,OAAOpR,GAAM,WAAY,SAAS;AAC9E,UAAI+5B,MAASgF,GAAM,IAAIhF,GAAQ,IAAI;AAAA,QACrC;AAGJ,IAAA2C,KAAA,QAAAA,EAAuB,MAAM,KAAKqC,EAAK;AAAA,EACzC,GAAG,CAAC3H,GAAKh8B,GAAeshC,CAAoB,CAAC,GAG7Cz4B,GAAU,MAAM;;AACd,QAAI,GAACmzB,KAAOoF,KAAsB;AAClC,iBAAW1gC,MAASs7B,EAAI;AACtB,mBAAWp3B,MAASlE,GAAM;AACxB,gBAAI4B,IAAAsC,GAAM,eAAN,gBAAAtC,EAAkB,gBAAe8+B,GAAoB;AACvD,YAAAkC;AAAA,cACEM,GAA8B5H,EAAI,QAAQh8B,GAAeU,GAAM,EAAE;AAAA,YAAA;AAEnE;AAAA,UACF;AAAA;AAAA,EAGN,GAAG,CAACs7B,GAAKoF,CAAkB,CAAC;AAE5B,QAAMpM,IAAgB/sB,GAAQ,MACxBq6B,MAAkB,OAAa,CAACA,EAAc,IAC9C11B,KAAoBA,EAAiB,SAAS,IAAUA,IACrDqvB,KAAmB,OAAO,CAACA,CAAe,IAAI,CAAA,GACpD,CAACA,GAAiBrvB,GAAkB01B,EAAc,CAAC,GAChDuB,IAAe1P,GAAkBa,CAAa,GAC9C8O,IACJD,KAAgB,OACZ,OACAlC,KAAc,OACZ,GAAGkC,CAAY,IAAIlC,CAAU,KAC7BkC,GACFE,KAAuB97B,GAAQ,MAC/B,CAAC+zB,KAAOhH,EAAc,WAAW,IAAU,OAExCX,GAAyB2H,EAAI,QAAQhH,CAAa,GACxD,CAACgH,GAAKhH,CAAa,CAAC,GACjBgP,KAAc/7B;AAAA,IAClB,MAAO+zB,IAAMiI,GAAsBjI,GAAKxvB,GAAM20B,CAAO,IAAI;AAAA,IACzD,CAACnF,GAAKxvB,GAAM20B,CAAO;AAAA,EAAA,GAEf+C,KAAmBj8B,GAAQ,MAC3B,CAAC+zB,KAAO,CAAC9mB,IAAc,OACpByf,GAAwBqH,EAAI,QAAQ9mB,GAAOlV,CAAa,GAC9D,CAACA,GAAeg8B,GAAK9mB,CAAK,CAAC,GACxBivB,KAAgBjvB,IAClB,SAASlV,KAAiB,MAAM,IAAIkV,EAAM,UAAU,KAAK,GAAG,CAAC,KAC7D,MACEkiB,KAAWyK,IACb,OACAsC,MAAiBL,GACfzM,KAAkBwK,IAAgB,OAAOqC,MAAoBH,IAC7DK,KAAiBxC,KAAcyC,GAAe73B,GAAM42B,CAAa,GACjEkB,KAAetI,IACjBuI,GAAuBvI,EAAI,qBAAqBh8B,GAAeokC,EAAc,IAC7E,MACE9M,KAAWgN,KAAeE,GAAqBF,EAAY,IAAI,MAC/D/M,KAAckN;AAAA,IAClBzkC;AAAA,IACAokC;AAAA,IACAvC;AAAA,EAAA;AAIF,EAAAh5B,GAAU,MAAM;AACd,IAAI,CAAC06B,GAAa/2B,CAAI,EAAE,eAAe,CAACw3B,OACxC7B,EAAgB6B,GAAY,QAAQ,GACpCV,EAAiBU,GAAY,OAAO;AAAA,EAGtC,GAAG,CAACx3B,GAAMw3B,EAAW,CAAC;AAEtB,QAAMU,KAAWz8B,GAAQ,MAClB+zB,IACE2I;AAAA,IACL3I,EAAI,MAAM,MAAM,IAAI,CAACrZ,OAAO;AAAA,MAC1B,IAAIA,EAAE;AAAA,MACN,SAASA,EAAE;AAAA,MACX,SAASA,EAAE;AAAA,MACX,MAAMA,EAAE;AAAA,MACR,GAAGA,EAAE;AAAA,MACL,GAAGA,EAAE;AAAA,MACL,aAAaA,EAAE;AAAA,IAAA,EACf;AAAA,IACFqZ,EAAI,MAAM,MAAM,IAAI,CAACjzB,OAAO;AAAA,MAC1B,IAAIA,EAAE;AAAA,MACN,OAAOizB,EAAI;AAAA,MACX,cAAcjzB,EAAE;AAAA,MAChB,YAAYA,EAAE;AAAA,MACd,QAAQA,EAAE;AAAA,MACV,UAAUA,EAAE;AAAA,MACZ,YAAYA,EAAE;AAAA,MACd,MAAMA,EAAE;AAAA,IAAA,EACR;AAAA,IACFizB,EAAI;AAAA,EAAA,IArBW,MAuBhB,CAACA,CAAG,CAAC,GAEF4I,KAAmB38B,GAAQ,MAC1B+zB,IACE6I;AAAA,IACL7I;AAAA,IACA4G,KAAoBA,EAAiB,SAAS,IAC1CA,IACA5G,EAAI;AAAA,EAAA,IALO,CAAA,GAOhB,CAACA,GAAK4G,CAAgB,CAAC,GAEpBkC,KAAiB78B,GAAQ,MACzB26B,KAAoBA,EAAiB,SAAS,IAAUA,KACrD5G,KAAA,gBAAAA,EAAK,cAAa,CAAA,GACxB,CAACA,KAAA,gBAAAA,EAAK,WAAW4G,CAAgB,CAAC,GAE/BmC,KAAqB58B;AAAA,IACzB,CACEE,GACAm1B,OACG;AACH,MAAAmF,EAAgB,CAAC9sB,OACXxN,OACAm1B,MAAA,gBAAAA,GAAM,mBAAkB,QACnB3nB,MAAA,gBAAAA,GAAS,aAAY2nB,GAAK,iBAAiB,OAAO3nB,KAEpD,KACR;AAAA,IACH;AAAA,IACA,CAAA;AAAA,EAAC;AAGH,EAAAhN,GAAU,MAAM;AACd,IAAA85B,EAAgB,IAAI;AAAA,EACtB,GAAG,CAACn2B,GAAMxM,GAAewiC,EAAgB,CAAC;AAE1C,QAAMwC,KAAyB/8B,GAAQ,MACjC,CAAC+zB,KAAOsG,MAAkB,OAAa,OACpC2C,GAAmBjJ,GAAKsG,EAAc,GAC5C,CAACtG,GAAKsG,EAAc,CAAC,GAElB4C,KAAW,CAACC,GAAuBC,OAAwB;AAC/D,UAAMC,KAAYlwB;AAAA,MAChBguB,EAAkB,QAAQ;AAAA,MAC1BA,EAAkB,QAAQ;AAAA,MAC1BgC;AAAA,MACAC;AAAA,IAAA;AAGF,QADAjC,EAAkB,UAAU,EAAE,MAAMgC,GAAQ,IAAIC,GAAA,GAC5C,CAACV,MAAYS,KAAU,QAAQC,MAAQ,MAAM;AAC/C,MAAAlD,EAAS,IAAI;AACb;AAAA,IACF;AACA,UAAMhgB,KAASojB,GAAsBZ,IAAU,CAACS,CAAM,GAAG,CAACC,EAAI,GAAG;AAAA,MAC/D,gBAAAlH;AAAA,IAAA,CACD;AAGD,QAFAgE,EAAShgB,EAAM,GAEXmjB,IAAW;AACb,YAAME,KAAgBtwB,GAAmBiN,EAAM;AAC/C,MAAIqjB,MAAiB,QAAMjC,EAAiBiC,EAAa;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA18B,GAAU,MAAM;AACd,IAAAq8B,GAASpH,GAAcC,CAAU;AAAA,EAEnC,GAAG,CAACD,GAAcC,GAAYG,GAAgBwG,EAAQ,CAAC;AAGvD,QAAMc,KAAmBr9B;AAAA,IACvB,CAACpD,MAA0B;;AACzB,YAAM0gC,KAAQC,GAAiB;AAAA,QAC7B,MAAA3gC;AAAA,QACA,aAAAi/B;AAAA,QACA,eAAAhkC;AAAA,QACA,gBAAgBg8B,IAAMgH,GAAqBhH,EAAI,MAAM,IAAI;AAAA,MAAA,CAC1D;AACD,MAAAoG,EAAc,IAAI,GAClBF,EAAS,IAAI,GACbO,EAAoB,EAAK,GACzBF,GAAkB,IAAI,GACtBJ,EAAgBsD,GAAM,YAAY,GAC9BA,GAAM,eAAe,QACvBnC,EAAiBmC,GAAM,WAAW,GAEhCA,GAAM,iBACRnjC,KAAA2gC,EAAU,YAAV,QAAA3gC,GAAmB;AAAA,IAEvB;AAAA,IACA,CAACtC,GAAeg8B,GAAKgI,EAAW;AAAA,EAAA;AAGlC,EAAAn7B,GAAU,MAAM;AACd,QAAI,CAAC04B,KAAkB,CAACvF,EAAK;AAC7B,UAAM2J,IAAW;AAAA,MACf,mBAAmBC,IAAoB;AACrC,cAAMC,KAAQC;AAAA,UACZ9J,EAAI;AAAA,UACJ,CAACp3B,OAAA;;AAAU,qBAAAtC,KAAAsC,GAAM,eAAN,gBAAAtC,GAAkB,gBAAesjC;AAAA;AAAA,QAAA;AAE9C,YAAIC,GAAM,WAAW,GACrB;AAAA,cAAInB,MAAY5G,KAAgB,MAAM;AACpC,kBAAMiI,KAAUT;AAAA,cACdZ;AAAA,cACA,CAAC5G,CAAY;AAAA,cACb+H;AAAA,cACA,EAAE,gBAAA3H,EAAA;AAAA,YAAe,GAEb8H,KAAsBD,MAAA,gBAAAA,GAAS,UAAU,GAAG;AAClD,gBAAIC,MAAuB,MAAM;AAC/B,cAAA5D,EAAc4D,EAAmB;AACjC;AAAA,YACF;AAAA,UACF;AACA,UAAA5D,EAAcyD,GAAM,CAAC,CAAC;AAAA;AAAA,MACxB;AAAA,MACA,qBAAqBI,IAAqB;AACxC,cAAMtH,KAAU3C,EAAI,UAAU,KAAK,CAAChmB,OAAMA,GAAE,SAASiwB,EAAW;AAChE,YAAI,CAACtH,MAAW,CAAC+F,MAAY5G,KAAgB,KAAM;AACnD,cAAMoI,KAAYJ;AAAA,UAChB9J,EAAI;AAAA,UACJ,CAACp3B,OAAA;;AAAU,qBAAAtC,KAAAsC,GAAM,eAAN,gBAAAtC,GAAkB,eAAcq8B,GAAQ;AAAA;AAAA,QAAA,GAE/CoH,KAAUI,GAAuBzB,IAAU5G,GAAcoI,IAAW;AAAA,UACxE,gBAAAhI;AAAA,QAAA,CACD,GACK8H,KAAsBD,MAAA,gBAAAA,GAAS,UAAU,GAAG;AAClD,QAAIC,MAAuB,QAAM5D,EAAc4D,EAAmB;AAAA,MACpE;AAAA,MACA,aAAa;AACX,QAAA5D,EAAc,IAAI,GAClBF,EAAS,IAAI;AAAA,MACf;AAAA,MACA,WAAW;AACT,QAAAsD,GAAiB,MAAM;AAAA,MACzB;AAAA,IAAA;AAEF,WAAAjE,EAAe,UAAUoE,GAClB,MAAM;AACX,MAAIpE,EAAe,YAAYoE,MAAUpE,EAAe,UAAU;AAAA,IACpE;AAAA,EACF,GAAG;AAAA,IACDrD;AAAA,IACAl+B;AAAA,IACAwlC;AAAA,IACAd;AAAA,IACAnD;AAAA,IACAvF;AAAA,IACA8B;AAAA,EAAA,CACD;AAED,QAAMjvB,KAAuBu3B,GAAWpK,KAAA,gBAAAA,EAAK,OAAOqF,CAAc;AAElE,MAAIvsB;AACF,WACE,gBAAA3T,EAAC,OAAA,EAAI,WAAW,4CAA4CqgC,KAAa,EAAE,IAAI,OAAA3lB,GAC7E,UAAA,gBAAA1a,EAAC,OAAA,EAAI,WAAU,2BAA2B,cAAM,GAClD;AAIJ,MAAI,CAAC66B;AACH,WACE,gBAAA76B,EAAC,OAAA,EAAI,WAAW,8CAA8CqgC,KAAa,EAAE,IAAI,OAAA3lB,GAC/E,UAAA,gBAAA1a,EAAC,OAAA,EAAI,WAAU,6BAA4B,0BAAY,GACzD;AAIJ,QAAMklC,KAAyCrK,EAAI,UAAU;AAAA,IAC3D,CAAChmB,MACC/T,GAAgB+T,EAAE,IAAI,KACtBgmB,EAAI,OAAO;AAAA,MAAK,CAACve,OACfA,GAAE,OAAO,KAAK,CAAC9M,OAAA;;AAAM,iBAAArO,KAAAqO,GAAE,eAAF,gBAAArO,GAAc,eAAc0T,EAAE;AAAA,OAAE;AAAA,IAAA;AAAA,EACvD,GAEE0tB,KAAS7B,IACX,EAAE,GAAG0B,GAAa/2B,CAAI,GAAG,YAAY,IAAO,cAAc,OAC1D+2B,GAAa/2B,CAAI,GAGf85B,KAAUC;AAAA,IACd1E,IAAgB,kBAAkBr1B;AAAA,IAClCwvB,EAAI;AAAA,EAAA;AAGN,SACE,gBAAA96B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,sCAAsCsL,CAAI,GAAG85B,KAAU,KAAK,0BAA0B,IAAI9E,KAAa,EAAE;AAAA,MACpH,OACE;AAAA,QACE,GAAG3lB;AAAA,QACF,YAAuBhN,GAAM;AAAA,MAAA;AAAA,MAIjC,UAAA;AAAA,QAACy3B,KAEE,OADF,gBAAAnlC,EAAC,OAAA,EAAI,WAAU,2BAA2B,cAAsB;AAAA,QAGjEmlC,OAAY5C,GAAO,UAAUA,GAAO,cACnC,gBAAAviC;AAAA,UAAC08B;AAAA,UAAA;AAAA,YACC,KAAA7B;AAAA,YACA,WAAWqK;AAAA,YACX,eAAArmC;AAAA,YACA,qBAAqBsjC;AAAA,YACrB,cAAAxF;AAAA,YACA,YAAAC;AAAA,YACA,cAAcoE;AAAA,YACd,YAAYC;AAAA,YACZ,gBAAAlE;AAAA,YACA,wBAAwBmE;AAAA,YACxB,OAAAntB;AAAA,YACA,YAAYwuB,GAAO;AAAA,YACnB,eAAeA,GAAO;AAAA,YACtB,kBAAkB70B,GAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAI3By3B,KACC,gBAAAnlC;AAAA,UAACrB;AAAA,UAAA;AAAA,YACC,QAAQk8B,EAAI;AAAA,YACZ,eAAAh8B;AAAA,YACA,qBAAqBsjC;AAAA,YACrB,UAAU,MAAA;;AAAM,sBAAAhhC,IAAA2gC,EAAU,YAAV,gBAAA3gC,EAAmB;AAAA;AAAA,YACnC,WAAW,MAAA;;AAAM,sBAAAA,IAAA2gC,EAAU,YAAV,gBAAA3gC,EAAmB;AAAA;AAAA,YACpC,SAAS,MAAMkjC,GAAiB,QAAQ;AAAA,YACxC,YAAY9B,GAAO;AAAA,YACnB,eAAeA,GAAO;AAAA,UAAA;AAAA,QAAA,IAEtB;AAAA,QAEH4C,KACC,gBAAAnlC,EAAC,OAAA,EAAI,KAAK+hC,GAAe,WAAU,4BACjC,UAAA,gBAAA/hC,EAACqlC,IAAA,EAAS,UAAU,MAClB,UAAA,gBAAArlC;AAAA,UAAC46B;AAAA,UAAA;AAAA,YACC,KAAAC;AAAA,YACA,OAAAntB;AAAA,YACA,MAAArC;AAAA,YACA,qBAAoBw3B,MAAA,gBAAAA,GAAa,YAAW;AAAA,YAC5C,eAAAhkC;AAAA,YACA,OAAAkV;AAAA,YACA,iBAAiB2sB,IAAgB,OAAOS,MAAkBrG;AAAA,YAC1D,kBAAkB4F,IAAgB,CAAA,IAAK7M;AAAA,YACvC,gBAAgB6M,IAAgB,OAAOl1B;AAAA,YACvC,UAAAyqB;AAAA,YACA,iBAAAC;AAAA,YACA,WAAW4L;AAAA,YACX,aAAaC;AAAA,YACb,eAAArzB;AAAA,YACA,UAAAynB;AAAA,YACA,aAAAC;AAAA,YACA,cAAcsK;AAAA,YACd,gBAAApK;AAAA,YACA,eAAAC;AAAA,YACA,gBAAgBmK,KAAiBpE,GAAsBjxB,CAAI;AAAA,YAC3D,WAAWs4B;AAAA,YACX,kBAAkBpB,GAAO;AAAA,YACzB,gBAAgBqB;AAAA,YAChB,qBAAqBzB;AAAA,YACrB,eAAe,CAACp/B,GAASC,IAASq5B,OAAS;;AACzC,kBAAIt5B,KAAW,MAAM;AACnB,gBAAIw/B,GAAO,eACTjB,EAAoB,EAAK,GACzBF,GAAkB,IAAI,KAExBjgC,KAAA2+B,EAAM,kBAAN,QAAA3+B,GAAA,KAAA2+B,GAAsB;AACtB;AAAA,cACF;AACA,oBAAMvgC,KAAQs7B,EAAI,OAAO,KAAK,CAACve,OAAMA,GAAE,OAAOtZ,EAAO,GAC/CS,KAAQlE,MAAA,gBAAAA,GAAO,OAAO,KAAK,CAACiQ,OAAMA,GAAE,OAAOzM;AACjD,kBAAIw/B,GAAO,cAAc+C,GAAuBj6B,GAAM5H,EAAK,GAAG;AAC5D,gBAAA29B,GAAkBr+B,CAAO,GACzBu+B,EAAoB,EAAI,GACnBjF,MAAA,QAAAA,GAAM,YACT8F;AAAA,kBACEM;AAAA,oBACE5H,EAAI;AAAA,oBACJh8B;AAAA,oBACAmE;AAAA,kBAAA;AAAA,gBACF,IAGJG,KAAA28B,EAAM,kBAAN,QAAA38B,GAAA,KAAA28B,GAAsB/8B,GAASs5B;AAC/B;AAAA,cACF;AACA,kBAAIkG,GAAO,YAAY;AACrB,iBAAAvS,KAAA8P,EAAM,kBAAN,QAAA9P,GAAA,KAAA8P,GAAsB/8B,GAASs5B;AAC/B;AAAA,cACF;AACA,kBAAIkE,GAAe;AACjB,sBAAMgF,KAAUC,IAAejmC,MAAA,gBAAAA,GAAO,YAAW,CAAA,GAAIwD,CAAO;AAC5D,oBAAI0iC,KAASF,GAAQ,CAAC;AACtB,gBAAIhC,MAAY5G,KAAgB,QAAQ4I,GAAQ,SAAS,MACvDE,OACEC,KAAAvB,GAAsBZ,IAAU,CAAC5G,CAAY,GAAG4I,IAAS;AAAA,kBACvD,gBAAAxI;AAAA,gBAAA,CACD,MAFD,gBAAA2I,GAEI,UAAU,GAAG,QAAOD,KAExBA,MAAU,QAAMxE,EAAcwE,EAAM;AAAA,cAC1C,MAAA,CAAYpJ,MAAA,QAAAA,GAAM,YAChB8F;AAAA,gBACEM,GAA8B5H,EAAI,QAAQh8B,GAAemE,EAAO;AAAA,cAAA;AAIpE,mBADA2iC,KAAA7F,EAAM,kBAAN,QAAA6F,GAAA,KAAA7F,GAAsB/8B,GAASs5B,KAC3B,EAACA,MAAA,QAAAA,GAAM,aAAYt5B,MAAY+3B,GAAiB;AAClD,sBAAMtC,KACJtF,GAAyB2H,EAAI,QAAQhH,CAAa,KAClDN,GAAwBsH,EAAI,QAAQ93B,CAAO;AAC7C,gBAAIy1B,QAAOoN,KAAA9D,EAAU,YAAV,QAAA8D,GAAmB,YAAYpN;AAAA,cAC5C;AAAA,YACF;AAAA,UAAA;AAAA,QAAA,EACF,CACF,GACF,IACE;AAAA,QAEH+J,GAAO,gBAAgB,CAAClB,uBACtBtC,IAAA,EAAa,SAASwC,GAAc,IACnC;AAAA,QAEHgB,GAAO,cAAclB,MAAoBwC,KACxC,gBAAA7jC;AAAA,UAACg+B;AAAA,UAAA;AAAA,YACC,aAAa6F;AAAA,YACb,WAAWJ;AAAA,YACX,eAAA/0B;AAAA,YACA,MAAArD;AAAA,YACA,SAAS,MAAMi2B,EAAoB,EAAK;AAAA,YACxC,SAAS,CAAClD,MAAmB;AAC3B,oBAAM57B,KAAOihC,GAAiB,KAAK,CAACoC,OAAMA,GAAE,OAAOzH,CAAc,GAC3Dl6B,KAAU4hC,GAAoBtjC,IAAMqhC,EAAsB;AAChE,cAAI3/B,OACF88B,EAAgB98B,GAAQ,YAAY,GACpC+8B,EAAc/8B,GAAQ,UAAU,GAChCo9B,EAAoB,EAAK;AAAA,YAE7B;AAAA,UAAA;AAAA,QAAA,IAEA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;","x_google_ignoreList":[16]}
|