@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -460
- package/esm2022/index.mjs +34 -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/image.contract.mjs +1 -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/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- 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/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/geometry/section.mjs +215 -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 +12 -9
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -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 +270 -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 +347 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -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 +194 -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 +164 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
- 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 +134 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +411 -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/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -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 +896 -660
- package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -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/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +858 -414
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- 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 +53 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +144 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-source-scope.mjs +171 -0
- package/esm2022/lib/store/region-store.service.mjs +986 -670
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
- 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 +120 -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 +121 -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 +84 -119
- 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 +123 -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/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +602 -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-BKQhpbHv.mjs +47169 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.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 -34467
- 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/region-source.worker.js +1067 -0
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +19 -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/image.contract.d.ts +4 -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 +85 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/section-view.contract.d.ts +44 -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 +231 -54
- package/lib/contracts/viz-config.d.ts +9 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/geometry/section.d.ts +52 -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 +4 -3
- package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
- package/lib/implementations/napari-js/napari-scene.d.ts +126 -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 +91 -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 +169 -883
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -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 +38 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
- 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 +83 -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 +25 -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 +45 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +57 -0
- package/lib/models/region.d.ts +59 -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/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -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 +283 -200
- package/lib/region-editor/region-metrics.d.ts +34 -0
- package/lib/region-editor/region-persistence.service.d.ts +77 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +89 -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 +158 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +248 -59
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- 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 +39 -2
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +65 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-source-scope.d.ts +68 -0
- package/lib/store/region-store.service.d.ts +312 -116
- package/lib/store/visualizer-store.service.d.ts +32 -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 +62 -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 +51 -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 +55 -84
- 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 +46 -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/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +232 -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/assets/slice.svg +23 -0
- 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,4 @@
|
|
|
1
|
-
import { NO_CATEGORY, } from '../../contracts/spatial-dataset.contract';
|
|
1
|
+
import { NO_CATEGORY, NO_OBSERVATION, } from '../../contracts/spatial-dataset.contract';
|
|
2
2
|
/**
|
|
3
3
|
* The wire format the bundled example server speaks, and its decoders.
|
|
4
4
|
*
|
|
@@ -23,6 +23,8 @@ import { NO_CATEGORY, } from '../../contracts/spatial-dataset.contract';
|
|
|
23
23
|
*
|
|
24
24
|
* ENDPOINTS (base = the server root)
|
|
25
25
|
* ----------------------------------
|
|
26
|
+
* Every route `SpatialDataHttpService` calls. `{id}` is the dataset id; names and
|
|
27
|
+
* gene lists are URI-encoded.
|
|
26
28
|
* ```
|
|
27
29
|
* GET {base}/spatial/datasets -> { datasets: [{ id, name, count }] }
|
|
28
30
|
* GET {base}/spatial/{id}/manifest -> SpatialManifest
|
|
@@ -32,19 +34,28 @@ import { NO_CATEGORY, } from '../../contracts/spatial-dataset.contract';
|
|
|
32
34
|
* GET {base}/spatial/{id}/column/{name} -> u16[N] codes | f32[N] values
|
|
33
35
|
* GET {base}/spatial/{id}/feature/{name} -> f32[N]
|
|
34
36
|
* GET {base}/spatial/{id}/features?q=&limit= -> { names: string[] }
|
|
37
|
+
* GET {base}/spatial/{id}/embedding/{name} -> f32[N] per dimension, see decodeEmbedding
|
|
35
38
|
* GET {base}/spatial/{id}/polygons -> u32 count, u32[count+1] offsets, f32[2*rings] coords
|
|
39
|
+
* GET {base}/spatial/{id}/volume -> u8[width*height*depth] (manifest.volume only)
|
|
36
40
|
* GET {base}/spatial/{id}/polygon-tile/{set}/{level}/{gx}/{gy}
|
|
37
41
|
* -> u32 count, u32[count] obs, u32[count+1] offsets, f32 coords
|
|
38
|
-
* GET {base}/spatial/{id}/transcript-tile/{level}/{gx}/{gy}?genes=A,B&quality=high|all
|
|
42
|
+
* GET {base}/spatial/{id}/transcript-tile/{level}/{gx}/{gy}?genes=A,B&quality=high|all&box=
|
|
39
43
|
* -> see decodeTranscriptTile
|
|
40
|
-
* GET {base}/spatial/{id}/density?genes=A,B -> f32[rows*cols]
|
|
41
44
|
* GET {base}/spatial/{id}/transcript-bins/{level}/{tx}/{ty}
|
|
42
45
|
* -> transcript-tile layout, one entry per bin
|
|
46
|
+
* GET {base}/spatial/{id}/gene-bins/{level}/{tx}/{ty}?genes=A,B
|
|
47
|
+
* -> transcript-tile layout, per-gene bins
|
|
48
|
+
* GET {base}/spatial/{id}/density?genes=A,B&bin= -> see decodeDensity
|
|
49
|
+
* GET {base}/spatial/{id}/transcript-summary?box=&genes=&cells= -> SpatialTranscriptSummary
|
|
50
|
+
* GET {base}/spatial/{id}/transcript-counts?genes=A,B -> SpatialTranscriptCounts
|
|
51
|
+
* GET {base}/spatial/{id}/markers/{column}?n= -> SpatialMarkerGenes
|
|
52
|
+
* POST {base}/spatial/{id}/groups?name= (text/csv `cell_id,group`)
|
|
53
|
+
* -> { column: CategoricalColumnMeta, matched }
|
|
43
54
|
* ```
|
|
44
55
|
*
|
|
45
|
-
* The
|
|
46
|
-
*
|
|
47
|
-
* sees them requested.
|
|
56
|
+
* The optional routes are advertised in the manifest (`polygons`, `volume`,
|
|
57
|
+
* `polygonTiles`, `transcriptTiles`, `transcriptBins`, `transcriptGeneBins`,
|
|
58
|
+
* `density`); a server without them never sees them requested.
|
|
48
59
|
*/
|
|
49
60
|
/** Bumped when the layout changes incompatibly; the client refuses anything else. */
|
|
50
61
|
export const SPATIAL_WIRE_VERSION = 1;
|
|
@@ -66,12 +77,59 @@ function assertByteLength(buf, expected, what) {
|
|
|
66
77
|
'Manifest count and served vector length disagree.');
|
|
67
78
|
}
|
|
68
79
|
}
|
|
69
|
-
/**
|
|
80
|
+
/**
|
|
81
|
+
* Reject a manifest this client cannot read, with a message naming the fix.
|
|
82
|
+
*
|
|
83
|
+
* Besides the version, the values every decoder sizes its views from: an observation
|
|
84
|
+
* count that is not a non-negative integer, or an embedding that is not 2-D or 3-D, would
|
|
85
|
+
* otherwise surface later as a RangeError deep inside a renderer.
|
|
86
|
+
*/
|
|
70
87
|
export function assertManifestVersion(manifest) {
|
|
71
88
|
if (manifest.version !== SPATIAL_WIRE_VERSION) {
|
|
72
89
|
throw new Error(`[spatial] unsupported wire version ${manifest.version} ` +
|
|
73
90
|
`(this client speaks ${SPATIAL_WIRE_VERSION}). Update the server or the library.`);
|
|
74
91
|
}
|
|
92
|
+
if (!Number.isSafeInteger(manifest.count) || manifest.count < 0) {
|
|
93
|
+
throw new Error(`[spatial] manifest count ${manifest.count} is not a non-negative integer`);
|
|
94
|
+
}
|
|
95
|
+
for (const e of manifest.embeddings ?? [])
|
|
96
|
+
assertEmbeddingDims(e);
|
|
97
|
+
}
|
|
98
|
+
function assertEmbeddingDims(meta) {
|
|
99
|
+
if (meta.dims !== 2 && meta.dims !== 3) {
|
|
100
|
+
throw new Error(`[spatial] embedding "${meta.name}": dims ${meta.dims} is not 2 or 3`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Ring offsets must start at 0 and never go backwards: a decreasing pair is a negative
|
|
105
|
+
* vertex count, which a renderer turns into `new Float32Array(negative)` on every frame.
|
|
106
|
+
* (That the last offset matches the coordinate block is the byte-length check's job.)
|
|
107
|
+
*/
|
|
108
|
+
function assertRingOffsets(offsets, what) {
|
|
109
|
+
if (offsets[0] !== 0)
|
|
110
|
+
throw new Error(`[spatial] ${what}: offsets must start at 0`);
|
|
111
|
+
for (let i = 1; i < offsets.length; i++) {
|
|
112
|
+
if (offsets[i] < offsets[i - 1]) {
|
|
113
|
+
throw new Error(`[spatial] ${what}: offsets decrease at ring ${i - 1}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Every entry must name an observation below `count`, or {@link NO_OBSERVATION}. */
|
|
118
|
+
function assertObservations(observation, count, what) {
|
|
119
|
+
if (count === undefined)
|
|
120
|
+
return;
|
|
121
|
+
for (let i = 0; i < observation.length; i++) {
|
|
122
|
+
const o = observation[i];
|
|
123
|
+
if (o >= count && o !== NO_OBSERVATION) {
|
|
124
|
+
throw new Error(`[spatial] ${what}: observation ${o} is past the ${count} in the dataset`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** A header-sized prefix must be there before any view over it is made. */
|
|
129
|
+
function assertHeader(buf, bytes, what) {
|
|
130
|
+
if (buf.byteLength < bytes) {
|
|
131
|
+
throw new Error(`[spatial] ${what}: response too short for its header (${buf.byteLength} < ${bytes} bytes)`);
|
|
132
|
+
}
|
|
75
133
|
}
|
|
76
134
|
/**
|
|
77
135
|
* `GET /coords` → x/y(/z). One request rather than two or three: the vectors
|
|
@@ -93,7 +151,6 @@ export function decodeRadius(buf, count) {
|
|
|
93
151
|
assertByteLength(buf, count * 4, 'radius');
|
|
94
152
|
return new Float32Array(buf, 0, count);
|
|
95
153
|
}
|
|
96
|
-
/** `GET /feature/{name}` → one gene's expression vector. */
|
|
97
154
|
/**
|
|
98
155
|
* `GET /spatial/{id}/embedding/{name}` — one plane per dimension, same layout as coords.
|
|
99
156
|
*
|
|
@@ -102,6 +159,7 @@ export function decodeRadius(buf, count) {
|
|
|
102
159
|
*/
|
|
103
160
|
export function decodeEmbedding(buf, meta, count) {
|
|
104
161
|
assertLittleEndian();
|
|
162
|
+
assertEmbeddingDims(meta);
|
|
105
163
|
assertByteLength(buf, count * meta.dims * 4, `embedding "${meta.name}"`);
|
|
106
164
|
return {
|
|
107
165
|
meta,
|
|
@@ -110,6 +168,7 @@ export function decodeEmbedding(buf, meta, count) {
|
|
|
110
168
|
...(meta.dims === 3 ? { z: new Float32Array(buf, count * 8, count) } : {}),
|
|
111
169
|
};
|
|
112
170
|
}
|
|
171
|
+
/** `GET /feature/{name}` → one gene's expression vector. */
|
|
113
172
|
export function decodeFeatureVector(buf, count) {
|
|
114
173
|
assertLittleEndian();
|
|
115
174
|
assertByteLength(buf, count * 4, 'feature vector');
|
|
@@ -147,9 +206,11 @@ export function decodePolygons(buf) {
|
|
|
147
206
|
throw new Error('[spatial] polygons: response too short for a header');
|
|
148
207
|
}
|
|
149
208
|
const count = new Uint32Array(buf, 0, 1)[0];
|
|
209
|
+
const coordsByteOffset = 4 + (count + 1) * 4;
|
|
210
|
+
assertHeader(buf, coordsByteOffset, 'polygons');
|
|
150
211
|
const offsets = new Uint32Array(buf, 4, count + 1);
|
|
212
|
+
assertRingOffsets(offsets, 'polygons');
|
|
151
213
|
const vertexCount = offsets[count];
|
|
152
|
-
const coordsByteOffset = 4 + (count + 1) * 4;
|
|
153
214
|
assertByteLength(buf, coordsByteOffset + vertexCount * 2 * 4, 'polygons');
|
|
154
215
|
const coords = new Float32Array(buf, coordsByteOffset, vertexCount * 2);
|
|
155
216
|
return { coords, offsets, count };
|
|
@@ -157,20 +218,27 @@ export function decodePolygons(buf) {
|
|
|
157
218
|
/**
|
|
158
219
|
* `GET /polygon-tile/...` → one tile of rings with their owning observations. Layout
|
|
159
220
|
* `[u32 count][u32 obs × count][u32 offsets × (count+1)][f32 coords × 2·offsets[count]]`.
|
|
221
|
+
*
|
|
222
|
+
* `observations` is the dataset's N; when given, every owner must be below it.
|
|
160
223
|
*/
|
|
161
|
-
export function decodePolygonTile(buf) {
|
|
224
|
+
export function decodePolygonTile(buf, observations) {
|
|
162
225
|
assertLittleEndian();
|
|
163
226
|
if (buf.byteLength < 8) {
|
|
164
227
|
throw new Error('[spatial] polygon tile: response too short for a header');
|
|
165
228
|
}
|
|
166
229
|
const count = new Uint32Array(buf, 0, 1)[0];
|
|
230
|
+
const coordsByteOffset = 4 + count * 4 + (count + 1) * 4;
|
|
231
|
+
assertHeader(buf, coordsByteOffset, 'polygon tile');
|
|
167
232
|
const observation = new Uint32Array(buf, 4, count);
|
|
168
233
|
const offsets = new Uint32Array(buf, 4 + count * 4, count + 1);
|
|
234
|
+
assertRingOffsets(offsets, 'polygon tile');
|
|
169
235
|
const vertexCount = offsets[count];
|
|
170
|
-
const coordsByteOffset = 4 + count * 4 + (count + 1) * 4;
|
|
171
236
|
assertByteLength(buf, coordsByteOffset + vertexCount * 8, 'polygon tile');
|
|
237
|
+
assertObservations(observation, observations, 'polygon tile');
|
|
172
238
|
return {
|
|
173
|
-
count,
|
|
239
|
+
count,
|
|
240
|
+
observation,
|
|
241
|
+
offsets,
|
|
174
242
|
coords: new Float32Array(buf, coordsByteOffset, vertexCount * 2),
|
|
175
243
|
};
|
|
176
244
|
}
|
|
@@ -178,8 +246,11 @@ export function decodePolygonTile(buf) {
|
|
|
178
246
|
* `GET /transcript-tile/...` → transcripts or aggregates. Layout, 4-byte aligned:
|
|
179
247
|
* `[u32 n][u32 flags][f32 x·n][f32 y·n][f32 z·n][u32 weight·n][u32 obs·n][u16 gene·n, padded]`;
|
|
180
248
|
* flags bit 0 marks an aggregated level.
|
|
249
|
+
*
|
|
250
|
+
* `limits` bounds the indices when the caller knows them: `observations` is the dataset's
|
|
251
|
+
* N, and `genes` the length of the gene list the codes index (omit it for `ALL_GENES`).
|
|
181
252
|
*/
|
|
182
|
-
export function decodeTranscriptTile(buf) {
|
|
253
|
+
export function decodeTranscriptTile(buf, limits = {}) {
|
|
183
254
|
assertLittleEndian();
|
|
184
255
|
if (buf.byteLength < 8) {
|
|
185
256
|
throw new Error('[spatial] transcript tile: response too short for a header');
|
|
@@ -187,6 +258,16 @@ export function decodeTranscriptTile(buf) {
|
|
|
187
258
|
const [n, flags] = new Uint32Array(buf, 0, 2);
|
|
188
259
|
const genePad = Math.ceil((n * 2) / 4) * 4;
|
|
189
260
|
assertByteLength(buf, 8 + n * 20 + genePad, 'transcript tile');
|
|
261
|
+
const observation = new Uint32Array(buf, 8 + n * 16, n);
|
|
262
|
+
const gene = new Uint16Array(buf, 8 + n * 20, n);
|
|
263
|
+
assertObservations(observation, limits.observations, 'transcript tile');
|
|
264
|
+
if (limits.genes !== undefined) {
|
|
265
|
+
for (let i = 0; i < n; i++) {
|
|
266
|
+
if (gene[i] >= limits.genes) {
|
|
267
|
+
throw new Error(`[spatial] transcript tile: gene code ${gene[i]} is past the ${limits.genes} asked for`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
190
271
|
return {
|
|
191
272
|
count: n,
|
|
192
273
|
aggregated: (flags & 1) === 1,
|
|
@@ -194,8 +275,8 @@ export function decodeTranscriptTile(buf) {
|
|
|
194
275
|
y: new Float32Array(buf, 8 + n * 4, n),
|
|
195
276
|
z: new Float32Array(buf, 8 + n * 8, n),
|
|
196
277
|
weight: new Uint32Array(buf, 8 + n * 12, n),
|
|
197
|
-
observation
|
|
198
|
-
gene
|
|
278
|
+
observation,
|
|
279
|
+
gene,
|
|
199
280
|
};
|
|
200
281
|
}
|
|
201
282
|
/**
|
|
@@ -209,6 +290,10 @@ export function decodeDensity(buf, genes) {
|
|
|
209
290
|
throw new Error('[spatial] density: response too short for a header');
|
|
210
291
|
const [rows, cols] = new Uint32Array(buf, 0, 2);
|
|
211
292
|
const [cw, ch, ox, oy] = new Float32Array(buf, 8, 4);
|
|
293
|
+
// The cell size divides every downstream position; zero, negative or NaN is unusable.
|
|
294
|
+
if (!(cw > 0 && ch > 0 && Number.isFinite(cw) && Number.isFinite(ch))) {
|
|
295
|
+
throw new Error(`[spatial] density: grid size ${cw} x ${ch} is not positive and finite`);
|
|
296
|
+
}
|
|
212
297
|
assertByteLength(buf, 24 + rows * cols * 4, 'density');
|
|
213
298
|
const meta = { rows, cols, gridSize: [cw, ch], origin: [ox, oy] };
|
|
214
299
|
return { meta, genes, values: new Float32Array(buf, 24, rows * cols) };
|
|
@@ -220,9 +305,7 @@ export function decodeDensity(buf, genes) {
|
|
|
220
305
|
*/
|
|
221
306
|
export function datasetFromManifest(manifest, coords, extras = {}) {
|
|
222
307
|
assertManifestVersion(manifest);
|
|
223
|
-
const radius = manifest.radius?.mode === 'uniform'
|
|
224
|
-
? manifest.radius.value
|
|
225
|
-
: extras.radius;
|
|
308
|
+
const radius = manifest.radius?.mode === 'uniform' ? manifest.radius.value : extras.radius;
|
|
226
309
|
const observations = {
|
|
227
310
|
count: manifest.count,
|
|
228
311
|
x: coords.x,
|
|
@@ -241,9 +324,7 @@ export function datasetFromManifest(manifest, coords, extras = {}) {
|
|
|
241
324
|
...(manifest.imageRef ? { imageRef: manifest.imageRef } : {}),
|
|
242
325
|
...(manifest.volume ? { volume: manifest.volume } : {}),
|
|
243
326
|
...(manifest.embeddings?.length ? { embeddings: manifest.embeddings } : {}),
|
|
244
|
-
...(manifest.micronsPerUnit !== undefined
|
|
245
|
-
? { micronsPerUnit: manifest.micronsPerUnit }
|
|
246
|
-
: {}),
|
|
327
|
+
...(manifest.micronsPerUnit !== undefined ? { micronsPerUnit: manifest.micronsPerUnit } : {}),
|
|
247
328
|
...(manifest.polygonTiles ? { polygonTiles: manifest.polygonTiles } : {}),
|
|
248
329
|
...(manifest.transcriptTiles ? { transcriptTiles: manifest.transcriptTiles } : {}),
|
|
249
330
|
...(manifest.density ? { density: manifest.density } : {}),
|
|
@@ -252,4 +333,4 @@ export function datasetFromManifest(manifest, coords, extras = {}) {
|
|
|
252
333
|
...(manifest.transcriptBinsStatus ? { transcriptBinsStatus: manifest.transcriptBinsStatus } : {}),
|
|
253
334
|
};
|
|
254
335
|
}
|
|
255
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC13aXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvc3BhdGlhbC1kYXRhLWh0dHAvc3BhdGlhbC13aXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxXQUFXLEdBbUJaLE1BQU0sMENBQTBDLENBQUM7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7QUFFSCxxRkFBcUY7QUFDckYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBdUN0QyxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLGNBQWM7SUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxrQkFBa0I7SUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUU7WUFDdkUsdUVBQXVFLENBQ3hFLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLGdCQUFnQixDQUFDLEdBQWdCLEVBQUUsUUFBZ0IsRUFBRSxJQUFZO0lBQ3hFLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLGFBQWEsSUFBSSxjQUFjLFFBQVEsZUFBZSxHQUFHLENBQUMsVUFBVSxJQUFJO1lBQ3hFLG1EQUFtRCxDQUNwRCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFFBQXlCO0lBQzdELElBQUksUUFBUSxDQUFDLE9BQU8sS0FBSyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0NBQXNDLFFBQVEsQ0FBQyxPQUFPLEdBQUc7WUFDekQsdUJBQXVCLG9CQUFvQixzQ0FBc0MsQ0FDbEYsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLEdBQWdCLEVBQUUsS0FBYSxFQUFFLElBQUksR0FBRyxLQUFLO0lBRTdDLGtCQUFrQixFQUFFLENBQUM7SUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDckIsQ0FBQztBQUVELDZEQUE2RDtBQUM3RCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQWdCLEVBQUUsS0FBYTtJQUMxRCxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsNERBQTREO0FBQzVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsR0FBZ0IsRUFBRSxJQUEwQixFQUFFLEtBQWE7SUFFM0Qsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLGNBQWMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDekUsT0FBTztRQUNMLElBQUk7UUFDSixDQUFDLEVBQUUsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDbEMsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUMxQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUMzRSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxHQUFnQixFQUFFLEtBQWE7SUFDakUsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixHQUFnQixFQUFFLElBQXVCLEVBQUUsS0FBYTtJQUV4RCxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUUsQ0FBQztRQUNoQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxXQUFXLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzFELE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLEdBQUksSUFBOEIsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQzVDLENBQUM7UUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQTZCLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUNELGdCQUFnQixDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFdBQVcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDMUQsT0FBTyxFQUFFLElBQUksRUFBRSxJQUE0QixFQUFFLE1BQU0sRUFBRSxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDekYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQWdCO0lBQzdDLGtCQUFrQixFQUFFLENBQUM7SUFDckIsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsR0FBRyxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsR0FBZ0I7SUFDaEQsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekQsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLGdCQUFnQixHQUFHLFdBQVcsR0FBRyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDMUUsT0FBTztRQUNMLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTztRQUMzQixNQUFNLEVBQUUsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUM7S0FDakUsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEdBQWdCO0lBQ25ELGtCQUFrQixFQUFFLENBQUM7SUFDckIsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELENBQUMsQ0FBQztJQUNoRixDQUFDO0lBQ0QsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMvRCxPQUFPO1FBQ0wsS0FBSyxFQUFFLENBQUM7UUFDUixVQUFVLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUM3QixDQUFDLEVBQUUsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUIsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0MsV0FBVyxFQUFFLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDMUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxHQUFnQixFQUFFLEtBQWU7SUFDN0Qsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEdBQUcsRUFBRTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUMvRixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEQsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckQsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBdUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN0RixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsUUFBeUIsRUFDekIsTUFBa0QsRUFDbEQsU0FBb0QsRUFBRTtJQUV0RCxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksS0FBSyxTQUFTO1FBQ2hELENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUs7UUFDdkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEIsTUFBTSxZQUFZLEdBQXdCO1FBQ3hDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztRQUNyQixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDWCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDNUMsQ0FBQztJQUNGLE9BQU87UUFDTCxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUU7UUFDZixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsWUFBWTtRQUNaLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUU7UUFDL0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdELEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZELEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0UsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEtBQUssU0FBUztZQUN2QyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRTtZQUM3QyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLEdBQUcsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRixHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9FLEdBQUcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRixHQUFHLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDbEcsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDYXRlZ29yaWNhbENvbHVtbk1ldGEsXG4gIENvbnRpbnVvdXNDb2x1bW5NZXRhLFxuICBOT19DQVRFR09SWSxcbiAgU3BhdGlhbENvbHVtbixcbiAgU3BhdGlhbENvbHVtbk1ldGEsXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsRGVuc2l0eU1ldGEsXG4gIFNwYXRpYWxEZW5zaXR5UmFzdGVyLFxuICBTcGF0aWFsRW1iZWRkaW5nLFxuICBTcGF0aWFsRW1iZWRkaW5nTWV0YSxcbiAgU3BhdGlhbEZlYXR1cmVNZXRhLFxuICBTcGF0aWFsSW1hZ2VSZWYsXG4gIFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIFNwYXRpYWxQb2x5Z29uVGlsZSxcbiAgU3BhdGlhbFBvbHlnb25UaWxlc01ldGEsXG4gIFNwYXRpYWxQb2x5Z29ucyxcbiAgU3BhdGlhbFRyYW5zY3JpcHRCaW5zTWV0YSwgU3BhdGlhbFRyYW5zY3JpcHRHZW5lQmluc01ldGEsXG4gIFNwYXRpYWxUcmFuc2NyaXB0Qmluc1N0YXR1cyxcbiAgU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGVzTWV0YSxcbiAgU3BhdGlhbFZvbHVtZU1ldGEsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFRoZSB3aXJlIGZvcm1hdCB0aGUgYnVuZGxlZCBleGFtcGxlIHNlcnZlciBzcGVha3MsIGFuZCBpdHMgZGVjb2RlcnMuXG4gKlxuICogUHVyZSBieSBkZXNpZ24g4oCUIG5vIEFuZ3VsYXIsIG5vIFJ4SlMsIG5vIEhUVFAg4oCUIHNvIHRoZSBmb3JtYXQgaXMgdGVzdGFibGUgb25cbiAqIGl0cyBvd24gYW5kIHJldXNhYmxlIGJ5IGFueSB0cmFuc3BvcnQgKGBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlYCBpcyBvbmUpLlxuICogTWlycm9ycyB0aGUgc3BsaXQgaW4gYHBsb3RseS10cmFjZS1idWlsZGVycy50c2A6IHRoZSBzaGFwZSBsaXZlcyBpbiBhIHB1cmVcbiAqIG1vZHVsZSwgdGhlIHNlcnZpY2UganVzdCBtb3ZlcyBieXRlcy5cbiAqXG4gKiBXSFkgQklOQVJZXG4gKiAtLS0tLS0tLS0tXG4gKiBWZWN0b3JzIGFyZSBvbmUgYEZsb2F0MzJBcnJheWAvYFVpbnQxNkFycmF5YCBwZXIgcmVxdWVzdCwgZGVsaXZlcmVkIGFzIHJhd1xuICogbGl0dGxlLWVuZGlhbiBieXRlcy4gSlNPTiB3b3VsZCBjb3N0IH444oCTMTLDlyB0aGUgc2l6ZSBhbmQgYSBwYXJzZSB0aGF0XG4gKiBhbGxvY2F0ZXMgb25lIEpTIG51bWJlciBwZXIgdmFsdWU7IGEgdHlwZWQtYXJyYXkgdmlldyBvdmVyIHRoZSByZXNwb25zZVxuICogYnVmZmVyIGlzIHplcm8tY29weSBhbmQgdXBsb2FkcyB0byB0aGUgR1BVIGRpcmVjdGx5LlxuICpcbiAqIEVORElBTk5FU1NcbiAqIC0tLS0tLS0tLS1cbiAqIExpdHRsZS1lbmRpYW4sIGFzc2VydGVkIGF0IGRlY29kZS4gRXZlcnkgcGxhdGZvcm0gYSBicm93c2VyIHJ1bnMgb24gdG9kYXkgaXNcbiAqIGxpdHRsZS1lbmRpYW4sIHNvIGEgYERhdGFWaWV3YCBieXRlLWJ5LWJ5dGUgcmVhZCB3b3VsZCBjb3N0IHJlYWwgdGltZSBmb3IgYVxuICogY2FzZSB0aGF0IGRvZXMgbm90IG9jY3VyIOKAlCBidXQgZmFpbGluZyBsb3VkbHkgYmVhdHMgcmVuZGVyaW5nIHRyYW5zcG9zZWRcbiAqIGdhcmJhZ2UgaWYgaXQgZXZlciBkb2VzLlxuICpcbiAqIEVORFBPSU5UUyAoYmFzZSA9IHRoZSBzZXJ2ZXIgcm9vdClcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGBgYFxuICogR0VUIHtiYXNlfS9zcGF0aWFsL2RhdGFzZXRzICAgICAgICAgICAgICAtPiB7IGRhdGFzZXRzOiBbeyBpZCwgbmFtZSwgY291bnQgfV0gfVxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vbWFuaWZlc3QgICAgICAgICAtPiBTcGF0aWFsTWFuaWZlc3RcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2Nvb3JkcyAgICAgICAgICAgLT4gZjMyW05dIHgsIGYzMltOXSB5LCBmMzJbTl0gej9cbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L3JhZGl1cyAgICAgICAgICAgLT4gZjMyW05dICAgICAgICAgICAocGVyLW9ic2VydmF0aW9uIHJhZGl1cyBvbmx5KVxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vaWRzICAgICAgICAgICAgICAtPiB7IGlkczogc3RyaW5nW10gfSAoaGFzSWRzIG9ubHkpXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9jb2x1bW4ve25hbWV9ICAgIC0+IHUxNltOXSBjb2RlcyB8IGYzMltOXSB2YWx1ZXNcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2ZlYXR1cmUve25hbWV9ICAgLT4gZjMyW05dXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9mZWF0dXJlcz9xPSZsaW1pdD0gLT4geyBuYW1lczogc3RyaW5nW10gfVxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vcG9seWdvbnMgICAgICAgICAtPiB1MzIgY291bnQsIHUzMltjb3VudCsxXSBvZmZzZXRzLCBmMzJbMipyaW5nc10gY29vcmRzXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9wb2x5Z29uLXRpbGUve3NldH0ve2xldmVsfS97Z3h9L3tneX1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gdTMyIGNvdW50LCB1MzJbY291bnRdIG9icywgdTMyW2NvdW50KzFdIG9mZnNldHMsIGYzMiBjb29yZHNcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L3RyYW5zY3JpcHQtdGlsZS97bGV2ZWx9L3tneH0ve2d5fT9nZW5lcz1BLEImcXVhbGl0eT1oaWdofGFsbFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBzZWUgZGVjb2RlVHJhbnNjcmlwdFRpbGVcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2RlbnNpdHk/Z2VuZXM9QSxCIC0+IGYzMltyb3dzKmNvbHNdXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS90cmFuc2NyaXB0LWJpbnMve2xldmVsfS97dHh9L3t0eX1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gdHJhbnNjcmlwdC10aWxlIGxheW91dCwgb25lIGVudHJ5IHBlciBiaW5cbiAqIGBgYFxuICpcbiAqIFRoZSB0aHJlZSB0aWxlZCByb3V0ZXMgYXJlIG9wdGlvbmFsIGFuZCBhZHZlcnRpc2VkIGluIHRoZSBtYW5pZmVzdFxuICogKGBwb2x5Z29uVGlsZXNgLCBgdHJhbnNjcmlwdFRpbGVzYCwgYGRlbnNpdHlgKTsgYSBzZXJ2ZXIgd2l0aG91dCB0aGVtIG5ldmVyXG4gKiBzZWVzIHRoZW0gcmVxdWVzdGVkLlxuICovXG5cbi8qKiBCdW1wZWQgd2hlbiB0aGUgbGF5b3V0IGNoYW5nZXMgaW5jb21wYXRpYmx5OyB0aGUgY2xpZW50IHJlZnVzZXMgYW55dGhpbmcgZWxzZS4gKi9cbmV4cG9ydCBjb25zdCBTUEFUSUFMX1dJUkVfVkVSU0lPTiA9IDE7XG5cbi8qKiBQZXItb2JzZXJ2YXRpb24gbWFya2VyIHJhZGl1czogb25lIHNoYXJlZCB2YWx1ZSwgb3IgYSBzZXJ2ZWQgZjMyIHZlY3Rvci4gKi9cbmV4cG9ydCB0eXBlIFNwYXRpYWxSYWRpdXNTcGVjID1cbiAgfCB7IG1vZGU6ICd1bmlmb3JtJzsgdmFsdWU6IG51bWJlciB9XG4gIHwgeyBtb2RlOiAncGVyLW9ic2VydmF0aW9uJyB9O1xuXG4vKiogYEdFVCAvc3BhdGlhbC97aWR9L21hbmlmZXN0YCDigJQgZXZlcnl0aGluZyBjaGVhcCBlbm91Z2ggdG8gc2VuZCB1cCBmcm9udC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbE1hbmlmZXN0IHtcbiAgdmVyc2lvbjogbnVtYmVyO1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBOIOKAlCBvYnNlcnZhdGlvbiBjb3VudDsgZXZlcnkgc2VydmVkIHZlY3RvciBoYXMgZXhhY3RseSB0aGlzIGxlbmd0aC4gKi9cbiAgY291bnQ6IG51bWJlcjtcbiAgaGFzWj86IGJvb2xlYW47XG4gIGhhc0lkcz86IGJvb2xlYW47XG4gIHJhZGl1cz86IFNwYXRpYWxSYWRpdXNTcGVjO1xuICBjb2x1bW5zOiBTcGF0aWFsQ29sdW1uTWV0YVtdO1xuICBmZWF0dXJlcz86IFNwYXRpYWxGZWF0dXJlTWV0YTtcbiAgcG9seWdvbnM/OiB7IGNvdW50OiBudW1iZXIgfTtcbiAgaW1hZ2VSZWY/OiBTcGF0aWFsSW1hZ2VSZWY7XG4gIHZvbHVtZT86IFNwYXRpYWxWb2x1bWVNZXRhO1xuICBlbWJlZGRpbmdzPzogU3BhdGlhbEVtYmVkZGluZ01ldGFbXTtcbiAgbWljcm9uc1BlclVuaXQ/OiBudW1iZXI7XG4gIHBvbHlnb25UaWxlcz86IFNwYXRpYWxQb2x5Z29uVGlsZXNNZXRhO1xuICB0cmFuc2NyaXB0VGlsZXM/OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGVzTWV0YTtcbiAgZGVuc2l0eT86IFNwYXRpYWxEZW5zaXR5TWV0YTtcbiAgdHJhbnNjcmlwdEJpbnM/OiBTcGF0aWFsVHJhbnNjcmlwdEJpbnNNZXRhO1xuICB0cmFuc2NyaXB0Qmluc1N0YXR1cz86IFNwYXRpYWxUcmFuc2NyaXB0Qmluc1N0YXR1cztcbiAgdHJhbnNjcmlwdEdlbmVCaW5zPzogU3BhdGlhbFRyYW5zY3JpcHRHZW5lQmluc01ldGE7XG59XG5cbi8qKiBgR0VUIC9zcGF0aWFsL2RhdGFzZXRzYCAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsRGF0YXNldFN1bW1hcnkge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbi8qKiBUcnVlIG9uIGEgbGl0dGxlLWVuZGlhbiBob3N0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCk6IGJvb2xlYW4ge1xuICBjb25zdCBwcm9iZSA9IG5ldyBVaW50MTZBcnJheShbMV0pO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocHJvYmUuYnVmZmVyKVswXSA9PT0gMTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0TGl0dGxlRW5kaWFuKCk6IHZvaWQge1xuICBpZiAoIWlzTGl0dGxlRW5kaWFuKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnW3NwYXRpYWxdIHdpcmUgZm9ybWF0IGlzIGxpdHRsZS1lbmRpYW47IHRoaXMgcGxhdGZvcm0gaXMgYmlnLWVuZGlhbi4gJyArXG4gICAgICAnU2VydmUgSlNPTiB2ZWN0b3JzLCBvciBieXRlLXN3YXAgaW4gYSBjdXN0b20gU3BhdGlhbERhdGFQb3J0IGFkYXB0ZXIuJyxcbiAgICApO1xuICB9XG59XG5cbi8qKiBHdWFyZCBhIGRlY29kZSBhZ2FpbnN0IGEgdHJ1bmNhdGVkIG9yIG92ZXJzaXplZCByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIGFzc2VydEJ5dGVMZW5ndGgoYnVmOiBBcnJheUJ1ZmZlciwgZXhwZWN0ZWQ6IG51bWJlciwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCAhPT0gZXhwZWN0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgW3NwYXRpYWxdICR7d2hhdH06IGV4cGVjdGVkICR7ZXhwZWN0ZWR9IGJ5dGVzLCBnb3QgJHtidWYuYnl0ZUxlbmd0aH0uIGAgK1xuICAgICAgJ01hbmlmZXN0IGNvdW50IGFuZCBzZXJ2ZWQgdmVjdG9yIGxlbmd0aCBkaXNhZ3JlZS4nLFxuICAgICk7XG4gIH1cbn1cblxuLyoqIFJlamVjdCBhIG1hbmlmZXN0IHRoaXMgY2xpZW50IGNhbm5vdCByZWFkLCB3aXRoIGEgbWVzc2FnZSBuYW1pbmcgdGhlIGZpeC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNYW5pZmVzdFZlcnNpb24obWFuaWZlc3Q6IFNwYXRpYWxNYW5pZmVzdCk6IHZvaWQge1xuICBpZiAobWFuaWZlc3QudmVyc2lvbiAhPT0gU1BBVElBTF9XSVJFX1ZFUlNJT04pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgW3NwYXRpYWxdIHVuc3VwcG9ydGVkIHdpcmUgdmVyc2lvbiAke21hbmlmZXN0LnZlcnNpb259IGAgK1xuICAgICAgYCh0aGlzIGNsaWVudCBzcGVha3MgJHtTUEFUSUFMX1dJUkVfVkVSU0lPTn0pLiBVcGRhdGUgdGhlIHNlcnZlciBvciB0aGUgbGlicmFyeS5gLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBgR0VUIC9jb29yZHNgIOKGkiB4L3koL3opLiBPbmUgcmVxdWVzdCByYXRoZXIgdGhhbiB0d28gb3IgdGhyZWU6IHRoZSB2ZWN0b3JzXG4gKiBhcmUgYWx3YXlzIGZldGNoZWQgdG9nZXRoZXIsIGFuZCBhIHNpbmdsZSByZXNwb25zZSBrZWVwcyB0aGVtIGNvbnNpc3RlbnQgaWZcbiAqIHRoZSBkYXRhc2V0IGNoYW5nZXMgdW5kZXJuZWF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUNvb3JkcyhcbiAgYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlciwgaGFzWiA9IGZhbHNlLFxuKTogUGljazxTcGF0aWFsT2JzZXJ2YXRpb25zLCAneCcgfCAneScgfCAneic+IHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGNvbnN0IGF4ZXMgPSBoYXNaID8gMyA6IDI7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb3VudCAqIGF4ZXMgKiA0LCAnY29vcmRzJyk7XG4gIGNvbnN0IHggPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpO1xuICBjb25zdCB5ID0gbmV3IEZsb2F0MzJBcnJheShidWYsIGNvdW50ICogNCwgY291bnQpO1xuICBjb25zdCB6ID0gaGFzWiA/IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDgsIGNvdW50KSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgeCwgeSwgeiB9O1xufVxuXG4vKiogYEdFVCAvcmFkaXVzYCDihpIgcGVyLW9ic2VydmF0aW9uIHJhZGlpIGluIGltYWdlIHBpeGVscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVSYWRpdXMoYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiA0LCAncmFkaXVzJyk7XG4gIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpO1xufVxuXG4vKiogYEdFVCAvZmVhdHVyZS97bmFtZX1gIOKGkiBvbmUgZ2VuZSdzIGV4cHJlc3Npb24gdmVjdG9yLiAqL1xuLyoqXG4gKiBgR0VUIC9zcGF0aWFsL3tpZH0vZW1iZWRkaW5nL3tuYW1lfWAg4oCUIG9uZSBwbGFuZSBwZXIgZGltZW5zaW9uLCBzYW1lIGxheW91dCBhcyBjb29yZHMuXG4gKlxuICogU3RydWN0IG9mIGFycmF5cywgbm90IGludGVybGVhdmVkOiBldmVyeSBkaW1lbnNpb24gaXMgY29udGlndW91cywgc28gYW4gYXhpcyBjYW4gYmUgaGFuZGVkIHRvXG4gKiB0aGUgcmVuZGVyZXIgYXMgYSB2aWV3IHdpdGggbm8gY29weSBhbmQgbm8gc3RyaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRW1iZWRkaW5nKFxuICBidWY6IEFycmF5QnVmZmVyLCBtZXRhOiBTcGF0aWFsRW1iZWRkaW5nTWV0YSwgY291bnQ6IG51bWJlcixcbik6IFNwYXRpYWxFbWJlZGRpbmcge1xuICBhc3NlcnRMaXR0bGVFbmRpYW4oKTtcbiAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogbWV0YS5kaW1zICogNCwgYGVtYmVkZGluZyBcIiR7bWV0YS5uYW1lfVwiYCk7XG4gIHJldHVybiB7XG4gICAgbWV0YSxcbiAgICB4OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpLFxuICAgIHk6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDQsIGNvdW50KSxcbiAgICAuLi4obWV0YS5kaW1zID09PSAzID8geyB6OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgY291bnQgKiA4LCBjb3VudCkgfSA6IHt9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZlYXR1cmVWZWN0b3IoYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiA0LCAnZmVhdHVyZSB2ZWN0b3InKTtcbiAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCk7XG59XG5cbi8qKlxuICogYEdFVCAvY29sdW1uL3tuYW1lfWAg4oaSIGEgbG9hZGVkIGNvbHVtbiwgdHlwZWQgYnkgaXRzIGRlc2NyaXB0b3I6IGB1MTZgIGNvZGVzXG4gKiBmb3IgYSBjYXRlZ29yaWNhbCwgYGYzMmAgdmFsdWVzIGZvciBhIGNvbnRpbnVvdXMuIENvZGVzIG91dHNpZGUgdGhlIGNhdGVnb3J5XG4gKiBsaXN0IGFyZSBub3JtYWxpc2VkIHRvIHtAbGluayBOT19DQVRFR09SWX0gc28gYSByZW5kZXJlciBjYW4gdHJ1c3QgdGhlXG4gKiBpbnZhcmlhbnQgaW5zdGVhZCBvZiBib3VuZHMtY2hlY2tpbmcgZXZlcnkgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb2x1bW4oXG4gIGJ1ZjogQXJyYXlCdWZmZXIsIG1ldGE6IFNwYXRpYWxDb2x1bW5NZXRhLCBjb3VudDogbnVtYmVyLFxuKTogU3BhdGlhbENvbHVtbiB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAobWV0YS5raW5kID09PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogMiwgYGNvbHVtbiBcIiR7bWV0YS5uYW1lfVwiYCk7XG4gICAgY29uc3QgY29kZXMgPSBuZXcgVWludDE2QXJyYXkoYnVmLCAwLCBjb3VudCk7XG4gICAgY29uc3QgbiA9IChtZXRhIGFzIENhdGVnb3JpY2FsQ29sdW1uTWV0YSkuY2F0ZWdvcmllcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNvZGVzW2ldID49IG4pIGNvZGVzW2ldID0gTk9fQ0FURUdPUlk7XG4gICAgfVxuICAgIHJldHVybiB7IG1ldGE6IG1ldGEgYXMgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLCBjb2RlcyB9O1xuICB9XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb3VudCAqIDQsIGBjb2x1bW4gXCIke21ldGEubmFtZX1cImApO1xuICByZXR1cm4geyBtZXRhOiBtZXRhIGFzIENvbnRpbnVvdXNDb2x1bW5NZXRhLCB2YWx1ZXM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCkgfTtcbn1cblxuLyoqXG4gKiBgR0VUIC9wb2x5Z29uc2Ag4oaSIGJvdW5kYXJ5IHJpbmdzLiBMYXlvdXQgaXNcbiAqIGBbdTMyIGNvdW50XVt1MzIgb2Zmc2V0cyDDlyAoY291bnQrMSldW2YzMiBjb29yZHMgw5cgMsK3b2Zmc2V0c1tjb3VudF1dYDsgZXZlcnlcbiAqIGZpZWxkIGlzIDQtYnl0ZSB3aWRlIHNvIGVhY2ggdHlwZWQtYXJyYXkgdmlldyBzdGF5cyBhbGlnbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUG9seWdvbnMoYnVmOiBBcnJheUJ1ZmZlcik6IFNwYXRpYWxQb2x5Z29ucyB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCA4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gcG9seWdvbnM6IHJlc3BvbnNlIHRvbyBzaG9ydCBmb3IgYSBoZWFkZXInKTtcbiAgfVxuICBjb25zdCBjb3VudCA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDEpWzBdO1xuICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGJ1ZiwgNCwgY291bnQgKyAxKTtcbiAgY29uc3QgdmVydGV4Q291bnQgPSBvZmZzZXRzW2NvdW50XTtcbiAgY29uc3QgY29vcmRzQnl0ZU9mZnNldCA9IDQgKyAoY291bnQgKyAxKSAqIDQ7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb29yZHNCeXRlT2Zmc2V0ICsgdmVydGV4Q291bnQgKiAyICogNCwgJ3BvbHlnb25zJyk7XG4gIGNvbnN0IGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb29yZHNCeXRlT2Zmc2V0LCB2ZXJ0ZXhDb3VudCAqIDIpO1xuICByZXR1cm4geyBjb29yZHMsIG9mZnNldHMsIGNvdW50IH07XG59XG5cbi8qKlxuICogYEdFVCAvcG9seWdvbi10aWxlLy4uLmAg4oaSIG9uZSB0aWxlIG9mIHJpbmdzIHdpdGggdGhlaXIgb3duaW5nIG9ic2VydmF0aW9ucy4gTGF5b3V0XG4gKiBgW3UzMiBjb3VudF1bdTMyIG9icyDDlyBjb3VudF1bdTMyIG9mZnNldHMgw5cgKGNvdW50KzEpXVtmMzIgY29vcmRzIMOXIDLCt29mZnNldHNbY291bnRdXWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQb2x5Z29uVGlsZShidWY6IEFycmF5QnVmZmVyKTogU3BhdGlhbFBvbHlnb25UaWxlIHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCA8IDgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1tzcGF0aWFsXSBwb2x5Z29uIHRpbGU6IHJlc3BvbnNlIHRvbyBzaG9ydCBmb3IgYSBoZWFkZXInKTtcbiAgfVxuICBjb25zdCBjb3VudCA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDEpWzBdO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShidWYsIDQsIGNvdW50KTtcbiAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShidWYsIDQgKyBjb3VudCAqIDQsIGNvdW50ICsgMSk7XG4gIGNvbnN0IHZlcnRleENvdW50ID0gb2Zmc2V0c1tjb3VudF07XG4gIGNvbnN0IGNvb3Jkc0J5dGVPZmZzZXQgPSA0ICsgY291bnQgKiA0ICsgKGNvdW50ICsgMSkgKiA0O1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY29vcmRzQnl0ZU9mZnNldCArIHZlcnRleENvdW50ICogOCwgJ3BvbHlnb24gdGlsZScpO1xuICByZXR1cm4ge1xuICAgIGNvdW50LCBvYnNlcnZhdGlvbiwgb2Zmc2V0cyxcbiAgICBjb29yZHM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb29yZHNCeXRlT2Zmc2V0LCB2ZXJ0ZXhDb3VudCAqIDIpLFxuICB9O1xufVxuXG4vKipcbiAqIGBHRVQgL3RyYW5zY3JpcHQtdGlsZS8uLi5gIOKGkiB0cmFuc2NyaXB0cyBvciBhZ2dyZWdhdGVzLiBMYXlvdXQsIDQtYnl0ZSBhbGlnbmVkOlxuICogYFt1MzIgbl1bdTMyIGZsYWdzXVtmMzIgeMK3bl1bZjMyIHnCt25dW2YzMiB6wrduXVt1MzIgd2VpZ2h0wrduXVt1MzIgb2JzwrduXVt1MTYgZ2VuZcK3biwgcGFkZGVkXWA7XG4gKiBmbGFncyBiaXQgMCBtYXJrcyBhbiBhZ2dyZWdhdGVkIGxldmVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVHJhbnNjcmlwdFRpbGUoYnVmOiBBcnJheUJ1ZmZlcik6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCA4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gdHJhbnNjcmlwdCB0aWxlOiByZXNwb25zZSB0b28gc2hvcnQgZm9yIGEgaGVhZGVyJyk7XG4gIH1cbiAgY29uc3QgW24sIGZsYWdzXSA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDIpO1xuICBjb25zdCBnZW5lUGFkID0gTWF0aC5jZWlsKChuICogMikgLyA0KSAqIDQ7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCA4ICsgbiAqIDIwICsgZ2VuZVBhZCwgJ3RyYW5zY3JpcHQgdGlsZScpO1xuICByZXR1cm4ge1xuICAgIGNvdW50OiBuLFxuICAgIGFnZ3JlZ2F0ZWQ6IChmbGFncyAmIDEpID09PSAxLFxuICAgIHg6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCA4LCBuKSxcbiAgICB5OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgOCArIG4gKiA0LCBuKSxcbiAgICB6OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgOCArIG4gKiA4LCBuKSxcbiAgICB3ZWlnaHQ6IG5ldyBVaW50MzJBcnJheShidWYsIDggKyBuICogMTIsIG4pLFxuICAgIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkoYnVmLCA4ICsgbiAqIDE2LCBuKSxcbiAgICBnZW5lOiBuZXcgVWludDE2QXJyYXkoYnVmLCA4ICsgbiAqIDIwLCBuKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBgR0VUIC9kZW5zaXR5P2dlbmVzPSZiaW49YCDihpIgdGhlIHN1bW1lZCByYXN0ZXIuIExheW91dFxuICogYFt1MzIgcm93c11bdTMyIGNvbHNdW2YzMiBjZWxsV11bZjMyIGNlbGxIXVtmMzIgb3JpZ2luWF1bZjMyIG9yaWdpblldW2YzMiByb3dzwrdjb2xzXWA6XG4gKiB0aGUgZ2VvbWV0cnkgdHJhdmVscyB3aXRoIHRoZSB2YWx1ZXMgYmVjYXVzZSByZS1iaW5uaW5nIGNoYW5nZXMgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVEZW5zaXR5KGJ1ZjogQXJyYXlCdWZmZXIsIGdlbmVzOiBzdHJpbmdbXSk6IFNwYXRpYWxEZW5zaXR5UmFzdGVyIHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCA8IDI0KSB0aHJvdyBuZXcgRXJyb3IoJ1tzcGF0aWFsXSBkZW5zaXR5OiByZXNwb25zZSB0b28gc2hvcnQgZm9yIGEgaGVhZGVyJyk7XG4gIGNvbnN0IFtyb3dzLCBjb2xzXSA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDIpO1xuICBjb25zdCBbY3csIGNoLCBveCwgb3ldID0gbmV3IEZsb2F0MzJBcnJheShidWYsIDgsIDQpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgMjQgKyByb3dzICogY29scyAqIDQsICdkZW5zaXR5Jyk7XG4gIGNvbnN0IG1ldGE6IFNwYXRpYWxEZW5zaXR5TWV0YSA9IHsgcm93cywgY29scywgZ3JpZFNpemU6IFtjdywgY2hdLCBvcmlnaW46IFtveCwgb3ldIH07XG4gIHJldHVybiB7IG1ldGEsIGdlbmVzLCB2YWx1ZXM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAyNCwgcm93cyAqIGNvbHMpIH07XG59XG5cbi8qKlxuICogRm9sZCBhIG1hbmlmZXN0IHBsdXMgaXRzIGZldGNoZWQgY29vcmRpbmF0ZS9pZC9yYWRpdXMgdmVjdG9ycyBpbnRvIHRoZVxuICogbGlicmFyeS1mYWNpbmcge0BsaW5rIFNwYXRpYWxEYXRhc2V0fS4gQ29sdW1uIGFuZCBmZWF0dXJlICp2YWx1ZXMqIGFyZSBub3RcbiAqIHBhcnQgb2YgdGhpcyDigJQgdGhleSBzdGF5IGxhenkgYmVoaW5kIHRoZSBwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YXNldEZyb21NYW5pZmVzdChcbiAgbWFuaWZlc3Q6IFNwYXRpYWxNYW5pZmVzdCxcbiAgY29vcmRzOiBQaWNrPFNwYXRpYWxPYnNlcnZhdGlvbnMsICd4JyB8ICd5JyB8ICd6Jz4sXG4gIGV4dHJhczogeyBpZHM/OiBzdHJpbmdbXTsgcmFkaXVzPzogRmxvYXQzMkFycmF5IH0gPSB7fSxcbik6IFNwYXRpYWxEYXRhc2V0IHtcbiAgYXNzZXJ0TWFuaWZlc3RWZXJzaW9uKG1hbmlmZXN0KTtcbiAgY29uc3QgcmFkaXVzID0gbWFuaWZlc3QucmFkaXVzPy5tb2RlID09PSAndW5pZm9ybSdcbiAgICA/IG1hbmlmZXN0LnJhZGl1cy52YWx1ZVxuICAgIDogZXh0cmFzLnJhZGl1cztcbiAgY29uc3Qgb2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zID0ge1xuICAgIGNvdW50OiBtYW5pZmVzdC5jb3VudCxcbiAgICB4OiBjb29yZHMueCxcbiAgICB5OiBjb29yZHMueSxcbiAgICAuLi4oY29vcmRzLnogPyB7IHo6IGNvb3Jkcy56IH0gOiB7fSksXG4gICAgLi4uKGV4dHJhcy5pZHMgPyB7IGlkczogZXh0cmFzLmlkcyB9IDoge30pLFxuICAgIC4uLihyYWRpdXMgIT09IHVuZGVmaW5lZCA/IHsgcmFkaXVzIH0gOiB7fSksXG4gIH07XG4gIHJldHVybiB7XG4gICAgaWQ6IG1hbmlmZXN0LmlkLFxuICAgIG5hbWU6IG1hbmlmZXN0Lm5hbWUsXG4gICAgb2JzZXJ2YXRpb25zLFxuICAgIGNvbHVtbnM6IG1hbmlmZXN0LmNvbHVtbnMgPz8gW10sXG4gICAgLi4uKG1hbmlmZXN0LmZlYXR1cmVzID8geyBmZWF0dXJlczogbWFuaWZlc3QuZmVhdHVyZXMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QucG9seWdvbnMgPyB7IHBvbHlnb25zOiBtYW5pZmVzdC5wb2x5Z29ucyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5pbWFnZVJlZiA/IHsgaW1hZ2VSZWY6IG1hbmlmZXN0LmltYWdlUmVmIH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnZvbHVtZSA/IHsgdm9sdW1lOiBtYW5pZmVzdC52b2x1bWUgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QuZW1iZWRkaW5ncz8ubGVuZ3RoID8geyBlbWJlZGRpbmdzOiBtYW5pZmVzdC5lbWJlZGRpbmdzIH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0Lm1pY3JvbnNQZXJVbml0ICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBtaWNyb25zUGVyVW5pdDogbWFuaWZlc3QubWljcm9uc1BlclVuaXQgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnBvbHlnb25UaWxlcyA/IHsgcG9seWdvblRpbGVzOiBtYW5pZmVzdC5wb2x5Z29uVGlsZXMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QudHJhbnNjcmlwdFRpbGVzID8geyB0cmFuc2NyaXB0VGlsZXM6IG1hbmlmZXN0LnRyYW5zY3JpcHRUaWxlcyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5kZW5zaXR5ID8geyBkZW5zaXR5OiBtYW5pZmVzdC5kZW5zaXR5IH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnRyYW5zY3JpcHRCaW5zID8geyB0cmFuc2NyaXB0QmluczogbWFuaWZlc3QudHJhbnNjcmlwdEJpbnMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QudHJhbnNjcmlwdEdlbmVCaW5zID8geyB0cmFuc2NyaXB0R2VuZUJpbnM6IG1hbmlmZXN0LnRyYW5zY3JpcHRHZW5lQmlucyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC50cmFuc2NyaXB0Qmluc1N0YXR1cyA/IHsgdHJhbnNjcmlwdEJpbnNTdGF0dXM6IG1hbmlmZXN0LnRyYW5zY3JpcHRCaW5zU3RhdHVzIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
|
|
336
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC13aXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvc3BhdGlhbC1kYXRhLWh0dHAvc3BhdGlhbC13aXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxXQUFXLEVBQ1gsY0FBYyxHQW9CZixNQUFNLDBDQUEwQyxDQUFDO0FBRWxEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5REc7QUFFSCxxRkFBcUY7QUFDckYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBcUN0QyxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLGNBQWM7SUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxrQkFBa0I7SUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUU7WUFDckUsdUVBQXVFLENBQzFFLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLGdCQUFnQixDQUFDLEdBQWdCLEVBQUUsUUFBZ0IsRUFBRSxJQUFZO0lBQ3hFLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLGFBQWEsSUFBSSxjQUFjLFFBQVEsZUFBZSxHQUFHLENBQUMsVUFBVSxJQUFJO1lBQ3RFLG1EQUFtRCxDQUN0RCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFN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Q0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZELEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0UsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RixHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xGLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRCxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0UsR0FBRyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNGLEdBQUcsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNsRyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgQ29udGludW91c0NvbHVtbk1ldGEsXG4gIE5PX0NBVEVHT1JZLFxuICBOT19PQlNFUlZBVElPTixcbiAgU3BhdGlhbENvbHVtbixcbiAgU3BhdGlhbENvbHVtbk1ldGEsXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsRGVuc2l0eU1ldGEsXG4gIFNwYXRpYWxEZW5zaXR5UmFzdGVyLFxuICBTcGF0aWFsRW1iZWRkaW5nLFxuICBTcGF0aWFsRW1iZWRkaW5nTWV0YSxcbiAgU3BhdGlhbEZlYXR1cmVNZXRhLFxuICBTcGF0aWFsSW1hZ2VSZWYsXG4gIFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIFNwYXRpYWxQb2x5Z29uVGlsZSxcbiAgU3BhdGlhbFBvbHlnb25UaWxlc01ldGEsXG4gIFNwYXRpYWxQb2x5Z29ucyxcbiAgU3BhdGlhbFRyYW5zY3JpcHRCaW5zTWV0YSxcbiAgU3BhdGlhbFRyYW5zY3JpcHRHZW5lQmluc01ldGEsXG4gIFNwYXRpYWxUcmFuc2NyaXB0Qmluc1N0YXR1cyxcbiAgU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGVzTWV0YSxcbiAgU3BhdGlhbFZvbHVtZU1ldGEsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFRoZSB3aXJlIGZvcm1hdCB0aGUgYnVuZGxlZCBleGFtcGxlIHNlcnZlciBzcGVha3MsIGFuZCBpdHMgZGVjb2RlcnMuXG4gKlxuICogUHVyZSBieSBkZXNpZ24g4oCUIG5vIEFuZ3VsYXIsIG5vIFJ4SlMsIG5vIEhUVFAg4oCUIHNvIHRoZSBmb3JtYXQgaXMgdGVzdGFibGUgb25cbiAqIGl0cyBvd24gYW5kIHJldXNhYmxlIGJ5IGFueSB0cmFuc3BvcnQgKGBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlYCBpcyBvbmUpLlxuICogTWlycm9ycyB0aGUgc3BsaXQgaW4gYHBsb3RseS10cmFjZS1idWlsZGVycy50c2A6IHRoZSBzaGFwZSBsaXZlcyBpbiBhIHB1cmVcbiAqIG1vZHVsZSwgdGhlIHNlcnZpY2UganVzdCBtb3ZlcyBieXRlcy5cbiAqXG4gKiBXSFkgQklOQVJZXG4gKiAtLS0tLS0tLS0tXG4gKiBWZWN0b3JzIGFyZSBvbmUgYEZsb2F0MzJBcnJheWAvYFVpbnQxNkFycmF5YCBwZXIgcmVxdWVzdCwgZGVsaXZlcmVkIGFzIHJhd1xuICogbGl0dGxlLWVuZGlhbiBieXRlcy4gSlNPTiB3b3VsZCBjb3N0IH444oCTMTLDlyB0aGUgc2l6ZSBhbmQgYSBwYXJzZSB0aGF0XG4gKiBhbGxvY2F0ZXMgb25lIEpTIG51bWJlciBwZXIgdmFsdWU7IGEgdHlwZWQtYXJyYXkgdmlldyBvdmVyIHRoZSByZXNwb25zZVxuICogYnVmZmVyIGlzIHplcm8tY29weSBhbmQgdXBsb2FkcyB0byB0aGUgR1BVIGRpcmVjdGx5LlxuICpcbiAqIEVORElBTk5FU1NcbiAqIC0tLS0tLS0tLS1cbiAqIExpdHRsZS1lbmRpYW4sIGFzc2VydGVkIGF0IGRlY29kZS4gRXZlcnkgcGxhdGZvcm0gYSBicm93c2VyIHJ1bnMgb24gdG9kYXkgaXNcbiAqIGxpdHRsZS1lbmRpYW4sIHNvIGEgYERhdGFWaWV3YCBieXRlLWJ5LWJ5dGUgcmVhZCB3b3VsZCBjb3N0IHJlYWwgdGltZSBmb3IgYVxuICogY2FzZSB0aGF0IGRvZXMgbm90IG9jY3VyIOKAlCBidXQgZmFpbGluZyBsb3VkbHkgYmVhdHMgcmVuZGVyaW5nIHRyYW5zcG9zZWRcbiAqIGdhcmJhZ2UgaWYgaXQgZXZlciBkb2VzLlxuICpcbiAqIEVORFBPSU5UUyAoYmFzZSA9IHRoZSBzZXJ2ZXIgcm9vdClcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5IHJvdXRlIGBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlYCBjYWxscy4gYHtpZH1gIGlzIHRoZSBkYXRhc2V0IGlkOyBuYW1lcyBhbmRcbiAqIGdlbmUgbGlzdHMgYXJlIFVSSS1lbmNvZGVkLlxuICogYGBgXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwvZGF0YXNldHMgICAgICAgICAgICAgIC0+IHsgZGF0YXNldHM6IFt7IGlkLCBuYW1lLCBjb3VudCB9XSB9XG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9tYW5pZmVzdCAgICAgICAgIC0+IFNwYXRpYWxNYW5pZmVzdFxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vY29vcmRzICAgICAgICAgICAtPiBmMzJbTl0geCwgZjMyW05dIHksIGYzMltOXSB6P1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vcmFkaXVzICAgICAgICAgICAtPiBmMzJbTl0gICAgICAgICAgIChwZXItb2JzZXJ2YXRpb24gcmFkaXVzIG9ubHkpXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9pZHMgICAgICAgICAgICAgIC0+IHsgaWRzOiBzdHJpbmdbXSB9IChoYXNJZHMgb25seSlcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2NvbHVtbi97bmFtZX0gICAgLT4gdTE2W05dIGNvZGVzIHwgZjMyW05dIHZhbHVlc1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vZmVhdHVyZS97bmFtZX0gICAtPiBmMzJbTl1cbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2ZlYXR1cmVzP3E9JmxpbWl0PSAtPiB7IG5hbWVzOiBzdHJpbmdbXSB9XG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9lbWJlZGRpbmcve25hbWV9IC0+IGYzMltOXSBwZXIgZGltZW5zaW9uLCBzZWUgZGVjb2RlRW1iZWRkaW5nXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9wb2x5Z29ucyAgICAgICAgIC0+IHUzMiBjb3VudCwgdTMyW2NvdW50KzFdIG9mZnNldHMsIGYzMlsyKnJpbmdzXSBjb29yZHNcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L3ZvbHVtZSAgICAgICAgICAgLT4gdThbd2lkdGgqaGVpZ2h0KmRlcHRoXSAgIChtYW5pZmVzdC52b2x1bWUgb25seSlcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L3BvbHlnb24tdGlsZS97c2V0fS97bGV2ZWx9L3tneH0ve2d5fVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiB1MzIgY291bnQsIHUzMltjb3VudF0gb2JzLCB1MzJbY291bnQrMV0gb2Zmc2V0cywgZjMyIGNvb3Jkc1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vdHJhbnNjcmlwdC10aWxlL3tsZXZlbH0ve2d4fS97Z3l9P2dlbmVzPUEsQiZxdWFsaXR5PWhpZ2h8YWxsJmJveD1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gc2VlIGRlY29kZVRyYW5zY3JpcHRUaWxlXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS90cmFuc2NyaXB0LWJpbnMve2xldmVsfS97dHh9L3t0eX1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gdHJhbnNjcmlwdC10aWxlIGxheW91dCwgb25lIGVudHJ5IHBlciBiaW5cbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2dlbmUtYmlucy97bGV2ZWx9L3t0eH0ve3R5fT9nZW5lcz1BLEJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gdHJhbnNjcmlwdC10aWxlIGxheW91dCwgcGVyLWdlbmUgYmluc1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vZGVuc2l0eT9nZW5lcz1BLEImYmluPSAtPiBzZWUgZGVjb2RlRGVuc2l0eVxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vdHJhbnNjcmlwdC1zdW1tYXJ5P2JveD0mZ2VuZXM9JmNlbGxzPSAtPiBTcGF0aWFsVHJhbnNjcmlwdFN1bW1hcnlcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L3RyYW5zY3JpcHQtY291bnRzP2dlbmVzPUEsQiAtPiBTcGF0aWFsVHJhbnNjcmlwdENvdW50c1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vbWFya2Vycy97Y29sdW1ufT9uPSAgLT4gU3BhdGlhbE1hcmtlckdlbmVzXG4gKiBQT1NUIHtiYXNlfS9zcGF0aWFsL3tpZH0vZ3JvdXBzP25hbWU9ICAgICh0ZXh0L2NzdiBgY2VsbF9pZCxncm91cGApXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHsgY29sdW1uOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEsIG1hdGNoZWQgfVxuICogYGBgXG4gKlxuICogVGhlIG9wdGlvbmFsIHJvdXRlcyBhcmUgYWR2ZXJ0aXNlZCBpbiB0aGUgbWFuaWZlc3QgKGBwb2x5Z29uc2AsIGB2b2x1bWVgLFxuICogYHBvbHlnb25UaWxlc2AsIGB0cmFuc2NyaXB0VGlsZXNgLCBgdHJhbnNjcmlwdEJpbnNgLCBgdHJhbnNjcmlwdEdlbmVCaW5zYCxcbiAqIGBkZW5zaXR5YCk7IGEgc2VydmVyIHdpdGhvdXQgdGhlbSBuZXZlciBzZWVzIHRoZW0gcmVxdWVzdGVkLlxuICovXG5cbi8qKiBCdW1wZWQgd2hlbiB0aGUgbGF5b3V0IGNoYW5nZXMgaW5jb21wYXRpYmx5OyB0aGUgY2xpZW50IHJlZnVzZXMgYW55dGhpbmcgZWxzZS4gKi9cbmV4cG9ydCBjb25zdCBTUEFUSUFMX1dJUkVfVkVSU0lPTiA9IDE7XG5cbi8qKiBQZXItb2JzZXJ2YXRpb24gbWFya2VyIHJhZGl1czogb25lIHNoYXJlZCB2YWx1ZSwgb3IgYSBzZXJ2ZWQgZjMyIHZlY3Rvci4gKi9cbmV4cG9ydCB0eXBlIFNwYXRpYWxSYWRpdXNTcGVjID0geyBtb2RlOiAndW5pZm9ybSc7IHZhbHVlOiBudW1iZXIgfSB8IHsgbW9kZTogJ3Blci1vYnNlcnZhdGlvbicgfTtcblxuLyoqIGBHRVQgL3NwYXRpYWwve2lkfS9tYW5pZmVzdGAg4oCUIGV2ZXJ5dGhpbmcgY2hlYXAgZW5vdWdoIHRvIHNlbmQgdXAgZnJvbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxNYW5pZmVzdCB7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogTiDigJQgb2JzZXJ2YXRpb24gY291bnQ7IGV2ZXJ5IHNlcnZlZCB2ZWN0b3IgaGFzIGV4YWN0bHkgdGhpcyBsZW5ndGguICovXG4gIGNvdW50OiBudW1iZXI7XG4gIGhhc1o/OiBib29sZWFuO1xuICBoYXNJZHM/OiBib29sZWFuO1xuICByYWRpdXM/OiBTcGF0aWFsUmFkaXVzU3BlYztcbiAgY29sdW1uczogU3BhdGlhbENvbHVtbk1ldGFbXTtcbiAgZmVhdHVyZXM/OiBTcGF0aWFsRmVhdHVyZU1ldGE7XG4gIHBvbHlnb25zPzogeyBjb3VudDogbnVtYmVyIH07XG4gIGltYWdlUmVmPzogU3BhdGlhbEltYWdlUmVmO1xuICB2b2x1bWU/OiBTcGF0aWFsVm9sdW1lTWV0YTtcbiAgZW1iZWRkaW5ncz86IFNwYXRpYWxFbWJlZGRpbmdNZXRhW107XG4gIG1pY3JvbnNQZXJVbml0PzogbnVtYmVyO1xuICBwb2x5Z29uVGlsZXM/OiBTcGF0aWFsUG9seWdvblRpbGVzTWV0YTtcbiAgdHJhbnNjcmlwdFRpbGVzPzogU3BhdGlhbFRyYW5zY3JpcHRUaWxlc01ldGE7XG4gIGRlbnNpdHk/OiBTcGF0aWFsRGVuc2l0eU1ldGE7XG4gIHRyYW5zY3JpcHRCaW5zPzogU3BhdGlhbFRyYW5zY3JpcHRCaW5zTWV0YTtcbiAgdHJhbnNjcmlwdEJpbnNTdGF0dXM/OiBTcGF0aWFsVHJhbnNjcmlwdEJpbnNTdGF0dXM7XG4gIHRyYW5zY3JpcHRHZW5lQmlucz86IFNwYXRpYWxUcmFuc2NyaXB0R2VuZUJpbnNNZXRhO1xufVxuXG4vKiogYEdFVCAvc3BhdGlhbC9kYXRhc2V0c2AgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbERhdGFzZXRTdW1tYXJ5IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xufVxuXG4vKiogVHJ1ZSBvbiBhIGxpdHRsZS1lbmRpYW4gaG9zdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpOiBib29sZWFuIHtcbiAgY29uc3QgcHJvYmUgPSBuZXcgVWludDE2QXJyYXkoWzFdKTtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHByb2JlLmJ1ZmZlcilbMF0gPT09IDE7XG59XG5cbmZ1bmN0aW9uIGFzc2VydExpdHRsZUVuZGlhbigpOiB2b2lkIHtcbiAgaWYgKCFpc0xpdHRsZUVuZGlhbigpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1tzcGF0aWFsXSB3aXJlIGZvcm1hdCBpcyBsaXR0bGUtZW5kaWFuOyB0aGlzIHBsYXRmb3JtIGlzIGJpZy1lbmRpYW4uICcgK1xuICAgICAgICAnU2VydmUgSlNPTiB2ZWN0b3JzLCBvciBieXRlLXN3YXAgaW4gYSBjdXN0b20gU3BhdGlhbERhdGFQb3J0IGFkYXB0ZXIuJyxcbiAgICApO1xuICB9XG59XG5cbi8qKiBHdWFyZCBhIGRlY29kZSBhZ2FpbnN0IGEgdHJ1bmNhdGVkIG9yIG92ZXJzaXplZCByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIGFzc2VydEJ5dGVMZW5ndGgoYnVmOiBBcnJheUJ1ZmZlciwgZXhwZWN0ZWQ6IG51bWJlciwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCAhPT0gZXhwZWN0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgW3NwYXRpYWxdICR7d2hhdH06IGV4cGVjdGVkICR7ZXhwZWN0ZWR9IGJ5dGVzLCBnb3QgJHtidWYuYnl0ZUxlbmd0aH0uIGAgK1xuICAgICAgICAnTWFuaWZlc3QgY291bnQgYW5kIHNlcnZlZCB2ZWN0b3IgbGVuZ3RoIGRpc2FncmVlLicsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlamVjdCBhIG1hbmlmZXN0IHRoaXMgY2xpZW50IGNhbm5vdCByZWFkLCB3aXRoIGEgbWVzc2FnZSBuYW1pbmcgdGhlIGZpeC5cbiAqXG4gKiBCZXNpZGVzIHRoZSB2ZXJzaW9uLCB0aGUgdmFsdWVzIGV2ZXJ5IGRlY29kZXIgc2l6ZXMgaXRzIHZpZXdzIGZyb206IGFuIG9ic2VydmF0aW9uXG4gKiBjb3VudCB0aGF0IGlzIG5vdCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBvciBhbiBlbWJlZGRpbmcgdGhhdCBpcyBub3QgMi1EIG9yIDMtRCwgd291bGRcbiAqIG90aGVyd2lzZSBzdXJmYWNlIGxhdGVyIGFzIGEgUmFuZ2VFcnJvciBkZWVwIGluc2lkZSBhIHJlbmRlcmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TWFuaWZlc3RWZXJzaW9uKG1hbmlmZXN0OiBTcGF0aWFsTWFuaWZlc3QpOiB2b2lkIHtcbiAgaWYgKG1hbmlmZXN0LnZlcnNpb24gIT09IFNQQVRJQUxfV0lSRV9WRVJTSU9OKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFtzcGF0aWFsXSB1bnN1cHBvcnRlZCB3aXJlIHZlcnNpb24gJHttYW5pZmVzdC52ZXJzaW9ufSBgICtcbiAgICAgICAgYCh0aGlzIGNsaWVudCBzcGVha3MgJHtTUEFUSUFMX1dJUkVfVkVSU0lPTn0pLiBVcGRhdGUgdGhlIHNlcnZlciBvciB0aGUgbGlicmFyeS5gLFxuICAgICk7XG4gIH1cbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihtYW5pZmVzdC5jb3VudCkgfHwgbWFuaWZlc3QuY291bnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbc3BhdGlhbF0gbWFuaWZlc3QgY291bnQgJHttYW5pZmVzdC5jb3VudH0gaXMgbm90IGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGUgb2YgbWFuaWZlc3QuZW1iZWRkaW5ncyA/PyBbXSkgYXNzZXJ0RW1iZWRkaW5nRGltcyhlKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0RW1iZWRkaW5nRGltcyhtZXRhOiBTcGF0aWFsRW1iZWRkaW5nTWV0YSk6IHZvaWQge1xuICBpZiAobWV0YS5kaW1zICE9PSAyICYmIG1ldGEuZGltcyAhPT0gMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGVtYmVkZGluZyBcIiR7bWV0YS5uYW1lfVwiOiBkaW1zICR7bWV0YS5kaW1zfSBpcyBub3QgMiBvciAzYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSaW5nIG9mZnNldHMgbXVzdCBzdGFydCBhdCAwIGFuZCBuZXZlciBnbyBiYWNrd2FyZHM6IGEgZGVjcmVhc2luZyBwYWlyIGlzIGEgbmVnYXRpdmVcbiAqIHZlcnRleCBjb3VudCwgd2hpY2ggYSByZW5kZXJlciB0dXJucyBpbnRvIGBuZXcgRmxvYXQzMkFycmF5KG5lZ2F0aXZlKWAgb24gZXZlcnkgZnJhbWUuXG4gKiAoVGhhdCB0aGUgbGFzdCBvZmZzZXQgbWF0Y2hlcyB0aGUgY29vcmRpbmF0ZSBibG9jayBpcyB0aGUgYnl0ZS1sZW5ndGggY2hlY2sncyBqb2IuKVxuICovXG5mdW5jdGlvbiBhc3NlcnRSaW5nT2Zmc2V0cyhvZmZzZXRzOiBVaW50MzJBcnJheSwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChvZmZzZXRzWzBdICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSAke3doYXR9OiBvZmZzZXRzIG11c3Qgc3RhcnQgYXQgMGApO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob2Zmc2V0c1tpXSA8IG9mZnNldHNbaSAtIDFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSAke3doYXR9OiBvZmZzZXRzIGRlY3JlYXNlIGF0IHJpbmcgJHtpIC0gMX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEV2ZXJ5IGVudHJ5IG11c3QgbmFtZSBhbiBvYnNlcnZhdGlvbiBiZWxvdyBgY291bnRgLCBvciB7QGxpbmsgTk9fT0JTRVJWQVRJT059LiAqL1xuZnVuY3Rpb24gYXNzZXJ0T2JzZXJ2YXRpb25zKG9ic2VydmF0aW9uOiBVaW50MzJBcnJheSwgY291bnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb2JzZXJ2YXRpb24ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBvID0gb2JzZXJ2YXRpb25baV07XG4gICAgaWYgKG8gPj0gY291bnQgJiYgbyAhPT0gTk9fT0JTRVJWQVRJT04pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdICR7d2hhdH06IG9ic2VydmF0aW9uICR7b30gaXMgcGFzdCB0aGUgJHtjb3VudH0gaW4gdGhlIGRhdGFzZXRgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEEgaGVhZGVyLXNpemVkIHByZWZpeCBtdXN0IGJlIHRoZXJlIGJlZm9yZSBhbnkgdmlldyBvdmVyIGl0IGlzIG1hZGUuICovXG5mdW5jdGlvbiBhc3NlcnRIZWFkZXIoYnVmOiBBcnJheUJ1ZmZlciwgYnl0ZXM6IG51bWJlciwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCA8IGJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbc3BhdGlhbF0gJHt3aGF0fTogcmVzcG9uc2UgdG9vIHNob3J0IGZvciBpdHMgaGVhZGVyICgke2J1Zi5ieXRlTGVuZ3RofSA8ICR7Ynl0ZXN9IGJ5dGVzKWApO1xuICB9XG59XG5cbi8qKlxuICogYEdFVCAvY29vcmRzYCDihpIgeC95KC96KS4gT25lIHJlcXVlc3QgcmF0aGVyIHRoYW4gdHdvIG9yIHRocmVlOiB0aGUgdmVjdG9yc1xuICogYXJlIGFsd2F5cyBmZXRjaGVkIHRvZ2V0aGVyLCBhbmQgYSBzaW5nbGUgcmVzcG9uc2Uga2VlcHMgdGhlbSBjb25zaXN0ZW50IGlmXG4gKiB0aGUgZGF0YXNldCBjaGFuZ2VzIHVuZGVybmVhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb29yZHMoXG4gIGJ1ZjogQXJyYXlCdWZmZXIsXG4gIGNvdW50OiBudW1iZXIsXG4gIGhhc1ogPSBmYWxzZSxcbik6IFBpY2s8U3BhdGlhbE9ic2VydmF0aW9ucywgJ3gnIHwgJ3knIHwgJ3onPiB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBjb25zdCBheGVzID0gaGFzWiA/IDMgOiAyO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiBheGVzICogNCwgJ2Nvb3JkcycpO1xuICBjb25zdCB4ID0gbmV3IEZsb2F0MzJBcnJheShidWYsIDAsIGNvdW50KTtcbiAgY29uc3QgeSA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDQsIGNvdW50KTtcbiAgY29uc3QgeiA9IGhhc1ogPyBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgY291bnQgKiA4LCBjb3VudCkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB7IHgsIHksIHogfTtcbn1cblxuLyoqIGBHRVQgL3JhZGl1c2Ag4oaSIHBlci1vYnNlcnZhdGlvbiByYWRpaSBpbiBpbWFnZSBwaXhlbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUmFkaXVzKGJ1ZjogQXJyYXlCdWZmZXIsIGNvdW50OiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICBhc3NlcnRMaXR0bGVFbmRpYW4oKTtcbiAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogNCwgJ3JhZGl1cycpO1xuICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWYsIDAsIGNvdW50KTtcbn1cblxuLyoqXG4gKiBgR0VUIC9zcGF0aWFsL3tpZH0vZW1iZWRkaW5nL3tuYW1lfWAg4oCUIG9uZSBwbGFuZSBwZXIgZGltZW5zaW9uLCBzYW1lIGxheW91dCBhcyBjb29yZHMuXG4gKlxuICogU3RydWN0IG9mIGFycmF5cywgbm90IGludGVybGVhdmVkOiBldmVyeSBkaW1lbnNpb24gaXMgY29udGlndW91cywgc28gYW4gYXhpcyBjYW4gYmUgaGFuZGVkIHRvXG4gKiB0aGUgcmVuZGVyZXIgYXMgYSB2aWV3IHdpdGggbm8gY29weSBhbmQgbm8gc3RyaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRW1iZWRkaW5nKGJ1ZjogQXJyYXlCdWZmZXIsIG1ldGE6IFNwYXRpYWxFbWJlZGRpbmdNZXRhLCBjb3VudDogbnVtYmVyKTogU3BhdGlhbEVtYmVkZGluZyB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRFbWJlZGRpbmdEaW1zKG1ldGEpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiBtZXRhLmRpbXMgKiA0LCBgZW1iZWRkaW5nIFwiJHttZXRhLm5hbWV9XCJgKTtcbiAgcmV0dXJuIHtcbiAgICBtZXRhLFxuICAgIHg6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCksXG4gICAgeTogbmV3IEZsb2F0MzJBcnJheShidWYsIGNvdW50ICogNCwgY291bnQpLFxuICAgIC4uLihtZXRhLmRpbXMgPT09IDMgPyB7IHo6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDgsIGNvdW50KSB9IDoge30pLFxuICB9O1xufVxuXG4vKiogYEdFVCAvZmVhdHVyZS97bmFtZX1gIOKGkiBvbmUgZ2VuZSdzIGV4cHJlc3Npb24gdmVjdG9yLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZlYXR1cmVWZWN0b3IoYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiA0LCAnZmVhdHVyZSB2ZWN0b3InKTtcbiAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCk7XG59XG5cbi8qKlxuICogYEdFVCAvY29sdW1uL3tuYW1lfWAg4oaSIGEgbG9hZGVkIGNvbHVtbiwgdHlwZWQgYnkgaXRzIGRlc2NyaXB0b3I6IGB1MTZgIGNvZGVzXG4gKiBmb3IgYSBjYXRlZ29yaWNhbCwgYGYzMmAgdmFsdWVzIGZvciBhIGNvbnRpbnVvdXMuIENvZGVzIG91dHNpZGUgdGhlIGNhdGVnb3J5XG4gKiBsaXN0IGFyZSBub3JtYWxpc2VkIHRvIHtAbGluayBOT19DQVRFR09SWX0gc28gYSByZW5kZXJlciBjYW4gdHJ1c3QgdGhlXG4gKiBpbnZhcmlhbnQgaW5zdGVhZCBvZiBib3VuZHMtY2hlY2tpbmcgZXZlcnkgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb2x1bW4oYnVmOiBBcnJheUJ1ZmZlciwgbWV0YTogU3BhdGlhbENvbHVtbk1ldGEsIGNvdW50OiBudW1iZXIpOiBTcGF0aWFsQ29sdW1uIHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGlmIChtZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcpIHtcbiAgICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiAyLCBgY29sdW1uIFwiJHttZXRhLm5hbWV9XCJgKTtcbiAgICBjb25zdCBjb2RlcyA9IG5ldyBVaW50MTZBcnJheShidWYsIDAsIGNvdW50KTtcbiAgICBjb25zdCBuID0gKG1ldGEgYXMgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhKS5jYXRlZ29yaWVzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY29kZXNbaV0gPj0gbikgY29kZXNbaV0gPSBOT19DQVRFR09SWTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbWV0YTogbWV0YSBhcyBDYXRlZ29yaWNhbENvbHVtbk1ldGEsIGNvZGVzIH07XG4gIH1cbiAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogNCwgYGNvbHVtbiBcIiR7bWV0YS5uYW1lfVwiYCk7XG4gIHJldHVybiB7IG1ldGE6IG1ldGEgYXMgQ29udGludW91c0NvbHVtbk1ldGEsIHZhbHVlczogbmV3IEZsb2F0MzJBcnJheShidWYsIDAsIGNvdW50KSB9O1xufVxuXG4vKipcbiAqIGBHRVQgL3BvbHlnb25zYCDihpIgYm91bmRhcnkgcmluZ3MuIExheW91dCBpc1xuICogYFt1MzIgY291bnRdW3UzMiBvZmZzZXRzIMOXIChjb3VudCsxKV1bZjMyIGNvb3JkcyDDlyAywrdvZmZzZXRzW2NvdW50XV1gOyBldmVyeVxuICogZmllbGQgaXMgNC1ieXRlIHdpZGUgc28gZWFjaCB0eXBlZC1hcnJheSB2aWV3IHN0YXlzIGFsaWduZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQb2x5Z29ucyhidWY6IEFycmF5QnVmZmVyKTogU3BhdGlhbFBvbHlnb25zIHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCA8IDgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1tzcGF0aWFsXSBwb2x5Z29uczogcmVzcG9uc2UgdG9vIHNob3J0IGZvciBhIGhlYWRlcicpO1xuICB9XG4gIGNvbnN0IGNvdW50ID0gbmV3IFVpbnQzMkFycmF5KGJ1ZiwgMCwgMSlbMF07XG4gIGNvbnN0IGNvb3Jkc0J5dGVPZmZzZXQgPSA0ICsgKGNvdW50ICsgMSkgKiA0O1xuICBhc3NlcnRIZWFkZXIoYnVmLCBjb29yZHNCeXRlT2Zmc2V0LCAncG9seWdvbnMnKTtcbiAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShidWYsIDQsIGNvdW50ICsgMSk7XG4gIGFzc2VydFJpbmdPZmZzZXRzKG9mZnNldHMsICdwb2x5Z29ucycpO1xuICBjb25zdCB2ZXJ0ZXhDb3VudCA9IG9mZnNldHNbY291bnRdO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY29vcmRzQnl0ZU9mZnNldCArIHZlcnRleENvdW50ICogMiAqIDQsICdwb2x5Z29ucycpO1xuICBjb25zdCBjb29yZHMgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgY29vcmRzQnl0ZU9mZnNldCwgdmVydGV4Q291bnQgKiAyKTtcbiAgcmV0dXJuIHsgY29vcmRzLCBvZmZzZXRzLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIGBHRVQgL3BvbHlnb24tdGlsZS8uLi5gIOKGkiBvbmUgdGlsZSBvZiByaW5ncyB3aXRoIHRoZWlyIG93bmluZyBvYnNlcnZhdGlvbnMuIExheW91dFxuICogYFt1MzIgY291bnRdW3UzMiBvYnMgw5cgY291bnRdW3UzMiBvZmZzZXRzIMOXIChjb3VudCsxKV1bZjMyIGNvb3JkcyDDlyAywrdvZmZzZXRzW2NvdW50XV1gLlxuICpcbiAqIGBvYnNlcnZhdGlvbnNgIGlzIHRoZSBkYXRhc2V0J3MgTjsgd2hlbiBnaXZlbiwgZXZlcnkgb3duZXIgbXVzdCBiZSBiZWxvdyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBvbHlnb25UaWxlKGJ1ZjogQXJyYXlCdWZmZXIsIG9ic2VydmF0aW9ucz86IG51bWJlcik6IFNwYXRpYWxQb2x5Z29uVGlsZSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCA4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gcG9seWdvbiB0aWxlOiByZXNwb25zZSB0b28gc2hvcnQgZm9yIGEgaGVhZGVyJyk7XG4gIH1cbiAgY29uc3QgY291bnQgPSBuZXcgVWludDMyQXJyYXkoYnVmLCAwLCAxKVswXTtcbiAgY29uc3QgY29vcmRzQnl0ZU9mZnNldCA9IDQgKyBjb3VudCAqIDQgKyAoY291bnQgKyAxKSAqIDQ7XG4gIGFzc2VydEhlYWRlcihidWYsIGNvb3Jkc0J5dGVPZmZzZXQsICdwb2x5Z29uIHRpbGUnKTtcbiAgY29uc3Qgb2JzZXJ2YXRpb24gPSBuZXcgVWludDMyQXJyYXkoYnVmLCA0LCBjb3VudCk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkoYnVmLCA0ICsgY291bnQgKiA0LCBjb3VudCArIDEpO1xuICBhc3NlcnRSaW5nT2Zmc2V0cyhvZmZzZXRzLCAncG9seWdvbiB0aWxlJyk7XG4gIGNvbnN0IHZlcnRleENvdW50ID0gb2Zmc2V0c1tjb3VudF07XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb29yZHNCeXRlT2Zmc2V0ICsgdmVydGV4Q291bnQgKiA4LCAncG9seWdvbiB0aWxlJyk7XG4gIGFzc2VydE9ic2VydmF0aW9ucyhvYnNlcnZhdGlvbiwgb2JzZXJ2YXRpb25zLCAncG9seWdvbiB0aWxlJyk7XG4gIHJldHVybiB7XG4gICAgY291bnQsXG4gICAgb2JzZXJ2YXRpb24sXG4gICAgb2Zmc2V0cyxcbiAgICBjb29yZHM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb29yZHNCeXRlT2Zmc2V0LCB2ZXJ0ZXhDb3VudCAqIDIpLFxuICB9O1xufVxuXG4vKipcbiAqIGBHRVQgL3RyYW5zY3JpcHQtdGlsZS8uLi5gIOKGkiB0cmFuc2NyaXB0cyBvciBhZ2dyZWdhdGVzLiBMYXlvdXQsIDQtYnl0ZSBhbGlnbmVkOlxuICogYFt1MzIgbl1bdTMyIGZsYWdzXVtmMzIgeMK3bl1bZjMyIHnCt25dW2YzMiB6wrduXVt1MzIgd2VpZ2h0wrduXVt1MzIgb2JzwrduXVt1MTYgZ2VuZcK3biwgcGFkZGVkXWA7XG4gKiBmbGFncyBiaXQgMCBtYXJrcyBhbiBhZ2dyZWdhdGVkIGxldmVsLlxuICpcbiAqIGBsaW1pdHNgIGJvdW5kcyB0aGUgaW5kaWNlcyB3aGVuIHRoZSBjYWxsZXIga25vd3MgdGhlbTogYG9ic2VydmF0aW9uc2AgaXMgdGhlIGRhdGFzZXQnc1xuICogTiwgYW5kIGBnZW5lc2AgdGhlIGxlbmd0aCBvZiB0aGUgZ2VuZSBsaXN0IHRoZSBjb2RlcyBpbmRleCAob21pdCBpdCBmb3IgYEFMTF9HRU5FU2ApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVHJhbnNjcmlwdFRpbGUoXG4gIGJ1ZjogQXJyYXlCdWZmZXIsXG4gIGxpbWl0czogeyBvYnNlcnZhdGlvbnM/OiBudW1iZXI7IGdlbmVzPzogbnVtYmVyIH0gPSB7fSxcbik6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCA4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gdHJhbnNjcmlwdCB0aWxlOiByZXNwb25zZSB0b28gc2hvcnQgZm9yIGEgaGVhZGVyJyk7XG4gIH1cbiAgY29uc3QgW24sIGZsYWdzXSA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDIpO1xuICBjb25zdCBnZW5lUGFkID0gTWF0aC5jZWlsKChuICogMikgLyA0KSAqIDQ7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCA4ICsgbiAqIDIwICsgZ2VuZVBhZCwgJ3RyYW5zY3JpcHQgdGlsZScpO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShidWYsIDggKyBuICogMTYsIG4pO1xuICBjb25zdCBnZW5lID0gbmV3IFVpbnQxNkFycmF5KGJ1ZiwgOCArIG4gKiAyMCwgbik7XG4gIGFzc2VydE9ic2VydmF0aW9ucyhvYnNlcnZhdGlvbiwgbGltaXRzLm9ic2VydmF0aW9ucywgJ3RyYW5zY3JpcHQgdGlsZScpO1xuICBpZiAobGltaXRzLmdlbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgaWYgKGdlbmVbaV0gPj0gbGltaXRzLmdlbmVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIHRyYW5zY3JpcHQgdGlsZTogZ2VuZSBjb2RlICR7Z2VuZVtpXX0gaXMgcGFzdCB0aGUgJHtsaW1pdHMuZ2VuZXN9IGFza2VkIGZvcmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNvdW50OiBuLFxuICAgIGFnZ3JlZ2F0ZWQ6IChmbGFncyAmIDEpID09PSAxLFxuICAgIHg6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCA4LCBuKSxcbiAgICB5OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgOCArIG4gKiA0LCBuKSxcbiAgICB6OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgOCArIG4gKiA4LCBuKSxcbiAgICB3ZWlnaHQ6IG5ldyBVaW50MzJBcnJheShidWYsIDggKyBuICogMTIsIG4pLFxuICAgIG9ic2VydmF0aW9uLFxuICAgIGdlbmUsXG4gIH07XG59XG5cbi8qKlxuICogYEdFVCAvZGVuc2l0eT9nZW5lcz0mYmluPWAg4oaSIHRoZSBzdW1tZWQgcmFzdGVyLiBMYXlvdXRcbiAqIGBbdTMyIHJvd3NdW3UzMiBjb2xzXVtmMzIgY2VsbFddW2YzMiBjZWxsSF1bZjMyIG9yaWdpblhdW2YzMiBvcmlnaW5ZXVtmMzIgcm93c8K3Y29sc11gOlxuICogdGhlIGdlb21ldHJ5IHRyYXZlbHMgd2l0aCB0aGUgdmFsdWVzIGJlY2F1c2UgcmUtYmlubmluZyBjaGFuZ2VzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRGVuc2l0eShidWY6IEFycmF5QnVmZmVyLCBnZW5lczogc3RyaW5nW10pOiBTcGF0aWFsRGVuc2l0eVJhc3RlciB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCAyNCkgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gZGVuc2l0eTogcmVzcG9uc2UgdG9vIHNob3J0IGZvciBhIGhlYWRlcicpO1xuICBjb25zdCBbcm93cywgY29sc10gPSBuZXcgVWludDMyQXJyYXkoYnVmLCAwLCAyKTtcbiAgY29uc3QgW2N3LCBjaCwgb3gsIG95XSA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCA4LCA0KTtcbiAgLy8gVGhlIGNlbGwgc2l6ZSBkaXZpZGVzIGV2ZXJ5IGRvd25zdHJlYW0gcG9zaXRpb247IHplcm8sIG5lZ2F0aXZlIG9yIE5hTiBpcyB1bnVzYWJsZS5cbiAgaWYgKCEoY3cgPiAwICYmIGNoID4gMCAmJiBOdW1iZXIuaXNGaW5pdGUoY3cpICYmIE51bWJlci5pc0Zpbml0ZShjaCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbc3BhdGlhbF0gZGVuc2l0eTogZ3JpZCBzaXplICR7Y3d9IHggJHtjaH0gaXMgbm90IHBvc2l0aXZlIGFuZCBmaW5pdGVgKTtcbiAgfVxuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgMjQgKyByb3dzICogY29scyAqIDQsICdkZW5zaXR5Jyk7XG4gIGNvbnN0IG1ldGE6IFNwYXRpYWxEZW5zaXR5TWV0YSA9IHsgcm93cywgY29scywgZ3JpZFNpemU6IFtjdywgY2hdLCBvcmlnaW46IFtveCwgb3ldIH07XG4gIHJldHVybiB7IG1ldGEsIGdlbmVzLCB2YWx1ZXM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAyNCwgcm93cyAqIGNvbHMpIH07XG59XG5cbi8qKlxuICogRm9sZCBhIG1hbmlmZXN0IHBsdXMgaXRzIGZldGNoZWQgY29vcmRpbmF0ZS9pZC9yYWRpdXMgdmVjdG9ycyBpbnRvIHRoZVxuICogbGlicmFyeS1mYWNpbmcge0BsaW5rIFNwYXRpYWxEYXRhc2V0fS4gQ29sdW1uIGFuZCBmZWF0dXJlICp2YWx1ZXMqIGFyZSBub3RcbiAqIHBhcnQgb2YgdGhpcyDigJQgdGhleSBzdGF5IGxhenkgYmVoaW5kIHRoZSBwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YXNldEZyb21NYW5pZmVzdChcbiAgbWFuaWZlc3Q6IFNwYXRpYWxNYW5pZmVzdCxcbiAgY29vcmRzOiBQaWNrPFNwYXRpYWxPYnNlcnZhdGlvbnMsICd4JyB8ICd5JyB8ICd6Jz4sXG4gIGV4dHJhczogeyBpZHM/OiBzdHJpbmdbXTsgcmFkaXVzPzogRmxvYXQzMkFycmF5IH0gPSB7fSxcbik6IFNwYXRpYWxEYXRhc2V0IHtcbiAgYXNzZXJ0TWFuaWZlc3RWZXJzaW9uKG1hbmlmZXN0KTtcbiAgY29uc3QgcmFkaXVzID0gbWFuaWZlc3QucmFkaXVzPy5tb2RlID09PSAndW5pZm9ybScgPyBtYW5pZmVzdC5yYWRpdXMudmFsdWUgOiBleHRyYXMucmFkaXVzO1xuICBjb25zdCBvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMgPSB7XG4gICAgY291bnQ6IG1hbmlmZXN0LmNvdW50LFxuICAgIHg6IGNvb3Jkcy54LFxuICAgIHk6IGNvb3Jkcy55LFxuICAgIC4uLihjb29yZHMueiA/IHsgejogY29vcmRzLnogfSA6IHt9KSxcbiAgICAuLi4oZXh0cmFzLmlkcyA/IHsgaWRzOiBleHRyYXMuaWRzIH0gOiB7fSksXG4gICAgLi4uKHJhZGl1cyAhPT0gdW5kZWZpbmVkID8geyByYWRpdXMgfSA6IHt9KSxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBpZDogbWFuaWZlc3QuaWQsXG4gICAgbmFtZTogbWFuaWZlc3QubmFtZSxcbiAgICBvYnNlcnZhdGlvbnMsXG4gICAgY29sdW1uczogbWFuaWZlc3QuY29sdW1ucyA/PyBbXSxcbiAgICAuLi4obWFuaWZlc3QuZmVhdHVyZXMgPyB7IGZlYXR1cmVzOiBtYW5pZmVzdC5mZWF0dXJlcyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5wb2x5Z29ucyA/IHsgcG9seWdvbnM6IG1hbmlmZXN0LnBvbHlnb25zIH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LmltYWdlUmVmID8geyBpbWFnZVJlZjogbWFuaWZlc3QuaW1hZ2VSZWYgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3Qudm9sdW1lID8geyB2b2x1bWU6IG1hbmlmZXN0LnZvbHVtZSB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5lbWJlZGRpbmdzPy5sZW5ndGggPyB7IGVtYmVkZGluZ3M6IG1hbmlmZXN0LmVtYmVkZGluZ3MgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QubWljcm9uc1BlclVuaXQgIT09IHVuZGVmaW5lZCA/IHsgbWljcm9uc1BlclVuaXQ6IG1hbmlmZXN0Lm1pY3JvbnNQZXJVbml0IH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnBvbHlnb25UaWxlcyA/IHsgcG9seWdvblRpbGVzOiBtYW5pZmVzdC5wb2x5Z29uVGlsZXMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QudHJhbnNjcmlwdFRpbGVzID8geyB0cmFuc2NyaXB0VGlsZXM6IG1hbmlmZXN0LnRyYW5zY3JpcHRUaWxlcyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5kZW5zaXR5ID8geyBkZW5zaXR5OiBtYW5pZmVzdC5kZW5zaXR5IH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnRyYW5zY3JpcHRCaW5zID8geyB0cmFuc2NyaXB0QmluczogbWFuaWZlc3QudHJhbnNjcmlwdEJpbnMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QudHJhbnNjcmlwdEdlbmVCaW5zID8geyB0cmFuc2NyaXB0R2VuZUJpbnM6IG1hbmlmZXN0LnRyYW5zY3JpcHRHZW5lQmlucyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC50cmFuc2NyaXB0Qmluc1N0YXR1cyA/IHsgdHJhbnNjcmlwdEJpbnNTdGF0dXM6IG1hbmlmZXN0LnRyYW5zY3JpcHRCaW5zU3RhdHVzIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Shared jit-service tile client (OSD-PLOTLY-15 / NAPARI-SVC-20). */
|
|
2
|
+
export * from './tile-protocol';
|
|
3
|
+
export * from './transport';
|
|
4
|
+
export * from './poll-descriptor';
|
|
5
|
+
export * from './native-histogram';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy90aWxlLXNlcnZlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzRUFBc0U7QUFDdEUsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU2hhcmVkIGppdC1zZXJ2aWNlIHRpbGUgY2xpZW50IChPU0QtUExPVExZLTE1IC8gTkFQQVJJLVNWQy0yMCkuICovXG5leHBvcnQgKiBmcm9tICcuL3RpbGUtcHJvdG9jb2wnO1xuZXhwb3J0ICogZnJvbSAnLi90cmFuc3BvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9wb2xsLWRlc2NyaXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9uYXRpdmUtaGlzdG9ncmFtJztcbiJdfQ==
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { nativeHistogramUrl } from './tile-protocol';
|
|
2
|
+
/** Map the server's HistogramInfo to an {@link IHistogram} with native bin left-edges
|
|
3
|
+
* (`rangeMin + i * binWidth`). */
|
|
4
|
+
export function toNativeHistogram(hi) {
|
|
5
|
+
return {
|
|
6
|
+
bins: hi.counts.map((_, i) => hi.rangeMin + i * hi.binWidth),
|
|
7
|
+
counts: hi.counts,
|
|
8
|
+
max: hi.counts.reduce((m, c) => (c > m ? c : m), 0),
|
|
9
|
+
bitDepth: hi.bitDepth,
|
|
10
|
+
rangeMin: hi.rangeMin,
|
|
11
|
+
rangeMax: hi.rangeMax,
|
|
12
|
+
observedMin: hi.observedMin,
|
|
13
|
+
observedMax: hi.observedMax,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* One channel's native-bit-depth histogram from `GET /histogram` (>8-bit images: the 8-bit display
|
|
18
|
+
* tiles cannot carry 16-bit values). The URL carries the per-app-load cache-buster.
|
|
19
|
+
*
|
|
20
|
+
* Resolves null when the server has no answer yet (202 while caching, or another status, or no
|
|
21
|
+
* counts) — the caller's pane retries. Transport failures propagate, so each backend keeps its
|
|
22
|
+
* own tagged catch; caching is the caller's too.
|
|
23
|
+
*/
|
|
24
|
+
export async function nativeHistogram(fetchJson, api, infoB64, req, signal) {
|
|
25
|
+
const resp = await fetchJson(nativeHistogramUrl(api, infoB64, req), signal);
|
|
26
|
+
if (resp.status !== 200 || !resp.body?.counts)
|
|
27
|
+
return null;
|
|
28
|
+
return toNativeHistogram(resp.body);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLWhpc3RvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL3RpbGUtc2VydmVyL25hdGl2ZS1oaXN0b2dyYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUEwQixrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBYzdFO21DQUNtQztBQUNuQyxNQUFNLFVBQVUsaUJBQWlCLENBQUMsRUFBdUI7SUFDdkQsT0FBTztRQUNMLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDNUQsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNO1FBQ2pCLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkQsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRO1FBQ3JCLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUTtRQUNyQixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVE7UUFDckIsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXO1FBQzNCLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVztLQUM1QixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FDbkMsU0FBb0IsRUFDcEIsR0FBVyxFQUNYLE9BQWUsRUFDZixHQUEyQixFQUMzQixNQUFvQjtJQUVwQixNQUFNLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBc0Isa0JBQWtCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqRyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IE5hdGl2ZUhpc3RvZ3JhbVJlcXVlc3QsIG5hdGl2ZUhpc3RvZ3JhbVVybCB9IGZyb20gJy4vdGlsZS1wcm90b2NvbCc7XG5pbXBvcnQgeyBGZXRjaEpzb24gfSBmcm9tICcuL3RyYW5zcG9ydCc7XG5cbi8qKiBUaGUgc2VydmVyJ3MgYC9oaXN0b2dyYW1gIGFuc3dlciAoSGlzdG9ncmFtSW5mbykuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdGl2ZUhpc3RvZ3JhbVdpcmUge1xuICBiaXREZXB0aDogbnVtYmVyO1xuICByYW5nZU1pbjogbnVtYmVyO1xuICByYW5nZU1heDogbnVtYmVyO1xuICBvYnNlcnZlZE1pbjogbnVtYmVyO1xuICBvYnNlcnZlZE1heDogbnVtYmVyO1xuICBiaW5XaWR0aDogbnVtYmVyO1xuICBjb3VudHM6IG51bWJlcltdO1xufVxuXG4vKiogTWFwIHRoZSBzZXJ2ZXIncyBIaXN0b2dyYW1JbmZvIHRvIGFuIHtAbGluayBJSGlzdG9ncmFtfSB3aXRoIG5hdGl2ZSBiaW4gbGVmdC1lZGdlc1xuICogIChgcmFuZ2VNaW4gKyBpICogYmluV2lkdGhgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b05hdGl2ZUhpc3RvZ3JhbShoaTogTmF0aXZlSGlzdG9ncmFtV2lyZSk6IElIaXN0b2dyYW0ge1xuICByZXR1cm4ge1xuICAgIGJpbnM6IGhpLmNvdW50cy5tYXAoKF8sIGkpID0+IGhpLnJhbmdlTWluICsgaSAqIGhpLmJpbldpZHRoKSxcbiAgICBjb3VudHM6IGhpLmNvdW50cyxcbiAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgYml0RGVwdGg6IGhpLmJpdERlcHRoLFxuICAgIHJhbmdlTWluOiBoaS5yYW5nZU1pbixcbiAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgb2JzZXJ2ZWRNaW46IGhpLm9ic2VydmVkTWluLFxuICAgIG9ic2VydmVkTWF4OiBoaS5vYnNlcnZlZE1heCxcbiAgfTtcbn1cblxuLyoqXG4gKiBPbmUgY2hhbm5lbCdzIG5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtIGZyb20gYEdFVCAvaGlzdG9ncmFtYCAoPjgtYml0IGltYWdlczogdGhlIDgtYml0IGRpc3BsYXlcbiAqIHRpbGVzIGNhbm5vdCBjYXJyeSAxNi1iaXQgdmFsdWVzKS4gVGhlIFVSTCBjYXJyaWVzIHRoZSBwZXItYXBwLWxvYWQgY2FjaGUtYnVzdGVyLlxuICpcbiAqIFJlc29sdmVzIG51bGwgd2hlbiB0aGUgc2VydmVyIGhhcyBubyBhbnN3ZXIgeWV0ICgyMDIgd2hpbGUgY2FjaGluZywgb3IgYW5vdGhlciBzdGF0dXMsIG9yIG5vXG4gKiBjb3VudHMpIOKAlCB0aGUgY2FsbGVyJ3MgcGFuZSByZXRyaWVzLiBUcmFuc3BvcnQgZmFpbHVyZXMgcHJvcGFnYXRlLCBzbyBlYWNoIGJhY2tlbmQga2VlcHMgaXRzXG4gKiBvd24gdGFnZ2VkIGNhdGNoOyBjYWNoaW5nIGlzIHRoZSBjYWxsZXIncyB0b28uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuYXRpdmVIaXN0b2dyYW0oXG4gIGZldGNoSnNvbjogRmV0Y2hKc29uLFxuICBhcGk6IHN0cmluZyxcbiAgaW5mb0I2NDogc3RyaW5nLFxuICByZXE6IE5hdGl2ZUhpc3RvZ3JhbVJlcXVlc3QsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2hKc29uPE5hdGl2ZUhpc3RvZ3JhbVdpcmU+KG5hdGl2ZUhpc3RvZ3JhbVVybChhcGksIGluZm9CNjQsIHJlcSksIHNpZ25hbCk7XG4gIGlmIChyZXNwLnN0YXR1cyAhPT0gMjAwIHx8ICFyZXNwLmJvZHk/LmNvdW50cykgcmV0dXJuIG51bGw7XG4gIHJldHVybiB0b05hdGl2ZUhpc3RvZ3JhbShyZXNwLmJvZHkpO1xufVxuIl19
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { abortError, abortableDelay, timeoutSignal } from './transport';
|
|
2
|
+
/** Default per-request timeout of {@link pollDescriptor}. */
|
|
3
|
+
export const DESCRIPTOR_REQUEST_TIMEOUT_MS = 45000;
|
|
4
|
+
/**
|
|
5
|
+
* Poll `GET /tiles/info` until the server describes the source.
|
|
6
|
+
*
|
|
7
|
+
* The server answers 202 while it is still caching the source (GCS → PVC, which can take minutes
|
|
8
|
+
* for a cold whole-slide image) and 200 with the descriptor once ready. So:
|
|
9
|
+
* - **202** → wait `intervalMs` and poll again, until `deadlineMs`;
|
|
10
|
+
* - **200 with levels** → the descriptor;
|
|
11
|
+
* - **any other status**, or a 200 without levels → `null` at once: this server will not describe
|
|
12
|
+
* the source, and polling it for minutes only delays the caller's fallback (NAPARI-SVC-3);
|
|
13
|
+
* - a **transport failure** (network error, per-request timeout) → retried like a 202: a large
|
|
14
|
+
* image always passes through a busy window, and one bad poll must not abandon it;
|
|
15
|
+
* - the **deadline** passing → `null`.
|
|
16
|
+
*
|
|
17
|
+
* The first request is issued synchronously, before the returned promise first awaits. Rejects
|
|
18
|
+
* with an `AbortError` as soon as `signal` aborts (between polls, or mid-request when the
|
|
19
|
+
* transport honours the signal).
|
|
20
|
+
*
|
|
21
|
+
* These are the napari-js backend's hardened semantics; the OpenSeadragon backend used to throw on
|
|
22
|
+
* the deadline and to retry every error status. It now shares this answer and turns `null` into
|
|
23
|
+
* its own load failure (see `OpenSeadragonVisualizerService.load`).
|
|
24
|
+
*/
|
|
25
|
+
export async function pollDescriptor(fetchJson, url, opts) {
|
|
26
|
+
const { signal } = opts;
|
|
27
|
+
const tag = opts.tag ?? '[tiles]';
|
|
28
|
+
const requestTimeoutMs = opts.requestTimeoutMs ?? DESCRIPTOR_REQUEST_TIMEOUT_MS;
|
|
29
|
+
const deadline = Date.now() + opts.deadlineMs;
|
|
30
|
+
for (;;) {
|
|
31
|
+
if (signal?.aborted)
|
|
32
|
+
throw abortError();
|
|
33
|
+
const req = timeoutSignal(signal, requestTimeoutMs);
|
|
34
|
+
try {
|
|
35
|
+
const resp = await fetchJson(url, req.signal);
|
|
36
|
+
if (signal?.aborted)
|
|
37
|
+
throw abortError();
|
|
38
|
+
if (resp.status === 200) {
|
|
39
|
+
if (resp.body?.levels?.length)
|
|
40
|
+
return resp.body;
|
|
41
|
+
console.warn(`${tag} tiles/info answered without levels`);
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
if (resp.status !== 202) {
|
|
45
|
+
console.warn(`${tag} tiles/info → ${resp.status}`);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
// 202: still caching → re-poll until the deadline.
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (signal?.aborted)
|
|
52
|
+
throw abortError();
|
|
53
|
+
console.warn(`${tag} tiles/info poll retry`, err);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
req.done();
|
|
57
|
+
}
|
|
58
|
+
if (Date.now() > deadline) {
|
|
59
|
+
console.warn(`${tag} tiles/info not ready before the deadline — file still caching`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
await abortableDelay(opts.intervalMs, signal);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9sbC1kZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvdGlsZS1zZXJ2ZXIvcG9sbC1kZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBYSxVQUFVLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWdCbkYsNkRBQTZEO0FBQzdELE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLEtBQUssQ0FBQztBQUVuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsU0FBb0IsRUFDcEIsR0FBVyxFQUNYLElBQTJCO0lBRTNCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUM7SUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksNkJBQTZCLENBQUM7SUFDaEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDOUMsU0FBUyxDQUFDO1FBQ1IsSUFBSSxNQUFNLEVBQUUsT0FBTztZQUFFLE1BQU0sVUFBVSxFQUFFLENBQUM7UUFDeEMsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFpQixHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlELElBQUksTUFBTSxFQUFFLE9BQU87Z0JBQUUsTUFBTSxVQUFVLEVBQUUsQ0FBQztZQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTTtvQkFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLHFDQUFxQyxDQUFDLENBQUM7Z0JBQzFELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsaUJBQWlCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxtREFBbUQ7UUFDckQsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLE1BQU0sRUFBRSxPQUFPO2dCQUFFLE1BQU0sVUFBVSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsd0JBQXdCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEQsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLGdFQUFnRSxDQUFDLENBQUM7WUFDckYsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRpbGVEZXNjcmlwdG9yIH0gZnJvbSAnLi90aWxlLXByb3RvY29sJztcbmltcG9ydCB7IEZldGNoSnNvbiwgYWJvcnRFcnJvciwgYWJvcnRhYmxlRGVsYXksIHRpbWVvdXRTaWduYWwgfSBmcm9tICcuL3RyYW5zcG9ydCc7XG5cbi8qKiBUaW1pbmcgb2Ygb25lIHtAbGluayBwb2xsRGVzY3JpcHRvcn0gcnVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xsRGVzY3JpcHRvck9wdGlvbnMge1xuICAvKiogR2l2ZSB1cCAocmVzb2x2ZSBudWxsKSBvbmNlIHRoaXMgbG9uZyBoYXMgcGFzc2VkIHdpdGhvdXQgYSBkZXNjcmlwdG9yLiAqL1xuICBkZWFkbGluZU1zOiBudW1iZXI7XG4gIC8qKiBXYWl0IGJldHdlZW4gdHdvIHBvbGxzIHdoaWxlIHRoZSBzZXJ2ZXIgYW5zd2VycyAyMDIuICovXG4gIGludGVydmFsTXM6IG51bWJlcjtcbiAgLyoqIFBlci1yZXF1ZXN0IHRpbWVvdXQsIHNvIGEgaHVuZyByZXF1ZXN0IGNhbm5vdCBvdXRsaXZlIHRoZSBkZWFkbGluZS4gRGVmYXVsdCA0NSBzLiAqL1xuICByZXF1ZXN0VGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogQWJvcnQgdGhlIHdob2xlIHBvbGw6IGl0IHRoZW4gcmVqZWN0cyB3aXRoIGFuIGBBYm9ydEVycm9yYC4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKiBMb2cgcHJlZml4IGZvciB0aGUgcG9sbCdzIHdhcm5pbmdzLCBlLmcuIGBbT1NEXWAuICovXG4gIHRhZz86IHN0cmluZztcbn1cblxuLyoqIERlZmF1bHQgcGVyLXJlcXVlc3QgdGltZW91dCBvZiB7QGxpbmsgcG9sbERlc2NyaXB0b3J9LiAqL1xuZXhwb3J0IGNvbnN0IERFU0NSSVBUT1JfUkVRVUVTVF9USU1FT1VUX01TID0gNDUwMDA7XG5cbi8qKlxuICogUG9sbCBgR0VUIC90aWxlcy9pbmZvYCB1bnRpbCB0aGUgc2VydmVyIGRlc2NyaWJlcyB0aGUgc291cmNlLlxuICpcbiAqIFRoZSBzZXJ2ZXIgYW5zd2VycyAyMDIgd2hpbGUgaXQgaXMgc3RpbGwgY2FjaGluZyB0aGUgc291cmNlIChHQ1Mg4oaSIFBWQywgd2hpY2ggY2FuIHRha2UgbWludXRlc1xuICogZm9yIGEgY29sZCB3aG9sZS1zbGlkZSBpbWFnZSkgYW5kIDIwMCB3aXRoIHRoZSBkZXNjcmlwdG9yIG9uY2UgcmVhZHkuIFNvOlxuICogIC0gKioyMDIqKiDihpIgd2FpdCBgaW50ZXJ2YWxNc2AgYW5kIHBvbGwgYWdhaW4sIHVudGlsIGBkZWFkbGluZU1zYDtcbiAqICAtICoqMjAwIHdpdGggbGV2ZWxzKiog4oaSIHRoZSBkZXNjcmlwdG9yO1xuICogIC0gKiphbnkgb3RoZXIgc3RhdHVzKiosIG9yIGEgMjAwIHdpdGhvdXQgbGV2ZWxzIOKGkiBgbnVsbGAgYXQgb25jZTogdGhpcyBzZXJ2ZXIgd2lsbCBub3QgZGVzY3JpYmVcbiAqICAgIHRoZSBzb3VyY2UsIGFuZCBwb2xsaW5nIGl0IGZvciBtaW51dGVzIG9ubHkgZGVsYXlzIHRoZSBjYWxsZXIncyBmYWxsYmFjayAoTkFQQVJJLVNWQy0zKTtcbiAqICAtIGEgKip0cmFuc3BvcnQgZmFpbHVyZSoqIChuZXR3b3JrIGVycm9yLCBwZXItcmVxdWVzdCB0aW1lb3V0KSDihpIgcmV0cmllZCBsaWtlIGEgMjAyOiBhIGxhcmdlXG4gKiAgICBpbWFnZSBhbHdheXMgcGFzc2VzIHRocm91Z2ggYSBidXN5IHdpbmRvdywgYW5kIG9uZSBiYWQgcG9sbCBtdXN0IG5vdCBhYmFuZG9uIGl0O1xuICogIC0gdGhlICoqZGVhZGxpbmUqKiBwYXNzaW5nIOKGkiBgbnVsbGAuXG4gKlxuICogVGhlIGZpcnN0IHJlcXVlc3QgaXMgaXNzdWVkIHN5bmNocm9ub3VzbHksIGJlZm9yZSB0aGUgcmV0dXJuZWQgcHJvbWlzZSBmaXJzdCBhd2FpdHMuIFJlamVjdHNcbiAqIHdpdGggYW4gYEFib3J0RXJyb3JgIGFzIHNvb24gYXMgYHNpZ25hbGAgYWJvcnRzIChiZXR3ZWVuIHBvbGxzLCBvciBtaWQtcmVxdWVzdCB3aGVuIHRoZVxuICogdHJhbnNwb3J0IGhvbm91cnMgdGhlIHNpZ25hbCkuXG4gKlxuICogVGhlc2UgYXJlIHRoZSBuYXBhcmktanMgYmFja2VuZCdzIGhhcmRlbmVkIHNlbWFudGljczsgdGhlIE9wZW5TZWFkcmFnb24gYmFja2VuZCB1c2VkIHRvIHRocm93IG9uXG4gKiB0aGUgZGVhZGxpbmUgYW5kIHRvIHJldHJ5IGV2ZXJ5IGVycm9yIHN0YXR1cy4gSXQgbm93IHNoYXJlcyB0aGlzIGFuc3dlciBhbmQgdHVybnMgYG51bGxgIGludG9cbiAqIGl0cyBvd24gbG9hZCBmYWlsdXJlIChzZWUgYE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZS5sb2FkYCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb2xsRGVzY3JpcHRvcihcbiAgZmV0Y2hKc29uOiBGZXRjaEpzb24sXG4gIHVybDogc3RyaW5nLFxuICBvcHRzOiBQb2xsRGVzY3JpcHRvck9wdGlvbnMsXG4pOiBQcm9taXNlPFRpbGVEZXNjcmlwdG9yIHwgbnVsbD4ge1xuICBjb25zdCB7IHNpZ25hbCB9ID0gb3B0cztcbiAgY29uc3QgdGFnID0gb3B0cy50YWcgPz8gJ1t0aWxlc10nO1xuICBjb25zdCByZXF1ZXN0VGltZW91dE1zID0gb3B0cy5yZXF1ZXN0VGltZW91dE1zID8/IERFU0NSSVBUT1JfUkVRVUVTVF9USU1FT1VUX01TO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBvcHRzLmRlYWRsaW5lTXM7XG4gIGZvciAoOzspIHtcbiAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKCk7XG4gICAgY29uc3QgcmVxID0gdGltZW91dFNpZ25hbChzaWduYWwsIHJlcXVlc3RUaW1lb3V0TXMpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2hKc29uPFRpbGVEZXNjcmlwdG9yPih1cmwsIHJlcS5zaWduYWwpO1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcigpO1xuICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgaWYgKHJlc3AuYm9keT8ubGV2ZWxzPy5sZW5ndGgpIHJldHVybiByZXNwLmJvZHk7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHt0YWd9IHRpbGVzL2luZm8gYW5zd2VyZWQgd2l0aG91dCBsZXZlbHNgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAocmVzcC5zdGF0dXMgIT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oYCR7dGFnfSB0aWxlcy9pbmZvIOKGkiAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIDIwMjogc3RpbGwgY2FjaGluZyDihpIgcmUtcG9sbCB1bnRpbCB0aGUgZGVhZGxpbmUuXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKCk7XG4gICAgICBjb25zb2xlLndhcm4oYCR7dGFnfSB0aWxlcy9pbmZvIHBvbGwgcmV0cnlgLCBlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXEuZG9uZSgpO1xuICAgIH1cbiAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICBjb25zb2xlLndhcm4oYCR7dGFnfSB0aWxlcy9pbmZvIG5vdCByZWFkeSBiZWZvcmUgdGhlIGRlYWRsaW5lIOKAlCBmaWxlIHN0aWxsIGNhY2hpbmdgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBhYm9ydGFibGVEZWxheShvcHRzLmludGVydmFsTXMsIHNpZ25hbCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The jit-service tile protocol, shared by the OpenSeadragon and napari-js backends: the
|
|
3
|
+
* `/tiles/info` descriptor, and the URLs of `/tiles/info`, `/tile`, `/histogram` and
|
|
4
|
+
* `/export/tiff`. Each URL shape lives here once — the backends used to string-build them
|
|
5
|
+
* separately and had already drifted (napari's `/histogram` lacked the cache-buster).
|
|
6
|
+
*/
|
|
7
|
+
/** The `/tiles/info` descriptor URL for one source. */
|
|
8
|
+
export function tilesInfoUrl(api, infoB64) {
|
|
9
|
+
return `${api}tiles/info?info=${infoB64}`;
|
|
10
|
+
}
|
|
11
|
+
/** Build the `/tile` request URL — the one place its query shape lives (the
|
|
12
|
+
* server caches on the exact parameter order). */
|
|
13
|
+
export function buildTileUrl(api, infoB64, c) {
|
|
14
|
+
const ch = c.channel == null ? '' : `&channel=${c.channel}`;
|
|
15
|
+
return `${api}tile?info=${infoB64}&res=${c.res}&col=${c.col}&row=${c.row}&z=${c.z}&tileSize=${c.tileSize}${ch}`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Per-app-load cache-buster for `/histogram`. The server marks the response
|
|
19
|
+
* cacheable for 24 h, and a hard refresh can't bust a post-load XHR. A token
|
|
20
|
+
* stable within a session (so the backends' in-session caches still dedupe) but
|
|
21
|
+
* new on each full load always reflects the live backend after a reload.
|
|
22
|
+
*/
|
|
23
|
+
export const HISTOGRAM_CACHE_BUSTER = Date.now();
|
|
24
|
+
/** The `/histogram` URL, with the cache-buster (see {@link HISTOGRAM_CACHE_BUSTER}). */
|
|
25
|
+
export function nativeHistogramUrl(api, infoB64, r, cacheBuster = HISTOGRAM_CACHE_BUSTER) {
|
|
26
|
+
return `${api}histogram?info=${infoB64}&channel=${r.channel}&z=${r.z}&bins=${r.bins}&_=${cacheBuster}`;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The `/export/tiff` URL for slice `z`. `visible` are the channel indices to
|
|
30
|
+
* export; the `channels` param is omitted when every one of the `channelCount`
|
|
31
|
+
* channels is visible (or none is), which is the server default (all).
|
|
32
|
+
*/
|
|
33
|
+
export function exportTiffUrl(api, infoB64, z, visible, channelCount) {
|
|
34
|
+
const ch = visible.length && visible.length < channelCount ? `&channels=${visible.join(',')}` : '';
|
|
35
|
+
return `${api}export/tiff?info=${infoB64}&z=${z}${ch}`;
|
|
36
|
+
}
|
|
37
|
+
/** The saved name of a native-bit-depth TIFF export of `fileName`. */
|
|
38
|
+
export function exportTiffFilename(fileName) {
|
|
39
|
+
const stem = (fileName || 'image').replace(/\.[^.]+$/, '');
|
|
40
|
+
return `${stem}_16bit.ome.tif`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZS1wcm90b2NvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL3RpbGUtc2VydmVyL3RpbGUtcHJvdG9jb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFzREgsdURBQXVEO0FBQ3ZELE1BQU0sVUFBVSxZQUFZLENBQUMsR0FBVyxFQUFFLE9BQWU7SUFDdkQsT0FBTyxHQUFHLEdBQUcsbUJBQW1CLE9BQU8sRUFBRSxDQUFDO0FBQzVDLENBQUM7QUFFRDttREFDbUQ7QUFDbkQsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFXLEVBQUUsT0FBZSxFQUFFLENBQWE7SUFDdEUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUQsT0FBTyxHQUFHLEdBQUcsYUFBYSxPQUFPLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ2xILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQVNqRCx3RkFBd0Y7QUFDeEYsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxHQUFXLEVBQ1gsT0FBZSxFQUNmLENBQXlCLEVBQ3pCLGNBQXNCLHNCQUFzQjtJQUU1QyxPQUFPLEdBQUcsR0FBRyxrQkFBa0IsT0FBTyxZQUFZLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxNQUFNLFdBQVcsRUFBRSxDQUFDO0FBQ3pHLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsR0FBVyxFQUNYLE9BQWUsRUFDZixDQUFTLEVBQ1QsT0FBMEIsRUFDMUIsWUFBb0I7SUFFcEIsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuRyxPQUFPLEdBQUcsR0FBRyxvQkFBb0IsT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUN6RCxDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxRQUFtQztJQUNwRSxNQUFNLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNELE9BQU8sR0FBRyxJQUFJLGdCQUFnQixDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBqaXQtc2VydmljZSB0aWxlIHByb3RvY29sLCBzaGFyZWQgYnkgdGhlIE9wZW5TZWFkcmFnb24gYW5kIG5hcGFyaS1qcyBiYWNrZW5kczogdGhlXG4gKiBgL3RpbGVzL2luZm9gIGRlc2NyaXB0b3IsIGFuZCB0aGUgVVJMcyBvZiBgL3RpbGVzL2luZm9gLCBgL3RpbGVgLCBgL2hpc3RvZ3JhbWAgYW5kXG4gKiBgL2V4cG9ydC90aWZmYC4gRWFjaCBVUkwgc2hhcGUgbGl2ZXMgaGVyZSBvbmNlIOKAlCB0aGUgYmFja2VuZHMgdXNlZCB0byBzdHJpbmctYnVpbGQgdGhlbVxuICogc2VwYXJhdGVseSBhbmQgaGFkIGFscmVhZHkgZHJpZnRlZCAobmFwYXJpJ3MgYC9oaXN0b2dyYW1gIGxhY2tlZCB0aGUgY2FjaGUtYnVzdGVyKS5cbiAqL1xuXG4vKiogT25lIHB5cmFtaWQgbGV2ZWwgZnJvbSBgR0VUIC90aWxlcy9pbmZvYCAocmVzIDAgPSBmdWxsIHJlc29sdXRpb24pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaWxlTGV2ZWwge1xuICByZXM6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBUaWxlLXNvdXJjZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGBHRVQgL3RpbGVzL2luZm9gLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIC8qKiBUcnVlIG9ubHkgZm9yIGdlbnVpbmUgbXVsdGktY2hhbm5lbCBjb21wb3NpdGVzIChpbmRleGVkL0xVVC1iZWFyaW5nXG4gICAqICBmbHVvcmVzY2VuY2Ugc3RhY2tzKSB0aGUgY2xpZW50IHNob3VsZCBzcGxpdCBpbnRvIHBlci1jaGFubmVsIGxheWVycy4gVGhlXG4gICAqICBzZXJ2ZXIgc2V0cyBpdDsgYW4gUkdCIHBob3RvIHJlYWQgYXMgc2VwYXJhdGVkIHBsYW5lcyBoYXMgY2hhbm5lbHM+MSBidXRcbiAgICogIG11bHRpY2hhbm5lbD1mYWxzZSwgc28gaXQgc3RheXMgYSBzaW5nbGUgY29tcG9zaXRlIHRpbGUgc291cmNlLiAqL1xuICBtdWx0aWNoYW5uZWw/OiBib29sZWFuO1xuICAvKiogUmVhbCBCaW8tRm9ybWF0cyByZXNvbHV0aW9uIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHRoZSByZW1haW5pbmdcbiAgICogIGxldmVscyBhcmUgc3ludGhldGljIGNvbXBvc2l0ZWQgb3ZlcnZpZXdzIChubyBwZXItY2hhbm5lbCB0aWxlcykuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIC8qKiBQZXItY2hhbm5lbCBtZXRhZGF0YSAobmFtZS9jb2xvci9iaXREZXB0aC9taW4tbWF4QWxsb3dlZCkgZm9yIG5hdGl2ZSAxNi1iaXRcbiAgICogIHdpbmRvd2luZyArIGhpc3RvZ3JhbTsgbnVsbCBmb3IgcGxhaW4gOC1iaXQvUkdCIHNvdXJjZXMuICovXG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgY29sb3I/OiBzdHJpbmc7XG4gICAgYml0RGVwdGg/OiBudW1iZXI7XG4gICAgbWluQWxsb3dlZD86IG51bWJlcjtcbiAgICBtYXhBbGxvd2VkPzogbnVtYmVyO1xuICB9PiB8IG51bGw7XG4gIGxldmVsczogVGlsZUxldmVsW107XG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplIGluIMK1bSAoMCB3aGVuIHRoZSBmb3JtYXQgZG9lc24ndCByZXBvcnQgaXQpLiAqL1xuICBtcHBYPzogbnVtYmVyO1xuICBtcHBZPzogbnVtYmVyO1xuICAvKiogU3BhY2luZyBiZXR3ZWVuIHogc2xpY2VzIGluIMK1bSAoMCBvciBhYnNlbnQgd2hlbiB0aGUgZm9ybWF0IGRvZXNuJ3QgcmVwb3J0IGl0KTogd2hhdFxuICAgKiAgbGV0cyBhIHotc3RhY2sgYmUgZHJhd24gYXMgYSB2b2x1bWUgdG8gc2NhbGUuICovXG4gIG1wcFo/OiBudW1iZXI7XG59XG5cbi8qKiBUaWxlIGNvb3JkaW5hdGVzIGZvciBvbmUgYC90aWxlYCByZXF1ZXN0LiBgY2hhbm5lbCA9PSBudWxsYCAob3Igb21pdHRlZClcbiAqICByZXF1ZXN0cyB0aGUgc2VydmVyLWNvbXBvc2l0ZWQgdGlsZTsgYW4gaW5kZXggKGluY2x1ZGluZyAwKSByZXF1ZXN0cyB0aGF0XG4gKiAgc2luZ2xlIGNoYW5uZWwgYXMgZ3JheXNjYWxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaWxlQ29vcmRzIHtcbiAgcmVzOiBudW1iZXI7XG4gIGNvbDogbnVtYmVyO1xuICByb3c6IG51bWJlcjtcbiAgejogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICBjaGFubmVsPzogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqIFRoZSBgL3RpbGVzL2luZm9gIGRlc2NyaXB0b3IgVVJMIGZvciBvbmUgc291cmNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVzSW5mb1VybChhcGk6IHN0cmluZywgaW5mb0I2NDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2FwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG59XG5cbi8qKiBCdWlsZCB0aGUgYC90aWxlYCByZXF1ZXN0IFVSTCDigJQgdGhlIG9uZSBwbGFjZSBpdHMgcXVlcnkgc2hhcGUgbGl2ZXMgKHRoZVxuICogIHNlcnZlciBjYWNoZXMgb24gdGhlIGV4YWN0IHBhcmFtZXRlciBvcmRlcikuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUaWxlVXJsKGFwaTogc3RyaW5nLCBpbmZvQjY0OiBzdHJpbmcsIGM6IFRpbGVDb29yZHMpOiBzdHJpbmcge1xuICBjb25zdCBjaCA9IGMuY2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtjLmNoYW5uZWx9YDtcbiAgcmV0dXJuIGAke2FwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtjLnJlc30mY29sPSR7Yy5jb2x9JnJvdz0ke2Mucm93fSZ6PSR7Yy56fSZ0aWxlU2l6ZT0ke2MudGlsZVNpemV9JHtjaH1gO1xufVxuXG4vKipcbiAqIFBlci1hcHAtbG9hZCBjYWNoZS1idXN0ZXIgZm9yIGAvaGlzdG9ncmFtYC4gVGhlIHNlcnZlciBtYXJrcyB0aGUgcmVzcG9uc2VcbiAqIGNhY2hlYWJsZSBmb3IgMjQgaCwgYW5kIGEgaGFyZCByZWZyZXNoIGNhbid0IGJ1c3QgYSBwb3N0LWxvYWQgWEhSLiBBIHRva2VuXG4gKiBzdGFibGUgd2l0aGluIGEgc2Vzc2lvbiAoc28gdGhlIGJhY2tlbmRzJyBpbi1zZXNzaW9uIGNhY2hlcyBzdGlsbCBkZWR1cGUpIGJ1dFxuICogbmV3IG9uIGVhY2ggZnVsbCBsb2FkIGFsd2F5cyByZWZsZWN0cyB0aGUgbGl2ZSBiYWNrZW5kIGFmdGVyIGEgcmVsb2FkLlxuICovXG5leHBvcnQgY29uc3QgSElTVE9HUkFNX0NBQ0hFX0JVU1RFUiA9IERhdGUubm93KCk7XG5cbi8qKiBXaGVyZSBvbmUgY2hhbm5lbCdzIG5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtIGlzIHJlYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdGl2ZUhpc3RvZ3JhbVJlcXVlc3Qge1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWw6IG51bWJlcjtcbiAgYmluczogbnVtYmVyO1xufVxuXG4vKiogVGhlIGAvaGlzdG9ncmFtYCBVUkwsIHdpdGggdGhlIGNhY2hlLWJ1c3RlciAoc2VlIHtAbGluayBISVNUT0dSQU1fQ0FDSEVfQlVTVEVSfSkuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlSGlzdG9ncmFtVXJsKFxuICBhcGk6IHN0cmluZyxcbiAgaW5mb0I2NDogc3RyaW5nLFxuICByOiBOYXRpdmVIaXN0b2dyYW1SZXF1ZXN0LFxuICBjYWNoZUJ1c3RlcjogbnVtYmVyID0gSElTVE9HUkFNX0NBQ0hFX0JVU1RFUixcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHthcGl9aGlzdG9ncmFtP2luZm89JHtpbmZvQjY0fSZjaGFubmVsPSR7ci5jaGFubmVsfSZ6PSR7ci56fSZiaW5zPSR7ci5iaW5zfSZfPSR7Y2FjaGVCdXN0ZXJ9YDtcbn1cblxuLyoqXG4gKiBUaGUgYC9leHBvcnQvdGlmZmAgVVJMIGZvciBzbGljZSBgemAuIGB2aXNpYmxlYCBhcmUgdGhlIGNoYW5uZWwgaW5kaWNlcyB0b1xuICogZXhwb3J0OyB0aGUgYGNoYW5uZWxzYCBwYXJhbSBpcyBvbWl0dGVkIHdoZW4gZXZlcnkgb25lIG9mIHRoZSBgY2hhbm5lbENvdW50YFxuICogY2hhbm5lbHMgaXMgdmlzaWJsZSAob3Igbm9uZSBpcyksIHdoaWNoIGlzIHRoZSBzZXJ2ZXIgZGVmYXVsdCAoYWxsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFRpZmZVcmwoXG4gIGFwaTogc3RyaW5nLFxuICBpbmZvQjY0OiBzdHJpbmcsXG4gIHo6IG51bWJlcixcbiAgdmlzaWJsZTogcmVhZG9ubHkgbnVtYmVyW10sXG4gIGNoYW5uZWxDb3VudDogbnVtYmVyLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgY2ggPSB2aXNpYmxlLmxlbmd0aCAmJiB2aXNpYmxlLmxlbmd0aCA8IGNoYW5uZWxDb3VudCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gIHJldHVybiBgJHthcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke2luZm9CNjR9Jno9JHt6fSR7Y2h9YDtcbn1cblxuLyoqIFRoZSBzYXZlZCBuYW1lIG9mIGEgbmF0aXZlLWJpdC1kZXB0aCBUSUZGIGV4cG9ydCBvZiBgZmlsZU5hbWVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFRpZmZGaWxlbmFtZShmaWxlTmFtZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IHN0ZW0gPSAoZmlsZU5hbWUgfHwgJ2ltYWdlJykucmVwbGFjZSgvXFwuW14uXSskLywgJycpO1xuICByZXR1cm4gYCR7c3RlbX1fMTZiaXQub21lLnRpZmA7XG59XG4iXX0=
|