@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +34 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  13. package/esm2022/lib/contracts/intensity.mjs +48 -5
  14. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  15. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  16. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  17. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  18. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  19. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  20. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  21. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  25. package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
  26. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  28. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  29. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  30. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  31. package/esm2022/lib/geometry/contour.mjs +63 -0
  32. package/esm2022/lib/geometry/loft.mjs +128 -0
  33. package/esm2022/lib/geometry/polylabel.mjs +156 -0
  34. package/esm2022/lib/geometry/raster.mjs +98 -0
  35. package/esm2022/lib/geometry/reconstruct.mjs +315 -0
  36. package/esm2022/lib/geometry/reslice-image.mjs +57 -0
  37. package/esm2022/lib/geometry/ring.mjs +201 -0
  38. package/esm2022/lib/geometry/section.mjs +215 -0
  39. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  40. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  41. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  42. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  43. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  45. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
  46. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
  47. package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
  48. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
  49. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  50. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  51. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  52. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  53. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
  54. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  55. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  56. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  57. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  58. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  59. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
  60. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
  61. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
  62. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
  63. package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
  64. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  65. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  66. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  67. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
  68. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  69. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  70. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  71. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  72. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  73. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  74. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  75. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  76. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  77. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  78. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  79. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  80. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  81. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  82. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  83. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  84. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  85. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  86. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
  87. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
  88. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  89. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  90. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  91. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  92. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  93. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  94. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  95. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  96. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  97. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  98. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  99. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  100. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  101. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  102. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  103. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  104. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  105. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  106. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  107. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  108. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  109. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  110. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  111. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  112. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  113. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  114. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  115. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  116. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  117. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  118. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  119. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  120. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  121. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  122. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  123. package/esm2022/lib/models/bezier.mjs +1 -11
  124. package/esm2022/lib/models/class-preset.mjs +41 -3
  125. package/esm2022/lib/models/geometry.mjs +27 -164
  126. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  127. package/esm2022/lib/models/polygon-factory.mjs +134 -0
  128. package/esm2022/lib/models/region-clone.mjs +68 -0
  129. package/esm2022/lib/models/region-geojson.mjs +411 -0
  130. package/esm2022/lib/models/region.mjs +34 -33
  131. package/esm2022/lib/models/shape.mjs +18 -16
  132. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  133. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  134. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  135. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  136. package/esm2022/lib/plot.utilities.mjs +296 -473
  137. package/esm2022/lib/processing/image-crop.mjs +1 -1
  138. package/esm2022/lib/processing/processing-image.mjs +28 -15
  139. package/esm2022/lib/provide-visualization.mjs +40 -14
  140. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
  141. package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
  142. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
  143. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  144. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  145. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  146. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  147. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  148. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  149. package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
  150. package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
  151. package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
  152. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
  153. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  154. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  155. package/esm2022/lib/region-ops.service.mjs +28 -70
  156. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  157. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  158. package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
  159. package/esm2022/lib/region-overlay/region-style.mjs +97 -0
  160. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  161. package/esm2022/lib/region-source/http-region-source.mjs +104 -0
  162. package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
  163. package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
  164. package/esm2022/lib/region-source/region-source.mjs +67 -0
  165. package/esm2022/lib/region-source/region-tiles.mjs +708 -0
  166. package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
  167. package/esm2022/lib/render-orchestrator.mjs +14 -11
  168. package/esm2022/lib/render-session.mjs +207 -0
  169. package/esm2022/lib/routing-visualizer.service.mjs +858 -414
  170. package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
  171. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  172. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  173. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  174. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  175. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  176. package/esm2022/lib/spatial/lod.mjs +187 -0
  177. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  178. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  179. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  180. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  181. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  182. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  183. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  184. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  185. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  186. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  187. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  188. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  189. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  190. package/esm2022/lib/spatial/stats.mjs +71 -0
  191. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  192. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  193. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  194. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  195. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  196. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  197. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  198. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  199. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  200. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  201. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  202. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  203. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  204. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  205. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  206. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  207. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  208. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  209. package/esm2022/lib/store/class-color.util.mjs +53 -5
  210. package/esm2022/lib/store/class-signatures.mjs +63 -0
  211. package/esm2022/lib/store/region-history.mjs +146 -0
  212. package/esm2022/lib/store/region-scope-cache.mjs +144 -0
  213. package/esm2022/lib/store/region-selection.mjs +82 -0
  214. package/esm2022/lib/store/region-source-scope.mjs +171 -0
  215. package/esm2022/lib/store/region-store.service.mjs +986 -670
  216. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  217. package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
  218. package/esm2022/lib/toast-outlets.mjs +5 -4
  219. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  220. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  221. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  222. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  223. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  224. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
  225. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  226. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  227. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  228. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  229. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  230. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  231. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  232. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  233. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  234. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  235. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  236. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  237. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  238. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
  239. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  240. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  241. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  242. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  243. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  244. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  245. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  246. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  247. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  248. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  249. package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
  250. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  251. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  252. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  253. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  254. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  255. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  256. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  257. package/esm2022/lib/util/supersede.mjs +56 -0
  258. package/esm2022/lib/visualization.module.mjs +39 -141
  259. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  260. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  261. package/esm2022/lib/visualizer/region-load.mjs +123 -0
  262. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  263. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  264. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  265. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  266. package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
  267. package/esm2022/lib/visualizer.component.mjs +602 -1902
  268. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  269. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  270. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  271. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
  272. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
  273. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
  274. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
  275. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
  276. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
  277. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  278. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  279. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  280. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  281. package/fesm2022/mask.worker.js +36 -917
  282. package/fesm2022/onnx-sam.worker.js +52 -16
  283. package/fesm2022/region-source.worker.js +1067 -0
  284. package/fesm2022/spatial-math.worker.js +471 -0
  285. package/fesm2022/tsne.worker.js +32 -15
  286. package/index.d.ts +19 -10
  287. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  288. package/lib/contracts/capabilities.contract.d.ts +4 -2
  289. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  290. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  291. package/lib/contracts/color.d.ts +27 -0
  292. package/lib/contracts/colormap-lut.d.ts +19 -4
  293. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  294. package/lib/contracts/display-types.d.ts +21 -0
  295. package/lib/contracts/image.contract.d.ts +4 -0
  296. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  297. package/lib/contracts/intensity.d.ts +13 -2
  298. package/lib/contracts/plot-type.d.ts +3 -1
  299. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  300. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  301. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  302. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  303. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  304. package/lib/contracts/region-editor-api.contract.d.ts +85 -1
  305. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  306. package/lib/contracts/region-store.contract.d.ts +22 -0
  307. package/lib/contracts/sam.contract.d.ts +7 -0
  308. package/lib/contracts/section-view.contract.d.ts +44 -0
  309. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  310. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  311. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  312. package/lib/contracts/visualizer.contract.d.ts +231 -54
  313. package/lib/contracts/viz-config.d.ts +9 -0
  314. package/lib/geometry/contour.d.ts +24 -0
  315. package/lib/geometry/loft.d.ts +22 -0
  316. package/lib/geometry/polylabel.d.ts +23 -0
  317. package/lib/geometry/raster.d.ts +42 -0
  318. package/lib/geometry/reconstruct.d.ts +54 -0
  319. package/lib/geometry/reslice-image.d.ts +33 -0
  320. package/lib/geometry/ring.d.ts +67 -0
  321. package/lib/geometry/section.d.ts +52 -0
  322. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  323. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  324. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  325. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  326. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  327. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  328. package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
  329. package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
  330. package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
  331. package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
  332. package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
  333. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  334. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  335. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  336. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
  337. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  338. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  339. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  340. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  341. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  342. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  343. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
  344. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
  345. package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
  346. package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
  347. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  348. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  349. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  350. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  351. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  352. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  353. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  354. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  355. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  356. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  357. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  358. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  359. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  360. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  361. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  362. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  363. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  364. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  365. package/lib/implementations/osd/osd-export.d.ts +36 -0
  366. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  367. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  368. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  369. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
  370. package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
  371. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  372. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  373. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  374. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  375. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  376. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  377. package/lib/implementations/osd/simple-source.d.ts +161 -0
  378. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  379. package/lib/implementations/osd/tile-client.d.ts +11 -14
  380. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  381. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  382. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  383. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  384. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  385. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  386. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  387. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  388. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  389. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  390. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  391. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  392. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  393. package/lib/implementations/region-centroids.d.ts +14 -0
  394. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  395. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  396. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  397. package/lib/implementations/tile-server/index.d.ts +5 -0
  398. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  399. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  400. package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
  401. package/lib/implementations/tile-server/transport.d.ts +62 -0
  402. package/lib/intensity/intensity-profile.d.ts +66 -0
  403. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  404. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  405. package/lib/models/bezier.d.ts +0 -5
  406. package/lib/models/class-preset.d.ts +25 -0
  407. package/lib/models/geometry.d.ts +14 -48
  408. package/lib/models/polygon-edit.d.ts +72 -0
  409. package/lib/models/polygon-factory.d.ts +45 -0
  410. package/lib/models/region-clone.d.ts +20 -0
  411. package/lib/models/region-geojson.d.ts +57 -0
  412. package/lib/models/region.d.ts +59 -4
  413. package/lib/models/shape.d.ts +8 -0
  414. package/lib/plot-mode/contribution-host.d.ts +125 -0
  415. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  416. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  417. package/lib/plot.utilities.d.ts +19 -30
  418. package/lib/processing/processing-image.d.ts +5 -2
  419. package/lib/provide-visualization.d.ts +19 -2
  420. package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
  421. package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
  422. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
  423. package/lib/region-editor/file-stem.d.ts +7 -0
  424. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  425. package/lib/region-editor/mask-export.service.d.ts +54 -0
  426. package/lib/region-editor/mask-raster.d.ts +2 -8
  427. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  428. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  429. package/lib/region-editor/region-editor.component.d.ts +283 -200
  430. package/lib/region-editor/region-metrics.d.ts +34 -0
  431. package/lib/region-editor/region-persistence.service.d.ts +77 -0
  432. package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
  433. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  434. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  435. package/lib/region-ops.service.d.ts +1 -7
  436. package/lib/region-overlay/region-geometry.d.ts +158 -0
  437. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  438. package/lib/region-overlay/region-source-layer.d.ts +96 -0
  439. package/lib/region-overlay/region-style.d.ts +52 -0
  440. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  441. package/lib/region-source/http-region-source.d.ts +45 -0
  442. package/lib/region-source/region-source-ops.d.ts +89 -0
  443. package/lib/region-source/region-source-worker.d.ts +7 -0
  444. package/lib/region-source/region-source.d.ts +82 -0
  445. package/lib/region-source/region-tiles.d.ts +289 -0
  446. package/lib/region-source/worker-region-source.d.ts +65 -0
  447. package/lib/render-orchestrator.d.ts +6 -2
  448. package/lib/render-session.d.ts +75 -0
  449. package/lib/routing-visualizer.service.d.ts +248 -59
  450. package/lib/section-pane/section-pane.component.d.ts +47 -0
  451. package/lib/spatial/density-raster.d.ts +6 -0
  452. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  453. package/lib/spatial/embedding-compute.d.ts +21 -2
  454. package/lib/spatial/glyphs.d.ts +16 -0
  455. package/lib/spatial/lod.d.ts +94 -0
  456. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  457. package/lib/spatial/spatial-density.d.ts +15 -5
  458. package/lib/spatial/spatial-encoding.d.ts +11 -44
  459. package/lib/spatial/spatial-expression.d.ts +40 -22
  460. package/lib/spatial/spatial-framing.d.ts +1 -0
  461. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  462. package/lib/spatial/spatial-hover.d.ts +4 -16
  463. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  464. package/lib/spatial/spatial-selection.d.ts +21 -26
  465. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  466. package/lib/spatial/spatial-tiles.d.ts +9 -256
  467. package/lib/spatial/stats.d.ts +38 -0
  468. package/lib/spatial/transcript-grouping.d.ts +119 -0
  469. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  470. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  471. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  472. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  473. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  474. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  475. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  476. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  477. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  478. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  479. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  480. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  481. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  482. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  483. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  484. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  485. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  486. package/lib/store/class-color.util.d.ts +39 -2
  487. package/lib/store/class-signatures.d.ts +11 -0
  488. package/lib/store/region-history.d.ts +66 -0
  489. package/lib/store/region-scope-cache.d.ts +65 -0
  490. package/lib/store/region-selection.d.ts +36 -0
  491. package/lib/store/region-source-scope.d.ts +68 -0
  492. package/lib/store/region-store.service.d.ts +312 -116
  493. package/lib/store/visualizer-store.service.d.ts +32 -33
  494. package/lib/toast-outlets.d.ts +4 -3
  495. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  496. package/lib/toolbar/canvas-tools.d.ts +20 -0
  497. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  498. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  499. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  500. package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
  501. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  502. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  503. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  504. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  505. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  506. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  507. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  508. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  509. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  510. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  511. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  512. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  513. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  514. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
  515. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  516. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  517. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  518. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  519. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  520. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  521. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  522. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  523. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  524. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  525. package/lib/toolbar/toolbar.component.d.ts +55 -84
  526. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  527. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  528. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  529. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  530. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  531. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  532. package/lib/util/mark-for-check.d.ts +11 -0
  533. package/lib/util/supersede.d.ts +53 -0
  534. package/lib/visualization.module.d.ts +18 -39
  535. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  536. package/lib/visualizer/region-actions.d.ts +54 -0
  537. package/lib/visualizer/region-load.d.ts +46 -0
  538. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  539. package/lib/visualizer/tool-modes.d.ts +49 -0
  540. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  541. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  542. package/lib/visualizer/volume-sections.d.ts +64 -0
  543. package/lib/visualizer.component.d.ts +232 -447
  544. package/lib/workers/spatial-math-ops.d.ts +65 -0
  545. package/lib/workers/spatial-math-worker.d.ts +7 -0
  546. package/lib/workers/spatial-math.d.ts +74 -0
  547. package/package.json +12 -3
  548. package/src/lib/assets/slice.svg +23 -0
  549. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  550. package/src/lib/styles/viz-icons.scss +14 -0
  551. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  552. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  553. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  554. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  555. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  556. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  557. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  558. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  559. package/src/lib/assets/cell-detection.svg +0 -37
  560. package/src/lib/assets/click.svg +0 -1
  561. package/src/lib/assets/colormap-luts.json +0 -1
  562. package/src/lib/assets/edit-selection-white.svg +0 -47
  563. package/src/lib/assets/icons/colormap-earth.png +0 -0
  564. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  565. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  566. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  567. package/src/lib/assets/picture-segmentation.svg +0 -43
  568. package/src/lib/assets/test/download-379.svg +0 -1
  569. package/src/lib/assets/test/download-98.svg +0 -1
  570. package/src/lib/assets/test/json-1.svg +0 -1
  571. package/src/lib/assets/test/load-53.svg +0 -1
  572. package/src/lib/assets/test/mask-44.svg +0 -1
  573. package/src/lib/assets/test/mask-download-44.svg +0 -15
  574. package/src/lib/assets/test/mask-save-44.svg +0 -11
  575. package/src/lib/assets/test/overlay-1.svg +0 -1
  576. package/src/lib/assets/test/overlay-4.svg +0 -1
  577. package/src/lib/assets/test/region-26.svg +0 -1
  578. package/src/lib/assets/test/save-56.svg +0 -1
  579. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -0,0 +1,228 @@
1
+ import { WORLD, boundsKind, regionHasHoles, regionPathD } from './region-geometry';
2
+ const SVG_NS = 'http://www.w3.org/2000/svg';
3
+ export const IDENTITY_AFFINE = [1, 0, 0, 1, 0, 0];
4
+ /**
5
+ * The affine of a projection that is affine (pan/zoom/rotate/flip), read from
6
+ * where it sends (0,0), (1,0) and (0,1) — how the OSD overlay gets its matrix
7
+ * from the viewport transform without depending on viewer internals. (napari-js
8
+ * hands the napari overlay its matrix directly: `Viewer.canvasTransform()`.)
9
+ */
10
+ export function affineFromProjection(project) {
11
+ const [ox, oy] = project(0, 0);
12
+ const [ux, uy] = project(1, 0);
13
+ const [vx, vy] = project(0, 1);
14
+ return [ux - ox, uy - oy, vx - ox, vy - oy, ox, oy];
15
+ }
16
+ /** Apply an affine to a point. */
17
+ export function applyAffine(m, x, y) {
18
+ return [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];
19
+ }
20
+ /**
21
+ * A screen-space layer: elements positioned from world anchors through the
22
+ * current camera, re-positioned (not rebuilt) on every camera change.
23
+ */
24
+ export class ScreenLayer {
25
+ constructor(group, project) {
26
+ this.group = group;
27
+ this.project = project;
28
+ this.placed = [];
29
+ }
30
+ /** Append `el`, positioned by `place` now and after every camera change. */
31
+ place(el, place) {
32
+ place(el, this.project);
33
+ this.group.appendChild(el);
34
+ this.placed.push({ el, place: place });
35
+ return el;
36
+ }
37
+ /** Append `el` with attributes `x`/`y` (e.g. `'cx'`/`'cy'`) at a world point, offset in pixels. */
38
+ at(el, wx, wy, attrs = {}) {
39
+ const { x = 'x', y = 'y', dx = 0, dy = 0 } = attrs;
40
+ return this.place(el, (e, project) => {
41
+ const [sx, sy] = project(wx, wy);
42
+ e.setAttribute(x, `${sx + dx}`);
43
+ e.setAttribute(y, `${sy + dy}`);
44
+ });
45
+ }
46
+ /** A `<line>` between two world points. */
47
+ line(ax, ay, bx, by) {
48
+ return this.place(svgEl('line'), (e, project) => {
49
+ const [x1, y1] = project(ax, ay);
50
+ const [x2, y2] = project(bx, by);
51
+ e.setAttribute('x1', `${x1}`);
52
+ e.setAttribute('y1', `${y1}`);
53
+ e.setAttribute('x2', `${x2}`);
54
+ e.setAttribute('y2', `${y2}`);
55
+ });
56
+ }
57
+ /** A `<polygon>` / `<polyline>` through world points. */
58
+ poly(tag, pts) {
59
+ return this.place(svgEl(tag), (e, project) => {
60
+ e.setAttribute('points', pts.map((p) => project(p.x, p.y).join(',')).join(' '));
61
+ });
62
+ }
63
+ /** Re-position every element for the current camera. */
64
+ reproject() {
65
+ for (const { el, place } of this.placed)
66
+ place(el, this.project);
67
+ }
68
+ get isEmpty() {
69
+ return !this.group.firstChild;
70
+ }
71
+ clear() {
72
+ this.placed.length = 0;
73
+ while (this.group.firstChild)
74
+ this.group.removeChild(this.group.firstChild);
75
+ }
76
+ }
77
+ /** Create an SVG element. */
78
+ export function svgEl(tag) {
79
+ return document.createElementNS(SVG_NS, tag);
80
+ }
81
+ export class SvgRegionRenderer {
82
+ constructor(svg, opts) {
83
+ this.svg = svg;
84
+ this.opts = opts;
85
+ this.camera = IDENTITY_AFFINE;
86
+ this.world = svgEl('g');
87
+ /** World → svg-local pixels through the current camera. */
88
+ this.project = (x, y) => applyAffine(this.camera, x, y);
89
+ this.world.setAttribute('data-layer', 'regions');
90
+ this.labels = new ScreenLayer(svgEl('g'), this.project);
91
+ this.labels.group.setAttribute('data-layer', 'labels');
92
+ this.overlay = new ScreenLayer(svgEl('g'), this.project);
93
+ this.overlay.group.setAttribute('data-layer', 'overlay');
94
+ this.applyCamera();
95
+ }
96
+ /** The current world → svg-local affine. */
97
+ get affine() {
98
+ return this.camera;
99
+ }
100
+ /**
101
+ * Move the camera: rewrite the world group's transform and re-position the
102
+ * screen-space elements. No element is created or removed. Returns false
103
+ * (and touches nothing) when the affine did not change.
104
+ */
105
+ setCamera(affine) {
106
+ if (!affine.every(Number.isFinite))
107
+ return false;
108
+ if (affine.every((v, i) => v === this.camera[i]))
109
+ return false;
110
+ this.camera = affine;
111
+ this.applyCamera();
112
+ this.labels.reproject();
113
+ this.overlay.reproject();
114
+ return true;
115
+ }
116
+ /** Rebuild the region shapes (world space) and their decorations. */
117
+ render(regions, selected) {
118
+ const shapes = document.createDocumentFragment();
119
+ this.labels.clear();
120
+ const sel = new Set(selected);
121
+ regions.forEach((region, i) => {
122
+ if (this.opts.skip?.(region))
123
+ return;
124
+ const isSel = sel.has(i);
125
+ const el = this.shapeOf(region);
126
+ if (el) {
127
+ el.setAttribute('vector-effect', 'non-scaling-stroke');
128
+ this.opts.styleShape(el, region, isSel);
129
+ shapes.appendChild(el);
130
+ }
131
+ this.opts.decorate?.(region, i, isSel, this.labels);
132
+ });
133
+ while (this.world.firstChild)
134
+ this.world.removeChild(this.world.firstChild);
135
+ this.world.appendChild(shapes);
136
+ this.sync();
137
+ }
138
+ /** Rebuild the overlay layer (the selected region's handles, drafts). */
139
+ renderOverlay(build) {
140
+ this.overlay.clear();
141
+ build(this.overlay);
142
+ this.sync();
143
+ }
144
+ /** Remove every layer from the svg. */
145
+ destroy() {
146
+ for (const g of [this.world, this.labels.group, this.overlay.group])
147
+ g.parentNode?.removeChild(g);
148
+ }
149
+ applyCamera() {
150
+ this.world.setAttribute('transform', `matrix(${this.camera.join(' ')})`);
151
+ }
152
+ /** Attach the layers that have content (in order) and detach the empty ones. */
153
+ sync() {
154
+ const layers = [
155
+ [this.world, !!this.world.firstChild],
156
+ [this.labels.group, !this.labels.isEmpty],
157
+ [this.overlay.group, !this.overlay.isEmpty],
158
+ ];
159
+ let before = null;
160
+ for (let i = layers.length - 1; i >= 0; i--) {
161
+ const [g, show] = layers[i];
162
+ if (!show) {
163
+ g.parentNode?.removeChild(g);
164
+ continue;
165
+ }
166
+ if (g.parentNode !== this.svg || g.nextSibling !== before) {
167
+ if (before)
168
+ this.svg.insertBefore(g, before);
169
+ else if (g.parentNode !== this.svg)
170
+ this.svg.appendChild(g);
171
+ }
172
+ before = g;
173
+ }
174
+ }
175
+ /** The world-space element for a region's geometry, or null when it has none. */
176
+ shapeOf(region) {
177
+ const b = region.bounds;
178
+ switch (boundsKind(b)) {
179
+ case 'rect': {
180
+ const r = b;
181
+ const x0 = Math.min(r.x, r.x + r.width), y0 = Math.min(r.y, r.y + r.height);
182
+ const w = Math.abs(r.width), h = Math.abs(r.height);
183
+ if (this.opts.rectElement === 'rect') {
184
+ const el = svgEl('rect');
185
+ el.setAttribute('x', `${x0}`);
186
+ el.setAttribute('y', `${y0}`);
187
+ el.setAttribute('width', `${w}`);
188
+ el.setAttribute('height', `${h}`);
189
+ return el;
190
+ }
191
+ const el = svgEl('polygon');
192
+ el.setAttribute('points', `${x0},${y0} ${x0 + w},${y0} ${x0 + w},${y0 + h} ${x0},${y0 + h}`);
193
+ return el;
194
+ }
195
+ case 'poly': {
196
+ const p = b;
197
+ const n = p.xpoints?.length ?? 0;
198
+ if (n === 0)
199
+ return null;
200
+ const holes = regionHasHoles(region);
201
+ if ((p.bezier && n >= 2) || holes)
202
+ return pathEl(regionPathD(region, WORLD), holes);
203
+ const el = svgEl(p.closed === false ? 'polyline' : 'polygon');
204
+ let pts = '';
205
+ for (let i = 0; i < n; i++)
206
+ pts += `${i ? ' ' : ''}${p.xpoints[i]},${p.ypoints[i]}`;
207
+ el.setAttribute('points', pts);
208
+ return el;
209
+ }
210
+ case 'multi': {
211
+ const parts = b.polygons;
212
+ if (!parts.some((p) => (p.xpoints?.length ?? 0) >= 3))
213
+ return null;
214
+ return pathEl(regionPathD(region, WORLD), true);
215
+ }
216
+ default:
217
+ return null;
218
+ }
219
+ }
220
+ }
221
+ function pathEl(d, evenOdd) {
222
+ const el = svgEl('path');
223
+ el.setAttribute('d', d);
224
+ if (evenOdd)
225
+ el.setAttribute('fill-rule', 'evenodd');
226
+ return el;
227
+ }
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLXJlZ2lvbi1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLW92ZXJsYXkvc3ZnLXJlZ2lvbi1yZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxQkEsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5GLE1BQU0sTUFBTSxHQUFHLDRCQUE0QixDQUFDO0FBUTVDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFMUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBNEQ7SUFDL0YsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxrQ0FBa0M7QUFDbEMsTUFBTSxVQUFVLFdBQVcsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7SUFDekQsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMs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RUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUNuRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRDtnQkFDRSxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsU0FBUyxNQUFNLENBQUMsQ0FBUyxFQUFFLE9BQWdCO0lBQ3pDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QixFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QixJQUFJLE9BQU87UUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdvcmxkLXNwYWNlIFNWRyByZWdpb24gcmVuZGVyZXIgc2hhcmVkIGJ5IHRoZSBPcGVuU2VhZHJhZ29uIGFuZCBuYXBhcmlcbiAqIG92ZXJsYXlzIChyZXZpZXcgTkFQQVJJLUJPVU5EQVJZLTEwLCBPU0QtUExPVExZLTExKS5cbiAqXG4gKiBUaGUgb3ZlcmxheXMgdXNlZCB0byBkZWxldGUgYW5kIHJlYnVpbGQgZXZlcnkgcmVnaW9uIGVsZW1lbnQgb24gZXZlcnkgY2FtZXJhXG4gKiBmcmFtZSwgcHJvamVjdGluZyBldmVyeSB2ZXJ0ZXggdG8gc2NyZWVuIHBpeGVscyAobmFwYXJpIGFsc28gcmVhZCB0aGUgbGF5b3V0XG4gKiBvbmNlIHBlciB2ZXJ0ZXgpLiBIZXJlIHJlZ2lvbiBnZW9tZXRyeSBpcyBkcmF3biBPTkNFLCBpbiB3b3JsZCBjb29yZGluYXRlcyxcbiAqIGluc2lkZSBhIHNpbmdsZSBgPGcgdHJhbnNmb3JtPVwibWF0cml4KGEgYiBjIGQgZSBmKVwiPmAsIHdpdGhcbiAqIGB2ZWN0b3ItZWZmZWN0OiBub24tc2NhbGluZy1zdHJva2VgIHNvIHN0cm9rZXMga2VlcCB0aGVpciBwaXhlbCB3aWR0aC4gQVxuICogY2FtZXJhIGNoYW5nZSByZXdyaXRlcyB0aGF0IG9uZSBhdHRyaWJ1dGUgYW5kIHJlLXBvc2l0aW9ucyB0aGUgZmV3XG4gKiBzY3JlZW4tc2l6ZWQgZWxlbWVudHMgKGxhYmVscywgdGhlIHNlbGVjdGVkIHJlZ2lvbidzIGhhbmRsZXMsIGEgZHJhZnQpIOKAlFxuICogbm90aGluZyBpcyBjcmVhdGVkIG9yIHJlbW92ZWQuIFJlZ2lvbiBub2RlcyBhcmUgcmVidWlsdCBvbmx5IHdoZW4gdGhlXG4gKiByZWdpb25zIG9yIHRoZSBzZWxlY3Rpb24gY2hhbmdlICh7QGxpbmsgcmVuZGVyfSkuXG4gKlxuICogTGF5ZXJzLCBib3R0b20gdG8gdG9wLCBlYWNoIGF0dGFjaGVkIG9ubHkgd2hpbGUgaXQgaGFzIGNvbnRlbnQ6XG4gKiAgMS4gd29ybGQgICDigJQgcmVnaW9uIHNoYXBlcywgaW4gd29ybGQgY29vcmRpbmF0ZXMgKHRyYW5zZm9ybWVkIGdyb3VwKTtcbiAqICAyLiBsYWJlbHMgIOKAlCBzY3JlZW4tc3BhY2UgdGV4dCBwaW5uZWQgdG8gd29ybGQgYW5jaG9ycywgcmVidWlsdCB3aXRoIHRoZSByZWdpb25zO1xuICogIDMuIG92ZXJsYXkg4oCUIHNjcmVlbi1zcGFjZSBoYW5kbGVzL2RyYWZ0cywgcmVidWlsdCBieSB0aGUgb3ZlcmxheSBvbiBkZW1hbmRcbiAqICAgICAoe0BsaW5rIHJlbmRlck92ZXJsYXl9KS5cbiAqL1xuaW1wb3J0IHsgTXVsdGlQb2x5Z29uLCBQb2x5Z29uLCBSZWN0YW5nbGUsIFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgV09STEQsIGJvdW5kc0tpbmQsIHJlZ2lvbkhhc0hvbGVzLCByZWdpb25QYXRoRCB9IGZyb20gJy4vcmVnaW9uLWdlb21ldHJ5JztcblxuY29uc3QgU1ZHX05TID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcblxuLyoqIEFuIFNWRyBhZmZpbmUgYG1hdHJpeChhIGIgYyBkIGUgZilgOiB4JyA9IGHCt3ggKyBjwrd5ICsgZSwgeScgPSBiwrd4ICsgZMK3eSArIGYuICovXG5leHBvcnQgdHlwZSBBZmZpbmUgPSByZWFkb25seSBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbi8qKiBXb3JsZCDihpIgc3ZnLWxvY2FsIHBpeGVsIHByb2plY3Rpb24uICovXG5leHBvcnQgdHlwZSBQcm9qZWN0ID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgSURFTlRJVFlfQUZGSU5FOiBBZmZpbmUgPSBbMSwgMCwgMCwgMSwgMCwgMF07XG5cbi8qKlxuICogVGhlIGFmZmluZSBvZiBhIHByb2plY3Rpb24gdGhhdCBpcyBhZmZpbmUgKHBhbi96b29tL3JvdGF0ZS9mbGlwKSwgcmVhZCBmcm9tXG4gKiB3aGVyZSBpdCBzZW5kcyAoMCwwKSwgKDEsMCkgYW5kICgwLDEpIOKAlCBob3cgdGhlIE9TRCBvdmVybGF5IGdldHMgaXRzIG1hdHJpeFxuICogZnJvbSB0aGUgdmlld3BvcnQgdHJhbnNmb3JtIHdpdGhvdXQgZGVwZW5kaW5nIG9uIHZpZXdlciBpbnRlcm5hbHMuIChuYXBhcmktanNcbiAqIGhhbmRzIHRoZSBuYXBhcmkgb3ZlcmxheSBpdHMgbWF0cml4IGRpcmVjdGx5OiBgVmlld2VyLmNhbnZhc1RyYW5zZm9ybSgpYC4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZmZpbmVGcm9tUHJvamVjdGlvbihwcm9qZWN0OiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0pOiBBZmZpbmUge1xuICBjb25zdCBbb3gsIG95XSA9IHByb2plY3QoMCwgMCk7XG4gIGNvbnN0IFt1eCwgdXldID0gcHJvamVjdCgxLCAwKTtcbiAgY29uc3QgW3Z4LCB2eV0gPSBwcm9qZWN0KDAsIDEpO1xuICByZXR1cm4gW3V4IC0gb3gsIHV5IC0gb3ksIHZ4IC0gb3gsIHZ5IC0gb3ksIG94LCBveV07XG59XG5cbi8qKiBBcHBseSBhbiBhZmZpbmUgdG8gYSBwb2ludC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFmZmluZShtOiBBZmZpbmUsIHg6IG51bWJlciwgeTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gIHJldHVybiBbbVswXSAqIHggKyBtWzJdICogeSArIG1bNF0sIG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdXTtcbn1cblxuLyoqIEhvdyBhIHBsYWNlZCBzY3JlZW4gZWxlbWVudCBpcyAocmUpcG9zaXRpb25lZCBmb3IgdGhlIGN1cnJlbnQgY2FtZXJhLiAqL1xuZXhwb3J0IHR5cGUgUGxhY2VtZW50PFQgZXh0ZW5kcyBTVkdFbGVtZW50PiA9IChlbDogVCwgcHJvamVjdDogUHJvamVjdCkgPT4gdm9pZDtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBTdmdSZWdpb25SZW5kZXJlcn0uICovXG5leHBvcnQgaW50ZXJmYWNlIFN2Z1JlZ2lvblJlbmRlcmVyT3B0aW9ucyB7XG4gIC8qKiBEcmF3IGEge0BsaW5rIFJlY3RhbmdsZX0gYXMgYSBgPHJlY3Q+YCBvciBhcyBhIGZvdXItcG9pbnQgYDxwb2x5Z29uPmAuIERlZmF1bHQgcG9seWdvbi4gKi9cbiAgcmVjdEVsZW1lbnQ/OiAncmVjdCcgfCAncG9seWdvbic7XG4gIC8qKiBTdHJva2UgYW5kIGZpbGwgZm9yIG9uZSByZWdpb24ncyBzaGFwZSBlbGVtZW50LiAqL1xuICBzdHlsZVNoYXBlKGVsOiBTVkdFbGVtZW50LCByZWdpb246IFJlZ2lvbiwgc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogQWRkIGEgcmVnaW9uJ3Mgc2NyZWVuLXNwYWNlIGRlY29yYXRpb25zIChpdHMgbGFiZWwpIOKAlCBvbmNlIHBlciB7QGxpbmsgcmVuZGVyfS4gKi9cbiAgZGVjb3JhdGU/KHJlZ2lvbjogUmVnaW9uLCBpbmRleDogbnVtYmVyLCBzZWxlY3RlZDogYm9vbGVhbiwgbGF5ZXI6IFNjcmVlbkxheWVyKTogdm9pZDtcbiAgLyoqIExlYXZlIGEgcmVnaW9uIG91dCBlbnRpcmVseSAoaXQga2VlcHMgaXRzIGluZGV4KS4gKi9cbiAgc2tpcD8ocmVnaW9uOiBSZWdpb24pOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgc2NyZWVuLXNwYWNlIGxheWVyOiBlbGVtZW50cyBwb3NpdGlvbmVkIGZyb20gd29ybGQgYW5jaG9ycyB0aHJvdWdoIHRoZVxuICogY3VycmVudCBjYW1lcmEsIHJlLXBvc2l0aW9uZWQgKG5vdCByZWJ1aWx0KSBvbiBldmVyeSBjYW1lcmEgY2hhbmdlLlxuICovXG5leHBvcnQgY2xhc3MgU2NyZWVuTGF5ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYWNlZDogQXJyYXk8eyBlbDogU1ZHRWxlbWVudDsgcGxhY2U6IFBsYWNlbWVudDxTVkdFbGVtZW50PiB9PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGdyb3VwOiBTVkdHRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3Q6IFByb2plY3QsXG4gICkge31cblxuICAvKiogQXBwZW5kIGBlbGAsIHBvc2l0aW9uZWQgYnkgYHBsYWNlYCBub3cgYW5kIGFmdGVyIGV2ZXJ5IGNhbWVyYSBjaGFuZ2UuICovXG4gIHBsYWNlPFQgZXh0ZW5kcyBTVkdFbGVtZW50PihlbDogVCwgcGxhY2U6IFBsYWNlbWVudDxUPik6IFQge1xuICAgIHBsYWNlKGVsLCB0aGlzLnByb2plY3QpO1xuICAgIHRoaXMuZ3JvdXAuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHRoaXMucGxhY2VkLnB1c2goeyBlbCwgcGxhY2U6IHBsYWNlIGFzIFBsYWNlbWVudDxTVkdFbGVtZW50PiB9KTtcbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICAvKiogQXBwZW5kIGBlbGAgd2l0aCBhdHRyaWJ1dGVzIGB4YC9geWAgKGUuZy4gYCdjeCdgL2AnY3knYCkgYXQgYSB3b3JsZCBwb2ludCwgb2Zmc2V0IGluIHBpeGVscy4gKi9cbiAgYXQ8VCBleHRlbmRzIFNWR0VsZW1lbnQ+KFxuICAgIGVsOiBULFxuICAgIHd4OiBudW1iZXIsXG4gICAgd3k6IG51bWJlcixcbiAgICBhdHRyczogeyB4Pzogc3RyaW5nOyB5Pzogc3RyaW5nOyBkeD86IG51bWJlcjsgZHk/OiBudW1iZXIgfSA9IHt9LFxuICApOiBUIHtcbiAgICBjb25zdCB7IHggPSAneCcsIHkgPSAneScsIGR4ID0gMCwgZHkgPSAwIH0gPSBhdHRycztcbiAgICByZXR1cm4gdGhpcy5wbGFjZShlbCwgKGUsIHByb2plY3QpID0+IHtcbiAgICAgIGNvbnN0IFtzeCwgc3ldID0gcHJvamVjdCh3eCwgd3kpO1xuICAgICAgZS5zZXRBdHRyaWJ1dGUoeCwgYCR7c3ggKyBkeH1gKTtcbiAgICAgIGUuc2V0QXR0cmlidXRlKHksIGAke3N5ICsgZHl9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQSBgPGxpbmU+YCBiZXR3ZWVuIHR3byB3b3JsZCBwb2ludHMuICovXG4gIGxpbmUoYXg6IG51bWJlciwgYXk6IG51bWJlciwgYng6IG51bWJlciwgYnk6IG51bWJlcik6IFNWR0xpbmVFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5wbGFjZShzdmdFbCgnbGluZScpLCAoZSwgcHJvamVjdCkgPT4ge1xuICAgICAgY29uc3QgW3gxLCB5MV0gPSBwcm9qZWN0KGF4LCBheSk7XG4gICAgICBjb25zdCBbeDIsIHkyXSA9IHByb2plY3QoYngsIGJ5KTtcbiAgICAgIGUuc2V0QXR0cmlidXRlKCd4MScsIGAke3gxfWApO1xuICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3kxJywgYCR7eTF9YCk7XG4gICAgICBlLnNldEF0dHJpYnV0ZSgneDInLCBgJHt4Mn1gKTtcbiAgICAgIGUuc2V0QXR0cmlidXRlKCd5MicsIGAke3kyfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEEgYDxwb2x5Z29uPmAgLyBgPHBvbHlsaW5lPmAgdGhyb3VnaCB3b3JsZCBwb2ludHMuICovXG4gIHBvbHkodGFnOiAncG9seWdvbicgfCAncG9seWxpbmUnLCBwdHM6IFJlYWRvbmx5QXJyYXk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9Pik6IFNWR0VsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnBsYWNlKHN2Z0VsKHRhZyksIChlLCBwcm9qZWN0KSA9PiB7XG4gICAgICBlLnNldEF0dHJpYnV0ZSgncG9pbnRzJywgcHRzLm1hcCgocCkgPT4gcHJvamVjdChwLngsIHAueSkuam9pbignLCcpKS5qb2luKCcgJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlLXBvc2l0aW9uIGV2ZXJ5IGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IGNhbWVyYS4gKi9cbiAgcmVwcm9qZWN0KCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgeyBlbCwgcGxhY2UgfSBvZiB0aGlzLnBsYWNlZCkgcGxhY2UoZWwsIHRoaXMucHJvamVjdCk7XG4gIH1cblxuICBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZ3JvdXAuZmlyc3RDaGlsZDtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucGxhY2VkLmxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHRoaXMuZ3JvdXAuZmlyc3RDaGlsZCkgdGhpcy5ncm91cC5yZW1vdmVDaGlsZCh0aGlzLmdyb3VwLmZpcnN0Q2hpbGQpO1xuICB9XG59XG5cbi8qKiBDcmVhdGUgYW4gU1ZHIGVsZW1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gc3ZnRWw8SyBleHRlbmRzIGtleW9mIFNWR0VsZW1lbnRUYWdOYW1lTWFwPih0YWc6IEspOiBTVkdFbGVtZW50VGFnTmFtZU1hcFtLXSB7XG4gIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCB0YWcpO1xufVxuXG5leHBvcnQgY2xhc3MgU3ZnUmVnaW9uUmVuZGVyZXIge1xuICBwcml2YXRlIGNhbWVyYTogQWZmaW5lID0gSURFTlRJVFlfQUZGSU5FO1xuICBwcml2YXRlIHJlYWRvbmx5IHdvcmxkID0gc3ZnRWwoJ2cnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsYWJlbHM6IFNjcmVlbkxheWVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXk6IFNjcmVlbkxheWVyO1xuXG4gIC8qKiBXb3JsZCDihpIgc3ZnLWxvY2FsIHBpeGVscyB0aHJvdWdoIHRoZSBjdXJyZW50IGNhbWVyYS4gKi9cbiAgcmVhZG9ubHkgcHJvamVjdDogUHJvamVjdCA9ICh4LCB5KSA9PiBhcHBseUFmZmluZSh0aGlzLmNhbWVyYSwgeCwgeSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdmc6IFNWR1NWR0VsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRzOiBTdmdSZWdpb25SZW5kZXJlck9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMud29ybGQuc2V0QXR0cmlidXRlKCdkYXRhLWxheWVyJywgJ3JlZ2lvbnMnKTtcbiAgICB0aGlzLmxhYmVscyA9IG5ldyBTY3JlZW5MYXllcihzdmdFbCgnZycpLCB0aGlzLnByb2plY3QpO1xuICAgIHRoaXMubGFiZWxzLmdyb3VwLnNldEF0dHJpYnV0ZSgnZGF0YS1sYXllcicsICdsYWJlbHMnKTtcbiAgICB0aGlzLm92ZXJsYXkgPSBuZXcgU2NyZWVuTGF5ZXIoc3ZnRWwoJ2cnKSwgdGhpcy5wcm9qZWN0KTtcbiAgICB0aGlzLm92ZXJsYXkuZ3JvdXAuc2V0QXR0cmlidXRlKCdkYXRhLWxheWVyJywgJ292ZXJsYXknKTtcbiAgICB0aGlzLmFwcGx5Q2FtZXJhKCk7XG4gIH1cblxuICAvKiogVGhlIGN1cnJlbnQgd29ybGQg4oaSIHN2Zy1sb2NhbCBhZmZpbmUuICovXG4gIGdldCBhZmZpbmUoKTogQWZmaW5lIHtcbiAgICByZXR1cm4gdGhpcy5jYW1lcmE7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgY2FtZXJhOiByZXdyaXRlIHRoZSB3b3JsZCBncm91cCdzIHRyYW5zZm9ybSBhbmQgcmUtcG9zaXRpb24gdGhlXG4gICAqIHNjcmVlbi1zcGFjZSBlbGVtZW50cy4gTm8gZWxlbWVudCBpcyBjcmVhdGVkIG9yIHJlbW92ZWQuIFJldHVybnMgZmFsc2VcbiAgICogKGFuZCB0b3VjaGVzIG5vdGhpbmcpIHdoZW4gdGhlIGFmZmluZSBkaWQgbm90IGNoYW5nZS5cbiAgICovXG4gIHNldENhbWVyYShhZmZpbmU6IEFmZmluZSk6IGJvb2xlYW4ge1xuICAgIGlmICghYWZmaW5lLmV2ZXJ5KE51bWJlci5pc0Zpbml0ZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYWZmaW5lLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSB0aGlzLmNhbWVyYVtpXSkpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLmNhbWVyYSA9IGFmZmluZTtcbiAgICB0aGlzLmFwcGx5Q2FtZXJhKCk7XG4gICAgdGhpcy5sYWJlbHMucmVwcm9qZWN0KCk7XG4gICAgdGhpcy5vdmVybGF5LnJlcHJvamVjdCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIHJlZ2lvbiBzaGFwZXMgKHdvcmxkIHNwYWNlKSBhbmQgdGhlaXIgZGVjb3JhdGlvbnMuICovXG4gIHJlbmRlcihyZWdpb25zOiBSZWFkb25seUFycmF5PFJlZ2lvbj4sIHNlbGVjdGVkOiBSZWFkb25seUFycmF5PG51bWJlcj4pOiB2b2lkIHtcbiAgICBjb25zdCBzaGFwZXMgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgdGhpcy5sYWJlbHMuY2xlYXIoKTtcbiAgICBjb25zdCBzZWwgPSBuZXcgU2V0KHNlbGVjdGVkKTtcbiAgICByZWdpb25zLmZvckVhY2goKHJlZ2lvbiwgaSkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0cy5za2lwPy4ocmVnaW9uKSkgcmV0dXJuO1xuICAgICAgY29uc3QgaXNTZWwgPSBzZWwuaGFzKGkpO1xuICAgICAgY29uc3QgZWwgPSB0aGlzLnNoYXBlT2YocmVnaW9uKTtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3ZlY3Rvci1lZmZlY3QnLCAnbm9uLXNjYWxpbmctc3Ryb2tlJyk7XG4gICAgICAgIHRoaXMub3B0cy5zdHlsZVNoYXBlKGVsLCByZWdpb24sIGlzU2VsKTtcbiAgICAgICAgc2hhcGVzLmFwcGVuZENoaWxkKGVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0cy5kZWNvcmF0ZT8uKHJlZ2lvbiwgaSwgaXNTZWwsIHRoaXMubGFiZWxzKTtcbiAgICB9KTtcbiAgICB3aGlsZSAodGhpcy53b3JsZC5maXJzdENoaWxkKSB0aGlzLndvcmxkLnJlbW92ZUNoaWxkKHRoaXMud29ybGQuZmlyc3RDaGlsZCk7XG4gICAgdGhpcy53b3JsZC5hcHBlbmRDaGlsZChzaGFwZXMpO1xuICAgIHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIG92ZXJsYXkgbGF5ZXIgKHRoZSBzZWxlY3RlZCByZWdpb24ncyBoYW5kbGVzLCBkcmFmdHMpLiAqL1xuICByZW5kZXJPdmVybGF5KGJ1aWxkOiAobGF5ZXI6IFNjcmVlbkxheWVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vdmVybGF5LmNsZWFyKCk7XG4gICAgYnVpbGQodGhpcy5vdmVybGF5KTtcbiAgICB0aGlzLnN5bmMoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgZXZlcnkgbGF5ZXIgZnJvbSB0aGUgc3ZnLiAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZyBvZiBbdGhpcy53b3JsZCwgdGhpcy5sYWJlbHMuZ3JvdXAsIHRoaXMub3ZlcmxheS5ncm91cF0pIGcucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQoZyk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q2FtZXJhKCk6IHZvaWQge1xuICAgIHRoaXMud29ybGQuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCBgbWF0cml4KCR7dGhpcy5jYW1lcmEuam9pbignICcpfSlgKTtcbiAgfVxuXG4gIC8qKiBBdHRhY2ggdGhlIGxheWVycyB0aGF0IGhhdmUgY29udGVudCAoaW4gb3JkZXIpIGFuZCBkZXRhY2ggdGhlIGVtcHR5IG9uZXMuICovXG4gIHByaXZhdGUgc3luYygpOiB2b2lkIHtcbiAgICBjb25zdCBsYXllcnM6IEFycmF5PFtTVkdHRWxlbWVudCwgYm9vbGVhbl0+ID0gW1xuICAgICAgW3RoaXMud29ybGQsICEhdGhpcy53b3JsZC5maXJzdENoaWxkXSxcbiAgICAgIFt0aGlzLmxhYmVscy5ncm91cCwgIXRoaXMubGFiZWxzLmlzRW1wdHldLFxuICAgICAgW3RoaXMub3ZlcmxheS5ncm91cCwgIXRoaXMub3ZlcmxheS5pc0VtcHR5XSxcbiAgICBdO1xuICAgIGxldCBiZWZvcmU6IENoaWxkTm9kZSB8IG51bGwgPSBudWxsO1xuICAgIGZvciAobGV0IGkgPSBsYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IFtnLCBzaG93XSA9IGxheWVyc1tpXTtcbiAgICAgIGlmICghc2hvdykge1xuICAgICAgICBnLnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKGcpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChnLnBhcmVudE5vZGUgIT09IHRoaXMuc3ZnIHx8IGcubmV4dFNpYmxpbmcgIT09IGJlZm9yZSkge1xuICAgICAgICBpZiAoYmVmb3JlKSB0aGlzLnN2Zy5pbnNlcnRCZWZvcmUoZywgYmVmb3JlKTtcbiAgICAgICAgZWxzZSBpZiAoZy5wYXJlbnROb2RlICE9PSB0aGlzLnN2ZykgdGhpcy5zdmcuYXBwZW5kQ2hpbGQoZyk7XG4gICAgICB9XG4gICAgICBiZWZvcmUgPSBnO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgd29ybGQtc3BhY2UgZWxlbWVudCBmb3IgYSByZWdpb24ncyBnZW9tZXRyeSwgb3IgbnVsbCB3aGVuIGl0IGhhcyBub25lLiAqL1xuICBwcml2YXRlIHNoYXBlT2YocmVnaW9uOiBSZWdpb24pOiBTVkdFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gICAgc3dpdGNoIChib3VuZHNLaW5kKGIpKSB7XG4gICAgICBjYXNlICdyZWN0Jzoge1xuICAgICAgICBjb25zdCByID0gYiBhcyBSZWN0YW5nbGU7XG4gICAgICAgIGNvbnN0IHgwID0gTWF0aC5taW4oci54LCByLnggKyByLndpZHRoKSxcbiAgICAgICAgICB5MCA9IE1hdGgubWluKHIueSwgci55ICsgci5oZWlnaHQpO1xuICAgICAgICBjb25zdCB3ID0gTWF0aC5hYnMoci53aWR0aCksXG4gICAgICAgICAgaCA9IE1hdGguYWJzKHIuaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5yZWN0RWxlbWVudCA9PT0gJ3JlY3QnKSB7XG4gICAgICAgICAgY29uc3QgZWwgPSBzdmdFbCgncmVjdCcpO1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgneCcsIGAke3gwfWApO1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgneScsIGAke3kwfWApO1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHt3fWApO1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgYCR7aH1gKTtcbiAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWwgPSBzdmdFbCgncG9seWdvbicpO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIGAke3gwfSwke3kwfSAke3gwICsgd30sJHt5MH0gJHt4MCArIHd9LCR7eTAgKyBofSAke3gwfSwke3kwICsgaH1gKTtcbiAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgfVxuICAgICAgY2FzZSAncG9seSc6IHtcbiAgICAgICAgY29uc3QgcCA9IGIgYXMgUG9seWdvbjtcbiAgICAgICAgY29uc3QgbiA9IHAueHBvaW50cz8ubGVuZ3RoID8/IDA7XG4gICAgICAgIGlmIChuID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgaG9sZXMgPSByZWdpb25IYXNIb2xlcyhyZWdpb24pO1xuICAgICAgICBpZiAoKHAuYmV6aWVyICYmIG4gPj0gMikgfHwgaG9sZXMpIHJldHVybiBwYXRoRWwocmVnaW9uUGF0aEQocmVnaW9uLCBXT1JMRCksIGhvbGVzKTtcbiAgICAgICAgY29uc3QgZWwgPSBzdmdFbChwLmNsb3NlZCA9PT0gZmFsc2UgPyAncG9seWxpbmUnIDogJ3BvbHlnb24nKTtcbiAgICAgICAgbGV0IHB0cyA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgcHRzICs9IGAke2kgPyAnICcgOiAnJ30ke3AueHBvaW50c1tpXX0sJHtwLnlwb2ludHNbaV19YDtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdwb2ludHMnLCBwdHMpO1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgICB9XG4gICAgICBjYXNlICdtdWx0aSc6IHtcbiAgICAgICAgY29uc3QgcGFydHMgPSAoYiBhcyBNdWx0aVBvbHlnb24pLnBvbHlnb25zO1xuICAgICAgICBpZiAoIXBhcnRzLnNvbWUoKHApID0+IChwLnhwb2ludHM/Lmxlbmd0aCA/PyAwKSA+PSAzKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBwYXRoRWwocmVnaW9uUGF0aEQocmVnaW9uLCBXT1JMRCksIHRydWUpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhdGhFbChkOiBzdHJpbmcsIGV2ZW5PZGQ6IGJvb2xlYW4pOiBTVkdQYXRoRWxlbWVudCB7XG4gIGNvbnN0IGVsID0gc3ZnRWwoJ3BhdGgnKTtcbiAgZWwuc2V0QXR0cmlidXRlKCdkJywgZCk7XG4gIGlmIChldmVuT2RkKSBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwtcnVsZScsICdldmVub2RkJyk7XG4gIHJldHVybiBlbDtcbn1cbiJdfQ==
@@ -0,0 +1,104 @@
1
+ import { firstValueFrom } from 'rxjs';
2
+ import { RegionTileCache, abortable } from './region-source';
3
+ /** Open the region source at `baseUrl` (its `info` is fetched first). */
4
+ export async function openHttpRegionSource(baseUrl, options = {}) {
5
+ const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
6
+ const http = new Http(base, options);
7
+ const info = await http.json('info');
8
+ return new HttpRegionSource(http, info);
9
+ }
10
+ class Http {
11
+ constructor(base, options) {
12
+ this.base = base;
13
+ this.options = options;
14
+ this.fetchFn = options.fetch ?? ((input, init) => fetch(input, init));
15
+ }
16
+ async json(path, body) {
17
+ return JSON.parse(await this.text(path, body));
18
+ }
19
+ async text(path, body) {
20
+ const http = this.options.http;
21
+ if (http) {
22
+ const url = this.base + path;
23
+ try {
24
+ return await firstValueFrom(body === undefined
25
+ ? http.get(url, { responseType: 'text' })
26
+ : http.post(url, body, { responseType: 'text' }));
27
+ }
28
+ catch (err) {
29
+ const status = err?.status;
30
+ throw new Error(`Region source ${path}: HTTP ${status ?? 'error'}`);
31
+ }
32
+ }
33
+ const init = { ...this.options.init };
34
+ if (body !== undefined) {
35
+ init.method = 'POST';
36
+ init.body = JSON.stringify(body);
37
+ init.headers = {
38
+ ...this.options.init?.headers,
39
+ 'Content-Type': 'application/json',
40
+ };
41
+ }
42
+ const res = await this.fetchFn(this.base + path, init);
43
+ if (!res.ok)
44
+ throw new Error(`Region source ${path}: HTTP ${res.status}`);
45
+ return res.text();
46
+ }
47
+ }
48
+ class HttpRegionSource {
49
+ constructor(http, info) {
50
+ this.http = http;
51
+ this.info = info;
52
+ this.cache = new RegionTileCache();
53
+ }
54
+ getTile(z, key, signal) {
55
+ // The fetch itself is not aborted: another view (the other backend) may be waiting on the
56
+ // same cached tile, and a tile is small. Only this caller stops waiting.
57
+ const tile = this.cache.get(z, key, async () => {
58
+ const wire = await this.http.json(`tile/${z}/${key.level}/${key.gx}/${key.gy}`);
59
+ return { z, ...key, features: wire.features.map(fromWire) };
60
+ });
61
+ return abortable(tile, signal);
62
+ }
63
+ async getFeatures(ids) {
64
+ if (!ids.length)
65
+ return [];
66
+ return (await this.http.json('features', { ids })).features;
67
+ }
68
+ getIndex(z, query) {
69
+ return this.http.json('index', { z, ...query });
70
+ }
71
+ async getClassOutlines(classes, level, exclude = []) {
72
+ const wire = await this.http.json('outlines', { classes, level, exclude });
73
+ return wire.slices.map((s) => ({
74
+ z: s.z,
75
+ rings: s.rings.map((r) => Float32Array.from(r)),
76
+ ...(s.lines?.length ? { lines: s.lines.map((l) => Float32Array.from(l)) } : {}),
77
+ ...(s.ringGroups ? { ringGroups: s.ringGroups } : {}),
78
+ ...(s.ringLabels ? { ringLabels: s.ringLabels } : {}),
79
+ ...(s.lineLabels ? { lineLabels: s.lineLabels } : {}),
80
+ }));
81
+ }
82
+ getClassCounts(z, exclude = []) {
83
+ // Every plane is `all` (a plane must be a number: a server that predates it answers 400).
84
+ return this.http.json('classes', z === null ? { all: true, exclude } : { z, exclude });
85
+ }
86
+ exportGeoJson(exclude, extra) {
87
+ return this.http.text('export', { exclude, extra });
88
+ }
89
+ dispose() {
90
+ this.cache.clear();
91
+ }
92
+ }
93
+ function fromWire(f) {
94
+ return {
95
+ id: f.id,
96
+ label: f.label ?? null,
97
+ color: f.color ?? null,
98
+ bbox: f.bbox,
99
+ rings: f.rings.map((r) => Float32Array.from(r)),
100
+ open: !!f.open,
101
+ ...(f.labels?.length ? { labels: Float32Array.from(f.labels) } : {}),
102
+ };
103
+ }
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZWdpb24tc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24tc291cmNlL2h0dHAtcmVnaW9uLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtQkEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQWdCLGVBQWUsRUFBaUIsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFvQzFGLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxPQUFlLEVBQ2YsVUFBbUMsRUFBRTtJQUVyQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUM7SUFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBbUIsTUFBTSxDQUFDLENBQUM7SUFDdkQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsTUFBTSxJQUFJO0lBR1IsWUFDbUIsSUFBWSxFQUNaLE9BQWdDO1FBRGhDLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUVqRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBSSxJQUFZLEVBQUUsSUFBYztRQUN4QyxPQUFPLElB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LEtBQUssSUFBSSxJQUFJO1FBQ3RCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUk7UUFDdEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1FBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNyRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSB7QGxpbmsgUmVnaW9uU291cmNlfSBzZXJ2ZWQgb3ZlciBIVFRQLCBieSBhIHNlcnZlciB0aGF0IHRpbGVzIGEgcmVnaW9uIHNldCBhcyBgcmVnaW9uLXRpbGVzYFxuICogZG9lcyAodGhlIGV4YW1wbGUgdGlsZSBzZXJ2ZXIncyBgL3JlZ2lvbnMv4oCmYCByb3V0ZXMpLiBSZWxhdGl2ZSB0byB0aGUgc291cmNlJ3MgYmFzZSBVUkw6XG4gKlxuICogIC0gYEdFVCAgaW5mb2AgICAgICAgICAgICAgICAgICAgICAgIOKGkiB7QGxpbmsgUmVnaW9uU291cmNlSW5mb31cbiAqICAtIGBHRVQgIHRpbGUve3p9L3tsZXZlbH0ve2d4fS97Z3l9YCDihpIgYHsgZmVhdHVyZXM6IFdpcmVUaWxlRmVhdHVyZVtdIH1gXG4gKiAgLSBgUE9TVCBmZWF0dXJlc2AgYHsgaWRzIH1gICAgICAgICAg4oaSIGB7IGZlYXR1cmVzOiBTb3VyY2VGZWF0dXJlW10gfWBcbiAqICAtIGBQT1NUIGluZGV4YCBgeyB6LCAuLi5xdWVyeSB9YCAgICDihpIge0BsaW5rIFJlZ2lvbkluZGV4UGFnZX1cbiAqICAtIGBQT1NUIGNsYXNzZXNgIGB7IHosIGV4Y2x1ZGUgfWAgICAg4oaSIGZlYXR1cmVzIHBlciBjbGFzcyBvbiBwbGFuZSB6XG4gKiAgLSBgUE9TVCBvdXRsaW5lc2AgYHsgY2xhc3NlcywgbGV2ZWwsIGV4Y2x1ZGUgfWAg4oaSIGB7IHNsaWNlczogW3sgeiwgcmluZ3MgfV0gfWBcbiAqICAtIGBQT1NUIGV4cG9ydGAgYHsgZXhjbHVkZSwgZXh0cmEgfWDihpIgYSBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uXG4gKlxuICogVGlsZSByaW5ncyB0cmF2ZWwgYXMgZmxhdCBgW3gsIHksIHgsIHksIOKApl1gIGFycmF5cywgbGFiZWwgcG9pbnRzIGFzIGZsYXQgYFt4LCB5LCByb29tLCDigKZdYC5cbiAqXG4gKiBHaXZlbiB0aGUgaG9zdCdzIEFuZ3VsYXIgYEh0dHBDbGllbnRgIChhcyB0aGUgdmlzdWFsaXplciBwYXNzZXMgaXQpLCBldmVyeSByZXF1ZXN0IGdvZXMgdGhyb3VnaFxuICogaXQsIHNvIHRoZSBob3N0J3MgaW50ZXJjZXB0b3JzIGFwcGx5IOKAlCBpdHMgYXV0aCBoZWFkZXIgYWJvdmUgYWxsIOKAlCBhcyBmb3IgdGhlIGltYWdlIHRpbGVzIGFuZFxuICogdGhlIHNwYXRpYWwgZGF0YS4gVGhlIGxpYnJhcnkgaXRzZWxmIGtub3dzIG5vdGhpbmcgb2YgYXV0aGVudGljYXRpb24uXG4gKi9cbmltcG9ydCB0eXBlIHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSZWdpb25Tb3VyY2UsIFJlZ2lvblRpbGVDYWNoZSwgU291cmNlRmVhdHVyZSwgYWJvcnRhYmxlIH0gZnJvbSAnLi9yZWdpb24tc291cmNlJztcbmltcG9ydCB0eXBlIHtcbiAgQmJveCxcbiAgQ2xhc3NPdXRsaW5lcyxcbiAgUmVnaW9uSW5kZXhQYWdlLFxuICBSZWdpb25JbmRleFF1ZXJ5LFxuICBSZWdpb25Tb3VyY2VJbmZvLFxuICBSZWdpb25UaWxlLFxuICBSZWdpb25UaWxlS2V5LFxuICBUaWxlRmVhdHVyZSxcbn0gZnJvbSAnLi9yZWdpb24tdGlsZXMnO1xuXG4vKiogQSB0aWxlIGZlYXR1cmUgb24gdGhlIHdpcmU6IHJpbmdzIGFzIHBsYWluIGFycmF5cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2lyZVRpbGVGZWF0dXJlIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZyB8IG51bGw7XG4gIGNvbG9yOiBzdHJpbmcgfCBudWxsO1xuICBiYm94OiBCYm94O1xuICByaW5nczogbnVtYmVyW11bXTtcbiAgb3Blbj86IGJvb2xlYW47XG4gIGxhYmVscz86IG51bWJlcltdO1xufVxuXG4vKiogT3B0aW9ucyBvZiB7QGxpbmsgb3Blbkh0dHBSZWdpb25Tb3VyY2V9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwUmVnaW9uU291cmNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgaG9zdCdzIGBIdHRwQ2xpZW50YDogcmVxdWVzdHMgdGhlbiBnbyB0aHJvdWdoIGl0IGFuZCBpdHMgaW50ZXJjZXB0b3JzICh0aGUgaG9zdCdzIGF1dGgpLFxuICAgKiBub3QgYGZldGNoYCwgYW5kIGBpbml0YCBhbmQgYGZldGNoYCBhcmUgbm90IHVzZWQuXG4gICAqL1xuICBodHRwPzogSHR0cENsaWVudDtcbiAgLyoqIEV4dHJhIHJlcXVlc3Qgb3B0aW9ucyAoY3JlZGVudGlhbHMsIGhlYWRlcnMpIGZvciBldmVyeSBgZmV0Y2hgIHJlcXVlc3QuICovXG4gIGluaXQ/OiBSZXF1ZXN0SW5pdDtcbiAgLyoqIFRoZSBmZXRjaCB0byB1c2UgKGRlZmF1bHQgdGhlIGdsb2JhbCBvbmUpLiAqL1xuICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbn1cblxuLyoqIE9wZW4gdGhlIHJlZ2lvbiBzb3VyY2UgYXQgYGJhc2VVcmxgIChpdHMgYGluZm9gIGlzIGZldGNoZWQgZmlyc3QpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5IdHRwUmVnaW9uU291cmNlKFxuICBiYXNlVXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEh0dHBSZWdpb25Tb3VyY2VPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFJlZ2lvblNvdXJjZT4ge1xuICBjb25zdCBiYXNlID0gYmFzZVVybC5lbmRzV2l0aCgnLycpID8gYmFzZVVybCA6IGAke2Jhc2VVcmx9L2A7XG4gIGNvbnN0IGh0dHAgPSBuZXcgSHR0cChiYXNlLCBvcHRpb25zKTtcbiAgY29uc3QgaW5mbyA9IGF3YWl0IGh0dHAuanNvbjxSZWdpb25Tb3VyY2VJbmZvPignaW5mbycpO1xuICByZXR1cm4gbmV3IEh0dHBSZWdpb25Tb3VyY2UoaHR0cCwgaW5mbyk7XG59XG5cbmNsYXNzIEh0dHAge1xuICBwcml2YXRlIHJlYWRvbmx5IGZldGNoRm46IHR5cGVvZiBmZXRjaDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhc2U6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEh0dHBSZWdpb25Tb3VyY2VPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLmZldGNoRm4gPSBvcHRpb25zLmZldGNoID8/ICgoaW5wdXQsIGluaXQpID0+IGZldGNoKGlucHV0LCBpbml0KSk7XG4gIH1cblxuICBhc3luYyBqc29uPFQ+KHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShhd2FpdCB0aGlzLnRleHQocGF0aCwgYm9keSkpIGFzIFQ7XG4gIH1cblxuICBhc3luYyB0ZXh0KHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGh0dHAgPSB0aGlzLm9wdGlvbnMuaHR0cDtcbiAgICBpZiAoaHR0cCkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlICsgcGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICBib2R5ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ3RleHQnIH0pXG4gICAgICAgICAgICA6IGh0dHAucG9zdCh1cmwsIGJvZHksIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSksXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gKGVyciBhcyB7IHN0YXR1cz86IG51bWJlciB9IHwgbnVsbCk/LnN0YXR1cztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpb24gc291cmNlICR7cGF0aH06IEhUVFAgJHtzdGF0dXMgPz8gJ2Vycm9yJ31gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7IC4uLnRoaXMub3B0aW9ucy5pbml0IH07XG4gICAgaWYgKGJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5pdC5tZXRob2QgPSAnUE9TVCc7XG4gICAgICBpbml0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICAgIGluaXQuaGVhZGVycyA9IHtcbiAgICAgICAgLi4uKHRoaXMub3B0aW9ucy5pbml0Py5oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pLFxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5mZXRjaEZuKHRoaXMuYmFzZSArIHBhdGgsIGluaXQpO1xuICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoYFJlZ2lvbiBzb3VyY2UgJHtwYXRofTogSFRUUCAke3Jlcy5zdGF0dXN9YCk7XG4gICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gIH1cbn1cblxuY2xhc3MgSHR0cFJlZ2lvblNvdXJjZSBpbXBsZW1lbnRzIFJlZ2lvblNvdXJjZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgUmVnaW9uVGlsZUNhY2hlKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwLFxuICAgIHJlYWRvbmx5IGluZm86IFJlZ2lvblNvdXJjZUluZm8sXG4gICkge31cblxuICBnZXRUaWxlKHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UmVnaW9uVGlsZT4ge1xuICAgIC8vIFRoZSBmZXRjaCBpdHNlbGYgaXMgbm90IGFib3J0ZWQ6IGFub3RoZXIgdmlldyAodGhlIG90aGVyIGJhY2tlbmQpIG1heSBiZSB3YWl0aW5nIG9uIHRoZVxuICAgIC8vIHNhbWUgY2FjaGVkIHRpbGUsIGFuZCBhIHRpbGUgaXMgc21hbGwuIE9ubHkgdGhpcyBjYWxsZXIgc3RvcHMgd2FpdGluZy5cbiAgICBjb25zdCB0aWxlID0gdGhpcy5jYWNoZS5nZXQoeiwga2V5LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB3aXJlID0gYXdhaXQgdGhpcy5odHRwLmpzb248eyBmZWF0dXJlczogV2lyZVRpbGVGZWF0dXJlW10gfT4oXG4gICAgICAgIGB0aWxlLyR7en0vJHtrZXkubGV2ZWx9LyR7a2V5Lmd4fS8ke2tleS5neX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHosIC4uLmtleSwgZmVhdHVyZXM6IHdpcmUuZmVhdHVyZXMubWFwKGZyb21XaXJlKSB9O1xuICAgIH0pO1xuICAgIHJldHVybiBhYm9ydGFibGUodGlsZSwgc2lnbmFsKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZlYXR1cmVzKGlkczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFNvdXJjZUZlYXR1cmVbXT4ge1xuICAgIGlmICghaWRzLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5odHRwLmpzb248eyBmZWF0dXJlczogU291cmNlRmVhdHVyZVtdIH0+KCdmZWF0dXJlcycsIHsgaWRzIH0pKS5mZWF0dXJlcztcbiAgfVxuXG4gIGdldEluZGV4KHo6IG51bWJlciwgcXVlcnk6IFJlZ2lvbkluZGV4UXVlcnkpOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuanNvbjxSZWdpb25JbmRleFBhZ2U+KCdpbmRleCcsIHsgeiwgLi4ucXVlcnkgfSk7XG4gIH1cblxuICBhc3luYyBnZXRDbGFzc091dGxpbmVzKFxuICAgIGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGV4Y2x1ZGU6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gICk6IFByb21pc2U8Q2xhc3NPdXRsaW5lc1tdPiB7XG4gICAgY29uc3Qgd2lyZSA9IGF3YWl0IHRoaXMuaHR0cC5qc29uPHtcbiAgICAgIHNsaWNlczogQXJyYXk8e1xuICAgICAgICB6OiBudW1iZXI7XG4gICAgICAgIHJpbmdzOiBudW1iZXJbXVtdO1xuICAgICAgICBsaW5lcz86IG51bWJlcltdW107XG4gICAgICAgIHJpbmdHcm91cHM/OiBudW1iZXJbXTtcbiAgICAgICAgcmluZ0xhYmVscz86IHN0cmluZ1tdO1xuICAgICAgICBsaW5lTGFiZWxzPzogc3RyaW5nW107XG4gICAgICB9PjtcbiAgICB9Pignb3V0bGluZXMnLCB7IGNsYXNzZXMsIGxldmVsLCBleGNsdWRlIH0pO1xuICAgIHJldHVybiB3aXJlLnNsaWNlcy5tYXAoKHMpID0+ICh7XG4gICAgICB6OiBzLnosXG4gICAgICByaW5nczogcy5yaW5ncy5tYXAoKHIpID0+IEZsb2F0MzJBcnJheS5mcm9tKHIpKSxcbiAgICAgIC4uLihzLmxpbmVzPy5sZW5ndGggPyB7IGxpbmVzOiBzLmxpbmVzLm1hcCgobCkgPT4gRmxvYXQzMkFycmF5LmZyb20obCkpIH0gOiB7fSksXG4gICAgICAuLi4ocy5yaW5nR3JvdXBzID8geyByaW5nR3JvdXBzOiBzLnJpbmdHcm91cHMgfSA6IHt9KSxcbiAgICAgIC4uLihzLnJpbmdMYWJlbHMgPyB7IHJpbmdMYWJlbHM6IHMucmluZ0xhYmVscyB9IDoge30pLFxuICAgICAgLi4uKHMubGluZUxhYmVscyA/IHsgbGluZUxhYmVsczogcy5saW5lTGFiZWxzIH0gOiB7fSksXG4gICAgfSkpO1xuICB9XG5cbiAgZ2V0Q2xhc3NDb3VudHMoejogbnVtYmVyIHwgbnVsbCwgZXhjbHVkZTogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIC8vIEV2ZXJ5IHBsYW5lIGlzIGBhbGxgIChhIHBsYW5lIG11c3QgYmUgYSBudW1iZXI6IGEgc2VydmVyIHRoYXQgcHJlZGF0ZXMgaXQgYW5zd2VycyA0MDApLlxuICAgIHJldHVybiB0aGlzLmh0dHAuanNvbjxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PignY2xhc3NlcycsIHogPT09IG51bGwgPyB7IGFsbDogdHJ1ZSwgZXhjbHVkZSB9IDogeyB6LCBleGNsdWRlIH0pO1xuICB9XG5cbiAgZXhwb3J0R2VvSnNvbihleGNsdWRlOiByZWFkb25seSBzdHJpbmdbXSwgZXh0cmE6IHJlYWRvbmx5IG9iamVjdFtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnRleHQoJ2V4cG9ydCcsIHsgZXhjbHVkZSwgZXh0cmEgfSk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmcm9tV2lyZShmOiBXaXJlVGlsZUZlYXR1cmUpOiBUaWxlRmVhdHVyZSB7XG4gIHJldHVybiB7XG4gICAgaWQ6IGYuaWQsXG4gICAgbGFiZWw6IGYubGFiZWwgPz8gbnVsbCxcbiAgICBjb2xvcjogZi5jb2xvciA/PyBudWxsLFxuICAgIGJib3g6IGYuYmJveCxcbiAgICByaW5nczogZi5yaW5ncy5tYXAoKHIpID0+IEZsb2F0MzJBcnJheS5mcm9tKHIpKSxcbiAgICBvcGVuOiAhIWYub3BlbixcbiAgICAuLi4oZi5sYWJlbHM/Lmxlbmd0aCA/IHsgbGFiZWxzOiBGbG9hdDMyQXJyYXkuZnJvbShmLmxhYmVscykgfSA6IHt9KSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,53 @@
1
+ /**
2
+ * The region-source worker's protocol and the tables it holds, shared by the worker and the
3
+ * main-thread fallback (which runs the very same {@link RegionSourceTables} where no worker can
4
+ * start).
5
+ *
6
+ * Protocol: `{ id, op, ...args }` → `{ id, ok: true, result }` | `{ id, ok: false, error }`.
7
+ */
8
+ import { reconstruct } from '../geometry/reconstruct';
9
+ import { RegionFeatureTable, } from './region-tiles';
10
+ /** The open tables, by handle. */
11
+ export class RegionSourceTables {
12
+ constructor() {
13
+ this.tables = new Map();
14
+ this.nextHandle = 1;
15
+ }
16
+ run(request) {
17
+ return this.dispatch(request);
18
+ }
19
+ dispatch(r) {
20
+ switch (r.op) {
21
+ case 'open': {
22
+ const table = RegionFeatureTable.fromGeoJson(r.text, r.tileSize);
23
+ const handle = this.nextHandle++;
24
+ this.tables.set(handle, table);
25
+ return { handle, info: table.info() };
26
+ }
27
+ case 'tile':
28
+ return this.table(r.handle).tile(r.z, r.level, r.gx, r.gy);
29
+ case 'features':
30
+ return this.table(r.handle).features(r.ids);
31
+ case 'index':
32
+ return this.table(r.handle).index(r.z, r.query);
33
+ case 'classes':
34
+ return this.table(r.handle).classCounts(r.z, r.exclude);
35
+ case 'outlines':
36
+ return this.table(r.handle).classOutlines(r.classes, r.level, r.exclude);
37
+ case 'mesh':
38
+ return reconstruct(r.slices, r.options);
39
+ case 'export':
40
+ return this.table(r.handle).exportGeoJson(r.exclude, r.extra);
41
+ case 'close':
42
+ this.tables.delete(r.handle);
43
+ return null;
44
+ }
45
+ }
46
+ table(handle) {
47
+ const table = this.tables.get(handle);
48
+ if (!table)
49
+ throw new Error(`No open region source ${handle}.`);
50
+ return table;
51
+ }
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNvdXJjZS1vcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXNvdXJjZS1vcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFxQyxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV6RixPQUFPLEVBRUwsa0JBQWtCLEdBS25CLE1BQU0sZ0JBQWdCLENBQUM7QUFxQ3hCLGtDQUFrQztBQUNsQyxNQUFNLE9BQU8sa0JBQWtCO0lBQS9CO1FBQ21CLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztRQUN4RCxlQUFVLEdBQUcsQ0FBQyxDQUFDO0lBdUN6QixDQUFDO0lBckNDLEdBQUcsQ0FBZ0MsT0FBVTtRQUMzQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFpQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxRQUFRLENBQUMsQ0FBc0I7UUFDckMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDYixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ1osTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDeEMsQ0FBQztZQUNELEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0QsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEQsS0FBSyxTQUFTO2dCQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELEtBQUssVUFBVTtnQkFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNFLEtBQUssTUFBTTtnQkFDVCxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEUsS0FBSyxPQUFPO2dCQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsTUFBYztRQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSByZWdpb24tc291cmNlIHdvcmtlcidzIHByb3RvY29sIGFuZCB0aGUgdGFibGVzIGl0IGhvbGRzLCBzaGFyZWQgYnkgdGhlIHdvcmtlciBhbmQgdGhlXG4gKiBtYWluLXRocmVhZCBmYWxsYmFjayAod2hpY2ggcnVucyB0aGUgdmVyeSBzYW1lIHtAbGluayBSZWdpb25Tb3VyY2VUYWJsZXN9IHdoZXJlIG5vIHdvcmtlciBjYW5cbiAqIHN0YXJ0KS5cbiAqXG4gKiBQcm90b2NvbDogYHsgaWQsIG9wLCAuLi5hcmdzIH1gIOKGkiBgeyBpZCwgb2s6IHRydWUsIHJlc3VsdCB9YCB8IGB7IGlkLCBvazogZmFsc2UsIGVycm9yIH1gLlxuICovXG5pbXBvcnQgeyBSZWNvbnN0cnVjdE9wdGlvbnMsIFNsaWNlT3V0bGluZXMsIHJlY29uc3RydWN0IH0gZnJvbSAnLi4vZ2VvbWV0cnkvcmVjb25zdHJ1Y3QnO1xuaW1wb3J0IHR5cGUgeyBNZXNoIH0gZnJvbSAnbmFwYXJpLWpzL2dlb21ldHJ5JztcbmltcG9ydCB7XG4gIENsYXNzT3V0bGluZXMsXG4gIFJlZ2lvbkZlYXR1cmVUYWJsZSxcbiAgUmVnaW9uSW5kZXhQYWdlLFxuICBSZWdpb25JbmRleFF1ZXJ5LFxuICBSZWdpb25Tb3VyY2VJbmZvLFxuICBSZWdpb25UaWxlLFxufSBmcm9tICcuL3JlZ2lvbi10aWxlcyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZlYXR1cmUgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2UnO1xuXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VSZXF1ZXN0ID1cbiAgfCB7IG9wOiAnb3Blbic7IHRleHQ6IHN0cmluZzsgdGlsZVNpemU/OiBudW1iZXIgfVxuICB8IHsgb3A6ICd0aWxlJzsgaGFuZGxlOiBudW1iZXI7IHo6IG51bWJlcjsgbGV2ZWw6IG51bWJlcjsgZ3g6IG51bWJlcjsgZ3k6IG51bWJlciB9XG4gIHwgeyBvcDogJ2ZlYXR1cmVzJzsgaGFuZGxlOiBudW1iZXI7IGlkczogcmVhZG9ubHkgc3RyaW5nW10gfVxuICB8IHsgb3A6ICdpbmRleCc7IGhhbmRsZTogbnVtYmVyOyB6OiBudW1iZXI7IHF1ZXJ5OiBSZWdpb25JbmRleFF1ZXJ5IH1cbiAgfCB7IG9wOiAnY2xhc3Nlcyc7IGhhbmRsZTogbnVtYmVyOyB6OiBudW1iZXIgfCBudWxsOyBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10gfVxuICB8IHtcbiAgICAgIG9wOiAnb3V0bGluZXMnO1xuICAgICAgaGFuZGxlOiBudW1iZXI7XG4gICAgICBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGw7XG4gICAgICBsZXZlbDogbnVtYmVyO1xuICAgICAgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIH1cbiAgfCB7IG9wOiAnbWVzaCc7IHNsaWNlczogcmVhZG9ubHkgU2xpY2VPdXRsaW5lc1tdOyBvcHRpb25zPzogUmVjb25zdHJ1Y3RPcHRpb25zIH1cbiAgfCB7IG9wOiAnZXhwb3J0JzsgaGFuZGxlOiBudW1iZXI7IGV4Y2x1ZGU6IHJlYWRvbmx5IHN0cmluZ1tdOyBleHRyYTogcmVhZG9ubHkgb2JqZWN0W10gfVxuICB8IHsgb3A6ICdjbG9zZSc7IGhhbmRsZTogbnVtYmVyIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uU291cmNlUmVzdWx0cyB7XG4gIG9wZW46IHsgaGFuZGxlOiBudW1iZXI7IGluZm86IFJlZ2lvblNvdXJjZUluZm8gfTtcbiAgdGlsZTogUmVnaW9uVGlsZTtcbiAgZmVhdHVyZXM6IFNvdXJjZUZlYXR1cmVbXTtcbiAgaW5kZXg6IFJlZ2lvbkluZGV4UGFnZTtcbiAgY2xhc3NlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgb3V0bGluZXM6IENsYXNzT3V0bGluZXNbXTtcbiAgbWVzaDogTWVzaDtcbiAgZXhwb3J0OiBzdHJpbmc7XG4gIGNsb3NlOiBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VNZXNzYWdlID0gUmVnaW9uU291cmNlUmVxdWVzdCAmIHsgaWQ6IG51bWJlciB9O1xuXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VSZXBseSA9XG4gIHsgaWQ6IG51bWJlcjsgb2s6IHRydWU7IHJlc3VsdDogdW5rbm93biB9IHwgeyBpZDogbnVtYmVyOyBvazogZmFsc2U7IGVycm9yOiBzdHJpbmcgfTtcblxuLyoqIFRoZSBvcGVuIHRhYmxlcywgYnkgaGFuZGxlLiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lvblNvdXJjZVRhYmxlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFibGVzID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbkZlYXR1cmVUYWJsZT4oKTtcbiAgcHJpdmF0ZSBuZXh0SGFuZGxlID0gMTtcblxuICBydW48UiBleHRlbmRzIFJlZ2lvblNvdXJjZVJlcXVlc3Q+KHJlcXVlc3Q6IFIpOiBSZWdpb25Tb3VyY2VSZXN1bHRzW1JbJ29wJ11dIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChyZXF1ZXN0KSBhcyBSZWdpb25Tb3VyY2VSZXN1bHRzW1JbJ29wJ11dO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaChyOiBSZWdpb25Tb3VyY2VSZXF1ZXN0KTogUmVnaW9uU291cmNlUmVzdWx0c1trZXlvZiBSZWdpb25Tb3VyY2VSZXN1bHRzXSB7XG4gICAgc3dpdGNoIChyLm9wKSB7XG4gICAgICBjYXNlICdvcGVuJzoge1xuICAgICAgICBjb25zdCB0YWJsZSA9IFJlZ2lvbkZlYXR1cmVUYWJsZS5mcm9tR2VvSnNvbihyLnRleHQsIHIudGlsZVNpemUpO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLm5leHRIYW5kbGUrKztcbiAgICAgICAgdGhpcy50YWJsZXMuc2V0KGhhbmRsZSwgdGFibGUpO1xuICAgICAgICByZXR1cm4geyBoYW5kbGUsIGluZm86IHRhYmxlLmluZm8oKSB9O1xuICAgICAgfVxuICAgICAgY2FzZSAndGlsZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS50aWxlKHIueiwgci5sZXZlbCwgci5neCwgci5neSk7XG4gICAgICBjYXNlICdmZWF0dXJlcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5mZWF0dXJlcyhyLmlkcyk7XG4gICAgICBjYXNlICdpbmRleCc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5pbmRleChyLnosIHIucXVlcnkpO1xuICAgICAgY2FzZSAnY2xhc3Nlcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5jbGFzc0NvdW50cyhyLnosIHIuZXhjbHVkZSk7XG4gICAgICBjYXNlICdvdXRsaW5lcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlKHIuaGFuZGxlKS5jbGFzc091dGxpbmVzKHIuY2xhc3Nlcywgci5sZXZlbCwgci5leGNsdWRlKTtcbiAgICAgIGNhc2UgJ21lc2gnOlxuICAgICAgICByZXR1cm4gcmVjb25zdHJ1Y3Qoci5zbGljZXMsIHIub3B0aW9ucyk7XG4gICAgICBjYXNlICdleHBvcnQnOlxuICAgICAgICByZXR1cm4gdGhpcy50YWJsZShyLmhhbmRsZSkuZXhwb3J0R2VvSnNvbihyLmV4Y2x1ZGUsIHIuZXh0cmEpO1xuICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICB0aGlzLnRhYmxlcy5kZWxldGUoci5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRhYmxlKGhhbmRsZTogbnVtYmVyKTogUmVnaW9uRmVhdHVyZVRhYmxlIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldChoYW5kbGUpO1xuICAgIGlmICghdGFibGUpIHRocm93IG5ldyBFcnJvcihgTm8gb3BlbiByZWdpb24gc291cmNlICR7aGFuZGxlfS5gKTtcbiAgICByZXR1cm4gdGFibGU7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Factory for the region-source Web Worker, isolated in its own module so the `import.meta.url`
3
+ * reference — which the bundler needs in order to locate the worker — is never pulled into the
4
+ * ts-jest CommonJS compile of anything that uses it. Same arrangement as
5
+ * `workers/spatial-math-worker.ts`.
6
+ */
7
+ export function createRegionSourceWorker() {
8
+ return new Worker(new URL('./region-source.worker', import.meta.url), { type: 'module' });
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNvdXJjZS13b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXNvdXJjZS13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQzVGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZhY3RvcnkgZm9yIHRoZSByZWdpb24tc291cmNlIFdlYiBXb3JrZXIsIGlzb2xhdGVkIGluIGl0cyBvd24gbW9kdWxlIHNvIHRoZSBgaW1wb3J0Lm1ldGEudXJsYFxuICogcmVmZXJlbmNlIOKAlCB3aGljaCB0aGUgYnVuZGxlciBuZWVkcyBpbiBvcmRlciB0byBsb2NhdGUgdGhlIHdvcmtlciDigJQgaXMgbmV2ZXIgcHVsbGVkIGludG8gdGhlXG4gKiB0cy1qZXN0IENvbW1vbkpTIGNvbXBpbGUgb2YgYW55dGhpbmcgdGhhdCB1c2VzIGl0LiBTYW1lIGFycmFuZ2VtZW50IGFzXG4gKiBgd29ya2Vycy9zcGF0aWFsLW1hdGgtd29ya2VyLnRzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZ2lvblNvdXJjZVdvcmtlcigpOiBXb3JrZXIge1xuICByZXR1cm4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3JlZ2lvbi1zb3VyY2Uud29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSwgeyB0eXBlOiAnbW9kdWxlJyB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,67 @@
1
+ /**
2
+ * ROI GeoJSON at least this many characters long loads as a tiled region source rather than as
3
+ * regions (see `VizConfig.regionSourceMinChars`).
4
+ */
5
+ export const REGION_SOURCE_MIN_CHARS = 1_000_000;
6
+ /** Tiles a source keeps, most recently used last. */
7
+ export const REGION_TILE_CACHE_SIZE = 384;
8
+ /** A least-recently-used cache of tile requests. A request that fails is forgotten. */
9
+ export class RegionTileCache {
10
+ constructor(limit = REGION_TILE_CACHE_SIZE) {
11
+ this.limit = limit;
12
+ this.tiles = new Map();
13
+ }
14
+ /** The cached tile, else `load()`'s, cached. */
15
+ get(z, key, load) {
16
+ const id = `${z}/${key.level}/${key.gx}/${key.gy}`;
17
+ const hit = this.tiles.get(id);
18
+ if (hit) {
19
+ this.tiles.delete(id);
20
+ this.tiles.set(id, hit);
21
+ return hit;
22
+ }
23
+ const tile = load();
24
+ this.tiles.set(id, tile);
25
+ tile.catch(() => {
26
+ if (this.tiles.get(id) === tile)
27
+ this.tiles.delete(id);
28
+ });
29
+ while (this.tiles.size > this.limit)
30
+ this.tiles.delete(this.tiles.keys().next().value);
31
+ return tile;
32
+ }
33
+ clear() {
34
+ this.tiles.clear();
35
+ }
36
+ }
37
+ /** An `AbortError`, as `fetch` and the workers reject with. */
38
+ export function abortError() {
39
+ if (typeof DOMException !== 'undefined')
40
+ return new DOMException('The request was aborted.', 'AbortError');
41
+ const err = new Error('The request was aborted.');
42
+ err.name = 'AbortError';
43
+ return err;
44
+ }
45
+ /** True for the rejection of an aborted request. */
46
+ export function isAbortError(err) {
47
+ return err?.name === 'AbortError';
48
+ }
49
+ /** `promise`, rejected with an `AbortError` as soon as `signal` fires (the work goes on). */
50
+ export function abortable(promise, signal) {
51
+ if (!signal)
52
+ return promise;
53
+ if (signal.aborted)
54
+ return Promise.reject(abortError());
55
+ return new Promise((resolve, reject) => {
56
+ const onAbort = () => reject(abortError());
57
+ signal.addEventListener('abort', onAbort, { once: true });
58
+ promise.then((v) => {
59
+ signal.removeEventListener('abort', onAbort);
60
+ resolve(v);
61
+ }, (e) => {
62
+ signal.removeEventListener('abort', onAbort);
63
+ reject(e);
64
+ });
65
+ });
66
+ }
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLXNvdXJjZS9yZWdpb24tc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTZFQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxTQUFTLENBQUM7QUFFakQscURBQXFEO0FBQ3JELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUUxQyx1RkFBdUY7QUFDdkYsTUFBTSxPQUFPLGVBQWU7SUFHMUIsWUFBNkIsUUFBUSxzQkFBc0I7UUFBOUIsVUFBSyxHQUFMLEtBQUssQ0FBeUI7UUFGMUMsVUFBSyxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO0lBRUYsQ0FBQztJQUUvRCxnREFBZ0Q7SUFDaEQsR0FBRyxDQUFDLENBQVMsRUFBRSxHQUFrQixFQUFFLElBQStCO1FBQ2hFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4QixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUk7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFlLENBQUMsQ0FBQztRQUNqRyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDO0NBQ0Y7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLFVBQVU7SUFDeEIsSUFBSSxPQUFPLFlBQVksS0FBSyxXQUFXO1FBQUUsT0FBTyxJQUFJLFlBQVksQ0FBQywwQkFBMEIsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUMzRyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ2xELEdBQUcsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBQ3hCLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVk7SUFDdkMsT0FBUSxHQUFnQyxFQUFFLElBQUksS0FBSyxZQUFZLENBQUM7QUFDbEUsQ0FBQztBQUVELDZGQUE2RjtBQUM3RixNQUFNLFVBQVUsU0FBUyxDQUFJLE9BQW1CLEVBQUUsTUFBb0I7SUFDcEUsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUM1QixJQUFJLE1BQU0sQ0FBQyxPQUFPO1FBQUUsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDeEQsT0FBTyxJQUFJLE9BQU8sQ0FBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN4QyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE9BQU8sQ0FBQyxJQUFJLENBQ1YsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNKLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxFQUNELENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDSixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHRpbGVkIHJlZ2lvbiBzb3VyY2U6IG9uZSBpbWFnZSdzIGxhcmdlIHJlZ2lvbiBzZXQsIHNlcnZlZCBhcyBsZXZlbC1vZi1kZXRhaWwgdGlsZXMgc28gYSB2aWV3XG4gKiBuZXZlciBob2xkcyBvciBkcmF3cyB0aGUgd2hvbGUgc2V0IChzZWUgYHJlZ2lvbi10aWxlc2AgZm9yIHRoZSBsZXZlbHMgYW5kIHRpbGVzKS5cbiAqXG4gKiBUd28gaW1wbGVtZW50YXRpb25zIGJlaGluZCB7QGxpbmsgUmVnaW9uU291cmNlfTogYSBHZW9KU09OIHNvdXJjZSBwYXJzZWQgYW5kIHRpbGVkIGluIGEgV2ViXG4gKiBXb3JrZXIgKGBvcGVuR2VvSnNvblJlZ2lvblNvdXJjZWAsIHRoZSBtYWluIHRocmVhZCBvbmx5IGV2ZXIgc2VlcyB0aWxlcyksIGFuZCBhbiBIVFRQIHNvdXJjZVxuICogZm9yIGEgc2VydmVyIHRoYXQgc2VydmVzIHRoZSBzYW1lIHRpbGVzIChgb3Blbkh0dHBSZWdpb25Tb3VyY2VgKS5cbiAqL1xuaW1wb3J0IHR5cGUge1xuICBDbGFzc091dGxpbmVzLFxuICBHZW9Kc29uRmVhdHVyZUxpa2UsXG4gIFJlZ2lvbkluZGV4UGFnZSxcbiAgUmVnaW9uSW5kZXhRdWVyeSxcbiAgUmVnaW9uU291cmNlSW5mbyxcbiAgUmVnaW9uVGlsZSxcbiAgUmVnaW9uVGlsZUtleSxcbiAgVGlsZUZlYXR1cmUsXG59IGZyb20gJy4vcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU3R5bGUgfSBmcm9tICcuLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tc3R5bGUnO1xuXG4vKiogQSBmZWF0dXJlJ3MgZXhhY3QgR2VvSlNPTiB3aXRoIHRoZSBzb3VyY2UncyBpZCBmb3IgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZUZlYXR1cmUge1xuICBpZDogc3RyaW5nO1xuICBmZWF0dXJlOiBHZW9Kc29uRmVhdHVyZUxpa2U7XG59XG5cbi8qKiBPbmUgaW1hZ2UncyB0aWxlZCByZWdpb24gc2V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpb25Tb3VyY2Uge1xuICAvKiogV2hhdCB0aGUgc291cmNlIGhvbGRzOyBrbm93biBvbmNlIGl0IGlzIG9wZW4uICovXG4gIHJlYWRvbmx5IGluZm86IFJlZ2lvblNvdXJjZUluZm87XG4gIC8qKiBPbmUgdGlsZSBvZiBwbGFuZSBgemAuIENhY2hlZDogYXNraW5nIGFnYWluIGZvciBhIHRpbGUgaW4gdmlldyBjb3N0cyBub3RoaW5nLiAqL1xuICBnZXRUaWxlKHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UmVnaW9uVGlsZT47XG4gIC8qKiBUaGUgZXhhY3QgZmVhdHVyZXMgd2l0aCB0aGVzZSBpZHMgKHVua25vd24gaWRzIGFyZSBza2lwcGVkKS4gKi9cbiAgZ2V0RmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8U291cmNlRmVhdHVyZVtdPjtcbiAgLyoqIEEgcGFnZSBvZiBwbGFuZSBgemAncyBmZWF0dXJlIGluZGV4LiAqL1xuICBnZXRJbmRleCh6OiBudW1iZXIsIHF1ZXJ5OiBSZWdpb25JbmRleFF1ZXJ5KTogUHJvbWlzZTxSZWdpb25JbmRleFBhZ2U+O1xuICAvKipcbiAgICogRXZlcnkgcGxhbmUncyBvdXRsaW5lcyBvZiB0aGUgZmVhdHVyZXMgb2YgdGhlc2UgY2xhc3Nlcywgc2ltcGxpZmllZCBmb3IgYGxldmVsYCwgd2l0aG91dCB0aGVcbiAgICogYGV4Y2x1ZGVgZCBpZHM6IHdoYXQgYSAzRCByZWNvbnN0cnVjdGlvbiBvZiB0aGUgY2xhc3NlcyBzdGFja3MuIGBjbGFzc2VzYCBudWxsIHJlYWRzIGV2ZXJ5XG4gICAqIGNsYXNzLCBlYWNoIG91dGxpbmUgbGFiZWxsZWQgd2l0aCBpdHMgb3duICh3aGF0IGEgc2VjdGlvbiB0aHJvdWdoIHRoZSBzdGFjayBkcmF3cykuXG4gICAqL1xuICBnZXRDbGFzc091dGxpbmVzKFxuICAgIGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGV4Y2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTxDbGFzc091dGxpbmVzW10+O1xuICAvKipcbiAgICogSG93IG1hbnkgZmVhdHVyZXMgb2YgZWFjaCBjbGFzcyBwbGFuZSBgemAgaGFzIChudWxsOiBldmVyeSBwbGFuZSwgdGhlIHdob2xlIHN0YWNrKSwgd2l0aG91dFxuICAgKiB0aGUgYGV4Y2x1ZGVgZCBpZHMuXG4gICAqL1xuICBnZXRDbGFzc0NvdW50cyh6OiBudW1iZXIgfCBudWxsLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+O1xuICAvKipcbiAgICogVGhlIHdob2xlIHNldCBhcyBhIEdlb0pTT04gRmVhdHVyZUNvbGxlY3Rpb24gc3RyaW5nLCB0aHJvdWdoIHRoZSB3b3JraW5nIHNldDogYGV4Y2x1ZGVgZFxuICAgKiBmZWF0dXJlcyAodGFrZW4gZm9yIGVkaXRpbmcsIG9yIGRlbGV0ZWQpIGxlZnQgb3V0LCBgZXh0cmFgIGZlYXR1cmVzIGFwcGVuZGVkLlxuICAgKi9cbiAgZXhwb3J0R2VvSnNvbihleGNsdWRlOiByZWFkb25seSBzdHJpbmdbXSwgZXh0cmE6IHJlYWRvbmx5IG9iamVjdFtdKTogUHJvbWlzZTxzdHJpbmc+O1xuICAvKiogUmVsZWFzZSB0aGUgc291cmNlIChpdHMgd29ya2VyIHRhYmxlLCBpdHMgY2FjaGUpLiAqL1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbi8qKiBXaGF0IHRoZSBzdG9yZSBzaG93cyBvZiB0aGUgY3VycmVudCBzbGljZSdzIHJlZ2lvbiBzb3VyY2U6IHdoYXQgYSBzb3VyY2UgbGF5ZXIgZHJhd3MuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lvblNvdXJjZVZpZXcge1xuICBzb3VyY2U6IFJlZ2lvblNvdXJjZTtcbiAgLyoqIFRoZSBzb3VyY2UgcGxhbmUgdGhlIHNsaWNlIHNob3dzLiAqL1xuICBwbGFuZTogbnVtYmVyO1xuICAvKiogSWRzIHRoZSBzb3VyY2Ugbm8gbG9uZ2VyIGRyYXdzOiB0YWtlbiBpbnRvIHRoZSB3b3JraW5nIHNldCwgb3IgZGVsZXRlZC4gKi9cbiAgdGFrZW46IFJlYWRvbmx5U2V0PHN0cmluZz47XG4gIC8qKiBUaGUgY29sb3VyIGEgZmVhdHVyZSBpcyBkcmF3biBpbiAoaXRzIGNsYXNzIGNvbG91ciwgYXMgYSByZWdpb24gb2YgdGhhdCBjbGFzcyBnZXRzKS4gKi9cbiAgY29sb3JPZihmZWF0dXJlOiBQaWNrPFRpbGVGZWF0dXJlLCAnbGFiZWwnIHwgJ2NvbG9yJz4pOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVnaW9uIGxvb2ssIHRoZSByZWdpb25zJyBvd24gKHNvIGEgZmVhdHVyZSBsb29rcyB0aGUgc2FtZSBvbmNlIHRha2VuKS4gKi9cbiAgc3R5bGU6IFJlZ2lvblN0eWxlO1xuICAvKiogV2hldGhlciBjbGFzcyBsYWJlbHMgYXJlIHNob3duLiAqL1xuICBsYWJlbHM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgY2xhc3MncyBmZWF0dXJlcyBhcmUgaGlkZGVuIChzZWUgYFJlZ2lvblN0b3JlLnNldENsYXNzZXNIaWRkZW5gKTsgZGVmYXVsdDogbm9uZSBpcy4gKi9cbiAgaXNIaWRkZW4/KGxhYmVsOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBST0kgR2VvSlNPTiBhdCBsZWFzdCB0aGlzIG1hbnkgY2hhcmFjdGVycyBsb25nIGxvYWRzIGFzIGEgdGlsZWQgcmVnaW9uIHNvdXJjZSByYXRoZXIgdGhhbiBhc1xuICogcmVnaW9ucyAoc2VlIGBWaXpDb25maWcucmVnaW9uU291cmNlTWluQ2hhcnNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9TT1VSQ0VfTUlOX0NIQVJTID0gMV8wMDBfMDAwO1xuXG4vKiogVGlsZXMgYSBzb3VyY2Uga2VlcHMsIG1vc3QgcmVjZW50bHkgdXNlZCBsYXN0LiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9USUxFX0NBQ0hFX1NJWkUgPSAzODQ7XG5cbi8qKiBBIGxlYXN0LXJlY2VudGx5LXVzZWQgY2FjaGUgb2YgdGlsZSByZXF1ZXN0cy4gQSByZXF1ZXN0IHRoYXQgZmFpbHMgaXMgZm9yZ290dGVuLiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lvblRpbGVDYWNoZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGlsZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxSZWdpb25UaWxlPj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGxpbWl0ID0gUkVHSU9OX1RJTEVfQ0FDSEVfU0laRSkge31cblxuICAvKiogVGhlIGNhY2hlZCB0aWxlLCBlbHNlIGBsb2FkKClgJ3MsIGNhY2hlZC4gKi9cbiAgZ2V0KHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBsb2FkOiAoKSA9PiBQcm9taXNlPFJlZ2lvblRpbGU+KTogUHJvbWlzZTxSZWdpb25UaWxlPiB7XG4gICAgY29uc3QgaWQgPSBgJHt6fS8ke2tleS5sZXZlbH0vJHtrZXkuZ3h9LyR7a2V5Lmd5fWA7XG4gICAgY29uc3QgaGl0ID0gdGhpcy50aWxlcy5nZXQoaWQpO1xuICAgIGlmIChoaXQpIHtcbiAgICAgIHRoaXMudGlsZXMuZGVsZXRlKGlkKTtcbiAgICAgIHRoaXMudGlsZXMuc2V0KGlkLCBoaXQpO1xuICAgICAgcmV0dXJuIGhpdDtcbiAgICB9XG4gICAgY29uc3QgdGlsZSA9IGxvYWQoKTtcbiAgICB0aGlzLnRpbGVzLnNldChpZCwgdGlsZSk7XG4gICAgdGlsZS5jYXRjaCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50aWxlcy5nZXQoaWQpID09PSB0aWxlKSB0aGlzLnRpbGVzLmRlbGV0ZShpZCk7XG4gICAgfSk7XG4gICAgd2hpbGUgKHRoaXMudGlsZXMuc2l6ZSA+IHRoaXMubGltaXQpIHRoaXMudGlsZXMuZGVsZXRlKHRoaXMudGlsZXMua2V5cygpLm5leHQoKS52YWx1ZSBhcyBzdHJpbmcpO1xuICAgIHJldHVybiB0aWxlO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy50aWxlcy5jbGVhcigpO1xuICB9XG59XG5cbi8qKiBBbiBgQWJvcnRFcnJvcmAsIGFzIGBmZXRjaGAgYW5kIHRoZSB3b3JrZXJzIHJlamVjdCB3aXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFib3J0RXJyb3IoKTogRXJyb3Ige1xuICBpZiAodHlwZW9mIERPTUV4Y2VwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBuZXcgRE9NRXhjZXB0aW9uKCdUaGUgcmVxdWVzdCB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpO1xuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ1RoZSByZXF1ZXN0IHdhcyBhYm9ydGVkLicpO1xuICBlcnIubmFtZSA9ICdBYm9ydEVycm9yJztcbiAgcmV0dXJuIGVycjtcbn1cblxuLyoqIFRydWUgZm9yIHRoZSByZWplY3Rpb24gb2YgYW4gYWJvcnRlZCByZXF1ZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJvcnRFcnJvcihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChlcnIgYXMgeyBuYW1lPzogc3RyaW5nIH0gfCBudWxsKT8ubmFtZSA9PT0gJ0Fib3J0RXJyb3InO1xufVxuXG4vKiogYHByb21pc2VgLCByZWplY3RlZCB3aXRoIGFuIGBBYm9ydEVycm9yYCBhcyBzb29uIGFzIGBzaWduYWxgIGZpcmVzICh0aGUgd29yayBnb2VzIG9uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhYm9ydGFibGU8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFQ+IHtcbiAgaWYgKCFzaWduYWwpIHJldHVybiBwcm9taXNlO1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybiBQcm9taXNlLnJlamVjdChhYm9ydEVycm9yKCkpO1xuICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiByZWplY3QoYWJvcnRFcnJvcigpKTtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgcHJvbWlzZS50aGVuKFxuICAgICAgKHYpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgIHJlc29sdmUodik7XG4gICAgICB9LFxuICAgICAgKGUpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG59XG4iXX0=