@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.
- package/README.md +201 -460
- package/esm2022/index.mjs +28 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +118 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +373 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
- package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +459 -411
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +46 -3
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +140 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-store.service.mjs +279 -675
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +60 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer.component.mjs +480 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34430
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +13 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +1 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +221 -54
- package/lib/contracts/viz-config.d.ts +1 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
- package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
- package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -878
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +18 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +40 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +17 -0
- package/lib/models/region.d.ts +40 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +166 -199
- package/lib/region-editor/region-metrics.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +69 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +157 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +110 -58
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +35 -1
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +63 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-store.service.d.ts +104 -112
- package/lib/store/visualizer-store.service.d.ts +22 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +47 -83
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +27 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer.component.d.ts +201 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
import { ShapeSelection } from './shape';
|
|
2
|
+
import { verticesToSvgPath } from './geometry';
|
|
3
|
+
/**
|
|
4
|
+
* One annotation region — the backend-neutral model every renderer (Plotly,
|
|
5
|
+
* OpenSeadragon, napari-js), the RegionStore, the Region Editor and the
|
|
6
|
+
* GeoJSON/QuPath import/export share.
|
|
7
|
+
*
|
|
8
|
+
* Geometry lives in {@link bounds}, in full-resolution image-pixel
|
|
9
|
+
* coordinates (x right, y down) of slice {@link z}. A region with no bounds
|
|
10
|
+
* (`null`/absent) is kept but draws nowhere. Regions that arrive as JSON are
|
|
11
|
+
* rebuilt into class instances by {@link hydrateBounds} on their way into the
|
|
12
|
+
* store, so `bounds instanceof Rectangle` etc. can be relied on downstream.
|
|
13
|
+
*/
|
|
2
14
|
export class Region {
|
|
3
15
|
constructor() {
|
|
4
16
|
this.bounds = null;
|
|
@@ -8,6 +20,7 @@ export class Region {
|
|
|
8
20
|
* or a region drawn without a slice context (jit-ui#93). */
|
|
9
21
|
this.z = 0;
|
|
10
22
|
this.shapeColor = '#00FFFF';
|
|
23
|
+
/** @deprecated Unused by the library; will be removed in the next minor release. */
|
|
11
24
|
this.bytesPerPixel = 8;
|
|
12
25
|
/**
|
|
13
26
|
* resolution is the resolution at which the region
|
|
@@ -20,7 +33,9 @@ export class Region {
|
|
|
20
33
|
* at resolution = 0
|
|
21
34
|
*/
|
|
22
35
|
this.resolution = 0;
|
|
36
|
+
/** @deprecated Unused by the library; will be removed in the next minor release. */
|
|
23
37
|
this.cropped = false;
|
|
38
|
+
/** @deprecated Unused by the library; will be removed in the next minor release. */
|
|
24
39
|
this.tileNumber = 0;
|
|
25
40
|
this.tileCoordinates = null;
|
|
26
41
|
}
|
|
@@ -30,27 +45,17 @@ export class Region {
|
|
|
30
45
|
isProfile() {
|
|
31
46
|
return this.kind === 'profile';
|
|
32
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* A debug string: the rectangle's box, or the polygon's SVG path.
|
|
50
|
+
* @deprecated Unused by the library; will be removed in the next minor release.
|
|
51
|
+
*/
|
|
33
52
|
toString() {
|
|
34
|
-
// if shape is rectangle
|
|
35
53
|
if (this.bounds instanceof Rectangle) {
|
|
36
54
|
return `x: ${this.bounds.x}, y: ${this.bounds.y},
|
|
37
55
|
width: ${this.bounds.width}, height: ${this.bounds.height}`;
|
|
38
56
|
}
|
|
39
57
|
else if (this.bounds instanceof Polygon) {
|
|
40
|
-
|
|
41
|
-
// display as path
|
|
42
|
-
for (let i = 0; i < this.bounds.npoints; i++) {
|
|
43
|
-
if (i < this.bounds.npoints - 1) {
|
|
44
|
-
path = `${path}${this.bounds.xpoints[i]},${this.bounds.ypoints[i]}L`;
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
path = `${path}${this.bounds.xpoints[i]},${this.bounds.ypoints[i]}`;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
if (this.bounds.closed !== false) {
|
|
51
|
-
path += 'Z';
|
|
52
|
-
}
|
|
53
|
-
return path;
|
|
58
|
+
return verticesToSvgPath(this.bounds.xpoints, this.bounds.ypoints, this.bounds.closed !== false);
|
|
54
59
|
}
|
|
55
60
|
return '';
|
|
56
61
|
}
|
|
@@ -95,19 +100,7 @@ export class Region {
|
|
|
95
100
|
}
|
|
96
101
|
if (this.isPolygon(bnds)) {
|
|
97
102
|
shape.type = 'path';
|
|
98
|
-
|
|
99
|
-
for (let i = 0; i < bnds.npoints; i++) {
|
|
100
|
-
if (i < bnds.npoints - 1) {
|
|
101
|
-
path = `${path}${bnds.xpoints[i]},${bnds.ypoints[i]}L`;
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
path = `${path}${bnds.xpoints[i]},${bnds.ypoints[i]}`;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
if (bnds.closed !== false) {
|
|
108
|
-
path += 'Z';
|
|
109
|
-
}
|
|
110
|
-
shape.path = path;
|
|
103
|
+
shape.path = verticesToSvgPath(bnds.xpoints, bnds.ypoints, bnds.closed !== false);
|
|
111
104
|
}
|
|
112
105
|
}
|
|
113
106
|
return shape;
|
|
@@ -119,6 +112,8 @@ export class Region {
|
|
|
119
112
|
return 'npoints' in bnds && 'xpoints' in bnds && 'ypoints' in bnds;
|
|
120
113
|
}
|
|
121
114
|
}
|
|
115
|
+
/** An axis-aligned box in image-pixel coordinates: (`x`, `y`) is the top-left
|
|
116
|
+
* (minimum) corner, `width`/`height` extend right/down. */
|
|
122
117
|
export class Rectangle {
|
|
123
118
|
constructor() {
|
|
124
119
|
this.x = 0;
|
|
@@ -127,6 +122,15 @@ export class Rectangle {
|
|
|
127
122
|
this.height = 0;
|
|
128
123
|
}
|
|
129
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* A polygon or open polyline in image-pixel coordinates, optionally with holes
|
|
127
|
+
* and smoothed into a bézier curve.
|
|
128
|
+
*
|
|
129
|
+
* The vertices are stored twice and must agree: as the parallel `xpoints` /
|
|
130
|
+
* `ypoints` arrays (length `npoints`; the Java/JIT wire shape) and as
|
|
131
|
+
* `coordinates` `[x, y]` pairs (what GeoJSON export reads). The ring is
|
|
132
|
+
* implicitly closed — the first vertex is not repeated at the end.
|
|
133
|
+
*/
|
|
130
134
|
export class Polygon {
|
|
131
135
|
constructor() {
|
|
132
136
|
this.npoints = 0;
|
|
@@ -183,10 +187,7 @@ export class MultiPolygon {
|
|
|
183
187
|
* hold onto the bounds they created and mutate them in place during a drag.
|
|
184
188
|
*/
|
|
185
189
|
export function hydrateBounds(bounds) {
|
|
186
|
-
if (!bounds ||
|
|
187
|
-
bounds instanceof Rectangle ||
|
|
188
|
-
bounds instanceof Polygon ||
|
|
189
|
-
bounds instanceof MultiPolygon) {
|
|
190
|
+
if (!bounds || bounds instanceof Rectangle || bounds instanceof Polygon || bounds instanceof MultiPolygon) {
|
|
190
191
|
return bounds;
|
|
191
192
|
}
|
|
192
193
|
if (Array.isArray(bounds.polygons)) {
|
|
@@ -219,4 +220,4 @@ function hydratePolygon(raw) {
|
|
|
219
220
|
polygon.closed = raw.closed ?? true;
|
|
220
221
|
return polygon;
|
|
221
222
|
}
|
|
222
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvcmVnaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFekMsTUFBTSxPQUFPLE1BQU07SUFBbkI7UUFPRSxXQUFNLEdBQStDLElBQUksQ0FBQztRQTBCMUQ7OztxRUFHNkQ7UUFDN0QsTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLGVBQVUsR0FBSSxTQUFTLENBQUM7UUFDeEIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEI7Ozs7Ozs7OztXQVNHO1FBQ0gsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLG9CQUFlLEdBQW9CLElBQUksQ0FBQztJQWdHMUMsQ0FBQztJQTlGQzs7aUVBRTZEO0lBQzdELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxRQUFRO1FBQ04sd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sWUFBWSxTQUFTLEVBQUUsQ0FBQztZQUNyQyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3VCQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssYUFBYSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RFLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLFlBQVksT0FBTyxFQUFFLENBQUM7WUFDMUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ2Ysa0JBQWtCO1lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3ZFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNqQyxJQUFJLElBQUksR0FBRyxDQUFDO1lBQ2QsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsUUFBUSxDQUFDLGtCQUEyQixJQUFJO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN0QixLQUFLLENBQUMsSUFBSSxHQUFHO1lBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQ2hELEtBQUssRUFBRSxDQUFDO1NBQ1QsQ0FBQztRQUNGLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3BELElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsS0FBSyxDQUFDLEtBQUssR0FBRztnQkFDWixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNyQixZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUM3QixJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDMUQsWUFBWSxFQUFFLFVBQVU7YUFDekIsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbkIsQ0FBQztRQUNELEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUUxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLElBQUksSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMzQixLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztnQkFDcEIsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUMvQixLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNsQyxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO2dCQUNwQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDekIsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUN6RCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN4RCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUMxQixJQUFJLElBQUksR0FBRyxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBUztRQUNuQixPQUFPLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUM7SUFDM0UsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFTO1FBQ2pCLE9BQU8sU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFNBQVM7SUFBdEI7UUFDRSxNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixXQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztDQUFBO0FBRUQsTUFBTSxPQUFPLE9BQU87SUFBcEI7UUFDRSxZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1osWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUN2QixZQUFPLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLGdCQUFXLEdBQWUsRUFBRSxDQUFDO1FBQzdCLG1FQUFtRTtRQUNuRSxXQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2Q7Ozs7Ozs7O1dBUUc7UUFDSCxXQUFNLEdBQUcsS0FBSyxDQUFDO0lBOEJqQixDQUFDO0NBQUE7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUF6QjtRQUNFLGtFQUFrRTtRQUNsRSxhQUFRLEdBQWMsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FBQTtBQWVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLE1BQVc7SUFDdkMsSUFDRSxDQUFDLE1BQU07UUFDUCxNQUFNLFlBQVksU0FBUztRQUMzQixNQUFNLFlBQVksT0FBTztRQUN6QixNQUFNLFlBQVksWUFBWSxFQUM5QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksU0FBUyxJQUFJLE1BQU0sSUFBSSxTQUFTLElBQUksTUFBTSxFQUFFLENBQUM7UUFDL0MsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksT0FBTyxJQUFJLE1BQU0sSUFBSSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7UUFDNUMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Z0JBR2dCO0FBQ2hCLFNBQVMsY0FBYyxDQUFDLEdBQVE7SUFDOUIsSUFBSSxHQUFHLFlBQVksT0FBTztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFZLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzRCxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDeEQsT0FBTyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEcsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztJQUNwQyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2hhcGVTZWxlY3Rpb24gfSBmcm9tICcuL3NoYXBlJztcblxuZXhwb3J0IGNsYXNzIFJlZ2lvbiB7XG4gIC8qKiBTdGFibGUsIHVuaXF1ZSBpZGVudGl0eSBmb3Igc2VsZWN0aW9uIGFuZCBlcXVhbGl0eS4gTWludGVkIGJ5XG4gICAqICBQbG90bHlTZXJ2aWNlIHdoZW4gYSByZWdpb24gZmlyc3QgZW50ZXJzIHRoZSBzeXN0ZW0uIE5ldmVyIGRlcml2ZWRcbiAgICogIGZyb20gYXJyYXkgaW5kZXgg4oCUIG5hbWUgY29sbGlzaW9ucyBhY3Jvc3MgZGVsZXRlL2FkZCBjeWNsZXMgbXVzdFxuICAgKiAgbm90IGJyZWFrIFByaW1lTkcgcm93IHNlbGVjdGlvbi4gKi9cbiAgaWQhOiBudW1iZXI7XG4gIG5hbWUhOiBzdHJpbmc7XG4gIGJvdW5kcz86IFJlY3RhbmdsZSB8IFBvbHlnb24gfCBNdWx0aVBvbHlnb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIHByb2ZpbGUgPSBhbiBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIFJPSTsgcmVuZGVyZWQvZHJhZ2dlZCBsaWtlIGEgcmVnaW9uIGJ1dFxuICAgKiAgZXhjbHVkZWQgZnJvbSB0aGUgUmVnaW9ucyB0YWIgYW5kIGV4cG9ydHMuIFVzZSBgaXNQcm9maWxlKClgIHRvIHRlc3QgaXQg4oCUXG4gICAqICBpdCdzIHRoZSBjYW5vbmljYWwgbWFya2VyIHRoYXQgc2VwYXJhdGVzIGludGVuc2l0eSBsaW5lcyAob3duZWQgYnkgdGhlXG4gICAqICBpbnRlbnNpdHkgdG9vbCwgc2FtcGxlZCBpbnRvIHRoZSBpbnNldCkgZnJvbSBhbm5vdGF0aW9uIHJlZ2lvbnMgKG93bmVkIGJ5XG4gICAqICB0aGUgUmVnaW9uIEVkaXRvcikuIEJvdGggYmFja2VuZHMgKFBsb3RseSwgT1NEKSBob25vdXIgaXQuICovXG4gIGtpbmQ/OiAncHJvZmlsZSc7XG4gIC8qKlxuICAgKiBXaGljaCBhdXRvbWF0ZWQgdG9vbCBwcm9kdWNlZCB0aGlzIHJlZ2lvbiwgZS5nLiBgJ3lvbG8nYC4gQWJzZW50IG9uXG4gICAqIGFueXRoaW5nIHRoZSB1c2VyIGRyZXcuXG4gICAqXG4gICAqIExldHMgYSB0b29sIHJlcGxhY2UgaXRzICpvd24qIHByZXZpb3VzIG91dHB1dCBvbiBhIHJlLXJ1biB3aXRob3V0IHRvdWNoaW5nXG4gICAqIGhhbmQtZHJhd24gd29yayBvciBhbm90aGVyIHRvb2wncyByZXN1bHRzIOKAlCB3aGljaCBtYXR0ZXJzIHdoaWxlIHR1bmluZ1xuICAgKiBwYXJhbWV0ZXJzLCB3aGVyZSBldmVyeSBydW4gd291bGQgb3RoZXJ3aXNlIHBpbGUgb250byB0aGUgbGFzdC4gSWRlbnRpdHlcbiAgICogY29tcGFyaXNvbiBpcyBub3QgYSBzdWJzdGl0dXRlOiByZWdpb25zIG1heSBiZSByZS1taW50ZWQgYXMgdGhleSBwYXNzXG4gICAqIHRocm91Z2ggdGhlIHN0b3JlLCBzbyB0aGUgbWFya2VyIGhhcyB0byB0cmF2ZWwgd2l0aCB0aGUgZGF0YS5cbiAgICovXG4gIHNvdXJjZT86IHN0cmluZztcbiAgY29sb3I/OiBzdHJpbmc7IC8vIGhleCBzdHJpbmcsIGUuZy4gJyNSUkdHQkInICh0aGUgaGlzdG9yaWNhbCBcIltyLCBnLCBiXVwiIG5vdGUgaXMgc3RhbGUpXG4gIC8vIGNsYXNzIGxhYmVsXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB1c2VyIHNldCB0aGlzIHJlZ2lvbidzIGNvbG91ciBleHBsaWNpdGx5IChSZWdpb24gRWRpdG9yIENvbG9yXG4gICAqICBjb2x1bW4pLiBQcmVzZXQgY29sb3VyIHJlc29sdXRpb24gKGppdC11aSM3MCkgc2tpcHMgb3ZlcnJpZGRlbiByZWdpb25zIHNvIGFcbiAgICogIG1hbnVhbCBjb2xvdXIgaXMgbm90IGNsb2JiZXJlZCB3aGVuIHByZXNldHMgYXJlIChyZSlhcHBsaWVkIG9uIGxvYWQvaW1wb3J0LiAqL1xuICBjb2xvck92ZXJyaWRkZW4/OiBib29sZWFuO1xuICBmaWxlbmFtZT86IHN0cmluZztcbiAgLyoqIFplcm8tYmFzZWQgei1zbGljZSB0aGlzIHJlZ2lvbiBiZWxvbmdzIHRvIHdpdGhpbiBhIHN0YWNrIOKAlCBtaXJyb3JzXG4gICAqICBRdVBhdGgncyBgZ2VvbWV0cnkucGxhbmUuemAgKGEgbWlzc2luZyBwbGFuZSAvIGRlZmF1bHQgcGxhbmUgcmVhZHMgYmFjayBhc1xuICAgKiAgMCkuIFVzZWQgdG8gcGxhY2UvZmlsdGVyIFJPSXMgcGVyIHNsaWNlOyAwIGZvciBhIHBsYWluIHNpbmdsZS1wbGFuZSBpbWFnZVxuICAgKiAgb3IgYSByZWdpb24gZHJhd24gd2l0aG91dCBhIHNsaWNlIGNvbnRleHQgKGppdC11aSM5MykuICovXG4gIHogPSAwO1xuICBzaGFwZUNvbG9yPyA9ICcjMDBGRkZGJztcbiAgYnl0ZXNQZXJQaXhlbCA9IDg7XG4gIC8qKlxuICAgKiByZXNvbHV0aW9uIGlzIHRoZSByZXNvbHV0aW9uIGF0IHdoaWNoIHRoZSByZWdpb25cbiAgICogd2FzIGZvdW5kLiBJbiBvcmRlciB0byBnZXQgaXQgaW4gdGhlIGZ1bGwgaW1hZ2VcbiAgICogY29vcmRpbmF0ZXMgaXQgd2lsbCBub3JtYWxseSBiZSAwLiBIb3dldmVyIGlmXG4gICAqIHRoZXJlIGlzIGEgbWlzdGFrZSB3aXRoIHRoZSByZXNvbHV0aW9uIGl0IG1heSBub3RcbiAgICogYmUuIFdlIHJldHVybiB0aGUgcmVzb2x1dGlvbiBoZXJlIGluIG9yZGVyIHRvIGJlXG4gICAqIHN1cmUgd2hhdCBpdCBpcy4gVGhlIHNlcnZlciBtYXkgbmVlZCB0byBiZSBjaGFuZ2VkXG4gICAqIHRvIGVuc3VyZSB0aGF0IHJlc3VsdHMgcmVnaW9ucyBhcmUgYWx3YXlzIHJldHVybmVkXG4gICAqIGF0IHJlc29sdXRpb24gPSAwXG4gICAqL1xuICByZXNvbHV0aW9uID0gMDtcbiAgY3JvcHBlZCA9IGZhbHNlO1xuICB0aWxlTnVtYmVyID0gMDtcbiAgdGlsZUNvb3JkaW5hdGVzOiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUcnVlIGZvciBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIFJPSXMgKHRoZSBpbnRlbnNpdHkgdG9vbCdzIGxpbmVzKS4gVGhlc2UgYXJlXG4gICAqICBOT1QgYW5ub3RhdGlvbiByZWdpb25zOiB0aGV5IG5ldmVyIGFwcGVhciBpbiB0aGUgUmVnaW9uIEVkaXRvciBhbmQgZWRpdG9yXG4gICAqICBvcGVyYXRpb25zIChzZWxlY3Qvc2F2ZS9kZWxldGUpIG11c3QgbmV2ZXIgdG91Y2ggdGhlbS4gKi9cbiAgaXNQcm9maWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmtpbmQgPT09ICdwcm9maWxlJztcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIC8vIGlmIHNoYXBlIGlzIHJlY3RhbmdsZVxuICAgIGlmICh0aGlzLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSkge1xuICAgICAgcmV0dXJuIGB4OiAke3RoaXMuYm91bmRzLnh9LCB5OiAke3RoaXMuYm91bmRzLnl9LFxuICAgICAgICAgICAgICB3aWR0aDogJHt0aGlzLmJvdW5kcy53aWR0aH0sIGhlaWdodDogJHt0aGlzLmJvdW5kcy5oZWlnaHR9YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbikge1xuICAgICAgbGV0IHBhdGggPSAnTSc7XG4gICAgICAvLyBkaXNwbGF5IGFzIHBhdGhcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib3VuZHMubnBvaW50czsgaSsrKSB7XG4gICAgICAgIGlmIChpIDwgdGhpcy5ib3VuZHMubnBvaW50cyAtIDEpIHtcbiAgICAgICAgICBwYXRoID0gYCR7cGF0aH0ke3RoaXMuYm91bmRzLnhwb2ludHNbaV19LCR7dGhpcy5ib3VuZHMueXBvaW50c1tpXX1MYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRoID0gYCR7cGF0aH0ke3RoaXMuYm91bmRzLnhwb2ludHNbaV19LCR7dGhpcy5ib3VuZHMueXBvaW50c1tpXX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3VuZHMuY2xvc2VkICE9PSBmYWxzZSkge1xuICAgICAgICBwYXRoICs9ICdaJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFNoYXBlU2VsZWN0aW9uIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4gICAqIGNyZWF0ZSBhIHNoYXBlIGluIFBsb3RseS5cbiAgICogQHBhcmFtIHNob3dSZWdpb25MYWJlbFxuICAgKiBAcmV0dXJuIFNoYXBlU2VsZWN0aW9uXG4gICAqL1xuICBnZXRTaGFwZShzaG93UmVnaW9uTGFiZWw6IGJvb2xlYW4gPSB0cnVlKTogU2hhcGVTZWxlY3Rpb24ge1xuICAgIGNvbnN0IHNoYXBlID0gbmV3IFNoYXBlU2VsZWN0aW9uKCk7XG4gICAgc2hhcGUuaWQgPSB0aGlzLmlkO1xuICAgIHNoYXBlLm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgc2hhcGUuZWRpdGFibGUgPSB0cnVlO1xuICAgIHNoYXBlLmxpbmUgPSB7XG4gICAgICBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3IgOiB0aGlzLnNoYXBlQ29sb3IsXG4gICAgICB3aWR0aDogMyxcbiAgICB9O1xuICAgIHNoYXBlLmZpbGVOYW1lID0gdGhpcy5maWxlbmFtZTtcbiAgICBpZiAodGhpcy5raW5kID09PSAncHJvZmlsZScpIHNoYXBlLmtpbmQgPSAncHJvZmlsZSc7XG4gICAgaWYgKHNob3dSZWdpb25MYWJlbCkge1xuICAgICAgc2hhcGUubGFiZWwgPSB7XG4gICAgICAgIHRleHQ6IGAke3RoaXMubGFiZWx9YCxcbiAgICAgICAgdGV4dHRlbXBsYXRlOiBgJHt0aGlzLmxhYmVsfWAsXG4gICAgICAgIGZvbnQ6IHsgY29sb3I6IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yIDogdGhpcy5zaGFwZUNvbG9yIH0sXG4gICAgICAgIHRleHRwb3NpdGlvbjogJ3RvcCBsZWZ0JyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYXBlLmxhYmVsID0ge307XG4gICAgfVxuICAgIHNoYXBlLmxlZ2VuZCA9IHRoaXMubGFiZWw7XG5cbiAgICBjb25zdCBibmRzID0gdGhpcy5ib3VuZHM7XG4gICAgaWYgKGJuZHMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5pc1JlY3RhbmdsZShibmRzKSkge1xuICAgICAgICBzaGFwZS50eXBlID0gJ3JlY3QnO1xuICAgICAgICBzaGFwZS54MCA9IGJuZHMueDtcbiAgICAgICAgc2hhcGUueTAgPSBibmRzLnk7XG4gICAgICAgIHNoYXBlLngxID0gYm5kcy54ICsgYm5kcy53aWR0aDtcbiAgICAgICAgc2hhcGUueTEgPSBibmRzLnkgKyBibmRzLmhlaWdodDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzUG9seWdvbihibmRzKSkge1xuICAgICAgICBzaGFwZS50eXBlID0gJ3BhdGgnO1xuICAgICAgICBsZXQgcGF0aCA9ICdNJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibmRzLm5wb2ludHM7IGkrKykge1xuICAgICAgICAgIGlmIChpIDwgYm5kcy5ucG9pbnRzIC0gMSkge1xuICAgICAgICAgICAgcGF0aCA9IGAke3BhdGh9JHtibmRzLnhwb2ludHNbaV19LCR7Ym5kcy55cG9pbnRzW2ldfUxgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXRoID0gYCR7cGF0aH0ke2JuZHMueHBvaW50c1tpXX0sJHtibmRzLnlwb2ludHNbaV19YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJuZHMuY2xvc2VkICE9PSBmYWxzZSkge1xuICAgICAgICAgIHBhdGggKz0gJ1onO1xuICAgICAgICB9XG4gICAgICAgIHNoYXBlLnBhdGggPSBwYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2hhcGU7XG4gIH1cblxuICBpc1JlY3RhbmdsZShibmRzOiBhbnkpOiBibmRzIGlzIFJlY3RhbmdsZSB7XG4gICAgcmV0dXJuICd4JyBpbiBibmRzICYmICd5JyBpbiBibmRzICYmICd3aWR0aCcgaW4gYm5kcyAmJiAnaGVpZ2h0JyBpbiBibmRzO1xuICB9XG5cbiAgaXNQb2x5Z29uKGJuZHM6IGFueSk6IGJuZHMgaXMgUG9seWdvbiB7XG4gICAgcmV0dXJuICducG9pbnRzJyBpbiBibmRzICYmICd4cG9pbnRzJyBpbiBibmRzICYmICd5cG9pbnRzJyBpbiBibmRzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWN0YW5nbGUge1xuICB4ID0gMDtcbiAgeSA9IDA7XG4gIHdpZHRoID0gMDtcbiAgaGVpZ2h0ID0gMDtcbn1cblxuZXhwb3J0IGNsYXNzIFBvbHlnb24ge1xuICBucG9pbnRzID0gMDtcbiAgeHBvaW50czogbnVtYmVyW10gPSBbXTtcbiAgeXBvaW50czogbnVtYmVyW10gPSBbXTtcbiAgY29vcmRpbmF0ZXM6IG51bWJlcltdW10gPSBbXTtcbiAgLyoqIGZhbHNlIGZvciBvcGVuIHBvbHlsaW5lczsgdHJ1ZSAoZGVmYXVsdCkgZm9yIGNsb3NlZCBwb2x5Z29ucyAqL1xuICBjbG9zZWQgPSB0cnVlO1xuICAvKipcbiAgICogV2hlbiB0cnVlIHRoZSB2ZXJ0aWNlcyBhcmUgdHJlYXRlZCBhcyBiZXppZXItc3BsaW5lICoqYW5jaG9ycyoqIGFuZCB0aGVcbiAgICogcmVnaW9uIGlzIHJlbmRlcmVkL2V4cG9ydGVkIGFzIGEgc21vb3RoIGN1cnZlIHRocm91Z2ggdGhlbS4gVGhlIHZlcnRpY2VzXG4gICAqIHN0YXkgdGhlIGVkaXRhYmxlIGFuY2hvcnMg4oCUIHRvZ2dsaW5nIHRoaXMgZmxhZyBpcyB0aGUgdG9CZXppZXJcbiAgICogKGB0cnVlYCkgLyB0b1BvbHlnb24gKGBmYWxzZWApLCB3aGljaCBvbmx5IGFkZC9yZW1vdmUgdGhlIGN1cnZlLCBuZXZlciBtb3ZlXG4gICAqIHRoZSBhbmNob3JzLiBHZW9KU09OIGtlZXBzIHRoZSBmbGF0dGVuZWQgY3VydmUgYXMgdGhlIGdlb21ldHJ5IChzbyBRdVBhdGhcbiAgICogcmVuZGVycyBpdCkgcGx1cyB0aGUgYW5jaG9ycyArIGhhbmRsZXMgKyBmbGFnIGluIHByb3BlcnRpZXMgKHNvIEpJVFxuICAgKiByb3VuZC10cmlwcyB0aGUgZWRpdGFibGUgYmV6aWVyKS5cbiAgICovXG4gIGJlemllciA9IGZhbHNlO1xuICAvKipcbiAgICogUGVyLWFuY2hvciBjdWJpYy1iZXppZXIgY29udHJvbC1wb2ludCBvZmZzZXRzLCAqKnJlbGF0aXZlKiogdG8gdGhlaXIgYW5jaG9yXG4gICAqIChzbyB0aGV5IHRyYW5zbGF0ZSB3aXRoIGl0KS4gUHJlc2VudCBvbmx5IGZvciBiZXppZXIgcmVnaW9uczsgaW5pdGlhbGlzZWRcbiAgICogZnJvbSB0aGUgQ2F0bXVsbC1Sb20gY29uc3RydWN0aW9uIChhIHNtb290aCBjdXJ2ZSkgd2hlbiBiZXppZXIgaXMgdHVybmVkIG9uLFxuICAgKiB0aGVuIGluZGl2aWR1YWxseSBlZGl0YWJsZSBieSBkcmFnZ2luZyB0aGUgaGFuZGxlcy4gYGhhbmRsZXNJbltpXWAgL1xuICAgKiBgaGFuZGxlc091dFtpXWAgYXJlIGBbZHgsIGR5XWAgZm9yIHZlcnRleCBgaWAuXG4gICAqL1xuICBoYW5kbGVzSW4/OiBudW1iZXJbXVtdO1xuICBoYW5kbGVzT3V0PzogbnVtYmVyW11bXTtcblxuICAvKipcbiAgICogSW50ZXJpb3IgcmluZ3MgKGhvbGVzKSDigJQgaml0LXVpIzg1LiBFYWNoIHJpbmcgaXMgYSBsaXN0IG9mIGBbeCwgeV1gXG4gICAqIGltYWdlLXBpeGVsIHBhaXJzIGluIHRoZSBTQU1FIGNsb3NlZC1wb2x5Z29uIGNvbnZlbnRpb24gYXMgdGhlIGV4dGVyaW9yXG4gICAqIChgY29vcmRpbmF0ZXNgKTogbm8gcmVwZWF0ZWQgY2xvc2luZyBwb2ludC4gUHJlc2VudCBvbmx5IG9uIGNsb3NlZCBwb2x5Z29ucy5cbiAgICogQSBwb2ludCBpbnNpZGUgdGhlIGV4dGVyaW9yICoqYW5kKiogaW5zaWRlIGFueSBob2xlIGlzIE9VVFNJREUgdGhlIHJlZ2lvblxuICAgKiAoZXZlbi1vZGQgcnVsZSkuIEFic2VudC9lbXB0eSA9PSBhIHNvbGlkIHBvbHlnb24gKHRoZSBwcmlvciBiZWhhdmlvdXIpLCBzb1xuICAgKiBldmVyeSBleGlzdGluZyByZWdpb24gaXMgdW5hZmZlY3RlZC5cbiAgICovXG4gIGhvbGVzPzogbnVtYmVyW11bXVtdO1xuXG4gIC8qKlxuICAgKiBQZXItaG9sZSBiw6l6aWVyIGNvbnRyb2wtcG9pbnQgb2Zmc2V0cywgcGFyYWxsZWwgdG8ge0BsaW5rIGhvbGVzfSAob25lIGVudHJ5IHBlciByaW5nLCBlYWNoIGFcbiAgICogbGlzdCBvZiBgW2R4LCBkeV1gIHBlciByaW5nIHZlcnRleCwgKipyZWxhdGl2ZSoqIHRvIHRoZSB2ZXJ0ZXgpLiBQcmVzZW50IG9ubHkgd2hlbiBgYmV6aWVyYCBpc1xuICAgKiBvbiBmb3IgYSBkb251dCDigJQgc2VlZGVkIGZyb20gdGhlIENhdG11bGwtUm9tIGRlZmF1bHQgYW5kIGluZGl2aWR1YWxseSBlZGl0YWJsZSwgZXhhY3RseSBsaWtlXG4gICAqIHRoZSBleHRlcmlvciB7QGxpbmsgaGFuZGxlc0lufS97QGxpbmsgaGFuZGxlc091dH0uIFNvIGEgZG9udXQgc21vb3RoZWQgdG8gYSBiw6l6aWVyIGN1cnZlcyBpdHNcbiAgICogaG9sZXMgdG9vIChqaXQtdWkjMTAyKS5cbiAgICovXG4gIGhvbGVIYW5kbGVzSW4/OiBudW1iZXJbXVtdW107XG4gIGhvbGVIYW5kbGVzT3V0PzogbnVtYmVyW11bXVtdO1xufVxuXG4vKipcbiAqIEEgcmVnaW9uIHdob3NlIGdlb21ldHJ5IGlzIHNldmVyYWwgZGlzam9pbnQgcGFydHMg4oCUIGUuZy4gdGhlIHJlc3VsdCBvZiBtZXJnaW5nXG4gKiB0d28gbm9uLXRvdWNoaW5nIHJlZ2lvbnMsIG9yIHRoZSBpbnZlcnNlIG9mIGEgYmxvYiAoaml0LXVpIzg1KS4gRWFjaCBwYXJ0IGlzIGFcbiAqIGNsb3NlZCB7QGxpbmsgUG9seWdvbn0gdGhhdCBtYXkgY2FycnkgaXRzIG93biBob2xlcywgc28gYSBNdWx0aVBvbHlnb25cbiAqIHJlcHJlc2VudHMgXCJzcGFyc2UgYml0cywgc29tZSB3aXRoIGRvbnV0IGhvbGVzXCIgYXMgYSBzaW5nbGUgcmVnaW9uLiBNYXBzIDE6MVxuICogb250byBhIEdlb0pTT04gYE11bHRpUG9seWdvbmAgKGFuZCBRdVBhdGgncyBnZW9tZXRyeSkuXG4gKlxuICogQSBzaW5nbGUtcGFydCBNdWx0aVBvbHlnb24gaXMgZXF1aXZhbGVudCB0byB0aGF0IFBvbHlnb247IGNhbGxlcnMgc2hvdWxkXG4gKiBwcmVmZXIgYSBwbGFpbiB7QGxpbmsgUG9seWdvbn0gZm9yIG9uZSBjb25uZWN0ZWQgcGFydC5cbiAqL1xuZXhwb3J0IGNsYXNzIE11bHRpUG9seWdvbiB7XG4gIC8qKiBPbmUgb3IgbW9yZSBkaXNqb2ludCBjbG9zZWQgcG9seWdvbnMgKGVhY2ggbWF5IGhhdmUgaG9sZXMpLiAqL1xuICBwb2x5Z29uczogUG9seWdvbltdID0gW107XG59XG5cbmV4cG9ydCB0eXBlIEJvdW5kcyA9XG4gIHwgUmVjdGFuZ2xlXG4gIHwgUG9seWdvblxuICB8IHtcbiAgICAgIHg/OiBudW1iZXI7XG4gICAgICB5PzogbnVtYmVyO1xuICAgICAgd2lkdGg/OiBudW1iZXI7XG4gICAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgICBucG9pbnRzPzogbnVtYmVyO1xuICAgICAgeHBvaW50cz86IG51bWJlcltdO1xuICAgICAgeXBvaW50cz86IG51bWJlcltdO1xuICAgIH07XG5cbi8qKlxuICogUmVidWlsZCBhIHBsYWluLW9iamVjdCBgYm91bmRzYCBhcyB0aGUgY2xhc3MgaW5zdGFuY2UgdGhlIHJlbmRlcmVycyBleHBlY3RcbiAqIChqaXQtdWkjMTI0KS5cbiAqXG4gKiBSZWdpb25zIHRoYXQgYXJyaXZlIGFzIEpTT04g4oCUIGEgaG9zdCdzIHNlcnZlciByZXNwb25zZSwgYSBgc3RydWN0dXJlZENsb25lYCxcbiAqIGFueXRoaW5nIHRoYXQgaGFzIGJlZW4gdGhyb3VnaCBgSlNPTi5wYXJzZWAg4oCUIGNhcnJ5IGEgYGJvdW5kc2AgdGhhdCBoYXMgdGhlXG4gKiByaWdodCAqZmllbGRzKiBidXQgbm90IHRoZSByaWdodCAqcHJvdG90eXBlKi4gVGhlIHJlbmRlcmVycyBkaXNhZ3JlZSBhYm91dFxuICogd2hldGhlciB0aGF0IGlzIGFjY2VwdGFibGU6IGBSZWdpb24uZ2V0U2hhcGUoKWAgKFBsb3RseSkgYW5kIHRoZSBuYXBhcmlcbiAqIG92ZXJsYXkgZHVjay10eXBlIHRoZSBib3VuZHMsIHdoaWxlIHRoZSBPcGVuU2VhZHJhZ29uIG92ZXJsYXkgZGlzY3JpbWluYXRlc1xuICogd2l0aCBgYm91bmRzIGluc3RhbmNlb2YgUmVjdGFuZ2xlYC4gU28gYSBKU09OIHJlZ2lvbiBkcmV3IGluIEhlYXRtYXAgbW9kZSBhbmRcbiAqIHNpbGVudGx5IHZhbmlzaGVkIGluIEltYWdlIG1vZGUuIGBpbnN0YW5jZW9mYCBhbHNvIGdhdGVzIHRoZSBzdG9yZSdzIG93blxuICogZ2VvbWV0cnkgZGUtZHVwbGljYXRpb24sIGBtb3ZlUmVnaW9uYCwgYW5kIHRoZSBHZW9KU09OIGV4cG9ydCDigJQgYSBKU09OIHJlZ2lvblxuICogaXMgdW5kcmFnZ2FibGUgYW5kIGFic2VudCBmcm9tIGEgc2F2ZSBpbiAqZXZlcnkqIG1vZGUuXG4gKlxuICogUmF0aGVyIHRoYW4gZHVjay10eXBlIH4yMCBjYWxsIHNpdGVzLCB0aGUgc3RvcmUgbm9ybWFsaXplcyBoZXJlIG9uIHRoZSB3YXkgaW4sXG4gKiBzbyBldmVyeXRoaW5nIGRvd25zdHJlYW0gY2FuIGtlZXAgcmVseWluZyBvbiBgaW5zdGFuY2VvZmAuIFZhbHVlcyB0aGF0IGFyZVxuICogYWxyZWFkeSBpbnN0YW5jZXMgYXJlIHJldHVybmVkICoqYnkgcmVmZXJlbmNlKiosIHVudG91Y2hlZDogb3ZlcmxheXMgYW5kIHRvb2xzXG4gKiBob2xkIG9udG8gdGhlIGJvdW5kcyB0aGV5IGNyZWF0ZWQgYW5kIG11dGF0ZSB0aGVtIGluIHBsYWNlIGR1cmluZyBhIGRyYWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlQm91bmRzKGJvdW5kczogYW55KTogUmVjdGFuZ2xlIHwgUG9seWdvbiB8IE11bHRpUG9seWdvbiB8IG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAoXG4gICAgIWJvdW5kcyB8fFxuICAgIGJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fFxuICAgIGJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24gfHxcbiAgICBib3VuZHMgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb25cbiAgKSB7XG4gICAgcmV0dXJuIGJvdW5kcztcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShib3VuZHMucG9seWdvbnMpKSB7XG4gICAgY29uc3QgbXVsdGkgPSBuZXcgTXVsdGlQb2x5Z29uKCk7XG4gICAgbXVsdGkucG9seWdvbnMgPSBib3VuZHMucG9seWdvbnMubWFwKChwYXJ0OiBhbnkpID0+IGh5ZHJhdGVQb2x5Z29uKHBhcnQpKTtcbiAgICByZXR1cm4gbXVsdGk7XG4gIH1cbiAgaWYgKCducG9pbnRzJyBpbiBib3VuZHMgfHwgJ3hwb2ludHMnIGluIGJvdW5kcykge1xuICAgIHJldHVybiBoeWRyYXRlUG9seWdvbihib3VuZHMpO1xuICB9XG4gIGlmICgnd2lkdGgnIGluIGJvdW5kcyAmJiAnaGVpZ2h0JyBpbiBib3VuZHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgUmVjdGFuZ2xlKCksIGJvdW5kcyk7XG4gIH1cbiAgLy8gTm90aGluZyByZWNvZ25pc2FibGUg4oCUIGhhbmQgaXQgYmFjayByYXRoZXIgdGhhbiBjb2VyY2UgaXQgaW50byB0aGUgd3JvbmdcbiAgLy8gZ2VvbWV0cnkuIEl0IHJlbmRlcnMgbm93aGVyZSBlaXRoZXIgd2F5LCBidXQgYSBjYWxsZXIgY2FuIHN0aWxsIGluc3BlY3QgaXQuXG4gIHJldHVybiBib3VuZHM7XG59XG5cbi8qKiB7QGxpbmsgaHlkcmF0ZUJvdW5kc30gZm9yIG9uZSBwb2x5Z29uLCBkZXJpdmluZyB0aGUgZmllbGRzIGEgbGVhbiBzZXJpYWxpemVyXG4gKiAgb21pdHM6IEpJVCdzIEphdmEgYFBvbHlnb25TZXJpYWxpemVyYCB3cml0ZXMgb25seSBgbnBvaW50c2AvYHhwb2ludHNgL1xuICogIGB5cG9pbnRzYCwgd2hpbGUgdGhlIEdlb0pTT04gZXhwb3J0IHJlYWRzIGBjb29yZGluYXRlc2AgYW5kIHRoZSBvdmVybGF5cyByZWFkXG4gKiAgYGNsb3NlZGAuICovXG5mdW5jdGlvbiBoeWRyYXRlUG9seWdvbihyYXc6IGFueSk6IFBvbHlnb24ge1xuICBpZiAocmF3IGluc3RhbmNlb2YgUG9seWdvbikgcmV0dXJuIHJhdztcbiAgY29uc3QgcG9seWdvbjogUG9seWdvbiA9IE9iamVjdC5hc3NpZ24obmV3IFBvbHlnb24oKSwgcmF3KTtcbiAgcG9seWdvbi54cG9pbnRzID0gWy4uLihyYXcueHBvaW50cyA/PyBbXSldO1xuICBwb2x5Z29uLnlwb2ludHMgPSBbLi4uKHJhdy55cG9pbnRzID8/IFtdKV07XG4gIHBvbHlnb24ubnBvaW50cyA9IHJhdy5ucG9pbnRzID8/IHBvbHlnb24ueHBvaW50cy5sZW5ndGg7XG4gIHBvbHlnb24uY29vcmRpbmF0ZXMgPSByYXcuY29vcmRpbmF0ZXMgPz8gcG9seWdvbi54cG9pbnRzLm1hcCgoeCwgaSkgPT4gW3gsIHBvbHlnb24ueXBvaW50c1tpXV0pO1xuICBwb2x5Z29uLmNsb3NlZCA9IHJhdy5jbG9zZWQgPz8gdHJ1ZTtcbiAgcmV0dXJuIHBvbHlnb247XG59XG4iXX0=
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvcmVnaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9DOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sTUFBTTtJQUFuQjtRQU9FLFdBQU0sR0FBK0MsSUFBSSxDQUFDO1FBMEIxRDs7O3FFQUc2RDtRQUM3RCxNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sZUFBVSxHQUFJLFNBQVMsQ0FBQztRQUN4QixvRkFBb0Y7UUFDcEYsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEI7Ozs7Ozs7OztXQVNHO1FBQ0gsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLG9GQUFvRjtRQUNwRixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLG9GQUFvRjtRQUNwRixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2Ysb0JBQWUsR0FBb0IsSUFBSSxDQUFDO0lBNEUxQyxDQUFDO0lBMUVDOztpRUFFNkQ7SUFDN0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxNQUFNLFlBQVksU0FBUyxFQUFFLENBQUM7WUFDckMsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt1QkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLGFBQWEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RSxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxZQUFZLE9BQU8sRUFBRSxDQUFDO1lBQzFDLE9BQU8saUJB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QyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEcsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztJQUNwQyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2hhcGVTZWxlY3Rpb24gfSBmcm9tICcuL3NoYXBlJztcbmltcG9ydCB7IHZlcnRpY2VzVG9TdmdQYXRoIH0gZnJvbSAnLi9nZW9tZXRyeSc7XG5cbi8qKlxuICogT25lIGFubm90YXRpb24gcmVnaW9uIOKAlCB0aGUgYmFja2VuZC1uZXV0cmFsIG1vZGVsIGV2ZXJ5IHJlbmRlcmVyIChQbG90bHksXG4gKiBPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpLCB0aGUgUmVnaW9uU3RvcmUsIHRoZSBSZWdpb24gRWRpdG9yIGFuZCB0aGVcbiAqIEdlb0pTT04vUXVQYXRoIGltcG9ydC9leHBvcnQgc2hhcmUuXG4gKlxuICogR2VvbWV0cnkgbGl2ZXMgaW4ge0BsaW5rIGJvdW5kc30sIGluIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZS1waXhlbFxuICogY29vcmRpbmF0ZXMgKHggcmlnaHQsIHkgZG93bikgb2Ygc2xpY2Uge0BsaW5rIHp9LiBBIHJlZ2lvbiB3aXRoIG5vIGJvdW5kc1xuICogKGBudWxsYC9hYnNlbnQpIGlzIGtlcHQgYnV0IGRyYXdzIG5vd2hlcmUuIFJlZ2lvbnMgdGhhdCBhcnJpdmUgYXMgSlNPTiBhcmVcbiAqIHJlYnVpbHQgaW50byBjbGFzcyBpbnN0YW5jZXMgYnkge0BsaW5rIGh5ZHJhdGVCb3VuZHN9IG9uIHRoZWlyIHdheSBpbnRvIHRoZVxuICogc3RvcmUsIHNvIGBib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGVgIGV0Yy4gY2FuIGJlIHJlbGllZCBvbiBkb3duc3RyZWFtLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaW9uIHtcbiAgLyoqIFN0YWJsZSwgdW5pcXVlIGlkZW50aXR5IGZvciBzZWxlY3Rpb24gYW5kIGVxdWFsaXR5LiBNaW50ZWQgYnkgdGhlXG4gICAqICBSZWdpb25TdG9yZSB3aGVuIGEgcmVnaW9uIGZpcnN0IGVudGVycyBpdC4gTmV2ZXIgZGVyaXZlZCBmcm9tIGFycmF5XG4gICAqICBpbmRleCDigJQgbmFtZSBjb2xsaXNpb25zIGFjcm9zcyBkZWxldGUvYWRkIGN5Y2xlcyBtdXN0IG5vdCBicmVhayBQcmltZU5HXG4gICAqICByb3cgc2VsZWN0aW9uLiAqL1xuICBpZCE6IG51bWJlcjtcbiAgbmFtZSE6IHN0cmluZztcbiAgYm91bmRzPzogUmVjdGFuZ2xlIHwgUG9seWdvbiB8IE11bHRpUG9seWdvbiB8IG51bGwgPSBudWxsO1xuICAvKiogcHJvZmlsZSA9IGFuIGludGVuc2l0eS1wcm9maWxlIGxpbmUgUk9JOyByZW5kZXJlZC9kcmFnZ2VkIGxpa2UgYSByZWdpb24gYnV0XG4gICAqICBleGNsdWRlZCBmcm9tIHRoZSBSZWdpb25zIHRhYiBhbmQgZXhwb3J0cy4gVXNlIGBpc1Byb2ZpbGUoKWAgdG8gdGVzdCBpdCDigJRcbiAgICogIGl0J3MgdGhlIGNhbm9uaWNhbCBtYXJrZXIgdGhhdCBzZXBhcmF0ZXMgaW50ZW5zaXR5IGxpbmVzIChvd25lZCBieSB0aGVcbiAgICogIGludGVuc2l0eSB0b29sLCBzYW1wbGVkIGludG8gdGhlIGluc2V0KSBmcm9tIGFubm90YXRpb24gcmVnaW9ucyAob3duZWQgYnlcbiAgICogIHRoZSBSZWdpb24gRWRpdG9yKS4gQm90aCBiYWNrZW5kcyAoUGxvdGx5LCBPU0QpIGhvbm91ciBpdC4gKi9cbiAga2luZD86ICdwcm9maWxlJztcbiAgLyoqXG4gICAqIFdoaWNoIGF1dG9tYXRlZCB0b29sIHByb2R1Y2VkIHRoaXMgcmVnaW9uLCBlLmcuIGAneW9sbydgLiBBYnNlbnQgb25cbiAgICogYW55dGhpbmcgdGhlIHVzZXIgZHJldy5cbiAgICpcbiAgICogTGV0cyBhIHRvb2wgcmVwbGFjZSBpdHMgKm93biogcHJldmlvdXMgb3V0cHV0IG9uIGEgcmUtcnVuIHdpdGhvdXQgdG91Y2hpbmdcbiAgICogaGFuZC1kcmF3biB3b3JrIG9yIGFub3RoZXIgdG9vbCdzIHJlc3VsdHMg4oCUIHdoaWNoIG1hdHRlcnMgd2hpbGUgdHVuaW5nXG4gICAqIHBhcmFtZXRlcnMsIHdoZXJlIGV2ZXJ5IHJ1biB3b3VsZCBvdGhlcndpc2UgcGlsZSBvbnRvIHRoZSBsYXN0LiBJZGVudGl0eVxuICAgKiBjb21wYXJpc29uIGlzIG5vdCBhIHN1YnN0aXR1dGU6IHJlZ2lvbnMgbWF5IGJlIHJlLW1pbnRlZCBhcyB0aGV5IHBhc3NcbiAgICogdGhyb3VnaCB0aGUgc3RvcmUsIHNvIHRoZSBtYXJrZXIgaGFzIHRvIHRyYXZlbCB3aXRoIHRoZSBkYXRhLlxuICAgKi9cbiAgc291cmNlPzogc3RyaW5nO1xuICBjb2xvcj86IHN0cmluZzsgLy8gaGV4IHN0cmluZywgZS5nLiAnI1JSR0dCQicgKHRoZSBoaXN0b3JpY2FsIFwiW3IsIGcsIGJdXCIgbm90ZSBpcyBzdGFsZSlcbiAgLy8gY2xhc3MgbGFiZWxcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHVzZXIgc2V0IHRoaXMgcmVnaW9uJ3MgY29sb3VyIGV4cGxpY2l0bHkgKFJlZ2lvbiBFZGl0b3IgQ29sb3JcbiAgICogIGNvbHVtbikuIFByZXNldCBjb2xvdXIgcmVzb2x1dGlvbiAoaml0LXVpIzcwKSBza2lwcyBvdmVycmlkZGVuIHJlZ2lvbnMgc28gYVxuICAgKiAgbWFudWFsIGNvbG91ciBpcyBub3QgY2xvYmJlcmVkIHdoZW4gcHJlc2V0cyBhcmUgKHJlKWFwcGxpZWQgb24gbG9hZC9pbXBvcnQuICovXG4gIGNvbG9yT3ZlcnJpZGRlbj86IGJvb2xlYW47XG4gIGZpbGVuYW1lPzogc3RyaW5nO1xuICAvKiogWmVyby1iYXNlZCB6LXNsaWNlIHRoaXMgcmVnaW9uIGJlbG9uZ3MgdG8gd2l0aGluIGEgc3RhY2sg4oCUIG1pcnJvcnNcbiAgICogIFF1UGF0aCdzIGBnZW9tZXRyeS5wbGFuZS56YCAoYSBtaXNzaW5nIHBsYW5lIC8gZGVmYXVsdCBwbGFuZSByZWFkcyBiYWNrIGFzXG4gICAqICAwKS4gVXNlZCB0byBwbGFjZS9maWx0ZXIgUk9JcyBwZXIgc2xpY2U7IDAgZm9yIGEgcGxhaW4gc2luZ2xlLXBsYW5lIGltYWdlXG4gICAqICBvciBhIHJlZ2lvbiBkcmF3biB3aXRob3V0IGEgc2xpY2UgY29udGV4dCAoaml0LXVpIzkzKS4gKi9cbiAgeiA9IDA7XG4gIHNoYXBlQ29sb3I/ID0gJyMwMEZGRkYnO1xuICAvKiogQGRlcHJlY2F0ZWQgVW51c2VkIGJ5IHRoZSBsaWJyYXJ5OyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWlub3IgcmVsZWFzZS4gKi9cbiAgYnl0ZXNQZXJQaXhlbCA9IDg7XG4gIC8qKlxuICAgKiByZXNvbHV0aW9uIGlzIHRoZSByZXNvbHV0aW9uIGF0IHdoaWNoIHRoZSByZWdpb25cbiAgICogd2FzIGZvdW5kLiBJbiBvcmRlciB0byBnZXQgaXQgaW4gdGhlIGZ1bGwgaW1hZ2VcbiAgICogY29vcmRpbmF0ZXMgaXQgd2lsbCBub3JtYWxseSBiZSAwLiBIb3dldmVyIGlmXG4gICAqIHRoZXJlIGlzIGEgbWlzdGFrZSB3aXRoIHRoZSByZXNvbHV0aW9uIGl0IG1heSBub3RcbiAgICogYmUuIFdlIHJldHVybiB0aGUgcmVzb2x1dGlvbiBoZXJlIGluIG9yZGVyIHRvIGJlXG4gICAqIHN1cmUgd2hhdCBpdCBpcy4gVGhlIHNlcnZlciBtYXkgbmVlZCB0byBiZSBjaGFuZ2VkXG4gICAqIHRvIGVuc3VyZSB0aGF0IHJlc3VsdHMgcmVnaW9ucyBhcmUgYWx3YXlzIHJldHVybmVkXG4gICAqIGF0IHJlc29sdXRpb24gPSAwXG4gICAqL1xuICByZXNvbHV0aW9uID0gMDtcbiAgLyoqIEBkZXByZWNhdGVkIFVudXNlZCBieSB0aGUgbGlicmFyeTsgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UuICovXG4gIGNyb3BwZWQgPSBmYWxzZTtcbiAgLyoqIEBkZXByZWNhdGVkIFVudXNlZCBieSB0aGUgbGlicmFyeTsgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UuICovXG4gIHRpbGVOdW1iZXIgPSAwO1xuICB0aWxlQ29vcmRpbmF0ZXM6IG51bWJlcltdIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRydWUgZm9yIGludGVuc2l0eS1wcm9maWxlIGxpbmUgUk9JcyAodGhlIGludGVuc2l0eSB0b29sJ3MgbGluZXMpLiBUaGVzZSBhcmVcbiAgICogIE5PVCBhbm5vdGF0aW9uIHJlZ2lvbnM6IHRoZXkgbmV2ZXIgYXBwZWFyIGluIHRoZSBSZWdpb24gRWRpdG9yIGFuZCBlZGl0b3JcbiAgICogIG9wZXJhdGlvbnMgKHNlbGVjdC9zYXZlL2RlbGV0ZSkgbXVzdCBuZXZlciB0b3VjaCB0aGVtLiAqL1xuICBpc1Byb2ZpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMua2luZCA9PT0gJ3Byb2ZpbGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZGVidWcgc3RyaW5nOiB0aGUgcmVjdGFuZ2xlJ3MgYm94LCBvciB0aGUgcG9seWdvbidzIFNWRyBwYXRoLlxuICAgKiBAZGVwcmVjYXRlZCBVbnVzZWQgYnkgdGhlIGxpYnJhcnk7IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtaW5vciByZWxlYXNlLlxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgaWYgKHRoaXMuYm91bmRzIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7XG4gICAgICByZXR1cm4gYHg6ICR7dGhpcy5ib3VuZHMueH0sIHk6ICR7dGhpcy5ib3VuZHMueX0sXG4gICAgICAgICAgICAgIHdpZHRoOiAke3RoaXMuYm91bmRzLndpZHRofSwgaGVpZ2h0OiAke3RoaXMuYm91bmRzLmhlaWdodH1gO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uKSB7XG4gICAgICByZXR1cm4gdmVydGljZXNUb1N2Z1BhdGgodGhpcy5ib3VuZHMueHBvaW50cywgdGhpcy5ib3VuZHMueXBvaW50cywgdGhpcy5ib3VuZHMuY2xvc2VkICE9PSBmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgU2hhcGVTZWxlY3Rpb24gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG9cbiAgICogY3JlYXRlIGEgc2hhcGUgaW4gUGxvdGx5LlxuICAgKiBAcGFyYW0gc2hvd1JlZ2lvbkxhYmVsXG4gICAqIEByZXR1cm4gU2hhcGVTZWxlY3Rpb25cbiAgICovXG4gIGdldFNoYXBlKHNob3dSZWdpb25MYWJlbDogYm9vbGVhbiA9IHRydWUpOiBTaGFwZVNlbGVjdGlvbiB7XG4gICAgY29uc3Qgc2hhcGUgPSBuZXcgU2hhcGVTZWxlY3Rpb24oKTtcbiAgICBzaGFwZS5pZCA9IHRoaXMuaWQ7XG4gICAgc2hhcGUubmFtZSA9IHRoaXMubmFtZTtcbiAgICBzaGFwZS5lZGl0YWJsZSA9IHRydWU7XG4gICAgc2hhcGUubGluZSA9IHtcbiAgICAgIGNvbG9yOiB0aGlzLmNvbG9yID8gdGhpcy5jb2xvciA6IHRoaXMuc2hhcGVDb2xvcixcbiAgICAgIHdpZHRoOiAzLFxuICAgIH07XG4gICAgc2hhcGUuZmlsZU5hbWUgPSB0aGlzLmZpbGVuYW1lO1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdwcm9maWxlJykgc2hhcGUua2luZCA9ICdwcm9maWxlJztcbiAgICBpZiAoc2hvd1JlZ2lvbkxhYmVsKSB7XG4gICAgICBzaGFwZS5sYWJlbCA9IHtcbiAgICAgICAgdGV4dDogYCR7dGhpcy5sYWJlbH1gLFxuICAgICAgICB0ZXh0dGVtcGxhdGU6IGAke3RoaXMubGFiZWx9YCxcbiAgICAgICAgZm9udDogeyBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3IgOiB0aGlzLnNoYXBlQ29sb3IgfSxcbiAgICAgICAgdGV4dHBvc2l0aW9uOiAndG9wIGxlZnQnLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hhcGUubGFiZWwgPSB7fTtcbiAgICB9XG4gICAgc2hhcGUubGVnZW5kID0gdGhpcy5sYWJlbDtcblxuICAgIGNvbnN0IGJuZHMgPSB0aGlzLmJvdW5kcztcbiAgICBpZiAoYm5kcyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzUmVjdGFuZ2xlKGJuZHMpKSB7XG4gICAgICAgIHNoYXBlLnR5cGUgPSAncmVjdCc7XG4gICAgICAgIHNoYXBlLngwID0gYm5kcy54O1xuICAgICAgICBzaGFwZS55MCA9IGJuZHMueTtcbiAgICAgICAgc2hhcGUueDEgPSBibmRzLnggKyBibmRzLndpZHRoO1xuICAgICAgICBzaGFwZS55MSA9IGJuZHMueSArIGJuZHMuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNQb2x5Z29uKGJuZHMpKSB7XG4gICAgICAgIHNoYXBlLnR5cGUgPSAncGF0aCc7XG4gICAgICAgIHNoYXBlLnBhdGggPSB2ZXJ0aWNlc1RvU3ZnUGF0aChibmRzLnhwb2ludHMsIGJuZHMueXBvaW50cywgYm5kcy5jbG9zZWQgIT09IGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYXBlO1xuICB9XG5cbiAgaXNSZWN0YW5nbGUoYm5kczogYW55KTogYm5kcyBpcyBSZWN0YW5nbGUge1xuICAgIHJldHVybiAneCcgaW4gYm5kcyAmJiAneScgaW4gYm5kcyAmJiAnd2lkdGgnIGluIGJuZHMgJiYgJ2hlaWdodCcgaW4gYm5kcztcbiAgfVxuXG4gIGlzUG9seWdvbihibmRzOiBhbnkpOiBibmRzIGlzIFBvbHlnb24ge1xuICAgIHJldHVybiAnbnBvaW50cycgaW4gYm5kcyAmJiAneHBvaW50cycgaW4gYm5kcyAmJiAneXBvaW50cycgaW4gYm5kcztcbiAgfVxufVxuXG4vKiogQW4gYXhpcy1hbGlnbmVkIGJveCBpbiBpbWFnZS1waXhlbCBjb29yZGluYXRlczogKGB4YCwgYHlgKSBpcyB0aGUgdG9wLWxlZnRcbiAqICAobWluaW11bSkgY29ybmVyLCBgd2lkdGhgL2BoZWlnaHRgIGV4dGVuZCByaWdodC9kb3duLiAqL1xuZXhwb3J0IGNsYXNzIFJlY3RhbmdsZSB7XG4gIHggPSAwO1xuICB5ID0gMDtcbiAgd2lkdGggPSAwO1xuICBoZWlnaHQgPSAwO1xufVxuXG4vKipcbiAqIEEgcG9seWdvbiBvciBvcGVuIHBvbHlsaW5lIGluIGltYWdlLXBpeGVsIGNvb3JkaW5hdGVzLCBvcHRpb25hbGx5IHdpdGggaG9sZXNcbiAqIGFuZCBzbW9vdGhlZCBpbnRvIGEgYsOpemllciBjdXJ2ZS5cbiAqXG4gKiBUaGUgdmVydGljZXMgYXJlIHN0b3JlZCB0d2ljZSBhbmQgbXVzdCBhZ3JlZTogYXMgdGhlIHBhcmFsbGVsIGB4cG9pbnRzYCAvXG4gKiBgeXBvaW50c2AgYXJyYXlzIChsZW5ndGggYG5wb2ludHNgOyB0aGUgSmF2YS9KSVQgd2lyZSBzaGFwZSkgYW5kIGFzXG4gKiBgY29vcmRpbmF0ZXNgIGBbeCwgeV1gIHBhaXJzICh3aGF0IEdlb0pTT04gZXhwb3J0IHJlYWRzKS4gVGhlIHJpbmcgaXNcbiAqIGltcGxpY2l0bHkgY2xvc2VkIOKAlCB0aGUgZmlyc3QgdmVydGV4IGlzIG5vdCByZXBlYXRlZCBhdCB0aGUgZW5kLlxuICovXG5leHBvcnQgY2xhc3MgUG9seWdvbiB7XG4gIG5wb2ludHMgPSAwO1xuICB4cG9pbnRzOiBudW1iZXJbXSA9IFtdO1xuICB5cG9pbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb29yZGluYXRlczogbnVtYmVyW11bXSA9IFtdO1xuICAvKiogZmFsc2UgZm9yIG9wZW4gcG9seWxpbmVzOyB0cnVlIChkZWZhdWx0KSBmb3IgY2xvc2VkIHBvbHlnb25zICovXG4gIGNsb3NlZCA9IHRydWU7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUgdGhlIHZlcnRpY2VzIGFyZSB0cmVhdGVkIGFzIGJlemllci1zcGxpbmUgKiphbmNob3JzKiogYW5kIHRoZVxuICAgKiByZWdpb24gaXMgcmVuZGVyZWQvZXhwb3J0ZWQgYXMgYSBzbW9vdGggY3VydmUgdGhyb3VnaCB0aGVtLiBUaGUgdmVydGljZXNcbiAgICogc3RheSB0aGUgZWRpdGFibGUgYW5jaG9ycyDigJQgdG9nZ2xpbmcgdGhpcyBmbGFnIGlzIHRoZSB0b0JlemllclxuICAgKiAoYHRydWVgKSAvIHRvUG9seWdvbiAoYGZhbHNlYCksIHdoaWNoIG9ubHkgYWRkL3JlbW92ZSB0aGUgY3VydmUsIG5ldmVyIG1vdmVcbiAgICogdGhlIGFuY2hvcnMuIEdlb0pTT04ga2VlcHMgdGhlIGZsYXR0ZW5lZCBjdXJ2ZSBhcyB0aGUgZ2VvbWV0cnkgKHNvIFF1UGF0aFxuICAgKiByZW5kZXJzIGl0KSBwbHVzIHRoZSBhbmNob3JzICsgaGFuZGxlcyArIGZsYWcgaW4gcHJvcGVydGllcyAoc28gSklUXG4gICAqIHJvdW5kLXRyaXBzIHRoZSBlZGl0YWJsZSBiZXppZXIpLlxuICAgKi9cbiAgYmV6aWVyID0gZmFsc2U7XG4gIC8qKlxuICAgKiBQZXItYW5jaG9yIGN1YmljLWJlemllciBjb250cm9sLXBvaW50IG9mZnNldHMsICoqcmVsYXRpdmUqKiB0byB0aGVpciBhbmNob3JcbiAgICogKHNvIHRoZXkgdHJhbnNsYXRlIHdpdGggaXQpLiBQcmVzZW50IG9ubHkgZm9yIGJlemllciByZWdpb25zOyBpbml0aWFsaXNlZFxuICAgKiBmcm9tIHRoZSBDYXRtdWxsLVJvbSBjb25zdHJ1Y3Rpb24gKGEgc21vb3RoIGN1cnZlKSB3aGVuIGJlemllciBpcyB0dXJuZWQgb24sXG4gICAqIHRoZW4gaW5kaXZpZHVhbGx5IGVkaXRhYmxlIGJ5IGRyYWdnaW5nIHRoZSBoYW5kbGVzLiBgaGFuZGxlc0luW2ldYCAvXG4gICAqIGBoYW5kbGVzT3V0W2ldYCBhcmUgYFtkeCwgZHldYCBmb3IgdmVydGV4IGBpYC5cbiAgICovXG4gIGhhbmRsZXNJbj86IG51bWJlcltdW107XG4gIGhhbmRsZXNPdXQ/OiBudW1iZXJbXVtdO1xuXG4gIC8qKlxuICAgKiBJbnRlcmlvciByaW5ncyAoaG9sZXMpIOKAlCBqaXQtdWkjODUuIEVhY2ggcmluZyBpcyBhIGxpc3Qgb2YgYFt4LCB5XWBcbiAgICogaW1hZ2UtcGl4ZWwgcGFpcnMgaW4gdGhlIFNBTUUgY2xvc2VkLXBvbHlnb24gY29udmVudGlvbiBhcyB0aGUgZXh0ZXJpb3JcbiAgICogKGBjb29yZGluYXRlc2ApOiBubyByZXBlYXRlZCBjbG9zaW5nIHBvaW50LiBQcmVzZW50IG9ubHkgb24gY2xvc2VkIHBvbHlnb25zLlxuICAgKiBBIHBvaW50IGluc2lkZSB0aGUgZXh0ZXJpb3IgKiphbmQqKiBpbnNpZGUgYW55IGhvbGUgaXMgT1VUU0lERSB0aGUgcmVnaW9uXG4gICAqIChldmVuLW9kZCBydWxlKS4gQWJzZW50L2VtcHR5ID09IGEgc29saWQgcG9seWdvbiAodGhlIHByaW9yIGJlaGF2aW91ciksIHNvXG4gICAqIGV2ZXJ5IGV4aXN0aW5nIHJlZ2lvbiBpcyB1bmFmZmVjdGVkLlxuICAgKi9cbiAgaG9sZXM/OiBudW1iZXJbXVtdW107XG5cbiAgLyoqXG4gICAqIFBlci1ob2xlIGLDqXppZXIgY29udHJvbC1wb2ludCBvZmZzZXRzLCBwYXJhbGxlbCB0byB7QGxpbmsgaG9sZXN9IChvbmUgZW50cnkgcGVyIHJpbmcsIGVhY2ggYVxuICAgKiBsaXN0IG9mIGBbZHgsIGR5XWAgcGVyIHJpbmcgdmVydGV4LCAqKnJlbGF0aXZlKiogdG8gdGhlIHZlcnRleCkuIFByZXNlbnQgb25seSB3aGVuIGBiZXppZXJgIGlzXG4gICAqIG9uIGZvciBhIGRvbnV0IOKAlCBzZWVkZWQgZnJvbSB0aGUgQ2F0bXVsbC1Sb20gZGVmYXVsdCBhbmQgaW5kaXZpZHVhbGx5IGVkaXRhYmxlLCBleGFjdGx5IGxpa2VcbiAgICogdGhlIGV4dGVyaW9yIHtAbGluayBoYW5kbGVzSW59L3tAbGluayBoYW5kbGVzT3V0fS4gU28gYSBkb251dCBzbW9vdGhlZCB0byBhIGLDqXppZXIgY3VydmVzIGl0c1xuICAgKiBob2xlcyB0b28gKGppdC11aSMxMDIpLlxuICAgKi9cbiAgaG9sZUhhbmRsZXNJbj86IG51bWJlcltdW11bXTtcbiAgaG9sZUhhbmRsZXNPdXQ/OiBudW1iZXJbXVtdW107XG59XG5cbi8qKlxuICogQSByZWdpb24gd2hvc2UgZ2VvbWV0cnkgaXMgc2V2ZXJhbCBkaXNqb2ludCBwYXJ0cyDigJQgZS5nLiB0aGUgcmVzdWx0IG9mIG1lcmdpbmdcbiAqIHR3byBub24tdG91Y2hpbmcgcmVnaW9ucywgb3IgdGhlIGludmVyc2Ugb2YgYSBibG9iIChqaXQtdWkjODUpLiBFYWNoIHBhcnQgaXMgYVxuICogY2xvc2VkIHtAbGluayBQb2x5Z29ufSB0aGF0IG1heSBjYXJyeSBpdHMgb3duIGhvbGVzLCBzbyBhIE11bHRpUG9seWdvblxuICogcmVwcmVzZW50cyBcInNwYXJzZSBiaXRzLCBzb21lIHdpdGggZG9udXQgaG9sZXNcIiBhcyBhIHNpbmdsZSByZWdpb24uIE1hcHMgMToxXG4gKiBvbnRvIGEgR2VvSlNPTiBgTXVsdGlQb2x5Z29uYCAoYW5kIFF1UGF0aCdzIGdlb21ldHJ5KS5cbiAqXG4gKiBBIHNpbmdsZS1wYXJ0IE11bHRpUG9seWdvbiBpcyBlcXVpdmFsZW50IHRvIHRoYXQgUG9seWdvbjsgY2FsbGVycyBzaG91bGRcbiAqIHByZWZlciBhIHBsYWluIHtAbGluayBQb2x5Z29ufSBmb3Igb25lIGNvbm5lY3RlZCBwYXJ0LlxuICovXG5leHBvcnQgY2xhc3MgTXVsdGlQb2x5Z29uIHtcbiAgLyoqIE9uZSBvciBtb3JlIGRpc2pvaW50IGNsb3NlZCBwb2x5Z29ucyAoZWFjaCBtYXkgaGF2ZSBob2xlcykuICovXG4gIHBvbHlnb25zOiBQb2x5Z29uW10gPSBbXTtcbn1cblxuLyoqXG4gKiBBIHJlZ2lvbidzIGdlb21ldHJ5IGFzIGEgaG9zdCBtYXkgc3VwcGx5IGl0OiBhIHtAbGluayBSZWN0YW5nbGV9IG9yXG4gKiB7QGxpbmsgUG9seWdvbn0gaW5zdGFuY2UsIG9yIGEgcGxhaW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgZmllbGRzIChlLmcuIHBhcnNlZFxuICogSlNPTiwgcG9zc2libHkgd2l0aCBvbmx5IHNvbWUgb2YgdGhlbSkuIEltYWdlLXBpeGVsIGNvb3JkaW5hdGVzLiBQbGFpbiBvYmplY3RzXG4gKiBiZWNvbWUgY2xhc3MgaW5zdGFuY2VzIHZpYSB7QGxpbmsgaHlkcmF0ZUJvdW5kc30gd2hlbiB0aGV5IGVudGVyIHRoZSBzdG9yZTtcbiAqIHtAbGluayBSZWdpb24uYm91bmRzfSBpdHNlbGYgaXMgYWx3YXlzIGFuIGluc3RhbmNlIChvciBhIHtAbGluayBNdWx0aVBvbHlnb259KS5cbiAqL1xuZXhwb3J0IHR5cGUgQm91bmRzID1cbiAgfCBSZWN0YW5nbGVcbiAgfCBQb2x5Z29uXG4gIHwge1xuICAgICAgeD86IG51bWJlcjtcbiAgICAgIHk/OiBudW1iZXI7XG4gICAgICB3aWR0aD86IG51bWJlcjtcbiAgICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAgIG5wb2ludHM/OiBudW1iZXI7XG4gICAgICB4cG9pbnRzPzogbnVtYmVyW107XG4gICAgICB5cG9pbnRzPzogbnVtYmVyW107XG4gICAgfTtcblxuLyoqXG4gKiBSZWJ1aWxkIGEgcGxhaW4tb2JqZWN0IGBib3VuZHNgIGFzIHRoZSBjbGFzcyBpbnN0YW5jZSB0aGUgcmVuZGVyZXJzIGV4cGVjdFxuICogKGppdC11aSMxMjQpLlxuICpcbiAqIFJlZ2lvbnMgdGhhdCBhcnJpdmUgYXMgSlNPTiDigJQgYSBob3N0J3Mgc2VydmVyIHJlc3BvbnNlLCBhIGBzdHJ1Y3R1cmVkQ2xvbmVgLFxuICogYW55dGhpbmcgdGhhdCBoYXMgYmVlbiB0aHJvdWdoIGBKU09OLnBhcnNlYCDigJQgY2FycnkgYSBgYm91bmRzYCB0aGF0IGhhcyB0aGVcbiAqIHJpZ2h0ICpmaWVsZHMqIGJ1dCBub3QgdGhlIHJpZ2h0ICpwcm90b3R5cGUqLiBUaGUgcmVuZGVyZXJzIGRpc2FncmVlIGFib3V0XG4gKiB3aGV0aGVyIHRoYXQgaXMgYWNjZXB0YWJsZTogYFJlZ2lvbi5nZXRTaGFwZSgpYCAoUGxvdGx5KSBhbmQgdGhlIG5hcGFyaVxuICogb3ZlcmxheSBkdWNrLXR5cGUgdGhlIGJvdW5kcywgd2hpbGUgdGhlIE9wZW5TZWFkcmFnb24gb3ZlcmxheSBkaXNjcmltaW5hdGVzXG4gKiB3aXRoIGBib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGVgLiBTbyBhIEpTT04gcmVnaW9uIGRyZXcgaW4gSGVhdG1hcCBtb2RlIGFuZFxuICogc2lsZW50bHkgdmFuaXNoZWQgaW4gSW1hZ2UgbW9kZS4gYGluc3RhbmNlb2ZgIGFsc28gZ2F0ZXMgdGhlIHN0b3JlJ3Mgb3duXG4gKiBnZW9tZXRyeSBkZS1kdXBsaWNhdGlvbiwgYG1vdmVSZWdpb25gLCBhbmQgdGhlIEdlb0pTT04gZXhwb3J0IOKAlCBhIEpTT04gcmVnaW9uXG4gKiBpcyB1bmRyYWdnYWJsZSBhbmQgYWJzZW50IGZyb20gYSBzYXZlIGluICpldmVyeSogbW9kZS5cbiAqXG4gKiBSYXRoZXIgdGhhbiBkdWNrLXR5cGUgfjIwIGNhbGwgc2l0ZXMsIHRoZSBzdG9yZSBub3JtYWxpemVzIGhlcmUgb24gdGhlIHdheSBpbixcbiAqIHNvIGV2ZXJ5dGhpbmcgZG93bnN0cmVhbSBjYW4ga2VlcCByZWx5aW5nIG9uIGBpbnN0YW5jZW9mYC4gVmFsdWVzIHRoYXQgYXJlXG4gKiBhbHJlYWR5IGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgKipieSByZWZlcmVuY2UqKiwgdW50b3VjaGVkOiBvdmVybGF5cyBhbmQgdG9vbHNcbiAqIGhvbGQgb250byB0aGUgYm91bmRzIHRoZXkgY3JlYXRlZCBhbmQgbXV0YXRlIHRoZW0gaW4gcGxhY2UgZHVyaW5nIGEgZHJhZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVCb3VuZHMoYm91bmRzOiBhbnkpOiBSZWN0YW5nbGUgfCBQb2x5Z29uIHwgTXVsdGlQb2x5Z29uIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghYm91bmRzIHx8IGJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fCBib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uIHx8IGJvdW5kcyBpbnN0YW5jZW9mIE11bHRpUG9seWdvbikge1xuICAgIHJldHVybiBib3VuZHM7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYm91bmRzLnBvbHlnb25zKSkge1xuICAgIGNvbnN0IG11bHRpID0gbmV3IE11bHRpUG9seWdvbigpO1xuICAgIG11bHRpLnBvbHlnb25zID0gYm91bmRzLnBvbHlnb25zLm1hcCgocGFydDogYW55KSA9PiBoeWRyYXRlUG9seWdvbihwYXJ0KSk7XG4gICAgcmV0dXJuIG11bHRpO1xuICB9XG4gIGlmICgnbnBvaW50cycgaW4gYm91bmRzIHx8ICd4cG9pbnRzJyBpbiBib3VuZHMpIHtcbiAgICByZXR1cm4gaHlkcmF0ZVBvbHlnb24oYm91bmRzKTtcbiAgfVxuICBpZiAoJ3dpZHRoJyBpbiBib3VuZHMgJiYgJ2hlaWdodCcgaW4gYm91bmRzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFJlY3RhbmdsZSgpLCBib3VuZHMpO1xuICB9XG4gIC8vIE5vdGhpbmcgcmVjb2duaXNhYmxlIOKAlCBoYW5kIGl0IGJhY2sgcmF0aGVyIHRoYW4gY29lcmNlIGl0IGludG8gdGhlIHdyb25nXG4gIC8vIGdlb21ldHJ5LiBJdCByZW5kZXJzIG5vd2hlcmUgZWl0aGVyIHdheSwgYnV0IGEgY2FsbGVyIGNhbiBzdGlsbCBpbnNwZWN0IGl0LlxuICByZXR1cm4gYm91bmRzO1xufVxuXG4vKioge0BsaW5rIGh5ZHJhdGVCb3VuZHN9IGZvciBvbmUgcG9seWdvbiwgZGVyaXZpbmcgdGhlIGZpZWxkcyBhIGxlYW4gc2VyaWFsaXplclxuICogIG9taXRzOiBKSVQncyBKYXZhIGBQb2x5Z29uU2VyaWFsaXplcmAgd3JpdGVzIG9ubHkgYG5wb2ludHNgL2B4cG9pbnRzYC9cbiAqICBgeXBvaW50c2AsIHdoaWxlIHRoZSBHZW9KU09OIGV4cG9ydCByZWFkcyBgY29vcmRpbmF0ZXNgIGFuZCB0aGUgb3ZlcmxheXMgcmVhZFxuICogIGBjbG9zZWRgLiAqL1xuZnVuY3Rpb24gaHlkcmF0ZVBvbHlnb24ocmF3OiBhbnkpOiBQb2x5Z29uIHtcbiAgaWYgKHJhdyBpbnN0YW5jZW9mIFBvbHlnb24pIHJldHVybiByYXc7XG4gIGNvbnN0IHBvbHlnb246IFBvbHlnb24gPSBPYmplY3QuYXNzaWduKG5ldyBQb2x5Z29uKCksIHJhdyk7XG4gIHBvbHlnb24ueHBvaW50cyA9IFsuLi4ocmF3Lnhwb2ludHMgPz8gW10pXTtcbiAgcG9seWdvbi55cG9pbnRzID0gWy4uLihyYXcueXBvaW50cyA/PyBbXSldO1xuICBwb2x5Z29uLm5wb2ludHMgPSByYXcubnBvaW50cyA/PyBwb2x5Z29uLnhwb2ludHMubGVuZ3RoO1xuICBwb2x5Z29uLmNvb3JkaW5hdGVzID0gcmF3LmNvb3JkaW5hdGVzID8/IHBvbHlnb24ueHBvaW50cy5tYXAoKHgsIGkpID0+IFt4LCBwb2x5Z29uLnlwb2ludHNbaV1dKTtcbiAgcG9seWdvbi5jbG9zZWQgPSByYXcuY2xvc2VkID8/IHRydWU7XG4gIHJldHVybiBwb2x5Z29uO1xufVxuIl19
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { Region, Polygon, Rectangle } from './region';
|
|
2
|
+
import { parseSvgPath } from './geometry';
|
|
3
|
+
/**
|
|
4
|
+
* A {@link Region} projected to a Plotly layout shape (`rect` or SVG `path`),
|
|
5
|
+
* carrying the region's identity, class label and file name along so it
|
|
6
|
+
* round-trips through Plotly's relayout. Coordinates are the plot's data
|
|
7
|
+
* coordinates, which are the region's image pixels. Built by
|
|
8
|
+
* {@link Region.getShape}; {@link getRegion} converts back (only `rect` and
|
|
9
|
+
* `path` shapes — anything else throws).
|
|
10
|
+
*/
|
|
2
11
|
export class ShapeSelection {
|
|
3
12
|
constructor() {
|
|
4
13
|
this.editable = true;
|
|
@@ -28,21 +37,14 @@ export class ShapeSelection {
|
|
|
28
37
|
region.bounds.height = this.y1 - this.y0;
|
|
29
38
|
}
|
|
30
39
|
else if (this.type === 'path') {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
region.bounds.closed = isClosed;
|
|
40
|
-
for (const point of spoints) {
|
|
41
|
-
const coords = point.split(',');
|
|
42
|
-
region.bounds.xpoints.push(parseFloat(coords[0]));
|
|
43
|
-
region.bounds.ypoints.push(parseFloat(coords[1]));
|
|
44
|
-
region.bounds.coordinates.push([parseFloat(coords[0]), parseFloat(coords[1])]);
|
|
45
|
-
}
|
|
40
|
+
const { xpoints, ypoints, closed } = parseSvgPath(this.path);
|
|
41
|
+
region.bounds = Object.assign(new Polygon(), {
|
|
42
|
+
npoints: xpoints.length,
|
|
43
|
+
xpoints,
|
|
44
|
+
ypoints,
|
|
45
|
+
coordinates: xpoints.map((x, i) => [x, ypoints[i]]),
|
|
46
|
+
closed,
|
|
47
|
+
});
|
|
46
48
|
}
|
|
47
49
|
else {
|
|
48
50
|
throw new Error(`Unsupported shape type: ${this.type}`);
|
|
@@ -50,4 +52,4 @@ export class ShapeSelection {
|
|
|
50
52
|
return region;
|
|
51
53
|
}
|
|
52
54
|
}
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21vZGVscy9zaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUcxQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFBM0I7UUFpQ0UsYUFBUSxHQUFHLElBQUksQ0FBQztJQTZDbEIsQ0FBQztJQXBDQzs7T0FFRztJQUNJLFNBQVM7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNwQixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEIsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSx5RUFBeUU7UUFDekUsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSw2QkFBNkI7UUFDN0IsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQVksQ0FBQztZQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBWSxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFJLElBQUksQ0FBQyxFQUFhLEdBQUksSUFBSSxDQUFDLEVBQWEsQ0FBQztZQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBSSxJQUFJLENBQUMsRUFBYSxHQUFJLElBQUksQ0FBQyxFQUFhLENBQUM7UUFDbkUsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdELE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRSxFQUFFO2dCQUMzQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3ZCLE9BQU87Z0JBQ1AsT0FBTztnQkFDUCxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNO2FBQ1AsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVnaW9uLCBQb2x5Z29uLCBSZWN0YW5nbGUgfSBmcm9tICcuL3JlZ2lvbic7XG5pbXBvcnQgeyBwYXJzZVN2Z1BhdGggfSBmcm9tICcuL2dlb21ldHJ5JztcbmltcG9ydCB7IERhdHVtLCBGb250LCBTaGFwZSwgU2hhcGVMYWJlbCwgU2hhcGVMaW5lLCBYQXhpc05hbWUsIFlBeGlzTmFtZSB9IGZyb20gJ3Bsb3RseS5qcy1kaXN0LW1pbic7XG5cbi8qKlxuICogQSB7QGxpbmsgUmVnaW9ufSBwcm9qZWN0ZWQgdG8gYSBQbG90bHkgbGF5b3V0IHNoYXBlIChgcmVjdGAgb3IgU1ZHIGBwYXRoYCksXG4gKiBjYXJyeWluZyB0aGUgcmVnaW9uJ3MgaWRlbnRpdHksIGNsYXNzIGxhYmVsIGFuZCBmaWxlIG5hbWUgYWxvbmcgc28gaXRcbiAqIHJvdW5kLXRyaXBzIHRocm91Z2ggUGxvdGx5J3MgcmVsYXlvdXQuIENvb3JkaW5hdGVzIGFyZSB0aGUgcGxvdCdzIGRhdGFcbiAqIGNvb3JkaW5hdGVzLCB3aGljaCBhcmUgdGhlIHJlZ2lvbidzIGltYWdlIHBpeGVscy4gQnVpbHQgYnlcbiAqIHtAbGluayBSZWdpb24uZ2V0U2hhcGV9OyB7QGxpbmsgZ2V0UmVnaW9ufSBjb252ZXJ0cyBiYWNrIChvbmx5IGByZWN0YCBhbmRcbiAqIGBwYXRoYCBzaGFwZXMg4oCUIGFueXRoaW5nIGVsc2UgdGhyb3dzKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXBlU2VsZWN0aW9uIGltcGxlbWVudHMgU2hhcGUge1xuICAvKiogU3RhYmxlLCB1bmlxdWUgaWRlbnRpdHkgY2FycmllZCBhbG9uZ3NpZGUgdGhlIHNoYXBlIHNvIGl0IHJvdW5kLXRyaXBzXG4gICAqICB0aHJvdWdoIFBsb3RseSdzIHJlbGF5b3V0IHVudG91Y2hlZC4gUGxvdGx5IHByZXNlcnZlcyB1bmtub3duXG4gICAqICBwcm9wZXJ0aWVzIG9uIHNoYXBlIG9iamVjdHMsIHNvIHRoaXMgc3Vydml2ZXMgdGhlIHNhbWUgd2F5IGBsZWdlbmRgXG4gICAqICBhbmQgYGZpbGVOYW1lYCBhbHJlYWR5IGRvLiAqL1xuICBpZCE6IG51bWJlcjtcbiAgbmFtZSE6IHN0cmluZztcbiAgZmlsbGNvbG9yITogc3RyaW5nO1xuICAvLyBsYWJlbCB0YWtlcyB0aGUgZm9ybVxuICAvLyB7IHRleHQ6IGxlZ2VuZCwgdGV4dHRlbXBsYXRlOiBsZWdlbmQsIGZvbnQ6IHsgY29sb3I6ICcjRkZGMDAwJyB9LCB0ZXh0cG9zaXRpb246ICd0b3AgbGVmdCcgfVxuICAvLyBvciBjYW4gYmUgYW4gZW1wdHkgb2JqZWN0IHt9IGlmIG5vIGxhYmVsIGlzIHRvIGJlIHNob3duXG4gIGxhYmVsITogUGFydGlhbDxTaGFwZUxhYmVsPjtcbiAgbGF5ZXIhOiAnYmVsb3cnIHwgJ2Fib3ZlJztcbiAgbGVnZW5kZ3JvdXAhOiBzdHJpbmc7XG4gIGxlZ2VuZGdyb3VwdGl0bGUhOiB7IHRleHQ6IHN0cmluZzsgZm9udD86IFBhcnRpYWw8Rm9udD4gfTtcbiAgbGVnZW5kcmFuayE6IG51bWJlcjtcbiAgbGluZSE6IFBhcnRpYWw8U2hhcGVMaW5lPjtcbiAgb3BhY2l0eSE6IG51bWJlcjtcbiAgcGF0aCE6IHN0cmluZztcbiAgc2hvd2xlZ2VuZCE6IGJvb2xlYW47XG4gIHRlbXBsYXRlaXRlbW5hbWUhOiBzdHJpbmc7XG4gIHR5cGUhOiAncmVjdCcgfCAnY2lyY2xlJyB8ICdsaW5lJyB8ICdwYXRoJztcbiAgdmlzaWJsZSE6IGJvb2xlYW4gfCAnbGVnZW5kb25seSc7XG4gIHgwITogRGF0dW07XG4gIHgxITogRGF0dW07XG4gIHhhbmNob3IhOiBudW1iZXIgfCBzdHJpbmc7XG4gIHhyZWYhOiAncGFwZXInIHwgWEF4aXNOYW1lO1xuICB4c2l6ZW1vZGUhOiAnc2NhbGVkJyB8ICdwaXhlbCc7XG4gIHkwITogRGF0dW07XG4gIHkxITogRGF0dW07XG4gIHlhbmNob3IhOiBudW1iZXIgfCBzdHJpbmc7XG4gIHlyZWYhOiAncGFwZXInIHwgWUF4aXNOYW1lO1xuICB5c2l6ZW1vZGUhOiAnc2NhbGVkJyB8ICdwaXhlbCc7XG4gIGVkaXRhYmxlID0gdHJ1ZTtcbiAgLy8gbGVnZW5kIHRleHQgZm9yIHRoZSByZWdpb24gKHVzZWQgZm9yIGNsYXNzZXMpIC0gdmFsdWUgdXNlZCBpbiBsYWJlbC50ZXh0IGFuZCBsYWJlbC50ZXh0dGVtcGxhdGVcbiAgbGVnZW5kITogYW55O1xuICAvLyBmaWxlIG5hbWUgb2YgdGhlIGZpbGUgZm9yIHdoaWNoIHRoZSByZWdpb24gd2FzIGNyZWF0ZWRcbiAgZmlsZU5hbWUhOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8vIHRhZ3MgYW4gaW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0kgc28gaXQgcm91bmQtdHJpcHMgdGhyb3VnaCBQbG90bHkgYW5kIHRoZVxuICAvLyByZWdpb24gc3RvcmUgYXMgYSBwcm9maWxlIChleGNsdWRlZCBmcm9tIHRoZSBSZWdpb25zIHRhYiArIGV4cG9ydHMpLlxuICBraW5kPzogJ3Byb2ZpbGUnO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgUmVnaW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgc2hhcGUgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXRSZWdpb24oKTogUmVnaW9uIHtcbiAgICBjb25zdCByZWdpb24gPSBuZXcgUmVnaW9uKCk7XG4gICAgcmVnaW9uLmlkID0gdGhpcy5pZDtcbiAgICByZWdpb24ubmFtZSA9IHRoaXMubmFtZTtcbiAgICAvLyBUaGUgcmVnaW9uJ3MgY29sb3VyIGxpdmVzIG9uIGxpbmUuY29sb3IgKHNlZSBSZWdpb24uZ2V0U2hhcGUpOyBmaWxsY29sb3JcbiAgICAvLyBpcyBvbmx5IHNldCBmb3IgdGhlIGFjdGl2ZS1zaGFwZSBoaWdobGlnaHQuIFJlc3RvcmUgdGhlIGNsYXNzIGxhYmVsIGZyb21cbiAgICAvLyBsZWdlbmQgdG9vLiBXaXRob3V0IHRoZXNlLCBnZXRSZWdpb25zKCkg4oCUIHdoaWNoIHRoZSBPU0QgcmVnaW9uIG92ZXJsYXlcbiAgICAvLyByZW5kZXJzIGZyb20g4oCUIHJldHVybmVkIHVuZGVmaW5lZCBjb2xvdXIgQU5EIGxhYmVsLCBzbyBPU0QgZHJldyBldmVyeVxuICAgIC8vIHJlZ2lvbiBpbiB0aGUgZGVmYXVsdCBjb2xvdXIgd2l0aCBubyBsYWJlbCAodW5saWtlIFBsb3RseSwgd2hpY2ggcmVuZGVyc1xuICAgIC8vIGl0cyBzaGFwZSBhcnJheSBkaXJlY3RseSkuXG4gICAgcmVnaW9uLmNvbG9yID0gdGhpcy5saW5lPy5jb2xvciA/PyB0aGlzLmZpbGxjb2xvcjtcbiAgICByZWdpb24ubGFiZWwgPSB0aGlzLmxlZ2VuZDtcbiAgICBpZiAodGhpcy5raW5kID09PSAncHJvZmlsZScpIHJlZ2lvbi5raW5kID0gJ3Byb2ZpbGUnO1xuICAgIGlmICh0aGlzLnR5cGUgPT09ICdyZWN0Jykge1xuICAgICAgcmVnaW9uLmJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoKTtcbiAgICAgIHJlZ2lvbi5ib3VuZHMueCA9IHRoaXMueDAgYXMgbnVtYmVyO1xuICAgICAgcmVnaW9uLmJvdW5kcy55ID0gdGhpcy55MCBhcyBudW1iZXI7XG4gICAgICByZWdpb24uYm91bmRzLndpZHRoID0gKHRoaXMueDEgYXMgbnVtYmVyKSAtICh0aGlzLngwIGFzIG51bWJlcik7XG4gICAgICByZWdpb24uYm91bmRzLmhlaWdodCA9ICh0aGlzLnkxIGFzIG51bWJlcikgLSAodGhpcy55MCBhcyBudW1iZXIpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAncGF0aCcpIHtcbiAgICAgIGNvbnN0IHsgeHBvaW50cywgeXBvaW50cywgY2xvc2VkIH0gPSBwYXJzZVN2Z1BhdGgodGhpcy5wYXRoKTtcbiAgICAgIHJlZ2lvbi5ib3VuZHMgPSBPYmplY3QuYXNzaWduKG5ldyBQb2x5Z29uKCksIHtcbiAgICAgICAgbnBvaW50czogeHBvaW50cy5sZW5ndGgsXG4gICAgICAgIHhwb2ludHMsXG4gICAgICAgIHlwb2ludHMsXG4gICAgICAgIGNvb3JkaW5hdGVzOiB4cG9pbnRzLm1hcCgoeCwgaSkgPT4gW3gsIHlwb2ludHNbaV1dKSxcbiAgICAgICAgY2xvc2VkLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2hhcGUgdHlwZTogJHt0aGlzLnR5cGV9YCk7XG4gICAgfVxuICAgIHJldHVybiByZWdpb247XG4gIH1cbn1cbiJdfQ==
|