@jax-data-science/sci-image-visualizer 0.1.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 (311) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +404 -0
  3. package/esm2022/index.mjs +52 -0
  4. package/esm2022/jax-data-science-sci-image-visualizer.mjs +5 -0
  5. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +398 -0
  6. package/esm2022/lib/contracts/capabilities.contract.mjs +32 -0
  7. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +12 -0
  8. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +14 -0
  9. package/esm2022/lib/contracts/colormap-lut.mjs +95 -0
  10. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +2 -0
  11. package/esm2022/lib/contracts/display-types.mjs +8 -0
  12. package/esm2022/lib/contracts/image.contract.mjs +11 -0
  13. package/esm2022/lib/contracts/intensity.mjs +28 -0
  14. package/esm2022/lib/contracts/plot-type.mjs +112 -0
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +3 -0
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +3 -0
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +3 -0
  18. package/esm2022/lib/contracts/ports/tile-access.port.mjs +3 -0
  19. package/esm2022/lib/contracts/region-editor-api.contract.mjs +4 -0
  20. package/esm2022/lib/contracts/region-overlay.contract.mjs +2 -0
  21. package/esm2022/lib/contracts/region-store.contract.mjs +2 -0
  22. package/esm2022/lib/contracts/sam.contract.mjs +12 -0
  23. package/esm2022/lib/contracts/toolbar-config.mjs +8 -0
  24. package/esm2022/lib/contracts/visualizer.contract.mjs +10 -0
  25. package/esm2022/lib/contracts/viz-config.mjs +3 -0
  26. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +260 -0
  27. package/esm2022/lib/implementations/base-store-visualizer.mjs +76 -0
  28. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +106 -0
  29. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +847 -0
  30. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +92 -0
  31. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2283 -0
  32. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +126 -0
  33. package/esm2022/lib/implementations/osd/display-pipeline.mjs +143 -0
  34. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +217 -0
  35. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +1780 -0
  36. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +25 -0
  37. package/esm2022/lib/implementations/osd/osd-coords.mjs +53 -0
  38. package/esm2022/lib/implementations/osd/osd-lib.mjs +20 -0
  39. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +1237 -0
  40. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +88 -0
  41. package/esm2022/lib/implementations/osd/slice-cache.mjs +488 -0
  42. package/esm2022/lib/implementations/osd/tile-client.mjs +29 -0
  43. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +37 -0
  44. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +31 -0
  45. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +183 -0
  46. package/esm2022/lib/implementations/plotly/plotly.service.mjs +2137 -0
  47. package/esm2022/lib/implementations/simple-slice-access.service.mjs +99 -0
  48. package/esm2022/lib/models/bezier.mjs +120 -0
  49. package/esm2022/lib/models/class-preset.mjs +46 -0
  50. package/esm2022/lib/models/geometry.mjs +198 -0
  51. package/esm2022/lib/models/region.mjs +166 -0
  52. package/esm2022/lib/models/shape.mjs +53 -0
  53. package/esm2022/lib/plot.utilities.mjs +693 -0
  54. package/esm2022/lib/processing/image-converter.service.mjs +90 -0
  55. package/esm2022/lib/processing/image-crop.mjs +62 -0
  56. package/esm2022/lib/processing/processing-image.mjs +50 -0
  57. package/esm2022/lib/provide-visualization.mjs +63 -0
  58. package/esm2022/lib/region-editor/mask-raster.mjs +95 -0
  59. package/esm2022/lib/region-editor/mask-worker.mjs +10 -0
  60. package/esm2022/lib/region-editor/region-editor.component.mjs +1190 -0
  61. package/esm2022/lib/region-ops.service.mjs +301 -0
  62. package/esm2022/lib/render-orchestrator.mjs +87 -0
  63. package/esm2022/lib/routing-visualizer.service.mjs +533 -0
  64. package/esm2022/lib/store/class-color.util.mjs +52 -0
  65. package/esm2022/lib/store/region-store.service.mjs +1029 -0
  66. package/esm2022/lib/store/visualizer-store.service.mjs +352 -0
  67. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +546 -0
  68. package/esm2022/lib/toolbar/crop/slide-crop.mjs +57 -0
  69. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +115 -0
  70. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +84 -0
  71. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +133 -0
  72. package/esm2022/lib/toolbar/segmentation/ort-runtime-config.mjs +31 -0
  73. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +108 -0
  74. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +159 -0
  75. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +255 -0
  76. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +94 -0
  77. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +188 -0
  78. package/esm2022/lib/toolbar/toolbar.component.mjs +311 -0
  79. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +234 -0
  80. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +499 -0
  81. package/esm2022/lib/toolbar/wand/wand.service.mjs +921 -0
  82. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +157 -0
  83. package/esm2022/lib/visualization.module.mjs +162 -0
  84. package/esm2022/lib/visualizer.component.mjs +1597 -0
  85. package/fesm2022/jax-data-science-sci-image-visualizer-mask-worker-uhepXUhM.mjs +12 -0
  86. package/fesm2022/jax-data-science-sci-image-visualizer-mask-worker-uhepXUhM.mjs.map +1 -0
  87. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs +327 -0
  88. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs.map +1 -0
  89. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +21314 -0
  90. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -0
  91. package/fesm2022/mask.worker.js +989 -0
  92. package/fesm2022/onnx-sam.worker.js +202 -0
  93. package/index.d.ts +39 -0
  94. package/lib/channel-histogram/channel-histogram.component.d.ts +112 -0
  95. package/lib/contracts/capabilities.contract.d.ts +30 -0
  96. package/lib/contracts/cell-segmenter.contract.d.ts +40 -0
  97. package/lib/contracts/channel-histogram-api.contract.d.ts +98 -0
  98. package/lib/contracts/colormap-lut.d.ts +21 -0
  99. package/lib/contracts/coordinate-transform.contract.d.ts +43 -0
  100. package/lib/contracts/display-types.d.ts +41 -0
  101. package/lib/contracts/image.contract.d.ts +72 -0
  102. package/lib/contracts/intensity.d.ts +18 -0
  103. package/lib/contracts/plot-type.d.ts +108 -0
  104. package/lib/contracts/ports/image-state.port.d.ts +29 -0
  105. package/lib/contracts/ports/preferences.port.d.ts +19 -0
  106. package/lib/contracts/ports/region-io.port.d.ts +29 -0
  107. package/lib/contracts/ports/tile-access.port.d.ts +27 -0
  108. package/lib/contracts/region-editor-api.contract.d.ts +83 -0
  109. package/lib/contracts/region-overlay.contract.d.ts +47 -0
  110. package/lib/contracts/region-store.contract.d.ts +74 -0
  111. package/lib/contracts/sam.contract.d.ts +98 -0
  112. package/lib/contracts/toolbar-config.d.ts +24 -0
  113. package/lib/contracts/visualizer.contract.d.ts +346 -0
  114. package/lib/contracts/viz-config.d.ts +25 -0
  115. package/lib/hex-color-picker/hex-color-picker.component.d.ts +47 -0
  116. package/lib/implementations/base-store-visualizer.d.ts +71 -0
  117. package/lib/implementations/napari-js/napari-axes-labels.d.ts +47 -0
  118. package/lib/implementations/napari-js/napari-region-overlay.d.ts +115 -0
  119. package/lib/implementations/napari-js/napari-scale-bar.d.ts +31 -0
  120. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +455 -0
  121. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +46 -0
  122. package/lib/implementations/osd/display-pipeline.d.ts +47 -0
  123. package/lib/implementations/osd/histogram-sampler.d.ts +85 -0
  124. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +476 -0
  125. package/lib/implementations/osd/osd-coordinate-transform.d.ts +17 -0
  126. package/lib/implementations/osd/osd-coords.d.ts +16 -0
  127. package/lib/implementations/osd/osd-lib.d.ts +19 -0
  128. package/lib/implementations/osd/osd-region-overlay.d.ts +191 -0
  129. package/lib/implementations/osd/osd-scale-bar.d.ts +17 -0
  130. package/lib/implementations/osd/slice-cache.d.ts +161 -0
  131. package/lib/implementations/osd/tile-client.d.ts +32 -0
  132. package/lib/implementations/plotly/plotly-coordinate-transform.d.ts +19 -0
  133. package/lib/implementations/plotly/plotly-region-overlay.d.ts +23 -0
  134. package/lib/implementations/plotly/plotly-trace-builders.d.ts +60 -0
  135. package/lib/implementations/plotly/plotly.service.d.ts +594 -0
  136. package/lib/implementations/simple-slice-access.service.d.ts +64 -0
  137. package/lib/models/bezier.d.ts +59 -0
  138. package/lib/models/class-preset.d.ts +39 -0
  139. package/lib/models/geometry.d.ts +66 -0
  140. package/lib/models/region.d.ts +132 -0
  141. package/lib/models/shape.d.ts +44 -0
  142. package/lib/plot.utilities.d.ts +107 -0
  143. package/lib/processing/image-converter.service.d.ts +28 -0
  144. package/lib/processing/image-crop.d.ts +18 -0
  145. package/lib/processing/processing-image.d.ts +17 -0
  146. package/lib/provide-visualization.d.ts +34 -0
  147. package/lib/region-editor/mask-raster.d.ts +61 -0
  148. package/lib/region-editor/mask-worker.d.ts +7 -0
  149. package/lib/region-editor/region-editor.component.d.ts +305 -0
  150. package/lib/region-ops.service.d.ts +92 -0
  151. package/lib/render-orchestrator.d.ts +59 -0
  152. package/lib/routing-visualizer.service.d.ts +227 -0
  153. package/lib/store/class-color.util.d.ts +26 -0
  154. package/lib/store/region-store.service.d.ts +315 -0
  155. package/lib/store/visualizer-store.service.d.ts +123 -0
  156. package/lib/toolbar/brush/brush-tool.service.d.ts +143 -0
  157. package/lib/toolbar/crop/slide-crop.d.ts +30 -0
  158. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +32 -0
  159. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +39 -0
  160. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +25 -0
  161. package/lib/toolbar/segmentation/ort-runtime-config.d.ts +4 -0
  162. package/lib/toolbar/segmentation/sam-model-registry.d.ts +36 -0
  163. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +48 -0
  164. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +59 -0
  165. package/lib/toolbar/segmentation/sam-prompt.d.ts +34 -0
  166. package/lib/toolbar/segmentation/sam-tool.service.d.ts +50 -0
  167. package/lib/toolbar/toolbar.component.d.ts +167 -0
  168. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +64 -0
  169. package/lib/toolbar/wand/wand-tool.service.d.ts +149 -0
  170. package/lib/toolbar/wand/wand.service.d.ts +133 -0
  171. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +49 -0
  172. package/lib/visualization.module.d.ts +45 -0
  173. package/lib/visualizer.component.d.ts +378 -0
  174. package/package.json +73 -0
  175. package/src/lib/assets/3d-coordinates.svg +49 -0
  176. package/src/lib/assets/cells.svg +1 -0
  177. package/src/lib/assets/click.svg +1 -0
  178. package/src/lib/assets/colormap-luts.json +1 -0
  179. package/src/lib/assets/contour.svg +48 -0
  180. package/src/lib/assets/cube-3d.svg +1 -0
  181. package/src/lib/assets/edit-selection-white.svg +47 -0
  182. package/src/lib/assets/heatmap.svg +1 -0
  183. package/src/lib/assets/icons/colormap-Pastel1.png +0 -0
  184. package/src/lib/assets/icons/colormap-accent.png +0 -0
  185. package/src/lib/assets/icons/colormap-afmhot.png +0 -0
  186. package/src/lib/assets/icons/colormap-autumn.png +0 -0
  187. package/src/lib/assets/icons/colormap-berlin.png +0 -0
  188. package/src/lib/assets/icons/colormap-binary.png +0 -0
  189. package/src/lib/assets/icons/colormap-blackbody.png +0 -0
  190. package/src/lib/assets/icons/colormap-bluered.png +0 -0
  191. package/src/lib/assets/icons/colormap-blues.png +0 -0
  192. package/src/lib/assets/icons/colormap-bone.png +0 -0
  193. package/src/lib/assets/icons/colormap-brbg.png +0 -0
  194. package/src/lib/assets/icons/colormap-brg.png +0 -0
  195. package/src/lib/assets/icons/colormap-bugn.png +0 -0
  196. package/src/lib/assets/icons/colormap-bupu.png +0 -0
  197. package/src/lib/assets/icons/colormap-bwr.png +0 -0
  198. package/src/lib/assets/icons/colormap-cividis.png +0 -0
  199. package/src/lib/assets/icons/colormap-cmrmap.png +0 -0
  200. package/src/lib/assets/icons/colormap-cool.png +0 -0
  201. package/src/lib/assets/icons/colormap-coolwarm.png +0 -0
  202. package/src/lib/assets/icons/colormap-copper.png +0 -0
  203. package/src/lib/assets/icons/colormap-cubehelix.png +0 -0
  204. package/src/lib/assets/icons/colormap-dark2.png +0 -0
  205. package/src/lib/assets/icons/colormap-earth.png +0 -0
  206. package/src/lib/assets/icons/colormap-electric.png +0 -0
  207. package/src/lib/assets/icons/colormap-flag.png +0 -0
  208. package/src/lib/assets/icons/colormap-gist_earth.png +0 -0
  209. package/src/lib/assets/icons/colormap-gist_gray.png +0 -0
  210. package/src/lib/assets/icons/colormap-gist_heat.png +0 -0
  211. package/src/lib/assets/icons/colormap-gist_ncar.png +0 -0
  212. package/src/lib/assets/icons/colormap-gist_rainbow.png +0 -0
  213. package/src/lib/assets/icons/colormap-gist_stern.png +0 -0
  214. package/src/lib/assets/icons/colormap-gist_yarg.png +0 -0
  215. package/src/lib/assets/icons/colormap-gnbu.png +0 -0
  216. package/src/lib/assets/icons/colormap-gnuplot.png +0 -0
  217. package/src/lib/assets/icons/colormap-gnuplot2.png +0 -0
  218. package/src/lib/assets/icons/colormap-gray.png +0 -0
  219. package/src/lib/assets/icons/colormap-greens-inv.png +0 -0
  220. package/src/lib/assets/icons/colormap-greens.png +0 -0
  221. package/src/lib/assets/icons/colormap-greys-inv.png +0 -0
  222. package/src/lib/assets/icons/colormap-greys.png +0 -0
  223. package/src/lib/assets/icons/colormap-hot.png +0 -0
  224. package/src/lib/assets/icons/colormap-hsv.png +0 -0
  225. package/src/lib/assets/icons/colormap-inferno.png +0 -0
  226. package/src/lib/assets/icons/colormap-jet.png +0 -0
  227. package/src/lib/assets/icons/colormap-magma.png +0 -0
  228. package/src/lib/assets/icons/colormap-managua.png +0 -0
  229. package/src/lib/assets/icons/colormap-nipy_spectral.png +0 -0
  230. package/src/lib/assets/icons/colormap-ocean.png +0 -0
  231. package/src/lib/assets/icons/colormap-oranges.png +0 -0
  232. package/src/lib/assets/icons/colormap-orrd.png +0 -0
  233. package/src/lib/assets/icons/colormap-pastel2.png +0 -0
  234. package/src/lib/assets/icons/colormap-picnic.png +0 -0
  235. package/src/lib/assets/icons/colormap-pink.png +0 -0
  236. package/src/lib/assets/icons/colormap-piyg.png +0 -0
  237. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  238. package/src/lib/assets/icons/colormap-plasma.png +0 -0
  239. package/src/lib/assets/icons/colormap-portland.png +0 -0
  240. package/src/lib/assets/icons/colormap-prgn.png +0 -0
  241. package/src/lib/assets/icons/colormap-prism.png +0 -0
  242. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  243. package/src/lib/assets/icons/colormap-pubugn.png +0 -0
  244. package/src/lib/assets/icons/colormap-puor.png +0 -0
  245. package/src/lib/assets/icons/colormap-purd.png +0 -0
  246. package/src/lib/assets/icons/colormap-purples.png +0 -0
  247. package/src/lib/assets/icons/colormap-rainbow.png +0 -0
  248. package/src/lib/assets/icons/colormap-rdbu.png +0 -0
  249. package/src/lib/assets/icons/colormap-rdgy.png +0 -0
  250. package/src/lib/assets/icons/colormap-rdpu.png +0 -0
  251. package/src/lib/assets/icons/colormap-rdylbu.png +0 -0
  252. package/src/lib/assets/icons/colormap-rdylgn.png +0 -0
  253. package/src/lib/assets/icons/colormap-reds.png +0 -0
  254. package/src/lib/assets/icons/colormap-seismic.png +0 -0
  255. package/src/lib/assets/icons/colormap-set1.png +0 -0
  256. package/src/lib/assets/icons/colormap-set2.png +0 -0
  257. package/src/lib/assets/icons/colormap-set3.png +0 -0
  258. package/src/lib/assets/icons/colormap-spectral.png +0 -0
  259. package/src/lib/assets/icons/colormap-spring.png +0 -0
  260. package/src/lib/assets/icons/colormap-summer.png +0 -0
  261. package/src/lib/assets/icons/colormap-tab10.png +0 -0
  262. package/src/lib/assets/icons/colormap-tab20.png +0 -0
  263. package/src/lib/assets/icons/colormap-tab20b.png +0 -0
  264. package/src/lib/assets/icons/colormap-tab20c.png +0 -0
  265. package/src/lib/assets/icons/colormap-terrain.png +0 -0
  266. package/src/lib/assets/icons/colormap-turbo.png +0 -0
  267. package/src/lib/assets/icons/colormap-twilight.png +0 -0
  268. package/src/lib/assets/icons/colormap-twilight_shifted.png +0 -0
  269. package/src/lib/assets/icons/colormap-vanimo.png +0 -0
  270. package/src/lib/assets/icons/colormap-viridis.png +0 -0
  271. package/src/lib/assets/icons/colormap-winter.png +0 -0
  272. package/src/lib/assets/icons/colormap-wistia.png +0 -0
  273. package/src/lib/assets/icons/colormap-ylgn.png +0 -0
  274. package/src/lib/assets/icons/colormap-ylgnbu-inv.png +0 -0
  275. package/src/lib/assets/icons/colormap-ylgnbu.png +0 -0
  276. package/src/lib/assets/icons/colormap-ylorbr.png +0 -0
  277. package/src/lib/assets/icons/colormap-ylorrd-inv.png +0 -0
  278. package/src/lib/assets/icons/colormap-ylorrd.png +0 -0
  279. package/src/lib/assets/interactive-segmentation-cursor.svg +1 -0
  280. package/src/lib/assets/invert.svg +1 -0
  281. package/src/lib/assets/isosurface.svg +7 -0
  282. package/src/lib/assets/mask.svg +1 -0
  283. package/src/lib/assets/paintbrush.svg +1 -0
  284. package/src/lib/assets/picture-segmentation.svg +43 -0
  285. package/src/lib/assets/polygon-vertices.svg +13 -0
  286. package/src/lib/assets/polyline.svg +3 -0
  287. package/src/lib/assets/redo.svg +39 -0
  288. package/src/lib/assets/region-editor.svg +37 -0
  289. package/src/lib/assets/region-move.svg +7 -0
  290. package/src/lib/assets/smooth.svg +56 -0
  291. package/src/lib/assets/spline-chart.svg +7 -0
  292. package/src/lib/assets/surface.svg +37 -0
  293. package/src/lib/assets/test/download-379.svg +1 -0
  294. package/src/lib/assets/test/download-98.svg +1 -0
  295. package/src/lib/assets/test/json-1.svg +1 -0
  296. package/src/lib/assets/test/load-53.svg +1 -0
  297. package/src/lib/assets/test/mask-44.svg +1 -0
  298. package/src/lib/assets/test/mask-download-44.svg +15 -0
  299. package/src/lib/assets/test/mask-save-44.svg +11 -0
  300. package/src/lib/assets/test/overlay-1.svg +1 -0
  301. package/src/lib/assets/test/overlay-4.svg +1 -0
  302. package/src/lib/assets/test/region-26.svg +1 -0
  303. package/src/lib/assets/test/save-56.svg +1 -0
  304. package/src/lib/assets/test/upload-43.svg +1 -0
  305. package/src/lib/assets/to-bezier.svg +15 -0
  306. package/src/lib/assets/to-polygon.svg +11 -0
  307. package/src/lib/assets/undo.svg +38 -0
  308. package/src/lib/assets/vertex-add.svg +12 -0
  309. package/src/lib/assets/vertex-delete.svg +12 -0
  310. package/src/lib/assets/wand.svg +54 -0
  311. package/src/lib/assets/zoom-box.svg +10 -0
@@ -0,0 +1,166 @@
1
+ import { ShapeSelection } from './shape';
2
+ export class Region {
3
+ constructor() {
4
+ this.bounds = null;
5
+ /** Zero-based z-slice this region belongs to within a stack — mirrors
6
+ * QuPath's `geometry.plane.z` (a missing plane / default plane reads back as
7
+ * 0). Used to place/filter ROIs per slice; 0 for a plain single-plane image
8
+ * or a region drawn without a slice context (jit-ui#93). */
9
+ this.z = 0;
10
+ this.shapeColor = '#00FFFF';
11
+ this.bytesPerPixel = 8;
12
+ /**
13
+ * resolution is the resolution at which the region
14
+ * was found. In order to get it in the full image
15
+ * coordinates it will normally be 0. However if
16
+ * there is a mistake with the resolution it may not
17
+ * be. We return the resolution here in order to be
18
+ * sure what it is. The server may need to be changed
19
+ * to ensure that results regions are always returned
20
+ * at resolution = 0
21
+ */
22
+ this.resolution = 0;
23
+ this.cropped = false;
24
+ this.tileNumber = 0;
25
+ this.tileCoordinates = null;
26
+ }
27
+ /** True for intensity-profile line ROIs (the intensity tool's lines). These are
28
+ * NOT annotation regions: they never appear in the Region Editor and editor
29
+ * operations (select/save/delete) must never touch them. */
30
+ isProfile() {
31
+ return this.kind === 'profile';
32
+ }
33
+ toString() {
34
+ // if shape is rectangle
35
+ if (this.bounds instanceof Rectangle) {
36
+ return `x: ${this.bounds.x}, y: ${this.bounds.y},
37
+ width: ${this.bounds.width}, height: ${this.bounds.height}`;
38
+ }
39
+ else if (this.bounds instanceof Polygon) {
40
+ let path = 'M';
41
+ // display as path
42
+ for (let i = 0; i < this.bounds.npoints; i++) {
43
+ if (i < this.bounds.npoints - 1) {
44
+ path = `${path}${this.bounds.xpoints[i]},${this.bounds.ypoints[i]}L`;
45
+ }
46
+ else {
47
+ path = `${path}${this.bounds.xpoints[i]},${this.bounds.ypoints[i]}`;
48
+ }
49
+ }
50
+ if (this.bounds.closed !== false) {
51
+ path += 'Z';
52
+ }
53
+ return path;
54
+ }
55
+ return '';
56
+ }
57
+ /**
58
+ * Returns a ShapeSelection object that can be used to
59
+ * create a shape in Plotly.
60
+ * @param showRegionLabel
61
+ * @return ShapeSelection
62
+ */
63
+ getShape(showRegionLabel = true) {
64
+ const shape = new ShapeSelection();
65
+ shape.id = this.id;
66
+ shape.name = this.name;
67
+ shape.editable = true;
68
+ shape.line = {
69
+ color: this.color ? this.color : this.shapeColor,
70
+ width: 3
71
+ };
72
+ shape.fileName = this.filename;
73
+ if (this.kind === 'profile')
74
+ shape.kind = 'profile';
75
+ if (showRegionLabel) {
76
+ shape.label = {
77
+ text: `${this.label}`,
78
+ texttemplate: `${this.label}`,
79
+ font: { color: this.color ? this.color : this.shapeColor },
80
+ textposition: 'top left'
81
+ };
82
+ }
83
+ else {
84
+ shape.label = {};
85
+ }
86
+ shape.legend = this.label;
87
+ const bnds = this.bounds;
88
+ if (bnds != undefined) {
89
+ if (this.isRectangle(bnds)) {
90
+ shape.type = 'rect';
91
+ shape.x0 = bnds.x;
92
+ shape.y0 = bnds.y;
93
+ shape.x1 = bnds.x + bnds.width;
94
+ shape.y1 = bnds.y + bnds.height;
95
+ }
96
+ if (this.isPolygon(bnds)) {
97
+ shape.type = 'path';
98
+ let path = 'M';
99
+ for (let i = 0; i < bnds.npoints; i++) {
100
+ if (i < bnds.npoints - 1) {
101
+ path = `${path}${bnds.xpoints[i]},${bnds.ypoints[i]}L`;
102
+ }
103
+ else {
104
+ path = `${path}${bnds.xpoints[i]},${bnds.ypoints[i]}`;
105
+ }
106
+ }
107
+ if (bnds.closed !== false) {
108
+ path += 'Z';
109
+ }
110
+ shape.path = path;
111
+ }
112
+ }
113
+ return shape;
114
+ }
115
+ isRectangle(bnds) {
116
+ return 'x' in bnds && 'y' in bnds && 'width' in bnds && 'height' in bnds;
117
+ }
118
+ isPolygon(bnds) {
119
+ return 'npoints' in bnds && 'xpoints' in bnds && 'ypoints' in bnds;
120
+ }
121
+ }
122
+ export class Rectangle {
123
+ constructor() {
124
+ this.x = 0;
125
+ this.y = 0;
126
+ this.width = 0;
127
+ this.height = 0;
128
+ }
129
+ }
130
+ export class Polygon {
131
+ constructor() {
132
+ this.npoints = 0;
133
+ this.xpoints = [];
134
+ this.ypoints = [];
135
+ this.coordinates = [];
136
+ /** false for open polylines; true (default) for closed polygons */
137
+ this.closed = true;
138
+ /**
139
+ * When true the vertices are treated as bezier-spline **anchors** and the
140
+ * region is rendered/exported as a smooth curve through them. The vertices
141
+ * stay the editable anchors — toggling this flag is the toBezier
142
+ * (`true`) / toPolygon (`false`), which only add/remove the curve, never move
143
+ * the anchors. GeoJSON keeps the flattened curve as the geometry (so QuPath
144
+ * renders it) plus the anchors + handles + flag in properties (so JIT
145
+ * round-trips the editable bezier).
146
+ */
147
+ this.bezier = false;
148
+ }
149
+ }
150
+ /**
151
+ * A region whose geometry is several disjoint parts — e.g. the result of merging
152
+ * two non-touching regions, or the inverse of a blob (jit-ui#85). Each part is a
153
+ * closed {@link Polygon} that may carry its own holes, so a MultiPolygon
154
+ * represents "sparse bits, some with donut holes" as a single region. Maps 1:1
155
+ * onto a GeoJSON `MultiPolygon` (and QuPath's geometry).
156
+ *
157
+ * A single-part MultiPolygon is equivalent to that Polygon; callers should
158
+ * prefer a plain {@link Polygon} for one connected part.
159
+ */
160
+ export class MultiPolygon {
161
+ constructor() {
162
+ /** One or more disjoint closed polygons (each may have holes). */
163
+ this.polygons = [];
164
+ }
165
+ }
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvcmVnaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFekMsTUFBTSxPQUFPLE1BQU07SUFBbkI7UUFRRSxXQUFNLEdBQStDLElBQUksQ0FBQztRQWUxRDs7O3FFQUc2RDtRQUM3RCxNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sZUFBVSxHQUFJLFNBQVMsQ0FBQztRQUN4QixrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUNsQjs7Ozs7Ozs7O1dBU0c7UUFDSCxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2Ysb0JBQWUsR0FBb0IsSUFBSSxDQUFDO0lBZ0cxQyxDQUFDO0lBOUZDOztpRUFFNkQ7SUFDN0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUM7SUFDakMsQ0FBQztJQUVELFFBQVE7UUFDTix3QkFBd0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxZQUFZLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7dUJBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEUsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sWUFBWSxPQUFPLEVBQUMsQ0FBQztZQUN6QyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7WUFDZixrQkFBa0I7WUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxF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QUFJLElBQUksQ0FBQztJQUNyRSxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sU0FBUztJQUF0QjtRQUNFLE1BQUMsR0FBRyxDQUFDLENBQUM7UUFDTixNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNWLFdBQU0sR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0NBQUE7QUFFRCxNQUFNLE9BQU8sT0FBTztJQUFwQjtRQUNFLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFDWixZQUFPLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFDdkIsZ0JBQVcsR0FBZSxFQUFFLENBQUM7UUFDN0IsbUVBQW1FO1FBQ25FLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFDZDs7Ozs7Ozs7V0FRRztRQUNILFdBQU0sR0FBRyxLQUFLLENBQUM7SUE4QmpCLENBQUM7Q0FBQTtBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBQXpCO1FBQ0Usa0VBQWtFO1FBQ2xFLGFBQVEsR0FBYyxFQUFFLENBQUM7SUFDM0IsQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2hhcGVTZWxlY3Rpb24gfSBmcm9tICcuL3NoYXBlJztcblxuZXhwb3J0IGNsYXNzIFJlZ2lvbiB7XG5cbiAgLyoqIFN0YWJsZSwgdW5pcXVlIGlkZW50aXR5IGZvciBzZWxlY3Rpb24gYW5kIGVxdWFsaXR5LiBNaW50ZWQgYnlcbiAgICogIFBsb3RseVNlcnZpY2Ugd2hlbiBhIHJlZ2lvbiBmaXJzdCBlbnRlcnMgdGhlIHN5c3RlbS4gTmV2ZXIgZGVyaXZlZFxuICAgKiAgZnJvbSBhcnJheSBpbmRleCDigJQgbmFtZSBjb2xsaXNpb25zIGFjcm9zcyBkZWxldGUvYWRkIGN5Y2xlcyBtdXN0XG4gICAqICBub3QgYnJlYWsgUHJpbWVORyByb3cgc2VsZWN0aW9uLiAqL1xuICBpZCE6IG51bWJlcjtcbiAgbmFtZSE6IHN0cmluZztcbiAgYm91bmRzPzogUmVjdGFuZ2xlIHwgUG9seWdvbiB8IE11bHRpUG9seWdvbiB8IG51bGwgPSBudWxsO1xuICAvKiogcHJvZmlsZSA9IGFuIGludGVuc2l0eS1wcm9maWxlIGxpbmUgUk9JOyByZW5kZXJlZC9kcmFnZ2VkIGxpa2UgYSByZWdpb24gYnV0XG4gICAqICBleGNsdWRlZCBmcm9tIHRoZSBSZWdpb25zIHRhYiBhbmQgZXhwb3J0cy4gVXNlIGBpc1Byb2ZpbGUoKWAgdG8gdGVzdCBpdCDigJRcbiAgICogIGl0J3MgdGhlIGNhbm9uaWNhbCBtYXJrZXIgdGhhdCBzZXBhcmF0ZXMgaW50ZW5zaXR5IGxpbmVzIChvd25lZCBieSB0aGVcbiAgICogIGludGVuc2l0eSB0b29sLCBzYW1wbGVkIGludG8gdGhlIGluc2V0KSBmcm9tIGFubm90YXRpb24gcmVnaW9ucyAob3duZWQgYnlcbiAgICogIHRoZSBSZWdpb24gRWRpdG9yKS4gQm90aCBiYWNrZW5kcyAoUGxvdGx5LCBPU0QpIGhvbm91ciBpdC4gKi9cbiAga2luZD86ICdwcm9maWxlJztcbiAgY29sb3I/OiBzdHJpbmc7IC8vIGhleCBzdHJpbmcsIGUuZy4gJyNSUkdHQkInICh0aGUgaGlzdG9yaWNhbCBcIltyLCBnLCBiXVwiIG5vdGUgaXMgc3RhbGUpXG4gIC8vIGNsYXNzIGxhYmVsXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB1c2VyIHNldCB0aGlzIHJlZ2lvbidzIGNvbG91ciBleHBsaWNpdGx5IChSZWdpb24gRWRpdG9yIENvbG9yXG4gICAqICBjb2x1bW4pLiBQcmVzZXQgY29sb3VyIHJlc29sdXRpb24gKGppdC11aSM3MCkgc2tpcHMgb3ZlcnJpZGRlbiByZWdpb25zIHNvIGFcbiAgICogIG1hbnVhbCBjb2xvdXIgaXMgbm90IGNsb2JiZXJlZCB3aGVuIHByZXNldHMgYXJlIChyZSlhcHBsaWVkIG9uIGxvYWQvaW1wb3J0LiAqL1xuICBjb2xvck92ZXJyaWRkZW4/OiBib29sZWFuO1xuICBmaWxlbmFtZT86IHN0cmluZztcbiAgLyoqIFplcm8tYmFzZWQgei1zbGljZSB0aGlzIHJlZ2lvbiBiZWxvbmdzIHRvIHdpdGhpbiBhIHN0YWNrIOKAlCBtaXJyb3JzXG4gICAqICBRdVBhdGgncyBgZ2VvbWV0cnkucGxhbmUuemAgKGEgbWlzc2luZyBwbGFuZSAvIGRlZmF1bHQgcGxhbmUgcmVhZHMgYmFjayBhc1xuICAgKiAgMCkuIFVzZWQgdG8gcGxhY2UvZmlsdGVyIFJPSXMgcGVyIHNsaWNlOyAwIGZvciBhIHBsYWluIHNpbmdsZS1wbGFuZSBpbWFnZVxuICAgKiAgb3IgYSByZWdpb24gZHJhd24gd2l0aG91dCBhIHNsaWNlIGNvbnRleHQgKGppdC11aSM5MykuICovXG4gIHogPSAwO1xuICBzaGFwZUNvbG9yPyA9ICcjMDBGRkZGJztcbiAgYnl0ZXNQZXJQaXhlbCA9IDg7XG4gIC8qKlxuICAgKiByZXNvbHV0aW9uIGlzIHRoZSByZXNvbHV0aW9uIGF0IHdoaWNoIHRoZSByZWdpb25cbiAgICogd2FzIGZvdW5kLiBJbiBvcmRlciB0byBnZXQgaXQgaW4gdGhlIGZ1bGwgaW1hZ2VcbiAgICogY29vcmRpbmF0ZXMgaXQgd2lsbCBub3JtYWxseSBiZSAwLiBIb3dldmVyIGlmXG4gICAqIHRoZXJlIGlzIGEgbWlzdGFrZSB3aXRoIHRoZSByZXNvbHV0aW9uIGl0IG1heSBub3RcbiAgICogYmUuIFdlIHJldHVybiB0aGUgcmVzb2x1dGlvbiBoZXJlIGluIG9yZGVyIHRvIGJlXG4gICAqIHN1cmUgd2hhdCBpdCBpcy4gVGhlIHNlcnZlciBtYXkgbmVlZCB0byBiZSBjaGFuZ2VkXG4gICAqIHRvIGVuc3VyZSB0aGF0IHJlc3VsdHMgcmVnaW9ucyBhcmUgYWx3YXlzIHJldHVybmVkXG4gICAqIGF0IHJlc29sdXRpb24gPSAwXG4gICAqL1xuICByZXNvbHV0aW9uID0gMDtcbiAgY3JvcHBlZCA9IGZhbHNlO1xuICB0aWxlTnVtYmVyID0gMDtcbiAgdGlsZUNvb3JkaW5hdGVzOiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUcnVlIGZvciBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIFJPSXMgKHRoZSBpbnRlbnNpdHkgdG9vbCdzIGxpbmVzKS4gVGhlc2UgYXJlXG4gICAqICBOT1QgYW5ub3RhdGlvbiByZWdpb25zOiB0aGV5IG5ldmVyIGFwcGVhciBpbiB0aGUgUmVnaW9uIEVkaXRvciBhbmQgZWRpdG9yXG4gICAqICBvcGVyYXRpb25zIChzZWxlY3Qvc2F2ZS9kZWxldGUpIG11c3QgbmV2ZXIgdG91Y2ggdGhlbS4gKi9cbiAgaXNQcm9maWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmtpbmQgPT09ICdwcm9maWxlJztcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIC8vIGlmIHNoYXBlIGlzIHJlY3RhbmdsZVxuICAgIGlmICh0aGlzLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSkge1xuICAgICAgcmV0dXJuIGB4OiAke3RoaXMuYm91bmRzLnh9LCB5OiAke3RoaXMuYm91bmRzLnl9LFxuICAgICAgICAgICAgICB3aWR0aDogJHt0aGlzLmJvdW5kcy53aWR0aH0sIGhlaWdodDogJHt0aGlzLmJvdW5kcy5oZWlnaHR9YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbil7XG4gICAgICBsZXQgcGF0aCA9ICdNJztcbiAgICAgIC8vIGRpc3BsYXkgYXMgcGF0aFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJvdW5kcy5ucG9pbnRzOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPCB0aGlzLmJvdW5kcy5ucG9pbnRzIC0gMSkge1xuICAgICAgICAgIHBhdGggPSBgJHtwYXRofSR7dGhpcy5ib3VuZHMueHBvaW50c1tpXX0sJHt0aGlzLmJvdW5kcy55cG9pbnRzW2ldfUxgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGggPSBgJHtwYXRofSR7dGhpcy5ib3VuZHMueHBvaW50c1tpXX0sJHt0aGlzLmJvdW5kcy55cG9pbnRzW2ldfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmJvdW5kcy5jbG9zZWQgIT09IGZhbHNlKSB7XG4gICAgICAgIHBhdGggKz0gJ1onO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgU2hhcGVTZWxlY3Rpb24gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG9cbiAgICogY3JlYXRlIGEgc2hhcGUgaW4gUGxvdGx5LlxuICAgKiBAcGFyYW0gc2hvd1JlZ2lvbkxhYmVsXG4gICAqIEByZXR1cm4gU2hhcGVTZWxlY3Rpb25cbiAgICovXG4gICBnZXRTaGFwZShzaG93UmVnaW9uTGFiZWw6IGJvb2xlYW4gPSB0cnVlKTogU2hhcGVTZWxlY3Rpb24ge1xuICAgIGNvbnN0IHNoYXBlID0gbmV3IFNoYXBlU2VsZWN0aW9uKCk7XG4gICAgc2hhcGUuaWQgPSB0aGlzLmlkO1xuICAgIHNoYXBlLm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgc2hhcGUuZWRpdGFibGUgPSB0cnVlO1xuICAgIHNoYXBlLmxpbmUgPSB7XG4gICAgICBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3IgOiB0aGlzLnNoYXBlQ29sb3IsXG4gICAgICB3aWR0aDogM1xuICAgIH07XG4gICAgc2hhcGUuZmlsZU5hbWUgPSB0aGlzLmZpbGVuYW1lO1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdwcm9maWxlJykgc2hhcGUua2luZCA9ICdwcm9maWxlJztcbiAgICBpZiAoc2hvd1JlZ2lvbkxhYmVsKSB7XG4gICAgICBzaGFwZS5sYWJlbCA9IHtcbiAgICAgICAgdGV4dDogYCR7dGhpcy5sYWJlbH1gLFxuICAgICAgICB0ZXh0dGVtcGxhdGU6IGAke3RoaXMubGFiZWx9YCxcbiAgICAgICAgZm9udDogeyBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3IgOiB0aGlzLnNoYXBlQ29sb3IgfSxcbiAgICAgICAgdGV4dHBvc2l0aW9uOiAndG9wIGxlZnQnXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGFwZS5sYWJlbCA9IHt9O1xuICAgIH1cbiAgICBzaGFwZS5sZWdlbmQgPSB0aGlzLmxhYmVsO1xuXG4gICAgY29uc3QgYm5kcyA9IHRoaXMuYm91bmRzO1xuICAgIGlmIChibmRzICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuaXNSZWN0YW5nbGUoYm5kcykpIHtcbiAgICAgICAgc2hhcGUudHlwZSA9ICdyZWN0JztcbiAgICAgICAgc2hhcGUueDAgPSBibmRzLng7XG4gICAgICAgIHNoYXBlLnkwID0gYm5kcy55O1xuICAgICAgICBzaGFwZS54MSA9IGJuZHMueCArIGJuZHMud2lkdGg7XG4gICAgICAgIHNoYXBlLnkxID0gYm5kcy55ICsgYm5kcy5oZWlnaHQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1BvbHlnb24oYm5kcykpIHtcbiAgICAgICAgc2hhcGUudHlwZSA9ICdwYXRoJztcbiAgICAgICAgbGV0IHBhdGggPSAnTSc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm5kcy5ucG9pbnRzOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSA8IGJuZHMubnBvaW50cyAtIDEpIHtcbiAgICAgICAgICAgIHBhdGggPSBgJHtwYXRofSR7Ym5kcy54cG9pbnRzW2ldfSwke2JuZHMueXBvaW50c1tpXX1MYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aCA9IGAke3BhdGh9JHtibmRzLnhwb2ludHNbaV19LCR7Ym5kcy55cG9pbnRzW2ldfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChibmRzLmNsb3NlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBwYXRoICs9ICdaJztcbiAgICAgICAgfVxuICAgICAgICBzaGFwZS5wYXRoID0gcGF0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYXBlO1xuICB9XG5cbiAgaXNSZWN0YW5nbGUoYm5kczogYW55KTogYm5kcyBpcyBSZWN0YW5nbGUge1xuICAgIHJldHVybiAneCcgaW4gYm5kcyAmJiAneScgaW4gYm5kcyAmJiAnd2lkdGgnIGluIGJuZHMgJiYgJ2hlaWdodCcgaW4gYm5kcztcbiAgfVxuXG4gIGlzUG9seWdvbihibmRzOiBhbnkpOiBibmRzIGlzIFBvbHlnb24ge1xuICAgIHJldHVybiAnbnBvaW50cycgaW4gYm5kcyAmJiAneHBvaW50cycgaW4gYm5kcyAmJiAneXBvaW50cycgaW4gYm5kcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVjdGFuZ2xlIHtcbiAgeCA9IDA7XG4gIHkgPSAwO1xuICB3aWR0aCA9IDA7XG4gIGhlaWdodCA9IDA7XG59XG5cbmV4cG9ydCBjbGFzcyBQb2x5Z29uIHtcbiAgbnBvaW50cyA9IDA7XG4gIHhwb2ludHM6IG51bWJlcltdID0gW107XG4gIHlwb2ludHM6IG51bWJlcltdID0gW107XG4gIGNvb3JkaW5hdGVzOiBudW1iZXJbXVtdID0gW107XG4gIC8qKiBmYWxzZSBmb3Igb3BlbiBwb2x5bGluZXM7IHRydWUgKGRlZmF1bHQpIGZvciBjbG9zZWQgcG9seWdvbnMgKi9cbiAgY2xvc2VkID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSB0aGUgdmVydGljZXMgYXJlIHRyZWF0ZWQgYXMgYmV6aWVyLXNwbGluZSAqKmFuY2hvcnMqKiBhbmQgdGhlXG4gICAqIHJlZ2lvbiBpcyByZW5kZXJlZC9leHBvcnRlZCBhcyBhIHNtb290aCBjdXJ2ZSB0aHJvdWdoIHRoZW0uIFRoZSB2ZXJ0aWNlc1xuICAgKiBzdGF5IHRoZSBlZGl0YWJsZSBhbmNob3JzIOKAlCB0b2dnbGluZyB0aGlzIGZsYWcgaXMgdGhlIHRvQmV6aWVyXG4gICAqIChgdHJ1ZWApIC8gdG9Qb2x5Z29uIChgZmFsc2VgKSwgd2hpY2ggb25seSBhZGQvcmVtb3ZlIHRoZSBjdXJ2ZSwgbmV2ZXIgbW92ZVxuICAgKiB0aGUgYW5jaG9ycy4gR2VvSlNPTiBrZWVwcyB0aGUgZmxhdHRlbmVkIGN1cnZlIGFzIHRoZSBnZW9tZXRyeSAoc28gUXVQYXRoXG4gICAqIHJlbmRlcnMgaXQpIHBsdXMgdGhlIGFuY2hvcnMgKyBoYW5kbGVzICsgZmxhZyBpbiBwcm9wZXJ0aWVzIChzbyBKSVRcbiAgICogcm91bmQtdHJpcHMgdGhlIGVkaXRhYmxlIGJlemllcikuXG4gICAqL1xuICBiZXppZXIgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFBlci1hbmNob3IgY3ViaWMtYmV6aWVyIGNvbnRyb2wtcG9pbnQgb2Zmc2V0cywgKipyZWxhdGl2ZSoqIHRvIHRoZWlyIGFuY2hvclxuICAgKiAoc28gdGhleSB0cmFuc2xhdGUgd2l0aCBpdCkuIFByZXNlbnQgb25seSBmb3IgYmV6aWVyIHJlZ2lvbnM7IGluaXRpYWxpc2VkXG4gICAqIGZyb20gdGhlIENhdG11bGwtUm9tIGNvbnN0cnVjdGlvbiAoYSBzbW9vdGggY3VydmUpIHdoZW4gYmV6aWVyIGlzIHR1cm5lZCBvbixcbiAgICogdGhlbiBpbmRpdmlkdWFsbHkgZWRpdGFibGUgYnkgZHJhZ2dpbmcgdGhlIGhhbmRsZXMuIGBoYW5kbGVzSW5baV1gIC9cbiAgICogYGhhbmRsZXNPdXRbaV1gIGFyZSBgW2R4LCBkeV1gIGZvciB2ZXJ0ZXggYGlgLlxuICAgKi9cbiAgaGFuZGxlc0luPzogbnVtYmVyW11bXTtcbiAgaGFuZGxlc091dD86IG51bWJlcltdW107XG5cbiAgLyoqXG4gICAqIEludGVyaW9yIHJpbmdzIChob2xlcykg4oCUIGppdC11aSM4NS4gRWFjaCByaW5nIGlzIGEgbGlzdCBvZiBgW3gsIHldYFxuICAgKiBpbWFnZS1waXhlbCBwYWlycyBpbiB0aGUgU0FNRSBjbG9zZWQtcG9seWdvbiBjb252ZW50aW9uIGFzIHRoZSBleHRlcmlvclxuICAgKiAoYGNvb3JkaW5hdGVzYCk6IG5vIHJlcGVhdGVkIGNsb3NpbmcgcG9pbnQuIFByZXNlbnQgb25seSBvbiBjbG9zZWQgcG9seWdvbnMuXG4gICAqIEEgcG9pbnQgaW5zaWRlIHRoZSBleHRlcmlvciAqKmFuZCoqIGluc2lkZSBhbnkgaG9sZSBpcyBPVVRTSURFIHRoZSByZWdpb25cbiAgICogKGV2ZW4tb2RkIHJ1bGUpLiBBYnNlbnQvZW1wdHkgPT0gYSBzb2xpZCBwb2x5Z29uICh0aGUgcHJpb3IgYmVoYXZpb3VyKSwgc29cbiAgICogZXZlcnkgZXhpc3RpbmcgcmVnaW9uIGlzIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBob2xlcz86IG51bWJlcltdW11bXTtcblxuICAvKipcbiAgICogUGVyLWhvbGUgYsOpemllciBjb250cm9sLXBvaW50IG9mZnNldHMsIHBhcmFsbGVsIHRvIHtAbGluayBob2xlc30gKG9uZSBlbnRyeSBwZXIgcmluZywgZWFjaCBhXG4gICAqIGxpc3Qgb2YgYFtkeCwgZHldYCBwZXIgcmluZyB2ZXJ0ZXgsICoqcmVsYXRpdmUqKiB0byB0aGUgdmVydGV4KS4gUHJlc2VudCBvbmx5IHdoZW4gYGJlemllcmAgaXNcbiAgICogb24gZm9yIGEgZG9udXQg4oCUIHNlZWRlZCBmcm9tIHRoZSBDYXRtdWxsLVJvbSBkZWZhdWx0IGFuZCBpbmRpdmlkdWFsbHkgZWRpdGFibGUsIGV4YWN0bHkgbGlrZVxuICAgKiB0aGUgZXh0ZXJpb3Ige0BsaW5rIGhhbmRsZXNJbn0ve0BsaW5rIGhhbmRsZXNPdXR9LiBTbyBhIGRvbnV0IHNtb290aGVkIHRvIGEgYsOpemllciBjdXJ2ZXMgaXRzXG4gICAqIGhvbGVzIHRvbyAoaml0LXVpIzEwMikuXG4gICAqL1xuICBob2xlSGFuZGxlc0luPzogbnVtYmVyW11bXVtdO1xuICBob2xlSGFuZGxlc091dD86IG51bWJlcltdW11bXTtcbn1cblxuLyoqXG4gKiBBIHJlZ2lvbiB3aG9zZSBnZW9tZXRyeSBpcyBzZXZlcmFsIGRpc2pvaW50IHBhcnRzIOKAlCBlLmcuIHRoZSByZXN1bHQgb2YgbWVyZ2luZ1xuICogdHdvIG5vbi10b3VjaGluZyByZWdpb25zLCBvciB0aGUgaW52ZXJzZSBvZiBhIGJsb2IgKGppdC11aSM4NSkuIEVhY2ggcGFydCBpcyBhXG4gKiBjbG9zZWQge0BsaW5rIFBvbHlnb259IHRoYXQgbWF5IGNhcnJ5IGl0cyBvd24gaG9sZXMsIHNvIGEgTXVsdGlQb2x5Z29uXG4gKiByZXByZXNlbnRzIFwic3BhcnNlIGJpdHMsIHNvbWUgd2l0aCBkb251dCBob2xlc1wiIGFzIGEgc2luZ2xlIHJlZ2lvbi4gTWFwcyAxOjFcbiAqIG9udG8gYSBHZW9KU09OIGBNdWx0aVBvbHlnb25gIChhbmQgUXVQYXRoJ3MgZ2VvbWV0cnkpLlxuICpcbiAqIEEgc2luZ2xlLXBhcnQgTXVsdGlQb2x5Z29uIGlzIGVxdWl2YWxlbnQgdG8gdGhhdCBQb2x5Z29uOyBjYWxsZXJzIHNob3VsZFxuICogcHJlZmVyIGEgcGxhaW4ge0BsaW5rIFBvbHlnb259IGZvciBvbmUgY29ubmVjdGVkIHBhcnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNdWx0aVBvbHlnb24ge1xuICAvKiogT25lIG9yIG1vcmUgZGlzam9pbnQgY2xvc2VkIHBvbHlnb25zIChlYWNoIG1heSBoYXZlIGhvbGVzKS4gKi9cbiAgcG9seWdvbnM6IFBvbHlnb25bXSA9IFtdO1xufVxuXG5leHBvcnQgdHlwZSBCb3VuZHMgPSBSZWN0YW5nbGUgfCBQb2x5Z29uIHwge1xuICB4PzogbnVtYmVyO1xuICB5PzogbnVtYmVyO1xuICB3aWR0aD86IG51bWJlcjtcbiAgaGVpZ2h0PzogbnVtYmVyO1xuICBucG9pbnRzPzogbnVtYmVyO1xuICB4cG9pbnRzPzogbnVtYmVyW107XG4gIHlwb2ludHM/OiBudW1iZXJbXTtcbn07XG4iXX0=
@@ -0,0 +1,53 @@
1
+ import { Region, Polygon, Rectangle } from './region';
2
+ export class ShapeSelection {
3
+ constructor() {
4
+ this.editable = true;
5
+ }
6
+ /**
7
+ * Returns a Region object based on the shape type.
8
+ */
9
+ getRegion() {
10
+ const region = new Region();
11
+ region.id = this.id;
12
+ region.name = this.name;
13
+ // The region's colour lives on line.color (see Region.getShape); fillcolor
14
+ // is only set for the active-shape highlight. Restore the class label from
15
+ // legend too. Without these, getRegions() — which the OSD region overlay
16
+ // renders from — returned undefined colour AND label, so OSD drew every
17
+ // region in the default colour with no label (unlike Plotly, which renders
18
+ // its shape array directly).
19
+ region.color = this.line?.color ?? this.fillcolor;
20
+ region.label = this.legend;
21
+ if (this.kind === 'profile')
22
+ region.kind = 'profile';
23
+ if (this.type === 'rect') {
24
+ region.bounds = new Rectangle();
25
+ region.bounds.x = this.x0;
26
+ region.bounds.y = this.y0;
27
+ region.bounds.width = this.x1 - this.x0;
28
+ region.bounds.height = this.y1 - this.y0;
29
+ }
30
+ else if (this.type === 'path') {
31
+ region.bounds = new Polygon();
32
+ const isClosed = this.path.endsWith('Z');
33
+ const spath = isClosed ? this.path.slice(1, -1) : this.path.slice(1); // remove M and optionally Z
34
+ const spoints = spath.split('L');
35
+ region.bounds.npoints = spoints.length;
36
+ region.bounds.xpoints = [];
37
+ region.bounds.ypoints = [];
38
+ region.bounds.coordinates = [];
39
+ region.bounds.closed = isClosed;
40
+ for (const point of spoints) {
41
+ const coords = point.split(',');
42
+ region.bounds.xpoints.push(parseFloat(coords[0]));
43
+ region.bounds.ypoints.push(parseFloat(coords[1]));
44
+ region.bounds.coordinates.push([parseFloat(coords[0]), parseFloat(coords[1])]);
45
+ }
46
+ }
47
+ else {
48
+ throw new Error(`Unsupported shape type: ${this.type}`);
49
+ }
50
+ return region;
51
+ }
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21vZGVscy9zaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHdEQsTUFBTSxPQUFPLGNBQWM7SUFBM0I7UUFrQ0UsYUFBUSxHQUFHLElBQUksQ0FBQztJQW9EbEIsQ0FBQztJQTNDQzs7T0FFRztJQUNJLFNBQVM7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNwQixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEIsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSx5RUFBeUU7UUFDekUsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSw2QkFBNkI7UUFDN0IsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQVksQ0FBQztZQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBWSxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFJLElBQUksQ0FBQyxFQUFhLEdBQUksSUFBSSxDQUFDLEVBQWEsQ0FBQztZQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBSSxJQUFJLENBQUMsRUFBYSxHQUFJLElBQUksQ0FBQyxFQUFhLENBQUM7UUFDbkUsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7WUFDbEcsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUNoQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUM1QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakYsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlZ2lvbiwgUG9seWdvbiwgUmVjdGFuZ2xlIH0gZnJvbSAnLi9yZWdpb24nO1xuaW1wb3J0IHsgRGF0dW0sIEZvbnQsIFNoYXBlLCBTaGFwZUxhYmVsLCBTaGFwZUxpbmUsIFhBeGlzTmFtZSwgWUF4aXNOYW1lIH0gZnJvbSAncGxvdGx5LmpzLWRpc3QtbWluJztcblxuZXhwb3J0IGNsYXNzIFNoYXBlU2VsZWN0aW9uIGltcGxlbWVudHMgU2hhcGUge1xuXG4gIC8qKiBTdGFibGUsIHVuaXF1ZSBpZGVudGl0eSBjYXJyaWVkIGFsb25nc2lkZSB0aGUgc2hhcGUgc28gaXQgcm91bmQtdHJpcHNcbiAgICogIHRocm91Z2ggUGxvdGx5J3MgcmVsYXlvdXQgdW50b3VjaGVkLiBQbG90bHkgcHJlc2VydmVzIHVua25vd25cbiAgICogIHByb3BlcnRpZXMgb24gc2hhcGUgb2JqZWN0cywgc28gdGhpcyBzdXJ2aXZlcyB0aGUgc2FtZSB3YXkgYGxlZ2VuZGBcbiAgICogIGFuZCBgZmlsZU5hbWVgIGFscmVhZHkgZG8uICovXG4gIGlkITogbnVtYmVyO1xuICBuYW1lITogc3RyaW5nO1xuICBmaWxsY29sb3IhOiBzdHJpbmc7XG4gIC8vIGxhYmVsIHRha2VzIHRoZSBmb3JtXG4gIC8vIHsgdGV4dDogbGVnZW5kLCB0ZXh0dGVtcGxhdGU6IGxlZ2VuZCwgZm9udDogeyBjb2xvcjogJyNGRkYwMDAnIH0sIHRleHRwb3NpdGlvbjogJ3RvcCBsZWZ0JyB9XG4gIC8vIG9yIGNhbiBiZSBhbiBlbXB0eSBvYmplY3Qge30gaWYgbm8gbGFiZWwgaXMgdG8gYmUgc2hvd25cbiAgbGFiZWwhOiBQYXJ0aWFsPFNoYXBlTGFiZWw+O1xuICBsYXllciE6ICdiZWxvdycgfCAnYWJvdmUnO1xuICBsZWdlbmRncm91cCE6IHN0cmluZztcbiAgbGVnZW5kZ3JvdXB0aXRsZSE6IHsgdGV4dDogc3RyaW5nOyBmb250PzogUGFydGlhbDxGb250PiB9O1xuICBsZWdlbmRyYW5rITogbnVtYmVyO1xuICBsaW5lITogUGFydGlhbDxTaGFwZUxpbmU+O1xuICBvcGFjaXR5ITogbnVtYmVyO1xuICBwYXRoITogc3RyaW5nO1xuICBzaG93bGVnZW5kITogYm9vbGVhbjtcbiAgdGVtcGxhdGVpdGVtbmFtZSE6IHN0cmluZztcbiAgdHlwZSE6ICdyZWN0JyB8ICdjaXJjbGUnIHwgJ2xpbmUnIHwgJ3BhdGgnO1xuICB2aXNpYmxlITogYm9vbGVhbiB8ICdsZWdlbmRvbmx5JztcbiAgeDAhOiBEYXR1bTtcbiAgeDEhOiBEYXR1bTtcbiAgeGFuY2hvciE6IG51bWJlciB8IHN0cmluZztcbiAgeHJlZiE6ICdwYXBlcicgfCBYQXhpc05hbWU7XG4gIHhzaXplbW9kZSE6ICdzY2FsZWQnIHwgJ3BpeGVsJztcbiAgeTAhOiBEYXR1bTtcbiAgeTEhOiBEYXR1bTtcbiAgeWFuY2hvciE6IG51bWJlciB8IHN0cmluZztcbiAgeXJlZiE6ICdwYXBlcicgfCBZQXhpc05hbWU7XG4gIHlzaXplbW9kZSE6ICdzY2FsZWQnIHwgJ3BpeGVsJztcbiAgZWRpdGFibGUgPSB0cnVlO1xuICAvLyBsZWdlbmQgdGV4dCBmb3IgdGhlIHJlZ2lvbiAodXNlZCBmb3IgY2xhc3NlcykgLSB2YWx1ZSB1c2VkIGluIGxhYmVsLnRleHQgYW5kIGxhYmVsLnRleHR0ZW1wbGF0ZVxuICBsZWdlbmQhOiBhbnk7XG4gIC8vIGZpbGUgbmFtZSBvZiB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIHJlZ2lvbiB3YXMgY3JlYXRlZFxuICBmaWxlTmFtZSE6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLy8gdGFncyBhbiBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIFJPSSBzbyBpdCByb3VuZC10cmlwcyB0aHJvdWdoIFBsb3RseSBhbmQgdGhlXG4gIC8vIHJlZ2lvbiBzdG9yZSBhcyBhIHByb2ZpbGUgKGV4Y2x1ZGVkIGZyb20gdGhlIFJlZ2lvbnMgdGFiICsgZXhwb3J0cykuXG4gIGtpbmQ/OiAncHJvZmlsZSc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBSZWdpb24gb2JqZWN0IGJhc2VkIG9uIHRoZSBzaGFwZSB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldFJlZ2lvbigpOiBSZWdpb24ge1xuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICByZWdpb24uaWQgPSB0aGlzLmlkO1xuICAgIHJlZ2lvbi5uYW1lID0gdGhpcy5uYW1lO1xuICAgIC8vIFRoZSByZWdpb24ncyBjb2xvdXIgbGl2ZXMgb24gbGluZS5jb2xvciAoc2VlIFJlZ2lvbi5nZXRTaGFwZSk7IGZpbGxjb2xvclxuICAgIC8vIGlzIG9ubHkgc2V0IGZvciB0aGUgYWN0aXZlLXNoYXBlIGhpZ2hsaWdodC4gUmVzdG9yZSB0aGUgY2xhc3MgbGFiZWwgZnJvbVxuICAgIC8vIGxlZ2VuZCB0b28uIFdpdGhvdXQgdGhlc2UsIGdldFJlZ2lvbnMoKSDigJQgd2hpY2ggdGhlIE9TRCByZWdpb24gb3ZlcmxheVxuICAgIC8vIHJlbmRlcnMgZnJvbSDigJQgcmV0dXJuZWQgdW5kZWZpbmVkIGNvbG91ciBBTkQgbGFiZWwsIHNvIE9TRCBkcmV3IGV2ZXJ5XG4gICAgLy8gcmVnaW9uIGluIHRoZSBkZWZhdWx0IGNvbG91ciB3aXRoIG5vIGxhYmVsICh1bmxpa2UgUGxvdGx5LCB3aGljaCByZW5kZXJzXG4gICAgLy8gaXRzIHNoYXBlIGFycmF5IGRpcmVjdGx5KS5cbiAgICByZWdpb24uY29sb3IgPSB0aGlzLmxpbmU/LmNvbG9yID8/IHRoaXMuZmlsbGNvbG9yO1xuICAgIHJlZ2lvbi5sYWJlbCA9IHRoaXMubGVnZW5kO1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdwcm9maWxlJykgcmVnaW9uLmtpbmQgPSAncHJvZmlsZSc7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3JlY3QnKSB7XG4gICAgICByZWdpb24uYm91bmRzID0gbmV3IFJlY3RhbmdsZSgpO1xuICAgICAgcmVnaW9uLmJvdW5kcy54ID0gdGhpcy54MCBhcyBudW1iZXI7XG4gICAgICByZWdpb24uYm91bmRzLnkgPSB0aGlzLnkwIGFzIG51bWJlcjtcbiAgICAgIHJlZ2lvbi5ib3VuZHMud2lkdGggPSAodGhpcy54MSBhcyBudW1iZXIpIC0gKHRoaXMueDAgYXMgbnVtYmVyKTtcbiAgICAgIHJlZ2lvbi5ib3VuZHMuaGVpZ2h0ID0gKHRoaXMueTEgYXMgbnVtYmVyKSAtICh0aGlzLnkwIGFzIG51bWJlcik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdwYXRoJykge1xuICAgICAgcmVnaW9uLmJvdW5kcyA9IG5ldyBQb2x5Z29uKCk7XG4gICAgICBjb25zdCBpc0Nsb3NlZCA9IHRoaXMucGF0aC5lbmRzV2l0aCgnWicpO1xuICAgICAgY29uc3Qgc3BhdGggPSBpc0Nsb3NlZCA/IHRoaXMucGF0aC5zbGljZSgxLCAtMSkgOiB0aGlzLnBhdGguc2xpY2UoMSk7IC8vIHJlbW92ZSBNIGFuZCBvcHRpb25hbGx5IFpcbiAgICAgIGNvbnN0IHNwb2ludHMgPSBzcGF0aC5zcGxpdCgnTCcpO1xuICAgICAgcmVnaW9uLmJvdW5kcy5ucG9pbnRzID0gc3BvaW50cy5sZW5ndGg7XG4gICAgICByZWdpb24uYm91bmRzLnhwb2ludHMgPSBbXTtcbiAgICAgIHJlZ2lvbi5ib3VuZHMueXBvaW50cyA9IFtdO1xuICAgICAgcmVnaW9uLmJvdW5kcy5jb29yZGluYXRlcyA9IFtdO1xuICAgICAgcmVnaW9uLmJvdW5kcy5jbG9zZWQgPSBpc0Nsb3NlZDtcbiAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc3BvaW50cykge1xuICAgICAgICBjb25zdCBjb29yZHMgPSBwb2ludC5zcGxpdCgnLCcpO1xuICAgICAgICByZWdpb24uYm91bmRzLnhwb2ludHMucHVzaChwYXJzZUZsb2F0KGNvb3Jkc1swXSkpO1xuICAgICAgICByZWdpb24uYm91bmRzLnlwb2ludHMucHVzaChwYXJzZUZsb2F0KGNvb3Jkc1sxXSkpO1xuICAgICAgICByZWdpb24uYm91bmRzLmNvb3JkaW5hdGVzLnB1c2goW3BhcnNlRmxvYXQoY29vcmRzWzBdKSwgcGFyc2VGbG9hdChjb29yZHNbMV0pXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2hhcGUgdHlwZTogJHt0aGlzLnR5cGV9YCk7XG4gICAgfVxuICAgIHJldHVybiByZWdpb247XG4gIH1cbn1cbiJdfQ==