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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +34 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  13. package/esm2022/lib/contracts/intensity.mjs +48 -5
  14. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  15. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  16. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  17. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  18. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  19. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  20. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  21. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  25. package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
  26. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  28. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  29. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  30. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  31. package/esm2022/lib/geometry/contour.mjs +63 -0
  32. package/esm2022/lib/geometry/loft.mjs +128 -0
  33. package/esm2022/lib/geometry/polylabel.mjs +156 -0
  34. package/esm2022/lib/geometry/raster.mjs +98 -0
  35. package/esm2022/lib/geometry/reconstruct.mjs +315 -0
  36. package/esm2022/lib/geometry/reslice-image.mjs +57 -0
  37. package/esm2022/lib/geometry/ring.mjs +201 -0
  38. package/esm2022/lib/geometry/section.mjs +215 -0
  39. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  40. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  41. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  42. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  43. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  45. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
  46. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
  47. package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
  48. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
  49. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  50. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  51. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  52. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  53. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
  54. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  55. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  56. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  57. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  58. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  59. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
  60. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
  61. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
  62. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
  63. package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
  64. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  65. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  66. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  67. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
  68. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  69. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  70. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  71. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  72. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  73. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  74. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  75. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  76. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  77. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  78. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  79. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  80. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  81. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  82. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  83. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  84. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  85. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  86. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
  87. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
  88. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  89. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  90. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  91. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  92. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  93. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  94. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  95. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  96. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  97. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  98. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  99. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  100. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  101. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  102. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  103. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  104. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  105. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  106. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  107. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  108. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  109. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  110. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  111. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  112. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  113. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  114. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  115. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  116. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  117. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  118. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  119. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  120. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  121. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  122. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  123. package/esm2022/lib/models/bezier.mjs +1 -11
  124. package/esm2022/lib/models/class-preset.mjs +41 -3
  125. package/esm2022/lib/models/geometry.mjs +27 -164
  126. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  127. package/esm2022/lib/models/polygon-factory.mjs +134 -0
  128. package/esm2022/lib/models/region-clone.mjs +68 -0
  129. package/esm2022/lib/models/region-geojson.mjs +411 -0
  130. package/esm2022/lib/models/region.mjs +34 -33
  131. package/esm2022/lib/models/shape.mjs +18 -16
  132. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  133. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  134. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  135. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  136. package/esm2022/lib/plot.utilities.mjs +296 -473
  137. package/esm2022/lib/processing/image-crop.mjs +1 -1
  138. package/esm2022/lib/processing/processing-image.mjs +28 -15
  139. package/esm2022/lib/provide-visualization.mjs +40 -14
  140. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
  141. package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
  142. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
  143. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  144. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  145. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  146. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  147. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  148. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  149. package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
  150. package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
  151. package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
  152. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
  153. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  154. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  155. package/esm2022/lib/region-ops.service.mjs +28 -70
  156. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  157. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  158. package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
  159. package/esm2022/lib/region-overlay/region-style.mjs +97 -0
  160. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  161. package/esm2022/lib/region-source/http-region-source.mjs +104 -0
  162. package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
  163. package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
  164. package/esm2022/lib/region-source/region-source.mjs +67 -0
  165. package/esm2022/lib/region-source/region-tiles.mjs +708 -0
  166. package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
  167. package/esm2022/lib/render-orchestrator.mjs +14 -11
  168. package/esm2022/lib/render-session.mjs +207 -0
  169. package/esm2022/lib/routing-visualizer.service.mjs +858 -414
  170. package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
  171. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  172. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  173. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  174. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  175. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  176. package/esm2022/lib/spatial/lod.mjs +187 -0
  177. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  178. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  179. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  180. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  181. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  182. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  183. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  184. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  185. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  186. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  187. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  188. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  189. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  190. package/esm2022/lib/spatial/stats.mjs +71 -0
  191. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  192. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  193. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  194. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  195. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  196. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  197. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  198. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  199. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  200. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  201. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  202. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  203. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  204. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  205. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  206. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  207. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  208. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  209. package/esm2022/lib/store/class-color.util.mjs +53 -5
  210. package/esm2022/lib/store/class-signatures.mjs +63 -0
  211. package/esm2022/lib/store/region-history.mjs +146 -0
  212. package/esm2022/lib/store/region-scope-cache.mjs +144 -0
  213. package/esm2022/lib/store/region-selection.mjs +82 -0
  214. package/esm2022/lib/store/region-source-scope.mjs +171 -0
  215. package/esm2022/lib/store/region-store.service.mjs +986 -670
  216. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  217. package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
  218. package/esm2022/lib/toast-outlets.mjs +5 -4
  219. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  220. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  221. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  222. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  223. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  224. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
  225. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  226. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  227. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  228. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  229. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  230. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  231. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  232. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  233. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  234. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  235. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  236. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  237. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  238. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
  239. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  240. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  241. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  242. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  243. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  244. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  245. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  246. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  247. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  248. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  249. package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
  250. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  251. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  252. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  253. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  254. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  255. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  256. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  257. package/esm2022/lib/util/supersede.mjs +56 -0
  258. package/esm2022/lib/visualization.module.mjs +39 -141
  259. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  260. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  261. package/esm2022/lib/visualizer/region-load.mjs +123 -0
  262. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  263. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  264. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  265. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  266. package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
  267. package/esm2022/lib/visualizer.component.mjs +602 -1902
  268. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  269. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  270. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  271. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
  272. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
  273. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
  274. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
  275. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
  276. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
  277. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  278. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  279. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  280. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  281. package/fesm2022/mask.worker.js +36 -917
  282. package/fesm2022/onnx-sam.worker.js +52 -16
  283. package/fesm2022/region-source.worker.js +1067 -0
  284. package/fesm2022/spatial-math.worker.js +471 -0
  285. package/fesm2022/tsne.worker.js +32 -15
  286. package/index.d.ts +19 -10
  287. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  288. package/lib/contracts/capabilities.contract.d.ts +4 -2
  289. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  290. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  291. package/lib/contracts/color.d.ts +27 -0
  292. package/lib/contracts/colormap-lut.d.ts +19 -4
  293. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  294. package/lib/contracts/display-types.d.ts +21 -0
  295. package/lib/contracts/image.contract.d.ts +4 -0
  296. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  297. package/lib/contracts/intensity.d.ts +13 -2
  298. package/lib/contracts/plot-type.d.ts +3 -1
  299. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  300. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  301. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  302. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  303. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  304. package/lib/contracts/region-editor-api.contract.d.ts +85 -1
  305. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  306. package/lib/contracts/region-store.contract.d.ts +22 -0
  307. package/lib/contracts/sam.contract.d.ts +7 -0
  308. package/lib/contracts/section-view.contract.d.ts +44 -0
  309. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  310. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  311. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  312. package/lib/contracts/visualizer.contract.d.ts +231 -54
  313. package/lib/contracts/viz-config.d.ts +9 -0
  314. package/lib/geometry/contour.d.ts +24 -0
  315. package/lib/geometry/loft.d.ts +22 -0
  316. package/lib/geometry/polylabel.d.ts +23 -0
  317. package/lib/geometry/raster.d.ts +42 -0
  318. package/lib/geometry/reconstruct.d.ts +54 -0
  319. package/lib/geometry/reslice-image.d.ts +33 -0
  320. package/lib/geometry/ring.d.ts +67 -0
  321. package/lib/geometry/section.d.ts +52 -0
  322. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  323. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  324. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  325. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  326. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  327. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  328. package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
  329. package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
  330. package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
  331. package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
  332. package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
  333. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  334. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  335. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  336. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
  337. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  338. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  339. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  340. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  341. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  342. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  343. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
  344. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
  345. package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
  346. package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
  347. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  348. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  349. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  350. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  351. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  352. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  353. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  354. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  355. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  356. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  357. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  358. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  359. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  360. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  361. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  362. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  363. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  364. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  365. package/lib/implementations/osd/osd-export.d.ts +36 -0
  366. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  367. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  368. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  369. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
  370. package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
  371. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  372. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  373. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  374. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  375. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  376. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  377. package/lib/implementations/osd/simple-source.d.ts +161 -0
  378. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  379. package/lib/implementations/osd/tile-client.d.ts +11 -14
  380. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  381. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  382. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  383. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  384. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  385. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  386. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  387. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  388. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  389. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  390. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  391. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  392. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  393. package/lib/implementations/region-centroids.d.ts +14 -0
  394. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  395. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  396. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  397. package/lib/implementations/tile-server/index.d.ts +5 -0
  398. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  399. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  400. package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
  401. package/lib/implementations/tile-server/transport.d.ts +62 -0
  402. package/lib/intensity/intensity-profile.d.ts +66 -0
  403. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  404. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  405. package/lib/models/bezier.d.ts +0 -5
  406. package/lib/models/class-preset.d.ts +25 -0
  407. package/lib/models/geometry.d.ts +14 -48
  408. package/lib/models/polygon-edit.d.ts +72 -0
  409. package/lib/models/polygon-factory.d.ts +45 -0
  410. package/lib/models/region-clone.d.ts +20 -0
  411. package/lib/models/region-geojson.d.ts +57 -0
  412. package/lib/models/region.d.ts +59 -4
  413. package/lib/models/shape.d.ts +8 -0
  414. package/lib/plot-mode/contribution-host.d.ts +125 -0
  415. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  416. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  417. package/lib/plot.utilities.d.ts +19 -30
  418. package/lib/processing/processing-image.d.ts +5 -2
  419. package/lib/provide-visualization.d.ts +19 -2
  420. package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
  421. package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
  422. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
  423. package/lib/region-editor/file-stem.d.ts +7 -0
  424. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  425. package/lib/region-editor/mask-export.service.d.ts +54 -0
  426. package/lib/region-editor/mask-raster.d.ts +2 -8
  427. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  428. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  429. package/lib/region-editor/region-editor.component.d.ts +283 -200
  430. package/lib/region-editor/region-metrics.d.ts +34 -0
  431. package/lib/region-editor/region-persistence.service.d.ts +77 -0
  432. package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
  433. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  434. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  435. package/lib/region-ops.service.d.ts +1 -7
  436. package/lib/region-overlay/region-geometry.d.ts +158 -0
  437. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  438. package/lib/region-overlay/region-source-layer.d.ts +96 -0
  439. package/lib/region-overlay/region-style.d.ts +52 -0
  440. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  441. package/lib/region-source/http-region-source.d.ts +45 -0
  442. package/lib/region-source/region-source-ops.d.ts +89 -0
  443. package/lib/region-source/region-source-worker.d.ts +7 -0
  444. package/lib/region-source/region-source.d.ts +82 -0
  445. package/lib/region-source/region-tiles.d.ts +289 -0
  446. package/lib/region-source/worker-region-source.d.ts +65 -0
  447. package/lib/render-orchestrator.d.ts +6 -2
  448. package/lib/render-session.d.ts +75 -0
  449. package/lib/routing-visualizer.service.d.ts +248 -59
  450. package/lib/section-pane/section-pane.component.d.ts +47 -0
  451. package/lib/spatial/density-raster.d.ts +6 -0
  452. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  453. package/lib/spatial/embedding-compute.d.ts +21 -2
  454. package/lib/spatial/glyphs.d.ts +16 -0
  455. package/lib/spatial/lod.d.ts +94 -0
  456. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  457. package/lib/spatial/spatial-density.d.ts +15 -5
  458. package/lib/spatial/spatial-encoding.d.ts +11 -44
  459. package/lib/spatial/spatial-expression.d.ts +40 -22
  460. package/lib/spatial/spatial-framing.d.ts +1 -0
  461. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  462. package/lib/spatial/spatial-hover.d.ts +4 -16
  463. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  464. package/lib/spatial/spatial-selection.d.ts +21 -26
  465. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  466. package/lib/spatial/spatial-tiles.d.ts +9 -256
  467. package/lib/spatial/stats.d.ts +38 -0
  468. package/lib/spatial/transcript-grouping.d.ts +119 -0
  469. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  470. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  471. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  472. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  473. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  474. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  475. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  476. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  477. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  478. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  479. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  480. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  481. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  482. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  483. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  484. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  485. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  486. package/lib/store/class-color.util.d.ts +39 -2
  487. package/lib/store/class-signatures.d.ts +11 -0
  488. package/lib/store/region-history.d.ts +66 -0
  489. package/lib/store/region-scope-cache.d.ts +65 -0
  490. package/lib/store/region-selection.d.ts +36 -0
  491. package/lib/store/region-source-scope.d.ts +68 -0
  492. package/lib/store/region-store.service.d.ts +312 -116
  493. package/lib/store/visualizer-store.service.d.ts +32 -33
  494. package/lib/toast-outlets.d.ts +4 -3
  495. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  496. package/lib/toolbar/canvas-tools.d.ts +20 -0
  497. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  498. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  499. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  500. package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
  501. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  502. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  503. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  504. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  505. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  506. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  507. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  508. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  509. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  510. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  511. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  512. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  513. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  514. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
  515. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  516. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  517. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  518. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  519. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  520. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  521. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  522. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  523. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  524. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  525. package/lib/toolbar/toolbar.component.d.ts +55 -84
  526. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  527. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  528. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  529. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  530. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  531. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  532. package/lib/util/mark-for-check.d.ts +11 -0
  533. package/lib/util/supersede.d.ts +53 -0
  534. package/lib/visualization.module.d.ts +18 -39
  535. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  536. package/lib/visualizer/region-actions.d.ts +54 -0
  537. package/lib/visualizer/region-load.d.ts +46 -0
  538. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  539. package/lib/visualizer/tool-modes.d.ts +49 -0
  540. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  541. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  542. package/lib/visualizer/volume-sections.d.ts +64 -0
  543. package/lib/visualizer.component.d.ts +232 -447
  544. package/lib/workers/spatial-math-ops.d.ts +65 -0
  545. package/lib/workers/spatial-math-worker.d.ts +7 -0
  546. package/lib/workers/spatial-math.d.ts +74 -0
  547. package/package.json +12 -3
  548. package/src/lib/assets/slice.svg +23 -0
  549. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  550. package/src/lib/styles/viz-icons.scss +14 -0
  551. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  552. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  553. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  554. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  555. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  556. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  557. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  558. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  559. package/src/lib/assets/cell-detection.svg +0 -37
  560. package/src/lib/assets/click.svg +0 -1
  561. package/src/lib/assets/colormap-luts.json +0 -1
  562. package/src/lib/assets/edit-selection-white.svg +0 -47
  563. package/src/lib/assets/icons/colormap-earth.png +0 -0
  564. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  565. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  566. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  567. package/src/lib/assets/picture-segmentation.svg +0 -43
  568. package/src/lib/assets/test/download-379.svg +0 -1
  569. package/src/lib/assets/test/download-98.svg +0 -1
  570. package/src/lib/assets/test/json-1.svg +0 -1
  571. package/src/lib/assets/test/load-53.svg +0 -1
  572. package/src/lib/assets/test/mask-44.svg +0 -1
  573. package/src/lib/assets/test/mask-download-44.svg +0 -15
  574. package/src/lib/assets/test/mask-save-44.svg +0 -11
  575. package/src/lib/assets/test/overlay-1.svg +0 -1
  576. package/src/lib/assets/test/overlay-4.svg +0 -1
  577. package/src/lib/assets/test/region-26.svg +0 -1
  578. package/src/lib/assets/test/save-56.svg +0 -1
  579. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -1,4 +1,16 @@
1
1
  import { ShapeSelection } from './shape';
2
+ import { verticesToSvgPath } from './geometry';
3
+ /**
4
+ * One annotation region — the backend-neutral model every renderer (Plotly,
5
+ * OpenSeadragon, napari-js), the RegionStore, the Region Editor and the
6
+ * GeoJSON/QuPath import/export share.
7
+ *
8
+ * Geometry lives in {@link bounds}, in full-resolution image-pixel
9
+ * coordinates (x right, y down) of slice {@link z}. A region with no bounds
10
+ * (`null`/absent) is kept but draws nowhere. Regions that arrive as JSON are
11
+ * rebuilt into class instances by {@link hydrateBounds} on their way into the
12
+ * store, so `bounds instanceof Rectangle` etc. can be relied on downstream.
13
+ */
2
14
  export class Region {
3
15
  constructor() {
4
16
  this.bounds = null;
@@ -8,6 +20,7 @@ export class Region {
8
20
  * or a region drawn without a slice context (jit-ui#93). */
9
21
  this.z = 0;
10
22
  this.shapeColor = '#00FFFF';
23
+ /** @deprecated Unused by the library; will be removed in the next minor release. */
11
24
  this.bytesPerPixel = 8;
12
25
  /**
13
26
  * resolution is the resolution at which the region
@@ -20,7 +33,9 @@ export class Region {
20
33
  * at resolution = 0
21
34
  */
22
35
  this.resolution = 0;
36
+ /** @deprecated Unused by the library; will be removed in the next minor release. */
23
37
  this.cropped = false;
38
+ /** @deprecated Unused by the library; will be removed in the next minor release. */
24
39
  this.tileNumber = 0;
25
40
  this.tileCoordinates = null;
26
41
  }
@@ -30,27 +45,17 @@ export class Region {
30
45
  isProfile() {
31
46
  return this.kind === 'profile';
32
47
  }
48
+ /**
49
+ * A debug string: the rectangle's box, or the polygon's SVG path.
50
+ * @deprecated Unused by the library; will be removed in the next minor release.
51
+ */
33
52
  toString() {
34
- // if shape is rectangle
35
53
  if (this.bounds instanceof Rectangle) {
36
54
  return `x: ${this.bounds.x}, y: ${this.bounds.y},
37
55
  width: ${this.bounds.width}, height: ${this.bounds.height}`;
38
56
  }
39
57
  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;
58
+ return verticesToSvgPath(this.bounds.xpoints, this.bounds.ypoints, this.bounds.closed !== false);
54
59
  }
55
60
  return '';
56
61
  }
@@ -95,19 +100,7 @@ export class Region {
95
100
  }
96
101
  if (this.isPolygon(bnds)) {
97
102
  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;
103
+ shape.path = verticesToSvgPath(bnds.xpoints, bnds.ypoints, bnds.closed !== false);
111
104
  }
112
105
  }
113
106
  return shape;
@@ -119,6 +112,8 @@ export class Region {
119
112
  return 'npoints' in bnds && 'xpoints' in bnds && 'ypoints' in bnds;
120
113
  }
121
114
  }
115
+ /** An axis-aligned box in image-pixel coordinates: (`x`, `y`) is the top-left
116
+ * (minimum) corner, `width`/`height` extend right/down. */
122
117
  export class Rectangle {
123
118
  constructor() {
124
119
  this.x = 0;
@@ -127,6 +122,15 @@ export class Rectangle {
127
122
  this.height = 0;
128
123
  }
129
124
  }
125
+ /**
126
+ * A polygon or open polyline in image-pixel coordinates, optionally with holes
127
+ * and smoothed into a bézier curve.
128
+ *
129
+ * The vertices are stored twice and must agree: as the parallel `xpoints` /
130
+ * `ypoints` arrays (length `npoints`; the Java/JIT wire shape) and as
131
+ * `coordinates` `[x, y]` pairs (what GeoJSON export reads). The ring is
132
+ * implicitly closed — the first vertex is not repeated at the end.
133
+ */
130
134
  export class Polygon {
131
135
  constructor() {
132
136
  this.npoints = 0;
@@ -183,10 +187,7 @@ export class MultiPolygon {
183
187
  * hold onto the bounds they created and mutate them in place during a drag.
184
188
  */
185
189
  export function hydrateBounds(bounds) {
186
- if (!bounds ||
187
- bounds instanceof Rectangle ||
188
- bounds instanceof Polygon ||
189
- bounds instanceof MultiPolygon) {
190
+ if (!bounds || bounds instanceof Rectangle || bounds instanceof Polygon || bounds instanceof MultiPolygon) {
190
191
  return bounds;
191
192
  }
192
193
  if (Array.isArray(bounds.polygons)) {
@@ -219,4 +220,4 @@ function hydratePolygon(raw) {
219
220
  polygon.closed = raw.closed ?? true;
220
221
  return polygon;
221
222
  }
222
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvcmVnaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFekMsTUFBTSxPQUFPLE1BQU07SUFBbkI7UUFPRSxXQUFNLEdBQStDLElBQUksQ0FBQztRQTBCMUQ7OztxRUFHNkQ7UUFDN0QsTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLGVBQVUsR0FBSSxTQUFTLENBQUM7UUFDeEIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEI7Ozs7Ozs7OztXQVNHO1FBQ0gsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLG9CQUFlLEdBQW9CLElBQUksQ0FBQztJQWdHMUMsQ0FBQztJQTlGQzs7aUVBRTZEO0lBQzdELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxRQUFRO1FBQ04sd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sWUFBWSxTQUFTLEVBQUUsQ0FBQztZQUNyQyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3VCQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssYUFBYSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RFLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLFlBQVksT0FBTyxFQUFFLENBQUM7WUFDMUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ2Ysa0JBQWtCO1lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8s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LE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztJQUNwQyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2hhcGVTZWxlY3Rpb24gfSBmcm9tICcuL3NoYXBlJztcblxuZXhwb3J0IGNsYXNzIFJlZ2lvbiB7XG4gIC8qKiBTdGFibGUsIHVuaXF1ZSBpZGVudGl0eSBmb3Igc2VsZWN0aW9uIGFuZCBlcXVhbGl0eS4gTWludGVkIGJ5XG4gICAqICBQbG90bHlTZXJ2aWNlIHdoZW4gYSByZWdpb24gZmlyc3QgZW50ZXJzIHRoZSBzeXN0ZW0uIE5ldmVyIGRlcml2ZWRcbiAgICogIGZyb20gYXJyYXkgaW5kZXgg4oCUIG5hbWUgY29sbGlzaW9ucyBhY3Jvc3MgZGVsZXRlL2FkZCBjeWNsZXMgbXVzdFxuICAgKiAgbm90IGJyZWFrIFByaW1lTkcgcm93IHNlbGVjdGlvbi4gKi9cbiAgaWQhOiBudW1iZXI7XG4gIG5hbWUhOiBzdHJpbmc7XG4gIGJvdW5kcz86IFJlY3RhbmdsZSB8IFBvbHlnb24gfCBNdWx0aVBvbHlnb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIHByb2ZpbGUgPSBhbiBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIFJPSTsgcmVuZGVyZWQvZHJhZ2dlZCBsaWtlIGEgcmVnaW9uIGJ1dFxuICAgKiAgZXhjbHVkZWQgZnJvbSB0aGUgUmVnaW9ucyB0YWIgYW5kIGV4cG9ydHMuIFVzZSBgaXNQcm9maWxlKClgIHRvIHRlc3QgaXQg4oCUXG4gICAqICBpdCdzIHRoZSBjYW5vbmljYWwgbWFya2VyIHRoYXQgc2VwYXJhdGVzIGludGVuc2l0eSBsaW5lcyAob3duZWQgYnkgdGhlXG4gICAqICBpbnRlbnNpdHkgdG9vbCwgc2FtcGxlZCBpbnRvIHRoZSBpbnNldCkgZnJvbSBhbm5vdGF0aW9uIHJlZ2lvbnMgKG93bmVkIGJ5XG4gICAqICB0aGUgUmVnaW9uIEVkaXRvcikuIEJvdGggYmFja2VuZHMgKFBsb3RseSwgT1NEKSBob25vdXIgaXQuICovXG4gIGtpbmQ/OiAncHJvZmlsZSc7XG4gIC8qKlxuICAgKiBXaGljaCBhdXRvbWF0ZWQgdG9vbCBwcm9kdWNlZCB0aGlzIHJlZ2lvbiwgZS5nLiBgJ3lvbG8nYC4gQWJzZW50IG9uXG4gICAqIGFueXRoaW5nIHRoZSB1c2VyIGRyZXcuXG4gICAqXG4gICAqIExldHMgYSB0b29sIHJlcGxhY2UgaXRzICpvd24qIHByZXZpb3VzIG91dHB1dCBvbiBhIHJlLXJ1biB3aXRob3V0IHRvdWNoaW5nXG4gICAqIGhhbmQtZHJhd24gd29yayBvciBhbm90aGVyIHRvb2wncyByZXN1bHRzIOKAlCB3aGljaCBtYXR0ZXJzIHdoaWxlIHR1bmluZ1xuICAgKiBwYXJhbWV0ZXJzLCB3aGVyZSBldmVyeSBydW4gd291bGQgb3RoZXJ3aXNlIHBpbGUgb250byB0aGUgbGFzdC4gSWRlbnRpdHlcbiAgICogY29tcGFyaXNvbiBpcyBub3QgYSBzdWJzdGl0dXRlOiByZWdpb25zIG1heSBiZSByZS1taW50ZWQgYXMgdGhleSBwYXNzXG4gICAqIHRocm91Z2ggdGhlIHN0b3JlLCBzbyB0aGUgbWFya2VyIGhhcyB0byB0cmF2ZWwgd2l0aCB0aGUgZGF0YS5cbiAgICovXG4gIHNvdXJjZT86IHN0cmluZztcbiAgY29sb3I/OiBzdHJpbmc7IC8vIGhleCBzdHJpbmcsIGUuZy4gJyNSUkdHQkInICh0aGUgaGlzdG9yaWNhbCBcIltyLCBnLCBiXVwiIG5vdGUgaXMgc3RhbGUpXG4gIC8vIGNsYXNzIGxhYmVsXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB1c2VyIHNldCB0aGlzIHJlZ2lvbidzIGNvbG91ciBleHBsaWNpdGx5IChSZWdpb24gRWRpdG9yIENvbG9yXG4gICAqICBjb2x1bW4pLiBQcmVzZXQgY29sb3VyIHJlc29sdXRpb24gKGppdC11aSM3MCkgc2tpcHMgb3ZlcnJpZGRlbiByZWdpb25zIHNvIGFcbiAgICogIG1hbnVhbCBjb2xvdXIgaXMgbm90IGNsb2JiZXJlZCB3aGVuIHByZXNldHMgYXJlIChyZSlhcHBsaWVkIG9uIGxvYWQvaW1wb3J0LiAqL1xuICBjb2xvck92ZXJyaWRkZW4/OiBib29sZWFuO1xuICBmaWxlbmFtZT86IHN0cmluZztcbiAgLyoqIFplcm8tYmFzZWQgei1zbGljZSB0aGlzIHJlZ2lvbiBiZWxvbmdzIHRvIHdpdGhpbiBhIHN0YWNrIOKAlCBtaXJyb3JzXG4gICAqICBRdVBhdGgncyBgZ2VvbWV0cnkucGxhbmUuemAgKGEgbWlzc2luZyBwbGFuZSAvIGRlZmF1bHQgcGxhbmUgcmVhZHMgYmFjayBhc1xuICAgKiAgMCkuIFVzZWQgdG8gcGxhY2UvZmlsdGVyIFJPSXMgcGVyIHNsaWNlOyAwIGZvciBhIHBsYWluIHNpbmdsZS1wbGFuZSBpbWFnZVxuICAgKiAgb3IgYSByZWdpb24gZHJhd24gd2l0aG91dCBhIHNsaWNlIGNvbnRleHQgKGppdC11aSM5MykuICovXG4gIHogPSAwO1xuICBzaGFwZUNvbG9yPyA9ICcjMDBGRkZGJztcbiAgYnl0ZXNQZXJQaXhlbCA9IDg7XG4gIC8qKlxuICAgKiByZXNvbHV0aW9uIGlzIHRoZSByZXNvbHV0aW9uIGF0IHdoaWNoIHRoZSByZWdpb25cbiAgICogd2FzIGZvdW5kLiBJbiBvcmRlciB0byBnZXQgaXQgaW4gdGhlIGZ1bGwgaW1hZ2VcbiAgICogY29vcmRpbmF0ZXMgaXQgd2lsbCBub3JtYWxseSBiZSAwLiBIb3dldmVyIGlmXG4gICAqIHRoZXJlIGlzIGEgbWlzdGFrZSB3aXRoIHRoZSByZXNvbHV0aW9uIGl0IG1heSBub3RcbiAgICogYmUuIFdlIHJldHVybiB0aGUgcmVzb2x1dGlvbiBoZXJlIGluIG9yZGVyIHRvIGJlXG4gICAqIHN1cmUgd2hhdCBpdCBpcy4gVGhlIHNlcnZlciBtYXkgbmVlZCB0byBiZSBjaGFuZ2VkXG4gICAqIHRvIGVuc3VyZSB0aGF0IHJlc3VsdHMgcmVnaW9ucyBhcmUgYWx3YXlzIHJldHVybmVkXG4gICAqIGF0IHJlc29sdXRpb24gPSAwXG4gICAqL1xuICByZXNvbHV0aW9uID0gMDtcbiAgY3JvcHBlZCA9IGZhbHNlO1xuICB0aWxlTnVtYmVyID0gMDtcbiAgdGlsZUNvb3JkaW5hdGVzOiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUcnVlIGZvciBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIFJPSXMgKHRoZSBpbnRlbnNpdHkgdG9vbCdzIGxpbmVzKS4gVGhlc2UgYXJlXG4gICAqICBOT1QgYW5ub3RhdGlvbiByZWdpb25zOiB0aGV5IG5ldmVyIGFwcGVhciBpbiB0aGUgUmVnaW9uIEVkaXRvciBhbmQgZWRpdG9yXG4gICAqICBvcGVyYXRpb25zIChzZWxlY3Qvc2F2ZS9kZWxldGUpIG11c3QgbmV2ZXIgdG91Y2ggdGhlbS4gKi9cbiAgaXNQcm9maWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmtpbmQgPT09ICdwcm9maWxlJztcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIC8vIGlmIHNoYXBlIGlzIHJlY3RhbmdsZVxuICAgIGlmICh0aGlzLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSkge1xuICAgICAgcmV0dXJuIGB4OiAke3RoaXMuYm91bmRzLnh9LCB5OiAke3RoaXMuYm91bmRzLnl9LFxuICAgICAgICAgICAgICB3aWR0aDogJHt0aGlzLmJvdW5kcy53aWR0aH0sIGhlaWdodDogJHt0aGlzLmJvdW5kcy5oZWlnaHR9YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbikge1xuICAgICAgbGV0IHBhdGggPSAnTSc7XG4gICAgICAvLyBkaXNwbGF5IGFzIHBhdGhcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib3VuZHMubnBvaW50czsgaSsrKSB7XG4gICAgICAgIGlmIChpIDwgdGhpcy5ib3VuZHMubnBvaW50cyAtIDEpIHtcbiAgICAgICAgICBwYXRoID0gYCR7cGF0aH0ke3RoaXMuYm91bmRzLnhwb2ludHNbaV19LCR7dGhpcy5ib3VuZHMueXBvaW50c1tpXX1MYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRoID0gYCR7cGF0aH0ke3RoaXMuYm91bmRzLnhwb2ludHNbaV19LCR7dGhpcy5ib3VuZHMueXBvaW50c1tpXX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3VuZHMuY2xvc2VkICE9PSBmYWxzZSkge1xuICAgICAgICBwYXRoICs9ICdaJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFNoYXBlU2VsZWN0aW9uIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4gICAqIGNyZWF0ZSBhIHNoYXBlIGluIFBsb3RseS5cbiAgICogQHBhcmFtIHNob3dSZWdpb25MYWJlbFxuICAgKiBAcmV0dXJuIFNoYXBlU2VsZWN0aW9uXG4gICAqL1xuICBnZXRTaGFwZShzaG93UmVnaW9uTGFiZWw6IGJvb2xlYW4gPSB0cnVlKTogU2hhcGVTZWxlY3Rpb24ge1xuICAgIGNvbnN0IHNoYXBlID0gbmV3IFNoYXBlU2VsZWN0aW9uKCk7XG4gICAgc2hhcGUuaWQgPSB0aGlzLmlkO1xuICAgIHNoYXBlLm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgc2hhcGUuZWRpdGFibGUgPSB0cnVlO1xuICAgIHNoYXBlLmxpbmUgPSB7XG4gICAgICBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3IgOiB0aGlzLnNoYXBlQ29sb3IsXG4gICAgICB3aWR0aDogMyxcbiAgICB9O1xuICAgIHNoYXBlLmZpbGVOYW1lID0gdGhpcy5maWxlbmFtZTtcbiAgICBpZiAodGhpcy5raW5kID09PSAncHJvZmlsZScpIHNoYXBlLmtpbmQgPSAncHJvZmlsZSc7XG4gICAgaWYgKHNob3dSZWdpb25MYWJlbCkge1xuICAgICAgc2hhcGUubGFiZWwgPSB7XG4gICAgICAgIHRleHQ6IGAke3RoaXMubGFiZWx9YCxcbiAgICAgICAgdGV4dHRlbXBsYXRlOiBgJHt0aGlzLmxhYmVsfWAsXG4gICAgICAgIGZvbnQ6IHsgY29sb3I6IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yIDogdGhpcy5zaGFwZUNvbG9yIH0sXG4gICAgICAgIHRleHRwb3NpdGlvbjogJ3RvcCBsZWZ0JyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYXBlLmxhYmVsID0ge307XG4gICAgfVxuICAgIHNoYXBlLmxlZ2VuZCA9IHRoaXMubGFiZWw7XG5cbiAgICBjb25zdCBibmRzID0gdGhpcy5ib3VuZHM7XG4gICAgaWYgKGJuZHMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5pc1JlY3RhbmdsZShibmRzKSkge1xuICAgICAgICBzaGFwZS50eXBlID0gJ3JlY3QnO1xuICAgICAgICBzaGFwZS54MCA9IGJuZHMueDtcbiAgICAgICAgc2hhcGUueTAgPSBibmRzLnk7XG4gICAgICAgIHNoYXBlLngxID0gYm5kcy54ICsgYm5kcy53aWR0aDtcbiAgICAgICAgc2hhcGUueTEgPSBibmRzLnkgKyBibmRzLmhlaWdodDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzUG9seWdvbihibmRzKSkge1xuICAgICAgICBzaGFwZS50eXBlID0gJ3BhdGgnO1xuICAgICAgICBsZXQgcGF0aCA9ICdNJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibmRzLm5wb2ludHM7IGkrKykge1xuICAgICAgICAgIGlmIChpIDwgYm5kcy5ucG9pbnRzIC0gMSkge1xuICAgICAgICAgICAgcGF0aCA9IGAke3BhdGh9JHtibmRzLnhwb2ludHNbaV19LCR7Ym5kcy55cG9pbnRzW2ldfUxgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXRoID0gYCR7cGF0aH0ke2JuZHMueHBvaW50c1tpXX0sJHtibmRzLnlwb2ludHNbaV19YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJuZHMuY2xvc2VkICE9PSBmYWxzZSkge1xuICAgICAgICAgIHBhdGggKz0gJ1onO1xuICAgICAgICB9XG4gICAgICAgIHNoYXBlLnBhdGggPSBwYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2hhcGU7XG4gIH1cblxuICBpc1JlY3RhbmdsZShibmRzOiBhbnkpOiBibmRzIGlzIFJlY3RhbmdsZSB7XG4gICAgcmV0dXJuICd4JyBpbiBibmRzICYmICd5JyBpbiBibmRzICYmICd3aWR0aCcgaW4gYm5kcyAmJiAnaGVpZ2h0JyBpbiBibmRzO1xuICB9XG5cbiAgaXNQb2x5Z29uKGJuZHM6IGFueSk6IGJuZHMgaXMgUG9seWdvbiB7XG4gICAgcmV0dXJuICducG9pbnRzJyBpbiBibmRzICYmICd4cG9pbnRzJyBpbiBibmRzICYmICd5cG9pbnRzJyBpbiBibmRzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWN0YW5nbGUge1xuICB4ID0gMDtcbiAgeSA9IDA7XG4gIHdpZHRoID0gMDtcbiAgaGVpZ2h0ID0gMDtcbn1cblxuZXhwb3J0IGNsYXNzIFBvbHlnb24ge1xuICBucG9pbnRzID0gMDtcbiAgeHBvaW50czogbnVtYmVyW10gPSBbXTtcbiAgeXBvaW50czogbnVtYmVyW10gPSBbXTtcbiAgY29vcmRpbmF0ZXM6IG51bWJlcltdW10gPSBbXTtcbiAgLyoqIGZhbHNlIGZvciBvcGVuIHBvbHlsaW5lczsgdHJ1ZSAoZGVmYXVsdCkgZm9yIGNsb3NlZCBwb2x5Z29ucyAqL1xuICBjbG9zZWQgPSB0cnVlO1xuICAvKipcbiAgICogV2hlbiB0cnVlIHRoZSB2ZXJ0aWNlcyBhcmUgdHJlYXRlZCBhcyBiZXppZXItc3BsaW5lICoqYW5jaG9ycyoqIGFuZCB0aGVcbiAgICogcmVnaW9uIGlzIHJlbmRlcmVkL2V4cG9ydGVkIGFzIGEgc21vb3RoIGN1cnZlIHRocm91Z2ggdGhlbS4gVGhlIHZlcnRpY2VzXG4gICAqIHN0YXkgdGhlIGVkaXRhYmxlIGFuY2hvcnMg4oCUIHRvZ2dsaW5nIHRoaXMgZmxhZyBpcyB0aGUgdG9CZXppZXJcbiAgICogKGB0cnVlYCkgLyB0b1BvbHlnb24gKGBmYWxzZWApLCB3aGljaCBvbmx5IGFkZC9yZW1vdmUgdGhlIGN1cnZlLCBuZXZlciBtb3ZlXG4gICAqIHRoZSBhbmNob3JzLiBHZW9KU09OIGtlZXBzIHRoZSBmbGF0dGVuZWQgY3VydmUgYXMgdGhlIGdlb21ldHJ5IChzbyBRdVBhdGhcbiAgICogcmVuZGVycyBpdCkgcGx1cyB0aGUgYW5jaG9ycyArIGhhbmRsZXMgKyBmbGFnIGluIHByb3BlcnRpZXMgKHNvIEpJVFxuICAgKiByb3VuZC10cmlwcyB0aGUgZWRpdGFibGUgYmV6aWVyKS5cbiAgICovXG4gIGJlemllciA9IGZhbHNlO1xuICAvKipcbiAgICogUGVyLWFuY2hvciBjdWJpYy1iZXppZXIgY29udHJvbC1wb2ludCBvZmZzZXRzLCAqKnJlbGF0aXZlKiogdG8gdGhlaXIgYW5jaG9yXG4gICAqIChzbyB0aGV5IHRyYW5zbGF0ZSB3aXRoIGl0KS4gUHJlc2VudCBvbmx5IGZvciBiZXppZXIgcmVnaW9uczsgaW5pdGlhbGlzZWRcbiAgICogZnJvbSB0aGUgQ2F0bXVsbC1Sb20gY29uc3RydWN0aW9uIChhIHNtb290aCBjdXJ2ZSkgd2hlbiBiZXppZXIgaXMgdHVybmVkIG9uLFxuICAgKiB0aGVuIGluZGl2aWR1YWxseSBlZGl0YWJsZSBieSBkcmFnZ2luZyB0aGUgaGFuZGxlcy4gYGhhbmRsZXNJbltpXWAgL1xuICAgKiBgaGFuZGxlc091dFtpXWAgYXJlIGBbZHgsIGR5XWAgZm9yIHZlcnRleCBgaWAuXG4gICAqL1xuICBoYW5kbGVzSW4/OiBudW1iZXJbXVtdO1xuICBoYW5kbGVzT3V0PzogbnVtYmVyW11bXTtcblxuICAvKipcbiAgICogSW50ZXJpb3IgcmluZ3MgKGhvbGVzKSDigJQgaml0LXVpIzg1LiBFYWNoIHJpbmcgaXMgYSBsaXN0IG9mIGBbeCwgeV1gXG4gICAqIGltYWdlLXBpeGVsIHBhaXJzIGluIHRoZSBTQU1FIGNsb3NlZC1wb2x5Z29uIGNvbnZlbnRpb24gYXMgdGhlIGV4dGVyaW9yXG4gICAqIChgY29vcmRpbmF0ZXNgKTogbm8gcmVwZWF0ZWQgY2xvc2luZyBwb2ludC4gUHJlc2VudCBvbmx5IG9uIGNsb3NlZCBwb2x5Z29ucy5cbiAgICogQSBwb2ludCBpbnNpZGUgdGhlIGV4dGVyaW9yICoqYW5kKiogaW5zaWRlIGFueSBob2xlIGlzIE9VVFNJREUgdGhlIHJlZ2lvblxuICAgKiAoZXZlbi1vZGQgcnVsZSkuIEFic2VudC9lbXB0eSA9PSBhIHNvbGlkIHBvbHlnb24gKHRoZSBwcmlvciBiZWhhdmlvdXIpLCBzb1xuICAgKiBldmVyeSBleGlzdGluZyByZWdpb24gaXMgdW5hZmZlY3RlZC5cbiAgICovXG4gIGhvbGVzPzogbnVtYmVyW11bXVtdO1xuXG4gIC8qKlxuICAgKiBQZXItaG9sZSBiw6l6aWVyIGNvbnRyb2wtcG9pbnQgb2Zmc2V0cywgcGFyYWxsZWwgdG8ge0BsaW5rIGhvbGVzfSAob25lIGVudHJ5IHBlciByaW5nLCBlYWNoIGFcbiAgICogbGlzdCBvZiBgW2R4LCBkeV1gIHBlciByaW5nIHZlcnRleCwgKipyZWxhdGl2ZSoqIHRvIHRoZSB2ZXJ0ZXgpLiBQcmVzZW50IG9ubHkgd2hlbiBgYmV6aWVyYCBpc1xuICAgKiBvbiBmb3IgYSBkb251dCDigJQgc2VlZGVkIGZyb20gdGhlIENhdG11bGwtUm9tIGRlZmF1bHQgYW5kIGluZGl2aWR1YWxseSBlZGl0YWJsZSwgZXhhY3RseSBsaWtlXG4gICAqIHRoZSBleHRlcmlvciB7QGxpbmsgaGFuZGxlc0lufS97QGxpbmsgaGFuZGxlc091dH0uIFNvIGEgZG9udXQgc21vb3RoZWQgdG8gYSBiw6l6aWVyIGN1cnZlcyBpdHNcbiAgICogaG9sZXMgdG9vIChqaXQtdWkjMTAyKS5cbiAgICovXG4gIGhvbGVIYW5kbGVzSW4/OiBudW1iZXJbXVtdW107XG4gIGhvbGVIYW5kbGVzT3V0PzogbnVtYmVyW11bXVtdO1xufVxuXG4vKipcbiAqIEEgcmVnaW9uIHdob3NlIGdlb21ldHJ5IGlzIHNldmVyYWwgZGlzam9pbnQgcGFydHMg4oCUIGUuZy4gdGhlIHJlc3VsdCBvZiBtZXJnaW5nXG4gKiB0d28gbm9uLXRvdWNoaW5nIHJlZ2lvbnMsIG9yIHRoZSBpbnZlcnNlIG9mIGEgYmxvYiAoaml0LXVpIzg1KS4gRWFjaCBwYXJ0IGlzIGFcbiAqIGNsb3NlZCB7QGxpbmsgUG9seWdvbn0gdGhhdCBtYXkgY2FycnkgaXRzIG93biBob2xlcywgc28gYSBNdWx0aVBvbHlnb25cbiAqIHJlcHJlc2VudHMgXCJzcGFyc2UgYml0cywgc29tZSB3aXRoIGRvbnV0IGhvbGVzXCIgYXMgYSBzaW5nbGUgcmVnaW9uLiBNYXBzIDE6MVxuICogb250byBhIEdlb0pTT04gYE11bHRpUG9seWdvbmAgKGFuZCBRdVBhdGgncyBnZW9tZXRyeSkuXG4gKlxuICogQSBzaW5nbGUtcGFydCBNdWx0aVBvbHlnb24gaXMgZXF1aXZhbGVudCB0byB0aGF0IFBvbHlnb247IGNhbGxlcnMgc2hvdWxkXG4gKiBwcmVmZXIgYSBwbGFpbiB7QGxpbmsgUG9seWdvbn0gZm9yIG9uZSBjb25uZWN0ZWQgcGFydC5cbiAqL1xuZXhwb3J0IGNsYXNzIE11bHRpUG9seWdvbiB7XG4gIC8qKiBPbmUgb3IgbW9yZSBkaXNqb2ludCBjbG9zZWQgcG9seWdvbnMgKGVhY2ggbWF5IGhhdmUgaG9sZXMpLiAqL1xuICBwb2x5Z29uczogUG9seWdvbltdID0gW107XG59XG5cbmV4cG9ydCB0eXBlIEJvdW5kcyA9XG4gIHwgUmVjdGFuZ2xlXG4gIHwgUG9seWdvblxuICB8IHtcbiAgICAgIHg/OiBudW1iZXI7XG4gICAgICB5PzogbnVtYmVyO1xuICAgICAgd2lkdGg/OiBudW1iZXI7XG4gICAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgICBucG9pbnRzPzogbnVtYmVyO1xuICAgICAgeHBvaW50cz86IG51bWJlcltdO1xuICAgICAgeXBvaW50cz86IG51bWJlcltdO1xuICAgIH07XG5cbi8qKlxuICogUmVidWlsZCBhIHBsYWluLW9iamVjdCBgYm91bmRzYCBhcyB0aGUgY2xhc3MgaW5zdGFuY2UgdGhlIHJlbmRlcmVycyBleHBlY3RcbiAqIChqaXQtdWkjMTI0KS5cbiAqXG4gKiBSZWdpb25zIHRoYXQgYXJyaXZlIGFzIEpTT04g4oCUIGEgaG9zdCdzIHNlcnZlciByZXNwb25zZSwgYSBgc3RydWN0dXJlZENsb25lYCxcbiAqIGFueXRoaW5nIHRoYXQgaGFzIGJlZW4gdGhyb3VnaCBgSlNPTi5wYXJzZWAg4oCUIGNhcnJ5IGEgYGJvdW5kc2AgdGhhdCBoYXMgdGhlXG4gKiByaWdodCAqZmllbGRzKiBidXQgbm90IHRoZSByaWdodCAqcHJvdG90eXBlKi4gVGhlIHJlbmRlcmVycyBkaXNhZ3JlZSBhYm91dFxuICogd2hldGhlciB0aGF0IGlzIGFjY2VwdGFibGU6IGBSZWdpb24uZ2V0U2hhcGUoKWAgKFBsb3RseSkgYW5kIHRoZSBuYXBhcmlcbiAqIG92ZXJsYXkgZHVjay10eXBlIHRoZSBib3VuZHMsIHdoaWxlIHRoZSBPcGVuU2VhZHJhZ29uIG92ZXJsYXkgZGlzY3JpbWluYXRlc1xuICogd2l0aCBgYm91bmRzIGluc3RhbmNlb2YgUmVjdGFuZ2xlYC4gU28gYSBKU09OIHJlZ2lvbiBkcmV3IGluIEhlYXRtYXAgbW9kZSBhbmRcbiAqIHNpbGVudGx5IHZhbmlzaGVkIGluIEltYWdlIG1vZGUuIGBpbnN0YW5jZW9mYCBhbHNvIGdhdGVzIHRoZSBzdG9yZSdzIG93blxuICogZ2VvbWV0cnkgZGUtZHVwbGljYXRpb24sIGBtb3ZlUmVnaW9uYCwgYW5kIHRoZSBHZW9KU09OIGV4cG9ydCDigJQgYSBKU09OIHJlZ2lvblxuICogaXMgdW5kcmFnZ2FibGUgYW5kIGFic2VudCBmcm9tIGEgc2F2ZSBpbiAqZXZlcnkqIG1vZGUuXG4gKlxuICogUmF0aGVyIHRoYW4gZHVjay10eXBlIH4yMCBjYWxsIHNpdGVzLCB0aGUgc3RvcmUgbm9ybWFsaXplcyBoZXJlIG9uIHRoZSB3YXkgaW4sXG4gKiBzbyBldmVyeXRoaW5nIGRvd25zdHJlYW0gY2FuIGtlZXAgcmVseWluZyBvbiBgaW5zdGFuY2VvZmAuIFZhbHVlcyB0aGF0IGFyZVxuICogYWxyZWFkeSBpbnN0YW5jZXMgYXJlIHJldHVybmVkICoqYnkgcmVmZXJlbmNlKiosIHVudG91Y2hlZDogb3ZlcmxheXMgYW5kIHRvb2xzXG4gKiBob2xkIG9udG8gdGhlIGJvdW5kcyB0aGV5IGNyZWF0ZWQgYW5kIG11dGF0ZSB0aGVtIGluIHBsYWNlIGR1cmluZyBhIGRyYWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlQm91bmRzKGJvdW5kczogYW55KTogUmVjdGFuZ2xlIHwgUG9seWdvbiB8IE11bHRpUG9seWdvbiB8IG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAoXG4gICAgIWJvdW5kcyB8fFxuICAgIGJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fFxuICAgIGJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24gfHxcbiAgICBib3VuZHMgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb25cbiAgKSB7XG4gICAgcmV0dXJuIGJvdW5kcztcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShib3VuZHMucG9seWdvbnMpKSB7XG4gICAgY29uc3QgbXVsdGkgPSBuZXcgTXVsdGlQb2x5Z29uKCk7XG4gICAgbXVsdGkucG9seWdvbnMgPSBib3VuZHMucG9seWdvbnMubWFwKChwYXJ0OiBhbnkpID0+IGh5ZHJhdGVQb2x5Z29uKHBhcnQpKTtcbiAgICByZXR1cm4gbXVsdGk7XG4gIH1cbiAgaWYgKCducG9pbnRzJyBpbiBib3VuZHMgfHwgJ3hwb2ludHMnIGluIGJvdW5kcykge1xuICAgIHJldHVybiBoeWRyYXRlUG9seWdvbihib3VuZHMpO1xuICB9XG4gIGlmICgnd2lkdGgnIGluIGJvdW5kcyAmJiAnaGVpZ2h0JyBpbiBib3VuZHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgUmVjdGFuZ2xlKCksIGJvdW5kcyk7XG4gIH1cbiAgLy8gTm90aGluZyByZWNvZ25pc2FibGUg4oCUIGhhbmQgaXQgYmFjayByYXRoZXIgdGhhbiBjb2VyY2UgaXQgaW50byB0aGUgd3JvbmdcbiAgLy8gZ2VvbWV0cnkuIEl0IHJlbmRlcnMgbm93aGVyZSBlaXRoZXIgd2F5LCBidXQgYSBjYWxsZXIgY2FuIHN0aWxsIGluc3BlY3QgaXQuXG4gIHJldHVybiBib3VuZHM7XG59XG5cbi8qKiB7QGxpbmsgaHlkcmF0ZUJvdW5kc30gZm9yIG9uZSBwb2x5Z29uLCBkZXJpdmluZyB0aGUgZmllbGRzIGEgbGVhbiBzZXJpYWxpemVyXG4gKiAgb21pdHM6IEpJVCdzIEphdmEgYFBvbHlnb25TZXJpYWxpemVyYCB3cml0ZXMgb25seSBgbnBvaW50c2AvYHhwb2ludHNgL1xuICogIGB5cG9pbnRzYCwgd2hpbGUgdGhlIEdlb0pTT04gZXhwb3J0IHJlYWRzIGBjb29yZGluYXRlc2AgYW5kIHRoZSBvdmVybGF5cyByZWFkXG4gKiAgYGNsb3NlZGAuICovXG5mdW5jdGlvbiBoeWRyYXRlUG9seWdvbihyYXc6IGFueSk6IFBvbHlnb24ge1xuICBpZiAocmF3IGluc3RhbmNlb2YgUG9seWdvbikgcmV0dXJuIHJhdztcbiAgY29uc3QgcG9seWdvbjogUG9seWdvbiA9IE9iamVjdC5hc3NpZ24obmV3IFBvbHlnb24oKSwgcmF3KTtcbiAgcG9seWdvbi54cG9pbnRzID0gWy4uLihyYXcueHBvaW50cyA/PyBbXSldO1xuICBwb2x5Z29uLnlwb2ludHMgPSBbLi4uKHJhdy55cG9pbnRzID8/IFtdKV07XG4gIHBvbHlnb24ubnBvaW50cyA9IHJhdy5ucG9pbnRzID8/IHBvbHlnb24ueHBvaW50cy5sZW5ndGg7XG4gIHBvbHlnb24uY29vcmRpbmF0ZXMgPSByYXcuY29vcmRpbmF0ZXMgPz8gcG9seWdvbi54cG9pbnRzLm1hcCgoeCwgaSkgPT4gW3gsIHBvbHlnb24ueXBvaW50c1tpXV0pO1xuICBwb2x5Z29uLmNsb3NlZCA9IHJhdy5jbG9zZWQgPz8gdHJ1ZTtcbiAgcmV0dXJuIHBvbHlnb247XG59XG4iXX0=
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvcmVnaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9DOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sTUFBTTtJQUFuQjtRQU9FLFdBQU0sR0FBK0MsSUFBSSxDQUFDO1FBNkMxRDs7O3FFQUc2RDtRQUM3RCxNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sZUFBVSxHQUFJLFNBQVMsQ0FBQztRQUN4QixvRkFBb0Y7UUFDcEYsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEI7Ozs7Ozs7OztXQVNHO1FBQ0gsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLG9GQUFvRjtRQUNwRixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLG9GQUFvRjtRQUNwRixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2Ysb0JBQWUsR0FBb0IsSUFBSSxDQUFDO0lBNEUxQyxDQUFDO0lBMUVDOztpRUFFNkQ7SUFDN0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxNQUFNLFlBQVksU0FBUyxFQUFFLENBQUM7WUFDckMsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt1QkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLGFBQWEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RSxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxZQUFZLE9BQU8sRUFBRSxDQUFDO1lBQzFDLE9BQU8saUJB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QyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEcsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztJQUNwQyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2hhcGVTZWxlY3Rpb24gfSBmcm9tICcuL3NoYXBlJztcbmltcG9ydCB7IHZlcnRpY2VzVG9TdmdQYXRoIH0gZnJvbSAnLi9nZW9tZXRyeSc7XG5cbi8qKlxuICogT25lIGFubm90YXRpb24gcmVnaW9uIOKAlCB0aGUgYmFja2VuZC1uZXV0cmFsIG1vZGVsIGV2ZXJ5IHJlbmRlcmVyIChQbG90bHksXG4gKiBPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpLCB0aGUgUmVnaW9uU3RvcmUsIHRoZSBSZWdpb24gRWRpdG9yIGFuZCB0aGVcbiAqIEdlb0pTT04vUXVQYXRoIGltcG9ydC9leHBvcnQgc2hhcmUuXG4gKlxuICogR2VvbWV0cnkgbGl2ZXMgaW4ge0BsaW5rIGJvdW5kc30sIGluIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZS1waXhlbFxuICogY29vcmRpbmF0ZXMgKHggcmlnaHQsIHkgZG93bikgb2Ygc2xpY2Uge0BsaW5rIHp9LiBBIHJlZ2lvbiB3aXRoIG5vIGJvdW5kc1xuICogKGBudWxsYC9hYnNlbnQpIGlzIGtlcHQgYnV0IGRyYXdzIG5vd2hlcmUuIFJlZ2lvbnMgdGhhdCBhcnJpdmUgYXMgSlNPTiBhcmVcbiAqIHJlYnVpbHQgaW50byBjbGFzcyBpbnN0YW5jZXMgYnkge0BsaW5rIGh5ZHJhdGVCb3VuZHN9IG9uIHRoZWlyIHdheSBpbnRvIHRoZVxuICogc3RvcmUsIHNvIGBib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGVgIGV0Yy4gY2FuIGJlIHJlbGllZCBvbiBkb3duc3RyZWFtLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaW9uIHtcbiAgLyoqIFN0YWJsZSwgdW5pcXVlIGlkZW50aXR5IGZvciBzZWxlY3Rpb24gYW5kIGVxdWFsaXR5LiBNaW50ZWQgYnkgdGhlXG4gICAqICBSZWdpb25TdG9yZSB3aGVuIGEgcmVnaW9uIGZpcnN0IGVudGVycyBpdC4gTmV2ZXIgZGVyaXZlZCBmcm9tIGFycmF5XG4gICAqICBpbmRleCDigJQgbmFtZSBjb2xsaXNpb25zIGFjcm9zcyBkZWxldGUvYWRkIGN5Y2xlcyBtdXN0IG5vdCBicmVhayBQcmltZU5HXG4gICAqICByb3cgc2VsZWN0aW9uLiAqL1xuICBpZCE6IG51bWJlcjtcbiAgbmFtZSE6IHN0cmluZztcbiAgYm91bmRzPzogUmVjdGFuZ2xlIHwgUG9seWdvbiB8IE11bHRpUG9seWdvbiB8IG51bGwgPSBudWxsO1xuICAvKiogcHJvZmlsZSA9IGFuIGludGVuc2l0eS1wcm9maWxlIGxpbmUgUk9JOyByZW5kZXJlZC9kcmFnZ2VkIGxpa2UgYSByZWdpb24gYnV0XG4gICAqICBleGNsdWRlZCBmcm9tIHRoZSBSZWdpb25zIHRhYiBhbmQgZXhwb3J0cy4gVXNlIGBpc1Byb2ZpbGUoKWAgdG8gdGVzdCBpdCDigJRcbiAgICogIGl0J3MgdGhlIGNhbm9uaWNhbCBtYXJrZXIgdGhhdCBzZXBhcmF0ZXMgaW50ZW5zaXR5IGxpbmVzIChvd25lZCBieSB0aGVcbiAgICogIGludGVuc2l0eSB0b29sLCBzYW1wbGVkIGludG8gdGhlIGluc2V0KSBmcm9tIGFubm90YXRpb24gcmVnaW9ucyAob3duZWQgYnlcbiAgICogIHRoZSBSZWdpb24gRWRpdG9yKS4gQm90aCBiYWNrZW5kcyAoUGxvdGx5LCBPU0QpIGhvbm91ciBpdC4gKi9cbiAga2luZD86ICdwcm9maWxlJztcbiAgLyoqXG4gICAqIFdoaWNoIGF1dG9tYXRlZCB0b29sIHByb2R1Y2VkIHRoaXMgcmVnaW9uLCBlLmcuIGAneW9sbydgLiBBYnNlbnQgb25cbiAgICogYW55dGhpbmcgdGhlIHVzZXIgZHJldy5cbiAgICpcbiAgICogTGV0cyBhIHRvb2wgcmVwbGFjZSBpdHMgKm93biogcHJldmlvdXMgb3V0cHV0IG9uIGEgcmUtcnVuIHdpdGhvdXQgdG91Y2hpbmdcbiAgICogaGFuZC1kcmF3biB3b3JrIG9yIGFub3RoZXIgdG9vbCdzIHJlc3VsdHMg4oCUIHdoaWNoIG1hdHRlcnMgd2hpbGUgdHVuaW5nXG4gICAqIHBhcmFtZXRlcnMsIHdoZXJlIGV2ZXJ5IHJ1biB3b3VsZCBvdGhlcndpc2UgcGlsZSBvbnRvIHRoZSBsYXN0LiBJZGVudGl0eVxuICAgKiBjb21wYXJpc29uIGlzIG5vdCBhIHN1YnN0aXR1dGU6IHJlZ2lvbnMgbWF5IGJlIHJlLW1pbnRlZCBhcyB0aGV5IHBhc3NcbiAgICogdGhyb3VnaCB0aGUgc3RvcmUsIHNvIHRoZSBtYXJrZXIgaGFzIHRvIHRyYXZlbCB3aXRoIHRoZSBkYXRhLlxuICAgKi9cbiAgc291cmNlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBHZW9KU09OIGZlYXR1cmUgdGhpcyByZWdpb24gd2FzIHJlYWQgZnJvbSAodGhlIGZlYXR1cmUncyBgaWRgLCBlbHNlXG4gICAqIGBwcm9wZXJ0aWVzLmlkYDsgZm9yIGEgdGlsZWQgcmVnaW9uIHNvdXJjZSwgZWxzZSBpdHMgcG9zaXRpb24gaW4gdGhlIGZpbGUpLiBXcml0dGVuIGJhY2tcbiAgICogYXMgdGhlIGZlYXR1cmUncyBgaWRgIG9uIGV4cG9ydCwgc28gYSByZWdpb24ga2VlcHMgaXRzIGlkZW50aXR5IHRocm91Z2ggYSBzYXZlLiBBIHJlZ2lvblxuICAgKiB0YWtlbiBvdXQgb2YgYSByZWdpb24gc291cmNlIGZvciBlZGl0aW5nIGNhcnJpZXMgaXQsIGFuZCB0aGUgc291cmNlIHN0b3BzIGRyYXdpbmcgdGhhdFxuICAgKiBmZWF0dXJlIHdoaWxlIGl0IGRvZXMuXG4gICAqL1xuICBzb3VyY2VJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIEEgcmVnaW9uIHNvdXJjZSBmZWF0dXJlJ3MgYXJlYSAoaW1hZ2UgcHjCsikgd2hpbGUgaXQgc3RhbmRzIGluIGZvciB0aGUgZmVhdHVyZSBpbiB0aGUgUmVnaW9uXG4gICAqIEVkaXRvcidzIHRhYmxlOiBzdWNoIGEgcm93IGhhcyBubyBnZW9tZXRyeSB1bnRpbCB0aGUgZmVhdHVyZSBpcyB0YWtlbi5cbiAgICovXG4gIHNvdXJjZUFyZWE/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZSdzIG90aGVyIEdlb0pTT04gcHJvcGVydGllcyAoZXZlcnl0aGluZyBidXQgdGhlIG9uZXMgU0lWIHJlYWRzIGFuZCB3cml0ZXM6XG4gICAqIGBjbGFzc2lmaWNhdGlvbmAsIGBpZGAgYW5kIHRoZSBiw6l6aWVyIGZpZWxkcyksIGNhcnJpZWQgdGhyb3VnaCB1bnRvdWNoZWQgc28gYSBzYXZlIGtlZXBzXG4gICAqIHRoZW0sIGUuZy4gYW4gYXRsYXMgc3RydWN0dXJlJ3MgYWNyb255bSBhbmQgaWQuXG4gICAqL1xuICBwcm9wZXJ0aWVzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBjb2xvcj86IHN0cmluZzsgLy8gaGV4IHN0cmluZywgZS5nLiAnI1JSR0dCQicgKHRoZSBoaXN0b3JpY2FsIFwiW3IsIGcsIGJdXCIgbm90ZSBpcyBzdGFsZSlcbiAgLy8gY2xhc3MgbGFiZWxcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHVzZXIgc2V0IHRoaXMgcmVnaW9uJ3MgY29sb3VyIGV4cGxpY2l0bHkgKFJlZ2lvbiBFZGl0b3IgQ29sb3JcbiAgICogIGNvbHVtbikuIFByZXNldCBjb2xvdXIgcmVzb2x1dGlvbiAoaml0LXVpIzcwKSBza2lwcyBvdmVycmlkZGVuIHJlZ2lvbnMgc28gYVxuICAgKiAgbWFudWFsIGNvbG91ciBpcyBub3QgY2xvYmJlcmVkIHdoZW4gcHJlc2V0cyBhcmUgKHJlKWFwcGxpZWQgb24gbG9hZC9pbXBvcnQuICovXG4gIGNvbG9yT3ZlcnJpZGRlbj86IGJvb2xlYW47XG4gIGZpbGVuYW1lPzogc3RyaW5nO1xuICAvKiogWmVyby1iYXNlZCB6LXNsaWNlIHRoaXMgcmVnaW9uIGJlbG9uZ3MgdG8gd2l0aGluIGEgc3RhY2sg4oCUIG1pcnJvcnNcbiAgICogIFF1UGF0aCdzIGBnZW9tZXRyeS5wbGFuZS56YCAoYSBtaXNzaW5nIHBsYW5lIC8gZGVmYXVsdCBwbGFuZSByZWFkcyBiYWNrIGFzXG4gICAqICAwKS4gVXNlZCB0byBwbGFjZS9maWx0ZXIgUk9JcyBwZXIgc2xpY2U7IDAgZm9yIGEgcGxhaW4gc2luZ2xlLXBsYW5lIGltYWdlXG4gICAqICBvciBhIHJlZ2lvbiBkcmF3biB3aXRob3V0IGEgc2xpY2UgY29udGV4dCAoaml0LXVpIzkzKS4gKi9cbiAgeiA9IDA7XG4gIHNoYXBlQ29sb3I/ID0gJyMwMEZGRkYnO1xuICAvKiogQGRlcHJlY2F0ZWQgVW51c2VkIGJ5IHRoZSBsaWJyYXJ5OyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWlub3IgcmVsZWFzZS4gKi9cbiAgYnl0ZXNQZXJQaXhlbCA9IDg7XG4gIC8qKlxuICAgKiByZXNvbHV0aW9uIGlzIHRoZSByZXNvbHV0aW9uIGF0IHdoaWNoIHRoZSByZWdpb25cbiAgICogd2FzIGZvdW5kLiBJbiBvcmRlciB0byBnZXQgaXQgaW4gdGhlIGZ1bGwgaW1hZ2VcbiAgICogY29vcmRpbmF0ZXMgaXQgd2lsbCBub3JtYWxseSBiZSAwLiBIb3dldmVyIGlmXG4gICAqIHRoZXJlIGlzIGEgbWlzdGFrZSB3aXRoIHRoZSByZXNvbHV0aW9uIGl0IG1heSBub3RcbiAgICogYmUuIFdlIHJldHVybiB0aGUgcmVzb2x1dGlvbiBoZXJlIGluIG9yZGVyIHRvIGJlXG4gICAqIHN1cmUgd2hhdCBpdCBpcy4gVGhlIHNlcnZlciBtYXkgbmVlZCB0byBiZSBjaGFuZ2VkXG4gICAqIHRvIGVuc3VyZSB0aGF0IHJlc3VsdHMgcmVnaW9ucyBhcmUgYWx3YXlzIHJldHVybmVkXG4gICAqIGF0IHJlc29sdXRpb24gPSAwXG4gICAqL1xuICByZXNvbHV0aW9uID0gMDtcbiAgLyoqIEBkZXByZWNhdGVkIFVudXNlZCBieSB0aGUgbGlicmFyeTsgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UuICovXG4gIGNyb3BwZWQgPSBmYWxzZTtcbiAgLyoqIEBkZXByZWNhdGVkIFVudXNlZCBieSB0aGUgbGlicmFyeTsgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UuICovXG4gIHRpbGVOdW1iZXIgPSAwO1xuICB0aWxlQ29vcmRpbmF0ZXM6IG51bWJlcltdIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRydWUgZm9yIGludGVuc2l0eS1wcm9maWxlIGxpbmUgUk9JcyAodGhlIGludGVuc2l0eSB0b29sJ3MgbGluZXMpLiBUaGVzZSBhcmVcbiAgICogIE5PVCBhbm5vdGF0aW9uIHJlZ2lvbnM6IHRoZXkgbmV2ZXIgYXBwZWFyIGluIHRoZSBSZWdpb24gRWRpdG9yIGFuZCBlZGl0b3JcbiAgICogIG9wZXJhdGlvbnMgKHNlbGVjdC9zYXZlL2RlbGV0ZSkgbXVzdCBuZXZlciB0b3VjaCB0aGVtLiAqL1xuICBpc1Byb2ZpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMua2luZCA9PT0gJ3Byb2ZpbGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZGVidWcgc3RyaW5nOiB0aGUgcmVjdGFuZ2xlJ3MgYm94LCBvciB0aGUgcG9seWdvbidzIFNWRyBwYXRoLlxuICAgKiBAZGVwcmVjYXRlZCBVbnVzZWQgYnkgdGhlIGxpYnJhcnk7IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtaW5vciByZWxlYXNlLlxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgaWYgKHRoaXMuYm91bmRzIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7XG4gICAgICByZXR1cm4gYHg6ICR7dGhpcy5ib3VuZHMueH0sIHk6ICR7dGhpcy5ib3VuZHMueX0sXG4gICAgICAgICAgICAgIHdpZHRoOiAke3RoaXMuYm91bmRzLndpZHRofSwgaGVpZ2h0OiAke3RoaXMuYm91bmRzLmhlaWdodH1gO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uKSB7XG4gICAgICByZXR1cm4gdmVydGljZXNUb1N2Z1BhdGgodGhpcy5ib3VuZHMueHBvaW50cywgdGhpcy5ib3VuZHMueXBvaW50cywgdGhpcy5ib3VuZHMuY2xvc2VkICE9PSBmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgU2hhcGVTZWxlY3Rpb24gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG9cbiAgICogY3JlYXRlIGEgc2hhcGUgaW4gUGxvdGx5LlxuICAgKiBAcGFyYW0gc2hvd1JlZ2lvbkxhYmVsXG4gICAqIEByZXR1cm4gU2hhcGVTZWxlY3Rpb25cbiAgICovXG4gIGdldFNoYXBlKHNob3dSZWdpb25MYWJlbDogYm9vbGVhbiA9IHRydWUpOiBTaGFwZVNlbGVjdGlvbiB7XG4gICAgY29uc3Qgc2hhcGUgPSBuZXcgU2hhcGVTZWxlY3Rpb24oKTtcbiAgICBzaGFwZS5pZCA9IHRoaXMuaWQ7XG4gICAgc2hhcGUubmFtZSA9IHRoaXMubmFtZTtcbiAgICBzaGFwZS5lZGl0YWJsZSA9IHRydWU7XG4gICAgc2hhcGUubGluZSA9IHtcbiAgICAgIGNvbG9yOiB0aGlzLmNvbG9yID8gdGhpcy5jb2xvciA6IHRoaXMuc2hhcGVDb2xvcixcbiAgICAgIHdpZHRoOiAzLFxuICAgIH07XG4gICAgc2hhcGUuZmlsZU5hbWUgPSB0aGlzLmZpbGVuYW1lO1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdwcm9maWxlJykgc2hhcGUua2luZCA9ICdwcm9maWxlJztcbiAgICBpZiAoc2hvd1JlZ2lvbkxhYmVsKSB7XG4gICAgICBzaGFwZS5sYWJlbCA9IHtcbiAgICAgICAgdGV4dDogYCR7dGhpcy5sYWJlbH1gLFxuICAgICAgICB0ZXh0dGVtcGxhdGU6IGAke3RoaXMubGFiZWx9YCxcbiAgICAgICAgZm9udDogeyBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3IgOiB0aGlzLnNoYXBlQ29sb3IgfSxcbiAgICAgICAgdGV4dHBvc2l0aW9uOiAndG9wIGxlZnQnLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hhcGUubGFiZWwgPSB7fTtcbiAgICB9XG4gICAgc2hhcGUubGVnZW5kID0gdGhpcy5sYWJlbDtcblxuICAgIGNvbnN0IGJuZHMgPSB0aGlzLmJvdW5kcztcbiAgICBpZiAoYm5kcyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzUmVjdGFuZ2xlKGJuZHMpKSB7XG4gICAgICAgIHNoYXBlLnR5cGUgPSAncmVjdCc7XG4gICAgICAgIHNoYXBlLngwID0gYm5kcy54O1xuICAgICAgICBzaGFwZS55MCA9IGJuZHMueTtcbiAgICAgICAgc2hhcGUueDEgPSBibmRzLnggKyBibmRzLndpZHRoO1xuICAgICAgICBzaGFwZS55MSA9IGJuZHMueSArIGJuZHMuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNQb2x5Z29uKGJuZHMpKSB7XG4gICAgICAgIHNoYXBlLnR5cGUgPSAncGF0aCc7XG4gICAgICAgIHNoYXBlLnBhdGggPSB2ZXJ0aWNlc1RvU3ZnUGF0aChibmRzLnhwb2ludHMsIGJuZHMueXBvaW50cywgYm5kcy5jbG9zZWQgIT09IGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYXBlO1xuICB9XG5cbiAgaXNSZWN0YW5nbGUoYm5kczogYW55KTogYm5kcyBpcyBSZWN0YW5nbGUge1xuICAgIHJldHVybiAneCcgaW4gYm5kcyAmJiAneScgaW4gYm5kcyAmJiAnd2lkdGgnIGluIGJuZHMgJiYgJ2hlaWdodCcgaW4gYm5kcztcbiAgfVxuXG4gIGlzUG9seWdvbihibmRzOiBhbnkpOiBibmRzIGlzIFBvbHlnb24ge1xuICAgIHJldHVybiAnbnBvaW50cycgaW4gYm5kcyAmJiAneHBvaW50cycgaW4gYm5kcyAmJiAneXBvaW50cycgaW4gYm5kcztcbiAgfVxufVxuXG4vKiogQW4gYXhpcy1hbGlnbmVkIGJveCBpbiBpbWFnZS1waXhlbCBjb29yZGluYXRlczogKGB4YCwgYHlgKSBpcyB0aGUgdG9wLWxlZnRcbiAqICAobWluaW11bSkgY29ybmVyLCBgd2lkdGhgL2BoZWlnaHRgIGV4dGVuZCByaWdodC9kb3duLiAqL1xuZXhwb3J0IGNsYXNzIFJlY3RhbmdsZSB7XG4gIHggPSAwO1xuICB5ID0gMDtcbiAgd2lkdGggPSAwO1xuICBoZWlnaHQgPSAwO1xufVxuXG4vKipcbiAqIEEgcG9seWdvbiBvciBvcGVuIHBvbHlsaW5lIGluIGltYWdlLXBpeGVsIGNvb3JkaW5hdGVzLCBvcHRpb25hbGx5IHdpdGggaG9sZXNcbiAqIGFuZCBzbW9vdGhlZCBpbnRvIGEgYsOpemllciBjdXJ2ZS5cbiAqXG4gKiBUaGUgdmVydGljZXMgYXJlIHN0b3JlZCB0d2ljZSBhbmQgbXVzdCBhZ3JlZTogYXMgdGhlIHBhcmFsbGVsIGB4cG9pbnRzYCAvXG4gKiBgeXBvaW50c2AgYXJyYXlzIChsZW5ndGggYG5wb2ludHNgOyB0aGUgSmF2YS9KSVQgd2lyZSBzaGFwZSkgYW5kIGFzXG4gKiBgY29vcmRpbmF0ZXNgIGBbeCwgeV1gIHBhaXJzICh3aGF0IEdlb0pTT04gZXhwb3J0IHJlYWRzKS4gVGhlIHJpbmcgaXNcbiAqIGltcGxpY2l0bHkgY2xvc2VkIOKAlCB0aGUgZmlyc3QgdmVydGV4IGlzIG5vdCByZXBlYXRlZCBhdCB0aGUgZW5kLlxuICovXG5leHBvcnQgY2xhc3MgUG9seWdvbiB7XG4gIG5wb2ludHMgPSAwO1xuICB4cG9pbnRzOiBudW1iZXJbXSA9IFtdO1xuICB5cG9pbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb29yZGluYXRlczogbnVtYmVyW11bXSA9IFtdO1xuICAvKiogZmFsc2UgZm9yIG9wZW4gcG9seWxpbmVzOyB0cnVlIChkZWZhdWx0KSBmb3IgY2xvc2VkIHBvbHlnb25zICovXG4gIGNsb3NlZCA9IHRydWU7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUgdGhlIHZlcnRpY2VzIGFyZSB0cmVhdGVkIGFzIGJlemllci1zcGxpbmUgKiphbmNob3JzKiogYW5kIHRoZVxuICAgKiByZWdpb24gaXMgcmVuZGVyZWQvZXhwb3J0ZWQgYXMgYSBzbW9vdGggY3VydmUgdGhyb3VnaCB0aGVtLiBUaGUgdmVydGljZXNcbiAgICogc3RheSB0aGUgZWRpdGFibGUgYW5jaG9ycyDigJQgdG9nZ2xpbmcgdGhpcyBmbGFnIGlzIHRoZSB0b0JlemllclxuICAgKiAoYHRydWVgKSAvIHRvUG9seWdvbiAoYGZhbHNlYCksIHdoaWNoIG9ubHkgYWRkL3JlbW92ZSB0aGUgY3VydmUsIG5ldmVyIG1vdmVcbiAgICogdGhlIGFuY2hvcnMuIEdlb0pTT04ga2VlcHMgdGhlIGZsYXR0ZW5lZCBjdXJ2ZSBhcyB0aGUgZ2VvbWV0cnkgKHNvIFF1UGF0aFxuICAgKiByZW5kZXJzIGl0KSBwbHVzIHRoZSBhbmNob3JzICsgaGFuZGxlcyArIGZsYWcgaW4gcHJvcGVydGllcyAoc28gSklUXG4gICAqIHJvdW5kLXRyaXBzIHRoZSBlZGl0YWJsZSBiZXppZXIpLlxuICAgKi9cbiAgYmV6aWVyID0gZmFsc2U7XG4gIC8qKlxuICAgKiBQZXItYW5jaG9yIGN1YmljLWJlemllciBjb250cm9sLXBvaW50IG9mZnNldHMsICoqcmVsYXRpdmUqKiB0byB0aGVpciBhbmNob3JcbiAgICogKHNvIHRoZXkgdHJhbnNsYXRlIHdpdGggaXQpLiBQcmVzZW50IG9ubHkgZm9yIGJlemllciByZWdpb25zOyBpbml0aWFsaXNlZFxuICAgKiBmcm9tIHRoZSBDYXRtdWxsLVJvbSBjb25zdHJ1Y3Rpb24gKGEgc21vb3RoIGN1cnZlKSB3aGVuIGJlemllciBpcyB0dXJuZWQgb24sXG4gICAqIHRoZW4gaW5kaXZpZHVhbGx5IGVkaXRhYmxlIGJ5IGRyYWdnaW5nIHRoZSBoYW5kbGVzLiBgaGFuZGxlc0luW2ldYCAvXG4gICAqIGBoYW5kbGVzT3V0W2ldYCBhcmUgYFtkeCwgZHldYCBmb3IgdmVydGV4IGBpYC5cbiAgICovXG4gIGhhbmRsZXNJbj86IG51bWJlcltdW107XG4gIGhhbmRsZXNPdXQ/OiBudW1iZXJbXVtdO1xuXG4gIC8qKlxuICAgKiBJbnRlcmlvciByaW5ncyAoaG9sZXMpIOKAlCBqaXQtdWkjODUuIEVhY2ggcmluZyBpcyBhIGxpc3Qgb2YgYFt4LCB5XWBcbiAgICogaW1hZ2UtcGl4ZWwgcGFpcnMgaW4gdGhlIFNBTUUgY2xvc2VkLXBvbHlnb24gY29udmVudGlvbiBhcyB0aGUgZXh0ZXJpb3JcbiAgICogKGBjb29yZGluYXRlc2ApOiBubyByZXBlYXRlZCBjbG9zaW5nIHBvaW50LiBQcmVzZW50IG9ubHkgb24gY2xvc2VkIHBvbHlnb25zLlxuICAgKiBBIHBvaW50IGluc2lkZSB0aGUgZXh0ZXJpb3IgKiphbmQqKiBpbnNpZGUgYW55IGhvbGUgaXMgT1VUU0lERSB0aGUgcmVnaW9uXG4gICAqIChldmVuLW9kZCBydWxlKS4gQWJzZW50L2VtcHR5ID09IGEgc29saWQgcG9seWdvbiAodGhlIHByaW9yIGJlaGF2aW91ciksIHNvXG4gICAqIGV2ZXJ5IGV4aXN0aW5nIHJlZ2lvbiBpcyB1bmFmZmVjdGVkLlxuICAgKi9cbiAgaG9sZXM/OiBudW1iZXJbXVtdW107XG5cbiAgLyoqXG4gICAqIFBlci1ob2xlIGLDqXppZXIgY29udHJvbC1wb2ludCBvZmZzZXRzLCBwYXJhbGxlbCB0byB7QGxpbmsgaG9sZXN9IChvbmUgZW50cnkgcGVyIHJpbmcsIGVhY2ggYVxuICAgKiBsaXN0IG9mIGBbZHgsIGR5XWAgcGVyIHJpbmcgdmVydGV4LCAqKnJlbGF0aXZlKiogdG8gdGhlIHZlcnRleCkuIFByZXNlbnQgb25seSB3aGVuIGBiZXppZXJgIGlzXG4gICAqIG9uIGZvciBhIGRvbnV0IOKAlCBzZWVkZWQgZnJvbSB0aGUgQ2F0bXVsbC1Sb20gZGVmYXVsdCBhbmQgaW5kaXZpZHVhbGx5IGVkaXRhYmxlLCBleGFjdGx5IGxpa2VcbiAgICogdGhlIGV4dGVyaW9yIHtAbGluayBoYW5kbGVzSW59L3tAbGluayBoYW5kbGVzT3V0fS4gU28gYSBkb251dCBzbW9vdGhlZCB0byBhIGLDqXppZXIgY3VydmVzIGl0c1xuICAgKiBob2xlcyB0b28gKGppdC11aSMxMDIpLlxuICAgKi9cbiAgaG9sZUhhbmRsZXNJbj86IG51bWJlcltdW11bXTtcbiAgaG9sZUhhbmRsZXNPdXQ/OiBudW1iZXJbXVtdW107XG59XG5cbi8qKlxuICogQSByZWdpb24gd2hvc2UgZ2VvbWV0cnkgaXMgc2V2ZXJhbCBkaXNqb2ludCBwYXJ0cyDigJQgZS5nLiB0aGUgcmVzdWx0IG9mIG1lcmdpbmdcbiAqIHR3byBub24tdG91Y2hpbmcgcmVnaW9ucywgb3IgdGhlIGludmVyc2Ugb2YgYSBibG9iIChqaXQtdWkjODUpLiBFYWNoIHBhcnQgaXMgYVxuICogY2xvc2VkIHtAbGluayBQb2x5Z29ufSB0aGF0IG1heSBjYXJyeSBpdHMgb3duIGhvbGVzLCBzbyBhIE11bHRpUG9seWdvblxuICogcmVwcmVzZW50cyBcInNwYXJzZSBiaXRzLCBzb21lIHdpdGggZG9udXQgaG9sZXNcIiBhcyBhIHNpbmdsZSByZWdpb24uIE1hcHMgMToxXG4gKiBvbnRvIGEgR2VvSlNPTiBgTXVsdGlQb2x5Z29uYCAoYW5kIFF1UGF0aCdzIGdlb21ldHJ5KS5cbiAqXG4gKiBBIHNpbmdsZS1wYXJ0IE11bHRpUG9seWdvbiBpcyBlcXVpdmFsZW50IHRvIHRoYXQgUG9seWdvbjsgY2FsbGVycyBzaG91bGRcbiAqIHByZWZlciBhIHBsYWluIHtAbGluayBQb2x5Z29ufSBmb3Igb25lIGNvbm5lY3RlZCBwYXJ0LlxuICovXG5leHBvcnQgY2xhc3MgTXVsdGlQb2x5Z29uIHtcbiAgLyoqIE9uZSBvciBtb3JlIGRpc2pvaW50IGNsb3NlZCBwb2x5Z29ucyAoZWFjaCBtYXkgaGF2ZSBob2xlcykuICovXG4gIHBvbHlnb25zOiBQb2x5Z29uW10gPSBbXTtcbn1cblxuLyoqXG4gKiBBIHJlZ2lvbidzIGdlb21ldHJ5IGFzIGEgaG9zdCBtYXkgc3VwcGx5IGl0OiBhIHtAbGluayBSZWN0YW5nbGV9IG9yXG4gKiB7QGxpbmsgUG9seWdvbn0gaW5zdGFuY2UsIG9yIGEgcGxhaW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgZmllbGRzIChlLmcuIHBhcnNlZFxuICogSlNPTiwgcG9zc2libHkgd2l0aCBvbmx5IHNvbWUgb2YgdGhlbSkuIEltYWdlLXBpeGVsIGNvb3JkaW5hdGVzLiBQbGFpbiBvYmplY3RzXG4gKiBiZWNvbWUgY2xhc3MgaW5zdGFuY2VzIHZpYSB7QGxpbmsgaHlkcmF0ZUJvdW5kc30gd2hlbiB0aGV5IGVudGVyIHRoZSBzdG9yZTtcbiAqIHtAbGluayBSZWdpb24uYm91bmRzfSBpdHNlbGYgaXMgYWx3YXlzIGFuIGluc3RhbmNlIChvciBhIHtAbGluayBNdWx0aVBvbHlnb259KS5cbiAqL1xuZXhwb3J0IHR5cGUgQm91bmRzID1cbiAgfCBSZWN0YW5nbGVcbiAgfCBQb2x5Z29uXG4gIHwge1xuICAgICAgeD86IG51bWJlcjtcbiAgICAgIHk/OiBudW1iZXI7XG4gICAgICB3aWR0aD86IG51bWJlcjtcbiAgICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAgIG5wb2ludHM/OiBudW1iZXI7XG4gICAgICB4cG9pbnRzPzogbnVtYmVyW107XG4gICAgICB5cG9pbnRzPzogbnVtYmVyW107XG4gICAgfTtcblxuLyoqXG4gKiBSZWJ1aWxkIGEgcGxhaW4tb2JqZWN0IGBib3VuZHNgIGFzIHRoZSBjbGFzcyBpbnN0YW5jZSB0aGUgcmVuZGVyZXJzIGV4cGVjdFxuICogKGppdC11aSMxMjQpLlxuICpcbiAqIFJlZ2lvbnMgdGhhdCBhcnJpdmUgYXMgSlNPTiDigJQgYSBob3N0J3Mgc2VydmVyIHJlc3BvbnNlLCBhIGBzdHJ1Y3R1cmVkQ2xvbmVgLFxuICogYW55dGhpbmcgdGhhdCBoYXMgYmVlbiB0aHJvdWdoIGBKU09OLnBhcnNlYCDigJQgY2FycnkgYSBgYm91bmRzYCB0aGF0IGhhcyB0aGVcbiAqIHJpZ2h0ICpmaWVsZHMqIGJ1dCBub3QgdGhlIHJpZ2h0ICpwcm90b3R5cGUqLiBUaGUgcmVuZGVyZXJzIGRpc2FncmVlIGFib3V0XG4gKiB3aGV0aGVyIHRoYXQgaXMgYWNjZXB0YWJsZTogYFJlZ2lvbi5nZXRTaGFwZSgpYCAoUGxvdGx5KSBhbmQgdGhlIG5hcGFyaVxuICogb3ZlcmxheSBkdWNrLXR5cGUgdGhlIGJvdW5kcywgd2hpbGUgdGhlIE9wZW5TZWFkcmFnb24gb3ZlcmxheSBkaXNjcmltaW5hdGVzXG4gKiB3aXRoIGBib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGVgLiBTbyBhIEpTT04gcmVnaW9uIGRyZXcgaW4gSGVhdG1hcCBtb2RlIGFuZFxuICogc2lsZW50bHkgdmFuaXNoZWQgaW4gSW1hZ2UgbW9kZS4gYGluc3RhbmNlb2ZgIGFsc28gZ2F0ZXMgdGhlIHN0b3JlJ3Mgb3duXG4gKiBnZW9tZXRyeSBkZS1kdXBsaWNhdGlvbiwgYG1vdmVSZWdpb25gLCBhbmQgdGhlIEdlb0pTT04gZXhwb3J0IOKAlCBhIEpTT04gcmVnaW9uXG4gKiBpcyB1bmRyYWdnYWJsZSBhbmQgYWJzZW50IGZyb20gYSBzYXZlIGluICpldmVyeSogbW9kZS5cbiAqXG4gKiBSYXRoZXIgdGhhbiBkdWNrLXR5cGUgfjIwIGNhbGwgc2l0ZXMsIHRoZSBzdG9yZSBub3JtYWxpemVzIGhlcmUgb24gdGhlIHdheSBpbixcbiAqIHNvIGV2ZXJ5dGhpbmcgZG93bnN0cmVhbSBjYW4ga2VlcCByZWx5aW5nIG9uIGBpbnN0YW5jZW9mYC4gVmFsdWVzIHRoYXQgYXJlXG4gKiBhbHJlYWR5IGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgKipieSByZWZlcmVuY2UqKiwgdW50b3VjaGVkOiBvdmVybGF5cyBhbmQgdG9vbHNcbiAqIGhvbGQgb250byB0aGUgYm91bmRzIHRoZXkgY3JlYXRlZCBhbmQgbXV0YXRlIHRoZW0gaW4gcGxhY2UgZHVyaW5nIGEgZHJhZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVCb3VuZHMoYm91bmRzOiBhbnkpOiBSZWN0YW5nbGUgfCBQb2x5Z29uIHwgTXVsdGlQb2x5Z29uIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghYm91bmRzIHx8IGJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fCBib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uIHx8IGJvdW5kcyBpbnN0YW5jZW9mIE11bHRpUG9seWdvbikge1xuICAgIHJldHVybiBib3VuZHM7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYm91bmRzLnBvbHlnb25zKSkge1xuICAgIGNvbnN0IG11bHRpID0gbmV3IE11bHRpUG9seWdvbigpO1xuICAgIG11bHRpLnBvbHlnb25zID0gYm91bmRzLnBvbHlnb25zLm1hcCgocGFydDogYW55KSA9PiBoeWRyYXRlUG9seWdvbihwYXJ0KSk7XG4gICAgcmV0dXJuIG11bHRpO1xuICB9XG4gIGlmICgnbnBvaW50cycgaW4gYm91bmRzIHx8ICd4cG9pbnRzJyBpbiBib3VuZHMpIHtcbiAgICByZXR1cm4gaHlkcmF0ZVBvbHlnb24oYm91bmRzKTtcbiAgfVxuICBpZiAoJ3dpZHRoJyBpbiBib3VuZHMgJiYgJ2hlaWdodCcgaW4gYm91bmRzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFJlY3RhbmdsZSgpLCBib3VuZHMpO1xuICB9XG4gIC8vIE5vdGhpbmcgcmVjb2duaXNhYmxlIOKAlCBoYW5kIGl0IGJhY2sgcmF0aGVyIHRoYW4gY29lcmNlIGl0IGludG8gdGhlIHdyb25nXG4gIC8vIGdlb21ldHJ5LiBJdCByZW5kZXJzIG5vd2hlcmUgZWl0aGVyIHdheSwgYnV0IGEgY2FsbGVyIGNhbiBzdGlsbCBpbnNwZWN0IGl0LlxuICByZXR1cm4gYm91bmRzO1xufVxuXG4vKioge0BsaW5rIGh5ZHJhdGVCb3VuZHN9IGZvciBvbmUgcG9seWdvbiwgZGVyaXZpbmcgdGhlIGZpZWxkcyBhIGxlYW4gc2VyaWFsaXplclxuICogIG9taXRzOiBKSVQncyBKYXZhIGBQb2x5Z29uU2VyaWFsaXplcmAgd3JpdGVzIG9ubHkgYG5wb2ludHNgL2B4cG9pbnRzYC9cbiAqICBgeXBvaW50c2AsIHdoaWxlIHRoZSBHZW9KU09OIGV4cG9ydCByZWFkcyBgY29vcmRpbmF0ZXNgIGFuZCB0aGUgb3ZlcmxheXMgcmVhZFxuICogIGBjbG9zZWRgLiAqL1xuZnVuY3Rpb24gaHlkcmF0ZVBvbHlnb24ocmF3OiBhbnkpOiBQb2x5Z29uIHtcbiAgaWYgKHJhdyBpbnN0YW5jZW9mIFBvbHlnb24pIHJldHVybiByYXc7XG4gIGNvbnN0IHBvbHlnb246IFBvbHlnb24gPSBPYmplY3QuYXNzaWduKG5ldyBQb2x5Z29uKCksIHJhdyk7XG4gIHBvbHlnb24ueHBvaW50cyA9IFsuLi4ocmF3Lnhwb2ludHMgPz8gW10pXTtcbiAgcG9seWdvbi55cG9pbnRzID0gWy4uLihyYXcueXBvaW50cyA/PyBbXSldO1xuICBwb2x5Z29uLm5wb2ludHMgPSByYXcubnBvaW50cyA/PyBwb2x5Z29uLnhwb2ludHMubGVuZ3RoO1xuICBwb2x5Z29uLmNvb3JkaW5hdGVzID0gcmF3LmNvb3JkaW5hdGVzID8/IHBvbHlnb24ueHBvaW50cy5tYXAoKHgsIGkpID0+IFt4LCBwb2x5Z29uLnlwb2ludHNbaV1dKTtcbiAgcG9seWdvbi5jbG9zZWQgPSByYXcuY2xvc2VkID8/IHRydWU7XG4gIHJldHVybiBwb2x5Z29uO1xufVxuIl19
@@ -1,4 +1,13 @@
1
1
  import { Region, Polygon, Rectangle } from './region';
2
+ import { parseSvgPath } from './geometry';
3
+ /**
4
+ * A {@link Region} projected to a Plotly layout shape (`rect` or SVG `path`),
5
+ * carrying the region's identity, class label and file name along so it
6
+ * round-trips through Plotly's relayout. Coordinates are the plot's data
7
+ * coordinates, which are the region's image pixels. Built by
8
+ * {@link Region.getShape}; {@link getRegion} converts back (only `rect` and
9
+ * `path` shapes — anything else throws).
10
+ */
2
11
  export class ShapeSelection {
3
12
  constructor() {
4
13
  this.editable = true;
@@ -28,21 +37,14 @@ export class ShapeSelection {
28
37
  region.bounds.height = this.y1 - this.y0;
29
38
  }
30
39
  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
- }
40
+ const { xpoints, ypoints, closed } = parseSvgPath(this.path);
41
+ region.bounds = Object.assign(new Polygon(), {
42
+ npoints: xpoints.length,
43
+ xpoints,
44
+ ypoints,
45
+ coordinates: xpoints.map((x, i) => [x, ypoints[i]]),
46
+ closed,
47
+ });
46
48
  }
47
49
  else {
48
50
  throw new Error(`Unsupported shape type: ${this.type}`);
@@ -50,4 +52,4 @@ export class ShapeSelection {
50
52
  return region;
51
53
  }
52
54
  }
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21vZGVscy9zaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHdEQsTUFBTSxPQUFPLGNBQWM7SUFBM0I7UUFrQ0UsYUFBUSxHQUFHLElBQUksQ0FBQztJQW9EbEIsQ0FBQztJQTNDQzs7T0FFRztJQUNJLFNBQVM7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNwQixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEIsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSx5RUFBeUU7UUFDekUsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSw2QkFBNkI7UUFDN0IsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQVksQ0FBQztZQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBWSxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFJLElBQUksQ0FBQyxFQUFhLEdBQUksSUFBSSxDQUFDLEVBQWEsQ0FBQztZQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBSSxJQUFJLENBQUMsRUFBYSxHQUFJLElBQUksQ0FBQyxFQUFhLENBQUM7UUFDbkUsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7WUFDbEcsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUNoQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUM1QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakYsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlZ2lvbiwgUG9seWdvbiwgUmVjdGFuZ2xlIH0gZnJvbSAnLi9yZWdpb24nO1xuaW1wb3J0IHsgRGF0dW0sIEZvbnQsIFNoYXBlLCBTaGFwZUxhYmVsLCBTaGFwZUxpbmUsIFhBeGlzTmFtZSwgWUF4aXNOYW1lIH0gZnJvbSAncGxvdGx5LmpzLWRpc3QtbWluJztcblxuZXhwb3J0IGNsYXNzIFNoYXBlU2VsZWN0aW9uIGltcGxlbWVudHMgU2hhcGUge1xuXG4gIC8qKiBTdGFibGUsIHVuaXF1ZSBpZGVudGl0eSBjYXJyaWVkIGFsb25nc2lkZSB0aGUgc2hhcGUgc28gaXQgcm91bmQtdHJpcHNcbiAgICogIHRocm91Z2ggUGxvdGx5J3MgcmVsYXlvdXQgdW50b3VjaGVkLiBQbG90bHkgcHJlc2VydmVzIHVua25vd25cbiAgICogIHByb3BlcnRpZXMgb24gc2hhcGUgb2JqZWN0cywgc28gdGhpcyBzdXJ2aXZlcyB0aGUgc2FtZSB3YXkgYGxlZ2VuZGBcbiAgICogIGFuZCBgZmlsZU5hbWVgIGFscmVhZHkgZG8uICovXG4gIGlkITogbnVtYmVyO1xuICBuYW1lITogc3RyaW5nO1xuICBmaWxsY29sb3IhOiBzdHJpbmc7XG4gIC8vIGxhYmVsIHRha2VzIHRoZSBmb3JtXG4gIC8vIHsgdGV4dDogbGVnZW5kLCB0ZXh0dGVtcGxhdGU6IGxlZ2VuZCwgZm9udDogeyBjb2xvcjogJyNGRkYwMDAnIH0sIHRleHRwb3NpdGlvbjogJ3RvcCBsZWZ0JyB9XG4gIC8vIG9yIGNhbiBiZSBhbiBlbXB0eSBvYmplY3Qge30gaWYgbm8gbGFiZWwgaXMgdG8gYmUgc2hvd25cbiAgbGFiZWwhOiBQYXJ0aWFsPFNoYXBlTGFiZWw+O1xuICBsYXllciE6ICdiZWxvdycgfCAnYWJvdmUnO1xuICBsZWdlbmRncm91cCE6IHN0cmluZztcbiAgbGVnZW5kZ3JvdXB0aXRsZSE6IHsgdGV4dDogc3RyaW5nOyBmb250PzogUGFydGlhbDxGb250PiB9O1xuICBsZWdlbmRyYW5rITogbnVtYmVyO1xuICBsaW5lITogUGFydGlhbDxTaGFwZUxpbmU+O1xuICBvcGFjaXR5ITogbnVtYmVyO1xuICBwYXRoITogc3RyaW5nO1xuICBzaG93bGVnZW5kITogYm9vbGVhbjtcbiAgdGVtcGxhdGVpdGVtbmFtZSE6IHN0cmluZztcbiAgdHlwZSE6ICdyZWN0JyB8ICdjaXJjbGUnIHwgJ2xpbmUnIHwgJ3BhdGgnO1xuICB2aXNpYmxlITogYm9vbGVhbiB8ICdsZWdlbmRvbmx5JztcbiAgeDAhOiBEYXR1bTtcbiAgeDEhOiBEYXR1bTtcbiAgeGFuY2hvciE6IG51bWJlciB8IHN0cmluZztcbiAgeHJlZiE6ICdwYXBlcicgfCBYQXhpc05hbWU7XG4gIHhzaXplbW9kZSE6ICdzY2FsZWQnIHwgJ3BpeGVsJztcbiAgeTAhOiBEYXR1bTtcbiAgeTEhOiBEYXR1bTtcbiAgeWFuY2hvciE6IG51bWJlciB8IHN0cmluZztcbiAgeXJlZiE6ICdwYXBlcicgfCBZQXhpc05hbWU7XG4gIHlzaXplbW9kZSE6ICdzY2FsZWQnIHwgJ3BpeGVsJztcbiAgZWRpdGFibGUgPSB0cnVlO1xuICAvLyBsZWdlbmQgdGV4dCBmb3IgdGhlIHJlZ2lvbiAodXNlZCBmb3IgY2xhc3NlcykgLSB2YWx1ZSB1c2VkIGluIGxhYmVsLnRleHQgYW5kIGxhYmVsLnRleHR0ZW1wbGF0ZVxuICBsZWdlbmQhOiBhbnk7XG4gIC8vIGZpbGUgbmFtZSBvZiB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIHJlZ2lvbiB3YXMgY3JlYXRlZFxuICBmaWxlTmFtZSE6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLy8gdGFncyBhbiBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIFJPSSBzbyBpdCByb3VuZC10cmlwcyB0aHJvdWdoIFBsb3RseSBhbmQgdGhlXG4gIC8vIHJlZ2lvbiBzdG9yZSBhcyBhIHByb2ZpbGUgKGV4Y2x1ZGVkIGZyb20gdGhlIFJlZ2lvbnMgdGFiICsgZXhwb3J0cykuXG4gIGtpbmQ/OiAncHJvZmlsZSc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBSZWdpb24gb2JqZWN0IGJhc2VkIG9uIHRoZSBzaGFwZSB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldFJlZ2lvbigpOiBSZWdpb24ge1xuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICByZWdpb24uaWQgPSB0aGlzLmlkO1xuICAgIHJlZ2lvbi5uYW1lID0gdGhpcy5uYW1lO1xuICAgIC8vIFRoZSByZWdpb24ncyBjb2xvdXIgbGl2ZXMgb24gbGluZS5jb2xvciAoc2VlIFJlZ2lvbi5nZXRTaGFwZSk7IGZpbGxjb2xvclxuICAgIC8vIGlzIG9ubHkgc2V0IGZvciB0aGUgYWN0aXZlLXNoYXBlIGhpZ2hsaWdodC4gUmVzdG9yZSB0aGUgY2xhc3MgbGFiZWwgZnJvbVxuICAgIC8vIGxlZ2VuZCB0b28uIFdpdGhvdXQgdGhlc2UsIGdldFJlZ2lvbnMoKSDigJQgd2hpY2ggdGhlIE9TRCByZWdpb24gb3ZlcmxheVxuICAgIC8vIHJlbmRlcnMgZnJvbSDigJQgcmV0dXJuZWQgdW5kZWZpbmVkIGNvbG91ciBBTkQgbGFiZWwsIHNvIE9TRCBkcmV3IGV2ZXJ5XG4gICAgLy8gcmVnaW9uIGluIHRoZSBkZWZhdWx0IGNvbG91ciB3aXRoIG5vIGxhYmVsICh1bmxpa2UgUGxvdGx5LCB3aGljaCByZW5kZXJzXG4gICAgLy8gaXRzIHNoYXBlIGFycmF5IGRpcmVjdGx5KS5cbiAgICByZWdpb24uY29sb3IgPSB0aGlzLmxpbmU/LmNvbG9yID8/IHRoaXMuZmlsbGNvbG9yO1xuICAgIHJlZ2lvbi5sYWJlbCA9IHRoaXMubGVnZW5kO1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdwcm9maWxlJykgcmVnaW9uLmtpbmQgPSAncHJvZmlsZSc7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3JlY3QnKSB7XG4gICAgICByZWdpb24uYm91bmRzID0gbmV3IFJlY3RhbmdsZSgpO1xuICAgICAgcmVnaW9uLmJvdW5kcy54ID0gdGhpcy54MCBhcyBudW1iZXI7XG4gICAgICByZWdpb24uYm91bmRzLnkgPSB0aGlzLnkwIGFzIG51bWJlcjtcbiAgICAgIHJlZ2lvbi5ib3VuZHMud2lkdGggPSAodGhpcy54MSBhcyBudW1iZXIpIC0gKHRoaXMueDAgYXMgbnVtYmVyKTtcbiAgICAgIHJlZ2lvbi5ib3VuZHMuaGVpZ2h0ID0gKHRoaXMueTEgYXMgbnVtYmVyKSAtICh0aGlzLnkwIGFzIG51bWJlcik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdwYXRoJykge1xuICAgICAgcmVnaW9uLmJvdW5kcyA9IG5ldyBQb2x5Z29uKCk7XG4gICAgICBjb25zdCBpc0Nsb3NlZCA9IHRoaXMucGF0aC5lbmRzV2l0aCgnWicpO1xuICAgICAgY29uc3Qgc3BhdGggPSBpc0Nsb3NlZCA/IHRoaXMucGF0aC5zbGljZSgxLCAtMSkgOiB0aGlzLnBhdGguc2xpY2UoMSk7IC8vIHJlbW92ZSBNIGFuZCBvcHRpb25hbGx5IFpcbiAgICAgIGNvbnN0IHNwb2ludHMgPSBzcGF0aC5zcGxpdCgnTCcpO1xuICAgICAgcmVnaW9uLmJvdW5kcy5ucG9pbnRzID0gc3BvaW50cy5sZW5ndGg7XG4gICAgICByZWdpb24uYm91bmRzLnhwb2ludHMgPSBbXTtcbiAgICAgIHJlZ2lvbi5ib3VuZHMueXBvaW50cyA9IFtdO1xuICAgICAgcmVnaW9uLmJvdW5kcy5jb29yZGluYXRlcyA9IFtdO1xuICAgICAgcmVnaW9uLmJvdW5kcy5jbG9zZWQgPSBpc0Nsb3NlZDtcbiAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc3BvaW50cykge1xuICAgICAgICBjb25zdCBjb29yZHMgPSBwb2ludC5zcGxpdCgnLCcpO1xuICAgICAgICByZWdpb24uYm91bmRzLnhwb2ludHMucHVzaChwYXJzZUZsb2F0KGNvb3Jkc1swXSkpO1xuICAgICAgICByZWdpb24uYm91bmRzLnlwb2ludHMucHVzaChwYXJzZUZsb2F0KGNvb3Jkc1sxXSkpO1xuICAgICAgICByZWdpb24uYm91bmRzLmNvb3JkaW5hdGVzLnB1c2goW3BhcnNlRmxvYXQoY29vcmRzWzBdKSwgcGFyc2VGbG9hdChjb29yZHNbMV0pXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2hhcGUgdHlwZTogJHt0aGlzLnR5cGV9YCk7XG4gICAgfVxuICAgIHJldHVybiByZWdpb247XG4gIH1cbn1cbiJdfQ==
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21vZGVscy9zaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUcxQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFBM0I7UUFpQ0UsYUFBUSxHQUFHLElBQUksQ0FBQztJQTZDbEIsQ0FBQztJQXBDQzs7T0FFRztJQUNJLFNBQVM7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNwQixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEIsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSx5RUFBeUU7UUFDekUsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSw2QkFBNkI7UUFDN0IsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQVksQ0FBQztZQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBWSxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFJLElBQUksQ0FBQyxFQUFhLEdBQUksSUFBSSxDQUFDLEVBQWEsQ0FBQztZQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBSSxJQUFJLENBQUMsRUFBYSxHQUFJLElBQUksQ0FBQyxFQUFhLENBQUM7UUFDbkUsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdELE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRSxFQUFFO2dCQUMzQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3ZCLE9BQU87Z0JBQ1AsT0FBTztnQkFDUCxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNO2FBQ1AsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVnaW9uLCBQb2x5Z29uLCBSZWN0YW5nbGUgfSBmcm9tICcuL3JlZ2lvbic7XG5pbXBvcnQgeyBwYXJzZVN2Z1BhdGggfSBmcm9tICcuL2dlb21ldHJ5JztcbmltcG9ydCB7IERhdHVtLCBGb250LCBTaGFwZSwgU2hhcGVMYWJlbCwgU2hhcGVMaW5lLCBYQXhpc05hbWUsIFlBeGlzTmFtZSB9IGZyb20gJ3Bsb3RseS5qcy1kaXN0LW1pbic7XG5cbi8qKlxuICogQSB7QGxpbmsgUmVnaW9ufSBwcm9qZWN0ZWQgdG8gYSBQbG90bHkgbGF5b3V0IHNoYXBlIChgcmVjdGAgb3IgU1ZHIGBwYXRoYCksXG4gKiBjYXJyeWluZyB0aGUgcmVnaW9uJ3MgaWRlbnRpdHksIGNsYXNzIGxhYmVsIGFuZCBmaWxlIG5hbWUgYWxvbmcgc28gaXRcbiAqIHJvdW5kLXRyaXBzIHRocm91Z2ggUGxvdGx5J3MgcmVsYXlvdXQuIENvb3JkaW5hdGVzIGFyZSB0aGUgcGxvdCdzIGRhdGFcbiAqIGNvb3JkaW5hdGVzLCB3aGljaCBhcmUgdGhlIHJlZ2lvbidzIGltYWdlIHBpeGVscy4gQnVpbHQgYnlcbiAqIHtAbGluayBSZWdpb24uZ2V0U2hhcGV9OyB7QGxpbmsgZ2V0UmVnaW9ufSBjb252ZXJ0cyBiYWNrIChvbmx5IGByZWN0YCBhbmRcbiAqIGBwYXRoYCBzaGFwZXMg4oCUIGFueXRoaW5nIGVsc2UgdGhyb3dzKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXBlU2VsZWN0aW9uIGltcGxlbWVudHMgU2hhcGUge1xuICAvKiogU3RhYmxlLCB1bmlxdWUgaWRlbnRpdHkgY2FycmllZCBhbG9uZ3NpZGUgdGhlIHNoYXBlIHNvIGl0IHJvdW5kLXRyaXBzXG4gICAqICB0aHJvdWdoIFBsb3RseSdzIHJlbGF5b3V0IHVudG91Y2hlZC4gUGxvdGx5IHByZXNlcnZlcyB1bmtub3duXG4gICAqICBwcm9wZXJ0aWVzIG9uIHNoYXBlIG9iamVjdHMsIHNvIHRoaXMgc3Vydml2ZXMgdGhlIHNhbWUgd2F5IGBsZWdlbmRgXG4gICAqICBhbmQgYGZpbGVOYW1lYCBhbHJlYWR5IGRvLiAqL1xuICBpZCE6IG51bWJlcjtcbiAgbmFtZSE6IHN0cmluZztcbiAgZmlsbGNvbG9yITogc3RyaW5nO1xuICAvLyBsYWJlbCB0YWtlcyB0aGUgZm9ybVxuICAvLyB7IHRleHQ6IGxlZ2VuZCwgdGV4dHRlbXBsYXRlOiBsZWdlbmQsIGZvbnQ6IHsgY29sb3I6ICcjRkZGMDAwJyB9LCB0ZXh0cG9zaXRpb246ICd0b3AgbGVmdCcgfVxuICAvLyBvciBjYW4gYmUgYW4gZW1wdHkgb2JqZWN0IHt9IGlmIG5vIGxhYmVsIGlzIHRvIGJlIHNob3duXG4gIGxhYmVsITogUGFydGlhbDxTaGFwZUxhYmVsPjtcbiAgbGF5ZXIhOiAnYmVsb3cnIHwgJ2Fib3ZlJztcbiAgbGVnZW5kZ3JvdXAhOiBzdHJpbmc7XG4gIGxlZ2VuZGdyb3VwdGl0bGUhOiB7IHRleHQ6IHN0cmluZzsgZm9udD86IFBhcnRpYWw8Rm9udD4gfTtcbiAgbGVnZW5kcmFuayE6IG51bWJlcjtcbiAgbGluZSE6IFBhcnRpYWw8U2hhcGVMaW5lPjtcbiAgb3BhY2l0eSE6IG51bWJlcjtcbiAgcGF0aCE6IHN0cmluZztcbiAgc2hvd2xlZ2VuZCE6IGJvb2xlYW47XG4gIHRlbXBsYXRlaXRlbW5hbWUhOiBzdHJpbmc7XG4gIHR5cGUhOiAncmVjdCcgfCAnY2lyY2xlJyB8ICdsaW5lJyB8ICdwYXRoJztcbiAgdmlzaWJsZSE6IGJvb2xlYW4gfCAnbGVnZW5kb25seSc7XG4gIHgwITogRGF0dW07XG4gIHgxITogRGF0dW07XG4gIHhhbmNob3IhOiBudW1iZXIgfCBzdHJpbmc7XG4gIHhyZWYhOiAncGFwZXInIHwgWEF4aXNOYW1lO1xuICB4c2l6ZW1vZGUhOiAnc2NhbGVkJyB8ICdwaXhlbCc7XG4gIHkwITogRGF0dW07XG4gIHkxITogRGF0dW07XG4gIHlhbmNob3IhOiBudW1iZXIgfCBzdHJpbmc7XG4gIHlyZWYhOiAncGFwZXInIHwgWUF4aXNOYW1lO1xuICB5c2l6ZW1vZGUhOiAnc2NhbGVkJyB8ICdwaXhlbCc7XG4gIGVkaXRhYmxlID0gdHJ1ZTtcbiAgLy8gbGVnZW5kIHRleHQgZm9yIHRoZSByZWdpb24gKHVzZWQgZm9yIGNsYXNzZXMpIC0gdmFsdWUgdXNlZCBpbiBsYWJlbC50ZXh0IGFuZCBsYWJlbC50ZXh0dGVtcGxhdGVcbiAgbGVnZW5kITogYW55O1xuICAvLyBmaWxlIG5hbWUgb2YgdGhlIGZpbGUgZm9yIHdoaWNoIHRoZSByZWdpb24gd2FzIGNyZWF0ZWRcbiAgZmlsZU5hbWUhOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8vIHRhZ3MgYW4gaW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0kgc28gaXQgcm91bmQtdHJpcHMgdGhyb3VnaCBQbG90bHkgYW5kIHRoZVxuICAvLyByZWdpb24gc3RvcmUgYXMgYSBwcm9maWxlIChleGNsdWRlZCBmcm9tIHRoZSBSZWdpb25zIHRhYiArIGV4cG9ydHMpLlxuICBraW5kPzogJ3Byb2ZpbGUnO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgUmVnaW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgc2hhcGUgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXRSZWdpb24oKTogUmVnaW9uIHtcbiAgICBjb25zdCByZWdpb24gPSBuZXcgUmVnaW9uKCk7XG4gICAgcmVnaW9uLmlkID0gdGhpcy5pZDtcbiAgICByZWdpb24ubmFtZSA9IHRoaXMubmFtZTtcbiAgICAvLyBUaGUgcmVnaW9uJ3MgY29sb3VyIGxpdmVzIG9uIGxpbmUuY29sb3IgKHNlZSBSZWdpb24uZ2V0U2hhcGUpOyBmaWxsY29sb3JcbiAgICAvLyBpcyBvbmx5IHNldCBmb3IgdGhlIGFjdGl2ZS1zaGFwZSBoaWdobGlnaHQuIFJlc3RvcmUgdGhlIGNsYXNzIGxhYmVsIGZyb21cbiAgICAvLyBsZWdlbmQgdG9vLiBXaXRob3V0IHRoZXNlLCBnZXRSZWdpb25zKCkg4oCUIHdoaWNoIHRoZSBPU0QgcmVnaW9uIG92ZXJsYXlcbiAgICAvLyByZW5kZXJzIGZyb20g4oCUIHJldHVybmVkIHVuZGVmaW5lZCBjb2xvdXIgQU5EIGxhYmVsLCBzbyBPU0QgZHJldyBldmVyeVxuICAgIC8vIHJlZ2lvbiBpbiB0aGUgZGVmYXVsdCBjb2xvdXIgd2l0aCBubyBsYWJlbCAodW5saWtlIFBsb3RseSwgd2hpY2ggcmVuZGVyc1xuICAgIC8vIGl0cyBzaGFwZSBhcnJheSBkaXJlY3RseSkuXG4gICAgcmVnaW9uLmNvbG9yID0gdGhpcy5saW5lPy5jb2xvciA/PyB0aGlzLmZpbGxjb2xvcjtcbiAgICByZWdpb24ubGFiZWwgPSB0aGlzLmxlZ2VuZDtcbiAgICBpZiAodGhpcy5raW5kID09PSAncHJvZmlsZScpIHJlZ2lvbi5raW5kID0gJ3Byb2ZpbGUnO1xuICAgIGlmICh0aGlzLnR5cGUgPT09ICdyZWN0Jykge1xuICAgICAgcmVnaW9uLmJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoKTtcbiAgICAgIHJlZ2lvbi5ib3VuZHMueCA9IHRoaXMueDAgYXMgbnVtYmVyO1xuICAgICAgcmVnaW9uLmJvdW5kcy55ID0gdGhpcy55MCBhcyBudW1iZXI7XG4gICAgICByZWdpb24uYm91bmRzLndpZHRoID0gKHRoaXMueDEgYXMgbnVtYmVyKSAtICh0aGlzLngwIGFzIG51bWJlcik7XG4gICAgICByZWdpb24uYm91bmRzLmhlaWdodCA9ICh0aGlzLnkxIGFzIG51bWJlcikgLSAodGhpcy55MCBhcyBudW1iZXIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAncGF0aCcpIHtcbiAgICAgIGNvbnN0IHsgeHBvaW50cywgeXBvaW50cywgY2xvc2VkIH0gPSBwYXJzZVN2Z1BhdGgodGhpcy5wYXRoKTtcbiAgICAgIHJlZ2lvbi5ib3VuZHMgPSBPYmplY3QuYXNzaWduKG5ldyBQb2x5Z29uKCksIHtcbiAgICAgICAgbnBvaW50czogeHBvaW50cy5sZW5ndGgsXG4gICAgICAgIHhwb2ludHMsXG4gICAgICAgIHlwb2ludHMsXG4gICAgICAgIGNvb3JkaW5hdGVzOiB4cG9pbnRzLm1hcCgoeCwgaSkgPT4gW3gsIHlwb2ludHNbaV1dKSxcbiAgICAgICAgY2xvc2VkLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2hhcGUgdHlwZTogJHt0aGlzLnR5cGV9YCk7XG4gICAgfVxuICAgIHJldHVybiByZWdpb247XG4gIH1cbn1cbiJdfQ==