@jax-data-science/sci-image-visualizer 0.8.3 → 0.9.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 (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -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/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +358 -4218
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -883
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -0,0 +1,183 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { frameToRgba } from './sam-prompt';
3
+ import { getSamModel, isSamModelReady } from './sam-model-registry';
4
+ import * as i0 from "@angular/core";
5
+ /** Lazy-import so onnxruntime-web is never pulled into unit tests or the
6
+ * initial bundle — only when segmentation actually runs. */
7
+ const onnxSessionFactory = async () => {
8
+ const { OnnxSamSession } = await import('./onnx-sam-session');
9
+ return new OnnxSamSession();
10
+ };
11
+ /** Thrown inside a load that a model switch superseded. */
12
+ class SupersededLoad extends Error {
13
+ }
14
+ /**
15
+ * The one SAM inference session for the active model, shared by the box- and
16
+ * point-prompt tools (RT-10): one download, one Worker/GPU session and one
17
+ * cached image embedding instead of one per tool.
18
+ *
19
+ * - Concurrent {@link ensureSession} calls share a single load, and each caller
20
+ * receives its download progress.
21
+ * - A load that fails disposes its half-built session (and Worker) and is not
22
+ * cached; the next call retries (RT-7).
23
+ * - {@link setModel} during a load discards that load's session, and the
24
+ * waiting callers get the newly picked model instead (RT-9).
25
+ *
26
+ * Scope: root, on purpose, and deliberately NOT in `provideVisualization()`. The
27
+ * chain-scoped SAM tools of a second viewer (jit-ui's pipeline preview) resolve
28
+ * this root instance, so the model (14–172 MB) is downloaded and its Worker/GPU
29
+ * session built once per app, not once per viewer, and the embedding cache is
30
+ * keyed by image + model so viewers don't confuse each other's images. The cost
31
+ * is that a model picked in one viewer is the model of all of them. A host that
32
+ * wants a session per viewer can provide this service at the viewer's component:
33
+ * {@link ngOnDestroy} then disposes that viewer's session (and Worker) with it.
34
+ */
35
+ export class SamSessionService {
36
+ constructor() {
37
+ this.model = getSamModel();
38
+ this.session = null;
39
+ this.loading = null;
40
+ /** Bumped on every model switch; a load started under an older value is stale. */
41
+ this.generation = 0;
42
+ this.progressListeners = new Set();
43
+ this.createSession = onnxSessionFactory;
44
+ /** Set by {@link ngOnDestroy}: no session is loaded any more. */
45
+ this.destroyed = false;
46
+ /** Cached encoder embedding + the key (image identity + model) it was computed for. */
47
+ this.embedding = null;
48
+ this.embeddingKey = null;
49
+ }
50
+ /** The model the next run uses. */
51
+ getModel() {
52
+ return this.model;
53
+ }
54
+ /** True when a session is loaded (or injected) for the current model. */
55
+ hasSession() {
56
+ return this.session !== null;
57
+ }
58
+ /** Choose the registered model; drops the loaded session and cached embedding. */
59
+ setModel(id) {
60
+ const next = getSamModel(id);
61
+ if (next.id === this.model.id)
62
+ return;
63
+ this.model = next;
64
+ this.generation++;
65
+ this.loading = null;
66
+ this.invalidateEmbedding();
67
+ this.session?.dispose();
68
+ this.session = null;
69
+ }
70
+ /** Drop the cached embedding (e.g. after the image/slice changes). */
71
+ invalidateEmbedding() {
72
+ this.embedding = null;
73
+ this.embeddingKey = null;
74
+ }
75
+ /** Test seam: use this session (already loaded) for the current model. */
76
+ useSession(session) {
77
+ this.session = session;
78
+ }
79
+ /** Test seam: how sessions are created (default: lazy onnxruntime-web). */
80
+ useSessionFactory(factory) {
81
+ this.createSession = factory;
82
+ }
83
+ /**
84
+ * The loaded session for the current model, loading it if needed.
85
+ * `onProgress` receives the download fraction while this call waits.
86
+ */
87
+ async ensureSession(onProgress) {
88
+ if (this.destroyed)
89
+ throw new Error('The SAM session was disposed with its viewer.');
90
+ if (this.session)
91
+ return this.session;
92
+ if (!isSamModelReady(this.model)) {
93
+ throw new Error(`SAM model "${this.model.id}" is not configured yet (no ONNX URLs). ` +
94
+ 'Host it and call setSamModelUrls(), then retry.');
95
+ }
96
+ if (onProgress) {
97
+ this.progressListeners.add(onProgress);
98
+ onProgress(0);
99
+ }
100
+ try {
101
+ return await (this.loading ??= this.load());
102
+ }
103
+ catch (err) {
104
+ if (err instanceof SupersededLoad)
105
+ return this.ensureSession(onProgress);
106
+ throw err;
107
+ }
108
+ finally {
109
+ if (onProgress)
110
+ this.progressListeners.delete(onProgress);
111
+ }
112
+ }
113
+ /**
114
+ * The encoder embedding of a cached frame, reused while `key` (the image's
115
+ * identity: file, frame, readback frame) and the model are unchanged.
116
+ * `onEncode` is called only when the encoder actually runs.
117
+ */
118
+ async embed(session, cached, frameIndex, key, onEncode) {
119
+ const fullKey = `${key}|${this.model.id}`;
120
+ if (this.embedding && this.embeddingKey === fullKey)
121
+ return this.embedding;
122
+ onEncode?.();
123
+ const generation = this.generation;
124
+ const embedding = await session.embed({
125
+ data: frameToRgba(cached, frameIndex),
126
+ width: cached.width,
127
+ height: cached.height,
128
+ });
129
+ if (generation === this.generation) {
130
+ this.embedding = embedding;
131
+ this.embeddingKey = fullKey;
132
+ }
133
+ return embedding;
134
+ }
135
+ /**
136
+ * Dispose the session (and its Worker), drop the embedding and discard an
137
+ * in-flight load. Angular calls this when the injector providing the service
138
+ * is destroyed: the app for the root instance, or a viewer component that
139
+ * provides its own.
140
+ */
141
+ ngOnDestroy() {
142
+ this.destroyed = true;
143
+ this.generation++; // an in-flight load disposes its session when it lands
144
+ this.loading = null;
145
+ this.invalidateEmbedding();
146
+ this.session?.dispose();
147
+ this.session = null;
148
+ }
149
+ load() {
150
+ const generation = this.generation;
151
+ const model = this.model;
152
+ const load = (async () => {
153
+ const session = await this.createSession();
154
+ try {
155
+ await session.loadModel(model, (f) => this.progressListeners.forEach((l) => l(f)));
156
+ }
157
+ catch (err) {
158
+ session.dispose(); // don't leak the half-built session / Worker
159
+ throw err;
160
+ }
161
+ if (generation !== this.generation) {
162
+ session.dispose(); // the user picked another model meanwhile
163
+ throw new SupersededLoad();
164
+ }
165
+ this.session = session;
166
+ return session;
167
+ })();
168
+ load
169
+ .catch(() => undefined)
170
+ .finally(() => {
171
+ if (this.loading === load)
172
+ this.loading = null;
173
+ });
174
+ return load;
175
+ }
176
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamSessionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
177
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamSessionService, providedIn: 'root' }); }
178
+ }
179
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamSessionService, decorators: [{
180
+ type: Injectable,
181
+ args: [{ providedIn: 'root' }]
182
+ }] });
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLXNlc3Npb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXNlc3Npb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBR3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFNcEU7NkRBQzZEO0FBQzdELE1BQU0sa0JBQWtCLEdBQXNCLEtBQUssSUFBSSxFQUFFO0lBQ3ZELE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzlELE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQztBQUM5QixDQUFDLENBQUM7QUFFRiwyREFBMkQ7QUFDM0QsTUFBTSxjQUFlLFNBQVEsS0FBSztDQUFHO0FBRXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFEOUI7UUFFVSxVQUFLLEdBQWdCLFdBQVcsRUFBRSxDQUFDO1FBQ25DLFlBQU8sR0FBdUIsSUFBSSxDQUFDO1FBQ25DLFlBQU8sR0FBZ0MsSUFBSSxDQUFDO1FBQ3BELGtGQUFrRjtRQUMxRSxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ04sc0JBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFDbkUsa0JBQWEsR0FBc0Isa0JBQWtCLENBQUM7UUFFOUQsaUVBQWlFO1FBQ3pELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFMUIsdUZBQXVGO1FBQy9FLGNBQVMsR0FBd0IsSUFBSSxDQUFDO1FBQ3RDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztLQXVJNUM7SUFySUMsbUNBQW1DO0lBQ25DLFFBQVE7UUFDTixP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LE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRixDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyw2Q0FBNkM7Z0JBQ2hFLE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQztZQUNELElBQUksVUFBVSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsMENBQTBDO2dCQUM3RCxNQUFNLElBQUksY0FBYyxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3ZCLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDTCxJQUFJO2FBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQzthQUN0QixPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUk7Z0JBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDTCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7OEdBcEpVLGlCQUFpQjtrSEFBakIsaUJBQWlCLGNBREosTUFBTTs7MkZBQ25CLGlCQUFpQjtrQkFEN0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHR5cGUgeyBDYWNoZWRJbWFnZURhdGEgfSBmcm9tICcuLi93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IGZyYW1lVG9SZ2JhIH0gZnJvbSAnLi9zYW0tcHJvbXB0JztcbmltcG9ydCB7IGdldFNhbU1vZGVsLCBpc1NhbU1vZGVsUmVhZHkgfSBmcm9tICcuL3NhbS1tb2RlbC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBJU2FtU2Vzc2lvbiwgU2FtRW1iZWRkaW5nLCBTYW1Nb2RlbERlZiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zYW0uY29udHJhY3QnO1xuXG4vKiogQ3JlYXRlcyBhbiB1bmxvYWRlZCBpbmZlcmVuY2Ugc2Vzc2lvbi4gKi9cbmV4cG9ydCB0eXBlIFNhbVNlc3Npb25GYWN0b3J5ID0gKCkgPT4gUHJvbWlzZTxJU2FtU2Vzc2lvbj47XG5cbi8qKiBMYXp5LWltcG9ydCBzbyBvbm54cnVudGltZS13ZWIgaXMgbmV2ZXIgcHVsbGVkIGludG8gdW5pdCB0ZXN0cyBvciB0aGVcbiAqICBpbml0aWFsIGJ1bmRsZSDigJQgb25seSB3aGVuIHNlZ21lbnRhdGlvbiBhY3R1YWxseSBydW5zLiAqL1xuY29uc3Qgb25ueFNlc3Npb25GYWN0b3J5OiBTYW1TZXNzaW9uRmFjdG9yeSA9IGFzeW5jICgpID0+IHtcbiAgY29uc3QgeyBPbm54U2FtU2Vzc2lvbiB9ID0gYXdhaXQgaW1wb3J0KCcuL29ubngtc2FtLXNlc3Npb24nKTtcbiAgcmV0dXJuIG5ldyBPbm54U2FtU2Vzc2lvbigpO1xufTtcblxuLyoqIFRocm93biBpbnNpZGUgYSBsb2FkIHRoYXQgYSBtb2RlbCBzd2l0Y2ggc3VwZXJzZWRlZC4gKi9cbmNsYXNzIFN1cGVyc2VkZWRMb2FkIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBUaGUgb25lIFNBTSBpbmZlcmVuY2Ugc2Vzc2lvbiBmb3IgdGhlIGFjdGl2ZSBtb2RlbCwgc2hhcmVkIGJ5IHRoZSBib3gtIGFuZFxuICogcG9pbnQtcHJvbXB0IHRvb2xzIChSVC0xMCk6IG9uZSBkb3dubG9hZCwgb25lIFdvcmtlci9HUFUgc2Vzc2lvbiBhbmQgb25lXG4gKiBjYWNoZWQgaW1hZ2UgZW1iZWRkaW5nIGluc3RlYWQgb2Ygb25lIHBlciB0b29sLlxuICpcbiAqIC0gQ29uY3VycmVudCB7QGxpbmsgZW5zdXJlU2Vzc2lvbn0gY2FsbHMgc2hhcmUgYSBzaW5nbGUgbG9hZCwgYW5kIGVhY2ggY2FsbGVyXG4gKiAgIHJlY2VpdmVzIGl0cyBkb3dubG9hZCBwcm9ncmVzcy5cbiAqIC0gQSBsb2FkIHRoYXQgZmFpbHMgZGlzcG9zZXMgaXRzIGhhbGYtYnVpbHQgc2Vzc2lvbiAoYW5kIFdvcmtlcikgYW5kIGlzIG5vdFxuICogICBjYWNoZWQ7IHRoZSBuZXh0IGNhbGwgcmV0cmllcyAoUlQtNykuXG4gKiAtIHtAbGluayBzZXRNb2RlbH0gZHVyaW5nIGEgbG9hZCBkaXNjYXJkcyB0aGF0IGxvYWQncyBzZXNzaW9uLCBhbmQgdGhlXG4gKiAgIHdhaXRpbmcgY2FsbGVycyBnZXQgdGhlIG5ld2x5IHBpY2tlZCBtb2RlbCBpbnN0ZWFkIChSVC05KS5cbiAqXG4gKiBTY29wZTogcm9vdCwgb24gcHVycG9zZSwgYW5kIGRlbGliZXJhdGVseSBOT1QgaW4gYHByb3ZpZGVWaXN1YWxpemF0aW9uKClgLiBUaGVcbiAqIGNoYWluLXNjb3BlZCBTQU0gdG9vbHMgb2YgYSBzZWNvbmQgdmlld2VyIChqaXQtdWkncyBwaXBlbGluZSBwcmV2aWV3KSByZXNvbHZlXG4gKiB0aGlzIHJvb3QgaW5zdGFuY2UsIHNvIHRoZSBtb2RlbCAoMTTigJMxNzIgTUIpIGlzIGRvd25sb2FkZWQgYW5kIGl0cyBXb3JrZXIvR1BVXG4gKiBzZXNzaW9uIGJ1aWx0IG9uY2UgcGVyIGFwcCwgbm90IG9uY2UgcGVyIHZpZXdlciwgYW5kIHRoZSBlbWJlZGRpbmcgY2FjaGUgaXNcbiAqIGtleWVkIGJ5IGltYWdlICsgbW9kZWwgc28gdmlld2VycyBkb24ndCBjb25mdXNlIGVhY2ggb3RoZXIncyBpbWFnZXMuIFRoZSBjb3N0XG4gKiBpcyB0aGF0IGEgbW9kZWwgcGlja2VkIGluIG9uZSB2aWV3ZXIgaXMgdGhlIG1vZGVsIG9mIGFsbCBvZiB0aGVtLiBBIGhvc3QgdGhhdFxuICogd2FudHMgYSBzZXNzaW9uIHBlciB2aWV3ZXIgY2FuIHByb3ZpZGUgdGhpcyBzZXJ2aWNlIGF0IHRoZSB2aWV3ZXIncyBjb21wb25lbnQ6XG4gKiB7QGxpbmsgbmdPbkRlc3Ryb3l9IHRoZW4gZGlzcG9zZXMgdGhhdCB2aWV3ZXIncyBzZXNzaW9uIChhbmQgV29ya2VyKSB3aXRoIGl0LlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFNhbVNlc3Npb25TZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBtb2RlbDogU2FtTW9kZWxEZWYgPSBnZXRTYW1Nb2RlbCgpO1xuICBwcml2YXRlIHNlc3Npb246IElTYW1TZXNzaW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9hZGluZzogUHJvbWlzZTxJU2FtU2Vzc2lvbj4gfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCBvbiBldmVyeSBtb2RlbCBzd2l0Y2g7IGEgbG9hZCBzdGFydGVkIHVuZGVyIGFuIG9sZGVyIHZhbHVlIGlzIHN0YWxlLiAqL1xuICBwcml2YXRlIGdlbmVyYXRpb24gPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2dyZXNzTGlzdGVuZXJzID0gbmV3IFNldDwoZnJhY3Rpb246IG51bWJlcikgPT4gdm9pZD4oKTtcbiAgcHJpdmF0ZSBjcmVhdGVTZXNzaW9uOiBTYW1TZXNzaW9uRmFjdG9yeSA9IG9ubnhTZXNzaW9uRmFjdG9yeTtcblxuICAvKiogU2V0IGJ5IHtAbGluayBuZ09uRGVzdHJveX06IG5vIHNlc3Npb24gaXMgbG9hZGVkIGFueSBtb3JlLiAqL1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8qKiBDYWNoZWQgZW5jb2RlciBlbWJlZGRpbmcgKyB0aGUga2V5IChpbWFnZSBpZGVudGl0eSArIG1vZGVsKSBpdCB3YXMgY29tcHV0ZWQgZm9yLiAqL1xuICBwcml2YXRlIGVtYmVkZGluZzogU2FtRW1iZWRkaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZW1iZWRkaW5nS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogVGhlIG1vZGVsIHRoZSBuZXh0IHJ1biB1c2VzLiAqL1xuICBnZXRNb2RlbCgpOiBTYW1Nb2RlbERlZiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGEgc2Vzc2lvbiBpcyBsb2FkZWQgKG9yIGluamVjdGVkKSBmb3IgdGhlIGN1cnJlbnQgbW9kZWwuICovXG4gIGhhc1Nlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKiBDaG9vc2UgdGhlIHJlZ2lzdGVyZWQgbW9kZWw7IGRyb3BzIHRoZSBsb2FkZWQgc2Vzc2lvbiBhbmQgY2FjaGVkIGVtYmVkZGluZy4gKi9cbiAgc2V0TW9kZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBnZXRTYW1Nb2RlbChpZCk7XG4gICAgaWYgKG5leHQuaWQgPT09IHRoaXMubW9kZWwuaWQpIHJldHVybjtcbiAgICB0aGlzLm1vZGVsID0gbmV4dDtcbiAgICB0aGlzLmdlbmVyYXRpb24rKztcbiAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xuICAgIHRoaXMuaW52YWxpZGF0ZUVtYmVkZGluZygpO1xuICAgIHRoaXMuc2Vzc2lvbj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2Vzc2lvbiA9IG51bGw7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgY2FjaGVkIGVtYmVkZGluZyAoZS5nLiBhZnRlciB0aGUgaW1hZ2Uvc2xpY2UgY2hhbmdlcykuICovXG4gIGludmFsaWRhdGVFbWJlZGRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5lbWJlZGRpbmcgPSBudWxsO1xuICAgIHRoaXMuZW1iZWRkaW5nS2V5ID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBUZXN0IHNlYW06IHVzZSB0aGlzIHNlc3Npb24gKGFscmVhZHkgbG9hZGVkKSBmb3IgdGhlIGN1cnJlbnQgbW9kZWwuICovXG4gIHVzZVNlc3Npb24oc2Vzc2lvbjogSVNhbVNlc3Npb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICB9XG5cbiAgLyoqIFRlc3Qgc2VhbTogaG93IHNlc3Npb25zIGFyZSBjcmVhdGVkIChkZWZhdWx0OiBsYXp5IG9ubnhydW50aW1lLXdlYikuICovXG4gIHVzZVNlc3Npb25GYWN0b3J5KGZhY3Rvcnk6IFNhbVNlc3Npb25GYWN0b3J5KTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVTZXNzaW9uID0gZmFjdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbG9hZGVkIHNlc3Npb24gZm9yIHRoZSBjdXJyZW50IG1vZGVsLCBsb2FkaW5nIGl0IGlmIG5lZWRlZC5cbiAgICogYG9uUHJvZ3Jlc3NgIHJlY2VpdmVzIHRoZSBkb3dubG9hZCBmcmFjdGlvbiB3aGlsZSB0aGlzIGNhbGwgd2FpdHMuXG4gICAqL1xuICBhc3luYyBlbnN1cmVTZXNzaW9uKG9uUHJvZ3Jlc3M/OiAoZnJhY3Rpb246IG51bWJlcikgPT4gdm9pZCk6IFByb21pc2U8SVNhbVNlc3Npb24+IHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHRocm93IG5ldyBFcnJvcignVGhlIFNBTSBzZXNzaW9uIHdhcyBkaXNwb3NlZCB3aXRoIGl0cyB2aWV3ZXIuJyk7XG4gICAgaWYgKHRoaXMuc2Vzc2lvbikgcmV0dXJuIHRoaXMuc2Vzc2lvbjtcbiAgICBpZiAoIWlzU2FtTW9kZWxSZWFkeSh0aGlzLm1vZGVsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU0FNIG1vZGVsIFwiJHt0aGlzLm1vZGVsLmlkfVwiIGlzIG5vdCBjb25maWd1cmVkIHlldCAobm8gT05OWCBVUkxzKS4gYCArXG4gICAgICAgICAgJ0hvc3QgaXQgYW5kIGNhbGwgc2V0U2FtTW9kZWxVcmxzKCksIHRoZW4gcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICB0aGlzLnByb2dyZXNzTGlzdGVuZXJzLmFkZChvblByb2dyZXNzKTtcbiAgICAgIG9uUHJvZ3Jlc3MoMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgKHRoaXMubG9hZGluZyA/Pz0gdGhpcy5sb2FkKCkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFN1cGVyc2VkZWRMb2FkKSByZXR1cm4gdGhpcy5lbnN1cmVTZXNzaW9uKG9uUHJvZ3Jlc3MpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAob25Qcm9ncmVzcykgdGhpcy5wcm9ncmVzc0xpc3RlbmVycy5kZWxldGUob25Qcm9ncmVzcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlbmNvZGVyIGVtYmVkZGluZyBvZiBhIGNhY2hlZCBmcmFtZSwgcmV1c2VkIHdoaWxlIGBrZXlgICh0aGUgaW1hZ2Unc1xuICAgKiBpZGVudGl0eTogZmlsZSwgZnJhbWUsIHJlYWRiYWNrIGZyYW1lKSBhbmQgdGhlIG1vZGVsIGFyZSB1bmNoYW5nZWQuXG4gICAqIGBvbkVuY29kZWAgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgZW5jb2RlciBhY3R1YWxseSBydW5zLlxuICAgKi9cbiAgYXN5bmMgZW1iZWQoXG4gICAgc2Vzc2lvbjogSVNhbVNlc3Npb24sXG4gICAgY2FjaGVkOiBDYWNoZWRJbWFnZURhdGEsXG4gICAgZnJhbWVJbmRleDogbnVtYmVyLFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9uRW5jb2RlPzogKCkgPT4gdm9pZCxcbiAgKTogUHJvbWlzZTxTYW1FbWJlZGRpbmc+IHtcbiAgICBjb25zdCBmdWxsS2V5ID0gYCR7a2V5fXwke3RoaXMubW9kZWwuaWR9YDtcbiAgICBpZiAodGhpcy5lbWJlZGRpbmcgJiYgdGhpcy5lbWJlZGRpbmdLZXkgPT09IGZ1bGxLZXkpIHJldHVybiB0aGlzLmVtYmVkZGluZztcbiAgICBvbkVuY29kZT8uKCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMuZ2VuZXJhdGlvbjtcbiAgICBjb25zdCBlbWJlZGRpbmcgPSBhd2FpdCBzZXNzaW9uLmVtYmVkKHtcbiAgICAgIGRhdGE6IGZyYW1lVG9SZ2JhKGNhY2hlZCwgZnJhbWVJbmRleCksXG4gICAgICB3aWR0aDogY2FjaGVkLndpZHRoLFxuICAgICAgaGVpZ2h0OiBjYWNoZWQuaGVpZ2h0LFxuICAgIH0pO1xuICAgIGlmIChnZW5lcmF0aW9uID09PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgIHRoaXMuZW1iZWRkaW5nID0gZW1iZWRkaW5nO1xuICAgICAgdGhpcy5lbWJlZGRpbmdLZXkgPSBmdWxsS2V5O1xuICAgIH1cbiAgICByZXR1cm4gZW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2UgdGhlIHNlc3Npb24gKGFuZCBpdHMgV29ya2VyKSwgZHJvcCB0aGUgZW1iZWRkaW5nIGFuZCBkaXNjYXJkIGFuXG4gICAqIGluLWZsaWdodCBsb2FkLiBBbmd1bGFyIGNhbGxzIHRoaXMgd2hlbiB0aGUgaW5qZWN0b3IgcHJvdmlkaW5nIHRoZSBzZXJ2aWNlXG4gICAqIGlzIGRlc3Ryb3llZDogdGhlIGFwcCBmb3IgdGhlIHJvb3QgaW5zdGFuY2UsIG9yIGEgdmlld2VyIGNvbXBvbmVudCB0aGF0XG4gICAqIHByb3ZpZGVzIGl0cyBvd24uXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5nZW5lcmF0aW9uKys7IC8vIGFuIGluLWZsaWdodCBsb2FkIGRpc3Bvc2VzIGl0cyBzZXNzaW9uIHdoZW4gaXQgbGFuZHNcbiAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xuICAgIHRoaXMuaW52YWxpZGF0ZUVtYmVkZGluZygpO1xuICAgIHRoaXMuc2Vzc2lvbj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2Vzc2lvbiA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGxvYWQoKTogUHJvbWlzZTxJU2FtU2Vzc2lvbj4ge1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLmdlbmVyYXRpb247XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsO1xuICAgIGNvbnN0IGxvYWQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuY3JlYXRlU2Vzc2lvbigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2Vzc2lvbi5sb2FkTW9kZWwobW9kZWwsIChmKSA9PiB0aGlzLnByb2dyZXNzTGlzdGVuZXJzLmZvckVhY2goKGwpID0+IGwoZikpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXNzaW9uLmRpc3Bvc2UoKTsgLy8gZG9uJ3QgbGVhayB0aGUgaGFsZi1idWlsdCBzZXNzaW9uIC8gV29ya2VyXG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgc2Vzc2lvbi5kaXNwb3NlKCk7IC8vIHRoZSB1c2VyIHBpY2tlZCBhbm90aGVyIG1vZGVsIG1lYW53aGlsZVxuICAgICAgICB0aHJvdyBuZXcgU3VwZXJzZWRlZExvYWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICB9KSgpO1xuICAgIGxvYWRcbiAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmcgPT09IGxvYWQpIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgICB9KTtcbiAgICByZXR1cm4gbG9hZDtcbiAgfVxufVxuIl19
@@ -1,188 +1,133 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { BehaviorSubject } from 'rxjs';
3
- import { WandService } from '../wand/wand.service';
4
- import { frameToRgba } from './sam-prompt';
5
- import { getSamModel, isSamModelReady } from './sam-model-registry';
6
- import { Region, Polygon, Rectangle } from '../../models/region';
2
+ import { SamSessionService } from './sam-session.service';
3
+ import { Region, Rectangle } from '../../models/region';
4
+ import { makePolygon } from '../../models/polygon-factory';
5
+ import { maskToPolygons } from '../../geometry/contour';
6
+ import { MatrixFrame } from '../tool-kit/matrix-frame';
7
+ import { AsyncToolStatus } from '../tool-kit/async-tool-status';
8
+ import { withoutRegions } from './segmentation-commit';
7
9
  import * as i0 from "@angular/core";
8
- import * as i1 from "../wand/wand.service";
10
+ import * as i1 from "./sam-session.service";
9
11
  /**
10
12
  * Box-prompted SAM segmentation tool (jit-ui#90, P0). On `segmentBoxes()` it
11
13
  * reads every rectangle region, runs the (cached) encoder once for the image,
12
- * then runs the decoder per box, traces each mask to a polygon (reusing
13
- * WandService.maskToPolygons) and commits them as regions.
14
+ * then runs the decoder per box, traces each mask to a polygon and replaces
15
+ * the prompt rectangles with the masks.
14
16
  *
15
- * Inference is abstracted behind {@link ISamSession}: production uses the
16
- * onnxruntime-web session (lazy-imported so ORT never loads in unit tests);
17
- * tests inject a fake via {@link useSession}.
17
+ * Inference goes through the shared {@link SamSessionService} (one session and
18
+ * embedding for both SAM tools); tests inject a fake session via
19
+ * {@link useSession}.
18
20
  */
19
21
  export class SamToolService {
20
- constructor(wandService) {
21
- this.wandService = wandService;
22
- this.session = null;
23
- this.model = getSamModel();
24
- /** Cached encoder embedding + the key (image identity) it was computed for. */
25
- this.embedding = null;
26
- this.embeddingKey = null;
22
+ constructor(sessions = new SamSessionService()) {
23
+ this.sessions = sessions;
24
+ this.state = new AsyncToolStatus();
27
25
  /** Status text + busy flag for a spinner / toast in the host. */
28
- this.status$ = new BehaviorSubject('');
29
- this.busy$ = new BehaviorSubject(false);
26
+ this.status$ = this.state.status$;
27
+ this.busy$ = this.state.busy$;
30
28
  /** Encoder-download progress: -1 = not downloading, 0..1 = downloading. */
31
- this.progress$ = new BehaviorSubject(-1);
29
+ this.progress$ = this.state.progress$;
32
30
  }
33
- /** Bind to the active backend's host (called by the backend, like the wand). */
34
- bindHost(host) {
35
- this.host = host;
36
- }
37
- /** Choose the registered model to use; invalidates any cached embedding. */
31
+ /** Choose the registered model to use (shared with the point tool). */
38
32
  setModel(id) {
39
- const next = getSamModel(id);
40
- if (next.id === this.model.id)
41
- return;
42
- this.model = next;
43
- this.invalidateEmbedding();
44
- // Drop the loaded session so the next run reloads the newly-picked model's
45
- // ONNX pair — ensureSession() returns the cached session as-is, so without
46
- // this a model switch would keep running the previous model.
47
- this.session?.dispose();
48
- this.session = null;
33
+ this.sessions.setModel(id);
49
34
  }
50
35
  /** Drop the cached embedding (e.g. after the image/slice changes). */
51
36
  invalidateEmbedding() {
52
- this.embedding = null;
53
- this.embeddingKey = null;
37
+ this.sessions.invalidateEmbedding();
54
38
  }
55
39
  /** Test seam: inject a fake/alternate inference session. */
56
40
  useSession(session) {
57
- this.session = session;
41
+ this.sessions.useSession(session);
58
42
  }
59
43
  /**
60
- * Segment every rectangle region with a box prompt and append the resulting
61
- * masks as new polygon regions. Returns how many regions were added.
44
+ * Segment every rectangle region of the backend behind `host` with a box
45
+ * prompt and replace each prompt that produced a mask with the mask's polygon
46
+ * region. Returns how many regions were added; 0 (ignored) while a previous
47
+ * run is still going. The host is passed per run, so no backend's host
48
+ * outlives its call.
62
49
  */
63
- async segmentBoxes() {
64
- if (!this.host)
65
- return 0;
66
- // Re-entrancy guard: a second Segment press while the first run is still
67
- // downloading/encoding would launch a concurrent model download + GPU
68
- // encode (and can freeze the tab on a heavy WebGPU ViT-B). Ignore it.
69
- if (this.busy$.value)
50
+ async segmentBoxes(host) {
51
+ if (this.state.busy)
70
52
  return 0;
71
- const cached = this.host.getCachedImageData();
53
+ const cached = host.getCachedImageData();
72
54
  if (!cached || cached.frames.length === 0) {
73
55
  this.status$.next('No image loaded.');
74
56
  return 0;
75
57
  }
76
- const regions = this.host.getRegions();
77
- const rects = regions.filter((r) => r.bounds instanceof Rectangle);
58
+ const rects = host.getRegions().filter((r) => r.bounds instanceof Rectangle);
78
59
  if (rects.length === 0) {
79
60
  this.status$.next('Draw one or more rectangles, then press Segment.');
80
61
  return 0;
81
62
  }
82
- const rx = cached.ratios[0] || 1;
83
- const ry = cached.ratios[0] || 1;
84
- const ox = cached.originX ?? 0;
85
- const oy = cached.originY ?? 0;
86
- let session;
87
- try {
88
- session = await this.ensureSession();
89
- }
90
- catch (err) {
91
- this.busy$.next(false);
92
- this.status$.next(err instanceof Error ? err.message : 'SAM model unavailable.');
93
- return 0;
94
- }
95
- this.busy$.next(true);
96
- try {
97
- // Encode once per image; reuse the embedding across all boxes.
98
- const key = [
99
- this.host.getFileName() ?? '',
100
- this.host.getActiveFrameIndex(),
101
- `${cached.width}x${cached.height}`,
102
- `${ox},${oy},${rx}`,
103
- this.model.id,
104
- ].join('|');
105
- if (!this.embedding || this.embeddingKey !== key) {
106
- this.status$.next('Encoding image…');
107
- const rgba = frameToRgba(cached, this.host.getActiveFrameIndex());
108
- this.embedding = await session.embed({ data: rgba, width: cached.width, height: cached.height });
109
- this.embeddingKey = key;
63
+ const frame = MatrixFrame.from(cached);
64
+ const frameIdx = host.getActiveFrameIndex();
65
+ // Busy from here on — including the model download, so a second press
66
+ // can't start a second download/encode (which can freeze the tab on a heavy
67
+ // WebGPU ViT-B).
68
+ const added = await this.state.run(async () => {
69
+ let session;
70
+ try {
71
+ session = await this.sessions.ensureSession((f) => this.progress$.next(f));
110
72
  }
111
- const masks = [];
112
- const consumed = new Set(); // prompt rectangles that produced a mask
113
- let added = 0;
114
- for (let i = 0; i < rects.length; i++) {
115
- this.status$.next(`Segmenting ${i + 1}/${rects.length}…`);
116
- const b = rects[i].bounds;
117
- // Rectangle is in data coords → convert to image (matrix) coords.
118
- const box = {
119
- x0: (b.x - ox) / rx,
120
- y0: (b.y - oy) / ry,
121
- x1: (b.x + b.width - ox) / rx,
122
- y1: (b.y + b.height - oy) / ry,
123
- };
124
- const res = await session.decode(this.embedding, { box });
125
- const polys = this.wandService.maskToPolygons(res.mask, res.width, res.height, cached.width, cached.height, 0, 0);
126
- if (polys.length === 0)
127
- continue;
128
- // Keep the largest connected piece (maskToPolygons returns largest-first).
129
- const poly = polys[0];
130
- masks.push(this.makeRegion(poly.xpoints.map((x) => ox + x * rx), poly.ypoints.map((y) => oy + y * ry), rects[i].color));
131
- consumed.add(rects[i]); // this rectangle is now represented by its mask
132
- added++;
73
+ catch (err) {
74
+ this.status$.next(err instanceof Error ? err.message : 'SAM model unavailable.');
75
+ return 0;
133
76
  }
134
- // Replace each segmented prompt rectangle with its mask region; keep any
135
- // rectangle that produced no mask (so it can be retried) + other regions.
136
- const out = regions.filter((r) => !consumed.has(r)).concat(masks);
137
- this.host.setRegions(out);
138
- this.status$.next(added > 0 ? `Added ${added} region(s).` : 'No masks found.');
139
- return added;
140
- }
141
- catch (err) {
142
- this.status$.next(err instanceof Error ? err.message : 'Segmentation failed.');
143
- return 0;
144
- }
145
- finally {
146
- this.busy$.next(false);
147
- this.progress$.next(-1);
148
- }
149
- }
150
- makeRegion(xData, yData, color) {
151
- const poly = new Polygon();
152
- poly.npoints = xData.length;
153
- poly.xpoints = xData;
154
- poly.ypoints = yData;
155
- poly.coordinates = xData.map((x, i) => [x, yData[i]]);
156
- poly.closed = true;
157
- const region = new Region();
158
- region.bounds = poly;
159
- // Inherit the source prompt rectangle's color; fall back to the host default.
160
- region.color = color || this.host.getShapeColor();
161
- // Default class/annotation name, matching the wand/brush + overlay-drawn regions.
162
- region.label = 'sam';
163
- return region;
164
- }
165
- async ensureSession() {
166
- if (this.session)
167
- return this.session;
168
- if (!isSamModelReady(this.model)) {
169
- throw new Error(`SAM model "${this.model.id}" is not configured yet (no ONNX URLs). ` +
170
- 'Host it and call setSamModelUrls(), then retry.');
171
- }
172
- // Lazy-import so onnxruntime-web is never pulled into unit tests / the
173
- // initial bundle — only when segmentation actually runs.
174
- const { OnnxSamSession } = await import('./onnx-sam-session');
175
- const session = new OnnxSamSession();
176
- this.progress$.next(0);
177
- await session.loadModel(this.model, (f) => this.progress$.next(f));
178
- this.session = session;
179
- return session;
77
+ try {
78
+ // Encode once per image; reuse the embedding across all boxes.
79
+ const key = [host.getFileName() ?? '', frameIdx, `${cached.width}x${cached.height}`, frame.sig].join('|');
80
+ const embedding = await this.sessions.embed(session, cached, frameIdx, key, () => this.status$.next('Encoding image…'));
81
+ const masks = [];
82
+ const consumed = []; // prompt rectangles that produced a mask
83
+ for (let i = 0; i < rects.length; i++) {
84
+ this.status$.next(`Segmenting ${i + 1}/${rects.length}…`);
85
+ const b = rects[i].bounds;
86
+ // Rectangle is in data coords → convert to image (matrix) coords.
87
+ const box = {
88
+ x0: frame.toMatrixX(b.x),
89
+ y0: frame.toMatrixY(b.y),
90
+ x1: frame.toMatrixX(b.x + b.width),
91
+ y1: frame.toMatrixY(b.y + b.height),
92
+ };
93
+ const res = await session.decode(embedding, { box });
94
+ // Keep the largest connected piece (maskToPolygons returns largest-first).
95
+ const poly = maskToPolygons(res.mask, res.width, res.height, 0, 0)[0];
96
+ if (!poly)
97
+ continue;
98
+ // Inherit the prompt rectangle's colour.
99
+ masks.push(makeSamRegion(poly, frame, rects[i].color || host.getShapeColor()));
100
+ consumed.push(rects[i]);
101
+ }
102
+ // Commit against the regions as they are NOW: the user may have drawn,
103
+ // edited or deleted regions during the (possibly minutes-long) run.
104
+ // Prompts that produced a mask are replaced; the rest stay for a retry.
105
+ host.setRegions(withoutRegions(host.getRegions(), consumed).concat(masks));
106
+ this.status$.next(masks.length > 0 ? `Added ${masks.length} region(s).` : 'No masks found.');
107
+ return masks.length;
108
+ }
109
+ catch (err) {
110
+ this.status$.next(err instanceof Error ? err.message : 'Segmentation failed.');
111
+ return 0;
112
+ }
113
+ });
114
+ return added ?? 0;
180
115
  }
181
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamToolService, deps: [{ token: i1.WandService }], target: i0.ɵɵFactoryTarget.Injectable }); }
116
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamToolService, deps: [{ token: i1.SamSessionService }], target: i0.ɵɵFactoryTarget.Injectable }); }
182
117
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamToolService, providedIn: 'root' }); }
183
118
  }
184
119
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamToolService, decorators: [{
185
120
  type: Injectable,
186
121
  args: [{ providedIn: 'root' }]
187
- }], ctorParameters: () => [{ type: i1.WandService }] });
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLXRvb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBTWpFOzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBZXpCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBYnBDLFlBQU8sR0FBdUIsSUFBSSxDQUFDO1FBQ25DLFVBQUssR0FBZ0IsV0FBVyxFQUFFLENBQUM7UUFFM0MsK0VBQStFO1FBQ3ZFLGNBQVMsR0FBd0IsSUFBSSxDQUFDO1FBQ3RDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUUzQyxpRUFBaUU7UUFDeEQsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLFVBQUssR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNyRCwyRUFBMkU7UUFDbEUsY0FBUyxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFTixDQUFDO0lBRWhELGdGQUFnRjtJQUNoRixRQUFRLENBQUMsSUFBaUI7UUFDeEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENB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Q0FBQyxFQUFFLDBDQUEwQztnQkFDckUsaURBQWlELENBQ2xELENBQUM7UUFDSixDQUFDO1FBQ0QsdUVBQXVFO1FBQ3ZFLHlEQUF5RDtRQUN6RCxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7OEdBakxVLGNBQWM7a0hBQWQsY0FBYyxjQURELE1BQU07OzJGQUNuQixjQUFjO2tCQUQxQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBXYW5kU2VydmljZSB9IGZyb20gJy4uL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbmRUb29sSG9zdCB9IGZyb20gJy4uL3dhbmQvd2FuZC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgZnJhbWVUb1JnYmEgfSBmcm9tICcuL3NhbS1wcm9tcHQnO1xuaW1wb3J0IHsgZ2V0U2FtTW9kZWwsIGlzU2FtTW9kZWxSZWFkeSB9IGZyb20gJy4vc2FtLW1vZGVsLXJlZ2lzdHJ5JztcbmltcG9ydCB7IElTYW1TZXNzaW9uLCBTYW1FbWJlZGRpbmcsIFNhbU1vZGVsRGVmIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb24sIFBvbHlnb24sIFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uL21vZGVscy9yZWdpb24nO1xuXG4vKiogVGhlIFNBTSB0b29sIGJpbmRzIHRvIHRoZSBzYW1lIGhvc3QgdGhlIHdhbmQvYnJ1c2ggdXNlLCBzbyBlYWNoIGJhY2tlbmRcbiAqICByZXVzZXMgaXRzIGV4aXN0aW5nIHBpeGVsIHJlYWRiYWNrICsgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gKyByZWdpb24gc3RvcmUuICovXG5leHBvcnQgdHlwZSBTYW1Ub29sSG9zdCA9IFdhbmRUb29sSG9zdDtcblxuLyoqXG4gKiBCb3gtcHJvbXB0ZWQgU0FNIHNlZ21lbnRhdGlvbiB0b29sIChqaXQtdWkjOTAsIFAwKS4gT24gYHNlZ21lbnRCb3hlcygpYCBpdFxuICogcmVhZHMgZXZlcnkgcmVjdGFuZ2xlIHJlZ2lvbiwgcnVucyB0aGUgKGNhY2hlZCkgZW5jb2RlciBvbmNlIGZvciB0aGUgaW1hZ2UsXG4gKiB0aGVuIHJ1bnMgdGhlIGRlY29kZXIgcGVyIGJveCwgdHJhY2VzIGVhY2ggbWFzayB0byBhIHBvbHlnb24gKHJldXNpbmdcbiAqIFdhbmRTZXJ2aWNlLm1hc2tUb1BvbHlnb25zKSBhbmQgY29tbWl0cyB0aGVtIGFzIHJlZ2lvbnMuXG4gKlxuICogSW5mZXJlbmNlIGlzIGFic3RyYWN0ZWQgYmVoaW5kIHtAbGluayBJU2FtU2Vzc2lvbn06IHByb2R1Y3Rpb24gdXNlcyB0aGVcbiAqIG9ubnhydW50aW1lLXdlYiBzZXNzaW9uIChsYXp5LWltcG9ydGVkIHNvIE9SVCBuZXZlciBsb2FkcyBpbiB1bml0IHRlc3RzKTtcbiAqIHRlc3RzIGluamVjdCBhIGZha2UgdmlhIHtAbGluayB1c2VTZXNzaW9ufS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTYW1Ub29sU2VydmljZSB7XG4gIHByaXZhdGUgaG9zdCE6IFNhbVRvb2xIb3N0O1xuICBwcml2YXRlIHNlc3Npb246IElTYW1TZXNzaW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbW9kZWw6IFNhbU1vZGVsRGVmID0gZ2V0U2FtTW9kZWwoKTtcblxuICAvKiogQ2FjaGVkIGVuY29kZXIgZW1iZWRkaW5nICsgdGhlIGtleSAoaW1hZ2UgaWRlbnRpdHkpIGl0IHdhcyBjb21wdXRlZCBmb3IuICovXG4gIHByaXZhdGUgZW1iZWRkaW5nOiBTYW1FbWJlZGRpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBlbWJlZGRpbmdLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBTdGF0dXMgdGV4dCArIGJ1c3kgZmxhZyBmb3IgYSBzcGlubmVyIC8gdG9hc3QgaW4gdGhlIGhvc3QuICovXG4gIHJlYWRvbmx5IHN0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBidXN5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogRW5jb2Rlci1kb3dubG9hZCBwcm9ncmVzczogLTEgPSBub3QgZG93bmxvYWRpbmcsIDAuLjEgPSBkb3dubG9hZGluZy4gKi9cbiAgcmVhZG9ubHkgcHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KC0xKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHdhbmRTZXJ2aWNlOiBXYW5kU2VydmljZSkge31cblxuICAvKiogQmluZCB0byB0aGUgYWN0aXZlIGJhY2tlbmQncyBob3N0IChjYWxsZWQgYnkgdGhlIGJhY2tlbmQsIGxpa2UgdGhlIHdhbmQpLiAqL1xuICBiaW5kSG9zdChob3N0OiBTYW1Ub29sSG9zdCk6IHZvaWQge1xuICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gIH1cblxuICAvKiogQ2hvb3NlIHRoZSByZWdpc3RlcmVkIG1vZGVsIHRvIHVzZTsgaW52YWxpZGF0ZXMgYW55IGNhY2hlZCBlbWJlZGRpbmcuICovXG4gIHNldE1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gZ2V0U2FtTW9kZWwoaWQpO1xuICAgIGlmIChuZXh0LmlkID09PSB0aGlzLm1vZGVsLmlkKSByZXR1cm47XG4gICAgdGhpcy5tb2RlbCA9IG5leHQ7XG4gICAgdGhpcy5pbnZhbGlkYXRlRW1iZWRkaW5nKCk7XG4gICAgLy8gRHJvcCB0aGUgbG9hZGVkIHNlc3Npb24gc28gdGhlIG5leHQgcnVuIHJlbG9hZHMgdGhlIG5ld2x5LXBpY2tlZCBtb2RlbCdzXG4gICAgLy8gT05OWCBwYWlyIOKAlCBlbnN1cmVTZXNzaW9uKCkgcmV0dXJucyB0aGUgY2FjaGVkIHNlc3Npb24gYXMtaXMsIHNvIHdpdGhvdXRcbiAgICAvLyB0aGlzIGEgbW9kZWwgc3dpdGNoIHdvdWxkIGtlZXAgcnVubmluZyB0aGUgcHJldmlvdXMgbW9kZWwuXG4gICAgdGhpcy5zZXNzaW9uPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zZXNzaW9uID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBjYWNoZWQgZW1iZWRkaW5nIChlLmcuIGFmdGVyIHRoZSBpbWFnZS9zbGljZSBjaGFuZ2VzKS4gKi9cbiAgaW52YWxpZGF0ZUVtYmVkZGluZygpOiB2b2lkIHtcbiAgICB0aGlzLmVtYmVkZGluZyA9IG51bGw7XG4gICAgdGhpcy5lbWJlZGRpbmdLZXkgPSBudWxsO1xuICB9XG5cbiAgLyoqIFRlc3Qgc2VhbTogaW5qZWN0IGEgZmFrZS9hbHRlcm5hdGUgaW5mZXJlbmNlIHNlc3Npb24uICovXG4gIHVzZVNlc3Npb24oc2Vzc2lvbjogSVNhbVNlc3Npb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZ21lbnQgZXZlcnkgcmVjdGFuZ2xlIHJlZ2lvbiB3aXRoIGEgYm94IHByb21wdCBhbmQgYXBwZW5kIHRoZSByZXN1bHRpbmdcbiAgICogbWFza3MgYXMgbmV3IHBvbHlnb24gcmVnaW9ucy4gUmV0dXJucyBob3cgbWFueSByZWdpb25zIHdlcmUgYWRkZWQuXG4gICAqL1xuICBhc3luYyBzZWdtZW50Qm94ZXMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuaG9zdCkgcmV0dXJuIDA7XG4gICAgLy8gUmUtZW50cmFuY3kgZ3VhcmQ6IGEgc2Vjb25kIFNlZ21lbnQgcHJlc3Mgd2hpbGUgdGhlIGZpcnN0IHJ1biBpcyBzdGlsbFxuICAgIC8vIGRvd25sb2FkaW5nL2VuY29kaW5nIHdvdWxkIGxhdW5jaCBhIGNvbmN1cnJlbnQgbW9kZWwgZG93bmxvYWQgKyBHUFVcbiAgICAvLyBlbmNvZGUgKGFuZCBjYW4gZnJlZXplIHRoZSB0YWIgb24gYSBoZWF2eSBXZWJHUFUgVmlULUIpLiBJZ25vcmUgaXQuXG4gICAgaWYgKHRoaXMuYnVzeSQudmFsdWUpIHJldHVybiAwO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuaG9zdC5nZXRDYWNoZWRJbWFnZURhdGEoKTtcbiAgICBpZiAoIWNhY2hlZCB8fCBjYWNoZWQuZnJhbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoJ05vIGltYWdlIGxvYWRlZC4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLmhvc3QuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IHJlY3RzID0gcmVnaW9ucy5maWx0ZXIoKHIpID0+IHIuYm91bmRzIGluc3RhbmNlb2YgUmVjdGFuZ2xlKTtcbiAgICBpZiAocmVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnN0YXR1cyQubmV4dCgnRHJhdyBvbmUgb3IgbW9yZSByZWN0YW5nbGVzLCB0aGVuIHByZXNzIFNlZ21lbnQuJyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByeCA9IGNhY2hlZC5yYXRpb3NbMF0gfHwgMTtcbiAgICBjb25zdCByeSA9IGNhY2hlZC5yYXRpb3NbMF0gfHwgMTtcbiAgICBjb25zdCBveCA9IGNhY2hlZC5vcmlnaW5YID8/IDA7XG4gICAgY29uc3Qgb3kgPSBjYWNoZWQub3JpZ2luWSA/PyAwO1xuXG4gICAgbGV0IHNlc3Npb246IElTYW1TZXNzaW9uO1xuICAgIHRyeSB7XG4gICAgICBzZXNzaW9uID0gYXdhaXQgdGhpcy5lbnN1cmVTZXNzaW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmJ1c3kkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICdTQU0gbW9kZWwgdW5hdmFpbGFibGUuJyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICB0aGlzLmJ1c3kkLm5leHQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuY29kZSBvbmNlIHBlciBpbWFnZTsgcmV1c2UgdGhlIGVtYmVkZGluZyBhY3Jvc3MgYWxsIGJveGVzLlxuICAgICAgY29uc3Qga2V5ID0gW1xuICAgICAgICB0aGlzLmhvc3QuZ2V0RmlsZU5hbWUoKSA/PyAnJyxcbiAgICAgICAgdGhpcy5ob3N0LmdldEFjdGl2ZUZyYW1lSW5kZXgoKSxcbiAgICAgICAgYCR7Y2FjaGVkLndpZHRofXgke2NhY2hlZC5oZWlnaHR9YCxcbiAgICAgICAgYCR7b3h9LCR7b3l9LCR7cnh9YCxcbiAgICAgICAgdGhpcy5tb2RlbC5pZCxcbiAgICAgIF0uam9pbignfCcpO1xuICAgICAgaWYgKCF0aGlzLmVtYmVkZGluZyB8fCB0aGlzLmVtYmVkZGluZ0tleSAhPT0ga2V5KSB7XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KCdFbmNvZGluZyBpbWFnZeKApicpO1xuICAgICAgICBjb25zdCByZ2JhID0gZnJhbWVUb1JnYmEoY2FjaGVkLCB0aGlzLmhvc3QuZ2V0QWN0aXZlRnJhbWVJbmRleCgpKTtcbiAgICAgICAgdGhpcy5lbWJlZGRpbmcgPSBhd2FpdCBzZXNzaW9uLmVtYmVkKHsgZGF0YTogcmdiYSwgd2lkdGg6IGNhY2hlZC53aWR0aCwgaGVpZ2h0OiBjYWNoZWQuaGVpZ2h0IH0pO1xuICAgICAgICB0aGlzLmVtYmVkZGluZ0tleSA9IGtleTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFza3M6IFJlZ2lvbltdID0gW107XG4gICAgICBjb25zdCBjb25zdW1lZCA9IG5ldyBTZXQ8UmVnaW9uPigpOyAvLyBwcm9tcHQgcmVjdGFuZ2xlcyB0aGF0IHByb2R1Y2VkIGEgbWFza1xuICAgICAgbGV0IGFkZGVkID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5zdGF0dXMkLm5leHQoYFNlZ21lbnRpbmcgJHtpICsgMX0vJHtyZWN0cy5sZW5ndGh94oCmYCk7XG4gICAgICAgIGNvbnN0IGIgPSByZWN0c1tpXS5ib3VuZHMgYXMgUmVjdGFuZ2xlO1xuICAgICAgICAvLyBSZWN0YW5nbGUgaXMgaW4gZGF0YSBjb29yZHMg4oaSIGNvbnZlcnQgdG8gaW1hZ2UgKG1hdHJpeCkgY29vcmRzLlxuICAgICAgICBjb25zdCBib3ggPSB7XG4gICAgICAgICAgeDA6IChiLnggLSBveCkgLyByeCxcbiAgICAgICAgICB5MDogKGIueSAtIG95KSAvIHJ5LFxuICAgICAgICAgIHgxOiAoYi54ICsgYi53aWR0aCAtIG94KSAvIHJ4LFxuICAgICAgICAgIHkxOiAoYi55ICsgYi5oZWlnaHQgLSBveSkgLyByeSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2Vzc2lvbi5kZWNvZGUodGhpcy5lbWJlZGRpbmcsIHsgYm94IH0pO1xuICAgICAgICBjb25zdCBwb2x5cyA9IHRoaXMud2FuZFNlcnZpY2UubWFza1RvUG9seWdvbnMoXG4gICAgICAgICAgcmVzLm1hc2ssIHJlcy53aWR0aCwgcmVzLmhlaWdodCwgY2FjaGVkLndpZHRoLCBjYWNoZWQuaGVpZ2h0LCAwLCAwLFxuICAgICAgICApO1xuICAgICAgICBpZiAocG9seXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgLy8gS2VlcCB0aGUgbGFyZ2VzdCBjb25uZWN0ZWQgcGllY2UgKG1hc2tUb1BvbHlnb25zIHJldHVybnMgbGFyZ2VzdC1maXJzdCkuXG4gICAgICAgIGNvbnN0IHBvbHkgPSBwb2x5c1swXTtcbiAgICAgICAgbWFza3MucHVzaCh0aGlzLm1ha2VSZWdpb24oXG4gICAgICAgICAgcG9seS54cG9pbnRzLm1hcCgoeCkgPT4gb3ggKyB4ICogcngpLFxuICAgICAgICAgIHBvbHkueXBvaW50cy5tYXAoKHkpID0+IG95ICsgeSAqIHJ5KSxcbiAgICAgICAgICByZWN0c1tpXS5jb2xvciwgLy8gaW5oZXJpdCB0aGUgcHJvbXB0IHJlY3RhbmdsZSdzIGNvbG9yXG4gICAgICAgICkpO1xuICAgICAgICBjb25zdW1lZC5hZGQocmVjdHNbaV0pOyAvLyB0aGlzIHJlY3RhbmdsZSBpcyBub3cgcmVwcmVzZW50ZWQgYnkgaXRzIG1hc2tcbiAgICAgICAgYWRkZWQrKztcbiAgICAgIH1cblxuICAgICAgLy8gUmVwbGFjZSBlYWNoIHNlZ21lbnRlZCBwcm9tcHQgcmVjdGFuZ2xlIHdpdGggaXRzIG1hc2sgcmVnaW9uOyBrZWVwIGFueVxuICAgICAgLy8gcmVjdGFuZ2xlIHRoYXQgcHJvZHVjZWQgbm8gbWFzayAoc28gaXQgY2FuIGJlIHJldHJpZWQpICsgb3RoZXIgcmVnaW9ucy5cbiAgICAgIGNvbnN0IG91dCA9IHJlZ2lvbnMuZmlsdGVyKChyKSA9PiAhY29uc3VtZWQuaGFzKHIpKS5jb25jYXQobWFza3MpO1xuICAgICAgdGhpcy5ob3N0LnNldFJlZ2lvbnMob3V0KTtcbiAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KGFkZGVkID4gMCA/IGBBZGRlZCAke2FkZGVkfSByZWdpb24ocykuYCA6ICdObyBtYXNrcyBmb3VuZC4nKTtcbiAgICAgIHJldHVybiBhZGRlZDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnU2VnbWVudGF0aW9uIGZhaWxlZC4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmJ1c3kkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5wcm9ncmVzcyQubmV4dCgtMSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYWtlUmVnaW9uKHhEYXRhOiBudW1iZXJbXSwgeURhdGE6IG51bWJlcltdLCBjb2xvcj86IHN0cmluZyk6IFJlZ2lvbiB7XG4gICAgY29uc3QgcG9seSA9IG5ldyBQb2x5Z29uKCk7XG4gICAgcG9seS5ucG9pbnRzID0geERhdGEubGVuZ3RoO1xuICAgIHBvbHkueHBvaW50cyA9IHhEYXRhO1xuICAgIHBvbHkueXBvaW50cyA9IHlEYXRhO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSB4RGF0YS5tYXAoKHgsIGkpID0+IFt4LCB5RGF0YVtpXV0pO1xuICAgIHBvbHkuY2xvc2VkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICByZWdpb24uYm91bmRzID0gcG9seTtcbiAgICAvLyBJbmhlcml0IHRoZSBzb3VyY2UgcHJvbXB0IHJlY3RhbmdsZSdzIGNvbG9yOyBmYWxsIGJhY2sgdG8gdGhlIGhvc3QgZGVmYXVsdC5cbiAgICByZWdpb24uY29sb3IgPSBjb2xvciB8fCB0aGlzLmhvc3QuZ2V0U2hhcGVDb2xvcigpO1xuICAgIC8vIERlZmF1bHQgY2xhc3MvYW5ub3RhdGlvbiBuYW1lLCBtYXRjaGluZyB0aGUgd2FuZC9icnVzaCArIG92ZXJsYXktZHJhd24gcmVnaW9ucy5cbiAgICByZWdpb24ubGFiZWwgPSAnc2FtJztcbiAgICByZXR1cm4gcmVnaW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVTZXNzaW9uKCk6IFByb21pc2U8SVNhbVNlc3Npb24+IHtcbiAgICBpZiAodGhpcy5zZXNzaW9uKSByZXR1cm4gdGhpcy5zZXNzaW9uO1xuICAgIGlmICghaXNTYW1Nb2RlbFJlYWR5KHRoaXMubW9kZWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTQU0gbW9kZWwgXCIke3RoaXMubW9kZWwuaWR9XCIgaXMgbm90IGNvbmZpZ3VyZWQgeWV0IChubyBPTk5YIFVSTHMpLiBgICtcbiAgICAgICAgJ0hvc3QgaXQgYW5kIGNhbGwgc2V0U2FtTW9kZWxVcmxzKCksIHRoZW4gcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIExhenktaW1wb3J0IHNvIG9ubnhydW50aW1lLXdlYiBpcyBuZXZlciBwdWxsZWQgaW50byB1bml0IHRlc3RzIC8gdGhlXG4gICAgLy8gaW5pdGlhbCBidW5kbGUg4oCUIG9ubHkgd2hlbiBzZWdtZW50YXRpb24gYWN0dWFsbHkgcnVucy5cbiAgICBjb25zdCB7IE9ubnhTYW1TZXNzaW9uIH0gPSBhd2FpdCBpbXBvcnQoJy4vb25ueC1zYW0tc2Vzc2lvbicpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgT25ueFNhbVNlc3Npb24oKTtcbiAgICB0aGlzLnByb2dyZXNzJC5uZXh0KDApO1xuICAgIGF3YWl0IHNlc3Npb24ubG9hZE1vZGVsKHRoaXMubW9kZWwsIChmKSA9PiB0aGlzLnByb2dyZXNzJC5uZXh0KGYpKTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHJldHVybiBzZXNzaW9uO1xuICB9XG59XG4iXX0=
122
+ }], ctorParameters: () => [{ type: i1.SamSessionService }] });
123
+ function makeSamRegion(poly, frame, color) {
124
+ const ring = frame.ringToData(poly.xpoints, poly.ypoints);
125
+ const region = new Region();
126
+ region.bounds = makePolygon(ring.xs, ring.ys, { holes: frame.holesToData(poly.holes) });
127
+ // The source prompt rectangle's color, else the host default.
128
+ region.color = color;
129
+ // Default class/annotation name, matching the wand/brush + overlay-drawn regions.
130
+ region.label = 'sam';
131
+ return region;
132
+ }
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLXRvb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBRSxNQUFNLEVBQVcsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7O0FBTXZEOzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBU3pCLFlBQTZCLFdBQThCLElBQUksaUJBQWlCLEVBQUU7UUFBckQsYUFBUSxHQUFSLFFBQVEsQ0FBNkM7UUFSakUsVUFBSyxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFFL0MsaUVBQWlFO1FBQ3hELFlBQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QixVQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDbEMsMkVBQTJFO1FBQ2xFLGNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUUyQyxDQUFDO0lBRXRGLHVFQUF1RTtJQUN2RSxRQUFRLENBQUMsRUFBVTtRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLG1CQUFtQjtRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELDREQUE0RDtJQUM1RCxVQUFVLENBQUMsT0FBb0I7UUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBb0I7UUFDckMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDdEMsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sWUFBWSxTQUFTLENBQUMsQ0FBQztRQUM3RSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQztZQUN0RSxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTVDLHNFQUFzRTtRQUN0RSw0RUFBNEU7UUFDNUUsaUJBQWlCO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDNUMsSUFBSSxPQUFvQixDQUFDO1lBQ3pCLElBQUksQ0FBQztnQkFDSCxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RSxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO2dCQUNqRixPQUFPLENBQUMsQ0FBQztZQUNYLENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsK0RBQStEO2dCQUMvRCxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUcsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQy9FLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQ3JDLENBQUM7Z0JBRUYsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO2dCQUMzQixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUMsQ0FBQyx5Q0FBeUM7Z0JBQ3hFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDMUQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQW1CLENBQUM7b0JBQ3ZDLGtFQUFrRTtvQkFDbEUsTUFBTSxHQUFHLEdBQUc7d0JBQ1YsRUFBRSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDeEIsRUFBRSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDeEIsRUFBRSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO3dCQUNsQyxFQUFFLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7cUJBQ3BDLENBQUM7b0JBQ0YsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQ3JELDJFQUEyRTtvQkFDM0UsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdEUsSUFBSSxDQUFDLElBQUk7d0JBQUUsU0FBUztvQkFDcEIseUNBQXlDO29CQUN6QyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDL0UsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsQ0FBQztnQkFFRCx1RUFBdUU7Z0JBQ3ZFLG9FQUFvRTtnQkFDcEUsd0VBQXdFO2dCQUN4RSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxNQUFNLGFBQWEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDN0YsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3RCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBQy9FLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7OEdBbkdVLGNBQWM7a0hBQWQsY0FBYyxjQURELE1BQU07OzJGQUNuQixjQUFjO2tCQUQxQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7QUF1R2xDLFNBQVMsYUFBYSxDQUFDLElBQWEsRUFBRSxLQUFrQixFQUFFLEtBQWE7SUFDckUsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO0lBQzVCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEYsOERBQThEO0lBQzlELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLGtGQUFrRjtJQUNsRixNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDYW52YXNUb29sSG9zdCB9IGZyb20gJy4uL3Rvb2wta2l0L2NhbnZhcy10b29sJztcbmltcG9ydCB7IFNhbVNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi9zYW0tc2Vzc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElTYW1TZXNzaW9uIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb24sIFBvbHlnb24sIFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgbWFrZVBvbHlnb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvcG9seWdvbi1mYWN0b3J5JztcbmltcG9ydCB7IG1hc2tUb1BvbHlnb25zIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnkvY29udG91cic7XG5pbXBvcnQgeyBNYXRyaXhGcmFtZSB9IGZyb20gJy4uL3Rvb2wta2l0L21hdHJpeC1mcmFtZSc7XG5pbXBvcnQgeyBBc3luY1Rvb2xTdGF0dXMgfSBmcm9tICcuLi90b29sLWtpdC9hc3luYy10b29sLXN0YXR1cyc7XG5pbXBvcnQgeyB3aXRob3V0UmVnaW9ucyB9IGZyb20gJy4vc2VnbWVudGF0aW9uLWNvbW1pdCc7XG5cbi8qKiBAZGVwcmVjYXRlZCBUaGUgU0FNIHRvb2wgcnVucyBhZ2FpbnN0IHRoZSBiYWNrZW5kJ3MgY2FudmFzLXRvb2wgaG9zdDpcbiAqICB1c2Uge0BsaW5rIENhbnZhc1Rvb2xIb3N0fS4gKi9cbmV4cG9ydCB0eXBlIFNhbVRvb2xIb3N0ID0gQ2FudmFzVG9vbEhvc3Q7XG5cbi8qKlxuICogQm94LXByb21wdGVkIFNBTSBzZWdtZW50YXRpb24gdG9vbCAoaml0LXVpIzkwLCBQMCkuIE9uIGBzZWdtZW50Qm94ZXMoKWAgaXRcbiAqIHJlYWRzIGV2ZXJ5IHJlY3RhbmdsZSByZWdpb24sIHJ1bnMgdGhlIChjYWNoZWQpIGVuY29kZXIgb25jZSBmb3IgdGhlIGltYWdlLFxuICogdGhlbiBydW5zIHRoZSBkZWNvZGVyIHBlciBib3gsIHRyYWNlcyBlYWNoIG1hc2sgdG8gYSBwb2x5Z29uIGFuZCByZXBsYWNlc1xuICogdGhlIHByb21wdCByZWN0YW5nbGVzIHdpdGggdGhlIG1hc2tzLlxuICpcbiAqIEluZmVyZW5jZSBnb2VzIHRocm91Z2ggdGhlIHNoYXJlZCB7QGxpbmsgU2FtU2Vzc2lvblNlcnZpY2V9IChvbmUgc2Vzc2lvbiBhbmRcbiAqIGVtYmVkZGluZyBmb3IgYm90aCBTQU0gdG9vbHMpOyB0ZXN0cyBpbmplY3QgYSBmYWtlIHNlc3Npb24gdmlhXG4gKiB7QGxpbmsgdXNlU2Vzc2lvbn0uXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgU2FtVG9vbFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlID0gbmV3IEFzeW5jVG9vbFN0YXR1cygpO1xuXG4gIC8qKiBTdGF0dXMgdGV4dCArIGJ1c3kgZmxhZyBmb3IgYSBzcGlubmVyIC8gdG9hc3QgaW4gdGhlIGhvc3QuICovXG4gIHJlYWRvbmx5IHN0YXR1cyQgPSB0aGlzLnN0YXRlLnN0YXR1cyQ7XG4gIHJlYWRvbmx5IGJ1c3kkID0gdGhpcy5zdGF0ZS5idXN5JDtcbiAgLyoqIEVuY29kZXItZG93bmxvYWQgcHJvZ3Jlc3M6IC0xID0gbm90IGRvd25sb2FkaW5nLCAwLi4xID0gZG93bmxvYWRpbmcuICovXG4gIHJlYWRvbmx5IHByb2dyZXNzJCA9IHRoaXMuc3RhdGUucHJvZ3Jlc3MkO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvbnM6IFNhbVNlc3Npb25TZXJ2aWNlID0gbmV3IFNhbVNlc3Npb25TZXJ2aWNlKCkpIHt9XG5cbiAgLyoqIENob29zZSB0aGUgcmVnaXN0ZXJlZCBtb2RlbCB0byB1c2UgKHNoYXJlZCB3aXRoIHRoZSBwb2ludCB0b29sKS4gKi9cbiAgc2V0TW9kZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvbnMuc2V0TW9kZWwoaWQpO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIGNhY2hlZCBlbWJlZGRpbmcgKGUuZy4gYWZ0ZXIgdGhlIGltYWdlL3NsaWNlIGNoYW5nZXMpLiAqL1xuICBpbnZhbGlkYXRlRW1iZWRkaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvbnMuaW52YWxpZGF0ZUVtYmVkZGluZygpO1xuICB9XG5cbiAgLyoqIFRlc3Qgc2VhbTogaW5qZWN0IGEgZmFrZS9hbHRlcm5hdGUgaW5mZXJlbmNlIHNlc3Npb24uICovXG4gIHVzZVNlc3Npb24oc2Vzc2lvbjogSVNhbVNlc3Npb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlc3Npb25zLnVzZVNlc3Npb24oc2Vzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogU2VnbWVudCBldmVyeSByZWN0YW5nbGUgcmVnaW9uIG9mIHRoZSBiYWNrZW5kIGJlaGluZCBgaG9zdGAgd2l0aCBhIGJveFxuICAgKiBwcm9tcHQgYW5kIHJlcGxhY2UgZWFjaCBwcm9tcHQgdGhhdCBwcm9kdWNlZCBhIG1hc2sgd2l0aCB0aGUgbWFzaydzIHBvbHlnb25cbiAgICogcmVnaW9uLiBSZXR1cm5zIGhvdyBtYW55IHJlZ2lvbnMgd2VyZSBhZGRlZDsgMCAoaWdub3JlZCkgd2hpbGUgYSBwcmV2aW91c1xuICAgKiBydW4gaXMgc3RpbGwgZ29pbmcuIFRoZSBob3N0IGlzIHBhc3NlZCBwZXIgcnVuLCBzbyBubyBiYWNrZW5kJ3MgaG9zdFxuICAgKiBvdXRsaXZlcyBpdHMgY2FsbC5cbiAgICovXG4gIGFzeW5jIHNlZ21lbnRCb3hlcyhob3N0OiBDYW52YXNUb29sSG9zdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuYnVzeSkgcmV0dXJuIDA7XG4gICAgY29uc3QgY2FjaGVkID0gaG9zdC5nZXRDYWNoZWRJbWFnZURhdGEoKTtcbiAgICBpZiAoIWNhY2hlZCB8fCBjYWNoZWQuZnJhbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoJ05vIGltYWdlIGxvYWRlZC4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCByZWN0cyA9IGhvc3QuZ2V0UmVnaW9ucygpLmZpbHRlcigocikgPT4gci5ib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGUpO1xuICAgIGlmIChyZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KCdEcmF3IG9uZSBvciBtb3JlIHJlY3RhbmdsZXMsIHRoZW4gcHJlc3MgU2VnbWVudC4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBmcmFtZSA9IE1hdHJpeEZyYW1lLmZyb20oY2FjaGVkKTtcbiAgICBjb25zdCBmcmFtZUlkeCA9IGhvc3QuZ2V0QWN0aXZlRnJhbWVJbmRleCgpO1xuXG4gICAgLy8gQnVzeSBmcm9tIGhlcmUgb24g4oCUIGluY2x1ZGluZyB0aGUgbW9kZWwgZG93bmxvYWQsIHNvIGEgc2Vjb25kIHByZXNzXG4gICAgLy8gY2FuJ3Qgc3RhcnQgYSBzZWNvbmQgZG93bmxvYWQvZW5jb2RlICh3aGljaCBjYW4gZnJlZXplIHRoZSB0YWIgb24gYSBoZWF2eVxuICAgIC8vIFdlYkdQVSBWaVQtQikuXG4gICAgY29uc3QgYWRkZWQgPSBhd2FpdCB0aGlzLnN0YXRlLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgc2Vzc2lvbjogSVNhbVNlc3Npb247XG4gICAgICB0cnkge1xuICAgICAgICBzZXNzaW9uID0gYXdhaXQgdGhpcy5zZXNzaW9ucy5lbnN1cmVTZXNzaW9uKChmKSA9PiB0aGlzLnByb2dyZXNzJC5uZXh0KGYpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ1NBTSBtb2RlbCB1bmF2YWlsYWJsZS4nKTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAvLyBFbmNvZGUgb25jZSBwZXIgaW1hZ2U7IHJldXNlIHRoZSBlbWJlZGRpbmcgYWNyb3NzIGFsbCBib3hlcy5cbiAgICAgICAgY29uc3Qga2V5ID0gW2hvc3QuZ2V0RmlsZU5hbWUoKSA/PyAnJywgZnJhbWVJZHgsIGAke2NhY2hlZC53aWR0aH14JHtjYWNoZWQuaGVpZ2h0fWAsIGZyYW1lLnNpZ10uam9pbignfCcpO1xuICAgICAgICBjb25zdCBlbWJlZGRpbmcgPSBhd2FpdCB0aGlzLnNlc3Npb25zLmVtYmVkKHNlc3Npb24sIGNhY2hlZCwgZnJhbWVJZHgsIGtleSwgKCkgPT5cbiAgICAgICAgICB0aGlzLnN0YXR1cyQubmV4dCgnRW5jb2RpbmcgaW1hZ2XigKYnKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBtYXNrczogUmVnaW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgY29uc3VtZWQ6IFJlZ2lvbltdID0gW107IC8vIHByb21wdCByZWN0YW5nbGVzIHRoYXQgcHJvZHVjZWQgYSBtYXNrXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChgU2VnbWVudGluZyAke2kgKyAxfS8ke3JlY3RzLmxlbmd0aH3igKZgKTtcbiAgICAgICAgICBjb25zdCBiID0gcmVjdHNbaV0uYm91bmRzIGFzIFJlY3RhbmdsZTtcbiAgICAgICAgICAvLyBSZWN0YW5nbGUgaXMgaW4gZGF0YSBjb29yZHMg4oaSIGNvbnZlcnQgdG8gaW1hZ2UgKG1hdHJpeCkgY29vcmRzLlxuICAgICAgICAgIGNvbnN0IGJveCA9IHtcbiAgICAgICAgICAgIHgwOiBmcmFtZS50b01hdHJpeFgoYi54KSxcbiAgICAgICAgICAgIHkwOiBmcmFtZS50b01hdHJpeFkoYi55KSxcbiAgICAgICAgICAgIHgxOiBmcmFtZS50b01hdHJpeFgoYi54ICsgYi53aWR0aCksXG4gICAgICAgICAgICB5MTogZnJhbWUudG9NYXRyaXhZKGIueSArIGIuaGVpZ2h0KSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlc3Npb24uZGVjb2RlKGVtYmVkZGluZywgeyBib3ggfSk7XG4gICAgICAgICAgLy8gS2VlcCB0aGUgbGFyZ2VzdCBjb25uZWN0ZWQgcGllY2UgKG1hc2tUb1BvbHlnb25zIHJldHVybnMgbGFyZ2VzdC1maXJzdCkuXG4gICAgICAgICAgY29uc3QgcG9seSA9IG1hc2tUb1BvbHlnb25zKHJlcy5tYXNrLCByZXMud2lkdGgsIHJlcy5oZWlnaHQsIDAsIDApWzBdO1xuICAgICAgICAgIGlmICghcG9seSkgY29udGludWU7XG4gICAgICAgICAgLy8gSW5oZXJpdCB0aGUgcHJvbXB0IHJlY3RhbmdsZSdzIGNvbG91ci5cbiAgICAgICAgICBtYXNrcy5wdXNoKG1ha2VTYW1SZWdpb24ocG9seSwgZnJhbWUsIHJlY3RzW2ldLmNvbG9yIHx8IGhvc3QuZ2V0U2hhcGVDb2xvcigpKSk7XG4gICAgICAgICAgY29uc3VtZWQucHVzaChyZWN0c1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21taXQgYWdhaW5zdCB0aGUgcmVnaW9ucyBhcyB0aGV5IGFyZSBOT1c6IHRoZSB1c2VyIG1heSBoYXZlIGRyYXduLFxuICAgICAgICAvLyBlZGl0ZWQgb3IgZGVsZXRlZCByZWdpb25zIGR1cmluZyB0aGUgKHBvc3NpYmx5IG1pbnV0ZXMtbG9uZykgcnVuLlxuICAgICAgICAvLyBQcm9tcHRzIHRoYXQgcHJvZHVjZWQgYSBtYXNrIGFyZSByZXBsYWNlZDsgdGhlIHJlc3Qgc3RheSBmb3IgYSByZXRyeS5cbiAgICAgICAgaG9zdC5zZXRSZWdpb25zKHdpdGhvdXRSZWdpb25zKGhvc3QuZ2V0UmVnaW9ucygpLCBjb25zdW1lZCkuY29uY2F0KG1hc2tzKSk7XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KG1hc2tzLmxlbmd0aCA+IDAgPyBgQWRkZWQgJHttYXNrcy5sZW5ndGh9IHJlZ2lvbihzKS5gIDogJ05vIG1hc2tzIGZvdW5kLicpO1xuICAgICAgICByZXR1cm4gbWFza3MubGVuZ3RoO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnU2VnbWVudGF0aW9uIGZhaWxlZC4nKTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFkZGVkID8/IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFrZVNhbVJlZ2lvbihwb2x5OiBQb2x5Z29uLCBmcmFtZTogTWF0cml4RnJhbWUsIGNvbG9yOiBzdHJpbmcpOiBSZWdpb24ge1xuICBjb25zdCByaW5nID0gZnJhbWUucmluZ1RvRGF0YShwb2x5Lnhwb2ludHMsIHBvbHkueXBvaW50cyk7XG4gIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgcmVnaW9uLmJvdW5kcyA9IG1ha2VQb2x5Z29uKHJpbmcueHMsIHJpbmcueXMsIHsgaG9sZXM6IGZyYW1lLmhvbGVzVG9EYXRhKHBvbHkuaG9sZXMpIH0pO1xuICAvLyBUaGUgc291cmNlIHByb21wdCByZWN0YW5nbGUncyBjb2xvciwgZWxzZSB0aGUgaG9zdCBkZWZhdWx0LlxuICByZWdpb24uY29sb3IgPSBjb2xvcjtcbiAgLy8gRGVmYXVsdCBjbGFzcy9hbm5vdGF0aW9uIG5hbWUsIG1hdGNoaW5nIHRoZSB3YW5kL2JydXNoICsgb3ZlcmxheS1kcmF3biByZWdpb25zLlxuICByZWdpb24ubGFiZWwgPSAnc2FtJztcbiAgcmV0dXJuIHJlZ2lvbjtcbn1cbiJdfQ==
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `regions` minus `remove`, matched by id (identity for a region without one).
3
+ * Async tools use it to drop their consumed prompts from the *current* region
4
+ * list at commit time, instead of overwriting the list they read before a long
5
+ * download or inference (RT-6).
6
+ */
7
+ export function withoutRegions(regions, remove) {
8
+ const ids = new Set(remove.map((r) => r.id).filter((id) => id != null));
9
+ const objs = new Set(remove);
10
+ return regions.filter((r) => !objs.has(r) && !(r.id != null && ids.has(r.id)));
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudGF0aW9uLWNvbW1pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2VnbWVudGF0aW9uLWNvbW1pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsT0FBaUIsRUFBRSxNQUFnQjtJQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvcmVnaW9uJztcblxuLyoqXG4gKiBgcmVnaW9uc2AgbWludXMgYHJlbW92ZWAsIG1hdGNoZWQgYnkgaWQgKGlkZW50aXR5IGZvciBhIHJlZ2lvbiB3aXRob3V0IG9uZSkuXG4gKiBBc3luYyB0b29scyB1c2UgaXQgdG8gZHJvcCB0aGVpciBjb25zdW1lZCBwcm9tcHRzIGZyb20gdGhlICpjdXJyZW50KiByZWdpb25cbiAqIGxpc3QgYXQgY29tbWl0IHRpbWUsIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgdGhlIGxpc3QgdGhleSByZWFkIGJlZm9yZSBhIGxvbmdcbiAqIGRvd25sb2FkIG9yIGluZmVyZW5jZSAoUlQtNikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSwgcmVtb3ZlOiBSZWdpb25bXSk6IFJlZ2lvbltdIHtcbiAgY29uc3QgaWRzID0gbmV3IFNldChyZW1vdmUubWFwKChyKSA9PiByLmlkKS5maWx0ZXIoKGlkKSA9PiBpZCAhPSBudWxsKSk7XG4gIGNvbnN0IG9ianMgPSBuZXcgU2V0KHJlbW92ZSk7XG4gIHJldHVybiByZWdpb25zLmZpbHRlcigocikgPT4gIW9ianMuaGFzKHIpICYmICEoci5pZCAhPSBudWxsICYmIGlkcy5oYXMoci5pZCkpKTtcbn1cbiJdfQ==