@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34430
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -878
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -14,9 +14,7 @@ export function densityGrid(dataset, stride = 2, targetLongAxis = 128, zStride =
14
14
  // z can be coarsened less than x/y — a gene map's sheets need one plane per
15
15
  // imaged section, while its in-plane detail is smooth by construction. The
16
16
  // physical extent is unchanged either way, so the box still aligns.
17
- const [w, h, d] = [
18
- cells(volume.width, stride), cells(volume.height, stride), cells(volume.depth, zStride),
19
- ];
17
+ const [w, h, d] = [cells(volume.width, stride), cells(volume.height, stride), cells(volume.depth, zStride)];
20
18
  // Voxel size from the SPAN, not stride x original: `ceil` can add a fraction
21
19
  // of a voxel, and scaling the original size would push the far edge past the
22
20
  // reference volume's.
@@ -55,26 +53,35 @@ export function densityGrid(dataset, stride = 2, targetLongAxis = 128, zStride =
55
53
  };
56
54
  }
57
55
  /**
58
- * In-place separable Gaussian along one axis of a w x h x d field.
59
- *
60
- * Exported because the gene-map volume estimates a different quantity on the same
61
- * lattice with the same kernel (see `spatial-expression.ts`): two copies of a
62
- * separable blur would be two chances to smooth the estimate and its normaliser
63
- * differently, which is the one thing a Nadaraya-Watson field cannot survive.
56
+ * A normalised 1-D Gaussian kernel of radius `ceil(3σ)` (at least 1), centre at
57
+ * index `radius`.
64
58
  */
65
- export function blurVolumeAxis(field, w, h, d, axis, sigmaVox) {
66
- if (!(sigmaVox > 0.01))
67
- return;
68
- const radius = Math.max(1, Math.ceil(sigmaVox * 3));
59
+ export function gaussianKernel(sigma) {
60
+ const radius = Math.max(1, Math.ceil(sigma * 3));
69
61
  const kernel = new Float32Array(radius * 2 + 1);
70
62
  let sum = 0;
71
63
  for (let i = -radius; i <= radius; i++) {
72
- const v = Math.exp(-(i * i) / (2 * sigmaVox * sigmaVox));
64
+ const v = Math.exp(-(i * i) / (2 * sigma * sigma));
73
65
  kernel[i + radius] = v;
74
66
  sum += v;
75
67
  }
76
68
  for (let i = 0; i < kernel.length; i++)
77
69
  kernel[i] /= sum;
70
+ return { kernel, radius };
71
+ }
72
+ /**
73
+ * In-place separable Gaussian along one axis of a w x h x d field. A 2-D field is
74
+ * the `d = 1` case.
75
+ *
76
+ * The ONE blur for every field in this folder: the 2-D gene map, the gene-map
77
+ * volume and the density volumes all smooth through it. Two copies of a separable
78
+ * blur would be two chances to smooth an estimate and its normaliser differently,
79
+ * which is the one thing a Nadaraya-Watson field cannot survive.
80
+ */
81
+ export function blurVolumeAxis(field, w, h, d, axis, sigmaVox) {
82
+ if (!(sigmaVox > 0.01))
83
+ return;
84
+ const { kernel, radius } = gaussianKernel(sigmaVox);
78
85
  const len = axis === 0 ? w : axis === 1 ? h : d;
79
86
  const stride = axis === 0 ? 1 : axis === 1 ? w : w * h;
80
87
  const lines = axis === 0 ? h * d : axis === 1 ? w * d : w * h;
@@ -164,7 +171,9 @@ export function rasterizeDensity(obs, grid, opts) {
164
171
  if (!placed)
165
172
  return null;
166
173
  const sigmaVox = [
167
- opts.sigma[0] / voxelSize[0], opts.sigma[1] / voxelSize[1], opts.sigma[2] / voxelSize[2],
174
+ opts.sigma[0] / voxelSize[0],
175
+ opts.sigma[1] / voxelSize[1],
176
+ opts.sigma[2] / voxelSize[2],
168
177
  ];
169
178
  blurVolumeAxis(field, w, h, d, 0, sigmaVox[0]);
170
179
  blurVolumeAxis(field, w, h, d, 1, sigmaVox[1]);
@@ -221,4 +230,4 @@ export function defaultSigma(grid, smoothing = 1) {
221
230
  grid.voxelSize[2] * 1.5 * smoothing,
222
231
  ];
223
232
  }
224
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1kZW5zaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtZGVuc2l0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF1Q0E7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixPQUF1QixFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsY0FBYyxHQUFHLEdBQUcsRUFBRSxPQUFPLEdBQUcsTUFBTTtJQUUzRSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzlCLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEUsNEVBQTRFO1FBQzVFLDJFQUEyRTtRQUMzRSxvRUFBb0U7UUFDcEUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUc7WUFDaEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1NBQ3hGLENBQUM7UUFDRiw2RUFBNkU7UUFDN0UsNkVBQTZFO1FBQzdFLHNCQUFzQjtRQUN0QixPQUFPO1lBQ0wsS0FBSyxFQUFFLENBQUM7WUFDUixNQUFNLEVBQUUsQ0FBQztZQUNULEtBQUssRUFBRSxDQUFDO1lBQ1IsU0FBUyxFQUFFO2dCQUNULENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDeEMsQ0FB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QUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzNCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLENBQUMsR0FBRyxHQUFHO2dCQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ25GLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFpQixFQUFFLFNBQVMsR0FBRyxDQUFDO0lBQzNELE9BQU87UUFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxTQUFTO1FBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFNBQVM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsU0FBUztLQUNwQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNwYXRpYWxEYXRhc2V0LCBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5cbi8qKlxuICogVHVybmluZyBhIGNlbGwgY2xvdWQgaW50byBhIGRlbnNpdHkgZmllbGQg4oCUIHRoZSBob25lc3Qgd2F5IHRvIHJlbmRlciBhIGNsdXN0ZXJcbiAqIGluIDNEIHdoZW4gdGhlIHNlY3Rpb25zIGl0IHdhcyBtZWFzdXJlZCBvbiBhcmUgaHVuZHJlZHMgb2YgbWljcm9ucyBhcGFydC5cbiAqXG4gKiBJbmRpdmlkdWFsIGNlbGxzIENBTk5PVCBiZSBpbnRlcnBvbGF0ZWQgYmV0d2VlbiBzZWN0aW9uczogY29uc2VjdXRpdmUgc2VjdGlvbnNcbiAqIHNhbXBsZSBlbnRpcmVseSBkaWZmZXJlbnQgY2VsbHMsIHNvIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRlbmNlIHRvIGludGVycG9sYXRlXG4gKiBhbG9uZywgYW5kIGludmVudGluZyBwb3NpdGlvbnMgd291bGQgZmFicmljYXRlIG9ic2VydmF0aW9ucyBpbmRpc3Rpbmd1aXNoYWJsZVxuICogZnJvbSBtZWFzdXJlZCBvbmVzLiBBIGRlbnNpdHkgZmllbGQgaXMgYSBkaWZmZXJlbnQgb2JqZWN0OiBhIGNvbnRpbnVvdXNcbiAqIGVzdGltYXRlLCBsZWdpdGltYXRlbHkgZGVmaW5lZCBiZXR3ZWVuIHRoZSBwbGFuZXMgdGhhdCB3ZXJlIGltYWdlZCwgYW5kIGl0XG4gKiByZW5kZXJzIGFzIGEgdHJhbnNsdWNlbnQgY2xvdWQgcmF0aGVyIHRoYW4gYXMgZG90cywgc28gaXQgcmVhZHMgYXMgYW4gZXN0aW1hdGUuXG4gKlxuICogVHdvIHRoaW5ncyBtYWtlIHRoZSBlc3RpbWF0ZSBob25lc3QgcmF0aGVyIHRoYW4gZGVjb3JhdGl2ZSwgYW5kIGJvdGggYXJlXG4gKiBpbXBsZW1lbnRlZCBoZXJlOlxuICogIC0gdGhlIGtlcm5lbCBpcyAqKmFuaXNvdHJvcGljKiosIHdpdGggYSB6IGJhbmR3aWR0aCBhdCBsZWFzdCB0aGUgc2VjdGlvblxuICogICAgc3BhY2luZy4gQW4gaXNvdHJvcGljIGtlcm5lbCBsZWF2ZXMgb25lIGRpc2MgcGVyIHNlY3Rpb24g4oCUIGEgc2FtcGxpbmdcbiAqICAgIGFydGVmYWN0IHRoYXQgbG9va3MgbGlrZSBiaW9sb2d5O1xuICogIC0gdGhlIGZpZWxkIGlzICoqY292ZXJhZ2Utbm9ybWFsaXNlZCoqIGFsb25nIHogKE5hZGFyYXlh4oCTV2F0c29uKTogdW5zYW1wbGVkXG4gKiAgICBwbGFuZXMgd291bGQgb3RoZXJ3aXNlIHJlYWQgYXMgZ2VudWluZWx5IGVtcHR5IHRpc3N1ZSByYXRoZXIgdGhhbiBhcyB0aXNzdWVcbiAqICAgIG5vYm9keSBpbWFnZWQuXG4gKi9cblxuLyoqIFRoZSB2b3hlbCBsYXR0aWNlIGEgZGVuc2l0eSBmaWVsZCBpcyBlc3RpbWF0ZWQgb24uICovXG5leHBvcnQgaW50ZXJmYWNlIERlbnNpdHlHcmlkIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGRlcHRoOiBudW1iZXI7XG4gIC8qKiBXb3JsZCBzaXplIG9mIG9uZSB2b3hlbCBwZXIgYXhpcywgaW4gdGhlIG9ic2VydmF0aW9ucycgdW5pdHMuICovXG4gIHZveGVsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbnNpdHlPcHRpb25zIHtcbiAgLyoqIEtlcm5lbCDPgyBwZXIgYXhpcywgaW4gdGhlIG9ic2VydmF0aW9ucycgdW5pdHMuICovXG4gIHNpZ21hOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIC8qKiBPYnNlcnZhdGlvbnMgdG8gaW5jbHVkZS4gRXZlcnkgb2JzZXJ2YXRpb24gd2hlbiBhYnNlbnQuICovXG4gIGluZGljZXM/OiBVaW50MzJBcnJheTtcbn1cblxuLyoqXG4gKiBUaGUgbGF0dGljZSB0byBlc3RpbWF0ZSBvbi5cbiAqXG4gKiBBIGRhdGFzZXQgd2l0aCBhIHJlZ2lzdGVyZWQgdm9sdW1lIGVzdGltYXRlcyBvbiB0aGF0IHZvbHVtZSdzIG93biBib3gsIHNvIHRoZVxuICogZmllbGQgbGFuZHMgZXhhY3RseSBvbiB0aGUgYW5hdG9teSBpdCB3aWxsIGJlIGRyYXduIGluc2lkZSDigJQgYHN0cmlkZWAgY29hcnNlbnNcbiAqIGl0IChkZW5zaXR5IGlzIHNtb290aCBieSBjb25zdHJ1Y3Rpb24sIGFuZCBhbiBlaWdodGggb2YgdGhlIHZveGVscyBpcyBhbiBlaWdodGhcbiAqIG9mIHRoZSB3b3JrKSB3aGlsZSBrZWVwaW5nIHRoZSBwaHlzaWNhbCBleHRlbnQgaWRlbnRpY2FsLCBzbyB0aGUgdHdvIHN0aWxsXG4gKiBhbGlnbi4gV2l0aG91dCBhIHZvbHVtZSB0aGUgYm94IGNvbWVzIGZyb20gdGhlIG9ic2VydmF0aW9ucycgb3duIGJvdW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbnNpdHlHcmlkKFxuICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgc3RyaWRlID0gMiwgdGFyZ2V0TG9uZ0F4aXMgPSAxMjgsIHpTdHJpZGUgPSBzdHJpZGUsXG4pOiBEZW5zaXR5R3JpZCB8IG51bGwge1xuICBjb25zdCB2b2x1bWUgPSBkYXRhc2V0LnZvbHVtZTtcbiAgaWYgKHZvbHVtZSkge1xuICAgIGNvbnN0IGNlbGxzID0gKG46IG51bWJlciwgYnk6IG51bWJlcikgPT4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKG4gLyBieSkpO1xuICAgIC8vIHogY2FuIGJlIGNvYXJzZW5lZCBsZXNzIHRoYW4geC95IOKAlCBhIGdlbmUgbWFwJ3Mgc2hlZXRzIG5lZWQgb25lIHBsYW5lIHBlclxuICAgIC8vIGltYWdlZCBzZWN0aW9uLCB3aGlsZSBpdHMgaW4tcGxhbmUgZGV0YWlsIGlzIHNtb290aCBieSBjb25zdHJ1Y3Rpb24uIFRoZVxuICAgIC8vIHBoeXNpY2FsIGV4dGVudCBpcyB1bmNoYW5nZWQgZWl0aGVyIHdheSwgc28gdGhlIGJveCBzdGlsbCBhbGlnbnMuXG4gICAgY29uc3QgW3csIGgsIGRdID0gW1xuICAgICAgY2VsbHModm9sdW1lLndpZHRoLCBzdHJpZGUpLCBjZWxscyh2b2x1bWUuaGVpZ2h0LCBzdHJpZGUpLCBjZWxscyh2b2x1bWUuZGVwdGgsIHpTdHJpZGUpLFxuICAgIF07XG4gICAgLy8gVm94ZWwgc2l6ZSBmcm9tIHRoZSBTUEFOLCBub3Qgc3RyaWRlIHggb3JpZ2luYWw6IGBjZWlsYCBjYW4gYWRkIGEgZnJhY3Rpb25cbiAgICAvLyBvZiBhIHZveGVsLCBhbmQgc2NhbGluZyB0aGUgb3JpZ2luYWwgc2l6ZSB3b3VsZCBwdXNoIHRoZSBmYXIgZWRnZSBwYXN0IHRoZVxuICAgIC8vIHJlZmVyZW5jZSB2b2x1bWUncy5cbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICBkZXB0aDogZCxcbiAgICAgIHZveGVsU2l6ZTogW1xuICAgICAgICAodm9sdW1lLndpZHRoICogdm9sdW1lLnZveGVsU2l6ZVswXSkgLyB3LFxuICAgICAgICAodm9sdW1lLmhlaWdodCAqIHZvbHVtZS52b3hlbFNpemVbMV0pIC8gaCxcbiAgICAgICAgKHZvbHVtZS5kZXB0aCAqIHZvbHVtZS52b3hlbFNpemVbMl0pIC8gZCxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICBpZiAoIW9icy56IHx8IG9icy5jb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIC8vIE1lYXN1cmVkIGZyb20gdGhlIGNvb3JkaW5hdGUgT1JJR0lOLCBub3QgZnJvbSB0aGUgY2xvdWQncyBvd24gbWluaW11bTogdGhlIGJveFxuICAvLyB0aGVuIGhhcyBpdHMgbmVhciBjb3JuZXIgYXQgdGhlIG9yaWdpbiBleGFjdGx5IGFzIGEgdm9sdW1lJ3MgZG9lcywgd2hpY2ggaXNcbiAgLy8gd2hhdCBsZXRzIGEgcmVuZGVyZXIgY2VudHJlIGVpdGhlciBvbmUgd2l0aCB0aGUgc2FtZSBoYWxmLWJveCBvZmZzZXQuIEEgY2xvdWRcbiAgLy8gc2l0dGluZyBmYXIgZnJvbSB0aGUgb3JpZ2luIGp1c3QgZ2V0cyBhIGNvYXJzZXIgZ3JpZCwgbm90IGEgd3Jvbmcgb25lLlxuICBjb25zdCBleHRlbnQgPSAodjogRmxvYXQzMkFycmF5KSA9PiB7XG4gICAgbGV0IGhpID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9icy5jb3VudDsgaSsrKSBpZiAodltpXSA+IGhpKSBoaSA9IHZbaV07XG4gICAgcmV0dXJuIE1hdGgubWF4KGhpLCAxKTtcbiAgfTtcbiAgY29uc3QgW3N4LCBzeSwgc3pdID0gW2V4dGVudChvYnMueCksIGV4dGVudChvYnMueSksIGV4dGVudChvYnMueildO1xuICBjb25zdCB2b3hlbCA9IE1hdGgubWF4KHN4LCBzeSwgc3opIC8gdGFyZ2V0TG9uZ0F4aXM7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IE1hdGgubWF4KDEsIE1hdGguY2VpbChzeCAvIHZveGVsKSksXG4gICAgaGVpZ2h0OiBNYXRoLm1heCgxLCBNYXRoLmNlaWwoc3kgLyB2b3hlbCkpLFxuICAgIGRlcHRoOiBNYXRoLm1heCgxLCBNYXRoLmNlaWwoc3ogLyB2b3hlbCkpLFxuICAgIHZveGVsU2l6ZTogW3ZveGVsLCB2b3hlbCwgdm94ZWxdLFxuICB9O1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHNlcGFyYWJsZSBHYXVzc2lhbiBhbG9uZyBvbmUgYXhpcyBvZiBhIHcgeCBoIHggZCBmaWVsZC5cbiAqXG4gKiBFeHBvcnRlZCBiZWNhdXNlIHRoZSBnZW5lLW1hcCB2b2x1bWUgZXN0aW1hdGVzIGEgZGlmZmVyZW50IHF1YW50aXR5IG9uIHRoZSBzYW1lXG4gKiBsYXR0aWNlIHdpdGggdGhlIHNhbWUga2VybmVsIChzZWUgYHNwYXRpYWwtZXhwcmVzc2lvbi50c2ApOiB0d28gY29waWVzIG9mIGFcbiAqIHNlcGFyYWJsZSBibHVyIHdvdWxkIGJlIHR3byBjaGFuY2VzIHRvIHNtb290aCB0aGUgZXN0aW1hdGUgYW5kIGl0cyBub3JtYWxpc2VyXG4gKiBkaWZmZXJlbnRseSwgd2hpY2ggaXMgdGhlIG9uZSB0aGluZyBhIE5hZGFyYXlhLVdhdHNvbiBmaWVsZCBjYW5ub3Qgc3Vydml2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJsdXJWb2x1bWVBeGlzKFxuICBmaWVsZDogRmxvYXQzMkFycmF5LCB3OiBudW1iZXIsIGg6IG51bWJlciwgZDogbnVtYmVyLCBheGlzOiAwIHwgMSB8IDIsIHNpZ21hVm94OiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCEoc2lnbWFWb3ggPiAwLjAxKSkgcmV0dXJuO1xuICBjb25zdCByYWRpdXMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwoc2lnbWFWb3ggKiAzKSk7XG4gIGNvbnN0IGtlcm5lbCA9IG5ldyBGbG9hdDMyQXJyYXkocmFkaXVzICogMiArIDEpO1xuICBsZXQgc3VtID0gMDtcbiAgZm9yIChsZXQgaSA9IC1yYWRpdXM7IGkgPD0gcmFkaXVzOyBpKyspIHtcbiAgICBjb25zdCB2ID0gTWF0aC5leHAoLShpICogaSkgLyAoMiAqIHNpZ21hVm94ICogc2lnbWFWb3gpKTtcbiAgICBrZXJuZWxbaSArIHJhZGl1c10gPSB2O1xuICAgIHN1bSArPSB2O1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2VybmVsLmxlbmd0aDsgaSsrKSBrZXJuZWxbaV0gLz0gc3VtO1xuXG4gIGNvbnN0IGxlbiA9IGF4aXMgPT09IDAgPyB3IDogYXhpcyA9PT0gMSA/IGggOiBkO1xuICBjb25zdCBzdHJpZGUgPSBheGlzID09PSAwID8gMSA6IGF4aXMgPT09IDEgPyB3IDogdyAqIGg7XG4gIGNvbnN0IGxpbmVzID0gYXhpcyA9PT0gMCA/IGggKiBkIDogYXhpcyA9PT0gMSA/IHcgKiBkIDogdyAqIGg7XG4gIGNvbnN0IGxpbmUgPSBuZXcgRmxvYXQzMkFycmF5KGxlbik7XG4gIGZvciAobGV0IGwgPSAwOyBsIDwgbGluZXM7IGwrKykge1xuICAgIC8vIE9mZnNldCBvZiB0aGlzIGxpbmUncyBmaXJzdCBlbGVtZW50OiB0aGUgdHdvIGF4ZXMgdGhhdCBhcmUgbm90IGJlaW5nXG4gICAgLy8gYmx1cnJlZCwgbGFpZCBiYWNrIG91dCBpbiB4LWZhc3Rlc3Qgb3JkZXIuXG4gICAgbGV0IGJhc2U6IG51bWJlcjtcbiAgICBpZiAoYXhpcyA9PT0gMCkgYmFzZSA9IChsICUgaCkgKiB3ICsgTWF0aC5mbG9vcihsIC8gaCkgKiB3ICogaDtcbiAgICBlbHNlIGlmIChheGlzID09PSAxKSBiYXNlID0gKGwgJSB3KSArIE1hdGguZmxvb3IobCAvIHcpICogdyAqIGg7XG4gICAgZWxzZSBiYXNlID0gbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSBsaW5lW2ldID0gZmllbGRbYmFzZSArIGkgKiBzdHJpZGVdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGxldCBhY2MgPSAwO1xuICAgICAgZm9yIChsZXQgayA9IC1yYWRpdXM7IGsgPD0gcmFkaXVzOyBrKyspIHtcbiAgICAgICAgLy8gQ2xhbXAgYXQgdGhlIGVkZ2VzOiB6ZXJvLXBhZGRpbmcgd291bGQgZGFya2VuIHRoZSBzcGVjaW1lbidzIG93blxuICAgICAgICAvLyBib3VuZGFyeSwgd2hpY2ggaXMgZXhhY3RseSB3aGVyZSBhIGNsdXN0ZXIgb2Z0ZW4gc2l0cy5cbiAgICAgICAgY29uc3QgaiA9IE1hdGgubWluKGxlbiAtIDEsIE1hdGgubWF4KDAsIGkgKyBrKSk7XG4gICAgICAgIGFjYyArPSBsaW5lW2pdICoga2VybmVsW2sgKyByYWRpdXNdO1xuICAgICAgfVxuICAgICAgZmllbGRbYmFzZSArIGkgKiBzdHJpZGVdID0gYWNjO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFdoaWNoIHogcGxhbmVzIG9mIHRoZSBncmlkIGNvbnRhaW4gYW55IG9ic2VydmF0aW9uIGF0IGFsbCDigJQgdGhlIHNhbXBsZWRcbiAqIHN1cHBvcnQsIHRha2VuIGZyb20gdGhlIFdIT0xFIGRhdGFzZXQgcmF0aGVyIHRoYW4gZnJvbSB0aGUgc3Vic2V0IGJlaW5nXG4gKiByYXN0ZXJpc2VkLiBBIHJhcmUgY2x1c3RlciBpcyBzcGFyc2UgYmVjYXVzZSBpdCBpcyByYXJlOyB0aGUgZ2FwcyBiZXR3ZWVuXG4gKiBzZWN0aW9ucyBhcmUgZW1wdHkgYmVjYXVzZSBub2JvZHkgaW1hZ2VkIHRoZXJlLCBhbmQgb25seSB0aGUgc2Vjb25kIGlzIGFcbiAqIHNhbXBsaW5nIGFydGVmYWN0IHRvIGNvcnJlY3QgZm9yLlxuICovXG5mdW5jdGlvbiBzYW1wbGVkUGxhbmVzKFxuICBvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIGdyaWQ6IERlbnNpdHlHcmlkLFxuKTogeyBjb3ZlcjogRmxvYXQzMkFycmF5OyBmaXJzdDogbnVtYmVyOyBsYXN0OiBudW1iZXIgfSB7XG4gIGNvbnN0IGNvdmVyID0gbmV3IEZsb2F0MzJBcnJheShncmlkLmRlcHRoKTtcbiAgY29uc3QgeiA9IG9icy56O1xuICBpZiAoIXopIHJldHVybiB7IGNvdmVyOiBjb3Zlci5maWxsKDEpLCBmaXJzdDogMCwgbGFzdDogZ3JpZC5kZXB0aCAtIDEgfTtcbiAgbGV0IGZpcnN0ID0gZ3JpZC5kZXB0aDtcbiAgbGV0IGxhc3QgPSAtMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYnMuY291bnQ7IGkrKykge1xuICAgIGNvbnN0IGsgPSBNYXRoLmZsb29yKHpbaV0gLyBncmlkLnZveGVsU2l6ZVsyXSk7XG4gICAgaWYgKGsgPCAwIHx8IGsgPj0gZ3JpZC5kZXB0aCkgY29udGludWU7XG4gICAgY292ZXJba10gPSAxO1xuICAgIGlmIChrIDwgZmlyc3QpIGZpcnN0ID0gaztcbiAgICBpZiAoayA+IGxhc3QpIGxhc3QgPSBrO1xuICB9XG4gIHJldHVybiB7IGNvdmVyLCBmaXJzdCwgbGFzdCB9O1xufVxuXG4vKiogQmx1ciBhIDFEIHByb2ZpbGUgd2l0aCB0aGUgc2FtZSBrZXJuZWwgYGJsdXJWb2x1bWVBeGlzYCB1c2VzLCBzbyB0aGUgY29ycmVjdGlvbiBhbmRcbiAqICB0aGUgZmllbGQgYXJlIHNtb290aGVkIGlkZW50aWNhbGx5LiAqL1xuZnVuY3Rpb24gYmx1cjFkKHByb2ZpbGU6IEZsb2F0MzJBcnJheSwgc2lnbWFWb3g6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IG91dCA9IHByb2ZpbGUuc2xpY2UoKTtcbiAgYmx1clZvbHVtZUF4aXMob3V0LCAxLCAxLCBvdXQubGVuZ3RoLCAyLCBzaWdtYVZveCk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmFzdGVyaXNlIG9ic2VydmF0aW9ucyBpbnRvIGEgdWludDggZGVuc2l0eSBmaWVsZCBvbiBgZ3JpZGAuXG4gKlxuICogUmV0dXJuZWQgYXMgdWludDggc2NhbGVkIHRvIGl0cyBvd24gbWF4aW11bTogYSBgVm9sdW1lTGF5ZXJgIHJlbmRlcnMgMC4uMjU1LCBhbmRcbiAqIHRoZSBhYnNvbHV0ZSBjZWxsIGNvdW50IHBlciB2b3hlbCBpcyBub3QgdGhlIHJlYWRhYmxlIHF1YW50aXR5IGFueXdheSDigJQgd2hlcmVcbiAqIHRoZSBjbHVzdGVyIGlzIGRlbnNlIFJFTEFUSVZFIHRvIGl0c2VsZiBpcy4gTnVsbCB3aGVuIG5vdGhpbmcgbGFuZHMgb24gdGhlIGdyaWQsXG4gKiBzbyB0aGUgY2FsbGVyIGRyYXdzIG5vIGxheWVyIHJhdGhlciB0aGFuIGFuIGVtcHR5IGJveC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhc3Rlcml6ZURlbnNpdHkoXG4gIG9iczogU3BhdGlhbE9ic2VydmF0aW9ucywgZ3JpZDogRGVuc2l0eUdyaWQsIG9wdHM6IERlbnNpdHlPcHRpb25zLFxuKTogVWludDhBcnJheSB8IG51bGwge1xuICBjb25zdCB7IHdpZHRoOiB3LCBoZWlnaHQ6IGgsIGRlcHRoOiBkLCB2b3hlbFNpemUgfSA9IGdyaWQ7XG4gIGNvbnN0IGZpZWxkID0gbmV3IEZsb2F0MzJBcnJheSh3ICogaCAqIGQpO1xuICBjb25zdCBpZHggPSBvcHRzLmluZGljZXM7XG4gIGNvbnN0IG4gPSBpZHggPyBpZHgubGVuZ3RoIDogb2JzLmNvdW50O1xuICBjb25zdCB6ID0gb2JzLno7XG4gIGxldCBwbGFjZWQgPSAwO1xuICBmb3IgKGxldCBrID0gMDsgayA8IG47IGsrKykge1xuICAgIGNvbnN0IGkgPSBpZHggPyBpZHhba10gOiBrO1xuICAgIGNvbnN0IHZ4ID0gTWF0aC5mbG9vcihvYnMueFtpXSAvIHZveGVsU2l6ZVswXSk7XG4gICAgY29uc3QgdnkgPSBNYXRoLmZsb29yKG9icy55W2ldIC8gdm94ZWxTaXplWzFdKTtcbiAgICBjb25zdCB2eiA9IHogPyBNYXRoLmZsb29yKHpbaV0gLyB2b3hlbFNpemVbMl0pIDogMDtcbiAgICBpZiAodnggPCAwIHx8IHZ4ID49IHcgfHwgdnkgPCAwIHx8IHZ5ID49IGggfHwgdnogPCAwIHx8IHZ6ID49IGQpIGNvbnRpbnVlO1xuICAgIGZpZWxkWyh2eiAqIGggKyB2eSkgKiB3ICsgdnhdICs9IDE7XG4gICAgcGxhY2VkKys7XG4gIH1cbiAgaWYgKCFwbGFjZWQpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHNpZ21hVm94OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgb3B0cy5zaWdtYVswXSAvIHZveGVsU2l6ZVswXSwgb3B0cy5zaWdtYVsxXSAvIHZveGVsU2l6ZVsxXSwgb3B0cy5zaWdtYVsyXSAvIHZveGVsU2l6ZVsyXSxcbiAgXTtcbiAgYmx1clZvbHVtZUF4aXMoZmllbGQsIHcsIGgsIGQsIDAsIHNpZ21hVm94WzBdKTtcbiAgYmx1clZvbHVtZUF4aXMoZmllbGQsIHcsIGgsIGQsIDEsIHNpZ21hVm94WzFdKTtcbiAgYmx1clZvbHVtZUF4aXMoZmllbGQsIHcsIGgsIGQsIDIsIHNpZ21hVm94WzJdKTtcblxuICAvLyBDb3ZlcmFnZSBjb3JyZWN0aW9uLCBwZXIgcGxhbmU6IHRoZSBzYW1lIGtlcm5lbCBvdmVyIHRoZSBzYW1wbGVkIHN1cHBvcnQgc2F5c1xuICAvLyBob3cgbXVjaCBvZiBlYWNoIHBsYW5lJ3MgbmVpZ2hib3VyaG9vZCB3YXMgYWN0dWFsbHkgaW1hZ2VkLlxuICBjb25zdCB7IGNvdmVyLCBmaXJzdCwgbGFzdCB9ID0gc2FtcGxlZFBsYW5lcyhvYnMsIGdyaWQpO1xuICBjb25zdCBzbW9vdGhlZENvdmVyID0gYmx1cjFkKGNvdmVyLCBzaWdtYVZveFsyXSk7XG4gIGxldCBtYXggPSAwO1xuICBjb25zdCBwbGFuZSA9IHcgKiBoO1xuICBmb3IgKGxldCBrID0gMDsgayA8IGQ7IGsrKykge1xuICAgIC8vIE9VVFNJREUgdGhlIHNhbXBsZWQgcmFuZ2UgdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcnBvbGF0ZSBiZXR3ZWVuLCBvbmx5XG4gICAgLy8gb25lIHNpZGUgdG8gZXh0cmFwb2xhdGUgZnJvbSDigJQgc28gdGhlIGZpZWxkIGlzIHplcm9lZCByYXRoZXIgdGhhbiBzY2FsZWQuXG4gICAgLy8gVGhlIGJsdXIgbGVhdmVzIGEgcG9zaXRpdmUgdGFpbCBwYXN0IHRoZSBmaXJzdCBhbmQgbGFzdCBpbWFnZWQgcGxhbmVzLCBhbmRcbiAgICAvLyBrZWVwaW5nIGl0IHdvdWxkIHB1dCBlc3RpbWF0ZWQgY2VsbHMgaW4gZnJvbnQgb2YgdGhlIHNwZWNpbWVuJ3MgZmlyc3RcbiAgICAvLyBzZWN0aW9uIGFuZCBiZWhpbmQgaXRzIGxhc3QsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBcInNtb290aGVkIEJFVFdFRU4gdGhlXG4gICAgLy8gaW1hZ2VkIHNlY3Rpb25zXCIgcHJvbWlzZXMgbm90IHRvIGRvLlxuICAgIGlmIChrIDwgZmlyc3QgfHwgayA+IGxhc3QpIHtcbiAgICAgIGZpZWxkLmZpbGwoMCwgayAqIHBsYW5lLCAoayArIDEpICogcGxhbmUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEluc2lkZSBpdCwgdGhlIGNvcnJlY3Rpb24gQlJJREdFUyBnYXBzLiBDYXBwaW5nIHRoZSBhbXBsaWZpY2F0aW9uIGF0IDJ4XG4gICAgLy8gKGNvdmVyYWdlIGZsb29yZWQgYXQgMC41KSBsaWZ0cyBhIHBsYW5lIHNpdHRpbmcgYmV0d2VlbiB0d28gaW1hZ2VkIHNlY3Rpb25zXG4gICAgLy8g4oCUIHdoZXJlIGEgYmFuZHdpZHRoIHNwYW5uaW5nIG9uZSBnYXAgbGVhdmVzIGNvdmVyYWdlIGFyb3VuZCBhIGhhbGYg4oCUXG4gICAgLy8gd2l0aG91dCBpbmZsYXRpbmcgYSB0cmFjZSBvZiBzbW9vdGhpbmcgbGVha2FnZSBpbnRvIGEgc2lnbmFsLlxuICAgIGNvbnN0IHNjYWxlID0gMSAvIE1hdGgubWF4KHNtb290aGVkQ292ZXJba10sIDAuNSk7XG4gICAgZm9yIChsZXQgaSA9IGsgKiBwbGFuZTsgaSA8IChrICsgMSkgKiBwbGFuZTsgaSsrKSB7XG4gICAgICBjb25zdCB2ID0gZmllbGRbaV0gKiBzY2FsZTtcbiAgICAgIGZpZWxkW2ldID0gdjtcbiAgICAgIGlmICh2ID4gbWF4KSBtYXggPSB2O1xuICAgIH1cbiAgfVxuICBpZiAoIShtYXggPiAwKSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoZmllbGQubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZC5sZW5ndGg7IGkrKykgb3V0W2ldID0gTWF0aC5yb3VuZCgoZmllbGRbaV0gLyBtYXgpICogMjU1KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGtlcm5lbCBmb3IgYSBncmlkOiBpbi1wbGFuZSB0aWdodCwgYWxvbmcgeiBhdCBsZWFzdCB0aGUgc2VjdGlvblxuICogc3BhY2luZy5cbiAqXG4gKiBUaGUgeiB0ZXJtIGlzIHRoZSBsb2FkLWJlYXJpbmcgb25lIOKAlCAxLjUgdm94ZWxzIG9mIGEgZ3JpZCB3aG9zZSBkZXB0aCB2b3hlbCBJU1xuICogdGhlIHNlY3Rpb24gc3BhY2luZyBwdXRzIM+DIGp1c3QgYWJvdmUgb25lIHNlY3Rpb24gZ2FwLCB3aGljaCBpcyB0aGUgc21hbGxlc3RcbiAqIGJhbmR3aWR0aCB0aGF0IGNhbiBicmlkZ2Ugb25lIHdpdGhvdXQgbGVhdmluZyBhIGRpc2MgcGVyIHBsYW5lLiBgc21vb3RoaW5nYFxuICogc2NhbGVzIGFsbCB0aHJlZSBmb3IgdGhlIHVzZXIgY29udHJvbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRTaWdtYShncmlkOiBEZW5zaXR5R3JpZCwgc21vb3RoaW5nID0gMSk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gIHJldHVybiBbXG4gICAgZ3JpZC52b3hlbFNpemVbMF0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gICAgZ3JpZC52b3hlbFNpemVbMV0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gICAgZ3JpZC52b3hlbFNpemVbMl0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gIF07XG59XG4iXX0=
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1kZW5zaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtZGVuc2l0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF3Q0E7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixPQUF1QixFQUN2QixNQUFNLEdBQUcsQ0FBQyxFQUNWLGNBQWMsR0FBRyxHQUFHLEVBQ3BCLE9BQU8sR0FBRyxNQUFNO0lBRWhCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDOUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RSw0RUFBNEU7UUFDNUUsMkVBQTJFO1FBQzNFLG9FQUFvRTtRQUNwRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDNUcsNkVBQTZFO1FBQzdFLDZFQUE2RTtRQUM3RSxzQkFBc0I7UUFDdEIsT0FBTztZQUNMLEtBQUssRUFBRSxDQUFDO1lBQ1IsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsQ0FBQztZQUNSLFNBQVMsRUFBRTtnQkFDVCxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hDLENB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QUFHLFNBQVM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsU0FBUztLQUNwQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNwYXRpYWxEYXRhc2V0LCBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5cbi8qKlxuICogVHVybmluZyBhIGNlbGwgY2xvdWQgaW50byBhIGRlbnNpdHkgZmllbGQg4oCUIHRoZSBob25lc3Qgd2F5IHRvIHJlbmRlciBhIGNsdXN0ZXJcbiAqIGluIDNEIHdoZW4gdGhlIHNlY3Rpb25zIGl0IHdhcyBtZWFzdXJlZCBvbiBhcmUgaHVuZHJlZHMgb2YgbWljcm9ucyBhcGFydC5cbiAqXG4gKiBJbmRpdmlkdWFsIGNlbGxzIENBTk5PVCBiZSBpbnRlcnBvbGF0ZWQgYmV0d2VlbiBzZWN0aW9uczogY29uc2VjdXRpdmUgc2VjdGlvbnNcbiAqIHNhbXBsZSBlbnRpcmVseSBkaWZmZXJlbnQgY2VsbHMsIHNvIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRlbmNlIHRvIGludGVycG9sYXRlXG4gKiBhbG9uZywgYW5kIGludmVudGluZyBwb3NpdGlvbnMgd291bGQgZmFicmljYXRlIG9ic2VydmF0aW9ucyBpbmRpc3Rpbmd1aXNoYWJsZVxuICogZnJvbSBtZWFzdXJlZCBvbmVzLiBBIGRlbnNpdHkgZmllbGQgaXMgYSBkaWZmZXJlbnQgb2JqZWN0OiBhIGNvbnRpbnVvdXNcbiAqIGVzdGltYXRlLCBsZWdpdGltYXRlbHkgZGVmaW5lZCBiZXR3ZWVuIHRoZSBwbGFuZXMgdGhhdCB3ZXJlIGltYWdlZCwgYW5kIGl0XG4gKiByZW5kZXJzIGFzIGEgdHJhbnNsdWNlbnQgY2xvdWQgcmF0aGVyIHRoYW4gYXMgZG90cywgc28gaXQgcmVhZHMgYXMgYW4gZXN0aW1hdGUuXG4gKlxuICogVHdvIHRoaW5ncyBtYWtlIHRoZSBlc3RpbWF0ZSBob25lc3QgcmF0aGVyIHRoYW4gZGVjb3JhdGl2ZSwgYW5kIGJvdGggYXJlXG4gKiBpbXBsZW1lbnRlZCBoZXJlOlxuICogIC0gdGhlIGtlcm5lbCBpcyAqKmFuaXNvdHJvcGljKiosIHdpdGggYSB6IGJhbmR3aWR0aCBhdCBsZWFzdCB0aGUgc2VjdGlvblxuICogICAgc3BhY2luZy4gQW4gaXNvdHJvcGljIGtlcm5lbCBsZWF2ZXMgb25lIGRpc2MgcGVyIHNlY3Rpb24g4oCUIGEgc2FtcGxpbmdcbiAqICAgIGFydGVmYWN0IHRoYXQgbG9va3MgbGlrZSBiaW9sb2d5O1xuICogIC0gdGhlIGZpZWxkIGlzICoqY292ZXJhZ2Utbm9ybWFsaXNlZCoqIGFsb25nIHogKE5hZGFyYXlh4oCTV2F0c29uKTogdW5zYW1wbGVkXG4gKiAgICBwbGFuZXMgd291bGQgb3RoZXJ3aXNlIHJlYWQgYXMgZ2VudWluZWx5IGVtcHR5IHRpc3N1ZSByYXRoZXIgdGhhbiBhcyB0aXNzdWVcbiAqICAgIG5vYm9keSBpbWFnZWQuXG4gKi9cblxuLyoqIFRoZSB2b3hlbCBsYXR0aWNlIGEgZGVuc2l0eSBmaWVsZCBpcyBlc3RpbWF0ZWQgb24uICovXG5leHBvcnQgaW50ZXJmYWNlIERlbnNpdHlHcmlkIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGRlcHRoOiBudW1iZXI7XG4gIC8qKiBXb3JsZCBzaXplIG9mIG9uZSB2b3hlbCBwZXIgYXhpcywgaW4gdGhlIG9ic2VydmF0aW9ucycgdW5pdHMuICovXG4gIHZveGVsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xufVxuXG4vKiogS2VybmVsIGFuZCBvYnNlcnZhdGlvbiBzdWJzZXQgZm9yIGEgZGVuc2l0eSBlc3RpbWF0ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVuc2l0eU9wdGlvbnMge1xuICAvKiogS2VybmVsIM+DIHBlciBheGlzLCBpbiB0aGUgb2JzZXJ2YXRpb25zJyB1bml0cy4gKi9cbiAgc2lnbWE6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgLyoqIE9ic2VydmF0aW9ucyB0byBpbmNsdWRlLiBFdmVyeSBvYnNlcnZhdGlvbiB3aGVuIGFic2VudC4gKi9cbiAgaW5kaWNlcz86IFVpbnQzMkFycmF5O1xufVxuXG4vKipcbiAqIFRoZSBsYXR0aWNlIHRvIGVzdGltYXRlIG9uLlxuICpcbiAqIEEgZGF0YXNldCB3aXRoIGEgcmVnaXN0ZXJlZCB2b2x1bWUgZXN0aW1hdGVzIG9uIHRoYXQgdm9sdW1lJ3Mgb3duIGJveCwgc28gdGhlXG4gKiBmaWVsZCBsYW5kcyBleGFjdGx5IG9uIHRoZSBhbmF0b215IGl0IHdpbGwgYmUgZHJhd24gaW5zaWRlIOKAlCBgc3RyaWRlYCBjb2Fyc2Vuc1xuICogaXQgKGRlbnNpdHkgaXMgc21vb3RoIGJ5IGNvbnN0cnVjdGlvbiwgYW5kIGFuIGVpZ2h0aCBvZiB0aGUgdm94ZWxzIGlzIGFuIGVpZ2h0aFxuICogb2YgdGhlIHdvcmspIHdoaWxlIGtlZXBpbmcgdGhlIHBoeXNpY2FsIGV4dGVudCBpZGVudGljYWwsIHNvIHRoZSB0d28gc3RpbGxcbiAqIGFsaWduLiBXaXRob3V0IGEgdm9sdW1lIHRoZSBib3ggY29tZXMgZnJvbSB0aGUgb2JzZXJ2YXRpb25zJyBvd24gYm91bmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVuc2l0eUdyaWQoXG4gIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICBzdHJpZGUgPSAyLFxuICB0YXJnZXRMb25nQXhpcyA9IDEyOCxcbiAgelN0cmlkZSA9IHN0cmlkZSxcbik6IERlbnNpdHlHcmlkIHwgbnVsbCB7XG4gIGNvbnN0IHZvbHVtZSA9IGRhdGFzZXQudm9sdW1lO1xuICBpZiAodm9sdW1lKSB7XG4gICAgY29uc3QgY2VsbHMgPSAobjogbnVtYmVyLCBieTogbnVtYmVyKSA9PiBNYXRoLm1heCgxLCBNYXRoLmNlaWwobiAvIGJ5KSk7XG4gICAgLy8geiBjYW4gYmUgY29hcnNlbmVkIGxlc3MgdGhhbiB4L3kg4oCUIGEgZ2VuZSBtYXAncyBzaGVldHMgbmVlZCBvbmUgcGxhbmUgcGVyXG4gICAgLy8gaW1hZ2VkIHNlY3Rpb24sIHdoaWxlIGl0cyBpbi1wbGFuZSBkZXRhaWwgaXMgc21vb3RoIGJ5IGNvbnN0cnVjdGlvbi4gVGhlXG4gICAgLy8gcGh5c2ljYWwgZXh0ZW50IGlzIHVuY2hhbmdlZCBlaXRoZXIgd2F5LCBzbyB0aGUgYm94IHN0aWxsIGFsaWducy5cbiAgICBjb25zdCBbdywgaCwgZF0gPSBbY2VsbHModm9sdW1lLndpZHRoLCBzdHJpZGUpLCBjZWxscyh2b2x1bWUuaGVpZ2h0LCBzdHJpZGUpLCBjZWxscyh2b2x1bWUuZGVwdGgsIHpTdHJpZGUpXTtcbiAgICAvLyBWb3hlbCBzaXplIGZyb20gdGhlIFNQQU4sIG5vdCBzdHJpZGUgeCBvcmlnaW5hbDogYGNlaWxgIGNhbiBhZGQgYSBmcmFjdGlvblxuICAgIC8vIG9mIGEgdm94ZWwsIGFuZCBzY2FsaW5nIHRoZSBvcmlnaW5hbCBzaXplIHdvdWxkIHB1c2ggdGhlIGZhciBlZGdlIHBhc3QgdGhlXG4gICAgLy8gcmVmZXJlbmNlIHZvbHVtZSdzLlxuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogdyxcbiAgICAgIGhlaWdodDogaCxcbiAgICAgIGRlcHRoOiBkLFxuICAgICAgdm94ZWxTaXplOiBbXG4gICAgICAgICh2b2x1bWUud2lkdGggKiB2b2x1bWUudm94ZWxTaXplWzBdKSAvIHcsXG4gICAgICAgICh2b2x1bWUuaGVpZ2h0ICogdm9sdW1lLnZveGVsU2l6ZVsxXSkgLyBoLFxuICAgICAgICAodm9sdW1lLmRlcHRoICogdm9sdW1lLnZveGVsU2l6ZVsyXSkgLyBkLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gIGlmICghb2JzLnogfHwgb2JzLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgLy8gTWVhc3VyZWQgZnJvbSB0aGUgY29vcmRpbmF0ZSBPUklHSU4sIG5vdCBmcm9tIHRoZSBjbG91ZCdzIG93biBtaW5pbXVtOiB0aGUgYm94XG4gIC8vIHRoZW4gaGFzIGl0cyBuZWFyIGNvcm5lciBhdCB0aGUgb3JpZ2luIGV4YWN0bHkgYXMgYSB2b2x1bWUncyBkb2VzLCB3aGljaCBpc1xuICAvLyB3aGF0IGxldHMgYSByZW5kZXJlciBjZW50cmUgZWl0aGVyIG9uZSB3aXRoIHRoZSBzYW1lIGhhbGYtYm94IG9mZnNldC4gQSBjbG91ZFxuICAvLyBzaXR0aW5nIGZhciBmcm9tIHRoZSBvcmlnaW4ganVzdCBnZXRzIGEgY29hcnNlciBncmlkLCBub3QgYSB3cm9uZyBvbmUuXG4gIGNvbnN0IGV4dGVudCA9ICh2OiBGbG9hdDMyQXJyYXkpID0+IHtcbiAgICBsZXQgaGkgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JzLmNvdW50OyBpKyspIGlmICh2W2ldID4gaGkpIGhpID0gdltpXTtcbiAgICByZXR1cm4gTWF0aC5tYXgoaGksIDEpO1xuICB9O1xuICBjb25zdCBbc3gsIHN5LCBzel0gPSBbZXh0ZW50KG9icy54KSwgZXh0ZW50KG9icy55KSwgZXh0ZW50KG9icy56KV07XG4gIGNvbnN0IHZveGVsID0gTWF0aC5tYXgoc3gsIHN5LCBzeikgLyB0YXJnZXRMb25nQXhpcztcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHN4IC8gdm94ZWwpKSxcbiAgICBoZWlnaHQ6IE1hdGgubWF4KDEsIE1hdGguY2VpbChzeSAvIHZveGVsKSksXG4gICAgZGVwdGg6IE1hdGgubWF4KDEsIE1hdGguY2VpbChzeiAvIHZveGVsKSksXG4gICAgdm94ZWxTaXplOiBbdm94ZWwsIHZveGVsLCB2b3hlbF0sXG4gIH07XG59XG5cbi8qKlxuICogQSBub3JtYWxpc2VkIDEtRCBHYXVzc2lhbiBrZXJuZWwgb2YgcmFkaXVzIGBjZWlsKDPPgylgIChhdCBsZWFzdCAxKSwgY2VudHJlIGF0XG4gKiBpbmRleCBgcmFkaXVzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdXNzaWFuS2VybmVsKHNpZ21hOiBudW1iZXIpOiB7IGtlcm5lbDogRmxvYXQzMkFycmF5OyByYWRpdXM6IG51bWJlciB9IHtcbiAgY29uc3QgcmFkaXVzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHNpZ21hICogMykpO1xuICBjb25zdCBrZXJuZWwgPSBuZXcgRmxvYXQzMkFycmF5KHJhZGl1cyAqIDIgKyAxKTtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAobGV0IGkgPSAtcmFkaXVzOyBpIDw9IHJhZGl1czsgaSsrKSB7XG4gICAgY29uc3QgdiA9IE1hdGguZXhwKC0oaSAqIGkpIC8gKDIgKiBzaWdtYSAqIHNpZ21hKSk7XG4gICAga2VybmVsW2kgKyByYWRpdXNdID0gdjtcbiAgICBzdW0gKz0gdjtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtlcm5lbC5sZW5ndGg7IGkrKykga2VybmVsW2ldIC89IHN1bTtcbiAgcmV0dXJuIHsga2VybmVsLCByYWRpdXMgfTtcbn1cblxuLyoqXG4gKiBJbi1wbGFjZSBzZXBhcmFibGUgR2F1c3NpYW4gYWxvbmcgb25lIGF4aXMgb2YgYSB3IHggaCB4IGQgZmllbGQuIEEgMi1EIGZpZWxkIGlzXG4gKiB0aGUgYGQgPSAxYCBjYXNlLlxuICpcbiAqIFRoZSBPTkUgYmx1ciBmb3IgZXZlcnkgZmllbGQgaW4gdGhpcyBmb2xkZXI6IHRoZSAyLUQgZ2VuZSBtYXAsIHRoZSBnZW5lLW1hcFxuICogdm9sdW1lIGFuZCB0aGUgZGVuc2l0eSB2b2x1bWVzIGFsbCBzbW9vdGggdGhyb3VnaCBpdC4gVHdvIGNvcGllcyBvZiBhIHNlcGFyYWJsZVxuICogYmx1ciB3b3VsZCBiZSB0d28gY2hhbmNlcyB0byBzbW9vdGggYW4gZXN0aW1hdGUgYW5kIGl0cyBub3JtYWxpc2VyIGRpZmZlcmVudGx5LFxuICogd2hpY2ggaXMgdGhlIG9uZSB0aGluZyBhIE5hZGFyYXlhLVdhdHNvbiBmaWVsZCBjYW5ub3Qgc3Vydml2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJsdXJWb2x1bWVBeGlzKFxuICBmaWVsZDogRmxvYXQzMkFycmF5LFxuICB3OiBudW1iZXIsXG4gIGg6IG51bWJlcixcbiAgZDogbnVtYmVyLFxuICBheGlzOiAwIHwgMSB8IDIsXG4gIHNpZ21hVm94OiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgaWYgKCEoc2lnbWFWb3ggPiAwLjAxKSkgcmV0dXJuO1xuICBjb25zdCB7IGtlcm5lbCwgcmFkaXVzIH0gPSBnYXVzc2lhbktlcm5lbChzaWdtYVZveCk7XG5cbiAgY29uc3QgbGVuID0gYXhpcyA9PT0gMCA/IHcgOiBheGlzID09PSAxID8gaCA6IGQ7XG4gIGNvbnN0IHN0cmlkZSA9IGF4aXMgPT09IDAgPyAxIDogYXhpcyA9PT0gMSA/IHcgOiB3ICogaDtcbiAgY29uc3QgbGluZXMgPSBheGlzID09PSAwID8gaCAqIGQgOiBheGlzID09PSAxID8gdyAqIGQgOiB3ICogaDtcbiAgY29uc3QgbGluZSA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgZm9yIChsZXQgbCA9IDA7IGwgPCBsaW5lczsgbCsrKSB7XG4gICAgLy8gT2Zmc2V0IG9mIHRoaXMgbGluZSdzIGZpcnN0IGVsZW1lbnQ6IHRoZSB0d28gYXhlcyB0aGF0IGFyZSBub3QgYmVpbmdcbiAgICAvLyBibHVycmVkLCBsYWlkIGJhY2sgb3V0IGluIHgtZmFzdGVzdCBvcmRlci5cbiAgICBsZXQgYmFzZTogbnVtYmVyO1xuICAgIGlmIChheGlzID09PSAwKSBiYXNlID0gKGwgJSBoKSAqIHcgKyBNYXRoLmZsb29yKGwgLyBoKSAqIHcgKiBoO1xuICAgIGVsc2UgaWYgKGF4aXMgPT09IDEpIGJhc2UgPSAobCAlIHcpICsgTWF0aC5mbG9vcihsIC8gdykgKiB3ICogaDtcbiAgICBlbHNlIGJhc2UgPSBsO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIGxpbmVbaV0gPSBmaWVsZFtiYXNlICsgaSAqIHN0cmlkZV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgbGV0IGFjYyA9IDA7XG4gICAgICBmb3IgKGxldCBrID0gLXJhZGl1czsgayA8PSByYWRpdXM7IGsrKykge1xuICAgICAgICAvLyBDbGFtcCBhdCB0aGUgZWRnZXM6IHplcm8tcGFkZGluZyB3b3VsZCBkYXJrZW4gdGhlIHNwZWNpbWVuJ3Mgb3duXG4gICAgICAgIC8vIGJvdW5kYXJ5LCB3aGljaCBpcyBleGFjdGx5IHdoZXJlIGEgY2x1c3RlciBvZnRlbiBzaXRzLlxuICAgICAgICBjb25zdCBqID0gTWF0aC5taW4obGVuIC0gMSwgTWF0aC5tYXgoMCwgaSArIGspKTtcbiAgICAgICAgYWNjICs9IGxpbmVbal0gKiBrZXJuZWxbayArIHJhZGl1c107XG4gICAgICB9XG4gICAgICBmaWVsZFtiYXNlICsgaSAqIHN0cmlkZV0gPSBhY2M7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV2hpY2ggeiBwbGFuZXMgb2YgdGhlIGdyaWQgY29udGFpbiBhbnkgb2JzZXJ2YXRpb24gYXQgYWxsIOKAlCB0aGUgc2FtcGxlZFxuICogc3VwcG9ydCwgdGFrZW4gZnJvbSB0aGUgV0hPTEUgZGF0YXNldCByYXRoZXIgdGhhbiBmcm9tIHRoZSBzdWJzZXQgYmVpbmdcbiAqIHJhc3RlcmlzZWQuIEEgcmFyZSBjbHVzdGVyIGlzIHNwYXJzZSBiZWNhdXNlIGl0IGlzIHJhcmU7IHRoZSBnYXBzIGJldHdlZW5cbiAqIHNlY3Rpb25zIGFyZSBlbXB0eSBiZWNhdXNlIG5vYm9keSBpbWFnZWQgdGhlcmUsIGFuZCBvbmx5IHRoZSBzZWNvbmQgaXMgYVxuICogc2FtcGxpbmcgYXJ0ZWZhY3QgdG8gY29ycmVjdCBmb3IuXG4gKi9cbmZ1bmN0aW9uIHNhbXBsZWRQbGFuZXMoXG4gIG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgZ3JpZDogRGVuc2l0eUdyaWQsXG4pOiB7IGNvdmVyOiBGbG9hdDMyQXJyYXk7IGZpcnN0OiBudW1iZXI7IGxhc3Q6IG51bWJlciB9IHtcbiAgY29uc3QgY292ZXIgPSBuZXcgRmxvYXQzMkFycmF5KGdyaWQuZGVwdGgpO1xuICBjb25zdCB6ID0gb2JzLno7XG4gIGlmICgheikgcmV0dXJuIHsgY292ZXI6IGNvdmVyLmZpbGwoMSksIGZpcnN0OiAwLCBsYXN0OiBncmlkLmRlcHRoIC0gMSB9O1xuICBsZXQgZmlyc3QgPSBncmlkLmRlcHRoO1xuICBsZXQgbGFzdCA9IC0xO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9icy5jb3VudDsgaSsrKSB7XG4gICAgY29uc3QgayA9IE1hdGguZmxvb3IoeltpXSAvIGdyaWQudm94ZWxTaXplWzJdKTtcbiAgICBpZiAoayA8IDAgfHwgayA+PSBncmlkLmRlcHRoKSBjb250aW51ZTtcbiAgICBjb3ZlcltrXSA9IDE7XG4gICAgaWYgKGsgPCBmaXJzdCkgZmlyc3QgPSBrO1xuICAgIGlmIChrID4gbGFzdCkgbGFzdCA9IGs7XG4gIH1cbiAgcmV0dXJuIHsgY292ZXIsIGZpcnN0LCBsYXN0IH07XG59XG5cbi8qKiBCbHVyIGEgMUQgcHJvZmlsZSB3aXRoIHRoZSBzYW1lIGtlcm5lbCBgYmx1clZvbHVtZUF4aXNgIHVzZXMsIHNvIHRoZSBjb3JyZWN0aW9uIGFuZFxuICogIHRoZSBmaWVsZCBhcmUgc21vb3RoZWQgaWRlbnRpY2FsbHkuICovXG5mdW5jdGlvbiBibHVyMWQocHJvZmlsZTogRmxvYXQzMkFycmF5LCBzaWdtYVZveDogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3Qgb3V0ID0gcHJvZmlsZS5zbGljZSgpO1xuICBibHVyVm9sdW1lQXhpcyhvdXQsIDEsIDEsIG91dC5sZW5ndGgsIDIsIHNpZ21hVm94KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSYXN0ZXJpc2Ugb2JzZXJ2YXRpb25zIGludG8gYSB1aW50OCBkZW5zaXR5IGZpZWxkIG9uIGBncmlkYC5cbiAqXG4gKiBSZXR1cm5lZCBhcyB1aW50OCBzY2FsZWQgdG8gaXRzIG93biBtYXhpbXVtOiBhIGBWb2x1bWVMYXllcmAgcmVuZGVycyAwLi4yNTUsIGFuZFxuICogdGhlIGFic29sdXRlIGNlbGwgY291bnQgcGVyIHZveGVsIGlzIG5vdCB0aGUgcmVhZGFibGUgcXVhbnRpdHkgYW55d2F5IOKAlCB3aGVyZVxuICogdGhlIGNsdXN0ZXIgaXMgZGVuc2UgUkVMQVRJVkUgdG8gaXRzZWxmIGlzLiBOdWxsIHdoZW4gbm90aGluZyBsYW5kcyBvbiB0aGUgZ3JpZCxcbiAqIHNvIHRoZSBjYWxsZXIgZHJhd3Mgbm8gbGF5ZXIgcmF0aGVyIHRoYW4gYW4gZW1wdHkgYm94LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFzdGVyaXplRGVuc2l0eShcbiAgb2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBncmlkOiBEZW5zaXR5R3JpZCxcbiAgb3B0czogRGVuc2l0eU9wdGlvbnMsXG4pOiBVaW50OEFycmF5IHwgbnVsbCB7XG4gIGNvbnN0IHsgd2lkdGg6IHcsIGhlaWdodDogaCwgZGVwdGg6IGQsIHZveGVsU2l6ZSB9ID0gZ3JpZDtcbiAgY29uc3QgZmllbGQgPSBuZXcgRmxvYXQzMkFycmF5KHcgKiBoICogZCk7XG4gIGNvbnN0IGlkeCA9IG9wdHMuaW5kaWNlcztcbiAgY29uc3QgbiA9IGlkeCA/IGlkeC5sZW5ndGggOiBvYnMuY291bnQ7XG4gIGNvbnN0IHogPSBvYnMuejtcbiAgbGV0IHBsYWNlZCA9IDA7XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgaysrKSB7XG4gICAgY29uc3QgaSA9IGlkeCA/IGlkeFtrXSA6IGs7XG4gICAgY29uc3QgdnggPSBNYXRoLmZsb29yKG9icy54W2ldIC8gdm94ZWxTaXplWzBdKTtcbiAgICBjb25zdCB2eSA9IE1hdGguZmxvb3Iob2JzLnlbaV0gLyB2b3hlbFNpemVbMV0pO1xuICAgIGNvbnN0IHZ6ID0geiA/IE1hdGguZmxvb3IoeltpXSAvIHZveGVsU2l6ZVsyXSkgOiAwO1xuICAgIGlmICh2eCA8IDAgfHwgdnggPj0gdyB8fCB2eSA8IDAgfHwgdnkgPj0gaCB8fCB2eiA8IDAgfHwgdnogPj0gZCkgY29udGludWU7XG4gICAgZmllbGRbKHZ6ICogaCArIHZ5KSAqIHcgKyB2eF0gKz0gMTtcbiAgICBwbGFjZWQrKztcbiAgfVxuICBpZiAoIXBsYWNlZCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3Qgc2lnbWFWb3g6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFtcbiAgICBvcHRzLnNpZ21hWzBdIC8gdm94ZWxTaXplWzBdLFxuICAgIG9wdHMuc2lnbWFbMV0gLyB2b3hlbFNpemVbMV0sXG4gICAgb3B0cy5zaWdtYVsyXSAvIHZveGVsU2l6ZVsyXSxcbiAgXTtcbiAgYmx1clZvbHVtZUF4aXMoZmllbGQsIHcsIGgsIGQsIDAsIHNpZ21hVm94WzBdKTtcbiAgYmx1clZvbHVtZUF4aXMoZmllbGQsIHcsIGgsIGQsIDEsIHNpZ21hVm94WzFdKTtcbiAgYmx1clZvbHVtZUF4aXMoZmllbGQsIHcsIGgsIGQsIDIsIHNpZ21hVm94WzJdKTtcblxuICAvLyBDb3ZlcmFnZSBjb3JyZWN0aW9uLCBwZXIgcGxhbmU6IHRoZSBzYW1lIGtlcm5lbCBvdmVyIHRoZSBzYW1wbGVkIHN1cHBvcnQgc2F5c1xuICAvLyBob3cgbXVjaCBvZiBlYWNoIHBsYW5lJ3MgbmVpZ2hib3VyaG9vZCB3YXMgYWN0dWFsbHkgaW1hZ2VkLlxuICBjb25zdCB7IGNvdmVyLCBmaXJzdCwgbGFzdCB9ID0gc2FtcGxlZFBsYW5lcyhvYnMsIGdyaWQpO1xuICBjb25zdCBzbW9vdGhlZENvdmVyID0gYmx1cjFkKGNvdmVyLCBzaWdtYVZveFsyXSk7XG4gIGxldCBtYXggPSAwO1xuICBjb25zdCBwbGFuZSA9IHcgKiBoO1xuICBmb3IgKGxldCBrID0gMDsgayA8IGQ7IGsrKykge1xuICAgIC8vIE9VVFNJREUgdGhlIHNhbXBsZWQgcmFuZ2UgdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcnBvbGF0ZSBiZXR3ZWVuLCBvbmx5XG4gICAgLy8gb25lIHNpZGUgdG8gZXh0cmFwb2xhdGUgZnJvbSDigJQgc28gdGhlIGZpZWxkIGlzIHplcm9lZCByYXRoZXIgdGhhbiBzY2FsZWQuXG4gICAgLy8gVGhlIGJsdXIgbGVhdmVzIGEgcG9zaXRpdmUgdGFpbCBwYXN0IHRoZSBmaXJzdCBhbmQgbGFzdCBpbWFnZWQgcGxhbmVzLCBhbmRcbiAgICAvLyBrZWVwaW5nIGl0IHdvdWxkIHB1dCBlc3RpbWF0ZWQgY2VsbHMgaW4gZnJvbnQgb2YgdGhlIHNwZWNpbWVuJ3MgZmlyc3RcbiAgICAvLyBzZWN0aW9uIGFuZCBiZWhpbmQgaXRzIGxhc3QsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBcInNtb290aGVkIEJFVFdFRU4gdGhlXG4gICAgLy8gaW1hZ2VkIHNlY3Rpb25zXCIgcHJvbWlzZXMgbm90IHRvIGRvLlxuICAgIGlmIChrIDwgZmlyc3QgfHwgayA+IGxhc3QpIHtcbiAgICAgIGZpZWxkLmZpbGwoMCwgayAqIHBsYW5lLCAoayArIDEpICogcGxhbmUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEluc2lkZSBpdCwgdGhlIGNvcnJlY3Rpb24gQlJJREdFUyBnYXBzLiBDYXBwaW5nIHRoZSBhbXBsaWZpY2F0aW9uIGF0IDJ4XG4gICAgLy8gKGNvdmVyYWdlIGZsb29yZWQgYXQgMC41KSBsaWZ0cyBhIHBsYW5lIHNpdHRpbmcgYmV0d2VlbiB0d28gaW1hZ2VkIHNlY3Rpb25zXG4gICAgLy8g4oCUIHdoZXJlIGEgYmFuZHdpZHRoIHNwYW5uaW5nIG9uZSBnYXAgbGVhdmVzIGNvdmVyYWdlIGFyb3VuZCBhIGhhbGYg4oCUXG4gICAgLy8gd2l0aG91dCBpbmZsYXRpbmcgYSB0cmFjZSBvZiBzbW9vdGhpbmcgbGVha2FnZSBpbnRvIGEgc2lnbmFsLlxuICAgIGNvbnN0IHNjYWxlID0gMSAvIE1hdGgubWF4KHNtb290aGVkQ292ZXJba10sIDAuNSk7XG4gICAgZm9yIChsZXQgaSA9IGsgKiBwbGFuZTsgaSA8IChrICsgMSkgKiBwbGFuZTsgaSsrKSB7XG4gICAgICBjb25zdCB2ID0gZmllbGRbaV0gKiBzY2FsZTtcbiAgICAgIGZpZWxkW2ldID0gdjtcbiAgICAgIGlmICh2ID4gbWF4KSBtYXggPSB2O1xuICAgIH1cbiAgfVxuICBpZiAoIShtYXggPiAwKSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoZmllbGQubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZC5sZW5ndGg7IGkrKykgb3V0W2ldID0gTWF0aC5yb3VuZCgoZmllbGRbaV0gLyBtYXgpICogMjU1KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGtlcm5lbCBmb3IgYSBncmlkOiBpbi1wbGFuZSB0aWdodCwgYWxvbmcgeiBhdCBsZWFzdCB0aGUgc2VjdGlvblxuICogc3BhY2luZy5cbiAqXG4gKiBUaGUgeiB0ZXJtIGlzIHRoZSBsb2FkLWJlYXJpbmcgb25lIOKAlCAxLjUgdm94ZWxzIG9mIGEgZ3JpZCB3aG9zZSBkZXB0aCB2b3hlbCBJU1xuICogdGhlIHNlY3Rpb24gc3BhY2luZyBwdXRzIM+DIGp1c3QgYWJvdmUgb25lIHNlY3Rpb24gZ2FwLCB3aGljaCBpcyB0aGUgc21hbGxlc3RcbiAqIGJhbmR3aWR0aCB0aGF0IGNhbiBicmlkZ2Ugb25lIHdpdGhvdXQgbGVhdmluZyBhIGRpc2MgcGVyIHBsYW5lLiBgc21vb3RoaW5nYFxuICogc2NhbGVzIGFsbCB0aHJlZSBmb3IgdGhlIHVzZXIgY29udHJvbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRTaWdtYShncmlkOiBEZW5zaXR5R3JpZCwgc21vb3RoaW5nID0gMSk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gIHJldHVybiBbXG4gICAgZ3JpZC52b3hlbFNpemVbMF0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gICAgZ3JpZC52b3hlbFNpemVbMV0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gICAgZ3JpZC52b3hlbFNpemVbMl0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gIF07XG59XG4iXX0=
@@ -1,37 +1,12 @@
1
1
  import { buildColormapLut } from '../contracts/colormap-lut';
2
+ import { parseCssColor } from '../contracts/color';
2
3
  import { fallbackColorFor } from '../store/class-color.util';
3
- import { NO_CATEGORY, } from '../contracts/spatial-dataset.contract';
4
+ import { NO_CATEGORY } from '../contracts/spatial-dataset.contract';
5
+ import { percentileWindow } from './stats';
4
6
  /** Neutral grey for observations with no value (NaN, or {@link NO_CATEGORY}). */
5
7
  export const MISSING_COLOR = [150, 150, 150];
6
8
  /** Default alpha for muted (background / unselected) points — CosMx-style context. */
7
9
  export const DEFAULT_MUTED_OPACITY = 0.15;
8
- /**
9
- * Largest number of CATEGORIES whose colours survive the 3D points layer's LUT
10
- * intact.
11
- *
12
- * That layer has no per-point RGBA — it maps a per-point SCALAR through a
13
- * 256-entry colormap LUT — so a categorical palette is encoded as one contiguous
14
- * block of LUT entries per value. Measured against napari-js, every K in 2..96
15
- * blocks round-trips exactly and K=97 is the first that does not: 256 texels
16
- * cannot keep more values apart than that.
17
- *
18
- * One of those 96 blocks is spent on {@link NO_CATEGORY}, which every column can
19
- * contain, so what fits is **95 categories** — the number published here. It was
20
- * 96 while the encoder rejected at 96, which meant a 96-category column drew flat
21
- * with the panel showing no warning: the one failure this ceiling exists to
22
- * prevent, arrived at from the other direction.
23
- *
24
- * Above it the cloud draws FLAT rather than draw a lie, because subtly wrong
25
- * category colours under a confident legend is the failure nobody catches.
26
- *
27
- * A limit of that one layer, and of nothing else: the 2D markers carry per-point
28
- * RGBA, and a density volume is a scalar field per cluster. Shared here so the
29
- * renderer that enforces it and the panel that explains it cannot drift apart.
30
- */
31
- export const SPATIAL_3D_MAX_CATEGORIES = 95;
32
- /** LUT blocks the 3D layer can keep apart — {@link SPATIAL_3D_MAX_CATEGORIES}
33
- * plus the one reserved for a missing value. */
34
- export const SPATIAL_3D_LUT_BLOCKS = SPATIAL_3D_MAX_CATEGORIES + 1;
35
10
  /**
36
11
  * Fallback categorical palette. Colour-blind-safe and stable, so a category
37
12
  * without an authored colour still lands somewhere sensible and lands there
@@ -39,23 +14,21 @@ export const SPATIAL_3D_LUT_BLOCKS = SPATIAL_3D_MAX_CATEGORIES + 1;
39
14
  * Okabe–Ito, plus two greys for long tails.
40
15
  */
41
16
  export const DEFAULT_CATEGORICAL_PALETTE = [
42
- '#0072B2', '#E69F00', '#009E73', '#CC79A7', '#56B4E9',
43
- '#D55E00', '#F0E442', '#000000', '#7F7F7F', '#BFBFBF',
17
+ '#0072B2',
18
+ '#E69F00',
19
+ '#009E73',
20
+ '#CC79A7',
21
+ '#56B4E9',
22
+ '#D55E00',
23
+ '#F0E442',
24
+ '#000000',
25
+ '#7F7F7F',
26
+ '#BFBFBF',
44
27
  ];
45
- /** Parse `#rgb` / `#rrggbb` to 0–255 RGB; unparseable input falls back to grey.
46
- * Exported so the 3D LUT path parses palettes exactly as the 2D path does. */
28
+ /** Parse a CSS colour (`#rgb` / `#rrggbb`, see {@link parseCssColor}) to 0–255 RGB; unparseable
29
+ * input falls back to grey. Exported so the tile layers parse palettes exactly as the markers do. */
47
30
  export function parseHex(hex) {
48
- const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec((hex ?? '').trim());
49
- if (!m)
50
- return MISSING_COLOR;
51
- let h = m[1];
52
- if (h.length === 3)
53
- h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
54
- return [
55
- parseInt(h.slice(0, 2), 16),
56
- parseInt(h.slice(2, 4), 16),
57
- parseInt(h.slice(4, 6), 16),
58
- ];
31
+ return parseCssColor(hex) ?? MISSING_COLOR;
59
32
  }
60
33
  function alphaAt(i, opts) {
61
34
  const on = opts.opacity ?? 1;
@@ -94,9 +67,10 @@ export function encodeCategorical(codes, opts) {
94
67
  out[o + 1] = c[1] / 255;
95
68
  out[o + 2] = c[2] / 255;
96
69
  // A point with no category is background by definition — never emphasised.
97
- out[o + 3] = code === NO_CATEGORY
98
- ? Math.min(alphaAt(i, opts), opts.mutedOpacity ?? DEFAULT_MUTED_OPACITY)
99
- : alphaAt(i, opts);
70
+ out[o + 3] =
71
+ code === NO_CATEGORY
72
+ ? Math.min(alphaAt(i, opts), opts.mutedOpacity ?? DEFAULT_MUTED_OPACITY)
73
+ : alphaAt(i, opts);
100
74
  }
101
75
  return out;
102
76
  }
@@ -138,25 +112,12 @@ export function encodeContinuous(values, opts) {
138
112
  * fractions (0.01 / 0.99 clips the extreme 1% at each end).
139
113
  *
140
114
  * Returns `[0, 1]` for an empty or all-missing vector so callers always get a
141
- * usable window.
115
+ * usable window. A large vector is windowed from an even sample of it — see
116
+ * `spatial/stats.ts` — because this runs on every recolour, and sorting millions
117
+ * of values each time cost most of a second.
142
118
  */
143
119
  export function contrastWindow(values, lo = 0.01, hi = 0.99) {
144
- const finite = [];
145
- for (let i = 0; i < values.length; i++) {
146
- if (Number.isFinite(values[i]))
147
- finite.push(values[i]);
148
- }
149
- if (finite.length === 0)
150
- return [0, 1];
151
- finite.sort((a, b) => a - b);
152
- const at = (f) => {
153
- const k = Math.max(0, Math.min(finite.length - 1, Math.round(f * (finite.length - 1))));
154
- return finite[k];
155
- };
156
- const min = at(Math.max(0, Math.min(1, lo)));
157
- const max = at(Math.max(0, Math.min(1, hi)));
158
- // A flat or inverted window would divide by zero downstream; widen it.
159
- return max > min ? [min, max] : [min, min + 1];
120
+ return percentileWindow(values, lo, hi);
160
121
  }
161
122
  /**
162
123
  * Marker sizes for the points layer. napari-js `PointsLayer.size` is a
@@ -178,26 +139,9 @@ export function markerDiameters(observations, fallbackRadius = 4) {
178
139
  }
179
140
  return fallbackRadius * 2;
180
141
  }
181
- /**
182
- * Adapt a flat RGBA buffer to the `RGBA[]` shape napari-js 0.12.0's
183
- * `PointsLayer.faceColor` accepts. One 4-element array per point — the reason
184
- * this is a named boundary rather than inlined: it is the one place the model
185
- * stops being typed-array shaped, and it is what a future napari-js taking a
186
- * `Float32Array` would delete.
187
- */
188
- export function toRgbaTuples(flat) {
189
- const n = flat.length / 4;
190
- const out = new Array(n);
191
- for (let i = 0; i < n; i++) {
192
- const o = i * 4;
193
- out[i] = [flat[o], flat[o + 1], flat[o + 2], flat[o + 3]];
194
- }
195
- return out;
196
- }
197
142
  /** Convenience: a 256-entry LUT for a colormap value, falling back to Viridis. */
198
143
  export function lutFor(colormapValue, reverse = false) {
199
- return buildColormapLut(colormapValue, reverse)
200
- ?? buildColormapLut('Viridis', reverse);
144
+ return buildColormapLut(colormapValue, reverse) ?? buildColormapLut('Viridis', reverse);
201
145
  }
202
146
  /** True when every entry of a LUT is a neutral grey. Tested on the VALUES rather
203
147
  * than the colormap's name, so a reversed or renamed grey ramp still counts. */
@@ -229,4 +173,4 @@ export function spatialContinuousLut(colormapValue, reverse = false, override) {
229
173
  const lut = lutFor(colormapValue, reverse);
230
174
  return isGrayscaleLut(lut) ? buildColormapLut('Viridis', reverse) : lut;
231
175
  }
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1lbmNvZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFDa0IsV0FBVyxHQUNuQyxNQUFNLHVDQUF1QyxDQUFDO0FBK0IvQyxpRkFBaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUVsRCxzRkFBc0Y7QUFDdEYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDO0FBRTFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDO0FBRTVDO2lEQUNpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFFbkU7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBYTtJQUNuRCxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUztJQUNyRCxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUztDQUN0RCxDQUFDO0FBOEJGOytFQUMrRTtBQUMvRSxNQUFNLFVBQVUsUUFBUSxDQUFDLEdBQVc7SUFDbEMsTUFBTSxDQUFDLEdBQUcsZ0NBQWdDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEUsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLGFBQWEsQ0FBQztJQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxPQUFPO1FBQ0wsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7S0FDNUIsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxDQUFTLEVBQUUsSUFBaUI7SUFDM0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxxQkFBcUIsQ0FBQztJQUN2RCxPQUFPLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDaEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxJQUEyQixFQUFFLFVBQW9CLDJCQUEyQjtJQUU1RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsTUFBTSxLQUFLLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU07WUFBRSxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxPQUFPLGdCQUFnQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixLQUFrQixFQUFFLElBQWdDO0lBRXBELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLDhFQUE4RTtJQUM5RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQztJQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4QiwyRUFBMkU7UUFDM0UsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssV0FBVztZQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUkscUJBQXFCLENBQUM7WUFDeEUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELDZEQUE2RDtBQUM3RCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLE1BQW9CLEVBQUUsSUFBK0I7SUFFckQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxhQUFhLENBQUM7SUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNyQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ25FLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbkUsNkVBQTZFO0lBQzdFLGdDQUFnQztJQUNoQyxNQUFNLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUM5QixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDOUIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLHFCQUFxQixDQUFDO1lBQ3hELFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDeEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUM7UUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4QixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixNQUFvQixFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFFMUMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdkMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUU7UUFDdkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLHVFQUF1RTtJQUN2RSxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixZQUFpQyxFQUFFLGNBQWMsR0FBRyxDQUFDO0lBRXJELE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDOUIsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxZQUFZLFlBQVksRUFBRSxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRCxPQUFPLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBa0I7SUFDN0MsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDMUIsTUFBTSxHQUFHLEdBQVcsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsTUFBTSxDQUFDLGFBQXNCLEVBQUUsT0FBTyxHQUFHLEtBQUs7SUFDNUQsT0FBTyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDO1dBQzFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUUsQ0FBQztBQUM3QyxDQUFDO0FBRUQ7aUZBQ2lGO0FBQ2pGLE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBbUI7SUFDaEQsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxhQUFzQixFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQUUsUUFBK0I7SUFFeEUseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUN4RixJQUFJLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJnYiwgYnVpbGRDb2xvcm1hcEx1dCB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgZmFsbGJhY2tDb2xvckZvciB9IGZyb20gJy4uL3N0b3JlL2NsYXNzLWNvbG9yLnV0aWwnO1xuaW1wb3J0IHtcbiAgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLCBOT19DQVRFR09SWSwgU3BhdGlhbE9ic2VydmF0aW9ucyxcbn0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcFZhbHVlIH0gZnJvbSAnLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuXG4vKipcbiAqIFR1cm5pbmcgc3BhdGlhbC1vbWljcyBjb2x1bW5zIGludG8gcGVyLXBvaW50IHZpc3VhbCBhdHRyaWJ1dGVzLlxuICpcbiAqIFB1cmUg4oCUIG5vIEFuZ3VsYXIsIG5vIFJ4SlMsIG5vIHJlbmRlcmVyIOKAlCBsaWtlIGBwbG90bHktdHJhY2UtYnVpbGRlcnMudHNgLCBzb1xuICogdGhlIGVuY29kaW5ncyBhcmUgdGVzdGFibGUgb24gdGhlaXIgb3duIGFuZCBzaGFyZWQgYnkgYW55IGJhY2tlbmQgdGhhdCBncm93c1xuICogYSBzcGF0aWFsIG1vZGUuXG4gKlxuICogVGhlIHJ1bGVzIGhlcmUgYXJlIHRoZSBvbmVzIHRoZSBDb3NNeCBhbmFseXNpcyBndWlkYW5jZSBwcmVzY3JpYmVzLCBtYWRlXG4gKiBleHBsaWNpdCByYXRoZXIgdGhhbiBsZWZ0IHRvIGVhY2ggY2FsbCBzaXRlOlxuICogIC0gY291bnQtbGlrZSBjb2x1bW5zIHJlYWQgb24gYSAqKmxvZyoqIHNjYWxlIChsaW5lYXIgY29sbGFwc2VzIHRoZW0gYWdhaW5zdCBhXG4gKiAgICBmZXcgYnJpZ2h0IG91dGxpZXJzKTtcbiAqICAtIGNvbnRyYXN0IHdpbmRvd3MgY29tZSBmcm9tICoqcGVyY2VudGlsZXMqKiwgbm90IG1pbi9tYXgsIHNvIGEgc2luZ2xlXG4gKiAgICBzYXR1cmF0ZWQgc3BvdCBkb2Vzbid0IGZsYXR0ZW4gZXZlcnl0aGluZyBlbHNlO1xuICogIC0gY29udGV4dCBpcyBrZXB0IGJ5ICoqbXV0aW5nKiogcmF0aGVyIHRoYW4gaGlkaW5nIOKAlCBiYWNrZ3JvdW5kIHBvaW50cyBzdGF5XG4gKiAgICB2aXNpYmxlIGF0IGxvdyBhbHBoYSBzbyB0aGUgdGlzc3VlIHNoYXBlIHN1cnZpdmVzLlxuICpcbiAqIENPTE9VUiBSRVBSRVNFTlRBVElPTlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBJbnRlcm5hbGx5IGV2ZXJ5dGhpbmcgaXMgYSBmbGF0IGBGbG9hdDMyQXJyYXlgIG9mIGBbcixnLGIsYSwg4oCmXWAgaW4gMC4uMSDigJRcbiAqIG9uZSBhbGxvY2F0aW9uIGZvciBOIHBvaW50cywgR1BVLXVwbG9hZCBzaGFwZWQuIG5hcGFyaS1qcyAwLjEyLjAnc1xuICogYFBvaW50c0xheWVyLmZhY2VDb2xvcmAgdGFrZXMgYFJHQkFbXWAgKGFuIGFycmF5IG9mIDQtdHVwbGVzKSBpbnN0ZWFkLCBzb1xuICoge0BsaW5rIHRvUmdiYVR1cGxlc30gYWRhcHRzIGF0IHRoZSBib3VuZGFyeTsgd2hlbiB0aGUgbGF5ZXIgYWNjZXB0cyBhIHR5cGVkXG4gKiBhcnJheSB0aGUgYWRhcHRlciBnb2VzIGF3YXkgYW5kIHRoZSBmbGF0IGJ1ZmZlciBpcyBwYXNzZWQgc3RyYWlnaHQgdGhyb3VnaC5cbiAqL1xuXG4vKiogbmFwYXJpLWpzIHBlci1wb2ludCBjb2xvdXIgdHVwbGU6IHIsIGcsIGIsIGEgaW4gMC4uMS4gKi9cbmV4cG9ydCB0eXBlIFJHQkEgPSBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuLyoqIE5ldXRyYWwgZ3JleSBmb3Igb2JzZXJ2YXRpb25zIHdpdGggbm8gdmFsdWUgKE5hTiwgb3Ige0BsaW5rIE5PX0NBVEVHT1JZfSkuICovXG5leHBvcnQgY29uc3QgTUlTU0lOR19DT0xPUjogUmdiID0gWzE1MCwgMTUwLCAxNTBdO1xuXG4vKiogRGVmYXVsdCBhbHBoYSBmb3IgbXV0ZWQgKGJhY2tncm91bmQgLyB1bnNlbGVjdGVkKSBwb2ludHMg4oCUIENvc014LXN0eWxlIGNvbnRleHQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NVVRFRF9PUEFDSVRZID0gMC4xNTtcblxuLyoqXG4gKiBMYXJnZXN0IG51bWJlciBvZiBDQVRFR09SSUVTIHdob3NlIGNvbG91cnMgc3Vydml2ZSB0aGUgM0QgcG9pbnRzIGxheWVyJ3MgTFVUXG4gKiBpbnRhY3QuXG4gKlxuICogVGhhdCBsYXllciBoYXMgbm8gcGVyLXBvaW50IFJHQkEg4oCUIGl0IG1hcHMgYSBwZXItcG9pbnQgU0NBTEFSIHRocm91Z2ggYVxuICogMjU2LWVudHJ5IGNvbG9ybWFwIExVVCDigJQgc28gYSBjYXRlZ29yaWNhbCBwYWxldHRlIGlzIGVuY29kZWQgYXMgb25lIGNvbnRpZ3VvdXNcbiAqIGJsb2NrIG9mIExVVCBlbnRyaWVzIHBlciB2YWx1ZS4gTWVhc3VyZWQgYWdhaW5zdCBuYXBhcmktanMsIGV2ZXJ5IEsgaW4gMi4uOTZcbiAqIGJsb2NrcyByb3VuZC10cmlwcyBleGFjdGx5IGFuZCBLPTk3IGlzIHRoZSBmaXJzdCB0aGF0IGRvZXMgbm90OiAyNTYgdGV4ZWxzXG4gKiBjYW5ub3Qga2VlcCBtb3JlIHZhbHVlcyBhcGFydCB0aGFuIHRoYXQuXG4gKlxuICogT25lIG9mIHRob3NlIDk2IGJsb2NrcyBpcyBzcGVudCBvbiB7QGxpbmsgTk9fQ0FURUdPUll9LCB3aGljaCBldmVyeSBjb2x1bW4gY2FuXG4gKiBjb250YWluLCBzbyB3aGF0IGZpdHMgaXMgKio5NSBjYXRlZ29yaWVzKiog4oCUIHRoZSBudW1iZXIgcHVibGlzaGVkIGhlcmUuIEl0IHdhc1xuICogOTYgd2hpbGUgdGhlIGVuY29kZXIgcmVqZWN0ZWQgYXQgOTYsIHdoaWNoIG1lYW50IGEgOTYtY2F0ZWdvcnkgY29sdW1uIGRyZXcgZmxhdFxuICogd2l0aCB0aGUgcGFuZWwgc2hvd2luZyBubyB3YXJuaW5nOiB0aGUgb25lIGZhaWx1cmUgdGhpcyBjZWlsaW5nIGV4aXN0cyB0b1xuICogcHJldmVudCwgYXJyaXZlZCBhdCBmcm9tIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gKlxuICogQWJvdmUgaXQgdGhlIGNsb3VkIGRyYXdzIEZMQVQgcmF0aGVyIHRoYW4gZHJhdyBhIGxpZSwgYmVjYXVzZSBzdWJ0bHkgd3JvbmdcbiAqIGNhdGVnb3J5IGNvbG91cnMgdW5kZXIgYSBjb25maWRlbnQgbGVnZW5kIGlzIHRoZSBmYWlsdXJlIG5vYm9keSBjYXRjaGVzLlxuICpcbiAqIEEgbGltaXQgb2YgdGhhdCBvbmUgbGF5ZXIsIGFuZCBvZiBub3RoaW5nIGVsc2U6IHRoZSAyRCBtYXJrZXJzIGNhcnJ5IHBlci1wb2ludFxuICogUkdCQSwgYW5kIGEgZGVuc2l0eSB2b2x1bWUgaXMgYSBzY2FsYXIgZmllbGQgcGVyIGNsdXN0ZXIuIFNoYXJlZCBoZXJlIHNvIHRoZVxuICogcmVuZGVyZXIgdGhhdCBlbmZvcmNlcyBpdCBhbmQgdGhlIHBhbmVsIHRoYXQgZXhwbGFpbnMgaXQgY2Fubm90IGRyaWZ0IGFwYXJ0LlxuICovXG5leHBvcnQgY29uc3QgU1BBVElBTF8zRF9NQVhfQ0FURUdPUklFUyA9IDk1O1xuXG4vKiogTFVUIGJsb2NrcyB0aGUgM0QgbGF5ZXIgY2FuIGtlZXAgYXBhcnQg4oCUIHtAbGluayBTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTfVxuICogIHBsdXMgdGhlIG9uZSByZXNlcnZlZCBmb3IgYSBtaXNzaW5nIHZhbHVlLiAqL1xuZXhwb3J0IGNvbnN0IFNQQVRJQUxfM0RfTFVUX0JMT0NLUyA9IFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVMgKyAxO1xuXG4vKipcbiAqIEZhbGxiYWNrIGNhdGVnb3JpY2FsIHBhbGV0dGUuIENvbG91ci1ibGluZC1zYWZlIGFuZCBzdGFibGUsIHNvIGEgY2F0ZWdvcnlcbiAqIHdpdGhvdXQgYW4gYXV0aG9yZWQgY29sb3VyIHN0aWxsIGxhbmRzIHNvbWV3aGVyZSBzZW5zaWJsZSBhbmQgbGFuZHMgdGhlcmVcbiAqIGV2ZXJ5IHJ1biAoYGZhbGxiYWNrQ29sb3JGb3JgIGhhc2hlcyB0aGUgbmFtZSDigJQgc2FtZSBuYW1lLCBzYW1lIGNvbG91cikuXG4gKiBPa2FiZeKAk0l0bywgcGx1cyB0d28gZ3JleXMgZm9yIGxvbmcgdGFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEU6IHN0cmluZ1tdID0gW1xuICAnIzAwNzJCMicsICcjRTY5RjAwJywgJyMwMDlFNzMnLCAnI0NDNzlBNycsICcjNTZCNEU5JyxcbiAgJyNENTVFMDAnLCAnI0YwRTQ0MicsICcjMDAwMDAwJywgJyM3RjdGN0YnLCAnI0JGQkZCRicsXG5dO1xuXG5pbnRlcmZhY2UgTXV0ZU9wdGlvbnMge1xuICAvKiogQWxwaGEgZm9yIHBvaW50cyB0aGF0IGFyZSBub3QgbXV0ZWQuIERlZmF1bHQgMS4gKi9cbiAgb3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIEFscGhhIGZvciBtdXRlZCBwb2ludHMuIERlZmF1bHQge0BsaW5rIERFRkFVTFRfTVVURURfT1BBQ0lUWX0uICovXG4gIG11dGVkT3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIGAxYCBhdCBpbmRleCBpIG11dGVzIG9ic2VydmF0aW9uIGkuIEFic2VudCDih5Igbm90aGluZyBpcyBtdXRlZC4gKi9cbiAgbXV0ZWQ/OiBVaW50OEFycmF5IHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWNhbEVuY29kaW5nT3B0aW9ucyBleHRlbmRzIE11dGVPcHRpb25zIHtcbiAgLyoqIFBlci1jYXRlZ29yeSBgI3JyZ2diYmAsIGluZGV4LWFsaWduZWQgd2l0aCB0aGUgY29sdW1uJ3MgY2F0ZWdvcmllcy4gKi9cbiAgY29sb3JzOiBzdHJpbmdbXTtcbiAgLyoqIENvbG91ciBmb3Ige0BsaW5rIE5PX0NBVEVHT1JZfS4gRGVmYXVsdCB7QGxpbmsgTUlTU0lOR19DT0xPUn0uICovXG4gIG1pc3NpbmdDb2xvcj86IFJnYjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250aW51b3VzRW5jb2RpbmdPcHRpb25zIGV4dGVuZHMgTXV0ZU9wdGlvbnMge1xuICAvKiogMjU2LWVudHJ5IFJHQiB0YWJsZSBmcm9tIHtAbGluayBidWlsZENvbG9ybWFwTHV0fS4gKi9cbiAgbHV0OiBSZ2JbXTtcbiAgLyoqIENvbnRyYXN0IHdpbmRvdyBpbiBWQUxVRSB1bml0cyAocHJlLWxvZykuICovXG4gIG1pbjogbnVtYmVyO1xuICBtYXg6IG51bWJlcjtcbiAgLyoqIEFwcGx5IGBsb2cxcGAgdG8gdGhlIHZhbHVlIGFuZCB0aGUgd2luZG93IGJlZm9yZSBub3JtYWxpc2luZy4gKi9cbiAgbG9nPzogYm9vbGVhbjtcbiAgLyoqIENvbG91ciBmb3IgYE5hTmAuIERlZmF1bHQge0BsaW5rIE1JU1NJTkdfQ09MT1J9LiAqL1xuICBtaXNzaW5nQ29sb3I/OiBSZ2I7XG59XG5cbi8qKiBQYXJzZSBgI3JnYmAgLyBgI3JyZ2diYmAgdG8gMOKAkzI1NSBSR0I7IHVucGFyc2VhYmxlIGlucHV0IGZhbGxzIGJhY2sgdG8gZ3JleS5cbiAqICBFeHBvcnRlZCBzbyB0aGUgM0QgTFVUIHBhdGggcGFyc2VzIHBhbGV0dGVzIGV4YWN0bHkgYXMgdGhlIDJEIHBhdGggZG9lcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUhleChoZXg6IHN0cmluZyk6IFJnYiB7XG4gIGNvbnN0IG0gPSAvXiM/KFswLTlhLWZdezN9fFswLTlhLWZdezZ9KSQvaS5leGVjKChoZXggPz8gJycpLnRyaW0oKSk7XG4gIGlmICghbSkgcmV0dXJuIE1JU1NJTkdfQ09MT1I7XG4gIGxldCBoID0gbVsxXTtcbiAgaWYgKGgubGVuZ3RoID09PSAzKSBoID0gaFswXSArIGhbMF0gKyBoWzFdICsgaFsxXSArIGhbMl0gKyBoWzJdO1xuICByZXR1cm4gW1xuICAgIHBhcnNlSW50KGguc2xpY2UoMCwgMiksIDE2KSxcbiAgICBwYXJzZUludChoLnNsaWNlKDIsIDQpLCAxNiksXG4gICAgcGFyc2VJbnQoaC5zbGljZSg0LCA2KSwgMTYpLFxuICBdO1xufVxuXG5mdW5jdGlvbiBhbHBoYUF0KGk6IG51bWJlciwgb3B0czogTXV0ZU9wdGlvbnMpOiBudW1iZXIge1xuICBjb25zdCBvbiA9IG9wdHMub3BhY2l0eSA/PyAxO1xuICBjb25zdCBvZmYgPSBvcHRzLm11dGVkT3BhY2l0eSA/PyBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gIHJldHVybiBvcHRzLm11dGVkICYmIG9wdHMubXV0ZWRbaV0gPyBvZmYgOiBvbjtcbn1cblxuLyoqXG4gKiBQZXItY2F0ZWdvcnkgY29sb3VyczogdGhlIGNvbHVtbidzIGF1dGhvcmVkIGBjb2xvcnNgIHdoZXJlIHByZXNlbnQgKHNvIHRoZVxuICogdmlld2VyIG1hdGNoZXMgdGhlIGZpZ3VyZXMgdGhlIHNhbWUgYW5hbHlzaXMgcHJvZHVjZWQgZWxzZXdoZXJlKSwgb3RoZXJ3aXNlXG4gKiB0aGUgcGFsZXR0ZSBieSBwb3NpdGlvbiwgd3JhcHBpbmcgdGhyb3VnaCBhIG5hbWUtaGFzaCBwYXN0IGl0cyBlbmQgc28gYVxuICogNDAtY2x1c3RlciBjb2x1bW4gc3RpbGwgZ2V0cyBzdGFibGUsIGRpc3RpbmN0LWlzaCBjb2xvdXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKFxuICBtZXRhOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEsIHBhbGV0dGU6IHN0cmluZ1tdID0gREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhdXRob3JlZCA9IG1ldGEuY29sb3JzO1xuICByZXR1cm4gbWV0YS5jYXRlZ29yaWVzLm1hcCgobmFtZSwgaSkgPT4ge1xuICAgIGNvbnN0IGdpdmVuID0gYXV0aG9yZWQ/LltpXTtcbiAgICBpZiAoZ2l2ZW4pIHJldHVybiBnaXZlbjtcbiAgICBpZiAoaSA8IHBhbGV0dGUubGVuZ3RoKSByZXR1cm4gcGFsZXR0ZVtpXTtcbiAgICByZXR1cm4gZmFsbGJhY2tDb2xvckZvcihuYW1lLCBwYWxldHRlKTtcbiAgfSk7XG59XG5cbi8qKiBDYXRlZ29yaWNhbCBjb2x1bW4g4oaSIGZsYXQgcGVyLXBvaW50IFJHQkEgKGxlbmd0aCBgNCAqIGNvZGVzLmxlbmd0aGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUNhdGVnb3JpY2FsKFxuICBjb2RlczogVWludDE2QXJyYXksIG9wdHM6IENhdGVnb3JpY2FsRW5jb2RpbmdPcHRpb25zLFxuKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbiA9IGNvZGVzLmxlbmd0aDtcbiAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShuICogNCk7XG4gIC8vIFJlc29sdmUgZWFjaCBjYXRlZ29yeSBvbmNlIOKAlCBwYXJzaW5nIGEgaGV4IHN0cmluZyBwZXIgcG9pbnQgd291bGQgZG9taW5hdGUuXG4gIGNvbnN0IHJnYiA9IG9wdHMuY29sb3JzLm1hcChwYXJzZUhleCk7XG4gIGNvbnN0IG1pc3NpbmcgPSBvcHRzLm1pc3NpbmdDb2xvciA/PyBNSVNTSU5HX0NPTE9SO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBjb2Rlc1tpXTtcbiAgICBjb25zdCBjID0gY29kZSA9PT0gTk9fQ0FURUdPUlkgfHwgY29kZSA+PSByZ2IubGVuZ3RoID8gbWlzc2luZyA6IHJnYltjb2RlXTtcbiAgICBjb25zdCBvID0gaSAqIDQ7XG4gICAgb3V0W29dID0gY1swXSAvIDI1NTtcbiAgICBvdXRbbyArIDFdID0gY1sxXSAvIDI1NTtcbiAgICBvdXRbbyArIDJdID0gY1syXSAvIDI1NTtcbiAgICAvLyBBIHBvaW50IHdpdGggbm8gY2F0ZWdvcnkgaXMgYmFja2dyb3VuZCBieSBkZWZpbml0aW9uIOKAlCBuZXZlciBlbXBoYXNpc2VkLlxuICAgIG91dFtvICsgM10gPSBjb2RlID09PSBOT19DQVRFR09SWVxuICAgICAgPyBNYXRoLm1pbihhbHBoYUF0KGksIG9wdHMpLCBvcHRzLm11dGVkT3BhY2l0eSA/PyBERUZBVUxUX01VVEVEX09QQUNJVFkpXG4gICAgICA6IGFscGhhQXQoaSwgb3B0cyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIENvbnRpbnVvdXMgY29sdW1uIC8gZ2VuZSB2ZWN0b3Ig4oaSIGZsYXQgcGVyLXBvaW50IFJHQkEuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQ29udGludW91cyhcbiAgdmFsdWVzOiBGbG9hdDMyQXJyYXksIG9wdHM6IENvbnRpbnVvdXNFbmNvZGluZ09wdGlvbnMsXG4pOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aDtcbiAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShuICogNCk7XG4gIGNvbnN0IG1pc3NpbmcgPSBvcHRzLm1pc3NpbmdDb2xvciA/PyBNSVNTSU5HX0NPTE9SO1xuICBjb25zdCBsdXQgPSBvcHRzLmx1dDtcbiAgY29uc3QgbG8gPSBvcHRzLmxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgb3B0cy5taW4pKSA6IG9wdHMubWluO1xuICBjb25zdCBoaSA9IG9wdHMubG9nID8gTWF0aC5sb2cxcChNYXRoLm1heCgwLCBvcHRzLm1heCkpIDogb3B0cy5tYXg7XG4gIC8vIEEgZGVnZW5lcmF0ZSB3aW5kb3cgKGFsbCB2YWx1ZXMgZXF1YWwpIG1hcHMgZXZlcnl0aGluZyB0byB0aGUgTFVUIG1pZHBvaW50XG4gIC8vIHJhdGhlciB0aGFuIGRpdmlkaW5nIGJ5IHplcm8uXG4gIGNvbnN0IHNwYW4gPSBoaSAtIGxvO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IHJhdyA9IHZhbHVlc1tpXTtcbiAgICBjb25zdCBvID0gaSAqIDQ7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocmF3KSkge1xuICAgICAgb3V0W29dID0gbWlzc2luZ1swXSAvIDI1NTtcbiAgICAgIG91dFtvICsgMV0gPSBtaXNzaW5nWzFdIC8gMjU1O1xuICAgICAgb3V0W28gKyAyXSA9IG1pc3NpbmdbMl0gLyAyNTU7XG4gICAgICBvdXRbbyArIDNdID0gb3B0cy5tdXRlZE9wYWNpdHkgPz8gREVGQVVMVF9NVVRFRF9PUEFDSVRZO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHYgPSBvcHRzLmxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgcmF3KSkgOiByYXc7XG4gICAgY29uc3QgdCA9IHNwYW4gPiAwID8gKHYgLSBsbykgLyBzcGFuIDogMC41O1xuICAgIGNvbnN0IGlkeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0ICogMjU1KSkpO1xuICAgIGNvbnN0IGMgPSBsdXRbaWR4XSA/PyBtaXNzaW5nO1xuICAgIG91dFtvXSA9IGNbMF0gLyAyNTU7XG4gICAgb3V0W28gKyAxXSA9IGNbMV0gLyAyNTU7XG4gICAgb3V0W28gKyAyXSA9IGNbMl0gLyAyNTU7XG4gICAgb3V0W28gKyAzXSA9IGFscGhhQXQoaSwgb3B0cyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb250cmFzdCB3aW5kb3cgZnJvbSBwZXJjZW50aWxlcyBvZiB0aGUgZmluaXRlIHZhbHVlcyDigJQgdGhlIENvc014XG4gKiBcImNhcCBvdXRsaWVycyBhdCBwZXJjZW50aWxlcyB0byBpbXByb3ZlIGNvbnRyYXN0XCIgcnVsZS4gYGxvYC9gaGlgIGFyZVxuICogZnJhY3Rpb25zICgwLjAxIC8gMC45OSBjbGlwcyB0aGUgZXh0cmVtZSAxJSBhdCBlYWNoIGVuZCkuXG4gKlxuICogUmV0dXJucyBgWzAsIDFdYCBmb3IgYW4gZW1wdHkgb3IgYWxsLW1pc3NpbmcgdmVjdG9yIHNvIGNhbGxlcnMgYWx3YXlzIGdldCBhXG4gKiB1c2FibGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJhc3RXaW5kb3coXG4gIHZhbHVlczogRmxvYXQzMkFycmF5LCBsbyA9IDAuMDEsIGhpID0gMC45OSxcbik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBmaW5pdGU6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZSh2YWx1ZXNbaV0pKSBmaW5pdGUucHVzaCh2YWx1ZXNbaV0pO1xuICB9XG4gIGlmIChmaW5pdGUubGVuZ3RoID09PSAwKSByZXR1cm4gWzAsIDFdO1xuICBmaW5pdGUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICBjb25zdCBhdCA9IChmOiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBrID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZmluaXRlLmxlbmd0aCAtIDEsIE1hdGgucm91bmQoZiAqIChmaW5pdGUubGVuZ3RoIC0gMSkpKSk7XG4gICAgcmV0dXJuIGZpbml0ZVtrXTtcbiAgfTtcbiAgY29uc3QgbWluID0gYXQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgbG8pKSk7XG4gIGNvbnN0IG1heCA9IGF0KE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGhpKSkpO1xuICAvLyBBIGZsYXQgb3IgaW52ZXJ0ZWQgd2luZG93IHdvdWxkIGRpdmlkZSBieSB6ZXJvIGRvd25zdHJlYW07IHdpZGVuIGl0LlxuICByZXR1cm4gbWF4ID4gbWluID8gW21pbiwgbWF4XSA6IFttaW4sIG1pbiArIDFdO1xufVxuXG4vKipcbiAqIE1hcmtlciBzaXplcyBmb3IgdGhlIHBvaW50cyBsYXllci4gbmFwYXJpLWpzIGBQb2ludHNMYXllci5zaXplYCBpcyBhXG4gKiAqKmRpYW1ldGVyKiogaW4gZGF0YSB1bml0cyB3aGlsZSBgU3BhdGlhbE9ic2VydmF0aW9ucy5yYWRpdXNgIGlzIGEgcmFkaXVzIOKAlFxuICogdGhlIGRvdWJsaW5nIGxpdmVzIGhlcmUgc28gbm8gY2FsbCBzaXRlIGhhcyB0byByZW1lbWJlciBpdC5cbiAqXG4gKiBgZmFsbGJhY2tSYWRpdXNgIGNvdmVycyBhIGRhdGFzZXQgdGhhdCBkZWNsYXJlcyBubyByYWRpdXMgKHNlZ21lbnRlZCBjZWxsc1xuICogb2Z0ZW4gZG9uJ3QpOyBpdCBpcyBpbiBpbWFnZSBwaXhlbHMsIGxpa2UgZXZlcnl0aGluZyBlbHNlIGluIHRoaXMgc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJEaWFtZXRlcnMoXG4gIG9ic2VydmF0aW9uczogU3BhdGlhbE9ic2VydmF0aW9ucywgZmFsbGJhY2tSYWRpdXMgPSA0LFxuKTogbnVtYmVyIHwgRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgciA9IG9ic2VydmF0aW9ucy5yYWRpdXM7XG4gIGlmICh0eXBlb2YgciA9PT0gJ251bWJlcicpIHJldHVybiByICogMjtcbiAgaWYgKHIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHtcbiAgICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KHIubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIG91dFtpXSA9IHJbaV0gKiAyO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrUmFkaXVzICogMjtcbn1cblxuLyoqXG4gKiBBZGFwdCBhIGZsYXQgUkdCQSBidWZmZXIgdG8gdGhlIGBSR0JBW11gIHNoYXBlIG5hcGFyaS1qcyAwLjEyLjAnc1xuICogYFBvaW50c0xheWVyLmZhY2VDb2xvcmAgYWNjZXB0cy4gT25lIDQtZWxlbWVudCBhcnJheSBwZXIgcG9pbnQg4oCUIHRoZSByZWFzb25cbiAqIHRoaXMgaXMgYSBuYW1lZCBib3VuZGFyeSByYXRoZXIgdGhhbiBpbmxpbmVkOiBpdCBpcyB0aGUgb25lIHBsYWNlIHRoZSBtb2RlbFxuICogc3RvcHMgYmVpbmcgdHlwZWQtYXJyYXkgc2hhcGVkLCBhbmQgaXQgaXMgd2hhdCBhIGZ1dHVyZSBuYXBhcmktanMgdGFraW5nIGFcbiAqIGBGbG9hdDMyQXJyYXlgIHdvdWxkIGRlbGV0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUmdiYVR1cGxlcyhmbGF0OiBGbG9hdDMyQXJyYXkpOiBSR0JBW10ge1xuICBjb25zdCBuID0gZmxhdC5sZW5ndGggLyA0O1xuICBjb25zdCBvdXQ6IFJHQkFbXSA9IG5ldyBBcnJheShuKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCBvID0gaSAqIDQ7XG4gICAgb3V0W2ldID0gW2ZsYXRbb10sIGZsYXRbbyArIDFdLCBmbGF0W28gKyAyXSwgZmxhdFtvICsgM11dO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBDb252ZW5pZW5jZTogYSAyNTYtZW50cnkgTFVUIGZvciBhIGNvbG9ybWFwIHZhbHVlLCBmYWxsaW5nIGJhY2sgdG8gVmlyaWRpcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsdXRGb3IoY29sb3JtYXBWYWx1ZTogdW5rbm93biwgcmV2ZXJzZSA9IGZhbHNlKTogUmdiW10ge1xuICByZXR1cm4gYnVpbGRDb2xvcm1hcEx1dChjb2xvcm1hcFZhbHVlLCByZXZlcnNlKVxuICAgID8/IGJ1aWxkQ29sb3JtYXBMdXQoJ1ZpcmlkaXMnLCByZXZlcnNlKSE7XG59XG5cbi8qKiBUcnVlIHdoZW4gZXZlcnkgZW50cnkgb2YgYSBMVVQgaXMgYSBuZXV0cmFsIGdyZXkuIFRlc3RlZCBvbiB0aGUgVkFMVUVTIHJhdGhlclxuICogIHRoYW4gdGhlIGNvbG9ybWFwJ3MgbmFtZSwgc28gYSByZXZlcnNlZCBvciByZW5hbWVkIGdyZXkgcmFtcCBzdGlsbCBjb3VudHMuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHcmF5c2NhbGVMdXQobHV0OiByZWFkb25seSBSZ2JbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gbHV0LmV2ZXJ5KChbciwgZywgYl0pID0+IHIgPT09IGcgJiYgZyA9PT0gYik7XG59XG5cbi8qKlxuICogTFVUIGZvciBhIHNwYXRpYWwgQ09OVElOVU9VUyBlbmNvZGluZyDigJQgYSBnZW5lLCBhIG51bWVyaWMgY29sdW1uLlxuICpcbiAqIGBvdmVycmlkZWAgaXMgdGhlIGNhbGxlcidzIGV4cGxpY2l0IGNob2ljZSBhbmQgd2lucyBvdXRyaWdodCwgZ3JleSBpbmNsdWRlZDogYVxuICogZ3JleSByYW1wIHBpY2tlZCBGT1IgdGhlIGRhdGEgaXMgYSBkZWNpc2lvbiwgbm90IHRoZSBpbWFnZSdzIGNvbG9ybWFwIGxlYWtpbmdcbiAqIGluLlxuICpcbiAqIFdpdGhvdXQgb25lLCB0aGUgZGlzcGxheSBjb2xvcm1hcCDigJQgdW5sZXNzIHRoYXQgY29sb3JtYXAgaXMgZ3JheXNjYWxlLiBUaGVcbiAqIHRpc3N1ZSB1bmRlcm5lYXRoIGlzIGdyYXlzY2FsZSwgc28gYSBncmV5IG92ZXJsYXkgb2YgYSBtZWFzdXJlbWVudCBpc1xuICogaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgYW5hdG9teSBpdCBpcyBkcmF3biBvdmVyLCBhbmQgdGhlIHJlYWRlciBjYW5ub3QgdGVsbFxuICogd2hpY2ggY2hhbm5lbCBhIGJyaWdodCBwaXhlbCBiZWxvbmdzIHRvLiBWaXJpZGlzIGlzIHRoZW4gdGhlIGZhbGxiYWNrLCB3aGljaCBpc1xuICogd2hhdCB0aGUgQ29zTXggZ3VpZGFuY2UgcHJlc2NyaWJlcyBmb3IgY29udGludW91cyB2YWx1ZXMgYW55d2F5LlxuICpcbiAqIFNoYXJlZCBieSB0aGUgbWFya2VycywgYm90aCBnZW5lIG1hcHMgYW5kIHRoZSBwYW5lbCdzIGNvbG91ciBiYXIsIHNvIG5vbmUgb2ZcbiAqIHRoZW0gY2FuIGRpc2FncmVlIGFib3V0IHdoYXQgYSBjb2xvdXIgbWVhbnMsIHdoaWNoZXZlciB3YXkgdGhlIGNob2ljZSBmYWxscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXRpYWxDb250aW51b3VzTHV0KFxuICBjb2xvcm1hcFZhbHVlOiB1bmtub3duLCByZXZlcnNlID0gZmFsc2UsIG92ZXJyaWRlPzogQ29sb3JtYXBWYWx1ZSB8IG51bGwsXG4pOiBSZ2JbXSB7XG4gIC8vIEFuIGlubGluZSBzY2FsZSBpcyBhbiBhcnJheSwgc28gZW1wdGluZXNzIGhhcyB0byBiZSBjaGVja2VkIGFzIHdlbGwgYXNcbiAgLy8gcHJlc2VuY2U6IGBbXWAgaXMgdHJ1dGh5IGFuZCB3b3VsZCByZXNvbHZlIHRvIHRoZSBmYWxsYmFjayBMVVQgc2lsZW50bHkuXG4gIGNvbnN0IGNob3NlbiA9IEFycmF5LmlzQXJyYXkob3ZlcnJpZGUpID8gKG92ZXJyaWRlLmxlbmd0aCA/IG92ZXJyaWRlIDogbnVsbCkgOiBvdmVycmlkZTtcbiAgaWYgKGNob3NlbikgcmV0dXJuIGx1dEZvcihjaG9zZW4sIHJldmVyc2UpO1xuICBjb25zdCBsdXQgPSBsdXRGb3IoY29sb3JtYXBWYWx1ZSwgcmV2ZXJzZSk7XG4gIHJldHVybiBpc0dyYXlzY2FsZUx1dChsdXQpID8gYnVpbGRDb2xvcm1hcEx1dCgnVmlyaWRpcycsIHJldmVyc2UpISA6IGx1dDtcbn1cbiJdfQ==
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1lbmNvZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQXlCLFdBQVcsRUFBdUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUVoSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUE0QjNDLGlGQUFpRjtBQUNqRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWxELHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUM7QUFFMUM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBYTtJQUNuRCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0NBQ1YsQ0FBQztBQWdDRjtzR0FDc0c7QUFDdEcsTUFBTSxVQUFVLFFBQVEsQ0FBQyxHQUFXO0lBQ2xDLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGFBQWEsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsQ0FBUyxFQUFFLElBQWlCO0lBQzNDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO0lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUkscUJBQXFCLENB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QUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLGFBQXNCLEVBQ3RCLE9BQU8sR0FBRyxLQUFLLEVBQ2YsUUFBK0I7SUFFL0IseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUN4RixJQUFJLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJnYiwgYnVpbGRDb2xvcm1hcEx1dCB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgcGFyc2VDc3NDb2xvciB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcic7XG5pbXBvcnQgeyBmYWxsYmFja0NvbG9yRm9yIH0gZnJvbSAnLi4vc3RvcmUvY2xhc3MtY29sb3IudXRpbCc7XG5pbXBvcnQgeyBDYXRlZ29yaWNhbENvbHVtbk1ldGEsIE5PX0NBVEVHT1JZLCBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcFZhbHVlIH0gZnJvbSAnLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgcGVyY2VudGlsZVdpbmRvdyB9IGZyb20gJy4vc3RhdHMnO1xuXG4vKipcbiAqIFR1cm5pbmcgc3BhdGlhbC1vbWljcyBjb2x1bW5zIGludG8gcGVyLXBvaW50IHZpc3VhbCBhdHRyaWJ1dGVzLlxuICpcbiAqIFB1cmUg4oCUIG5vIEFuZ3VsYXIsIG5vIFJ4SlMsIG5vIHJlbmRlcmVyIOKAlCBsaWtlIGBwbG90bHktdHJhY2UtYnVpbGRlcnMudHNgLCBzb1xuICogdGhlIGVuY29kaW5ncyBhcmUgdGVzdGFibGUgb24gdGhlaXIgb3duIGFuZCBzaGFyZWQgYnkgYW55IGJhY2tlbmQgdGhhdCBncm93c1xuICogYSBzcGF0aWFsIG1vZGUuXG4gKlxuICogVGhlIHJ1bGVzIGhlcmUgYXJlIHRoZSBvbmVzIHRoZSBDb3NNeCBhbmFseXNpcyBndWlkYW5jZSBwcmVzY3JpYmVzLCBtYWRlXG4gKiBleHBsaWNpdCByYXRoZXIgdGhhbiBsZWZ0IHRvIGVhY2ggY2FsbCBzaXRlOlxuICogIC0gY291bnQtbGlrZSBjb2x1bW5zIHJlYWQgb24gYSAqKmxvZyoqIHNjYWxlIChsaW5lYXIgY29sbGFwc2VzIHRoZW0gYWdhaW5zdCBhXG4gKiAgICBmZXcgYnJpZ2h0IG91dGxpZXJzKTtcbiAqICAtIGNvbnRyYXN0IHdpbmRvd3MgY29tZSBmcm9tICoqcGVyY2VudGlsZXMqKiwgbm90IG1pbi9tYXgsIHNvIGEgc2luZ2xlXG4gKiAgICBzYXR1cmF0ZWQgc3BvdCBkb2Vzbid0IGZsYXR0ZW4gZXZlcnl0aGluZyBlbHNlO1xuICogIC0gY29udGV4dCBpcyBrZXB0IGJ5ICoqbXV0aW5nKiogcmF0aGVyIHRoYW4gaGlkaW5nIOKAlCBiYWNrZ3JvdW5kIHBvaW50cyBzdGF5XG4gKiAgICB2aXNpYmxlIGF0IGxvdyBhbHBoYSBzbyB0aGUgdGlzc3VlIHNoYXBlIHN1cnZpdmVzLlxuICpcbiAqIENPTE9VUiBSRVBSRVNFTlRBVElPTlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFdmVyeXRoaW5nIGlzIGEgZmxhdCBgRmxvYXQzMkFycmF5YCBvZiBgW3IsZyxiLGEsIOKApl1gIGluIDAuLjEg4oCUIG9uZVxuICogYWxsb2NhdGlvbiBmb3IgTiBwb2ludHMsIEdQVS11cGxvYWQgc2hhcGVkLiBuYXBhcmktanMgKOKJpSAwLjE1KVxuICogYFBvaW50c0xheWVyLmZhY2VDb2xvcmAgYW5kIGBQb2ludHMzRExheWVyLmNvbG9yc2AgdGFrZSBpdCBhcyBpcy5cbiAqL1xuXG4vKiogT25lIFJHQkEgY29sb3VyLCByLCBnLCBiLCBhIGluIDAuLjEgKG5hcGFyaS1qcydzIGJyb2FkY2FzdCBjb2xvdXIpLiAqL1xuZXhwb3J0IHR5cGUgUkdCQSA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4vKiogTmV1dHJhbCBncmV5IGZvciBvYnNlcnZhdGlvbnMgd2l0aCBubyB2YWx1ZSAoTmFOLCBvciB7QGxpbmsgTk9fQ0FURUdPUll9KS4gKi9cbmV4cG9ydCBjb25zdCBNSVNTSU5HX0NPTE9SOiBSZ2IgPSBbMTUwLCAxNTAsIDE1MF07XG5cbi8qKiBEZWZhdWx0IGFscGhhIGZvciBtdXRlZCAoYmFja2dyb3VuZCAvIHVuc2VsZWN0ZWQpIHBvaW50cyDigJQgQ29zTXgtc3R5bGUgY29udGV4dC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01VVEVEX09QQUNJVFkgPSAwLjE1O1xuXG4vKipcbiAqIEZhbGxiYWNrIGNhdGVnb3JpY2FsIHBhbGV0dGUuIENvbG91ci1ibGluZC1zYWZlIGFuZCBzdGFibGUsIHNvIGEgY2F0ZWdvcnlcbiAqIHdpdGhvdXQgYW4gYXV0aG9yZWQgY29sb3VyIHN0aWxsIGxhbmRzIHNvbWV3aGVyZSBzZW5zaWJsZSBhbmQgbGFuZHMgdGhlcmVcbiAqIGV2ZXJ5IHJ1biAoYGZhbGxiYWNrQ29sb3JGb3JgIGhhc2hlcyB0aGUgbmFtZSDigJQgc2FtZSBuYW1lLCBzYW1lIGNvbG91cikuXG4gKiBPa2FiZeKAk0l0bywgcGx1cyB0d28gZ3JleXMgZm9yIGxvbmcgdGFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEU6IHN0cmluZ1tdID0gW1xuICAnIzAwNzJCMicsXG4gICcjRTY5RjAwJyxcbiAgJyMwMDlFNzMnLFxuICAnI0NDNzlBNycsXG4gICcjNTZCNEU5JyxcbiAgJyNENTVFMDAnLFxuICAnI0YwRTQ0MicsXG4gICcjMDAwMDAwJyxcbiAgJyM3RjdGN0YnLFxuICAnI0JGQkZCRicsXG5dO1xuXG5pbnRlcmZhY2UgTXV0ZU9wdGlvbnMge1xuICAvKiogQWxwaGEgZm9yIHBvaW50cyB0aGF0IGFyZSBub3QgbXV0ZWQuIERlZmF1bHQgMS4gKi9cbiAgb3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIEFscGhhIGZvciBtdXRlZCBwb2ludHMuIERlZmF1bHQge0BsaW5rIERFRkFVTFRfTVVURURfT1BBQ0lUWX0uICovXG4gIG11dGVkT3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIGAxYCBhdCBpbmRleCBpIG11dGVzIG9ic2VydmF0aW9uIGkuIEFic2VudCDih5Igbm90aGluZyBpcyBtdXRlZC4gKi9cbiAgbXV0ZWQ/OiBVaW50OEFycmF5IHwgbnVsbDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBlbmNvZGVDYXRlZ29yaWNhbH06IGEgY29sb3VyIHBlciBjYXRlZ29yeSwgcGx1cyBtdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsRW5jb2RpbmdPcHRpb25zIGV4dGVuZHMgTXV0ZU9wdGlvbnMge1xuICAvKiogUGVyLWNhdGVnb3J5IGAjcnJnZ2JiYCwgaW5kZXgtYWxpZ25lZCB3aXRoIHRoZSBjb2x1bW4ncyBjYXRlZ29yaWVzLiAqL1xuICBjb2xvcnM6IHN0cmluZ1tdO1xuICAvKiogQ29sb3VyIGZvciB7QGxpbmsgTk9fQ0FURUdPUll9LiBEZWZhdWx0IHtAbGluayBNSVNTSU5HX0NPTE9SfS4gKi9cbiAgbWlzc2luZ0NvbG9yPzogUmdiO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGVuY29kZUNvbnRpbnVvdXN9OiBhIGNvbG9ybWFwLCBhIGNvbnRyYXN0IHdpbmRvdyBhbmQgc2NhbGluZywgcGx1cyBtdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRpbnVvdXNFbmNvZGluZ09wdGlvbnMgZXh0ZW5kcyBNdXRlT3B0aW9ucyB7XG4gIC8qKiAyNTYtZW50cnkgUkdCIHRhYmxlIGZyb20ge0BsaW5rIGJ1aWxkQ29sb3JtYXBMdXR9LiAqL1xuICBsdXQ6IFJnYltdO1xuICAvKiogQ29udHJhc3Qgd2luZG93IGluIFZBTFVFIHVuaXRzIChwcmUtbG9nKS4gKi9cbiAgbWluOiBudW1iZXI7XG4gIG1heDogbnVtYmVyO1xuICAvKiogQXBwbHkgYGxvZzFwYCB0byB0aGUgdmFsdWUgYW5kIHRoZSB3aW5kb3cgYmVmb3JlIG5vcm1hbGlzaW5nLiAqL1xuICBsb2c/OiBib29sZWFuO1xuICAvKiogQ29sb3VyIGZvciBgTmFOYC4gRGVmYXVsdCB7QGxpbmsgTUlTU0lOR19DT0xPUn0uICovXG4gIG1pc3NpbmdDb2xvcj86IFJnYjtcbn1cblxuLyoqIFBhcnNlIGEgQ1NTIGNvbG91ciAoYCNyZ2JgIC8gYCNycmdnYmJgLCBzZWUge0BsaW5rIHBhcnNlQ3NzQ29sb3J9KSB0byAw4oCTMjU1IFJHQjsgdW5wYXJzZWFibGVcbiAqICBpbnB1dCBmYWxscyBiYWNrIHRvIGdyZXkuIEV4cG9ydGVkIHNvIHRoZSB0aWxlIGxheWVycyBwYXJzZSBwYWxldHRlcyBleGFjdGx5IGFzIHRoZSBtYXJrZXJzIGRvLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGV4KGhleDogc3RyaW5nKTogUmdiIHtcbiAgcmV0dXJuIHBhcnNlQ3NzQ29sb3IoaGV4KSA/PyBNSVNTSU5HX0NPTE9SO1xufVxuXG5mdW5jdGlvbiBhbHBoYUF0KGk6IG51bWJlciwgb3B0czogTXV0ZU9wdGlvbnMpOiBudW1iZXIge1xuICBjb25zdCBvbiA9IG9wdHMub3BhY2l0eSA/PyAxO1xuICBjb25zdCBvZmYgPSBvcHRzLm11dGVkT3BhY2l0eSA/PyBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gIHJldHVybiBvcHRzLm11dGVkICYmIG9wdHMubXV0ZWRbaV0gPyBvZmYgOiBvbjtcbn1cblxuLyoqXG4gKiBQZXItY2F0ZWdvcnkgY29sb3VyczogdGhlIGNvbHVtbidzIGF1dGhvcmVkIGBjb2xvcnNgIHdoZXJlIHByZXNlbnQgKHNvIHRoZVxuICogdmlld2VyIG1hdGNoZXMgdGhlIGZpZ3VyZXMgdGhlIHNhbWUgYW5hbHlzaXMgcHJvZHVjZWQgZWxzZXdoZXJlKSwgb3RoZXJ3aXNlXG4gKiB0aGUgcGFsZXR0ZSBieSBwb3NpdGlvbiwgd3JhcHBpbmcgdGhyb3VnaCBhIG5hbWUtaGFzaCBwYXN0IGl0cyBlbmQgc28gYVxuICogNDAtY2x1c3RlciBjb2x1bW4gc3RpbGwgZ2V0cyBzdGFibGUsIGRpc3RpbmN0LWlzaCBjb2xvdXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKFxuICBtZXRhOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEsXG4gIHBhbGV0dGU6IHN0cmluZ1tdID0gREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhdXRob3JlZCA9IG1ldGEuY29sb3JzO1xuICByZXR1cm4gbWV0YS5jYXRlZ29yaWVzLm1hcCgobmFtZSwgaSkgPT4ge1xuICAgIGNvbnN0IGdpdmVuID0gYXV0aG9yZWQ/LltpXTtcbiAgICBpZiAoZ2l2ZW4pIHJldHVybiBnaXZlbjtcbiAgICBpZiAoaSA8IHBhbGV0dGUubGVuZ3RoKSByZXR1cm4gcGFsZXR0ZVtpXTtcbiAgICByZXR1cm4gZmFsbGJhY2tDb2xvckZvcihuYW1lLCBwYWxldHRlKTtcbiAgfSk7XG59XG5cbi8qKiBDYXRlZ29yaWNhbCBjb2x1bW4g4oaSIGZsYXQgcGVyLXBvaW50IFJHQkEgKGxlbmd0aCBgNCAqIGNvZGVzLmxlbmd0aGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUNhdGVnb3JpY2FsKGNvZGVzOiBVaW50MTZBcnJheSwgb3B0czogQ2F0ZWdvcmljYWxFbmNvZGluZ09wdGlvbnMpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBuID0gY29kZXMubGVuZ3RoO1xuICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KG4gKiA0KTtcbiAgLy8gUmVzb2x2ZSBlYWNoIGNhdGVnb3J5IG9uY2Ug4oCUIHBhcnNpbmcgYSBoZXggc3RyaW5nIHBlciBwb2ludCB3b3VsZCBkb21pbmF0ZS5cbiAgY29uc3QgcmdiID0gb3B0cy5jb2xvcnMubWFwKHBhcnNlSGV4KTtcbiAgY29uc3QgbWlzc2luZyA9IG9wdHMubWlzc2luZ0NvbG9yID8/IE1JU1NJTkdfQ09MT1I7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgY29uc3QgY29kZSA9IGNvZGVzW2ldO1xuICAgIGNvbnN0IGMgPSBjb2RlID09PSBOT19DQVRFR09SWSB8fCBjb2RlID49IHJnYi5sZW5ndGggPyBtaXNzaW5nIDogcmdiW2NvZGVdO1xuICAgIGNvbnN0IG8gPSBpICogNDtcbiAgICBvdXRbb10gPSBjWzBdIC8gMjU1O1xuICAgIG91dFtvICsgMV0gPSBjWzFdIC8gMjU1O1xuICAgIG91dFtvICsgMl0gPSBjWzJdIC8gMjU1O1xuICAgIC8vIEEgcG9pbnQgd2l0aCBubyBjYXRlZ29yeSBpcyBiYWNrZ3JvdW5kIGJ5IGRlZmluaXRpb24g4oCUIG5ldmVyIGVtcGhhc2lzZWQuXG4gICAgb3V0W28gKyAzXSA9XG4gICAgICBjb2RlID09PSBOT19DQVRFR09SWVxuICAgICAgICA/IE1hdGgubWluKGFscGhhQXQoaSwgb3B0cyksIG9wdHMubXV0ZWRPcGFjaXR5ID8/IERFRkFVTFRfTVVURURfT1BBQ0lUWSlcbiAgICAgICAgOiBhbHBoYUF0KGksIG9wdHMpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBDb250aW51b3VzIGNvbHVtbiAvIGdlbmUgdmVjdG9yIOKGkiBmbGF0IHBlci1wb2ludCBSR0JBLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUNvbnRpbnVvdXModmFsdWVzOiBGbG9hdDMyQXJyYXksIG9wdHM6IENvbnRpbnVvdXNFbmNvZGluZ09wdGlvbnMpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aDtcbiAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShuICogNCk7XG4gIGNvbnN0IG1pc3NpbmcgPSBvcHRzLm1pc3NpbmdDb2xvciA/PyBNSVNTSU5HX0NPTE9SO1xuICBjb25zdCBsdXQgPSBvcHRzLmx1dDtcbiAgY29uc3QgbG8gPSBvcHRzLmxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgb3B0cy5taW4pKSA6IG9wdHMubWluO1xuICBjb25zdCBoaSA9IG9wdHMubG9nID8gTWF0aC5sb2cxcChNYXRoLm1heCgwLCBvcHRzLm1heCkpIDogb3B0cy5tYXg7XG4gIC8vIEEgZGVnZW5lcmF0ZSB3aW5kb3cgKGFsbCB2YWx1ZXMgZXF1YWwpIG1hcHMgZXZlcnl0aGluZyB0byB0aGUgTFVUIG1pZHBvaW50XG4gIC8vIHJhdGhlciB0aGFuIGRpdmlkaW5nIGJ5IHplcm8uXG4gIGNvbnN0IHNwYW4gPSBoaSAtIGxvO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IHJhdyA9IHZhbHVlc1tpXTtcbiAgICBjb25zdCBvID0gaSAqIDQ7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocmF3KSkge1xuICAgICAgb3V0W29dID0gbWlzc2luZ1swXSAvIDI1NTtcbiAgICAgIG91dFtvICsgMV0gPSBtaXNzaW5nWzFdIC8gMjU1O1xuICAgICAgb3V0W28gKyAyXSA9IG1pc3NpbmdbMl0gLyAyNTU7XG4gICAgICBvdXRbbyArIDNdID0gb3B0cy5tdXRlZE9wYWNpdHkgPz8gREVGQVVMVF9NVVRFRF9PUEFDSVRZO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHYgPSBvcHRzLmxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgcmF3KSkgOiByYXc7XG4gICAgY29uc3QgdCA9IHNwYW4gPiAwID8gKHYgLSBsbykgLyBzcGFuIDogMC41O1xuICAgIGNvbnN0IGlkeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0ICogMjU1KSkpO1xuICAgIGNvbnN0IGMgPSBsdXRbaWR4XSA/PyBtaXNzaW5nO1xuICAgIG91dFtvXSA9IGNbMF0gLyAyNTU7XG4gICAgb3V0W28gKyAxXSA9IGNbMV0gLyAyNTU7XG4gICAgb3V0W28gKyAyXSA9IGNbMl0gLyAyNTU7XG4gICAgb3V0W28gKyAzXSA9IGFscGhhQXQoaSwgb3B0cyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb250cmFzdCB3aW5kb3cgZnJvbSBwZXJjZW50aWxlcyBvZiB0aGUgZmluaXRlIHZhbHVlcyDigJQgdGhlIENvc014XG4gKiBcImNhcCBvdXRsaWVycyBhdCBwZXJjZW50aWxlcyB0byBpbXByb3ZlIGNvbnRyYXN0XCIgcnVsZS4gYGxvYC9gaGlgIGFyZVxuICogZnJhY3Rpb25zICgwLjAxIC8gMC45OSBjbGlwcyB0aGUgZXh0cmVtZSAxJSBhdCBlYWNoIGVuZCkuXG4gKlxuICogUmV0dXJucyBgWzAsIDFdYCBmb3IgYW4gZW1wdHkgb3IgYWxsLW1pc3NpbmcgdmVjdG9yIHNvIGNhbGxlcnMgYWx3YXlzIGdldCBhXG4gKiB1c2FibGUgd2luZG93LiBBIGxhcmdlIHZlY3RvciBpcyB3aW5kb3dlZCBmcm9tIGFuIGV2ZW4gc2FtcGxlIG9mIGl0IOKAlCBzZWVcbiAqIGBzcGF0aWFsL3N0YXRzLnRzYCDigJQgYmVjYXVzZSB0aGlzIHJ1bnMgb24gZXZlcnkgcmVjb2xvdXIsIGFuZCBzb3J0aW5nIG1pbGxpb25zXG4gKiBvZiB2YWx1ZXMgZWFjaCB0aW1lIGNvc3QgbW9zdCBvZiBhIHNlY29uZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0V2luZG93KHZhbHVlczogRmxvYXQzMkFycmF5LCBsbyA9IDAuMDEsIGhpID0gMC45OSk6IFtudW1iZXIsIG51bWJlcl0ge1xuICByZXR1cm4gcGVyY2VudGlsZVdpbmRvdyh2YWx1ZXMsIGxvLCBoaSk7XG59XG5cbi8qKlxuICogTWFya2VyIHNpemVzIGZvciB0aGUgcG9pbnRzIGxheWVyLiBuYXBhcmktanMgYFBvaW50c0xheWVyLnNpemVgIGlzIGFcbiAqICoqZGlhbWV0ZXIqKiBpbiBkYXRhIHVuaXRzIHdoaWxlIGBTcGF0aWFsT2JzZXJ2YXRpb25zLnJhZGl1c2AgaXMgYSByYWRpdXMg4oCUXG4gKiB0aGUgZG91YmxpbmcgbGl2ZXMgaGVyZSBzbyBubyBjYWxsIHNpdGUgaGFzIHRvIHJlbWVtYmVyIGl0LlxuICpcbiAqIGBmYWxsYmFja1JhZGl1c2AgY292ZXJzIGEgZGF0YXNldCB0aGF0IGRlY2xhcmVzIG5vIHJhZGl1cyAoc2VnbWVudGVkIGNlbGxzXG4gKiBvZnRlbiBkb24ndCk7IGl0IGlzIGluIGltYWdlIHBpeGVscywgbGlrZSBldmVyeXRoaW5nIGVsc2UgaW4gdGhpcyBzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlckRpYW1ldGVycyhvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIGZhbGxiYWNrUmFkaXVzID0gNCk6IG51bWJlciB8IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IHIgPSBvYnNlcnZhdGlvbnMucmFkaXVzO1xuICBpZiAodHlwZW9mIHIgPT09ICdudW1iZXInKSByZXR1cm4gciAqIDI7XG4gIGlmIChyIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShyLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSByW2ldICogMjtcbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIHJldHVybiBmYWxsYmFja1JhZGl1cyAqIDI7XG59XG5cbi8qKiBDb252ZW5pZW5jZTogYSAyNTYtZW50cnkgTFVUIGZvciBhIGNvbG9ybWFwIHZhbHVlLCBmYWxsaW5nIGJhY2sgdG8gVmlyaWRpcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsdXRGb3IoY29sb3JtYXBWYWx1ZTogdW5rbm93biwgcmV2ZXJzZSA9IGZhbHNlKTogUmdiW10ge1xuICByZXR1cm4gYnVpbGRDb2xvcm1hcEx1dChjb2xvcm1hcFZhbHVlLCByZXZlcnNlKSA/PyBidWlsZENvbG9ybWFwTHV0KCdWaXJpZGlzJywgcmV2ZXJzZSkhO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGV2ZXJ5IGVudHJ5IG9mIGEgTFVUIGlzIGEgbmV1dHJhbCBncmV5LiBUZXN0ZWQgb24gdGhlIFZBTFVFUyByYXRoZXJcbiAqICB0aGFuIHRoZSBjb2xvcm1hcCdzIG5hbWUsIHNvIGEgcmV2ZXJzZWQgb3IgcmVuYW1lZCBncmV5IHJhbXAgc3RpbGwgY291bnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR3JheXNjYWxlTHV0KGx1dDogcmVhZG9ubHkgUmdiW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGx1dC5ldmVyeSgoW3IsIGcsIGJdKSA9PiByID09PSBnICYmIGcgPT09IGIpO1xufVxuXG4vKipcbiAqIExVVCBmb3IgYSBzcGF0aWFsIENPTlRJTlVPVVMgZW5jb2Rpbmcg4oCUIGEgZ2VuZSwgYSBudW1lcmljIGNvbHVtbi5cbiAqXG4gKiBgb3ZlcnJpZGVgIGlzIHRoZSBjYWxsZXIncyBleHBsaWNpdCBjaG9pY2UgYW5kIHdpbnMgb3V0cmlnaHQsIGdyZXkgaW5jbHVkZWQ6IGFcbiAqIGdyZXkgcmFtcCBwaWNrZWQgRk9SIHRoZSBkYXRhIGlzIGEgZGVjaXNpb24sIG5vdCB0aGUgaW1hZ2UncyBjb2xvcm1hcCBsZWFraW5nXG4gKiBpbi5cbiAqXG4gKiBXaXRob3V0IG9uZSwgdGhlIGRpc3BsYXkgY29sb3JtYXAg4oCUIHVubGVzcyB0aGF0IGNvbG9ybWFwIGlzIGdyYXlzY2FsZS4gVGhlXG4gKiB0aXNzdWUgdW5kZXJuZWF0aCBpcyBncmF5c2NhbGUsIHNvIGEgZ3JleSBvdmVybGF5IG9mIGEgbWVhc3VyZW1lbnQgaXNcbiAqIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIGFuYXRvbXkgaXQgaXMgZHJhd24gb3ZlciwgYW5kIHRoZSByZWFkZXIgY2Fubm90IHRlbGxcbiAqIHdoaWNoIGNoYW5uZWwgYSBicmlnaHQgcGl4ZWwgYmVsb25ncyB0by4gVmlyaWRpcyBpcyB0aGVuIHRoZSBmYWxsYmFjaywgd2hpY2ggaXNcbiAqIHdoYXQgdGhlIENvc014IGd1aWRhbmNlIHByZXNjcmliZXMgZm9yIGNvbnRpbnVvdXMgdmFsdWVzIGFueXdheS5cbiAqXG4gKiBTaGFyZWQgYnkgdGhlIG1hcmtlcnMsIGJvdGggZ2VuZSBtYXBzIGFuZCB0aGUgcGFuZWwncyBjb2xvdXIgYmFyLCBzbyBub25lIG9mXG4gKiB0aGVtIGNhbiBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY29sb3VyIG1lYW5zLCB3aGljaGV2ZXIgd2F5IHRoZSBjaG9pY2UgZmFsbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF0aWFsQ29udGludW91c0x1dChcbiAgY29sb3JtYXBWYWx1ZTogdW5rbm93bixcbiAgcmV2ZXJzZSA9IGZhbHNlLFxuICBvdmVycmlkZT86IENvbG9ybWFwVmFsdWUgfCBudWxsLFxuKTogUmdiW10ge1xuICAvLyBBbiBpbmxpbmUgc2NhbGUgaXMgYW4gYXJyYXksIHNvIGVtcHRpbmVzcyBoYXMgdG8gYmUgY2hlY2tlZCBhcyB3ZWxsIGFzXG4gIC8vIHByZXNlbmNlOiBgW11gIGlzIHRydXRoeSBhbmQgd291bGQgcmVzb2x2ZSB0byB0aGUgZmFsbGJhY2sgTFVUIHNpbGVudGx5LlxuICBjb25zdCBjaG9zZW4gPSBBcnJheS5pc0FycmF5KG92ZXJyaWRlKSA/IChvdmVycmlkZS5sZW5ndGggPyBvdmVycmlkZSA6IG51bGwpIDogb3ZlcnJpZGU7XG4gIGlmIChjaG9zZW4pIHJldHVybiBsdXRGb3IoY2hvc2VuLCByZXZlcnNlKTtcbiAgY29uc3QgbHV0ID0gbHV0Rm9yKGNvbG9ybWFwVmFsdWUsIHJldmVyc2UpO1xuICByZXR1cm4gaXNHcmF5c2NhbGVMdXQobHV0KSA/IGJ1aWxkQ29sb3JtYXBMdXQoJ1ZpcmlkaXMnLCByZXZlcnNlKSEgOiBsdXQ7XG59XG4iXX0=