@eyeon/map 2.0.15 → 2.0.17

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.
Files changed (95) hide show
  1. package/dist/assets/MapViewer.css +1 -1
  2. package/dist/assets/index.css +1 -1
  3. package/dist/chunks/MapViewer.js +2353 -2096
  4. package/dist/chunks/MapViewer.js.map +1 -1
  5. package/dist/chunks/responsive.js +2534 -0
  6. package/dist/chunks/responsive.js.map +1 -0
  7. package/dist/chunks/wheelZoom.js +162 -176
  8. package/dist/chunks/wheelZoom.js.map +1 -1
  9. package/dist/core/assignment.d.ts +19 -2
  10. package/dist/core/assignment.d.ts.map +1 -1
  11. package/dist/core/entranceIcon.d.ts +17 -3
  12. package/dist/core/entranceIcon.d.ts.map +1 -1
  13. package/dist/core/hostChrome.d.ts +13 -2
  14. package/dist/core/hostChrome.d.ts.map +1 -1
  15. package/dist/core/hoverTooltip.d.ts +37 -0
  16. package/dist/core/hoverTooltip.d.ts.map +1 -0
  17. package/dist/core/import/index.d.ts +10 -1
  18. package/dist/core/import/index.d.ts.map +1 -1
  19. package/dist/core/index.d.ts +3 -0
  20. package/dist/core/index.d.ts.map +1 -1
  21. package/dist/core/index.js +226 -185
  22. package/dist/core/layerStyles.d.ts +32 -0
  23. package/dist/core/layerStyles.d.ts.map +1 -1
  24. package/dist/core/outdoorDecoration.d.ts.map +1 -1
  25. package/dist/core/publicShapes.d.ts +14 -0
  26. package/dist/core/publicShapes.d.ts.map +1 -1
  27. package/dist/core/responsive.d.ts +6 -0
  28. package/dist/core/responsive.d.ts.map +1 -1
  29. package/dist/core/routing/graph-tools.d.ts +6 -5
  30. package/dist/core/routing/graph-tools.d.ts.map +1 -1
  31. package/dist/core/routing/pathfinding.d.ts +36 -0
  32. package/dist/core/routing/pathfinding.d.ts.map +1 -1
  33. package/dist/core/shapeFill.d.ts +40 -0
  34. package/dist/core/shapeFill.d.ts.map +1 -0
  35. package/dist/core/stacking.d.ts +4 -0
  36. package/dist/core/stacking.d.ts.map +1 -1
  37. package/dist/core/types.d.ts +14 -3
  38. package/dist/core/types.d.ts.map +1 -1
  39. package/dist/core/viewerReset.d.ts +24 -0
  40. package/dist/core/viewerReset.d.ts.map +1 -0
  41. package/dist/editor/MapEditor.d.ts.map +1 -1
  42. package/dist/editor/assignmentOverlay.d.ts +37 -0
  43. package/dist/editor/assignmentOverlay.d.ts.map +1 -0
  44. package/dist/editor/canvas/AssignedShapeOverlay.d.ts +8 -0
  45. package/dist/editor/canvas/AssignedShapeOverlay.d.ts.map +1 -0
  46. package/dist/editor/canvas/EditorCanvas.d.ts +6 -1
  47. package/dist/editor/canvas/EditorCanvas.d.ts.map +1 -1
  48. package/dist/editor/canvas/coords.d.ts +9 -0
  49. package/dist/editor/canvas/coords.d.ts.map +1 -1
  50. package/dist/editor/canvas/editorFill.d.ts.map +1 -1
  51. package/dist/editor/draftOps.d.ts.map +1 -1
  52. package/dist/editor/entranceIcon.d.ts +2 -2
  53. package/dist/editor/entranceIcon.d.ts.map +1 -1
  54. package/dist/editor/index.css +259 -29
  55. package/dist/editor/index.js +4780 -4355
  56. package/dist/editor/index.js.map +1 -1
  57. package/dist/editor/panels/AssignForm.d.ts +3 -1
  58. package/dist/editor/panels/AssignForm.d.ts.map +1 -1
  59. package/dist/editor/panels/BulkAssignForm.d.ts +3 -1
  60. package/dist/editor/panels/BulkAssignForm.d.ts.map +1 -1
  61. package/dist/editor/panels/ConnectorAssign.d.ts.map +1 -1
  62. package/dist/editor/panels/FloorsPanel.d.ts.map +1 -1
  63. package/dist/editor/panels/Inspector.d.ts +3 -1
  64. package/dist/editor/panels/Inspector.d.ts.map +1 -1
  65. package/dist/editor/panels/LeftRail.d.ts.map +1 -1
  66. package/dist/editor/routeStubs.d.ts +11 -0
  67. package/dist/editor/routeStubs.d.ts.map +1 -1
  68. package/dist/test-maps/LF - Shops At South Town.ai +4468 -1
  69. package/dist/test-maps/LF - Shops At South Town.svg +245 -0
  70. package/dist/viewer/MapViewer.d.ts.map +1 -1
  71. package/dist/viewer/camera.d.ts +10 -0
  72. package/dist/viewer/camera.d.ts.map +1 -1
  73. package/dist/viewer/components/CameraRig.d.ts.map +1 -1
  74. package/dist/viewer/components/LevelMeshes.d.ts +10 -2
  75. package/dist/viewer/components/LevelMeshes.d.ts.map +1 -1
  76. package/dist/viewer/components/MapScene.d.ts +5 -2
  77. package/dist/viewer/components/MapScene.d.ts.map +1 -1
  78. package/dist/viewer/components/RouteLine.d.ts +1 -8
  79. package/dist/viewer/components/RouteLine.d.ts.map +1 -1
  80. package/dist/viewer/components/SvgVectorLayer.d.ts +1 -1
  81. package/dist/viewer/components/SvgVectorLayer.d.ts.map +1 -1
  82. package/dist/viewer/index.css +242 -29
  83. package/dist/viewer/index.js +1 -1
  84. package/dist/viewer/pointer.d.ts +40 -4
  85. package/dist/viewer/pointer.d.ts.map +1 -1
  86. package/dist/viewer/routeFloorChanges.d.ts +35 -0
  87. package/dist/viewer/routeFloorChanges.d.ts.map +1 -0
  88. package/dist/viewer/ui/HoverTooltip.d.ts +6 -0
  89. package/dist/viewer/ui/HoverTooltip.d.ts.map +1 -0
  90. package/dist/viewer/ui/MapControls.d.ts.map +1 -1
  91. package/dist/viewer/ui/RuntimeChrome.d.ts +2 -1
  92. package/dist/viewer/ui/RuntimeChrome.d.ts.map +1 -1
  93. package/package.json +1 -1
  94. package/dist/chunks/stacking.js +0 -2243
  95. package/dist/chunks/stacking.js.map +0 -1
@@ -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/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/fetchWebsiteRetailers.ts","../../src/viewer/MapViewer.tsx"],"sourcesContent":["import React from 'react';\nimport type { StackLevel } from '../../core';\nimport {\n floorSwitcherDisplayLevels,\n hasBuildingFloors,\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 = showZoomReset && hasBuildingFloors(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 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;\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 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 } 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';\n\nconst ASSIGNED_CONNECTOR_ICON = '#0763b1';\nconst UNASSIGNED_CONNECTOR_ICON = '#94a3b8';\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: ConnectorSpecialKind,\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\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 type { ShapeKind } 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/** 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(kind: string): 'pointer' | '' {\n return isViewerSelectableKind(kind) ? '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/** Amenities are almost invisible; hover must still read. */\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\nfunction parseHex(hex: string): [number, number, number] | null {\n const h = hex.replace('#', '').trim();\n if (h.length === 3) {\n return [\n parseInt(h[0] + h[0], 16),\n parseInt(h[1] + h[1], 16),\n parseInt(h[2] + h[2], 16),\n ];\n }\n if (h.length !== 6) return null;\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n if ([r, g, b].some((n) => Number.isNaN(n))) return null;\n return [r, g, b];\n}\n\nfunction toHex(r: number, g: number, b: number): string {\n const hex = (n: number) =>\n Math.max(0, Math.min(255, Math.round(n)))\n .toString(16)\n .padStart(2, '0');\n return `#${hex(r)}${hex(g)}${hex(b)}`;\n}\n\n/** Tint a store fill toward the accent so hover matches Edit Map. */\nexport function viewerHoverFillColor(\n fill: string,\n accent: string,\n hovered: boolean,\n amount = 0.2,\n): string {\n if (!hovered) return fill;\n const a = parseHex(fill);\n const b = parseHex(accent);\n if (!a || !b) return fill;\n return toHex(\n a[0] + (b[0] - a[0]) * amount,\n a[1] + (b[1] - a[1]) * amount,\n a[2] + (b[2] - a[2]) * amount,\n );\n}\n\n/** Pan farther than this and a pointer-up on empty space is not a clear. */\nexport const VIEWER_CLICK_DRAG_PX = 5;\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 ThemeDefaults,\n ShapeKind,\n} from '../../core';\nimport {\n assignmentOverlayImageUrl,\n assignmentOverlayRenderSize,\n assignmentOverlayVisible,\n connectorIconLayout,\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 resolvedAssignmentBgColor,\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 isViewerSelectableKind,\n viewerHoverCursor,\n viewerHoverFillColor,\n viewerHoverFillOpacity,\n resolvedViewerHoverId,\n viewerShapeHighlighted,\n} from '../pointer';\nimport {\n assignedConnectorShapeIds,\n assignmentSpecialIconDataUrl,\n connectorMapIconKind,\n connectorSpecialIconDataUrl,\n entranceIconDataUrl,\n} from '../../specialIcons';\n\nfunction kindColor(\n kind: ShapeKind,\n theme: ThemeDefaults,\n fill?: string,\n assignment?: { bgColor?: string | null } | null,\n): string {\n if (kind === 'walkable') return theme.WALKABLE_COLOR;\n if (kind === 'unit') {\n return resolvedAssignmentBgColor(assignment, theme.STORE_DEFAULT_COLOR);\n }\n if (kind === 'connector' && assignment?.bgColor) {\n return resolvedAssignmentBgColor(assignment, fill || '#e2e8f0');\n }\n if (fill) return fill;\n switch (kind) {\n case 'wall':\n case 'boundary':\n return theme.WALL_COLOR;\n case 'parking_zone':\n return theme.PARKING_ZONE_COLOR;\n case 'green_area':\n return theme.GREEN_AREA_COLOR;\n case 'water':\n return theme.WATER_COLOR;\n case 'floorplate':\n return theme.BASE_COLOR;\n case 'void':\n return '#00000000';\n default:\n return '#e2e8f0';\n }\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 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 /**\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 /** 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}\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 theme,\n is3d,\n onSelectShape,\n selectedShapeIds = [],\n hoveredShapeId: hoveredShapeIdProp = null,\n eventSource,\n interactiveOnly = false,\n imageProxyUrl = null,\n amenities = [],\n host = 'PORTAL_ASSIGN',\n kioskOriginShapeId = null,\n}: LevelMeshesProps) {\n const [pointerHoverId, setPointerHoverId] = useState<number | null>(null);\n const hoveredShapeId = resolvedViewerHoverId(\n hoveredShapeIdProp,\n pointerHoverId,\n );\n useEffect(\n () => () => applyViewerHoverCursor(eventSource?.current, ''),\n [eventSource],\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 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]);\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 url = connectorSpecialIconDataUrl(kind, true, layout.iconColor);\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, 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 =\n shape.label.color ??\n shape.assignment?.textColor ??\n theme.STORE_TEXT_COLOR;\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={shape.label.color ?? theme.STORE_TEXT_COLOR}\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 = isViewerSelectableKind(shape.kind);\n const hovered =\n selectable &&\n viewerShapeHighlighted(shape.id, hoveredShapeId, selectedShapeIds);\n const baseOpacity =\n shape.style.opacity ?? (shape.kind === 'amenity' ? 0.01 : 1);\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 fill = fillTransparent\n ? hovered\n ? theme.ACCENT_COLOR\n : '#000000'\n : viewerHoverFillColor(color, theme.ACCENT_COLOR, hovered);\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),\n );\n }}\n onPointerOut={(e) => {\n if (!selectable) return;\n e.stopPropagation();\n setPointerHoverId((id) => (id === shape.id ? null : id));\n applyViewerHoverCursor(eventSource?.current, '');\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 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={theme.ACCENT_COLOR}\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 React, { useEffect, 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 { connectorSpecialIconDataUrl } from '../../specialIcons';\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 function routePointsForLevel(\n route: PathResult,\n levelId: number,\n): THREE.Vector3[] {\n return route.points\n .filter((point) => point.levelId === levelId)\n .map((point) => new THREE.Vector3(point.x, point.y, 0));\n}\n\nexport interface RouteLevelChangeMarker {\n x: number;\n y: number;\n connectorId: number | null;\n targetLevelId: number;\n direction: 'To' | 'From';\n}\n\nexport function routeLevelChangeMarkers(\n route: PathResult,\n levelId: number,\n): RouteLevelChangeMarker[] {\n const markers: RouteLevelChangeMarker[] = [];\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 markers.push({\n x: from.x,\n y: from.y,\n connectorId: change?.connectorId ?? null,\n targetLevelId: to.levelId,\n direction: 'To',\n });\n } else if (to.levelId === levelId) {\n markers.push({\n x: to.x,\n y: to.y,\n connectorId: change?.connectorId ?? null,\n targetLevelId: from.levelId,\n direction: 'From',\n });\n }\n }\n return markers;\n}\n\nfunction createRouteTexture(distance: number): 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 = V1_ROUTE_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, V1_ROUTE_COLOR);\n gradient.addColorStop(0.4, 'white');\n gradient.addColorStop(0.6, 'white');\n gradient.addColorStop(1, V1_ROUTE_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\nexport function RouteLine({\n route,\n levelId,\n levels,\n connectors,\n onActiveLevelChange,\n}: {\n route: PathResult;\n levelId: number;\n levels?: ReadonlyArray<{ id: number; name: string }>;\n connectors?: readonly CmConnector[];\n onActiveLevelChange?: (levelId: number) => void;\n}) {\n const invalidate = useThree((state) => state.invalidate);\n const animationStartedAt = useRef(0);\n const points = useMemo(() => routePointsForLevel(route, levelId), [levelId, route]);\n const levelChanges = useMemo(\n () => routeLevelChangeMarkers(route, levelId),\n [levelId, route],\n );\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 V1_ROUTE_RADIUS,\n V1_ROUTE_RADIAL_SEGMENTS,\n );\n geometry.setDrawRange(0, 0);\n return { distance, geometry, texture: createRouteTexture(distance) };\n }, [points]);\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 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 && levelChanges.length === 0) return null;\n return (\n <>\n {routeShape ? (\n <mesh 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 ) : null}\n {levelChanges.map((change, index) => {\n const connector = connectors?.find((item) => item.id === change.connectorId);\n const iconKind =\n connector?.kind === 'escalator' || connector?.kind === 'elevator'\n ? connector.kind\n : null;\n const icon = iconKind\n ? connectorSpecialIconDataUrl(iconKind, true, '#ffffff')\n : undefined;\n const targetName =\n levels?.find((level) => level.id === change.targetLevelId)?.name ??\n String(change.targetLevelId);\n return (\n <Html\n key={`${change.direction}-${change.targetLevelId}-${index}`}\n position={[change.x, change.y, 7]}\n center\n zIndexRange={[30, 20]}\n >\n <button\n type=\"button\"\n className=\"eyeon-map-route-change\"\n aria-label={`${change.direction} ${targetName}`}\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__label\">\n {change.direction}: {targetName}\n </span>\n </button>\n </Html>\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 resolveLayerStyle,\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\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 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 route-path* 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 (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 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 (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 shapes,\n color,\n opacity,\n extrude,\n renderOrder: layerStyle?.renderOrder ?? 2,\n });\n }\n return out;\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 }>;\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 if (routePoints.length < 2) return null;\n\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 let bounds: SceneBounds = {\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),\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 endpointShapeIds = new Set(\n level.anchors\n .filter((anchor) => endpointIds.has(anchor.id) && anchor.shapeId != null)\n .map((anchor) => anchor.shapeId as number),\n );\n for (const shape of level.shapes) {\n if (!endpointShapeIds.has(shape.id)) continue;\n bounds = expandBounds(bounds, sceneBoundsFromBBox(shape.bbox, level.transform));\n }\n\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\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 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 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 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 };\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 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 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 SceneBounds,\n ThemeDefaults,\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 { pointerMissClearsSelection } 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 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}: 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\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 pointerDownRef.current = { x: e.clientX, y: e.clientY };\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 theme={theme}\n is3d={is3d}\n eventSource={eventSource}\n selectedShapeIds={selectedShapeIds}\n hoveredShapeId={hoveredShapeId}\n interactiveOnly={outdoor && Boolean(outdoorSvgUrl)}\n imageProxyUrl={imageProxyUrl}\n amenities={doc.amenities}\n host={host}\n kioskOriginShapeId={kioskOriginShapeId}\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 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 type {\n CmAmenityCatalogItem,\n PathResult,\n 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}\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 onActiveLevelChange,\n fromAnchorId,\n toAnchorId,\n onFromChange,\n onToChange,\n accessibleOnly,\n onAccessibleOnlyChange,\n route,\n showSearch = true,\n showAmenities = true,\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 onActiveLevelChange(item.levelId);\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, '#334155'),\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} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport type { WebsiteDestination, WebsiteMappedRetailer } from '../../core';\n\nexport function WebsiteInfoModal({\n destination,\n retailers,\n imageProxyUrl,\n onClose,\n onMapIt,\n}: {\n destination: WebsiteDestination;\n retailers: WebsiteMappedRetailer[];\n imageProxyUrl?: string | null;\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\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 <form\n className=\"eyeon-map-info-modal__form\"\n onSubmit={(e) => {\n e.preventDefault();\n const id = Number(fromRetailerId);\n if (Number.isFinite(id) && id > 0) onMapIt(id);\n }}\n >\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 {destination.anchorId == null ? (\n <span className=\"eyeon-map-info-modal__route-unavailable\">\n Directions are unavailable for this location.\n </span>\n ) : null}\n <button\n type=\"submit\"\n className=\"eyeon-map-info-modal__map-it\"\n disabled={!fromRetailerId || destination.anchorId == null}\n >\n Map IT\n </button>\n </form>\n </div>\n </div>\n </div>,\n document.body,\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, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n DeviceType,\n MapViewerHost,\n PathResult,\n PublishedDocument,\n PublishedRetailer,\n ThemeDefaults,\n} from '../core';\nimport {\n compileGraph,\n defaultViewerLevelId,\n deviceFromHost,\n findResponsiveOverride,\n findViewerKioskOrigin,\n hasBuildingFloors,\n MAP_NO_FLOORS_MESSAGE,\n mergeTheme,\n findNearestAmenityPath,\n findPath,\n normalizePublishedDocument,\n overrideToCameraPose,\n responsiveSlotKey,\n viewerAllowsWheelZoom,\n viewerChrome,\n viewerLevelIdAfterShapeSelect,\n websiteClickOpensModal,\n websiteDestination,\n websiteMapItAnchors,\n websiteRetailersOnMap,\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 { fetchWebsiteRetailers } from './fetchWebsiteRetailers';\nimport {\n selectionFocusKey,\n viewFocusBoundsForShape,\n viewFocusBoundsForShapes,\n viewFocusBoundsForRoute,\n} from './camera';\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 [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 [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 if (!viewerChrome(host).storeModal || !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 = responsiveSlotKey(activeLevelId, resolvedDevice);\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 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 if (!compiled || fromId == null || toId == null) {\n setRoute(null);\n return;\n }\n const result = findPath(compiled, fromId, toId, { accessibleOnly });\n setRoute(result);\n const originLevelId = result?.points[0]?.levelId;\n if (originLevelId != null) setActiveLevelId(originLevelId);\n };\n\n useEffect(() => {\n runRoute(fromAnchorId, toAnchorId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromAnchorId, toAnchorId, accessibleOnly, compiled]);\n\n useEffect(() => {\n if (!createRouteRef || !doc) return;\n const routeApi = {\n createRouteToStore(retailerId: number) {\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.assignment?.retailerId === retailerId) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id);\n if (anchor) {\n setToAnchorId(anchor.id);\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(doc.levels, activeLevelId, level.id),\n );\n }\n }\n }\n }\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: number[] = [];\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.assignment?.amenityId === amenity.id) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id);\n if (anchor) anchorIds.push(anchor.id);\n }\n }\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 setToAnchorId(null);\n setRoute(null);\n setWebsiteModalOpen(false);\n setWebsiteShapeId(null);\n\n const resetLevelId =\n kioskOrigin?.levelId ?? defaultViewerLevelId(doc.levels);\n if (resetLevelId != null && resetLevelId !== activeLevelId) {\n setActiveLevelId(resetLevelId);\n } else {\n cameraApi.current?.reset();\n }\n if (kioskOrigin) setFromAnchorId(kioskOrigin.anchorId);\n },\n };\n createRouteRef.current = routeApi;\n return () => {\n if (createRouteRef.current === routeApi) createRouteRef.current = null;\n };\n }, [\n accessibleOnly,\n activeLevelId,\n compiled,\n createRouteRef,\n doc,\n fromAnchorId,\n kioskOrigin,\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 }\n : viewerChrome(host);\n const hasFloors = hasBuildingFloors(doc.levels);\n\n return (\n <div\n className={`eyeon-map-viewer eyeon-map-viewer--${host}${hasFloors ? '' : ' eyeon-map-viewer--empty'} ${className ?? ''}`}\n style={\n {\n ...style,\n ['--map-accent' as string]: theme.ACCENT_COLOR,\n ['--map-bg' as string]: theme.MAP_BACKGROUND_COLOR,\n } as React.CSSProperties\n }\n >\n {!hasFloors ? (\n <div className=\"eyeon-map-viewer__empty\">{MAP_NO_FLOORS_MESSAGE}</div>\n ) : null}\n\n {hasFloors && (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 />\n )}\n\n {hasFloors ? (\n <MapControls\n levels={doc.levels}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n onZoomIn={() => cameraApi.current?.zoomIn()}\n onZoomOut={() => cameraApi.current?.zoomOut()}\n onReset={() => cameraApi.current?.reset()}\n showFloors={chrome.floors}\n showZoomReset={chrome.zoomReset}\n />\n ) : null}\n\n {hasFloors ? (\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 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 (!opts?.additive) {\n setActiveLevelId(\n viewerLevelIdAfterShapeSelect(doc.levels, activeLevelId, levelId),\n );\n }\n if (routeOnSelect) {\n const anchor = level?.anchors.find((a) => a.shapeId === shapeId);\n if (anchor) setToAnchorId(anchor.id);\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.storeModal && websiteModalOpen && websiteDestinationInfo ? (\n <WebsiteInfoModal\n destination={websiteDestinationInfo}\n retailers={websiteRetailers}\n imageProxyUrl={imageProxyUrl}\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","jsxs","jsx","active","Fragment","MAP_FONT_FAMILY","MAP_LABEL_LINE_HEIGHT","SVGIcons","AllAmenities","CONNECTOR_AMENITY_TYPES","AssignAmenities","item","KioskSvg","EntranceSvg","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","UNASSIGNED_CONNECTOR_ICON","connectorSpecialKind","shape","raw","connectorSpecialIconDataUrl","kind","assigned","fill","assignedConnectorShapeIds","anchors","ids","anchor","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","_b","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","viewerShapeHighlighted","shapeId","hoveredShapeId","selectedShapeIds","resolvedViewerHoverId","listHoverId","pointerHoverId","viewerHoverCursor","applyViewerHoverCursor","host","cursor","viewerHoverFillOpacity","base","hovered","parseHex","h","g","b","n","toHex","r","viewerHoverFillColor","accent","amount","a","VIEWER_CLICK_DRAG_PX","pointerMissClearsSelection","down","up","dx","dy","kindColor","theme","resolvedAssignmentBgColor","polygonShape","HoverOutline","extrude","sourceGeometry","CurrentLocationPulse","position","Html","LevelMeshes","is3d","onSelectShape","hoveredShapeIdProp","eventSource","interactiveOnly","imageProxyUrl","kioskOriginShapeId","setPointerHoverId","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","url","geometryBBox","align","normalizeLabelAlign","cx","cy","tilt","Text","labelAlignX","size","DEFAULT_ENTRANCE_SIZE","AssignmentImageOverlay","fontSize","DEFAULT_ASSIGNMENT_SIZE","z","iconColor","imageKey","assignmentOverlayImageUrl","text","_c","React","assignmentOverlayRenderSize","rotation","x","y","selectable","baseOpacity","fillTransparent","isTransparentColor","opacity","geoShape","idx","loadCanvasTexture","signal","resolve","reject","img","cleanup","onAbort","setTexture","setAspect","disposed","controller","proxied","resolveFetchUrl","candidates","lastError","src","error","V1_ROUTE_COLOR","V1_ROUTE_RADIUS","V1_ROUTE_TUBULAR_SEGMENTS","V1_ROUTE_RADIAL_SEGMENTS","V1_ROUTE_REVEAL_MS","V1_ROUTE_TEXTURE_MS","routePointsForLevel","route","levelId","point","routeLevelChangeMarkers","markers","changeIndex","from","to","change","createRouteTexture","distance","context","gradientWidth","gradient","easeInOutCubic","RouteLine","connectors","invalidate","useThree","state","animationStartedAt","levelChanges","routeShape","useFrame","elapsed","indexCount","progress","connector","iconKind","icon","targetName","event","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","j","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","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","current","partial","newNumber","length","units","unitConversion","string","theUnit","u","scale","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","SvgVectorLayer","suppressIds","setResult","cancelled","fetchUrl","res","inlined","inlineSvgStyles","err","out","layerName","isRoutePathLabel","isRouteFolderLabel","shapes","layerStyle","strokeTransparent","si","SCENE_FLIP_SCALE","viewBoundsFromData","bounds","fitOrthoZoom","viewWidth","viewHeight","worldWidth","worldHeight","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","endpointShapeIds","easeOutCubic","lerp","interpolateCameraPose","ease","cameraPosesNear","epsilon","withFitZoom","pose","fitZoom","resolveResetPose","fitToMap","home","fit","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","camera","userAdjusted","applyingView","zoomAnimRef","appliedFocusKey","focusKeyRef","focusViewBoundsRef","homePoseRef","homePoseKeyRef","resetFitsMapRef","onCameraChangeRef","onCameraResetRef","appliedHomeKey","ignoreUserChangeUntil","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","offset","onStart","useImperativeHandle","useLayoutEffect","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","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","selectedItem","setSelectedItem","items","list","amenity","grouped","map","arr","anchorOptions","hasQuery","selectItem","group","groupItems","WebsiteInfoModal","destination","retailers","onClose","onMapIt","fromRetailerId","setFromRetailerId","retailer","websiteFromRetailerOptions","logo","showDetails","formatRetailerPhone","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","fetchedRetailers","setFetchedRetailers","internalLevelId","setInternalLevelId","defaultViewerLevelId","cameraApi","canvasHostRef","viewportWidth","setViewportWidth","setActiveLevelId","viewerChrome","ro","entries","codes","viewerLevelIdAfterShapeSelect","focusShapeIds","selectionKey","selectionFocusKeyWithNonce","selectionFocusBounds","kioskOrigin","findViewerKioskOrigin","routeFocusBounds","routeFocusKey","resolvedDevice","deviceFromHost","homeOverride","findResponsiveOverride","overrideToCameraPose","responsiveSlotKey","compiled","compileGraph","websiteRetailers","websiteRetailersOnMap","websiteDestinationInfo","websiteDestination","runRoute","fromId","toId","findPath","originLevelId","routeApi","retailerId","amenityCode","anchorIds","nearest","findNearestAmenityPath","destinationAnchorId","resetLevelId","mergeTheme","amenitiesOnMap","chrome","hasFloors","Suspense","websiteClickOpensModal","_d","_e","websiteMapItAnchors"],"mappings":"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","x_google_ignoreList":[15]}
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 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;\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 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';\n\nconst ASSIGNED_CONNECTOR_ICON = STATIC_ICON_COLORS.connector;\nconst UNASSIGNED_CONNECTOR_ICON = '#94a3b8';\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: ConnectorSpecialKind,\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\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,d09GRgABAAAAAFCoAA8AAAAArPAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAABHREVGAAABWAAAAHkAAAC0Eu8QH0dQT1MAAAHUAAAWjwAATB5m7jJFR1NVQgAAGGQAAAKFAAAFJGpkiWBPUy8yAAAa7AAAAE8AAABgVRslUlNUQVQAABs8AAAAPQAAAEjngsw+Y21hcAAAG3wAAAHkAAACzH9ZgPhnYXNwAAAdYAAAAAgAAAAIAAAAEGdseWYAAB1oAAApYQAARKoq7tA3aGVhZAAARswAAAA2AAAANiP81ytoaGVhAABHBAAAACEAAAAkCHQHRGhtdHgAAEcoAAACSAAABPRDVFknbG9jYQAASXAAAAJcAAACfEa4V3xtYXhwAABLzAAAABwAAAAgAVoAzm5hbWUAAEvoAAABCgAAAlo1CVy5cG9zdAAATPQAAAOyAAAHi0JlOQl42h2MUQpBYRhEz4Buim7c3HhViCSe7EBWIHuQZ2Htcvr7mjNNzTeEDitgrF5UptqL/uGr90iOphGhVXN2cs9FXrnJOw/55C39sftL6KabgRymkbNs5DYHecqZYANYqLq4OU3pdeiXBcpCz4UpVdqsmZSF5R8PWgsnAAAAeNqs1AOUJAkQBNCIrNGq17bGOq9t27Zm9vWsbdv27tm2bdu27axY6+nuxctf0dlWgQDyoxHmIqZZi3bdkDh0Wt44JI7MGz4W5cYNnpiLRMQAwD//gOCxHgAwN2bs8LxcXCgzcwbnjUW1nLE5fl9dH48EADEIfGIRp525QKAjka/s7LIV4n+N3cgGLIK3cSNK+O2KgMgPA2O7IReM2Y+CKGaNrI4n2aqhH3qgk6cNmqEBauFcpLuJVgdkuq1zL7RVbnWZbutDg5WyjcyRUTkk1H4GUQx/M2As87Mwi7M0y7MiK7M6k5jKNKYzg5nMOvb6CMZnx2e7pVAQASJI8CES/0kCmf7PNMQCoG8ZsxKdwOB1v52hGOJg1sMlX7eXvLc50q87fo+4l1HJvVP3iPNY7NPQrXQLwwzMRMyxx08P2oHBdL/1zKBOcL6S6ZMcVAsqBKWCIp78QYz9bb96vvf50j62d+11e9HztM+jdr9futN3N9u1drnnoM+1ttu2BnX8uN5W2mKba9M9E31ybZQNsX7WwzpZG2tmDayWe66lW6JVsXKeEj4RSzCzCP/kz/yWn/NDvs1X+Tyf9OPDvJffem7njbyal3I/d3Kzu5bLuZCzOZV5HMcRHMQ+7MYObOU2YT1eyGymsgYrsQyLeQoyjsDvINNst5tu2+XX8mJ5rdzowiIu1ak9tSkgb5aFZQfbKC+W10rfY4PNc39Q/zSUdeQ0mRNqVdRr65XUOtI3yovltTLidrPt0ruVDMXKI17nLrFDcqO8WF4rI/I6+RLI5tr8pJ5lG+XF8lr3fIuEXU6UT8mKtl1+LTfKi+W1MuK2szvd+kE0VL11qKWr95crgyEyGqpNZdlYjg+1PuoHgxw5REZDtd+s/Vvqk0LxkdwSDJHRUNMt5VY5SA4JhshoqDYL5Ry5U04PtVHqI4McuV8OkdFQu1NnLaI0gLJI82MGWiIVrdETzdEb4xCekaZjFM9lLUxCCoAr/6e5+L/OWR+bTLc7ZQSGWPxNAgwYhxjmZ3EksDSTUIypzEL142cV62L53VooiCh/PSXf80t+7HmXr/PFY3maj/J+3nksN/NaXs77PQdPym7+yq1cz5VcfCxzOZ0TmesZxZUnZQj7sYdnlFTYiW38crOT0sCnFkd5zj0p6UxkFZZjCUaYQDsa/Imf8S0+Vz4EmQC4C2UBebMsLDuE4jf5g1wVygw5TU7/Zx1oVdRrh1oJ9YtCsUS9+T/1QWxQz5IT5Wuym6wvW4daunp/uVJWlo3l+FDro35QviX7ykmh2KK+WW6Ug+QQuUwukDvl9FAL1EcCJ/0nKvixEtJQHploiRT9M5qiL8ahi/4ZwxAAKOET0ZFI1OOkhyLw76AUk/EvrfXTGkdyxnH8g/DYs2VjOUrjRUQMJgIjdiMwJste9v3sJcc9hhAICSzklBfgc0IgJIG9OSgY4UTYTP4sWYSDEzMo8cpuSxnZak+sRb/A0AzNDMLZg77DdHU9VfVUddXzp97RN7UxS+hbuvodF1j+69Xved97oK+v5I0W/WyRA0gDeYS21tInh/k5ZFdJkzp1XpFn6AOpc0jGqUmtR5fUGQMKujMsZwQ51kuTkTPIXfLCW8gE8C1z5E3qNBmTHXLo4xznDkpnRfeUHJIn03fkJXmVn0AekldKdhUlI+dDf2H/z/7OvjPIGPK67SePyb6r5CtLZD8NOc1Rms6Ya6lVKKTJKI2iP5tRTqdlAXKYOuPs2FTItr6P9LCkxVr+RJ6qUKGfXZtuuQ3W8YEVN61moiIN+jnMExUG+US/YzNXmEp/aZDGtIeL5Mi6NTdnOjcs2VAt7GABm+TQ/0+7KmB6+i152epZzQ4+RMkJGGAjI6sZG2jJI+tutuu8qdj0rnctA/ldanI3d3yUsQ+yldrAIHWeZSsPcjcN+cyHrYfear2CAbhBasvTFvmRDaYS+DjbNrNjOXW2rIMNlyGNQXas5BOyPTvpOiMMsm2QoZJtxU/n7LIH1jHwFvIKy+2oHipsYlUh/4W8VuGib5BJ/pxjctK1edfz1JVMXIPsZ5IvIc9zkOOMc5CjTAArgCqjnOTpok+ZStKQmoxBmUrQSptM2vcuxVK7NhktaKzP9s00SrdmkQ2y4+1IbZFLqRf1ukzunxFprsxq/TNWViCjHJER7fNyHlkhTf6Rp3mVGrJPdg20p55Hqa1Ynmntp7GexgrnHD+P9aHNR3NkNOu7tLivZJIGUucYFbhukD1Sd/JkpSWftiOHZA+Vb8/61rlPDhQU50Z28zD7+ScZkWc28nnu6JEvmGa/XrYzSp2D/Irs0LZ9kV9Avt/WH+N2hlqytxjrzLAY6/6ouNWJdWtW3FCh1/6Ld5RMWp84y7pLxuS5RapMLMKFPMibPPY++XVOutacXTLKJCPy9xzDVLIL+S05IE9yYtP5Uch/ck8FuW/Jd1GZ4Xq2wADavHnTezCLndcw8PW5qEuZ85weuHR2Jlyot2XG5MQcOcpJR16mvyuqjFzMM2tk2L1TKBkpaVSpyUh758jTjCEPfTPDjFPntJvhz5kbWNd7ezxesOTV+Ttvhu0Jjzqy2ffnZ65n33JetL4x7Iz9S+dm93xaVnTvJla1KHMtHRZib79bZpgXqTPMA4PUSv42fX6VSV5kLwf5d47IliqPreECeZEtlGmd5TTktQ0ycuVsCzqrJePFnuTlnC3BmpZ8jg1zZMycbw10mFvdZC5Hl5wuRJkCXWn2dZHT7kxtxNlT2lP+cer8wKoKlxSsZG9uD8q0/+v8ppWuYS1D69OaPNNqVrUx7dhtpXP7QHb1tLjUah90906hlS8pfuhTfOb3inv+4LodD60Z+pcbvvQ/BucBNxQACIDofBu17RNUQX2uGheqbdtmUtuevGi952RxySX53HJHAY88UfQh90MuJc7nUqqflCmWcqVRoRQqFU2VoqjWT2qUTK3+UqcYr9b7bQONftqkLzQrkhb9o1WJtCmYdjr4QKfC6NYPevSLfj/+wJDSGVY8I0pgTL8ZVzgT+s0kU+6f1ndmFMKsvjOnEOb1gQX9Z1EfWNJ/llnhK6v6yJpCWVccG0piky3z20plRxHssmf/vj5zoE8c6g9H+sSxAjlRBqf6wdk7B3Zhg0AQBFB0Bnd3OccJUerAO4Yo/eAy+Tn327e+5qv4qvnebf20qSovm+ooZyQma5SbKPsoT1Eeo+yh7KLcQ3mEcgXlJspxlLMox1F2UK6iHKLcwTeDbx7fgpzlIm18Z/gG+DbkalMR3yK+A3zj+Obw7eKbw7eLbw3ZGqZpTBXTPqYJTCNMFdMJpkNM05iWME1iWsY0hWkd0zmmeQRjCLYQpN0uiuSAMbm9RLYfJx9sbXXiekxcbTBCk7NJpciYS8ueUdMKbL2Qpa1XNqk2uNe2f+qtAriR7Ig+71mGWdCeVsc+hZmZGQvCSTGHoTDMjMWMYWbm4wst8669sdeyVmet5bHs8crjseTzy+rVry79Ko9ikJzcM83Xb8987N/dr0dszjD2I/OUQ09even1u98nXWvxmOBX6AeC8ceXkcfL0cKwr4e5zBiyPn29w4gRNgBJbRPy+8GKruQNyYKcszqBlznabk27kgdW1tPxDO2/XImVdaMpWQSss9xuDTov0n/awzr1BdsA79qAzOVN3yePbYBz/olj3k5PwYU2O+R7sukfrVkZ8XqUR96P76WigB2CHzOU/7neaR5YyZ8d1brfI+pxGvJ2h7S5vrGzVd4NcEV7d4kNeOAyVzYyL1u2qPd4Pb+VEY+qNUfaR5EJf8L6lmMbD2iYZn4jdhCeVX3O1vs8675Eq8wGBN6HdGS3EZUZ0pcfa/I/BeDVdBvybgBOK45zB8e46iz2DGdZYqQ1WmKCQZqOZRnpGMH2sUvsRAOKRvo7lzHr6B289kubZ726B296b+a3t07Nd9rFxD/XnAZZYOL5bt1FgWVnlZQZ47k2+k9mjHcjYKgeFhR7eqT19S0d+/XARR/yeDxejc/ic/g8voAv4kv4Mv6C23AQh3AcE5hECZcw1/dc7MIBPF428auvfg3IPwnkn1wr/yQr/2RY/smQPJN98j0G5XXskV+Rk1+xW15Ev/yBXfIE9soH2C8fICP7/kDfc68+8xqYZb3nBPqBvYWHfA034uU9iytvAVz2WNAY8tJTZZ0HoH7dhGexhCxejCeb5hVjJn39WtZVgqKsWZbxoKulJ4j7HFGE8Ca8HjlGEFjT3WNFOCc5C/EwKkVUvEYyawBnnXzMyMVUcjzLRbGea/p80fFv4AmMsAQ4Ni7DGlsZVVn1MuGSs6wKXDOrf4YTgHtyTXs6sivJQO1gxBoMPdA4Eeft+ozxWSnoXTvUinybZf14FLRCHmp2coAcAs+yXup+OzwEcJYyG6z6Y8PxttX7SHQdvGL9BotcxUNdlPEGz/4I7ErovqfB2xgiw9t4m3iV21hydyqormwyBd7dW21vuyJWCxQZV9zvI77UxvrMD6AL8Fixt8GPePcUXDaPrKnfCb8NjY75UaoXG7y6Ic+lCzAmeRE+pF13yuPRiPSrHbOylMym0ic2Glzr/jnnIWjjz0t4ifavA0d9uZ4ia75Nk/UOkbJCt9eH8eWhPI3THGVoTFnFSqOMEbDir4FeR0x4Af9jcEXnSygNX9E6DczuKDI2uWo312n6ecs49bxVNpK0XUpGkvwBuJwkbCIr6Xp/pW7fs8VW8Bb8n4CTPCJteYwTCFjjaf4TQIa345VMGJncb5FhdQP3+wW2As/b11rMyf4YEve2AMG4zl7ZH314BPJ4LT6JT+Ez+Aq+Ks7mr7gdd+Ee3Csu5jCO4BhO4TTO4CzOYVRsSoshuYwZVDGLEDU0+57XYjMUmd2F1+K16NNdD4hHyokd2it2KKdnDIgL2icW6HqxQBmxQENigYb15OvE/Fwr5icQ8xOI7RkU23OD2J5BsT03iO3Jiu3Jqn39amG/OJzdYm/2tDFi+8XbDImxyYuxGYT5eAeejH7g+gcf+AEejpevq80Vu+IZNv0IMA8DXN16VmlaZmlnKOc1D7+VOwrGG4yLm93N2/y9wEuu7ypJRwuMOMMKnN7hjGSb6W1Q5lfF/XcGzitmifW2sUKHDGKT2WoWMVd4PyP+DAFXOMr7PXvyIuepe9vv9cdjXmMQcw0qwTQCY5ZdLuIk0LoWd1ZO8TxjfgMBxxlypd12U2ZLAwZWUtoRMrF2WPaitcPy03iJodrRSM0QXnQ2ib9jjH3k8n9fTUw2HeVLXMsTV1qC+sRYpahVq8+WGXn8jPsPG/Uk/dmqvcA1K0UtaUa6RxYCm3SrkxGGFReeYMQix1XnagGeZJEzGqWHIqt4QcAiClxxGbNN+aOyJ+SbFQGV9KNnL/I8f6Xrv2jPBPwTgOduKoIkbMinyW8pIqAxsutphmzyGOtULiEbGHCrLmGZIRuSv2jW2EN5ydl0idlmj3ccbI5VV3qkbKoKChiE5S0jq14Nsu712OB7Vn4N5z15B965fpYbE68U6ceDZG5yo3FQmcUTnFLc4yAX2GSVVa3Wf8qninkfI7px4EGOM3KW6w0cVT+vZ8QFlljnBGRj8o94GMuASiPSR39iAwU9NWPtfbS/4/z5V69jjsOB2uE87cv5nPvmwMvr7Ns5TweFjNvb6M8QxyXvjTxrvM21VmDN08I1pwUTTjLiLNVmZXZXpFMTPMz0cNP2rXKeeJxVzccapc306ZJW7nRL3utJwJgnvCha4OfwuR9oH2faMqgSN7KPtP2ybKvK1lOblluGB/r2wJDOw4z54/7KtBLXeGGdXVzQzxbhn58a+21DZ01FIz/NmEUusMIS5znjdkyVFcasc5ElTvjZGWygHzmnNxe1r5ryygSnV2LLpz6ifATNIEttmW1Ptt4NeXu8zqJWTdXV6imscUqfCAy7yeJsLNbNCT/WrTd0hJS3dPJt7+lgo2/qpPdn4zU659Jhe59NeyejBrForDHuFLvjSlrsTvLqcepbIXva3gvBRt8MYcQrnGbCRJIXeB5ZnuYSz7Kskcty2vkN55nonLvSNi4P5ihki3LOxrvgLK4Ha74LnMOtbn1nuIwCIy7p7fbrXO/rHWKIuY4xRI1H2hstDO0u2MxbLUy46P7K2uQYf9vqMw+r1LTaPzCxHl/jbJ1zuIkV/sWssSFApdcDPAW40p3QCDHmBf5e19+GfAfVvAgCD1Invb4meIkXEbCo3s5zTL2VXmfTztsp9SvDGCMMGYqbXdKJUOciCm7tjlDzAigC0+CPWleaJ+l1xXqealZhpHckljjGCcY8yTt5nk1OscSIJd7OUDqnyAiP4DHoCa2euVMvy5DF1mmuM2yUEcfcrP0cI5LP6yfPeX6PC3hwSxL9mo08MniqZiclums60OdkYn8HW61kO+7xrCfVtjNVyHXw55Diz/XQ1+VlahVwTnbXIsdZZJH/5qh4ybJqq4x4kmO+DaP2uPOWkf76oxa2ZzfyhN5AaMLi1Uw0ay+H4P4/oWZDbZliVXxnaL7JkrORKpIP/DF0d12xsfZH395MQWCznNGpEGjOXuLuot1KeSY8zYiJvL4pLljWZs1Jar/wivaUg2ygUO1suPsIPIyAkzB90+5PW8siPbMIbD0O030wYmh22UMR8CKn3K4UH+1WdECzmzv7YCyii9jZeNB/mjgHGLkCKIqer91Od+ypbVtr22ZQ27YRNbYau3GyURsnbWyrQREb25ebv8gZe+bd0c35X0aGQwbIsZMM4ToX6KSRbh7RJhv8njzwB7LqH8qhfyx/+6kM+Ody31/I0H4pN/uVrOzXstXfylZ/r6UBPsi1/oTLeTnQy0JzuoIoXuhP5wwvtKhXG6tCl3ojO/BCo3q34SGvmr1Gjn1GBfs5TDlHOEqcY0aM45wgz0kjwynqidBg+DTSGTadq+k2XHroxafPCOhnBJ9RxkgwzgQ+k0wTMMNZXM4ZAecNnwuGy0Uj4JKR5LLhc8VIcZWblHGL2yznjlHgLvcp8sDIaj0yKfWsO9SzbpAPc0w+TK18mGpeGUfkwxyWr79BVkyVGtktamSPakIr1cuu1ZxWypk5pI52K7PGKTW1uzW/qPra/epr16uv3ai+dpfmKseGOjk2J9TgnuSHsUkN7gFZN5s0+5Vqc9epzd2jNned2tw9anOjSsY2dbpR5WObmt01Skla3s5eZeW47J1KJSYth6dGDs9BdcBr1AGvkMdfUhO8WU1wSYZPvZrg9cpZVDmLaqmIqHK2XQ3xTllA+9QTr8OlBkcuYcSQuU9M+cvafhyPBBnKlcIUeQo4FI0ySguJLGONWGuUWBemczseO4xydhrrlmR0lTJaVEZXKKNlymhUGU0royuV0SSnqMOl3ggWktpEnmYjovdlQI/h0mtE6GeYCOPGWiaMiJLqMsMZfM4aAeeU1ItGQRnNLclofEk6E0rncqWzgkdGRNnaoFRtUHoySklGCdigGWc03YzmuloT3ahZrtZUMppKRu/+jKayfqGrd8I1XMWZ5Stf+Gy8Mm5wiTPMMEYPTTjEyWp9APaa6bXqopcBBhnlAn9w7XDJjgW4dkqRMds6fJ/7iRMupzFLQaf8wacXwsuvYZiTeOGxFMOswbdj6+xYgqG5XwyT0vlrdMowSVy+sZl/bNa9Rux0f8mzieMDLi3kdepuOz9KA9ADuud+3TsMAcPACDAOTADngcugpZO2/QfOD0AWAHjabZIDzB1NGIWfM4vv9rr73dq2G/22zdq2bdth7cZm3aCMGxtFWDcsNm8m6RaLZ+Y954yyi4A8V/QPwTff/fIPR8YunjONI9NGz5tBjV3kvhzybVsWfP3lP20Z9fVfKRf8/OWQlL/98k1bfvon1Vnwz18/p/zvx7Q/EF69IgcIR0AdORqQf0eNP6hGH1RDr4ZgTh3e8Xph7Njps1g3bsbM6ayYMGf0WOZNmzxxNDOmzRw7jUnGMcZhxv9mzJ8+hz9mpQ0/zUvJN4BoZKwZy8a8sYGxYMwZGwMBVRqSWF0BIsARElNHk+C/4Dv30J1za9w5PdYtXdAuTVB3tVSZ59zndsptrGACg+hrJ5S9za11FIlZhmMYS3H8iRC/IfC5E+QzVfzqOQ6xhb2Q0T9L9RhwdCZPgEgQvX2m3sbs4yCY19L8rHeI01aLM2RXu2valYxWo5ZN0NrGr2IzZPSO1GWqxsTE+MreMkJcwJkn2iBPKCGGIU8oIj/WkRCru3qop3qpt/ogYl4qUKS8Kqon9EnZvmrkESGDcAy2XlMcrRCOZvz9Zoe6RoTDV+RxNCWx3FL7Or8xzPhnZoUlRIziP36hO1UCapTJqSFOgao4XirBKSKkJY2pklcZp4qKlihYomQJESom9awXWs/PJ1n1ysbg09GbMxNTxdGaIhAgOiIOAAIiAkBsQSRecUhN1NX0KiIPOMaRpGpTNVNztVBLtVJrtVFbtVN7dVBHdVJndVFXv1pXW+3dvyzAIcTHGS/JeCEvJVCgmFB5FcippBr5zE7EImSrBHxGZ8o2Fj/bVwiQ3YMzeveM/qfXB3oPhCN6Z+16cmqiLiTqrj50sMyfDH4NijRxVAAAAHjaY2BhqmGcwMDKwMDUxRTBwMDgDaEZ4xiMGK0ZkEADA0M6kMqC8UN9HBUYDjAwKIkyn/gP1M8SynhUgYFxOkiOiZdpD5BSYGAGACI3C90AeNoNx7ENQFAYBsD7fgqtREtlMRUS5UusYSDDcd2JGBQmhVXd+9GCs21XZtGbdKiMeagXnfxfQPgA1a4FcQAAAHjadMwDEBxZAADR92di25jd2Lads23bZtk6GynEtm3btm3b6FKXHiLEKCAWUECGaBg6aimjLMiphka+18vZEIVa4ZFoVDQlWhGtikOcIc4al4krJVmT7EmBpFhSKkkn5ZM6SeOkbdIrlU79mPo5nS9d8OxZkFOipsY66XNRejgaeVkSx3GWq1L+pEhS4qJUO2l0izRIFzwInA1nU3DmgzPPnnkGOL3/9O513dZ1XTcI1v277ud1A9b9v+7VdS3Wjlv7ztq316xZs1wAbfGibQGE/0InIPxz7SH8Ef5xp/oaYYXxdjhptZVmmGmcvYaYYrAJhhrmsIMOGWWVIJvscsqtgIIKKaykUkpLpJRRRTXV1VBTLfU10FAjTcwx0VzHTQ91NNVWOx3c5X4PeNBDnvKMZz3neS9609ve8a73feBTn/ncF742yxazHdXPSNvsst1uW60Nta3znSWOWR8a2uiI3vqEuk5YY0xopJfvLdVDdz2NlkkkgywyyiyrHPLLI698SiiqmOJySaugrHIqKW+/iuqprY66GqvqPS0101xrLbTSRnv3uds97vWERzzqMR294FUvednrXnHAaz7xoY987Etv+Uplb4QmoXGIQ8aQLeR2JuS3yGLzLLDQuV0EALVMmMYAAQAB//8AD3japXsHeBNXtvDcGUsCXGX13iyNrN5lWbIsW5LlXsEGXMCG0CHGpEBCEkhC20LJz7L7smkv76Xnse8leUn+hJRHdkk2m7a99++xm957GP/n3hkZmXjL9/3gGWnOPfe0e8q9d64omnJSFG2jT1EMJaGosNQitVukFif6nFuGRrk76FPncm10APBowPsB4EmoJYCHwsjGWiR2hqFRpgNlepdyVyxFT919N+7w+OMfo53cQWp2lu/FbKcdFKIoSoJEVJI6MQe/cg6+COC3LYAvmYc/VYRTHIYvgM/Mgz8yB188Dz4twMXIlKR43ZgXQbdqSoZ1syjIfylcUYsE2Zgwje6jpdwmtJn7BrqDk3J/2o6OVL3xGX0q82kz90Xm8cfp3dyVQISaAXKPA6VaSkfVEXuGlAq5WCKWKFVK/M3GhkOxaMRhs0WLX2aQ79K9Ua+oTCkPxK67/pOPx6amxj7+/dLx8aW/p09NDCd65TQSLVIMpFZMNTXnc81NmeZMMwUaRGY/o/+NPk1ZKEpk9dHRSJoOh5QqicNhs1bRCrmRBh5xlViMbu/bPxWPr9nf173f53dvSDVv6fd6+7c0pza4/b794ujqa3t6rl0dDYf9Htbdt7G5eWOf2+nxhyOESx3hEsdcHGxcqSxKHnewPno+0zmeoLKEaIz2a+prpdWWWqPZZFIpmmLZvy1JNt1WUe9p/k1FuWPxEo1Sru0vU2pXX3tjiWhXC5Jp1bSP8VqcforGVmfEYPUllEKwOWbM2xpLSoxsmL5nYuKe6R+/PH6ou/vQ+Mv0qRW3rF9/y4pMx96ly/Z0YD+oBDrl9Cn41GM6tihP6wJSirDCdvmmTV8i+MorqD2JEitueWmO6KdJChGfmASq5US2Od+aQX8Aj9rEnUB3FP0IIobHJh5dLURMjDqxAFwyDz5VhFPc38BnMFyQZhCkWSxIQ645WUAS7s0M9/Oid90L427lvQvG+ULfisfiYCJwrzv6D6yJx9ceuG2f3+fZ1NSydcDrHdiaScXqLIUQuBc/hCEYQgf2rvSmPndtheZ17kOPFzjNRQ1YCOSR2qQgGVz0DNfZ2Yke7kBZ7gn6FPccajiXE/CpUyRnUWHAm+nEWYcqo6ZmP6c/YrZTNZScUlP6ef4KeDCOCD6YeFhigQsVspd5jK510bUXdxau5l7u7PzK0O1oBm4ip7HRaL7sCnSE27HuYBsKo8PcDHp2N/wDyw6DCGliWRU/QrObscVn3wN4qgQu4eE4pyAdM1WEU5yA/w48/aIEn8FwCs1+MfsZOgTa1VCUqih/VAqpCBR4Irne5DZ0+66dpVDHenEkEHJ5bkR3ZzjdxduKlvwfwddAVZAc2ZBEMdOJvr2M+yHKLef+dAQsuQLdxT3D7UUdxx4t9spBLxHfy4LxD4JNr88IrUwHtFaQVoTCMEBAVTrThALI21Tg3rRxbwL2p7TkXI4OcPXoJ+d+XDKqi/l+QJjv9ExHE5cG/OdoGE64nhO89XGSly18Xt4EAOyBjAw8UEaxpRnOCO5XRbOhNDz76KI7on/vAyeEzNLft5989jVv7vN4+jY3N2/p83r7toijk3t7evZORovZrrWY6Yo+CfHH8ySjYhPibyd1YgG4ZB58qginuL+Bz2A4xQD8MYDTlInyUgmsFWtlJTiTOhxEOZVSFQ+TaoF1RIGog+gHABUoHAE8FilB1yyNwi0tNn2IqAyPNDxaDEH8+BHSx67GSjvlTxIjsHIV978xsQ6NXSo3BPbeCEbQIjR2mVwXIJG5Hc0iBW8FVpEmWdYpq+aQYs4iZGxs/NjsJGNDUWV2GF0pjjOLFaSPxcLnsxuyWcViEFsZDqP7+ERJb+Y2kgp6Jyc9OIZz5tjBFTe/dOsKPvnRuzv2LlsKiZgm3nCCeNz8fG5TSM8XTfGKPfn8nhWnHtu4devGx+hTic3dnZsbf4uMo0NLx6gSKpWUknigIgx0BDJFOjOdp0rJ0KdGGzed2NK4l7Zw/zq2dGiM98JLmTB4oY2KkYyCh2Cu8BlpoCiUd0iIKrFdcEvBK+lD5lSTWWsqpHOlzpk122plhoS+N17Xyj0oOOrVvJ9+tcamV5lojXaSDBSfPLWVElm1WpVx9z/r7t+YnvPajf3uoq7/SkZDO2/WobKxF5pt37/kM5VV9w3cpjXO2e6a7Z2b9WLRO39kfocMY8R+iPJD/m8Avb2leRTI+ERRGGuh5vPDbBTh8UHh3iOswX5VvnWI9XePjfX44zMrkpe4NN6L/M2DrL9nbLTH37BDHHYm6oKWBmt9yKDUuPINkZGoxZA06q2JuvqQXqmtz8XDI1GQoAy0aiRzTlKNLQqb9LOP6NhH9O5M5tz1WMYtION9RG8sI0ny57M9+tr+Gzun162fbv8X8Y3fRMe4md2XXbYbcvnF37xxdpbvSyI0KET6aurEAnDJPPhUEU5xfwOfwXCQjQHpHwXZxBAfKIzwX4J7vh9VoKou7nlIgLfSk3w9s0MshfkMa2HCMhn+Y2wMg6RvdD//w9zLLxbe6H3xJehxBz167nZ6AtLm0nP3456gN32NkO8R6cog6ChFSz5d9uMf9X+Cyof/9Ee0AS3l/oSM3EmYbES4F6Afgn5XQL9FwDGKcD+kQBrur33vvNPJ/fU99Dx3OTrExd6D+OdxiX4JwU5Sop8X4JuF/B5FFhgeZFF40StcnHZzQfTrMN2RCZ97JIP9Mz77OXqHrqUMlBNzBNe0QSARPwpHI9iLJCzxKYWUhQcFGcU4ul9eF+pKjvjYFV13dXWGx8xm53R63cWFO7qTbc2pEfmgRWVi8976bL05227VR632i9Zzj30Qc3pj8QjILvD9NcieIrlL9O5CUEkJ9IUilOIWxGXOQxnrHHRxCe7P56BL3qUoBkOZ+0H3BJWj+nBNX0BvyO6xeIwvbWKJBWcTYeoOdoJsAwYTyyzwjXQRS+ZsFOUmNpZap2llxCbVuVJ98fE8ixBXYFTa8XRwwOS0bWxObWSlVeU1tqkn0aVlcu1wODSsUXSDMQvN3StFw3m2td4i2NGh9dTrWbZtdaOkXBxy+MJWm8/tdtbXKrVypw15fXXuQMBjWxNlfbH+NhjhNTD32kmfpeSUDcciyKzA8zislZC+WWEGLRQGNJOPB0y5gtEfz3Vdnstd3t+wPBJZPr0iHF4hMutCG+iz3Hf9WlN2Z3/frlxzeLwpPRYOj6WbxsPY833Ar5x4FMnJX0pJcwZETb1XtrVd2ZvdYorq+v0NKyORlQ3+fl3UtEWU39XbtzMXidQ5HUAZ6DvYunCUUK8j1CMLrXm+xA2YXbjo0ZQuepQN3vTCIsQiLfMXPIMSrbVUqN28TFot8gurHaJ5lli6rlR3cCE8xYLYKlp6zhIoQgzclY/7jIWcyR9vacBWbohjg4tyu/r6d2ZNWj9KndNuCOnM821NOJ6jdfSrlJXyzbc2dk0JG8cGUsVVEnl4bqSBPe+jSFvYlGxYl2/eoK7x2cMnZd/OdAWHWg/KL0d9I5kd7X0TE309ExNMw7pcdjIW93eAV/S72qN2uzuRro+j/sdXd0+nU8s7ukaHO7tHBf19MDZays5LQ4QhnBWlkYPOxwtqHdzdlr20o3NHKx8Sq5oCQ0YICe59dFmZTLM0HhtWy8AdbtqZz+7qE5WLA7zLuzzI7bF7QiFv3eyswBnngg4+m9DUAlBJCfSFIpTiFsRlaCGLo8vp1ymVsOqMRkq8S4HXm9KLJyYGe4wNMnW1U+UN3H4b+lGytW24RhqtrAwFm5Ocjx+nBN0JljHNr9nRYr4t+kkUV0cGnCQy578o2359fZ19a9PaCVOgoa1rZz6/s6utIWTO7TvYiP21MTEaDo8+62JjFnZ8qtWrNbZccmJHxqANruHCB69B2uDIzHAwODwzEgSN1oA4BfosmXmVZAFYOUR4r5SuKahd8e7MZLww1NUw5IVgf4HVmINru7mXkWtomXdZinsDW2wI7PQ4fRYsNkiqT/3sKEXxHKh76UphDQjk6Mpz7wN+HhrBwnP4IowPq63PAC4rgQd5OKWDp/foH8zBAwJ8BJ4eoX82B6cFOr+Hp+dK6DBEnjKqE2zfSP+aqqJqQWtt0f5zkxG7sPIMw4Xs5pRCbQq6fYVe7sPC6q8O3f5zWHY+K5XGdKEgHTn3XNvws1gfehW/5py9czZBPU2ssFKwwmpsBQL/Dl0JXCnVfH4Kc1KuMYdc3kLfebovdIwItqMHYHTmVokSmY2RKNYUUOPIHz4a+cluGI3FyPgz7vto0cyJ89Y+W2Lts+e0PJx5FjzOSeCKWJx3sAXGu2Tkc2p3tKMn5pCp3Y2DmVXRQl97rM9d6G+P9rvpylUurdmh87kN7HxnOO8Vc/5VW5zZL+RfOY2n1L8qV7t0F7jX7KxAB1fsCb5iOykhw+SBejVlKs13QnK7MLkmune1te3s6d2Vz1/Rk1geDi9vIJVMqC65nX3QND+nCpkgT/xoNZ9LKheCSkqgLxShFLcgLoO3rwD6XwDtpzRQHfwgvbC6FFTg15YlekACZ5SsTNBGBdrE/P5YY9xiA5Xifmc8HLdYeb00Sutjlu7HLA7QTqsQ1Y5ttyZSWENp31prQ2pOS59DzX2jwoY2V2Btfex5WX8+J+sSIitAGQ7s7KPSVPs8S/M+FBOy+sLzoQsHwk7yPUn3iZ6dZEgutSAa0eaZ46V53+C0bWgeuNJKQ5Pl0l4yYglSClErXw22LVXLyehdns8nGYahUxdWhXwTgJmm+cP6hlApyGwoTe8EzeSUWZgNSW0lfgrmd5DsKyTfmVzcjytzIJ4nlVpdMhPS+rlf0S+vD+lMWVyo8UzoirFIZOwK8KM5Tmcv4CT9+5wKRt/f4MTczX3Pp12AFUQFcMoSnawXzDuiYeApzDuEASmZdbTF/aYc5piZN+vA07qsSRdafy6IHH6tuZQZH+FoM4nBuQhXWIE0CW2VJ9JTtqhsaIKuvCigM+XRRePcB7iXFmbg34de7pK9swWWrMUV6zstl1jM5rXxrlZ7qrMjZQ+MZ8PrLCZbv7OQtTd1dDTZw5Miu75BbfOzBou0osYU87pzrE6ZUCuCDqNVViE1RN2+rJ1IDD6+Dap4sLT2Cnv9/KeV5EFekvmvBcRoryGlrlT4jKEu92Rv49DEQEfvWCG9tS2/NmbV1yp06lAyvVm0aFFKIrG2eHOdTag/l+wYXcktQu8NbWsIDce9BXVNubhcNdKcGcU1WAq22EnvpZTC2hhPLMJkMiHntypg2dLZPzFRuO02v8dv0iiSov4OlE5eckmSO+ML6cKyWqAyAVo10ZUClbklNihUnG2iVHYtzrLxAXchp3ZFRaG1XSjI/XzpMu9wCsnOvb/apbXMzgqUcL66mM94VmoBqKQE+kIRSnEL4jJWSljLGkBCMXgKvwR+7dXO7z3b9hpdybWgp869TyG8zmXWA04F4JSusF86k7vjnqa772p5NnvnnYDfip7E17n30Xe4AegnA9oM9MOVUsaGcfqU2ViJ7JUz/bfc0nvmRwN33Y2qZl98cZZ77ze/odDsX2YTRBZ5qf/F44QlqqLX27Nqi9xvsIVVqtc7z5xp4z5VRtPPqtVRmYINhukKwvyhcEozOyvQwtpeztvrp9Qc9IUilOJ+im3ggtvPgO+8tbgLdXGPo1u5h9GAH/1b0seNJYEC2TOoAj91UL1AgaUG0RA/p6BOUkI7OjfXLqHGSDtN1aP7UCf9GqWDFgoJc8po5EsreEXpCl5ToTYHU82pwkafz5JUKDRdbK49usbv9DjZUCU6GZBX1kIRitTUs7Jam1zd1Pz0EYNKZzTqgaMVOO4GjtXAk5LNq8PzFxkvh3q93t4Qf4/mclG40H31HT5/ob6+4Pd11Hsz4UhzJhzOkEglmayS0sAofdmfxTaSRdcUhrrj/Z5CrlJm7HanPRbFafrlEq+e0sqMem2tifuE36mm19Cn/8kZQ9fA1e3tVw8MXN3RcfVAGie9dGoiEpkQL7t1evrWZfy9Nbt3YmJvlr9jqWFsqY+EXXryburkHW/CTti5HLTVwgDVAn8dGf80XToivBASiUXBIpvTWTU0kF5lDdfv6StsSMiC/rfQ3jAysMmIqqnN4fQEIt7hRmtrh++1DOYJejHAU1ea00hGi2MnK84lkKj7QL3NuiM3Mj46FTrN3YhOn9nckG7YLg7WJ2y+7j3d0fcz4U9FoYblyYkYhchb5wNAt4qi4lEURhY+MylsUSfa0Q/9A21f+1r7oxHYTUrdfnvm0UehjxJkqYY++gvW5CCNDDadJUVNkbTroNNm2ZFdMe5et+Ibdega7inVyk17Eg3TvDh9GW9LHVqV+X1kPJ2cbKCE8Wsl77qCC+0nwMxIjkvQhUM6N6JD43taB46u8g9bDLo2dvsBprzWvDrRtimV3loI9XhWDcT6fa4h8dDN2y7/18FaeWNt9dEjSjONNIo6R2Qi0zIZbbLnfflBZ97jyLvxaJtBLCu/QwfmUdhwSH8HmblvFWia+zW9+7pnwucupxgqAJL3guRmsGm4KDuIWpzzEYFLCg2u0FYozzJiO36Jnl66q6W5SSSO6g1N245fnDbo42JRU0vrFYs3bnxsw4bxwbFVt0yMigOj6dQyFU0rWDbeOOTxDDXGWVZB06plqfRooKn72q6ua7vRYC6RymaTjTlsVxNI5+XtOr8is44gH2rzQ4WZHypv+pdZDbqCY/sBGpVLLasa85vBojli7FhswOsabMLWFQsWVZmRWm7HBm1dHR266eLLbh9EY842N5tz23P+/CCWKAsS7fqnI3Vi6TXt7dcs5e/piWh0Ik3u4pHbtm67dWTk1m1bbxtpzV07Nr43l9s7PnYt2c89Dow6izujfKyGFceffoi7P0OnYOcaR1Yr4AzPj9hiyJZE7Cjy1btr2L5Ueq095L7utm0JeTT4MTqKIzYV1jgaLfZ6bzAUWBa3tnT6XyPZLQcaDv0TMdu57JCTtU73jE9Nro29wO1E//vKtlRr8rJ5MfuJKFyM2RRIvHvBmE2h/AD3DFJmDx9u42P21lv5mO0EWVZAH2GXrjgpWiBoB2JrBgy2uss7m5e63OtH77Cjr3EPqNZvuTaZuFSsZLUJi9fRsrTFjuM2OtbUONmIR3MQ6O8AK9bN+X7pcQTxwoFbOsBXjO0rBFdc1eMdtugNbXZYzTDlcstFycLFza0Xd0b6fb7BhujSkGdY3H/T9PD+iZBMlqytye6ZUFoQ0iptbHSiOTMZa3LkV+Ycjpy3rs2Hx6AHhLv8guh9E0W5mQLt4p45H70ZkH83OcHhpuILRG/4wvBlyVCSAC7dZBtfcU0+mxGJGozGzKV9/Ze2GE0JsSiTa9uzYu327Wsv2rbtohVr140MXzQlDq5sSg1DFCtZZywx6PUOJmJOVglRPJxqWhls6tnT3b2nBw3mE425XGMij63cAVJuIlaOXDC3ZQPRL4dxFc1cGEdKz8h5+8qsvH2nC7zxNbEhMHBzeACMLS7aV2VBWkWdYN7+b2/HtkdjjrwH8qQj5/PkHVgy8+wX6DD6N5ifqYSddTIFkc+bHfx88KKLBvGV6OhIwFU2MzU5MzM5NeMb7u9ftqy/f5hC1FKKQtPo1vkxu3TXzD1bvCjv5Q57+ZyMdgI3NcYBp5o/75FDxIYVgSdZTSTpyMjt2sHYwIDJf/wj2902t8LgUqkMJnNrwNTguo6cejCB7JcDR/38zEgC1VYSqM/Hx9QqVa+/qTGRcl31IUrsbXPUsz1lBrVTrnPb6lz2A17b1xmjJWpNWCiE4x4dBbokTmGaG56LU91Lqe/fH1i+PLKpDkm5j0dHPZs2YUmsIMku6KEplYRsdoPrSoTXpi/ExlVKLEYyPTCtRuinVa1tg3VzcrSxv/VeZ4y1NVjwuLiA4iGwlJFyYZpfLqfz3wsUR0r56tgaeDmqb5TLZF511xhdYaxP+PPO+kIw1NgYC2fUsbItU/nVkfIK15LFy3orpLpatanBzibNLn93IOCQs3hXigWlvg764OiT2Uj0MQef+SCA1n0fzXTttHHXUxRD7H9EkDECUhZjL+xgBT/CgRdSfXm6GSffcRD+LDHocdfTqKbCM9rTO+aprKHpejdUxuZ8vjmdy6UTqfS2VKrMGLXZw1VIvEgfCjalp/SLxKgqbLdFjS53nc3jsdW5zzhNZocjXY+tZwfJrieSuS+omqUvzkIlcgmC3aVPKGRyj7p7lK4w1Df62pz17X5sUjOYLuoKJZNlxHLDPRVSba0GLOdsNG9ek5uM/ChoB9v5WHsQVgBmpEGH6adpCa5kyACQpciApulTAPmGADEDZCfBOSFATNDrcoLzTQGiA5yjBPItAWIFnF0E8i8CxAWQQ4TOjQKEhV5fJzjfLqF8hODcJEDsALmeQG7GEArNtsPnJH8myIbC6FH0uyRnxeeCsPQw3C9DG8tLD593I1jrUCA7PUJRAsZfFsT4loBhmsP45sIYYKMC2OisYKMCsVEBbPSaYKMC0SQLNjor2KhAISo6+zl1K7WBKp+fvzYpTSYlXCKzSm00qlU49VCx2W0EtxpwcYUoIkPiabCWL64xKVUGWixy3XCMWVwdMJqVi2rkVV8B2XgusEJgqf8GQvdSYvjk4dsugD9MCfj0IHByYDiFW39JdP1v9CBZC/YAvYeJtUEWWN4ykhLZ11UtrdaB7CCN4UfoNU75c5NCaTAoFSbScx30rOV7qmAhzpT0XF4Vr3YJPW9EP+XcdN6oUBqNSoURc62EHY03oA7pKSdwjaTLLlzmVJUpSgV5XVfvd2mX9mQmLFHn1UNt6xMEYFeYTAqV0fgjV8rnrA9aYrl6pzMUc/XG3E3+elekrlTertnVtAvkBZ7F+gx8w5iVvLgnWaoCCmI2Lq9b2wnM6nUC96smsBpw3ebqDtUnPawzZGUTXtYZMPlbgX0wTnfNqYqoDuoX1IOoDXtFvIT41dg2IPkvwCtMJt4rAPd71O/ROBmJC+azx+U2Of6zKhTW78mtKoUVf1dZ5bifEu1GW+izeL0vi0vYOBtXsWFFXCVRSVjFvegq9VXwh3xXqXbvVl2Fdh/ucLW1uToOFz8pGs/q6BvJTBOiIwxFi7/CEnIpbOSyxW2SODQcVx3+hvbICVVc/ZIqpvr6ce3hb8Dni2rjS9oXn4z/KP4k/OM/PvwR2Um5Cc0wnTieJSgM4d7Zwj28ljn5xSAFrb+F1g18qwhaEcs93II6+WYECBFqAt2ArScrsZ5frtPJ4UIRvUymxxfBHaem0OkLcYNyg0Gu0OvRuIH3BQOZAb+DWpEPc41DTUkh8TvpNMBhXY4+QPUYHgU4+uCjcJji4cxfz8OZvxbhs68g2K7EcAXBDwQCGL5hNo3MMCKVEBl8MQqT+ZPqN/GmpnguGY8nT4++/ZWvvLti/V/27//LetzHOZum/ij0ITMSNszvLTpT8XgK1mKpxGkee8W7X/nK26MU1gP4JKAP79HR88eRyW6OAteSkt1JEACASJbNq5RWq1KVzzp0DkdV1aLy8kVVVQ6H7nS2ldOpU2odl21NuhwfG62LRWWMaInV+LHDlQR+CuBXy/NTCXyEOe555gKfInObQsfaq6oxj+oqO6uz5/JqhdWqUOdzp3keS0RMmWgxz6M1KwjQSnZKZoBfPfCTAD8pkIRr5pHp6dPM3ckvXkpSvETUCwKGMNtTTE8/cjrJhJJfLP//y7XQE3WQ3PkKzplwv5fPqbACaKfPAvwnGA53Hh5D76EOst/2UwyHO8AphPGpWwC/uuiZsTj/9gaqg5rwDlgrFlcb0Zsm1eIqYH60bBFIQiFMEbL666TnhbLbKgTZRSI3eu9o2eKqgNGkWlQjq/oKyBKiOqF0fhdk+QWWBe4PEBkdAL+PwEkdgDvAKUTwRQAXQUSwIJ3qmWPHWg8f7nwC/kE77kd9KrTH2TDM/w4fbj12jG8Hunn0EPLTpwDv15gu3O8jdAFOXc9XcxlUl05RswgwFwl7bQ3MT6EKZKnBC0+FCnt3C7zuLp5do0vOqM9f78Psk2bW33tlNnvV/evX3bM7y3ZGwiYDbQhE2wrTLS3ThXzMZ2ip05p8mtS2Ew9/a2squeXEqHe9R+qdicZGgsGRWAN+A/5cdtdda9besas1c+ntU7CzYjKEQnpz9tITl7SadP6LuH0ua2hVdvnRDfHGzf/ngeObk0plUKU6FxpNNa0IBlfuXBnGmSE4+yF9lP4fiqWiVB70LCpVEjrzXiSoQCG4s4BXPP4SjzGAe37aqlLS6ydt3txwblOT01sXN8sUNe7+WLCj3u4y+Z42Vydq3Wsf+nHIaDe6e0JtcdudLp3NGA1GGytl0vK1dpXN2x/1dtkNZptWF9J7s3ZL2uNoNal0Zxr6ale1rl/9S4PaELc4EiaDDLWo5Rq/DhaILoVDpSAxdxMt5v1ZJfXRRHyL1Ab//5Qaj0QnW5A2df9a9DZy90ZiPa4vHmZqv3gLxls/+030A7BEEzVE5kjzX+vMXyvPe7/DJzCyrQRGARhNXisSN2AdZx29LQq1aTLS3F6XaCs01lkUek1NbWQyZ8o1ydXWIU97d11jW1tjnRk3SEMrN5pVhrrGgo1hTOSLldkoNcriWnvQb7arpDJLgydmV1fVqHXuQJujQlUTU6sCAZNdWSu3NnjDdg006d3+NgctWqzQui2sumYJQovlWo/ZqZIuQeR08Dn6I/opcuI5/4/PPMf//smn4117Vkdjq/d2de1dFY1N7unOzYwE/Mt2ZHOXLAsElu3oTk3EYhOp8JDGrUjVubNOZ9Zdl1K4NUMMYHd27pmMRVdfA70nY/bg8KWt2Zlhf2BkJtu6YySwJTrR1DQRra8zG/Rsm9/fxuoNJns9VTanQzVloyIwalQZOSsLKiykATmfapOSBIXd2F5cBKMOXvgTC8v+3ZHyig2Rm7qWueS6ce79ddFkMroOi32cl/rEQkLPHED70fGOpkyddPHRBwIeNz5PVYYMzFfJ6Us8LZKSt0MwxjZGahEOnaIHvE8/5UERdJ/mPu7/3oS23YQM6FbuJ8jDTaIM9z6ScGfQdp+PO0IBvRC6Hm0HfyU7jLJ/sMP4Q0+Hy9Xh8ZK7OWo0Rs0WfEfXuwteT7vL1e7xtLtd5oiFgOFu+kf5Ucip0CbhW21wfQgYf5jDwhdfJ6mHyKkO8h5kphUqJK5+dEkLpgFtDGlvbUUH0QR3+7mH8Z28Ez5Il9P7KCvlAW+NCmmJ/C5EoVRhp8SvUgDAH45TsFKcnnAqQsZkEA7FpYPJYIM/ZorqnOa6OrMTn4nzNwQdFm8k4rXsvESsJ8fhrDrxJTvKlNpIHZxLZ7gNTLUMn4pTle14CJ0Q1WrhnJxGBvJYyYz0Sqoe76bZrcXjaQ5IE3h+WzyfElfhzED8TcJ++cX1REPIot9Sv1FTo1RWazbUb9ZbQw2JkFW/0bVeI1UopNoNrs06SyiRmkomp1LJqcbGqYiiSr7Zu9FQF9gWtBk2eDcpqxSKKsVG73pDXXBboM64wbtZXqVINYzPTCQSEzPjDTjL+8F+DUyE8lONVF6wIBvHlpPiI+YL2FKpwqmAGDMqZHcAs1Eh7WPDZpvaWYO9OdKo1frgDHbC2xKKhBvhGHbIDZsMXjiDnQgU/OZ61u+wOkNOA3xhDTtnGJUGDmarFQySiBdVkHPZOrloxwxdJTUkjVUVNPfJosWV5HC2VsXseICprMFnuKsrygc/L6uQ4sPbVeUUooywW/gxfbrktDxMr2AE4B6Lp+m5VIV1gC1gsVwFd6xWMW192Lt/ja5cfMkWhtlyibhct2b/Tfv8AdfGZGZLv1JUhpZztzAMmuLuLhMp+7dkkhtdAf8+cXR1i0brUQVUHq2mZe73YpGKSgKrLI+e/0UbXkxuJevI4l7fBftTwo8YjNu3b2++amXTGqeubjSydg1ScK+jgxkkCi3turhJo2/SKidGloa4zzPF99B4TazEJ5yBJr74c9949w1fKP6b3/zmGe7PvagKVXZzf34GHq/1THjQ9dz/QVu53fD1WpgVFdc+tJg6TWHKbdRX0Kd0CK9R7IRymCdHPfZY82OPfeXh5COPJB/GeCiDPkVXkqwAiasNPYgyyST/G56T6EW6ilCAQICoAM9XxdEdzuuvd+7bj+/7T7r37XPv30/u4JvAdRtw7SUrdR1PsXRxXbroBU6/wisquV4vFz4x5x/pFQqdTqHQo2v0cqVOp5TrKRrovghSvi3kFqAq4mXlekDeh5LJv4DIWOcjwN1LifFay26PigBlmjuKHjySPnYsfbKVmo8DGHaFSIQ+xVQAbfrIydaTgEn4UYDVB7pXz7efBPgKNvwUPfgfD6YehL//INzTqIZG6D8oFfSFGow3GWzYQ3gnDYOT7quLelxaWz0doPPRuqjbrbW5UIDOoRqT0xj2dHWbnKaou6ubl/ProPFuSoT5WzDXx7ivoQe//lDybWgdAi3eFDTlS8/Qd5pOJm+44Qi6hZtCk9yt4BPFd9bgE9dQFFBywdkpGVQZhpJRJsgfSf5XuczfeUuO/k7bDWS/TORvZ9l2v7/gdBb8wWQS77qi3/vanc52X6DAsoUABsKFN9ZQ3j+cSAz7/csa4e7tyeV68MUd4sFwLwWT9S3VjN5Bf6EW4XGPqxT4qNKGZ753VxKZMwcOZLZyD6A+jHcJ1Yi+QH/CeHY2iktTXIESgHdn44GWbaiX+6+LW3CVupu+DP0n/QK/+49K/NFW8h3tk2q10lqN5rtw1cJ3+jK1TKYuvbB9b6S3o5NMP+1ALnIawg336wF+L8CfLIF7BPgN9FZ0hgkR+OcA9wH8AMj+Bcg0Rv+MKp8vEfLg2ICLvkwvx0EBoQDY++hVaCv9axyxCJZHiL191SF86BNLBF/QE4SDW0xhDrMfEw6vA/zHfB8ZLLleP7TqdtwFetwELa+QHp7PSA9qCelxAOA/hB5i0kNlYyUH9rbvbV2zBvcbGgKM4/RK9F3AqMRSky2Eop97mkfoEJ2sdyVRiB6hV+ZTrM/Hpsh7oWfoIXScsfL54e95F3Ib/Tq932D06/V+o9HhMBocdnpI79PrAwZDQA9fbDB/rHcCHKQ5TF+Enqd//neib1pVZ9BXq3S0mw6yKrtBV63SIzdIeJFcp7AaQymFTm4xBFLYjsfo9ehZpgOs4iUj6OJHUID3z8HdfwPumQcP8fCSEb+B3ofO0A8Vs+4NKELv8/sp4iNXoTOEs6+UswDvm4O7F4bznIHDi3QvuoYhv05HrLCgKznbgfwao8GoMRmkUq9C71azdK+pCjb79DJbZaXCobNFgfYXsx1obPZeWoJoivrix0D19GwdOgA+ofzybxzCEp6wsvRXDGp39byfKow2kl8kAO2K2TIqM/skJUapH/8Gnu9mKtB/MlO0hOJAgxM4uhgJRNdZmkUuDOF1RlocX9Dy5LwWj9ByA8OANZ4TWo5hiwu7//voD9FWZjvowgj0DwHkCYLrBo1O8NFCcF+Hlh8TXJGAexNAXiG4ntnPeFxqCcL7e9fSn6CfMtN/x+8u17Imswz8zodCHi1rNsnA77woSH+i1CkdhmAWPlhtsIX3u3PgL78HPl5BMxevmdBytqTFM6/luZIWQWewhg6s0Ql6VOMWApEBBNP3zacvtPxvSYt7wZZSzs/Tv0O7mdsAIps9Rx0lHtNZ4jE/Aft8Qu9Fq+mzX85t/N62gd5rVCgMeoUST7BI5jxJf+8fZOfrpRqNFK7/qdFqa2rVanq7RgoftQASPqEzZOdVaCP9g7k86T42spNetWULbnsb2p6ENiEfvr1r+ChpQnzE0s9SygvG83x2u1hlM0IeUSM3CjiNbodMpUEu5KfX1yhrtGp3UKfTqupD0J2PTfre0ii/yuulSD5ejnbQf6VqL4xOXsG4HJYUtUpFdZVFanWY6OWaJdqq6toKw5LFdr2WvO97GmrGt0CDv2+pbVK1GpvkBDZLrUpFX6YB68BXTfETS3MbWOPRebn+to1tGzPd3TjXDwzMzs5VTTGOTngu1iAxYsizUF/gWUSe56oHkpBnIevD82LyLGRreF5CnoV8CM/V5FnIM/CsIM9J2J38d/p1gPxUBM9z+5xisi+KqMQsS22d/RNZlcJMLRH55eOPU/8PhkIOIgAAAAABAAAACQAAIBg0w18PPPUACwPoAAAAANz2AKwAAAAA4zaTbf54/jUGMQP6AAAABgACAAAAAAAAeNpjYGRgYD7xn5WBgS3wX8Wfk2yGzC8YUACjLQCcjAbDAAAAeNqN0wOQ2FAUBdD7X1Lb7tq2Udu2bdu2bbvj2rYH9bC2udmbzNqZOXN/kvcVSD24yk1IVvR8zC8YKhcRaNLCMVSLQSHZwGtpjeG9XKzxwlDlzfNb6MpsqbyNL8wSzE/qu/FPLvNeA9YeJ68EtRCYGb0LAjnWULLq5D7bveAj0dC1suiflhyDpreCkyxGMRkHZZkHL2mIkMxoj5g70U0C4G3ZSQ2pfXqqGcc9wPZ2dFOF0IzMrKEKGX+YFagV28/FBnVVcWOnSVpaNd10J86xPcEweGdG92RyPQm81RL2f4Xysp65kvNvRsd0KkNpg5BXSqOEVDZeJlIG3KUL+xDHcVMbYW+NuxKBqg/ySSiKSyBzBb+HYJRmXSDfj61MhC/bNnIC1Wg5VaXqFEl1qSk1oFiqow7ClponpA1VIHtyJxeyIaec1mGPUVvPheYJbFL1yQ2YMI2Q0DaPBwiiYCtJZiFI6WhgkhAUonr4x7W60FTu9QgqqUbGS3qKjgC6AmoiItU3QHsFmKnqoDe5qoaIpFIqGkOplDkPa01BlDAnz5/Cn5yVB9ODOQI1cA01+C8Fygb4yWiO8QYVNTcEWv5DV9vgb9aoEeTM8cn6Dk/A3vzW+V1Xlgl0GMpcr8SgZoKhCZlWtJWxaGa+ay2K30Br9KbhAHbTWtpLS+kfzaA59JbW0yxaTudpIS1JY2kaNxPGOUcF082Rfvyp2Yx3LWG8X7Q3YayPKWrf0hnazD3tphn0lmbReVpIS+kcniECXxGEnQiLB9+37yt42lXBQ4DkQAAAwFgzccfus23btm3btm3btm3btm2+twpBEICkQ3IhxZBKSD2kFdINGYgsQ+6iMtoQHYpuQI+jl9H76Gv0O8ZjBbGaWFNsBrYE24DtwU5gz3AMl/E0eCG8LD4cn4zPx1fj2wmZcImSRBtiAvGI5MmyZD2yDzmCnEIuINeQB8l75C9KpjwqE9WO6kkNocZTs6il1AY6MV2bHkXfYBSmBjOVWcCsZrYxB5mnbCq2PFubbc52Zvuzo9np7GL2EnuP/cmpXMDV4vpxI7nd3DHuIneHex7LFMsbWxW7H9fipePN4kvib3iJz8Ln50vxVfkGfCd+HL+MP8Nf5x/xPwRW0ISyQk9hkXBFeCSKYi6xijhIPC3el9JJ3aWV0m7phazJ6eR68ip5n6Io9ZTBylRlj/JCxdRUaku1j3oScEAFLkgC0oJsID8oASqCWqAx6AgGgclgCVgLtoH9CV4Fn8A/LaY5WnatqjZeO6U90P7ovl5ar6W31PvrU/WF+lp9p35Uv6//NDIaLY1exmhjhbHFOGCcMV6atKmagZnOzGeWMmuYp60sVgXrmJ3CHmCvsG/ZL+y/TswJnGbOPjeF29Nd4p50L7pP3U8e7+XwSnt1vQ7eKG+jd8C77N32s/ol/br+YH+8P9tf7u/zz/g3/Kf+xwAP/KBk0CHoE4wIpgQLgrXBzuBocDH4HPwJYZgyzBTmD8uENcNGYfuwRzg0XBPuDI+Fl8M74cvwW0REfKRHaaJKUYOobTQ5WhAdjJ5HPyAKWShDC0YwBcwAc8ACsASs8h9b1LUpeNpjYGRgYLRlKGHgZ4hg4ATykAELAyMAG3gBKnjajZFDdihAFAXrm7Ft25oEk9gaxra1jqwj4ywrK0gNOuZp1bt9mw/4zyXf+PL9D3D1JT7wF+K/EPgrkdwE/kYz14G/k09Yyw9SuQj8U306cCSN5MryF88iMXAM7hk4Q/1v4EwJRtlmk1m26OHAcYNV5pli0XGZFTWbZYd9WqmybMuL+pekLQ7CChUdi1Sq7rlyIMyqsWeZlSsYNVrm0DWzapM4p2MVvWTT4upqLK+uzn62+sHdxgT9dDh+5tQn0asrutR2ODUKf0A2tZ5TY8lmXGXR8fU7DkvbrKnNY0wHh44rar7UuPjFfy6zig59c1S6ynyo9hr7syxywCwT8qzqa2eW3AKoO1v5AAB42mzBQ7QQAABFwfuyjW/btm3bVrZ1st0m27Ztn8x1di3juhma8c+vFXjxHwoFbLiqZlymip1Us4sF2GJHDfa8xoFarnCN6zjihDMuas4NbnKL27jihjseeFKHF3e4Sz33WMhu9uDNe3zwxQ9/ArjPAxp4SCBBBBPCW0KJoZE+9KWJ/vRjDbHEMYB43pDAQAYzhEEkkkQyKTxiKMMZoRYMU0tS1Yo00skgk5FkMYoxjGU0axnHXrL5QA655DGTfAoYz0QmMYFCiiimhHcco5QznGUlq9Sa7vSgJ73ojQGGGGGMidqordqpvTqoozqps7qoq7qpu3qop3qptwxkKCMZy0SmMpO5LGQpK1nLRrac4Bvf+SE72cuB5nKUk5zlIle60hlTzNhOC9ZjxTrOM52OtKIb4XKTO13Yx36iaE8HyqggjAgucJEDHOQQh9nKNk5xmpa0w5q2zGAas5nFHCbLQ56U84opnKS1vJjKMnnTiY984ggWWGLOYirZQKR8aCNf+clfAQpUkIIVolCFKVwRilSUohWjWMUpXglKVJKSlaJUpSldGcpUlrKVo1zlKV8FKlSRilWiUpWpXBWqVJWqVaNa1aleDWpUE/OIZi6PecETnvLydxtVgeRGDASDC2HGP7iWjgqNYaZi4+rOMkhXWkrl9bFa4z1FFVO3esbdO2O4vL68ubz1enPFanbv7WxRlWzyrrORi82nD8OQg/349v4eN6XVvuRXgkdJegRM+wP/D1OyU556UjANZaNPQblUTJ/9U1kpIK9RL/hvXS92sUITxs+WpW4QHAYh/HIht4F2BNGemtyAK2gIXzA4o097ow/uhhp/NCIBDBmi2iqdAaIzQEwGKDLAkAGGDE0oAxQZoMgAw36i/glhQpga7EUakyg6IexfGXy79unnhw9PzpniMl8wUTLFcqx90Pvx8v9yZzErmLfloiqZV7CFFPm1UaUkXJP4gFIP/JlSsqnOQ2AuG4FKGh3fJNw9I4vHFs+o9yg8U7N6F7KdUzXS1RDfEEuNrfckhIeEvbDkm9zuTnXKw1adtBmW5iakVkJGWqZ9LB5ZPL69lHI9m0vjfCuX5ZxtZKMPxiY5Ijy5RYNjtfes7bhC7AoZhDvtAHY9uqhjGLceX9QxtltP20t65q7F7WydaJLMrmJLrhA5Ao32wFoaZdy3NwclpO9Gh9+lTeC7+evtj/vtIlqFLthSMIytkEu2Pz/+9yJIvbPPEvhC0zGho/mP6g8I+wYHg79LdQ9mAAA=\"","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 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\nfunction parseHex(hex: string): [number, number, number] | null {\n const h = hex.replace('#', '').trim();\n if (h.length === 3) {\n return [\n parseInt(h[0] + h[0], 16),\n parseInt(h[1] + h[1], 16),\n parseInt(h[2] + h[2], 16),\n ];\n }\n if (h.length !== 6) return null;\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n if ([r, g, b].some((n) => Number.isNaN(n))) return null;\n return [r, g, b];\n}\n\nfunction toHex(r: number, g: number, b: number): string {\n const hex = (n: number) =>\n Math.max(0, Math.min(255, Math.round(n)))\n .toString(16)\n .padStart(2, '0');\n return `#${hex(r)}${hex(g)}${hex(b)}`;\n}\n\n/** Tint a store fill toward the accent so hover matches Edit Map. */\nexport function viewerHoverFillColor(\n fill: string,\n accent: string,\n hovered: boolean,\n amount = 0.2,\n): string {\n if (!hovered) return fill;\n const a = parseHex(fill);\n const b = parseHex(accent);\n if (!a || !b) return fill;\n return toHex(\n a[0] + (b[0] - a[0]) * amount,\n a[1] + (b[1] - a[1]) * amount,\n a[2] + (b[2] - a[2]) * amount,\n );\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 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 viewerHoverFillColor,\n viewerHoverFillOpacity,\n resolvedViewerHoverId,\n viewerPointerClickIsTap,\n viewerPointerOffset,\n viewerShapeHighlighted,\n type ViewerPointerGesture,\n} from '../pointer';\nimport {\n assignedConnectorShapeIds,\n assignmentSpecialIconDataUrl,\n connectorMapIconKind,\n connectorSpecialIconDataUrl,\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 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 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 url = connectorSpecialIconDataUrl(kind, true, iconColor);\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, 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 fill = fillTransparent\n ? hovered\n ? theme.ACCENT_COLOR\n : '#000000'\n : viewerHoverFillColor(color, theme.ACCENT_COLOR, hovered);\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={theme.ACCENT_COLOR}\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_NUDGE_X = 28;\nexport const ROUTE_CHANGE_MARKER_NUDGE_Y = -16;\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) {\n placed[group[0]].displayX = placed[group[0]].x + ROUTE_CHANGE_MARKER_NUDGE_X;\n placed[group[0]].displayY = placed[group[0]].y + ROUTE_CHANGE_MARKER_NUDGE_Y;\n continue;\n }\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 + ROUTE_CHANGE_MARKER_NUDGE_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, 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 { isVerticalRouteConnectorKind } from '../../core';\nimport { connectorSpecialIconDataUrl } 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\nfunction createRouteTexture(distance: number): 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 = V1_ROUTE_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, V1_ROUTE_COLOR);\n gradient.addColorStop(0.4, 'white');\n gradient.addColorStop(0.6, 'white');\n gradient.addColorStop(1, V1_ROUTE_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({ points }: { points: THREE.Vector3[] }) {\n const invalidate = useThree((state) => state.invalidate);\n const animationStartedAt = useRef(0);\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 V1_ROUTE_RADIUS,\n V1_ROUTE_RADIAL_SEGMENTS,\n );\n geometry.setDrawRange(0, 0);\n return { distance, geometry, texture: createRouteTexture(distance) };\n }, [points]);\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 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 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 levels,\n connectors,\n onActiveLevelChange,\n}: {\n change: RouteLevelChangeMarker;\n levels?: ReadonlyArray<{ id: number; name: string }>;\n connectors?: readonly CmConnector[];\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 icon = iconKind\n ? connectorSpecialIconDataUrl(iconKind, true, '#ffffff')\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 return (\n <Html\n position={[change.displayX, change.displayY, 7]}\n center\n zIndexRange={[30, 20]}\n >\n <button\n type=\"button\"\n className={`eyeon-map-route-change eyeon-map-route-change--${change.intent}`}\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-route-change__label\">{label}</span>\n </button>\n </Html>\n );\n}\n\nexport function RouteLine({\n route,\n levelId,\n levels,\n connectors,\n onActiveLevelChange,\n}: {\n route: PathResult;\n levelId: number;\n levels?: ReadonlyArray<{ id: number; name: string }>;\n connectors?: readonly CmConnector[];\n onActiveLevelChange?: (levelId: number) => void;\n}) {\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 key={`route-seg-${levelId}-${index}`} points={points} />\n ) : null,\n )}\n {levelChanges.map((change, index) => (\n <RouteChangeButton\n key={`${change.intent}-${change.targetLevelId}-${index}`}\n change={change}\n levels={levels}\n connectors={connectors}\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 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 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} from '../../core';\nimport { ModernSelect } from '../../ui/ModernSelect';\nimport type { WebsiteDestination, WebsiteMappedRetailer } from '../../core';\n\nexport function WebsiteInfoModal({\n destination,\n retailers,\n imageProxyUrl,\n onClose,\n onMapIt,\n}: {\n destination: WebsiteDestination;\n retailers: WebsiteMappedRetailer[];\n imageProxyUrl?: string | null;\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\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 <form\n className=\"eyeon-map-info-modal__form\"\n onSubmit={(e) => {\n e.preventDefault();\n const id = Number(fromRetailerId);\n if (Number.isFinite(id) && id > 0) onMapIt(id);\n }}\n >\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 {destination.anchorId == null ? (\n <span className=\"eyeon-map-info-modal__route-unavailable\">\n Directions are unavailable for this location.\n </span>\n ) : null}\n <button\n type=\"submit\"\n className=\"eyeon-map-info-modal__map-it\"\n disabled={!fromRetailerId || destination.anchorId == null}\n >\n Map IT\n </button>\n </form>\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-accent' as string]: theme.ACCENT_COLOR,\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 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","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","connectorSpecialKind","shape","raw","connectorSpecialIconDataUrl","kind","assigned","fill","assignedConnectorShapeIds","anchors","ids","anchor","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","_b","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","shapeId","hoveredShapeId","selectedShapeIds","resolvedViewerHoverId","listHoverId","pointerHoverId","viewerHoverCursor","applyViewerHoverCursor","cursor","viewerHoverFillOpacity","base","hovered","parseHex","h","g","b","n","toHex","r","viewerHoverFillColor","accent","amount","a","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","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_NUDGE_X","ROUTE_CHANGE_MARKER_NUDGE_Y","ROUTE_CHANGE_MARKER_CLUSTER","routeOriginLevelId","route","shouldPinViewToRouteOrigin","previousFrom","previousTo","nextFrom","nextTo","routeChangeLabel","intent","floorName","routeSegmentsForLevel","levelId","segments","current","point","markerDistance","layoutRouteLevelChangeMarkers","markers","placed","marker","used","group","j","ordered","rank","routeLevelChangeMarkers","changeIndex","from","to","change","V1_ROUTE_COLOR","V1_ROUTE_RADIUS","V1_ROUTE_TUBULAR_SEGMENTS","V1_ROUTE_RADIAL_SEGMENTS","V1_ROUTE_REVEAL_MS","V1_ROUTE_TEXTURE_MS","createRouteTexture","distance","context","gradientWidth","gradient","easeInOutCubic","RouteTube","invalidate","useThree","state","animationStartedAt","routeShape","useFrame","elapsed","indexCount","progress","RouteChangeButton","connectors","connector","iconKind","isVerticalRouteConnectorKind","icon","targetName","label","RouteLine","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","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","u","scale","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","mesh","si","SCENE_FLIP_SCALE","viewBoundsFromData","bounds","fitOrthoZoom","viewWidth","viewHeight","worldWidth","worldHeight","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","camera","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","useLayoutEffect","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","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","websiteMapItAnchors"],"mappings":"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","x_google_ignoreList":[16]}