@jax-data-science/sci-image-visualizer 0.16.0 → 0.18.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/esm2022/lib/contracts/display-types.mjs +4 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
- package/esm2022/lib/geometry/place.mjs +47 -0
- package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +86 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +343 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +427 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +35 -8
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +136 -28
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +19 -3
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +188 -52
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +35 -11
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
- package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
- package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
- package/esm2022/lib/region-source/region-tiles.mjs +1 -1
- package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
- package/esm2022/lib/routing-visualizer.service.mjs +404 -7
- package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
- package/esm2022/lib/spatial/plane-cells.mjs +119 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +304 -8
- package/esm2022/lib/spatial/spatial-encoding.mjs +52 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
- package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
- package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
- package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +51 -12
- package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +21 -6
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +94 -13
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
- package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
- package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
- package/esm2022/lib/store/region-source-scope.mjs +10 -1
- package/esm2022/lib/store/region-store.service.mjs +33 -2
- package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
- package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
- package/esm2022/lib/visualizer.component.mjs +40 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4838 -656
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/fesm2022/region-source.worker.js +84 -2
- package/lib/contracts/display-types.d.ts +99 -6
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
- package/lib/contracts/region-editor-api.contract.d.ts +9 -0
- package/lib/contracts/region-store.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
- package/lib/contracts/visualizer.contract.d.ts +43 -1
- package/lib/geometry/cell-meshes.d.ts +27 -0
- package/lib/geometry/place.d.ts +45 -0
- package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
- package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
- package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +89 -0
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +103 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +20 -6
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +48 -16
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +54 -1
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
- package/lib/region-editor/region-editor.component.d.ts +4 -0
- package/lib/region-source/region-source-ops.d.ts +12 -0
- package/lib/region-source/region-tiles.d.ts +8 -0
- package/lib/region-source/worker-region-source.d.ts +18 -0
- package/lib/routing-visualizer.service.d.ts +140 -1
- package/lib/spatial/observations-in-selection.d.ts +43 -0
- package/lib/spatial/plane-cells.d.ts +37 -0
- package/lib/spatial/spatial-controls.facade.d.ts +59 -0
- package/lib/spatial/spatial-encoding.d.ts +24 -1
- package/lib/spatial/spatial-hover.d.ts +23 -0
- package/lib/spatial/spatial-planes.d.ts +22 -0
- package/lib/spatial/spatial-selection.d.ts +2 -1
- package/lib/spatial/spatial-tile-merge.d.ts +9 -0
- package/lib/spatial/transcripts-in-selection.d.ts +95 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
- package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +19 -2
- package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +7 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +28 -7
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
- package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
- package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
- package/lib/store/region-source-scope.d.ts +4 -0
- package/lib/store/region-store.service.d.ts +21 -0
- package/lib/toolbar/toolbar.component.d.ts +6 -1
- package/lib/visualizer/spatial-region-set.d.ts +55 -0
- package/lib/visualizer.component.d.ts +14 -0
- package/package.json +2 -2
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { buildColormapLut } from '../contracts/colormap-lut';
|
|
2
2
|
import { parseCssColor } from '../contracts/color';
|
|
3
3
|
import { fallbackColorFor } from '../store/class-color.util';
|
|
4
|
-
import { NO_CATEGORY } from '../contracts/spatial-dataset.contract';
|
|
4
|
+
import { NO_CATEGORY, NO_OBSERVATION, } from '../contracts/spatial-dataset.contract';
|
|
5
5
|
import { percentileWindow } from './stats';
|
|
6
6
|
/** Neutral grey for observations with no value (NaN, or {@link NO_CATEGORY}). */
|
|
7
7
|
export const MISSING_COLOR = [150, 150, 150];
|
|
@@ -11,7 +11,10 @@ export const DEFAULT_MUTED_OPACITY = 0.15;
|
|
|
11
11
|
* Fallback categorical palette. Colour-blind-safe and stable, so a category
|
|
12
12
|
* without an authored colour still lands somewhere sensible and lands there
|
|
13
13
|
* every run (`fallbackColorFor` hashes the name — same name, same colour).
|
|
14
|
-
* Okabe–Ito
|
|
14
|
+
* Okabe–Ito and three greys, then twelve more (Tol's muted, a few of Paired), so a grouping of up
|
|
15
|
+
* to 22 groups (the MERFISH ileum's 20 cell types) has no two alike; the first ten come first, so a
|
|
16
|
+
* grouping of ten or fewer keeps its colours. jit-bioformats' `SegmentationRegionSet.PALETTE` (a 3D
|
|
17
|
+
* segmentation's region set, coloured at conversion) must stay this, colour for colour.
|
|
15
18
|
*/
|
|
16
19
|
export const DEFAULT_CATEGORICAL_PALETTE = [
|
|
17
20
|
'#0072B2',
|
|
@@ -24,6 +27,18 @@ export const DEFAULT_CATEGORICAL_PALETTE = [
|
|
|
24
27
|
'#000000',
|
|
25
28
|
'#7F7F7F',
|
|
26
29
|
'#BFBFBF',
|
|
30
|
+
'#882255',
|
|
31
|
+
'#44AA99',
|
|
32
|
+
'#332288',
|
|
33
|
+
'#DDCC77',
|
|
34
|
+
'#117733',
|
|
35
|
+
'#AA4499',
|
|
36
|
+
'#661100',
|
|
37
|
+
'#999933',
|
|
38
|
+
'#E31A1C',
|
|
39
|
+
'#FB9A99',
|
|
40
|
+
'#B2DF8A',
|
|
41
|
+
'#6A3D9A',
|
|
27
42
|
];
|
|
28
43
|
/** Parse a CSS colour (`#rgb` / `#rrggbb`, see {@link parseCssColor}) to 0–255 RGB; unparseable
|
|
29
44
|
* input falls back to grey. Exported so the tile layers parse palettes exactly as the markers do. */
|
|
@@ -52,6 +67,23 @@ export function resolveCategoryColors(meta, palette = DEFAULT_CATEGORICAL_PALETT
|
|
|
52
67
|
return fallbackColorFor(name, palette);
|
|
53
68
|
});
|
|
54
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Categorical column `column`'s colours ({@link resolveCategoryColors}) with the user's choices
|
|
72
|
+
* for its groups over them. Every place a grouping is coloured goes through this, so a group
|
|
73
|
+
* recoloured in the list is that colour on the cells, the markers, the legend and the charts.
|
|
74
|
+
*/
|
|
75
|
+
export function categoryColorsFor(column, meta, overrides) {
|
|
76
|
+
const base = resolveCategoryColors(meta);
|
|
77
|
+
const own = overrides?.[column];
|
|
78
|
+
if (!own)
|
|
79
|
+
return base;
|
|
80
|
+
return meta.categories.map((name, i) => own[name] || base[i]);
|
|
81
|
+
}
|
|
82
|
+
/** What a cache keyed on a grouping's colours must include of the user's choices for it. */
|
|
83
|
+
export function groupColorsKey(column, overrides) {
|
|
84
|
+
const own = column ? overrides?.[column] : undefined;
|
|
85
|
+
return own ? JSON.stringify(own) : '';
|
|
86
|
+
}
|
|
55
87
|
/** Categorical column → flat per-point RGBA (length `4 * codes.length`). */
|
|
56
88
|
export function encodeCategorical(codes, opts) {
|
|
57
89
|
const n = codes.length;
|
|
@@ -173,4 +205,21 @@ export function spatialContinuousLut(colormapValue, reverse = false, override) {
|
|
|
173
205
|
const lut = lutFor(colormapValue, reverse);
|
|
174
206
|
return isGrayscaleLut(lut) ? buildColormapLut('Viridis', reverse) : lut;
|
|
175
207
|
}
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1lbmNvZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQXlCLFdBQVcsRUFBdUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUVoSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUE0QjNDLGlGQUFpRjtBQUNqRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWxELHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUM7QUFFMUM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBYTtJQUNuRCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0NBQ1YsQ0FBQztBQWdDRjtzR0FDc0c7QUFDdEcsTUFBTSxVQUFVLFFBQVEsQ0FBQyxHQUFXO0lBQ2xDLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGFBQWEsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsQ0FBUyxFQUFFLElBQWlCO0lBQzNDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO0lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUkscUJBQXFCLENB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QUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLGFBQXNCLEVBQ3RCLE9BQU8sR0FBRyxLQUFLLEVBQ2YsUUFBK0I7SUFFL0IseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUN4RixJQUFJLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJnYiwgYnVpbGRDb2xvcm1hcEx1dCB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgcGFyc2VDc3NDb2xvciB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcic7XG5pbXBvcnQgeyBmYWxsYmFja0NvbG9yRm9yIH0gZnJvbSAnLi4vc3RvcmUvY2xhc3MtY29sb3IudXRpbCc7XG5pbXBvcnQgeyBDYXRlZ29yaWNhbENvbHVtbk1ldGEsIE5PX0NBVEVHT1JZLCBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcFZhbHVlIH0gZnJvbSAnLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgcGVyY2VudGlsZVdpbmRvdyB9IGZyb20gJy4vc3RhdHMnO1xuXG4vKipcbiAqIFR1cm5pbmcgc3BhdGlhbC1vbWljcyBjb2x1bW5zIGludG8gcGVyLXBvaW50IHZpc3VhbCBhdHRyaWJ1dGVzLlxuICpcbiAqIFB1cmUg4oCUIG5vIEFuZ3VsYXIsIG5vIFJ4SlMsIG5vIHJlbmRlcmVyIOKAlCBsaWtlIGBwbG90bHktdHJhY2UtYnVpbGRlcnMudHNgLCBzb1xuICogdGhlIGVuY29kaW5ncyBhcmUgdGVzdGFibGUgb24gdGhlaXIgb3duIGFuZCBzaGFyZWQgYnkgYW55IGJhY2tlbmQgdGhhdCBncm93c1xuICogYSBzcGF0aWFsIG1vZGUuXG4gKlxuICogVGhlIHJ1bGVzIGhlcmUgYXJlIHRoZSBvbmVzIHRoZSBDb3NNeCBhbmFseXNpcyBndWlkYW5jZSBwcmVzY3JpYmVzLCBtYWRlXG4gKiBleHBsaWNpdCByYXRoZXIgdGhhbiBsZWZ0IHRvIGVhY2ggY2FsbCBzaXRlOlxuICogIC0gY291bnQtbGlrZSBjb2x1bW5zIHJlYWQgb24gYSAqKmxvZyoqIHNjYWxlIChsaW5lYXIgY29sbGFwc2VzIHRoZW0gYWdhaW5zdCBhXG4gKiAgICBmZXcgYnJpZ2h0IG91dGxpZXJzKTtcbiAqICAtIGNvbnRyYXN0IHdpbmRvd3MgY29tZSBmcm9tICoqcGVyY2VudGlsZXMqKiwgbm90IG1pbi9tYXgsIHNvIGEgc2luZ2xlXG4gKiAgICBzYXR1cmF0ZWQgc3BvdCBkb2Vzbid0IGZsYXR0ZW4gZXZlcnl0aGluZyBlbHNlO1xuICogIC0gY29udGV4dCBpcyBrZXB0IGJ5ICoqbXV0aW5nKiogcmF0aGVyIHRoYW4gaGlkaW5nIOKAlCBiYWNrZ3JvdW5kIHBvaW50cyBzdGF5XG4gKiAgICB2aXNpYmxlIGF0IGxvdyBhbHBoYSBzbyB0aGUgdGlzc3VlIHNoYXBlIHN1cnZpdmVzLlxuICpcbiAqIENPTE9VUiBSRVBSRVNFTlRBVElPTlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFdmVyeXRoaW5nIGlzIGEgZmxhdCBgRmxvYXQzMkFycmF5YCBvZiBgW3IsZyxiLGEsIOKApl1gIGluIDAuLjEg4oCUIG9uZVxuICogYWxsb2NhdGlvbiBmb3IgTiBwb2ludHMsIEdQVS11cGxvYWQgc2hhcGVkLiBuYXBhcmktanMgKOKJpSAwLjE1KVxuICogYFBvaW50c0xheWVyLmZhY2VDb2xvcmAgYW5kIGBQb2ludHMzRExheWVyLmNvbG9yc2AgdGFrZSBpdCBhcyBpcy5cbiAqL1xuXG4vKiogT25lIFJHQkEgY29sb3VyLCByLCBnLCBiLCBhIGluIDAuLjEgKG5hcGFyaS1qcydzIGJyb2FkY2FzdCBjb2xvdXIpLiAqL1xuZXhwb3J0IHR5cGUgUkdCQSA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4vKiogTmV1dHJhbCBncmV5IGZvciBvYnNlcnZhdGlvbnMgd2l0aCBubyB2YWx1ZSAoTmFOLCBvciB7QGxpbmsgTk9fQ0FURUdPUll9KS4gKi9cbmV4cG9ydCBjb25zdCBNSVNTSU5HX0NPTE9SOiBSZ2IgPSBbMTUwLCAxNTAsIDE1MF07XG5cbi8qKiBEZWZhdWx0IGFscGhhIGZvciBtdXRlZCAoYmFja2dyb3VuZCAvIHVuc2VsZWN0ZWQpIHBvaW50cyDigJQgQ29zTXgtc3R5bGUgY29udGV4dC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01VVEVEX09QQUNJVFkgPSAwLjE1O1xuXG4vKipcbiAqIEZhbGxiYWNrIGNhdGVnb3JpY2FsIHBhbGV0dGUuIENvbG91ci1ibGluZC1zYWZlIGFuZCBzdGFibGUsIHNvIGEgY2F0ZWdvcnlcbiAqIHdpdGhvdXQgYW4gYXV0aG9yZWQgY29sb3VyIHN0aWxsIGxhbmRzIHNvbWV3aGVyZSBzZW5zaWJsZSBhbmQgbGFuZHMgdGhlcmVcbiAqIGV2ZXJ5IHJ1biAoYGZhbGxiYWNrQ29sb3JGb3JgIGhhc2hlcyB0aGUgbmFtZSDigJQgc2FtZSBuYW1lLCBzYW1lIGNvbG91cikuXG4gKiBPa2FiZeKAk0l0bywgcGx1cyB0d28gZ3JleXMgZm9yIGxvbmcgdGFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEU6IHN0cmluZ1tdID0gW1xuICAnIzAwNzJCMicsXG4gICcjRTY5RjAwJyxcbiAgJyMwMDlFNzMnLFxuICAnI0NDNzlBNycsXG4gICcjNTZCNEU5JyxcbiAgJyNENTVFMDAnLFxuICAnI0YwRTQ0MicsXG4gICcjMDAwMDAwJyxcbiAgJyM3RjdGN0YnLFxuICAnI0JGQkZCRicsXG5dO1xuXG5pbnRlcmZhY2UgTXV0ZU9wdGlvbnMge1xuICAvKiogQWxwaGEgZm9yIHBvaW50cyB0aGF0IGFyZSBub3QgbXV0ZWQuIERlZmF1bHQgMS4gKi9cbiAgb3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIEFscGhhIGZvciBtdXRlZCBwb2ludHMuIERlZmF1bHQge0BsaW5rIERFRkFVTFRfTVVURURfT1BBQ0lUWX0uICovXG4gIG11dGVkT3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIGAxYCBhdCBpbmRleCBpIG11dGVzIG9ic2VydmF0aW9uIGkuIEFic2VudCDih5Igbm90aGluZyBpcyBtdXRlZC4gKi9cbiAgbXV0ZWQ/OiBVaW50OEFycmF5IHwgbnVsbDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBlbmNvZGVDYXRlZ29yaWNhbH06IGEgY29sb3VyIHBlciBjYXRlZ29yeSwgcGx1cyBtdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsRW5jb2RpbmdPcHRpb25zIGV4dGVuZHMgTXV0ZU9wdGlvbnMge1xuICAvKiogUGVyLWNhdGVnb3J5IGAjcnJnZ2JiYCwgaW5kZXgtYWxpZ25lZCB3aXRoIHRoZSBjb2x1bW4ncyBjYXRlZ29yaWVzLiAqL1xuICBjb2xvcnM6IHN0cmluZ1tdO1xuICAvKiogQ29sb3VyIGZvciB7QGxpbmsgTk9fQ0FURUdPUll9LiBEZWZhdWx0IHtAbGluayBNSVNTSU5HX0NPTE9SfS4gKi9cbiAgbWlzc2luZ0NvbG9yPzogUmdiO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGVuY29kZUNvbnRpbnVvdXN9OiBhIGNvbG9ybWFwLCBhIGNvbnRyYXN0IHdpbmRvdyBhbmQgc2NhbGluZywgcGx1cyBtdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRpbnVvdXNFbmNvZGluZ09wdGlvbnMgZXh0ZW5kcyBNdXRlT3B0aW9ucyB7XG4gIC8qKiAyNTYtZW50cnkgUkdCIHRhYmxlIGZyb20ge0BsaW5rIGJ1aWxkQ29sb3JtYXBMdXR9LiAqL1xuICBsdXQ6IFJnYltdO1xuICAvKiogQ29udHJhc3Qgd2luZG93IGluIFZBTFVFIHVuaXRzIChwcmUtbG9nKS4gKi9cbiAgbWluOiBudW1iZXI7XG4gIG1heDogbnVtYmVyO1xuICAvKiogQXBwbHkgYGxvZzFwYCB0byB0aGUgdmFsdWUgYW5kIHRoZSB3aW5kb3cgYmVmb3JlIG5vcm1hbGlzaW5nLiAqL1xuICBsb2c/OiBib29sZWFuO1xuICAvKiogQ29sb3VyIGZvciBgTmFOYC4gRGVmYXVsdCB7QGxpbmsgTUlTU0lOR19DT0xPUn0uICovXG4gIG1pc3NpbmdDb2xvcj86IFJnYjtcbn1cblxuLyoqIFBhcnNlIGEgQ1NTIGNvbG91ciAoYCNyZ2JgIC8gYCNycmdnYmJgLCBzZWUge0BsaW5rIHBhcnNlQ3NzQ29sb3J9KSB0byAw4oCTMjU1IFJHQjsgdW5wYXJzZWFibGVcbiAqICBpbnB1dCBmYWxscyBiYWNrIHRvIGdyZXkuIEV4cG9ydGVkIHNvIHRoZSB0aWxlIGxheWVycyBwYXJzZSBwYWxldHRlcyBleGFjdGx5IGFzIHRoZSBtYXJrZXJzIGRvLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGV4KGhleDogc3RyaW5nKTogUmdiIHtcbiAgcmV0dXJuIHBhcnNlQ3NzQ29sb3IoaGV4KSA/PyBNSVNTSU5HX0NPTE9SO1xufVxuXG5mdW5jdGlvbiBhbHBoYUF0KGk6IG51bWJlciwgb3B0czogTXV0ZU9wdGlvbnMpOiBudW1iZXIge1xuICBjb25zdCBvbiA9IG9wdHMub3BhY2l0eSA/PyAxO1xuICBjb25zdCBvZmYgPSBvcHRzLm11dGVkT3BhY2l0eSA/PyBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gIHJldHVybiBvcHRzLm11dGVkICYmIG9wdHMubXV0ZWRbaV0gPyBvZmYgOiBvbjtcbn1cblxuLyoqXG4gKiBQZXItY2F0ZWdvcnkgY29sb3VyczogdGhlIGNvbHVtbidzIGF1dGhvcmVkIGBjb2xvcnNgIHdoZXJlIHByZXNlbnQgKHNvIHRoZVxuICogdmlld2VyIG1hdGNoZXMgdGhlIGZpZ3VyZXMgdGhlIHNhbWUgYW5hbHlzaXMgcHJvZHVjZWQgZWxzZXdoZXJlKSwgb3RoZXJ3aXNlXG4gKiB0aGUgcGFsZXR0ZSBieSBwb3NpdGlvbiwgd3JhcHBpbmcgdGhyb3VnaCBhIG5hbWUtaGFzaCBwYXN0IGl0cyBlbmQgc28gYVxuICogNDAtY2x1c3RlciBjb2x1bW4gc3RpbGwgZ2V0cyBzdGFibGUsIGRpc3RpbmN0LWlzaCBjb2xvdXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKFxuICBtZXRhOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEsXG4gIHBhbGV0dGU6IHN0cmluZ1tdID0gREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhdXRob3JlZCA9IG1ldGEuY29sb3JzO1xuICByZXR1cm4gbWV0YS5jYXRlZ29yaWVzLm1hcCgobmFtZSwgaSkgPT4ge1xuICAgIGNvbnN0IGdpdmVuID0gYXV0aG9yZWQ/LltpXTtcbiAgICBpZiAoZ2l2ZW4pIHJldHVybiBnaXZlbjtcbiAgICBpZiAoaSA8IHBhbGV0dGUubGVuZ3RoKSByZXR1cm4gcGFsZXR0ZVtpXTtcbiAgICByZXR1cm4gZmFsbGJhY2tDb2xvckZvcihuYW1lLCBwYWxldHRlKTtcbiAgfSk7XG59XG5cbi8qKiBDYXRlZ29yaWNhbCBjb2x1bW4g4oaSIGZsYXQgcGVyLXBvaW50IFJHQkEgKGxlbmd0aCBgNCAqIGNvZGVzLmxlbmd0aGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUNhdGVnb3JpY2FsKGNvZGVzOiBVaW50MTZBcnJheSwgb3B0czogQ2F0ZWdvcmljYWxFbmNvZGluZ09wdGlvbnMpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBuID0gY29kZXMubGVuZ3RoO1xuICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KG4gKiA0KTtcbiAgLy8gUmVzb2x2ZSBlYWNoIGNhdGVnb3J5IG9uY2Ug4oCUIHBhcnNpbmcgYSBoZXggc3RyaW5nIHBlciBwb2ludCB3b3VsZCBkb21pbmF0ZS5cbiAgY29uc3QgcmdiID0gb3B0cy5jb2xvcnMubWFwKHBhcnNlSGV4KTtcbiAgY29uc3QgbWlzc2luZyA9IG9wdHMubWlzc2luZ0NvbG9yID8/IE1JU1NJTkdfQ09MT1I7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgY29uc3QgY29kZSA9IGNvZGVzW2ldO1xuICAgIGNvbnN0IGMgPSBjb2RlID09PSBOT19DQVRFR09SWSB8fCBjb2RlID49IHJnYi5sZW5ndGggPyBtaXNzaW5nIDogcmdiW2NvZGVdO1xuICAgIGNvbnN0IG8gPSBpICogNDtcbiAgICBvdXRbb10gPSBjWzBdIC8gMjU1O1xuICAgIG91dFtvICsgMV0gPSBjWzFdIC8gMjU1O1xuICAgIG91dFtvICsgMl0gPSBjWzJdIC8gMjU1O1xuICAgIC8vIEEgcG9pbnQgd2l0aCBubyBjYXRlZ29yeSBpcyBiYWNrZ3JvdW5kIGJ5IGRlZmluaXRpb24g4oCUIG5ldmVyIGVtcGhhc2lzZWQuXG4gICAgb3V0W28gKyAzXSA9XG4gICAgICBjb2RlID09PSBOT19DQVRFR09SWVxuICAgICAgICA/IE1hdGgubWluKGFscGhhQXQoaSwgb3B0cyksIG9wdHMubXV0ZWRPcGFjaXR5ID8/IERFRkFVTFRfTVVURURfT1BBQ0lUWSlcbiAgICAgICAgOiBhbHBoYUF0KGksIG9wdHMpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBDb250aW51b3VzIGNvbHVtbiAvIGdlbmUgdmVjdG9yIOKGkiBmbGF0IHBlci1wb2ludCBSR0JBLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUNvbnRpbnVvdXModmFsdWVzOiBGbG9hdDMyQXJyYXksIG9wdHM6IENvbnRpbnVvdXNFbmNvZGluZ09wdGlvbnMpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aDtcbiAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShuICogNCk7XG4gIGNvbnN0IG1pc3NpbmcgPSBvcHRzLm1pc3NpbmdDb2xvciA/PyBNSVNTSU5HX0NPTE9SO1xuICBjb25zdCBsdXQgPSBvcHRzLmx1dDtcbiAgY29uc3QgbG8gPSBvcHRzLmxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgb3B0cy5taW4pKSA6IG9wdHMubWluO1xuICBjb25zdCBoaSA9IG9wdHMubG9nID8gTWF0aC5sb2cxcChNYXRoLm1heCgwLCBvcHRzLm1heCkpIDogb3B0cy5tYXg7XG4gIC8vIEEgZGVnZW5lcmF0ZSB3aW5kb3cgKGFsbCB2YWx1ZXMgZXF1YWwpIG1hcHMgZXZlcnl0aGluZyB0byB0aGUgTFVUIG1pZHBvaW50XG4gIC8vIHJhdGhlciB0aGFuIGRpdmlkaW5nIGJ5IHplcm8uXG4gIGNvbnN0IHNwYW4gPSBoaSAtIGxvO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IHJhdyA9IHZhbHVlc1tpXTtcbiAgICBjb25zdCBvID0gaSAqIDQ7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocmF3KSkge1xuICAgICAgb3V0W29dID0gbWlzc2luZ1swXSAvIDI1NTtcbiAgICAgIG91dFtvICsgMV0gPSBtaXNzaW5nWzFdIC8gMjU1O1xuICAgICAgb3V0W28gKyAyXSA9IG1pc3NpbmdbMl0gLyAyNTU7XG4gICAgICBvdXRbbyArIDNdID0gb3B0cy5tdXRlZE9wYWNpdHkgPz8gREVGQVVMVF9NVVRFRF9PUEFDSVRZO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHYgPSBvcHRzLmxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgcmF3KSkgOiByYXc7XG4gICAgY29uc3QgdCA9IHNwYW4gPiAwID8gKHYgLSBsbykgLyBzcGFuIDogMC41O1xuICAgIGNvbnN0IGlkeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0ICogMjU1KSkpO1xuICAgIGNvbnN0IGMgPSBsdXRbaWR4XSA/PyBtaXNzaW5nO1xuICAgIG91dFtvXSA9IGNbMF0gLyAyNTU7XG4gICAgb3V0W28gKyAxXSA9IGNbMV0gLyAyNTU7XG4gICAgb3V0W28gKyAyXSA9IGNbMl0gLyAyNTU7XG4gICAgb3V0W28gKyAzXSA9IGFscGhhQXQoaSwgb3B0cyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb250cmFzdCB3aW5kb3cgZnJvbSBwZXJjZW50aWxlcyBvZiB0aGUgZmluaXRlIHZhbHVlcyDigJQgdGhlIENvc014XG4gKiBcImNhcCBvdXRsaWVycyBhdCBwZXJjZW50aWxlcyB0byBpbXByb3ZlIGNvbnRyYXN0XCIgcnVsZS4gYGxvYC9gaGlgIGFyZVxuICogZnJhY3Rpb25zICgwLjAxIC8gMC45OSBjbGlwcyB0aGUgZXh0cmVtZSAxJSBhdCBlYWNoIGVuZCkuXG4gKlxuICogUmV0dXJucyBgWzAsIDFdYCBmb3IgYW4gZW1wdHkgb3IgYWxsLW1pc3NpbmcgdmVjdG9yIHNvIGNhbGxlcnMgYWx3YXlzIGdldCBhXG4gKiB1c2FibGUgd2luZG93LiBBIGxhcmdlIHZlY3RvciBpcyB3aW5kb3dlZCBmcm9tIGFuIGV2ZW4gc2FtcGxlIG9mIGl0IOKAlCBzZWVcbiAqIGBzcGF0aWFsL3N0YXRzLnRzYCDigJQgYmVjYXVzZSB0aGlzIHJ1bnMgb24gZXZlcnkgcmVjb2xvdXIsIGFuZCBzb3J0aW5nIG1pbGxpb25zXG4gKiBvZiB2YWx1ZXMgZWFjaCB0aW1lIGNvc3QgbW9zdCBvZiBhIHNlY29uZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0V2luZG93KHZhbHVlczogRmxvYXQzMkFycmF5LCBsbyA9IDAuMDEsIGhpID0gMC45OSk6IFtudW1iZXIsIG51bWJlcl0ge1xuICByZXR1cm4gcGVyY2VudGlsZVdpbmRvdyh2YWx1ZXMsIGxvLCBoaSk7XG59XG5cbi8qKlxuICogTWFya2VyIHNpemVzIGZvciB0aGUgcG9pbnRzIGxheWVyLiBuYXBhcmktanMgYFBvaW50c0xheWVyLnNpemVgIGlzIGFcbiAqICoqZGlhbWV0ZXIqKiBpbiBkYXRhIHVuaXRzIHdoaWxlIGBTcGF0aWFsT2JzZXJ2YXRpb25zLnJhZGl1c2AgaXMgYSByYWRpdXMg4oCUXG4gKiB0aGUgZG91YmxpbmcgbGl2ZXMgaGVyZSBzbyBubyBjYWxsIHNpdGUgaGFzIHRvIHJlbWVtYmVyIGl0LlxuICpcbiAqIGBmYWxsYmFja1JhZGl1c2AgY292ZXJzIGEgZGF0YXNldCB0aGF0IGRlY2xhcmVzIG5vIHJhZGl1cyAoc2VnbWVudGVkIGNlbGxzXG4gKiBvZnRlbiBkb24ndCk7IGl0IGlzIGluIGltYWdlIHBpeGVscywgbGlrZSBldmVyeXRoaW5nIGVsc2UgaW4gdGhpcyBzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlckRpYW1ldGVycyhvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIGZhbGxiYWNrUmFkaXVzID0gNCk6IG51bWJlciB8IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IHIgPSBvYnNlcnZhdGlvbnMucmFkaXVzO1xuICBpZiAodHlwZW9mIHIgPT09ICdudW1iZXInKSByZXR1cm4gciAqIDI7XG4gIGlmIChyIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShyLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSByW2ldICogMjtcbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIHJldHVybiBmYWxsYmFja1JhZGl1cyAqIDI7XG59XG5cbi8qKiBDb252ZW5pZW5jZTogYSAyNTYtZW50cnkgTFVUIGZvciBhIGNvbG9ybWFwIHZhbHVlLCBmYWxsaW5nIGJhY2sgdG8gVmlyaWRpcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsdXRGb3IoY29sb3JtYXBWYWx1ZTogdW5rbm93biwgcmV2ZXJzZSA9IGZhbHNlKTogUmdiW10ge1xuICByZXR1cm4gYnVpbGRDb2xvcm1hcEx1dChjb2xvcm1hcFZhbHVlLCByZXZlcnNlKSA/PyBidWlsZENvbG9ybWFwTHV0KCdWaXJpZGlzJywgcmV2ZXJzZSkhO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGV2ZXJ5IGVudHJ5IG9mIGEgTFVUIGlzIGEgbmV1dHJhbCBncmV5LiBUZXN0ZWQgb24gdGhlIFZBTFVFUyByYXRoZXJcbiAqICB0aGFuIHRoZSBjb2xvcm1hcCdzIG5hbWUsIHNvIGEgcmV2ZXJzZWQgb3IgcmVuYW1lZCBncmV5IHJhbXAgc3RpbGwgY291bnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR3JheXNjYWxlTHV0KGx1dDogcmVhZG9ubHkgUmdiW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGx1dC5ldmVyeSgoW3IsIGcsIGJdKSA9PiByID09PSBnICYmIGcgPT09IGIpO1xufVxuXG4vKipcbiAqIExVVCBmb3IgYSBzcGF0aWFsIENPTlRJTlVPVVMgZW5jb2Rpbmcg4oCUIGEgZ2VuZSwgYSBudW1lcmljIGNvbHVtbi5cbiAqXG4gKiBgb3ZlcnJpZGVgIGlzIHRoZSBjYWxsZXIncyBleHBsaWNpdCBjaG9pY2UgYW5kIHdpbnMgb3V0cmlnaHQsIGdyZXkgaW5jbHVkZWQ6IGFcbiAqIGdyZXkgcmFtcCBwaWNrZWQgRk9SIHRoZSBkYXRhIGlzIGEgZGVjaXNpb24sIG5vdCB0aGUgaW1hZ2UncyBjb2xvcm1hcCBsZWFraW5nXG4gKiBpbi5cbiAqXG4gKiBXaXRob3V0IG9uZSwgdGhlIGRpc3BsYXkgY29sb3JtYXAg4oCUIHVubGVzcyB0aGF0IGNvbG9ybWFwIGlzIGdyYXlzY2FsZS4gVGhlXG4gKiB0aXNzdWUgdW5kZXJuZWF0aCBpcyBncmF5c2NhbGUsIHNvIGEgZ3JleSBvdmVybGF5IG9mIGEgbWVhc3VyZW1lbnQgaXNcbiAqIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIGFuYXRvbXkgaXQgaXMgZHJhd24gb3ZlciwgYW5kIHRoZSByZWFkZXIgY2Fubm90IHRlbGxcbiAqIHdoaWNoIGNoYW5uZWwgYSBicmlnaHQgcGl4ZWwgYmVsb25ncyB0by4gVmlyaWRpcyBpcyB0aGVuIHRoZSBmYWxsYmFjaywgd2hpY2ggaXNcbiAqIHdoYXQgdGhlIENvc014IGd1aWRhbmNlIHByZXNjcmliZXMgZm9yIGNvbnRpbnVvdXMgdmFsdWVzIGFueXdheS5cbiAqXG4gKiBTaGFyZWQgYnkgdGhlIG1hcmtlcnMsIGJvdGggZ2VuZSBtYXBzIGFuZCB0aGUgcGFuZWwncyBjb2xvdXIgYmFyLCBzbyBub25lIG9mXG4gKiB0aGVtIGNhbiBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY29sb3VyIG1lYW5zLCB3aGljaGV2ZXIgd2F5IHRoZSBjaG9pY2UgZmFsbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF0aWFsQ29udGludW91c0x1dChcbiAgY29sb3JtYXBWYWx1ZTogdW5rbm93bixcbiAgcmV2ZXJzZSA9IGZhbHNlLFxuICBvdmVycmlkZT86IENvbG9ybWFwVmFsdWUgfCBudWxsLFxuKTogUmdiW10ge1xuICAvLyBBbiBpbmxpbmUgc2NhbGUgaXMgYW4gYXJyYXksIHNvIGVtcHRpbmVzcyBoYXMgdG8gYmUgY2hlY2tlZCBhcyB3ZWxsIGFzXG4gIC8vIHByZXNlbmNlOiBgW11gIGlzIHRydXRoeSBhbmQgd291bGQgcmVzb2x2ZSB0byB0aGUgZmFsbGJhY2sgTFVUIHNpbGVudGx5LlxuICBjb25zdCBjaG9zZW4gPSBBcnJheS5pc0FycmF5KG92ZXJyaWRlKSA/IChvdmVycmlkZS5sZW5ndGggPyBvdmVycmlkZSA6IG51bGwpIDogb3ZlcnJpZGU7XG4gIGlmIChjaG9zZW4pIHJldHVybiBsdXRGb3IoY2hvc2VuLCByZXZlcnNlKTtcbiAgY29uc3QgbHV0ID0gbHV0Rm9yKGNvbG9ybWFwVmFsdWUsIHJldmVyc2UpO1xuICByZXR1cm4gaXNHcmF5c2NhbGVMdXQobHV0KSA/IGJ1aWxkQ29sb3JtYXBMdXQoJ1ZpcmlkaXMnLCByZXZlcnNlKSEgOiBsdXQ7XG59XG4iXX0=
|
|
208
|
+
/**
|
|
209
|
+
* Fade the transcripts outside a selection, as the cells and markers are: while `selected` (an
|
|
210
|
+
* observation mask) selects any cell, every packed-RGBA entry of `rgba` whose cell (`ownerOf(i)`)
|
|
211
|
+
* is not selected, or that is in no cell, has its alpha scaled to {@link DEFAULT_MUTED_OPACITY}.
|
|
212
|
+
* The selection's own transcripts keep their colour. Nothing changes without a selection.
|
|
213
|
+
*/
|
|
214
|
+
export function fadeOutsideSelection(rgba, count, ownerOf, selected) {
|
|
215
|
+
if (!selected || selected.count === 0)
|
|
216
|
+
return;
|
|
217
|
+
const mask = selected.mask;
|
|
218
|
+
for (let i = 0; i < count; i++) {
|
|
219
|
+
const o = ownerOf(i);
|
|
220
|
+
if (o !== NO_OBSERVATION && o >= 0 && o < mask.length && mask[o])
|
|
221
|
+
continue;
|
|
222
|
+
rgba[4 * i + 3] *= DEFAULT_MUTED_OPACITY;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1lbmNvZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBRUwsV0FBVyxFQUNYLGNBQWMsR0FFZixNQUFNLHVDQUF1QyxDQUFDO0FBRS9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQTRCM0MsaUZBQWlGO0FBQ2pGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFbEQsc0ZBQXNGO0FBQ3RGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQztBQUUxQzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFhO0lBQ25ELFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7Q0FDVixDQUFDO0FBZ0NGO3NHQUNzRztBQUN0RyxNQUFNLFVBQVUsUUFBUSxDQUFDLEdBQVc7SUFDbEMsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksYUFBYSxDQUFDO0FBQzdDLENBQUM7QUFFRCxT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bG9ybWFwTHV0IH0gZnJvbSAnLi4vY29udHJhY3RzL2NvbG9ybWFwLWx1dCc7XG5pbXBvcnQgeyBwYXJzZUNzc0NvbG9yIH0gZnJvbSAnLi4vY29udHJhY3RzL2NvbG9yJztcbmltcG9ydCB7IGZhbGxiYWNrQ29sb3JGb3IgfSBmcm9tICcuLi9zdG9yZS9jbGFzcy1jb2xvci51dGlsJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgTk9fQ0FURUdPUlksXG4gIE5PX09CU0VSVkFUSU9OLFxuICBTcGF0aWFsT2JzZXJ2YXRpb25zLFxufSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IENvbG9ybWFwVmFsdWUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBwZXJjZW50aWxlV2luZG93IH0gZnJvbSAnLi9zdGF0cyc7XG5cbi8qKlxuICogVHVybmluZyBzcGF0aWFsLW9taWNzIGNvbHVtbnMgaW50byBwZXItcG9pbnQgdmlzdWFsIGF0dHJpYnV0ZXMuXG4gKlxuICogUHVyZSDigJQgbm8gQW5ndWxhciwgbm8gUnhKUywgbm8gcmVuZGVyZXIg4oCUIGxpa2UgYHBsb3RseS10cmFjZS1idWlsZGVycy50c2AsIHNvXG4gKiB0aGUgZW5jb2RpbmdzIGFyZSB0ZXN0YWJsZSBvbiB0aGVpciBvd24gYW5kIHNoYXJlZCBieSBhbnkgYmFja2VuZCB0aGF0IGdyb3dzXG4gKiBhIHNwYXRpYWwgbW9kZS5cbiAqXG4gKiBUaGUgcnVsZXMgaGVyZSBhcmUgdGhlIG9uZXMgdGhlIENvc014IGFuYWx5c2lzIGd1aWRhbmNlIHByZXNjcmliZXMsIG1hZGVcbiAqIGV4cGxpY2l0IHJhdGhlciB0aGFuIGxlZnQgdG8gZWFjaCBjYWxsIHNpdGU6XG4gKiAgLSBjb3VudC1saWtlIGNvbHVtbnMgcmVhZCBvbiBhICoqbG9nKiogc2NhbGUgKGxpbmVhciBjb2xsYXBzZXMgdGhlbSBhZ2FpbnN0IGFcbiAqICAgIGZldyBicmlnaHQgb3V0bGllcnMpO1xuICogIC0gY29udHJhc3Qgd2luZG93cyBjb21lIGZyb20gKipwZXJjZW50aWxlcyoqLCBub3QgbWluL21heCwgc28gYSBzaW5nbGVcbiAqICAgIHNhdHVyYXRlZCBzcG90IGRvZXNuJ3QgZmxhdHRlbiBldmVyeXRoaW5nIGVsc2U7XG4gKiAgLSBjb250ZXh0IGlzIGtlcHQgYnkgKiptdXRpbmcqKiByYXRoZXIgdGhhbiBoaWRpbmcg4oCUIGJhY2tncm91bmQgcG9pbnRzIHN0YXlcbiAqICAgIHZpc2libGUgYXQgbG93IGFscGhhIHNvIHRoZSB0aXNzdWUgc2hhcGUgc3Vydml2ZXMuXG4gKlxuICogQ09MT1VSIFJFUFJFU0VOVEFUSU9OXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5dGhpbmcgaXMgYSBmbGF0IGBGbG9hdDMyQXJyYXlgIG9mIGBbcixnLGIsYSwg4oCmXWAgaW4gMC4uMSDigJQgb25lXG4gKiBhbGxvY2F0aW9uIGZvciBOIHBvaW50cywgR1BVLXVwbG9hZCBzaGFwZWQuIG5hcGFyaS1qcyAo4omlIDAuMTUpXG4gKiBgUG9pbnRzTGF5ZXIuZmFjZUNvbG9yYCBhbmQgYFBvaW50czNETGF5ZXIuY29sb3JzYCB0YWtlIGl0IGFzIGlzLlxuICovXG5cbi8qKiBPbmUgUkdCQSBjb2xvdXIsIHIsIGcsIGIsIGEgaW4gMC4uMSAobmFwYXJpLWpzJ3MgYnJvYWRjYXN0IGNvbG91cikuICovXG5leHBvcnQgdHlwZSBSR0JBID0gW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbi8qKiBOZXV0cmFsIGdyZXkgZm9yIG9ic2VydmF0aW9ucyB3aXRoIG5vIHZhbHVlIChOYU4sIG9yIHtAbGluayBOT19DQVRFR09SWX0pLiAqL1xuZXhwb3J0IGNvbnN0IE1JU1NJTkdfQ09MT1I6IFJnYiA9IFsxNTAsIDE1MCwgMTUwXTtcblxuLyoqIERlZmF1bHQgYWxwaGEgZm9yIG11dGVkIChiYWNrZ3JvdW5kIC8gdW5zZWxlY3RlZCkgcG9pbnRzIOKAlCBDb3NNeC1zdHlsZSBjb250ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTVVURURfT1BBQ0lUWSA9IDAuMTU7XG5cbi8qKlxuICogRmFsbGJhY2sgY2F0ZWdvcmljYWwgcGFsZXR0ZS4gQ29sb3VyLWJsaW5kLXNhZmUgYW5kIHN0YWJsZSwgc28gYSBjYXRlZ29yeVxuICogd2l0aG91dCBhbiBhdXRob3JlZCBjb2xvdXIgc3RpbGwgbGFuZHMgc29tZXdoZXJlIHNlbnNpYmxlIGFuZCBsYW5kcyB0aGVyZVxuICogZXZlcnkgcnVuIChgZmFsbGJhY2tDb2xvckZvcmAgaGFzaGVzIHRoZSBuYW1lIOKAlCBzYW1lIG5hbWUsIHNhbWUgY29sb3VyKS5cbiAqIE9rYWJl4oCTSXRvIGFuZCB0aHJlZSBncmV5cywgdGhlbiB0d2VsdmUgbW9yZSAoVG9sJ3MgbXV0ZWQsIGEgZmV3IG9mIFBhaXJlZCksIHNvIGEgZ3JvdXBpbmcgb2YgdXBcbiAqIHRvIDIyIGdyb3VwcyAodGhlIE1FUkZJU0ggaWxldW0ncyAyMCBjZWxsIHR5cGVzKSBoYXMgbm8gdHdvIGFsaWtlOyB0aGUgZmlyc3QgdGVuIGNvbWUgZmlyc3QsIHNvIGFcbiAqIGdyb3VwaW5nIG9mIHRlbiBvciBmZXdlciBrZWVwcyBpdHMgY29sb3Vycy4gaml0LWJpb2Zvcm1hdHMnIGBTZWdtZW50YXRpb25SZWdpb25TZXQuUEFMRVRURWAgKGEgM0RcbiAqIHNlZ21lbnRhdGlvbidzIHJlZ2lvbiBzZXQsIGNvbG91cmVkIGF0IGNvbnZlcnNpb24pIG11c3Qgc3RheSB0aGlzLCBjb2xvdXIgZm9yIGNvbG91ci5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURTogc3RyaW5nW10gPSBbXG4gICcjMDA3MkIyJyxcbiAgJyNFNjlGMDAnLFxuICAnIzAwOUU3MycsXG4gICcjQ0M3OUE3JyxcbiAgJyM1NkI0RTknLFxuICAnI0Q1NUUwMCcsXG4gICcjRjBFNDQyJyxcbiAgJyMwMDAwMDAnLFxuICAnIzdGN0Y3RicsXG4gICcjQkZCRkJGJyxcbiAgJyM4ODIyNTUnLFxuICAnIzQ0QUE5OScsXG4gICcjMzMyMjg4JyxcbiAgJyNERENDNzcnLFxuICAnIzExNzczMycsXG4gICcjQUE0NDk5JyxcbiAgJyM2NjExMDAnLFxuICAnIzk5OTkzMycsXG4gICcjRTMxQTFDJyxcbiAgJyNGQjlBOTknLFxuICAnI0IyREY4QScsXG4gICcjNkEzRDlBJyxcbl07XG5cbmludGVyZmFjZSBNdXRlT3B0aW9ucyB7XG4gIC8qKiBBbHBoYSBmb3IgcG9pbnRzIHRoYXQgYXJlIG5vdCBtdXRlZC4gRGVmYXVsdCAxLiAqL1xuICBvcGFjaXR5PzogbnVtYmVyO1xuICAvKiogQWxwaGEgZm9yIG11dGVkIHBvaW50cy4gRGVmYXVsdCB7QGxpbmsgREVGQVVMVF9NVVRFRF9PUEFDSVRZfS4gKi9cbiAgbXV0ZWRPcGFjaXR5PzogbnVtYmVyO1xuICAvKiogYDFgIGF0IGluZGV4IGkgbXV0ZXMgb2JzZXJ2YXRpb24gaS4gQWJzZW50IOKHkiBub3RoaW5nIGlzIG11dGVkLiAqL1xuICBtdXRlZD86IFVpbnQ4QXJyYXkgfCBudWxsO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGVuY29kZUNhdGVnb3JpY2FsfTogYSBjb2xvdXIgcGVyIGNhdGVnb3J5LCBwbHVzIG11dGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcmljYWxFbmNvZGluZ09wdGlvbnMgZXh0ZW5kcyBNdXRlT3B0aW9ucyB7XG4gIC8qKiBQZXItY2F0ZWdvcnkgYCNycmdnYmJgLCBpbmRleC1hbGlnbmVkIHdpdGggdGhlIGNvbHVtbidzIGNhdGVnb3JpZXMuICovXG4gIGNvbG9yczogc3RyaW5nW107XG4gIC8qKiBDb2xvdXIgZm9yIHtAbGluayBOT19DQVRFR09SWX0uIERlZmF1bHQge0BsaW5rIE1JU1NJTkdfQ09MT1J9LiAqL1xuICBtaXNzaW5nQ29sb3I/OiBSZ2I7XG59XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgZW5jb2RlQ29udGludW91c306IGEgY29sb3JtYXAsIGEgY29udHJhc3Qgd2luZG93IGFuZCBzY2FsaW5nLCBwbHVzIG11dGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludW91c0VuY29kaW5nT3B0aW9ucyBleHRlbmRzIE11dGVPcHRpb25zIHtcbiAgLyoqIDI1Ni1lbnRyeSBSR0IgdGFibGUgZnJvbSB7QGxpbmsgYnVpbGRDb2xvcm1hcEx1dH0uICovXG4gIGx1dDogUmdiW107XG4gIC8qKiBDb250cmFzdCB3aW5kb3cgaW4gVkFMVUUgdW5pdHMgKHByZS1sb2cpLiAqL1xuICBtaW46IG51bWJlcjtcbiAgbWF4OiBudW1iZXI7XG4gIC8qKiBBcHBseSBgbG9nMXBgIHRvIHRoZSB2YWx1ZSBhbmQgdGhlIHdpbmRvdyBiZWZvcmUgbm9ybWFsaXNpbmcuICovXG4gIGxvZz86IGJvb2xlYW47XG4gIC8qKiBDb2xvdXIgZm9yIGBOYU5gLiBEZWZhdWx0IHtAbGluayBNSVNTSU5HX0NPTE9SfS4gKi9cbiAgbWlzc2luZ0NvbG9yPzogUmdiO1xufVxuXG4vKiogUGFyc2UgYSBDU1MgY29sb3VyIChgI3JnYmAgLyBgI3JyZ2diYmAsIHNlZSB7QGxpbmsgcGFyc2VDc3NDb2xvcn0pIHRvIDDigJMyNTUgUkdCOyB1bnBhcnNlYWJsZVxuICogIGlucHV0IGZhbGxzIGJhY2sgdG8gZ3JleS4gRXhwb3J0ZWQgc28gdGhlIHRpbGUgbGF5ZXJzIHBhcnNlIHBhbGV0dGVzIGV4YWN0bHkgYXMgdGhlIG1hcmtlcnMgZG8uICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIZXgoaGV4OiBzdHJpbmcpOiBSZ2Ige1xuICByZXR1cm4gcGFyc2VDc3NDb2xvcihoZXgpID8/IE1JU1NJTkdfQ09MT1I7XG59XG5cbmZ1bmN0aW9uIGFscGhhQXQoaTogbnVtYmVyLCBvcHRzOiBNdXRlT3B0aW9ucyk6IG51bWJlciB7XG4gIGNvbnN0IG9uID0gb3B0cy5vcGFjaXR5ID8/IDE7XG4gIGNvbnN0IG9mZiA9IG9wdHMubXV0ZWRPcGFjaXR5ID8/IERFRkFVTFRfTVVURURfT1BBQ0lUWTtcbiAgcmV0dXJuIG9wdHMubXV0ZWQgJiYgb3B0cy5tdXRlZFtpXSA/IG9mZiA6IG9uO1xufVxuXG4vKipcbiAqIFBlci1jYXRlZ29yeSBjb2xvdXJzOiB0aGUgY29sdW1uJ3MgYXV0aG9yZWQgYGNvbG9yc2Agd2hlcmUgcHJlc2VudCAoc28gdGhlXG4gKiB2aWV3ZXIgbWF0Y2hlcyB0aGUgZmlndXJlcyB0aGUgc2FtZSBhbmFseXNpcyBwcm9kdWNlZCBlbHNld2hlcmUpLCBvdGhlcndpc2VcbiAqIHRoZSBwYWxldHRlIGJ5IHBvc2l0aW9uLCB3cmFwcGluZyB0aHJvdWdoIGEgbmFtZS1oYXNoIHBhc3QgaXRzIGVuZCBzbyBhXG4gKiA0MC1jbHVzdGVyIGNvbHVtbiBzdGlsbCBnZXRzIHN0YWJsZSwgZGlzdGluY3QtaXNoIGNvbG91cnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoXG4gIG1ldGE6IENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgcGFsZXR0ZTogc3RyaW5nW10gPSBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEUsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGF1dGhvcmVkID0gbWV0YS5jb2xvcnM7XG4gIHJldHVybiBtZXRhLmNhdGVnb3JpZXMubWFwKChuYW1lLCBpKSA9PiB7XG4gICAgY29uc3QgZ2l2ZW4gPSBhdXRob3JlZD8uW2ldO1xuICAgIGlmIChnaXZlbikgcmV0dXJuIGdpdmVuO1xuICAgIGlmIChpIDwgcGFsZXR0ZS5sZW5ndGgpIHJldHVybiBwYWxldHRlW2ldO1xuICAgIHJldHVybiBmYWxsYmFja0NvbG9yRm9yKG5hbWUsIHBhbGV0dGUpO1xuICB9KTtcbn1cblxuLyoqIFRoZSB1c2VyJ3MgZ3JvdXAgY29sb3VyczogYnkgY29sdW1uIG5hbWUsIHRoZW4gY2F0ZWdvcnkgKHNlZSBgU3BhdGlhbFZpZXdTdGF0ZS5ncm91cENvbG9yc2ApLiAqL1xuZXhwb3J0IHR5cGUgR3JvdXBDb2xvck92ZXJyaWRlcyA9IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+Pj47XG5cbi8qKlxuICogQ2F0ZWdvcmljYWwgY29sdW1uIGBjb2x1bW5gJ3MgY29sb3VycyAoe0BsaW5rIHJlc29sdmVDYXRlZ29yeUNvbG9yc30pIHdpdGggdGhlIHVzZXIncyBjaG9pY2VzXG4gKiBmb3IgaXRzIGdyb3VwcyBvdmVyIHRoZW0uIEV2ZXJ5IHBsYWNlIGEgZ3JvdXBpbmcgaXMgY29sb3VyZWQgZ29lcyB0aHJvdWdoIHRoaXMsIHNvIGEgZ3JvdXBcbiAqIHJlY29sb3VyZWQgaW4gdGhlIGxpc3QgaXMgdGhhdCBjb2xvdXIgb24gdGhlIGNlbGxzLCB0aGUgbWFya2VycywgdGhlIGxlZ2VuZCBhbmQgdGhlIGNoYXJ0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5Q29sb3JzRm9yKFxuICBjb2x1bW46IHN0cmluZyxcbiAgbWV0YTogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLFxuICBvdmVycmlkZXM/OiBHcm91cENvbG9yT3ZlcnJpZGVzIHwgbnVsbCxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYmFzZSA9IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhtZXRhKTtcbiAgY29uc3Qgb3duID0gb3ZlcnJpZGVzPy5bY29sdW1uXTtcbiAgaWYgKCFvd24pIHJldHVybiBiYXNlO1xuICByZXR1cm4gbWV0YS5jYXRlZ29yaWVzLm1hcCgobmFtZSwgaSkgPT4gb3duW25hbWVdIHx8IGJhc2VbaV0pO1xufVxuXG4vKiogV2hhdCBhIGNhY2hlIGtleWVkIG9uIGEgZ3JvdXBpbmcncyBjb2xvdXJzIG11c3QgaW5jbHVkZSBvZiB0aGUgdXNlcidzIGNob2ljZXMgZm9yIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQ29sb3JzS2V5KGNvbHVtbjogc3RyaW5nIHwgbnVsbCwgb3ZlcnJpZGVzPzogR3JvdXBDb2xvck92ZXJyaWRlcyB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCBvd24gPSBjb2x1bW4gPyBvdmVycmlkZXM/Lltjb2x1bW5dIDogdW5kZWZpbmVkO1xuICByZXR1cm4gb3duID8gSlNPTi5zdHJpbmdpZnkob3duKSA6ICcnO1xufVxuXG4vKiogQ2F0ZWdvcmljYWwgY29sdW1uIOKGkiBmbGF0IHBlci1wb2ludCBSR0JBIChsZW5ndGggYDQgKiBjb2Rlcy5sZW5ndGhgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVDYXRlZ29yaWNhbChjb2RlczogVWludDE2QXJyYXksIG9wdHM6IENhdGVnb3JpY2FsRW5jb2RpbmdPcHRpb25zKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbiA9IGNvZGVzLmxlbmd0aDtcbiAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShuICogNCk7XG4gIC8vIFJlc29sdmUgZWFjaCBjYXRlZ29yeSBvbmNlIOKAlCBwYXJzaW5nIGEgaGV4IHN0cmluZyBwZXIgcG9pbnQgd291bGQgZG9taW5hdGUuXG4gIGNvbnN0IHJnYiA9IG9wdHMuY29sb3JzLm1hcChwYXJzZUhleCk7XG4gIGNvbnN0IG1pc3NpbmcgPSBvcHRzLm1pc3NpbmdDb2xvciA/PyBNSVNTSU5HX0NPTE9SO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBjb2Rlc1tpXTtcbiAgICBjb25zdCBjID0gY29kZSA9PT0gTk9fQ0FURUdPUlkgfHwgY29kZSA+PSByZ2IubGVuZ3RoID8gbWlzc2luZyA6IHJnYltjb2RlXTtcbiAgICBjb25zdCBvID0gaSAqIDQ7XG4gICAgb3V0W29dID0gY1swXSAvIDI1NTtcbiAgICBvdXRbbyArIDFdID0gY1sxXSAvIDI1NTtcbiAgICBvdXRbbyArIDJdID0gY1syXSAvIDI1NTtcbiAgICAvLyBBIHBvaW50IHdpdGggbm8gY2F0ZWdvcnkgaXMgYmFja2dyb3VuZCBieSBkZWZpbml0aW9uIOKAlCBuZXZlciBlbXBoYXNpc2VkLlxuICAgIG91dFtvICsgM10gPVxuICAgICAgY29kZSA9PT0gTk9fQ0FURUdPUllcbiAgICAgICAgPyBNYXRoLm1pbihhbHBoYUF0KGksIG9wdHMpLCBvcHRzLm11dGVkT3BhY2l0eSA/PyBERUZBVUxUX01VVEVEX09QQUNJVFkpXG4gICAgICAgIDogYWxwaGFBdChpLCBvcHRzKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogQ29udGludW91cyBjb2x1bW4gLyBnZW5lIHZlY3RvciDihpIgZmxhdCBwZXItcG9pbnQgUkdCQS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVDb250aW51b3VzKHZhbHVlczogRmxvYXQzMkFycmF5LCBvcHRzOiBDb250aW51b3VzRW5jb2RpbmdPcHRpb25zKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkobiAqIDQpO1xuICBjb25zdCBtaXNzaW5nID0gb3B0cy5taXNzaW5nQ29sb3IgPz8gTUlTU0lOR19DT0xPUjtcbiAgY29uc3QgbHV0ID0gb3B0cy5sdXQ7XG4gIGNvbnN0IGxvID0gb3B0cy5sb2cgPyBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIG9wdHMubWluKSkgOiBvcHRzLm1pbjtcbiAgY29uc3QgaGkgPSBvcHRzLmxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgb3B0cy5tYXgpKSA6IG9wdHMubWF4O1xuICAvLyBBIGRlZ2VuZXJhdGUgd2luZG93IChhbGwgdmFsdWVzIGVxdWFsKSBtYXBzIGV2ZXJ5dGhpbmcgdG8gdGhlIExVVCBtaWRwb2ludFxuICAvLyByYXRoZXIgdGhhbiBkaXZpZGluZyBieSB6ZXJvLlxuICBjb25zdCBzcGFuID0gaGkgLSBsbztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCByYXcgPSB2YWx1ZXNbaV07XG4gICAgY29uc3QgbyA9IGkgKiA0O1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHJhdykpIHtcbiAgICAgIG91dFtvXSA9IG1pc3NpbmdbMF0gLyAyNTU7XG4gICAgICBvdXRbbyArIDFdID0gbWlzc2luZ1sxXSAvIDI1NTtcbiAgICAgIG91dFtvICsgMl0gPSBtaXNzaW5nWzJdIC8gMjU1O1xuICAgICAgb3V0W28gKyAzXSA9IG9wdHMubXV0ZWRPcGFjaXR5ID8/IERFRkFVTFRfTVVURURfT1BBQ0lUWTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2ID0gb3B0cy5sb2cgPyBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIHJhdykpIDogcmF3O1xuICAgIGNvbnN0IHQgPSBzcGFuID4gMCA/ICh2IC0gbG8pIC8gc3BhbiA6IDAuNTtcbiAgICBjb25zdCBpZHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodCAqIDI1NSkpKTtcbiAgICBjb25zdCBjID0gbHV0W2lkeF0gPz8gbWlzc2luZztcbiAgICBvdXRbb10gPSBjWzBdIC8gMjU1O1xuICAgIG91dFtvICsgMV0gPSBjWzFdIC8gMjU1O1xuICAgIG91dFtvICsgMl0gPSBjWzJdIC8gMjU1O1xuICAgIG91dFtvICsgM10gPSBhbHBoYUF0KGksIG9wdHMpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ29udHJhc3Qgd2luZG93IGZyb20gcGVyY2VudGlsZXMgb2YgdGhlIGZpbml0ZSB2YWx1ZXMg4oCUIHRoZSBDb3NNeFxuICogXCJjYXAgb3V0bGllcnMgYXQgcGVyY2VudGlsZXMgdG8gaW1wcm92ZSBjb250cmFzdFwiIHJ1bGUuIGBsb2AvYGhpYCBhcmVcbiAqIGZyYWN0aW9ucyAoMC4wMSAvIDAuOTkgY2xpcHMgdGhlIGV4dHJlbWUgMSUgYXQgZWFjaCBlbmQpLlxuICpcbiAqIFJldHVybnMgYFswLCAxXWAgZm9yIGFuIGVtcHR5IG9yIGFsbC1taXNzaW5nIHZlY3RvciBzbyBjYWxsZXJzIGFsd2F5cyBnZXQgYVxuICogdXNhYmxlIHdpbmRvdy4gQSBsYXJnZSB2ZWN0b3IgaXMgd2luZG93ZWQgZnJvbSBhbiBldmVuIHNhbXBsZSBvZiBpdCDigJQgc2VlXG4gKiBgc3BhdGlhbC9zdGF0cy50c2Ag4oCUIGJlY2F1c2UgdGhpcyBydW5zIG9uIGV2ZXJ5IHJlY29sb3VyLCBhbmQgc29ydGluZyBtaWxsaW9uc1xuICogb2YgdmFsdWVzIGVhY2ggdGltZSBjb3N0IG1vc3Qgb2YgYSBzZWNvbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFzdFdpbmRvdyh2YWx1ZXM6IEZsb2F0MzJBcnJheSwgbG8gPSAwLjAxLCBoaSA9IDAuOTkpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgcmV0dXJuIHBlcmNlbnRpbGVXaW5kb3codmFsdWVzLCBsbywgaGkpO1xufVxuXG4vKipcbiAqIE1hcmtlciBzaXplcyBmb3IgdGhlIHBvaW50cyBsYXllci4gbmFwYXJpLWpzIGBQb2ludHNMYXllci5zaXplYCBpcyBhXG4gKiAqKmRpYW1ldGVyKiogaW4gZGF0YSB1bml0cyB3aGlsZSBgU3BhdGlhbE9ic2VydmF0aW9ucy5yYWRpdXNgIGlzIGEgcmFkaXVzIOKAlFxuICogdGhlIGRvdWJsaW5nIGxpdmVzIGhlcmUgc28gbm8gY2FsbCBzaXRlIGhhcyB0byByZW1lbWJlciBpdC5cbiAqXG4gKiBgZmFsbGJhY2tSYWRpdXNgIGNvdmVycyBhIGRhdGFzZXQgdGhhdCBkZWNsYXJlcyBubyByYWRpdXMgKHNlZ21lbnRlZCBjZWxsc1xuICogb2Z0ZW4gZG9uJ3QpOyBpdCBpcyBpbiBpbWFnZSBwaXhlbHMsIGxpa2UgZXZlcnl0aGluZyBlbHNlIGluIHRoaXMgc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJEaWFtZXRlcnMob2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBmYWxsYmFja1JhZGl1cyA9IDQpOiBudW1iZXIgfCBGbG9hdDMyQXJyYXkge1xuICBjb25zdCByID0gb2JzZXJ2YXRpb25zLnJhZGl1cztcbiAgaWYgKHR5cGVvZiByID09PSAnbnVtYmVyJykgcmV0dXJuIHIgKiAyO1xuICBpZiAociBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoci5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgci5sZW5ndGg7IGkrKykgb3V0W2ldID0gcltpXSAqIDI7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2tSYWRpdXMgKiAyO1xufVxuXG4vKiogQ29udmVuaWVuY2U6IGEgMjU2LWVudHJ5IExVVCBmb3IgYSBjb2xvcm1hcCB2YWx1ZSwgZmFsbGluZyBiYWNrIHRvIFZpcmlkaXMuICovXG5leHBvcnQgZnVuY3Rpb24gbHV0Rm9yKGNvbG9ybWFwVmFsdWU6IHVua25vd24sIHJldmVyc2UgPSBmYWxzZSk6IFJnYltdIHtcbiAgcmV0dXJuIGJ1aWxkQ29sb3JtYXBMdXQoY29sb3JtYXBWYWx1ZSwgcmV2ZXJzZSkgPz8gYnVpbGRDb2xvcm1hcEx1dCgnVmlyaWRpcycsIHJldmVyc2UpITtcbn1cblxuLyoqIFRydWUgd2hlbiBldmVyeSBlbnRyeSBvZiBhIExVVCBpcyBhIG5ldXRyYWwgZ3JleS4gVGVzdGVkIG9uIHRoZSBWQUxVRVMgcmF0aGVyXG4gKiAgdGhhbiB0aGUgY29sb3JtYXAncyBuYW1lLCBzbyBhIHJldmVyc2VkIG9yIHJlbmFtZWQgZ3JleSByYW1wIHN0aWxsIGNvdW50cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dyYXlzY2FsZUx1dChsdXQ6IHJlYWRvbmx5IFJnYltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBsdXQuZXZlcnkoKFtyLCBnLCBiXSkgPT4gciA9PT0gZyAmJiBnID09PSBiKTtcbn1cblxuLyoqXG4gKiBMVVQgZm9yIGEgc3BhdGlhbCBDT05USU5VT1VTIGVuY29kaW5nIOKAlCBhIGdlbmUsIGEgbnVtZXJpYyBjb2x1bW4uXG4gKlxuICogYG92ZXJyaWRlYCBpcyB0aGUgY2FsbGVyJ3MgZXhwbGljaXQgY2hvaWNlIGFuZCB3aW5zIG91dHJpZ2h0LCBncmV5IGluY2x1ZGVkOiBhXG4gKiBncmV5IHJhbXAgcGlja2VkIEZPUiB0aGUgZGF0YSBpcyBhIGRlY2lzaW9uLCBub3QgdGhlIGltYWdlJ3MgY29sb3JtYXAgbGVha2luZ1xuICogaW4uXG4gKlxuICogV2l0aG91dCBvbmUsIHRoZSBkaXNwbGF5IGNvbG9ybWFwIOKAlCB1bmxlc3MgdGhhdCBjb2xvcm1hcCBpcyBncmF5c2NhbGUuIFRoZVxuICogdGlzc3VlIHVuZGVybmVhdGggaXMgZ3JheXNjYWxlLCBzbyBhIGdyZXkgb3ZlcmxheSBvZiBhIG1lYXN1cmVtZW50IGlzXG4gKiBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSBhbmF0b215IGl0IGlzIGRyYXduIG92ZXIsIGFuZCB0aGUgcmVhZGVyIGNhbm5vdCB0ZWxsXG4gKiB3aGljaCBjaGFubmVsIGEgYnJpZ2h0IHBpeGVsIGJlbG9uZ3MgdG8uIFZpcmlkaXMgaXMgdGhlbiB0aGUgZmFsbGJhY2ssIHdoaWNoIGlzXG4gKiB3aGF0IHRoZSBDb3NNeCBndWlkYW5jZSBwcmVzY3JpYmVzIGZvciBjb250aW51b3VzIHZhbHVlcyBhbnl3YXkuXG4gKlxuICogU2hhcmVkIGJ5IHRoZSBtYXJrZXJzLCBib3RoIGdlbmUgbWFwcyBhbmQgdGhlIHBhbmVsJ3MgY29sb3VyIGJhciwgc28gbm9uZSBvZlxuICogdGhlbSBjYW4gZGlzYWdyZWUgYWJvdXQgd2hhdCBhIGNvbG91ciBtZWFucywgd2hpY2hldmVyIHdheSB0aGUgY2hvaWNlIGZhbGxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhdGlhbENvbnRpbnVvdXNMdXQoXG4gIGNvbG9ybWFwVmFsdWU6IHVua25vd24sXG4gIHJldmVyc2UgPSBmYWxzZSxcbiAgb3ZlcnJpZGU/OiBDb2xvcm1hcFZhbHVlIHwgbnVsbCxcbik6IFJnYltdIHtcbiAgLy8gQW4gaW5saW5lIHNjYWxlIGlzIGFuIGFycmF5LCBzbyBlbXB0aW5lc3MgaGFzIHRvIGJlIGNoZWNrZWQgYXMgd2VsbCBhc1xuICAvLyBwcmVzZW5jZTogYFtdYCBpcyB0cnV0aHkgYW5kIHdvdWxkIHJlc29sdmUgdG8gdGhlIGZhbGxiYWNrIExVVCBzaWxlbnRseS5cbiAgY29uc3QgY2hvc2VuID0gQXJyYXkuaXNBcnJheShvdmVycmlkZSkgPyAob3ZlcnJpZGUubGVuZ3RoID8gb3ZlcnJpZGUgOiBudWxsKSA6IG92ZXJyaWRlO1xuICBpZiAoY2hvc2VuKSByZXR1cm4gbHV0Rm9yKGNob3NlbiwgcmV2ZXJzZSk7XG4gIGNvbnN0IGx1dCA9IGx1dEZvcihjb2xvcm1hcFZhbHVlLCByZXZlcnNlKTtcbiAgcmV0dXJuIGlzR3JheXNjYWxlTHV0KGx1dCkgPyBidWlsZENvbG9ybWFwTHV0KCdWaXJpZGlzJywgcmV2ZXJzZSkhIDogbHV0O1xufVxuXG4vKipcbiAqIEZhZGUgdGhlIHRyYW5zY3JpcHRzIG91dHNpZGUgYSBzZWxlY3Rpb24sIGFzIHRoZSBjZWxscyBhbmQgbWFya2VycyBhcmU6IHdoaWxlIGBzZWxlY3RlZGAgKGFuXG4gKiBvYnNlcnZhdGlvbiBtYXNrKSBzZWxlY3RzIGFueSBjZWxsLCBldmVyeSBwYWNrZWQtUkdCQSBlbnRyeSBvZiBgcmdiYWAgd2hvc2UgY2VsbCAoYG93bmVyT2YoaSlgKVxuICogaXMgbm90IHNlbGVjdGVkLCBvciB0aGF0IGlzIGluIG5vIGNlbGwsIGhhcyBpdHMgYWxwaGEgc2NhbGVkIHRvIHtAbGluayBERUZBVUxUX01VVEVEX09QQUNJVFl9LlxuICogVGhlIHNlbGVjdGlvbidzIG93biB0cmFuc2NyaXB0cyBrZWVwIHRoZWlyIGNvbG91ci4gTm90aGluZyBjaGFuZ2VzIHdpdGhvdXQgYSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWRlT3V0c2lkZVNlbGVjdGlvbihcbiAgcmdiYTogRmxvYXQzMkFycmF5LFxuICBjb3VudDogbnVtYmVyLFxuICBvd25lck9mOiAoaTogbnVtYmVyKSA9PiBudW1iZXIsXG4gIHNlbGVjdGVkOiB7IG1hc2s6IFVpbnQ4QXJyYXk7IGNvdW50OiBudW1iZXIgfSB8IG51bGwsXG4pOiB2b2lkIHtcbiAgaWYgKCFzZWxlY3RlZCB8fCBzZWxlY3RlZC5jb3VudCA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBtYXNrID0gc2VsZWN0ZWQubWFzaztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY29uc3QgbyA9IG93bmVyT2YoaSk7XG4gICAgaWYgKG8gIT09IE5PX09CU0VSVkFUSU9OICYmIG8gPj0gMCAmJiBvIDwgbWFzay5sZW5ndGggJiYgbWFza1tvXSkgY29udGludWU7XG4gICAgcmdiYVs0ICogaSArIDNdICo9IERFRkFVTFRfTVVURURfT1BBQ0lUWTtcbiAgfVxufVxuIl19
|
|
@@ -48,4 +48,37 @@ export function hoverText(source, index) {
|
|
|
48
48
|
const unit = source.unit ? ` ${source.unit}` : '';
|
|
49
49
|
return [`${formatValue(value)}${unit}`, source.name];
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
/** The tooltip of cell `index`: its type, its id, the colouring's value (when not the type), measurements. */
|
|
52
|
+
export function cellText(info, index, color) {
|
|
53
|
+
if (!info || index < 0)
|
|
54
|
+
return null;
|
|
55
|
+
const code = info.codes?.[index];
|
|
56
|
+
const type = code === undefined ? undefined : info.categories[code];
|
|
57
|
+
const lines = [
|
|
58
|
+
type ?? 'Cell',
|
|
59
|
+
info.ids?.[index] !== undefined ? `Cell ${info.ids[index]}` : `Cell #${index + 1}`,
|
|
60
|
+
];
|
|
61
|
+
if (color && color.name !== info.typeName) {
|
|
62
|
+
const said = hoverText(color, index);
|
|
63
|
+
if (said)
|
|
64
|
+
lines.push(`${said[1]}: ${said[0]}`);
|
|
65
|
+
}
|
|
66
|
+
for (const m of info.measures) {
|
|
67
|
+
if (m.name === color?.name)
|
|
68
|
+
continue;
|
|
69
|
+
const v = m.values[index];
|
|
70
|
+
if (v !== undefined && Number.isFinite(v))
|
|
71
|
+
lines.push(`${m.name}: ${formatValue(v)}${m.unit ? ` ${m.unit}` : ''}`);
|
|
72
|
+
}
|
|
73
|
+
return lines;
|
|
74
|
+
}
|
|
75
|
+
/** The tooltip of a cell type's surface: its name (and title), and how many cells it has. */
|
|
76
|
+
export function cellTypeText(info, key, label) {
|
|
77
|
+
const lines = [label ?? key];
|
|
78
|
+
const code = info ? info.categories.indexOf(key) : -1;
|
|
79
|
+
const n = code >= 0 ? info?.counts?.[code] : undefined;
|
|
80
|
+
if (n !== undefined)
|
|
81
|
+
lines.push(`${n.toLocaleString()} cells${info?.typeName ? ` · ${info.typeName}` : ''}`);
|
|
82
|
+
return lines;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1ob3Zlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWhvdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBcUJILGdGQUFnRjtBQUNoRixTQUFTLFdBQVcsQ0FBQyxDQUFTO0lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLEdBQUcsSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBMEIsRUFBRSxLQUFhO0lBQ2pFLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pFLElBQUksS0FBSyxL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QUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN2RCxJQUFJLENBQUMsS0FBSyxTQUFTO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdoYXQgdG8gc2F5IGFib3V0IHRoZSBvYnNlcnZhdGlvbiB1bmRlciB0aGUgY3Vyc29yLlxuICpcbiAqIEEgY29sb3VyZWQgY2xvdWQgYW5zd2VycyBcImhvdyBpcyB0aGlzIGFubm90YXRpb24gZGlzdHJpYnV0ZWRcIjsgaXQgY2Fubm90IGFuc3dlclxuICogXCJ3aGljaCBjbGFzcyBpcyBUSEFUXCIg4oCUIHRoZSBsZWdlbmQgaGFzIDM0IGVudHJpZXMsIHNldmVyYWwgb2YgdGhlbSBzaW1pbGFyXG4gKiBjb2xvdXJzLCBhbmQgbWF0Y2hpbmcgYSBkb3QgdG8gYSBzd2F0Y2ggYnkgZXllIGlzIGV4YWN0bHkgdGhlIHRhc2sgYSB0b29sdGlwXG4gKiBleGlzdHMgdG8gcmVtb3ZlLlxuICpcbiAqIFB1cmUg4oCUIG5vIERPTSwgbm8gY2FtZXJhLCBubyBkYXRhIGFjY2Vzcy4gRmluZGluZyB0aGUgb2JzZXJ2YXRpb24gaXMgdGhlXG4gKiByZW5kZXJlcidzIChuYXBhcmktanMgcGlja3Mgb24gdGhlIGxheWVycyBpdCBkcmV3KTsgdGhpcyBpcyBzdHJpbmcgZm9ybWF0dGluZ1xuICogb3ZlciB0aGUgYWN0aXZlIGNvbG91ciBzb3VyY2UsIHNvIGl0IGlzIHRlc3RlZCBkaXJlY3RseS5cbiAqL1xuXG4vKiogVGhlIGNvbG91ciBzb3VyY2UgYSB0b29sdGlwIGRlc2NyaWJlcywgYXMgdGhlIHJlbmRlcmVyIGFscmVhZHkgaGFzIGl0LiAqL1xuZXhwb3J0IHR5cGUgSG92ZXJTb3VyY2UgPVxuICB8IHtcbiAgICAgIGtpbmQ6ICdjYXRlZ29yaWNhbCc7XG4gICAgICAvKiogQ29sdW1uIG5hbWUsIGZvciB0aGUgdG9vbHRpcCdzIGZpcnN0IGxpbmUuICovXG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjYXRlZ29yaWVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICAgIC8qKiBQZXItb2JzZXJ2YXRpb24gY2F0ZWdvcnkgaW5kZXgsIG9yIGBOT19DQVRFR09SWWAuICovXG4gICAgICBjb2RlczogVWludDE2QXJyYXk7XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6ICdjb250aW51b3VzJztcbiAgICAgIC8qKiBDb2x1bW4gb3IgZ2VuZSBuYW1lLiAqL1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICAvKiogVW5pdCBmb3IgdGhlIHZhbHVlLCB3aGVuIHRoZSBkYXRhc2V0IGRlY2xhcmVzIG9uZS4gKi9cbiAgICAgIHVuaXQ/OiBzdHJpbmc7XG4gICAgfTtcblxuLyoqIEEgbnVtYmVyIGZvciBhIHRvb2x0aXA6IGVub3VnaCBkaWdpdHMgdG8gZGlzdGluZ3Vpc2gsIGZldyBlbm91Z2ggdG8gcmVhZC4gKi9cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKHY6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHYpKSByZXR1cm4gJ+KAlCc7XG4gIGlmICh2ID09PSAwKSByZXR1cm4gJzAnO1xuICBjb25zdCBtYWduaXR1ZGUgPSBNYXRoLmFicyh2KTtcbiAgaWYgKG1hZ25pdHVkZSA+PSAxMDAwIHx8IG1hZ25pdHVkZSA8IDAuMDEpIHJldHVybiB2LnRvRXhwb25lbnRpYWwoMik7XG4gIHJldHVybiBTdHJpbmcoTWF0aC5yb3VuZCh2ICogMTAwKSAvIDEwMCk7XG59XG5cbi8qKlxuICogVGhlIHRvb2x0aXAncyBsaW5lcyBmb3Igb25lIG9ic2VydmF0aW9uOiB3aGF0IGl0IGlzLCB0aGVuIHdoaWNoIGNvbHVtbiBzYWlkIHNvLlxuICpcbiAqIE51bGwgd2hlbiB0aGUgc291cmNlIGNhbm5vdCBkZXNjcmliZSB0aGlzIG9ic2VydmF0aW9uIOKAlCBhIGNvZGUgb3V0c2lkZSB0aGVcbiAqIGNhdGVnb3J5IGxpc3QsIG9yIGEgdmFsdWUgdGhhdCB3YXMgbmV2ZXIgbWVhc3VyZWQuIFNheWluZyBub3RoaW5nIGlzIGJldHRlclxuICogdGhhbiBhIHRvb2x0aXAgdGhhdCByZWFkcyBcInVuZGVmaW5lZFwiLCBhbmQgYmV0dGVyIHRoYW4gaW52ZW50aW5nIGEgbGFiZWwgZm9yIGFcbiAqIGNlbGwgd2hvc2UgYW5ub3RhdGlvbiBpcyBnZW51aW5lbHkgbWlzc2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhvdmVyVGV4dChzb3VyY2U6IEhvdmVyU291cmNlIHwgbnVsbCwgaW5kZXg6IG51bWJlcik6IHN0cmluZ1tdIHwgbnVsbCB7XG4gIGlmICghc291cmNlIHx8IGluZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gIGlmIChzb3VyY2Uua2luZCA9PT0gJ2NhdGVnb3JpY2FsJykge1xuICAgIGNvbnN0IGNvZGUgPSBzb3VyY2UuY29kZXM/LltpbmRleF07XG4gICAgY29uc3QgbGFiZWwgPSBjb2RlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzb3VyY2UuY2F0ZWdvcmllcz8uW2NvZGVdO1xuICAgIGlmIChsYWJlbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gW2xhYmVsLCBzb3VyY2UubmFtZV07XG4gIH1cbiAgLy8gR3VhcmRlZCByYXRoZXIgdGhhbiBpbmRleGVkIHN0cmFpZ2h0OiB0aGlzIHJ1bnMgZnJvbSBhIHBvaW50ZXJtb3ZlIGhhbmRsZXIsXG4gIC8vIHNvIGEgbWFsZm9ybWVkIHNvdXJjZSB3b3VsZCB0aHJvdyBvbiBldmVyeSBtb3VzZSBtb3ZlbWVudCDigJQgZmFyIHdvcnNlIHRoYW4gYVxuICAvLyB0b29sdGlwIHRoYXQgc3RheXMgcXVpZXQuXG4gIGNvbnN0IHZhbHVlID0gc291cmNlLnZhbHVlcz8uW2luZGV4XTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiBudWxsO1xuICBjb25zdCB1bml0ID0gc291cmNlLnVuaXQgPyBgICR7c291cmNlLnVuaXR9YCA6ICcnO1xuICByZXR1cm4gW2Ake2Zvcm1hdFZhbHVlKHZhbHVlKX0ke3VuaXR9YCwgc291cmNlLm5hbWVdO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIDNEIHZpZXcgc2F5cyBvZiBhIGNlbGwgdW5kZXIgdGhlIHBvaW50ZXIgKGEgM0Qgc2VnbWVudGF0aW9uJ3MsIGRyYXduIGJ5IGl0c2VsZiBvciBhc1xuICogaXRzIHR5cGUncyBzdXJmYWNlKTogaXRzIHR5cGUgKHRoZSBjZWxsLXR5cGUgY29sdW1uKSwgaXRzIGlkLCBhbmQgYSBmZXcgb2YgaXRzIG1lYXN1cmVtZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZWxsSW5mbyB7XG4gIC8qKiBUaGUgY2VsbC10eXBlIGNvbHVtbiwgaXRzIGNhdGVnb3JpZXMgYW5kIGVhY2ggb2JzZXJ2YXRpb24ncyBjb2RlIChudWxsIHdpdGhvdXQgb25lKS4gKi9cbiAgdHlwZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGNhdGVnb3JpZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICBjb2RlczogVWludDE2QXJyYXkgfCBudWxsO1xuICAvKiogQ2VsbHMgcGVyIGNhdGVnb3J5LCBieSBjb2RlLiAqL1xuICBjb3VudHM6IFVpbnQzMkFycmF5IHwgbnVsbDtcbiAgaWRzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBNZWFzdXJlbWVudHMgc2hvd24gKHRoZSBkYXRhc2V0J3MgY29udGludW91cyBjb2x1bW5zLCBhIGZldykuICovXG4gIG1lYXN1cmVzOiByZWFkb25seSB7IG5hbWU6IHN0cmluZzsgdmFsdWVzOiBGbG9hdDMyQXJyYXk7IHVuaXQ/OiBzdHJpbmcgfVtdO1xufVxuXG4vKiogVGhlIHRvb2x0aXAgb2YgY2VsbCBgaW5kZXhgOiBpdHMgdHlwZSwgaXRzIGlkLCB0aGUgY29sb3VyaW5nJ3MgdmFsdWUgKHdoZW4gbm90IHRoZSB0eXBlKSwgbWVhc3VyZW1lbnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNlbGxUZXh0KGluZm86IENlbGxJbmZvIHwgbnVsbCwgaW5kZXg6IG51bWJlciwgY29sb3I6IEhvdmVyU291cmNlIHwgbnVsbCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gIGlmICghaW5mbyB8fCBpbmRleCA8IDApIHJldHVybiBudWxsO1xuICBjb25zdCBjb2RlID0gaW5mby5jb2Rlcz8uW2luZGV4XTtcbiAgY29uc3QgdHlwZSA9IGNvZGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGluZm8uY2F0ZWdvcmllc1tjb2RlXTtcbiAgY29uc3QgbGluZXMgPSBbXG4gICAgdHlwZSA/PyAnQ2VsbCcsXG4gICAgaW5mby5pZHM/LltpbmRleF0gIT09IHVuZGVmaW5lZCA/IGBDZWxsICR7aW5mby5pZHNbaW5kZXhdfWAgOiBgQ2VsbCAjJHtpbmRleCArIDF9YCxcbiAgXTtcbiAgaWYgKGNvbG9yICYmIGNvbG9yLm5hbWUgIT09IGluZm8udHlwZU5hbWUpIHtcbiAgICBjb25zdCBzYWlkID0gaG92ZXJUZXh0KGNvbG9yLCBpbmRleCk7XG4gICAgaWYgKHNhaWQpIGxpbmVzLnB1c2goYCR7c2FpZFsxXX06ICR7c2FpZFswXX1gKTtcbiAgfVxuICBmb3IgKGNvbnN0IG0gb2YgaW5mby5tZWFzdXJlcykge1xuICAgIGlmIChtLm5hbWUgPT09IGNvbG9yPy5uYW1lKSBjb250aW51ZTtcbiAgICBjb25zdCB2ID0gbS52YWx1ZXNbaW5kZXhdO1xuICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyLmlzRmluaXRlKHYpKVxuICAgICAgbGluZXMucHVzaChgJHttLm5hbWV9OiAke2Zvcm1hdFZhbHVlKHYpfSR7bS51bml0ID8gYCAke20udW5pdH1gIDogJyd9YCk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG4vKiogVGhlIHRvb2x0aXAgb2YgYSBjZWxsIHR5cGUncyBzdXJmYWNlOiBpdHMgbmFtZSAoYW5kIHRpdGxlKSwgYW5kIGhvdyBtYW55IGNlbGxzIGl0IGhhcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZWxsVHlwZVRleHQoaW5mbzogQ2VsbEluZm8gfCBudWxsLCBrZXk6IHN0cmluZywgbGFiZWw/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGxpbmVzID0gW2xhYmVsID8/IGtleV07XG4gIGNvbnN0IGNvZGUgPSBpbmZvID8gaW5mby5jYXRlZ29yaWVzLmluZGV4T2Yoa2V5KSA6IC0xO1xuICBjb25zdCBuID0gY29kZSA+PSAwID8gaW5mbz8uY291bnRzPy5bY29kZV0gOiB1bmRlZmluZWQ7XG4gIGlmIChuICE9PSB1bmRlZmluZWQpIGxpbmVzLnB1c2goYCR7bi50b0xvY2FsZVN0cmluZygpfSBjZWxscyR7aW5mbz8udHlwZU5hbWUgPyBgIMK3ICR7aW5mby50eXBlTmFtZX1gIDogJyd9YCk7XG4gIHJldHVybiBsaW5lcztcbn1cbiJdfQ==
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The planes a spatial dataset's region set was outlined on (its `sliceZ`, in observation units,
|
|
3
|
+
* one per slice in slice order), as the 2D view slices them over an image of one plane: plane `k`
|
|
4
|
+
* holds whatever lies nearer to it than to its neighbours, so each z belongs to exactly one plane
|
|
5
|
+
* and the planes together hold the whole depth.
|
|
6
|
+
*
|
|
7
|
+
* Pure, like `spatial-sections.ts` (which offers a sectioned dataset's own z values; these are the
|
|
8
|
+
* planes its segmentation was imaged at).
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* The z band of plane `k`: from halfway to the plane before to halfway to the one after (open
|
|
12
|
+
* ended past the first and the last). The planes may run either way; `[lo, hi)` comes out ordered.
|
|
13
|
+
*/
|
|
14
|
+
export function planeBand(planes, k) {
|
|
15
|
+
const n = planes.length;
|
|
16
|
+
if (!n)
|
|
17
|
+
return [-Infinity, Infinity];
|
|
18
|
+
const i = Math.max(0, Math.min(n - 1, k));
|
|
19
|
+
const z = planes[i];
|
|
20
|
+
const before = i > 0 ? (planes[i - 1] + z) / 2 : null;
|
|
21
|
+
const after = i < n - 1 ? (z + planes[i + 1]) / 2 : null;
|
|
22
|
+
// Ascending planes: the one before is below. Descending: above.
|
|
23
|
+
const ascending = n < 2 || planes[n - 1] >= planes[0];
|
|
24
|
+
const lo = ascending ? before : after;
|
|
25
|
+
const hi = ascending ? after : before;
|
|
26
|
+
return [lo ?? -Infinity, hi ?? Infinity];
|
|
27
|
+
}
|
|
28
|
+
/** Whether `z` lies in `band` (`[lo, hi)`; a non-finite z lies in none). */
|
|
29
|
+
export function inBand(z, band) {
|
|
30
|
+
return Number.isFinite(z) && z >= band[0] && z < band[1];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Indices of the observations on plane `k` (see {@link planeBand}). Every observation is when the
|
|
34
|
+
* dataset carries no z: a flat dataset has nothing to slice.
|
|
35
|
+
*/
|
|
36
|
+
export function observationsOnPlane(obs, planes, k) {
|
|
37
|
+
const z = obs.z;
|
|
38
|
+
if (!z)
|
|
39
|
+
return Uint32Array.from({ length: obs.count }, (_, i) => i);
|
|
40
|
+
const band = planeBand(planes, k);
|
|
41
|
+
const out = new Uint32Array(obs.count);
|
|
42
|
+
let n = 0;
|
|
43
|
+
for (let i = 0; i < obs.count; i++) {
|
|
44
|
+
if (inBand(z[i], band))
|
|
45
|
+
out[n++] = i;
|
|
46
|
+
}
|
|
47
|
+
return out.subarray(0, n);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1wbGFuZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1wbGFuZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7O0dBUUc7QUFFSDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQXlCLEVBQUUsQ0FBUztJQUM1RCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6RCxnRUFBZ0U7SUFDaEUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3RDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksUUFBUSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsTUFBTSxDQUFDLENBQVMsRUFBRSxJQUErQjtJQUMvRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBd0IsRUFBRSxNQUF5QixFQUFFLENBQVM7SUFDaEcsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoQixJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ25DLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNwYXRpYWxPYnNlcnZhdGlvbnMgfSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGUgcGxhbmVzIGEgc3BhdGlhbCBkYXRhc2V0J3MgcmVnaW9uIHNldCB3YXMgb3V0bGluZWQgb24gKGl0cyBgc2xpY2VaYCwgaW4gb2JzZXJ2YXRpb24gdW5pdHMsXG4gKiBvbmUgcGVyIHNsaWNlIGluIHNsaWNlIG9yZGVyKSwgYXMgdGhlIDJEIHZpZXcgc2xpY2VzIHRoZW0gb3ZlciBhbiBpbWFnZSBvZiBvbmUgcGxhbmU6IHBsYW5lIGBrYFxuICogaG9sZHMgd2hhdGV2ZXIgbGllcyBuZWFyZXIgdG8gaXQgdGhhbiB0byBpdHMgbmVpZ2hib3Vycywgc28gZWFjaCB6IGJlbG9uZ3MgdG8gZXhhY3RseSBvbmUgcGxhbmVcbiAqIGFuZCB0aGUgcGxhbmVzIHRvZ2V0aGVyIGhvbGQgdGhlIHdob2xlIGRlcHRoLlxuICpcbiAqIFB1cmUsIGxpa2UgYHNwYXRpYWwtc2VjdGlvbnMudHNgICh3aGljaCBvZmZlcnMgYSBzZWN0aW9uZWQgZGF0YXNldCdzIG93biB6IHZhbHVlczsgdGhlc2UgYXJlIHRoZVxuICogcGxhbmVzIGl0cyBzZWdtZW50YXRpb24gd2FzIGltYWdlZCBhdCkuXG4gKi9cblxuLyoqXG4gKiBUaGUgeiBiYW5kIG9mIHBsYW5lIGBrYDogZnJvbSBoYWxmd2F5IHRvIHRoZSBwbGFuZSBiZWZvcmUgdG8gaGFsZndheSB0byB0aGUgb25lIGFmdGVyIChvcGVuXG4gKiBlbmRlZCBwYXN0IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QpLiBUaGUgcGxhbmVzIG1heSBydW4gZWl0aGVyIHdheTsgYFtsbywgaGkpYCBjb21lcyBvdXQgb3JkZXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYW5lQmFuZChwbGFuZXM6IHJlYWRvbmx5IG51bWJlcltdLCBrOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgbiA9IHBsYW5lcy5sZW5ndGg7XG4gIGlmICghbikgcmV0dXJuIFstSW5maW5pdHksIEluZmluaXR5XTtcbiAgY29uc3QgaSA9IE1hdGgubWF4KDAsIE1hdGgubWluKG4gLSAxLCBrKSk7XG4gIGNvbnN0IHogPSBwbGFuZXNbaV07XG4gIGNvbnN0IGJlZm9yZSA9IGkgPiAwID8gKHBsYW5lc1tpIC0gMV0gKyB6KSAvIDIgOiBudWxsO1xuICBjb25zdCBhZnRlciA9IGkgPCBuIC0gMSA/ICh6ICsgcGxhbmVzW2kgKyAxXSkgLyAyIDogbnVsbDtcbiAgLy8gQXNjZW5kaW5nIHBsYW5lczogdGhlIG9uZSBiZWZvcmUgaXMgYmVsb3cuIERlc2NlbmRpbmc6IGFib3ZlLlxuICBjb25zdCBhc2NlbmRpbmcgPSBuIDwgMiB8fCBwbGFuZXNbbiAtIDFdID49IHBsYW5lc1swXTtcbiAgY29uc3QgbG8gPSBhc2NlbmRpbmcgPyBiZWZvcmUgOiBhZnRlcjtcbiAgY29uc3QgaGkgPSBhc2NlbmRpbmcgPyBhZnRlciA6IGJlZm9yZTtcbiAgcmV0dXJuIFtsbyA/PyAtSW5maW5pdHksIGhpID8/IEluZmluaXR5XTtcbn1cblxuLyoqIFdoZXRoZXIgYHpgIGxpZXMgaW4gYGJhbmRgIChgW2xvLCBoaSlgOyBhIG5vbi1maW5pdGUgeiBsaWVzIGluIG5vbmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluQmFuZCh6OiBudW1iZXIsIGJhbmQ6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0pOiBib29sZWFuIHtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh6KSAmJiB6ID49IGJhbmRbMF0gJiYgeiA8IGJhbmRbMV07XG59XG5cbi8qKlxuICogSW5kaWNlcyBvZiB0aGUgb2JzZXJ2YXRpb25zIG9uIHBsYW5lIGBrYCAoc2VlIHtAbGluayBwbGFuZUJhbmR9KS4gRXZlcnkgb2JzZXJ2YXRpb24gaXMgd2hlbiB0aGVcbiAqIGRhdGFzZXQgY2FycmllcyBubyB6OiBhIGZsYXQgZGF0YXNldCBoYXMgbm90aGluZyB0byBzbGljZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmF0aW9uc09uUGxhbmUob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBwbGFuZXM6IHJlYWRvbmx5IG51bWJlcltdLCBrOiBudW1iZXIpOiBVaW50MzJBcnJheSB7XG4gIGNvbnN0IHogPSBvYnMuejtcbiAgaWYgKCF6KSByZXR1cm4gVWludDMyQXJyYXkuZnJvbSh7IGxlbmd0aDogb2JzLmNvdW50IH0sIChfLCBpKSA9PiBpKTtcbiAgY29uc3QgYmFuZCA9IHBsYW5lQmFuZChwbGFuZXMsIGspO1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkob2JzLmNvdW50KTtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9icy5jb3VudDsgaSsrKSB7XG4gICAgaWYgKGluQmFuZCh6W2ldLCBiYW5kKSkgb3V0W24rK10gPSBpO1xuICB9XG4gIHJldHVybiBvdXQuc3ViYXJyYXkoMCwgbik7XG59XG4iXX0=
|
|
@@ -43,7 +43,7 @@ export function mutedFromSelection(selection) {
|
|
|
43
43
|
export function pointInRing(xs, ys, px, py) {
|
|
44
44
|
return ringContainsPoint(px, py, xs, ys);
|
|
45
45
|
}
|
|
46
|
-
function inBounds(b, px, py) {
|
|
46
|
+
export function inBounds(b, px, py) {
|
|
47
47
|
return px >= b.minX && px <= b.maxX && py >= b.minY && py <= b.maxY;
|
|
48
48
|
}
|
|
49
49
|
/** Polygon-with-holes: inside the exterior and outside every hole. */
|
|
@@ -317,4 +317,4 @@ export function selectByCategory(codes, code) {
|
|
|
317
317
|
}
|
|
318
318
|
return { mask, count };
|
|
319
319
|
}
|
|
320
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFpQixZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQXdCLFdBQVcsSUFBSSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQStCdEcsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBSyxHQUFHLENBQUM7SUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbkQsQ0FBQztBQUVELHVDQUF1QztBQUN2QyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWdCO0lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3ZELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELDBEQUEwRDtBQUMxRCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQWdCO0lBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLEdBQUcsQ0FBQyxFQUFFLEVB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TSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFBRSxTQUFTO1FBQzlCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTdFLE1BQU0sS0FB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QUFDLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBTbGljZU91dGxpbmVzLCBmaWxsT3V0bGluZXMgfSBmcm9tICcuLi9nZW9tZXRyeS9yZWNvbnN0cnVjdCc7XG5pbXBvcnQgeyBSaW5nQm91bmRzIGFzIEJvdW5kcywgcG9pbnRJblJpbmcgYXMgcmluZ0NvbnRhaW5zUG9pbnQsIHJpbmdCb3VuZHMgfSBmcm9tICcuLi9nZW9tZXRyeS9yaW5nJztcbmltcG9ydCB7XG4gIFNwYXRpYWxJbWFnZVJlZixcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIFNwYXRpYWxWb2x1bWVNZXRhLFxufSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcblxuLyoqXG4gKiBXaGljaCBvYnNlcnZhdGlvbnMgZmFsbCBpbnNpZGUgYSBzZXQgb2YgZHJhd24gcmVnaW9ucy5cbiAqXG4gKiBQdXJlLCBsaWtlIGBzcGF0aWFsLWVuY29kaW5nLnRzYCDigJQgbm8gc3RvcmUsIG5vIHJlbmRlcmVyIOKAlCBzbyB0aGUgZ2VvbWV0cnkgaXNcbiAqIHRlc3RhYmxlIG9uIGl0cyBvd24uXG4gKlxuICogV0hZIFRISVMgSVMgVEhFIFdIT0xFIFNFTEVDVElPTiBNRUNIQU5JU01cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBSZWdpb25zIGFscmVhZHkgY29tZSBmcm9tIGV2ZXJ5IG9uLWNhbnZhcyB0b29sIHRoZSBsaWJyYXJ5IGhhczogcmVjdGFuZ2xlLFxuICogcG9seWdvbiwgZnJlZWhhbmQsIG1hZ2ljIHdhbmQsIGJydXNoLiBUZXN0aW5nIG9ic2VydmF0aW9ucyBhZ2FpbnN0IHRoZW0gdHVybnNcbiAqIGFsbCBvZiB0aG9zZSBpbnRvIHNwYXRpYWwtb21pY3Mgc2VsZWN0aW9uIHRvb2xzIHdpdGhvdXQgYWRkaW5nIGEgc2luZ2xlIG5ld1xuICogY2FudmFzIGludGVyYWN0aW9uIOKAlCB3aGljaCBpcyB3aHkgdGhlcmUgaXMgbm8gYmVzcG9rZSBtYXJxdWVlIGhlcmUuXG4gKlxuICogQ09PUkRJTkFURSBGUkFNRVNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tXG4gKiBSZWdpb25zIGFyZSBkcmF3biBpbiBXT1JMRCAoaW1hZ2UpIGNvb3JkaW5hdGVzLiBPYnNlcnZhdGlvbnMgbGl2ZSBpbiB0aGVcbiAqIGRhdGFzZXQncyBvd24gZnJhbWUgYW5kIHJlYWNoIHRoZSB3b3JsZCB0aHJvdWdoIGBpbWFnZVJlZmAg4oCUIHNvIHRoZXkgYXJlXG4gKiB0cmFuc2Zvcm1lZCBmb3J3YXJkIGJlZm9yZSB0ZXN0aW5nLCBtYXRjaGluZyBleGFjdGx5IHdoYXQgdGhlIHJlbmRlcmVyIGRyYXdzLlxuICovXG5cbi8qKiBNb3ZlZCB0byB0aGUgZGF0YXNldCBjb250cmFjdCAoYSBwdXJlIGRhdGEgdHlwZSk7IHJlLWV4cG9ydGVkIGhlcmUgZm9yIGV4aXN0aW5nIGltcG9ydGVycy4gKi9cbmV4cG9ydCB0eXBlIHsgU3BhdGlhbFNlbGVjdGlvbk1hc2sgfTtcblxuLyoqIEFuIGVtcHR5IHNlbGVjdGlvbiBvdmVyIGBjb3VudGAgb2JzZXJ2YXRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5U2VsZWN0aW9uKGNvdW50ID0gMCk6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgcmV0dXJuIHsgbWFzazogbmV3IFVpbnQ4QXJyYXkoY291bnQpLCBjb3VudDogMCB9O1xufVxuXG4vKiogTnVtYmVyIG9mIHNldCBlbnRyaWVzIGluIGEgbWFzay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudE1hc2sobWFzazogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGxldCBuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgbisrO1xuICByZXR1cm4gbjtcbn1cblxuLyoqIFNlbGVjdGVkIGluZGljZXMsIGZvciBleHBvcnQgb3IgYSBkb3duc3RyZWFtIHF1ZXJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tUb0luZGljZXMobWFzazogVWludDhBcnJheSk6IFVpbnQzMkFycmF5IHtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQzMkFycmF5KGNvdW50TWFzayhtYXNrKSk7XG4gIGxldCBhdCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFzay5sZW5ndGg7IGkrKykgaWYgKG1hc2tbaV0pIG91dFthdCsrXSA9IGk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmVuZGVyZXItZmFjaW5nIGludmVyc2U6IHdoaWNoIG9ic2VydmF0aW9ucyB0byBNVVRFLiBXaXRoIG5vdGhpbmcgc2VsZWN0ZWRcbiAqIG5vdGhpbmcgaXMgbXV0ZWQgKHRoZSB3aG9sZSB0aXNzdWUgcmVhZHMgbm9ybWFsbHkpOyB3aXRoIGEgc2VsZWN0aW9uLCBldmVyeVxuICogdW5zZWxlY3RlZCBvYnNlcnZhdGlvbiBpcyBtdXRlZCDigJQgdGhlIENvc014IGhpZ2hsaWdodC12cy1tdXRlIHJ1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgaWYgKHNlbGVjdGlvbi5jb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG11dGVkID0gbmV3IFVpbnQ4QXJyYXkoc2VsZWN0aW9uLm1hc2subGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRlZC5sZW5ndGg7IGkrKykgbXV0ZWRbaV0gPSBzZWxlY3Rpb24ubWFza1tpXSA/IDAgOiAxO1xuICByZXR1cm4gbXV0ZWQ7XG59XG5cbi8qKlxuICogRXZlbi1vZGQgcmF5IGNhc3Q6IGlzIChweCwgcHkpIGluc2lkZSB0aGUgY2xvc2VkIHJpbmcgeHMveXM/XG4gKlxuICogUHVibGljIEFQSSBrZXB0IHdpdGggaXRzIChyaW5nLCBwb2ludCkgYXJndW1lbnQgb3JkZXI7IHRoZSB0ZXN0IGl0c2VsZiBpc1xuICogdGhlIHNoYXJlZCBgZ2VvbWV0cnkvcmluZ2Agb25lIHRoZSByZWdpb24gb3ZlcmxheXMgYW5kIHRvb2xzIHVzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50SW5SaW5nKHhzOiByZWFkb25seSBudW1iZXJbXSwgeXM6IHJlYWRvbmx5IG51bWJlcltdLCBweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiByaW5nQ29udGFpbnNQb2ludChweCwgcHksIHhzLCB5cyk7XG59XG5cbmZ1bmN0aW9uIGluQm91bmRzKGI6IEJvdW5kcywgcHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gcHggPj0gYi5taW5YICYmIHB4IDw9IGIubWF4WCAmJiBweSA+PSBiLm1pblkgJiYgcHkgPD0gYi5tYXhZO1xufVxuXG4vKiogQSByZWdpb24gZmxhdHRlbmVkIHRvIHNvbWV0aGluZyB0ZXN0YWJsZTogYm91bmRzICsgYSBoaXQgdGVzdC4gKi9cbmludGVyZmFjZSBTaGFwZSB7XG4gIGJvdW5kczogQm91bmRzO1xuICBoaXQocHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW47XG59XG5cbi8qKiBQb2x5Z29uLXdpdGgtaG9sZXM6IGluc2lkZSB0aGUgZXh0ZXJpb3IgYW5kIG91dHNpZGUgZXZlcnkgaG9sZS4gKi9cbmZ1bmN0aW9uIHBvbHlnb25TaGFwZSh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSwgaG9sZXM/OiBudW1iZXJbXVtdW10pOiBTaGFwZSB8IG51bGwge1xuICBpZiAoeHMubGVuZ3RoIDwgMykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGJvdW5kcyA9IHJpbmdCb3VuZHMoeHMsIHlzKTtcbiAgLy8gU3BsaXQgYW5kIGJvdW5kZWQgT05DRSBwZXIgc2hhcGU6IHRoZSBoaXQgdGVzdCBydW5zIGZvciBldmVyeSBjYW5kaWRhdGUgcG9pbnRcbiAgLy8gaW5zaWRlIHRoZSBleHRlcmlvciDigJQgdXAgdG8gbWlsbGlvbnMgb2YgY2VsbHMgcGVyIHNlbGVjdGlvbi5cbiAgY29uc3QgaG9sZVJpbmdzID0gKGhvbGVzID8/IFtdKVxuICAgIC5maWx0ZXIoKHJpbmcpID0+IHJpbmcubGVuZ3RoID49IDMpXG4gICAgLm1hcCgocmluZykgPT4ge1xuICAgICAgY29uc3QgaHggPSByaW5nLm1hcCgocCkgPT4gcFswXSk7XG4gICAgICBjb25zdCBoeSA9IHJpbmcubWFwKChwKSA9PiBwWzFdKTtcbiAgICAgIHJldHVybiB7IHhzOiBoeCwgeXM6IGh5LCBib3VuZHM6IHJpbmdCb3VuZHMoaHgsIGh5KSB9O1xuICAgIH0pO1xuICByZXR1cm4ge1xuICAgIGJvdW5kcyxcbiAgICBoaXQ6IChweCwgcHkpID0+IHtcbiAgICAgIGlmICghcG9pbnRJblJpbmcoeHMsIHlzLCBweCwgcHkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBUaGUgcmVnaW9uIG1vZGVsIGlzIGV4cGxpY2l0OiBhIHBvaW50IGluc2lkZSB0aGUgZXh0ZXJpb3IgQU5EIGluc2lkZSBhXG4gICAgICAvLyBob2xlIGlzIE9VVFNJREUgdGhlIHJlZ2lvbi5cbiAgICAgIGZvciAoY29uc3QgaG9sZSBvZiBob2xlUmluZ3MpIHtcbiAgICAgICAgaWYgKGluQm91bmRzKGhvbGUuYm91bmRzLCBweCwgcHkpICYmIHBvaW50SW5SaW5nKGhvbGUueHMsIGhvbGUueXMsIHB4LCBweSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIHJlZ2lvbiB0byB0ZXN0YWJsZSBzaGFwZXMuIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgZm9yIGFueXRoaW5nIHRoYXRcbiAqIGVuY2xvc2VzIG5vIGFyZWEg4oCUIGFuIG9wZW4gcG9seWxpbmUsIGFuIGludGVuc2l0eS1wcm9maWxlIGxpbmUsIGEgZGVnZW5lcmF0ZVxuICogcmVjdGFuZ2xlIOKAlCBzbyB0aG9zZSBuZXZlciBjb250cmlidXRlIHRvIGEgc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uU2hhcGVzKHJlZ2lvbjogUmVnaW9uKTogU2hhcGVbXSB7XG4gIC8vIFByb2ZpbGUgbGluZXMgYmVsb25nIHRvIHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90IHRoZSBhbm5vdGF0aW9uIHNldC5cbiAgaWYgKChyZWdpb24gYXMgdW5rbm93biBhcyB7IGtpbmQ/OiBzdHJpbmcgfSk/LmtpbmQgPT09ICdwcm9maWxlJykgcmV0dXJuIFtdO1xuICBjb25zdCBiID0gcmVnaW9uPy5ib3VuZHMgYXMgdW5rbm93biBhc1xuICAgIHwge1xuICAgICAgICB4PzogbnVtYmVyO1xuICAgICAgICB5PzogbnVtYmVyO1xuICAgICAgICB3aWR0aD86IG51bWJlcjtcbiAgICAgICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgICAgICB4cG9pbnRzPzogbnVtYmVyW107XG4gICAgICAgIHlwb2ludHM/OiBudW1iZXJbXTtcbiAgICAgICAgY2xvc2VkPzogYm9vbGVhbjtcbiAgICAgICAgaG9sZXM/OiBudW1iZXJbXVtdW107XG4gICAgICAgIHBvbHlnb25zPzogeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW107IGNsb3NlZD86IGJvb2xlYW47IGhvbGVzPzogbnVtYmVyW11bXVtdIH1bXTtcbiAgICAgIH1cbiAgICB8IG51bGxcbiAgICB8IHVuZGVmaW5lZDtcbiAgaWYgKCFiKSByZXR1cm4gW107XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYi5wb2x5Z29ucykpIHtcbiAgICByZXR1cm4gYi5wb2x5Z29ucy5mbGF0TWFwKChwKSA9PlxuICAgICAgcC5jbG9zZWQgPT09IGZhbHNlID8gW10gOiAocG9seWdvblNoYXBlKHAueHBvaW50cyA/PyBbXSwgcC55cG9pbnRzID8/IFtdLCBwLmhvbGVzKSA/PyBbXSksXG4gICAgKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShiLnhwb2ludHMpKSB7XG4gICAgaWYgKGIuY2xvc2VkID09PSBmYWxzZSkgcmV0dXJuIFtdOyAvLyBvcGVuIHBvbHlsaW5lIGVuY2xvc2VzIG5vdGhpbmdcbiAgICBjb25zdCBzaGFwZSA9IHBvbHlnb25TaGFwZShiLnhwb2ludHMsIGIueXBvaW50cyA/PyBbXSwgYi5ob2xlcyk7XG4gICAgcmV0dXJuIHNoYXBlID8gW3NoYXBlXSA6IFtdO1xuICB9XG4gIGlmICh0eXBlb2YgYi53aWR0aCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGIuaGVpZ2h0ID09PSAnbnVtYmVyJykge1xuICAgIGNvbnN0IHggPSBiLnggPz8gMDtcbiAgICBjb25zdCB5ID0gYi55ID8/IDA7XG4gICAgLy8gTm9ybWFsaXNlIGEgcmVjdGFuZ2xlIGRyYWdnZWQgcmlnaHQtdG8tbGVmdCAvIGJvdHRvbS10by10b3AuXG4gICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgsIHggKyBiLndpZHRoKTtcbiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeCwgeCArIGIud2lkdGgpO1xuICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5LCB5ICsgYi5oZWlnaHQpO1xuICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heCh5LCB5ICsgYi5oZWlnaHQpO1xuICAgIGlmIChtYXhYID09PSBtaW5YIHx8IG1heFkgPT09IG1pblkpIHJldHVybiBbXTtcbiAgICBjb25zdCBib3VuZHMgPSB7IG1pblgsIG1pblksIG1heFgsIG1heFkgfTtcbiAgICByZXR1cm4gW3sgYm91bmRzLCBoaXQ6IChweCwgcHkpID0+IGluQm91bmRzKGJvdW5kcywgcHgsIHB5KSB9XTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbi8qKlxuICogQSBzZWxlY3Rpb24gZnJvbSBhbiBleHBsaWNpdCBsaXN0IG9mIG9ic2VydmF0aW9uIGluZGljZXMuXG4gKlxuICogV2hhdCBhIGxhc3NvIGluIGEgbGlua2VkIHBsb3QgcHJvZHVjZXM6IHRoZSBwbG90IGtub3dzIHdoaWNoIHBvaW50cyB0aGUgdXNlciBkcmV3XG4gKiBhcm91bmQsIGFuZCB0aGUgbWFwIG5lZWRzIHRoYXQgYXMgYSBtYXNrIG92ZXIgQUxMIG9ic2VydmF0aW9ucy4gT3V0LW9mLXJhbmdlIGFuZFxuICogZHVwbGljYXRlIGluZGljZXMgYXJlIGlnbm9yZWQgcmF0aGVyIHRoYW4gcmVqZWN0ZWQg4oCUIGEgcGxvdCBtYXkgaGFuZCBiYWNrIHRoZSBzYW1lXG4gKiBwb2ludCB0d2ljZSwgYW5kIGEgc3RhbGUgaW5kZXggZnJvbSBhIHBsb3QgZHJhd24gYmVmb3JlIGEgZGF0YXNldCBjaGFuZ2UgbXVzdCBub3RcbiAqIHRocm93IGluIHRoZSBtaWRkbGUgb2YgYSBzZWxlY3Rpb24gZ2VzdHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEJ5SW5kaWNlcyhpbmRpY2VzOiBJdGVyYWJsZTxudW1iZXI+LCBvYnNlcnZhdGlvbkNvdW50OiBudW1iZXIpOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShvYnNlcnZhdGlvbkNvdW50KTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoaSkgfHwgaSA8IDAgfHwgaSA+PSBvYnNlcnZhdGlvbkNvdW50KSBjb250aW51ZTtcbiAgICBpZiAobWFza1tpXSkgY29udGludWU7XG4gICAgbWFza1tpXSA9IDE7XG4gICAgY291bnQrKztcbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIE9ic2VydmF0aW9ucyBpbnNpZGUgQU5ZIG9mIGByZWdpb25zYCAodW5pb24pLiBDb29yZGluYXRlcyBhcmUgdHJhbnNmb3JtZWQgYnlcbiAqIGBpbWFnZVJlZmAgZmlyc3QsIHNvIHRoZSB0ZXN0IGhhcHBlbnMgaW4gdGhlIHNhbWUgd29ybGQgc3BhY2UgdGhlIHJlZ2lvbnMgd2VyZVxuICogZHJhd24gaW4uXG4gKlxuICogYGNhbmRpZGF0ZXNgLCB3aGVuIGdpdmVuLCByZXN0cmljdHMgdGhlIHRlc3QgdG8gdGhvc2Ugb2JzZXJ2YXRpb24gaW5kaWNlcyDigJQgaG93XG4gKiBhIDJEIHZpZXcgb2YgYSAzRCBkYXRhc2V0IGtlZXBzIGEgZHJhd24gcmVnaW9uIG1lYW5pbmcgd2hhdCBpdCBsb29rcyBsaWtlIGl0XG4gKiBtZWFuczogdGhlIHNoYXBlIHdhcyBkcmF3biBvdmVyIE9ORSBzZWN0aW9uLCBzbyBpdCBzZWxlY3RzIHRoYXQgc2VjdGlvbidzIGNlbGxzXG4gKiByYXRoZXIgdGhhbiB0aGUgd2hvbGUgZGVwdGggb2YgdGhlIHNwZWNpbWVuIGJlaGluZCB0aGVtLiBUaGUgcmV0dXJuZWQgbWFzayBzdGF5c1xuICogaW5kZXhlZCBieSBvYnNlcnZhdGlvbiwgc28gZXZlcnkgY29uc3VtZXIgKGNoYXJ0cywgbGVnZW5kLCB0aGUgM0QgY2xvdWQpIHJlYWRzIGl0XG4gKiB0aGUgc2FtZSB3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnMoXG4gIG9ic2VydmF0aW9uczogU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgaW1hZ2VSZWY6IFNwYXRpYWxJbWFnZVJlZiB8IHVuZGVmaW5lZCxcbiAgcmVnaW9uczogcmVhZG9ubHkgUmVnaW9uW10sXG4gIGNhbmRpZGF0ZXM/OiBVaW50MzJBcnJheSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbiA9IG9ic2VydmF0aW9ucy5jb3VudDtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBjb25zdCBzaGFwZXMgPSByZWdpb25zLmZsYXRNYXAoKHIpID0+IHJlZ2lvblNoYXBlcyhyKSk7XG4gIGlmIChzaGFwZXMubGVuZ3RoID09PSAwKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIGNvbnN0IFtzeCwgc3ldID0gaW1hZ2VSZWY/LnNjYWxlID8/IFsxLCAxXTtcbiAgY29uc3QgW3R4LCB0eV0gPSBpbWFnZVJlZj8udHJhbnNsYXRlID8/IFswLCAwXTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgY29uc3QgdG90YWwgPSBjYW5kaWRhdGVzID8gY2FuZGlkYXRlcy5sZW5ndGggOiBuO1xuICBmb3IgKGxldCBrID0gMDsgayA8IHRvdGFsOyBrKyspIHtcbiAgICBjb25zdCBpID0gY2FuZGlkYXRlcyA/IGNhbmRpZGF0ZXNba10gOiBrO1xuICAgIGNvbnN0IHB4ID0gb2JzZXJ2YXRpb25zLnhbaV0gKiBzeCArIHR4O1xuICAgIGNvbnN0IHB5ID0gb2JzZXJ2YXRpb25zLnlbaV0gKiBzeSArIHR5O1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICAvLyBCb3VuZHMgZmlyc3Q6IGEgcmF5IGNhc3QgcGVyIG9ic2VydmF0aW9uIHBlciByZWdpb24gd291bGQgZG9taW5hdGUgYXRcbiAgICAgIC8vIDEwXjUgb2JzZXJ2YXRpb25zLCBhbmQgbW9zdCBwb2ludHMgbWlzcyBtb3N0IHJlZ2lvbnMuXG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIFNlbGVjdCBvYnNlcnZhdGlvbnMgd2hvc2UgU0NSRUVOIHByb2plY3Rpb24gZmFsbHMgaW5zaWRlIHRoZSBkcmF3biByZWdpb25zLlxuICpcbiAqIFRoaXMgaXMgaG93IGEgcmVnaW9uIHNlbGVjdGlvbiB3b3JrcyBpbiB0aGUgM0QgY2xvdWQuIFRoZXJlIGlzIG5vIGRhdGEtc3BhY2VcbiAqIGFmZmluZSB0byBtYXAgYSBkcmF3biBzaGFwZSB0aHJvdWdoLCBiZWNhdXNlIHRoZSBzaGFwZSB3YXMgZHJhd24gb24gYSAyRCBzY3JlZW5cbiAqIGFnYWluc3QgYSBwZXJzcGVjdGl2ZSBjYW1lcmEg4oCUIHNvIHRoZSBvYnNlcnZhdGlvbnMgY29tZSB0aGUgb3RoZXIgd2F5LCBhbHJlYWR5XG4gKiBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyBieSB0aGUgcmVuZGVyZXIgKHdoaWNoIG93bnMgdGhlIGNhbWVyYSksIGFuZCB0aGVcbiAqIHJlZ2lvbnMgYXJlIHRlc3RlZCBpbiB0aGF0IHNhbWUgc2NyZWVuIHNwYWNlLlxuICpcbiAqIFRoZSBjb25zZXF1ZW5jZSBpcyB3b3J0aCBiZWluZyBleHBsaWNpdCBhYm91dDogYSBzY3JlZW4tc3BhY2UgbGFzc28gc2VsZWN0c1xuICogdGhyb3VnaCB0aGUgV0hPTEUgREVQVEggb2YgdGhlIGNsb3VkLCBsaWtlIGEgY29va2llIGN1dHRlciwgbm90IGEgc2xhYiBhdCBzb21lXG4gKiBjaG9zZW4gei4gVGhhdCBpcyBpbmhlcmVudCB0byBkcmF3aW5nIG9uIGEgZmxhdCBzY3JlZW4sIGFuZCBpdCBpcyB3aGF0IG5hcGFyaVxuICogYW5kIGV2ZXJ5IG90aGVyIG9yYml0LWNhbWVyYSBwb2ludCBwaWNrZXIgZG8uIE9yYml0IGFuZCBkcmF3IGFnYWluIHRvIGN1dCBmcm9tXG4gKiBhbm90aGVyIGFuZ2xlLlxuICpcbiAqIGBzY3JlZW5gIGlzIGBbeDAsIHkwLCB4MSwgeTEsIOKApl1gIGluIGNhbnZhcyBwaXhlbHMsIGBjb3VudGAgZW50cmllcyBsb25nLiBBblxuICogb2JzZXJ2YXRpb24gdGhlIGNhbWVyYSBwdXRzIGJlaGluZCB0aGUgZXllIGlzIGdpdmVuIE5hTiBieSB0aGUgcHJvamVjdG9yIGFuZFxuICogbmV2ZXIgc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnNQcm9qZWN0ZWQoXG4gIHNjcmVlbjogRmxvYXQzMkFycmF5LFxuICBjb3VudDogbnVtYmVyLFxuICByZWdpb25zOiByZWFkb25seSBSZWdpb25bXSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvdW50KTtcbiAgY29uc3Qgc2hhcGVzID0gcmVnaW9ucy5mbGF0TWFwKChyKSA9PiByZWdpb25TaGFwZXMocikpO1xuICBpZiAoc2hhcGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbWFzaywgY291bnQ6IDAgfTtcblxuICBsZXQgaGl0cyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IHB4ID0gc2NyZWVuW2kgKiAyXTtcbiAgICBjb25zdCBweSA9IHNjcmVlbltpICogMiArIDFdO1xuICAgIC8vIEJlaGluZCB0aGUgY2FtZXJhLCBvciBvdGhlcndpc2UgdW5wcm9qZWN0YWJsZS5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShweCkgfHwgIU51bWJlci5pc0Zpbml0ZShweSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGhpdHMrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50OiBoaXRzIH07XG59XG5cbi8qKlxuICogT2JzZXJ2YXRpb25zIGluc2lkZSB0aGUgVk9MVU1FIGEgc3RhY2sgb2Ygb3V0bGluZXMgZW5jbG9zZXM6IGEgcmVnaW9uIGNsYXNzIChhblxuICogYXRsYXMgc3RydWN0dXJlIHdpdGggaXRzIHN1YnN0cnVjdHVyZXMpIHRocm91Z2ggZXZlcnkgc2VjdGlvbiBvZiB0aGUgZGF0YXNldCdzXG4gKiByZWZlcmVuY2Ugdm9sdW1lLCBhcyBpdHMgM0QgcmVjb25zdHJ1Y3Rpb24gc2hvd3MgaXQuXG4gKlxuICogVGhlIG91dGxpbmVzIGFyZSBpbiB0aGUgdm9sdW1lJ3Mgb3duIGdyaWQg4oCUIHgsIHkgaW4gdm94ZWxzLCB6IHRoZSBzbGljZSDigJQgd2hpY2hcbiAqIGlzIHdoZXJlIHJlZ2lvbnMgaW1wb3J0ZWQgb250byB0aGUgdm9sdW1lJ3Mgc3RhY2sgc2l0LiBBbiBvYnNlcnZhdGlvbiBpcyBpbiB2b3hlbFxuICogYCjijIp4IC8gdnjijIssIOKMinkgLyB2eeKMiywg4oyKeiAvIHZ64oyLKWAgKHNlZSBgdm9sdW1lSW1hZ2VSZWZgKSwgYW5kIHNlbGVjdGVkIHdoZW4gaXRzXG4gKiBzbGljZSdzIG91dGxpbmVzIGNvdmVyIHRoYXQgdm94ZWwsIGZpbGxlZCBhcyB0aGUgcmVjb25zdHJ1Y3Rpb24gZmlsbHMgdGhlbS4gT25lXG4gKiBzbGljZSBpcyByYXN0ZXJpc2VkIGF0IGEgdGltZSwgc28gYSBzdHJ1Y3R1cmUgdGhyb3VnaCB0aGUgd2hvbGUgYnJhaW4gY29zdHMgb25lXG4gKiBzbGljZSdzIG1hc2ssIG5vdCB0aGUgdm9sdW1lJ3MuIEFuIG9ic2VydmF0aW9uIG91dHNpZGUgdGhlIHZvbHVtZSwgb3Igd2l0aG91dCBhXG4gKiB6LCBpcyBuZXZlciBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluQ2xhc3NWb2x1bWVzKFxuICBvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIHZvbHVtZTogU3BhdGlhbFZvbHVtZU1ldGEsXG4gIHNsaWNlczogcmVhZG9ubHkgU2xpY2VPdXRsaW5lc1tdLFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBuID0gb2JzZXJ2YXRpb25zLmNvdW50O1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIGNvbnN0IHogPSBvYnNlcnZhdGlvbnMuejtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9ID0gdm9sdW1lO1xuICBjb25zdCBbdngsIHZ5LCB2el0gPSB2b2x1bWUudm94ZWxTaXplO1xuICBjb25zdCBieVNsaWNlID0gbmV3IE1hcDxudW1iZXIsIFNsaWNlT3V0bGluZXNbXT4oKTtcbiAgZm9yIChjb25zdCBzIG9mIHNsaWNlcykge1xuICAgIGlmICghcy5yaW5ncy5sZW5ndGggfHwgcy56IDwgMCB8fCBzLnogPj0gZGVwdGgpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxpc3QgPSBieVNsaWNlLmdldChzLnopO1xuICAgIGlmIChsaXN0KSBsaXN0LnB1c2gocyk7XG4gICAgZWxzZSBieVNsaWNlLnNldChzLnosIFtzXSk7XG4gIH1cbiAgaWYgKCF6IHx8ICFieVNsaWNlLnNpemUpIHJldHVybiB7IG1hc2ssIGNvdW50OiAwIH07XG5cbiAgLy8gVGhlIG9ic2VydmF0aW9ucyBvZiBlYWNoIG91dGxpbmVkIHNsaWNlIChhIGNvdW50aW5nIHNvcnQgYnkgc2xpY2UpLlxuICBjb25zdCBzbGljZU9mID0gbmV3IEludDMyQXJyYXkobikuZmlsbCgtMSk7XG4gIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShkZXB0aCArIDEpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IGsgPSBNYXRoLmZsb29yKHpbaV0gLyB2eik7XG4gICAgaWYgKCFieVNsaWNlLmhhcyhrKSkgY29udGludWU7XG4gICAgc2xpY2VPZltpXSA9IGs7XG4gICAgY291bnRzW2sgKyAxXSsrO1xuICB9XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgZGVwdGg7IGsrKykgY291bnRzW2sgKyAxXSArPSBjb3VudHNba107XG4gIGNvbnN0IG9yZGVyID0gbmV3IFVpbnQzMkFycmF5KGNvdW50c1tkZXB0aF0pO1xuICBjb25zdCBhdCA9IGNvdW50cy5zbGljZSgwLCBkZXB0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSBpZiAoc2xpY2VPZltpXSA+PSAwKSBvcmRlclthdFtzbGljZU9mW2ldXSsrXSA9IGk7XG5cbiAgY29uc3QgcGxhbmUgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgW2ssIG91dGxpbmVzXSBvZiBieVNsaWNlKSB7XG4gICAgcGxhbmUuZmlsbCgwKTtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygb3V0bGluZXMpIGZpbGxPdXRsaW5lcyhwbGFuZSwgd2lkdGgsIGhlaWdodCwgcyk7XG4gICAgZm9yIChsZXQgbyA9IGNvdW50c1trXTsgbyA8IGNvdW50c1trICsgMV07IG8rKykge1xuICAgICAgY29uc3QgaSA9IG9yZGVyW29dO1xuICAgICAgY29uc3QgcHggPSBNYXRoLmZsb29yKG9ic2VydmF0aW9ucy54W2ldIC8gdngpO1xuICAgICAgY29uc3QgcHkgPSBNYXRoLmZsb29yKG9ic2VydmF0aW9ucy55W2ldIC8gdnkpO1xuICAgICAgaWYgKHB4IDwgMCB8fCBweSA8IDAgfHwgcHggPj0gd2lkdGggfHwgcHkgPj0gaGVpZ2h0KSBjb250aW51ZTtcbiAgICAgIGlmIChwbGFuZVtweSAqIHdpZHRoICsgcHhdKSB7XG4gICAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdHdvIHNlbGVjdGlvbnMgaG9sZCBleGFjdGx5IHRoZSBzYW1lIG9ic2VydmF0aW9ucy5cbiAqXG4gKiBMZXRzIGEgY2xpY2sgdG9nZ2xlIGFnYWluc3QgdGhlIFNFTEVDVElPTiByYXRoZXIgdGhhbiBhZ2FpbnN0IGEgcmVtZW1iZXJlZFxuICogY2xpY2s6IHBpY2tpbmcgYSBjbGFzcyBpbiB0aGUgbGVnZW5kIGFuZCB0aGVuIGNsaWNraW5nIHRoYXQgc2FtZSBjbGFzcyBvbiB0aGVcbiAqIGNhbnZhcyBzaG91bGQgY2xlYXIgaXQsIGFuZCBhIHJlbWVtYmVyZWQgY2xpY2sgY2Fubm90IGtub3cgYWJvdXQgdGhlIGxlZ2VuZC5cbiAqIENvdW50cyBhcmUgY29tcGFyZWQgZmlyc3QsIHNvIHR3byBkaWZmZXJlbnQgc2VsZWN0aW9ucyB1c3VhbGx5IGNvc3Qgbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbWVTZWxlY3Rpb24oYTogU3BhdGlhbFNlbGVjdGlvbk1hc2ssIGI6IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogYm9vbGVhbiB7XG4gIGlmIChhLmNvdW50ICE9PSBiLmNvdW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChhLm1hc2subGVuZ3RoICE9PSBiLm1hc2subGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5tYXNrLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9ybWFsaXNlZCB0byAwLzE6IHRoZSBtYXNrcyBhcmUgZmxhZ3MsIGFuZCBhIHdyaXRlciBpcyBmcmVlIHRvIHVzZSBhbnlcbiAgICAvLyBub24temVybyB2YWx1ZSBmb3IgXCJzZWxlY3RlZFwiLlxuICAgIGlmICgoYS5tYXNrW2ldID8gMSA6IDApICE9PSAoYi5tYXNrW2ldID8gMSA6IDApKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBFdmVyeSBvYnNlcnZhdGlvbiB3aG9zZSBjYXRlZ29yaWNhbCBjb2RlIGVxdWFscyBgY29kZWAg4oCUIHRoZSBsZWdlbmQgY2xpY2suICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0QnlDYXRlZ29yeShjb2RlczogVWludDE2QXJyYXksIGNvZGU6IG51bWJlcik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvZGVzLmxlbmd0aCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY29kZXNbaV0gPT09IGNvZGUpIHtcbiAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQgfTtcbn1cbiJdfQ==
|
|
320
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFpQixZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQXdCLFdBQVcsSUFBSSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQStCdEcsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBSyxHQUFHLENBQUM7SUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbkQsQ0FBQztBQUVELHVDQUF1QztBQUN2QyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWdCO0lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3ZELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELDBEQUEwRDtBQUMxRCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQWdCO0lBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLEdBQUcsQ0FBQyxFQUFFLEVB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QUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsK0RBQStEO1FBQy9ELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDOUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMxQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0s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QUFHLENBQUMsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFNsaWNlT3V0bGluZXMsIGZpbGxPdXRsaW5lcyB9IGZyb20gJy4uL2dlb21ldHJ5L3JlY29uc3RydWN0JztcbmltcG9ydCB7IFJpbmdCb3VuZHMgYXMgQm91bmRzLCBwb2ludEluUmluZyBhcyByaW5nQ29udGFpbnNQb2ludCwgcmluZ0JvdW5kcyB9IGZyb20gJy4uL2dlb21ldHJ5L3JpbmcnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbEltYWdlUmVmLFxuICBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgU3BhdGlhbFZvbHVtZU1ldGEsXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFdoaWNoIG9ic2VydmF0aW9ucyBmYWxsIGluc2lkZSBhIHNldCBvZiBkcmF3biByZWdpb25zLlxuICpcbiAqIFB1cmUsIGxpa2UgYHNwYXRpYWwtZW5jb2RpbmcudHNgIOKAlCBubyBzdG9yZSwgbm8gcmVuZGVyZXIg4oCUIHNvIHRoZSBnZW9tZXRyeSBpc1xuICogdGVzdGFibGUgb24gaXRzIG93bi5cbiAqXG4gKiBXSFkgVEhJUyBJUyBUSEUgV0hPTEUgU0VMRUNUSU9OIE1FQ0hBTklTTVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYWxyZWFkeSBjb21lIGZyb20gZXZlcnkgb24tY2FudmFzIHRvb2wgdGhlIGxpYnJhcnkgaGFzOiByZWN0YW5nbGUsXG4gKiBwb2x5Z29uLCBmcmVlaGFuZCwgbWFnaWMgd2FuZCwgYnJ1c2guIFRlc3Rpbmcgb2JzZXJ2YXRpb25zIGFnYWluc3QgdGhlbSB0dXJuc1xuICogYWxsIG9mIHRob3NlIGludG8gc3BhdGlhbC1vbWljcyBzZWxlY3Rpb24gdG9vbHMgd2l0aG91dCBhZGRpbmcgYSBzaW5nbGUgbmV3XG4gKiBjYW52YXMgaW50ZXJhY3Rpb24g4oCUIHdoaWNoIGlzIHdoeSB0aGVyZSBpcyBubyBiZXNwb2tlIG1hcnF1ZWUgaGVyZS5cbiAqXG4gKiBDT09SRElOQVRFIEZSQU1FU1xuICogLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYXJlIGRyYXduIGluIFdPUkxEIChpbWFnZSkgY29vcmRpbmF0ZXMuIE9ic2VydmF0aW9ucyBsaXZlIGluIHRoZVxuICogZGF0YXNldCdzIG93biBmcmFtZSBhbmQgcmVhY2ggdGhlIHdvcmxkIHRocm91Z2ggYGltYWdlUmVmYCDigJQgc28gdGhleSBhcmVcbiAqIHRyYW5zZm9ybWVkIGZvcndhcmQgYmVmb3JlIHRlc3RpbmcsIG1hdGNoaW5nIGV4YWN0bHkgd2hhdCB0aGUgcmVuZGVyZXIgZHJhd3MuXG4gKi9cblxuLyoqIE1vdmVkIHRvIHRoZSBkYXRhc2V0IGNvbnRyYWN0IChhIHB1cmUgZGF0YSB0eXBlKTsgcmUtZXhwb3J0ZWQgaGVyZSBmb3IgZXhpc3RpbmcgaW1wb3J0ZXJzLiAqL1xuZXhwb3J0IHR5cGUgeyBTcGF0aWFsU2VsZWN0aW9uTWFzayB9O1xuXG4vKiogQW4gZW1wdHkgc2VsZWN0aW9uIG92ZXIgYGNvdW50YCBvYnNlcnZhdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlTZWxlY3Rpb24oY291bnQgPSAwKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICByZXR1cm4geyBtYXNrOiBuZXcgVWludDhBcnJheShjb3VudCksIGNvdW50OiAwIH07XG59XG5cbi8qKiBOdW1iZXIgb2Ygc2V0IGVudHJpZXMgaW4gYSBtYXNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50TWFzayhtYXNrOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hc2subGVuZ3RoOyBpKyspIGlmIChtYXNrW2ldKSBuKys7XG4gIHJldHVybiBuO1xufVxuXG4vKiogU2VsZWN0ZWQgaW5kaWNlcywgZm9yIGV4cG9ydCBvciBhIGRvd25zdHJlYW0gcXVlcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1RvSW5kaWNlcyhtYXNrOiBVaW50OEFycmF5KTogVWludDMyQXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkoY291bnRNYXNrKG1hc2spKTtcbiAgbGV0IGF0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgb3V0W2F0KytdID0gaTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZW5kZXJlci1mYWNpbmcgaW52ZXJzZTogd2hpY2ggb2JzZXJ2YXRpb25zIHRvIE1VVEUuIFdpdGggbm90aGluZyBzZWxlY3RlZFxuICogbm90aGluZyBpcyBtdXRlZCAodGhlIHdob2xlIHRpc3N1ZSByZWFkcyBub3JtYWxseSk7IHdpdGggYSBzZWxlY3Rpb24sIGV2ZXJ5XG4gKiB1bnNlbGVjdGVkIG9ic2VydmF0aW9uIGlzIG11dGVkIOKAlCB0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoc2VsZWN0aW9uLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbXV0ZWQgPSBuZXcgVWludDhBcnJheShzZWxlY3Rpb24ubWFzay5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGVkLmxlbmd0aDsgaSsrKSBtdXRlZFtpXSA9IHNlbGVjdGlvbi5tYXNrW2ldID8gMCA6IDE7XG4gIHJldHVybiBtdXRlZDtcbn1cblxuLyoqXG4gKiBFdmVuLW9kZCByYXkgY2FzdDogaXMgKHB4LCBweSkgaW5zaWRlIHRoZSBjbG9zZWQgcmluZyB4cy95cz9cbiAqXG4gKiBQdWJsaWMgQVBJIGtlcHQgd2l0aCBpdHMgKHJpbmcsIHBvaW50KSBhcmd1bWVudCBvcmRlcjsgdGhlIHRlc3QgaXRzZWxmIGlzXG4gKiB0aGUgc2hhcmVkIGBnZW9tZXRyeS9yaW5nYCBvbmUgdGhlIHJlZ2lvbiBvdmVybGF5cyBhbmQgdG9vbHMgdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRJblJpbmcoeHM6IHJlYWRvbmx5IG51bWJlcltdLCB5czogcmVhZG9ubHkgbnVtYmVyW10sIHB4OiBudW1iZXIsIHB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJpbmdDb250YWluc1BvaW50KHB4LCBweSwgeHMsIHlzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluQm91bmRzKGI6IEJvdW5kcywgcHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gcHggPj0gYi5taW5YICYmIHB4IDw9IGIubWF4WCAmJiBweSA+PSBiLm1pblkgJiYgcHkgPD0gYi5tYXhZO1xufVxuXG4vKiogQSByZWdpb24gZmxhdHRlbmVkIHRvIHNvbWV0aGluZyB0ZXN0YWJsZTogYm91bmRzICsgYSBoaXQgdGVzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcGUge1xuICBib3VuZHM6IEJvdW5kcztcbiAgaGl0KHB4OiBudW1iZXIsIHB5OiBudW1iZXIpOiBib29sZWFuO1xufVxuXG4vKiogUG9seWdvbi13aXRoLWhvbGVzOiBpbnNpZGUgdGhlIGV4dGVyaW9yIGFuZCBvdXRzaWRlIGV2ZXJ5IGhvbGUuICovXG5mdW5jdGlvbiBwb2x5Z29uU2hhcGUoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGhvbGVzPzogbnVtYmVyW11bXVtdKTogU2hhcGUgfCBudWxsIHtcbiAgaWYgKHhzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICBjb25zdCBib3VuZHMgPSByaW5nQm91bmRzKHhzLCB5cyk7XG4gIC8vIFNwbGl0IGFuZCBib3VuZGVkIE9OQ0UgcGVyIHNoYXBlOiB0aGUgaGl0IHRlc3QgcnVucyBmb3IgZXZlcnkgY2FuZGlkYXRlIHBvaW50XG4gIC8vIGluc2lkZSB0aGUgZXh0ZXJpb3Ig4oCUIHVwIHRvIG1pbGxpb25zIG9mIGNlbGxzIHBlciBzZWxlY3Rpb24uXG4gIGNvbnN0IGhvbGVSaW5ncyA9IChob2xlcyA/PyBbXSlcbiAgICAuZmlsdGVyKChyaW5nKSA9PiByaW5nLmxlbmd0aCA+PSAzKVxuICAgIC5tYXAoKHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGh4ID0gcmluZy5tYXAoKHApID0+IHBbMF0pO1xuICAgICAgY29uc3QgaHkgPSByaW5nLm1hcCgocCkgPT4gcFsxXSk7XG4gICAgICByZXR1cm4geyB4czogaHgsIHlzOiBoeSwgYm91bmRzOiByaW5nQm91bmRzKGh4LCBoeSkgfTtcbiAgICB9KTtcbiAgcmV0dXJuIHtcbiAgICBib3VuZHMsXG4gICAgaGl0OiAocHgsIHB5KSA9PiB7XG4gICAgICBpZiAoIXBvaW50SW5SaW5nKHhzLCB5cywgcHgsIHB5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gVGhlIHJlZ2lvbiBtb2RlbCBpcyBleHBsaWNpdDogYSBwb2ludCBpbnNpZGUgdGhlIGV4dGVyaW9yIEFORCBpbnNpZGUgYVxuICAgICAgLy8gaG9sZSBpcyBPVVRTSURFIHRoZSByZWdpb24uXG4gICAgICBmb3IgKGNvbnN0IGhvbGUgb2YgaG9sZVJpbmdzKSB7XG4gICAgICAgIGlmIChpbkJvdW5kcyhob2xlLmJvdW5kcywgcHgsIHB5KSAmJiBwb2ludEluUmluZyhob2xlLnhzLCBob2xlLnlzLCBweCwgcHkpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYSByZWdpb24gdG8gdGVzdGFibGUgc2hhcGVzLiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGZvciBhbnl0aGluZyB0aGF0XG4gKiBlbmNsb3NlcyBubyBhcmVhIOKAlCBhbiBvcGVuIHBvbHlsaW5lLCBhbiBpbnRlbnNpdHktcHJvZmlsZSBsaW5lLCBhIGRlZ2VuZXJhdGVcbiAqIHJlY3RhbmdsZSDigJQgc28gdGhvc2UgbmV2ZXIgY29udHJpYnV0ZSB0byBhIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lvblNoYXBlcyhyZWdpb246IFJlZ2lvbik6IFNoYXBlW10ge1xuICAvLyBQcm9maWxlIGxpbmVzIGJlbG9uZyB0byB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdCB0aGUgYW5ub3RhdGlvbiBzZXQuXG4gIGlmICgocmVnaW9uIGFzIHVua25vd24gYXMgeyBraW5kPzogc3RyaW5nIH0pPy5raW5kID09PSAncHJvZmlsZScpIHJldHVybiBbXTtcbiAgY29uc3QgYiA9IHJlZ2lvbj8uYm91bmRzIGFzIHVua25vd24gYXNcbiAgICB8IHtcbiAgICAgICAgeD86IG51bWJlcjtcbiAgICAgICAgeT86IG51bWJlcjtcbiAgICAgICAgd2lkdGg/OiBudW1iZXI7XG4gICAgICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAgICAgeHBvaW50cz86IG51bWJlcltdO1xuICAgICAgICB5cG9pbnRzPzogbnVtYmVyW107XG4gICAgICAgIGNsb3NlZD86IGJvb2xlYW47XG4gICAgICAgIGhvbGVzPzogbnVtYmVyW11bXVtdO1xuICAgICAgICBwb2x5Z29ucz86IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdOyBjbG9zZWQ/OiBib29sZWFuOyBob2xlcz86IG51bWJlcltdW11bXSB9W107XG4gICAgICB9XG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWQ7XG4gIGlmICghYikgcmV0dXJuIFtdO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGIucG9seWdvbnMpKSB7XG4gICAgcmV0dXJuIGIucG9seWdvbnMuZmxhdE1hcCgocCkgPT5cbiAgICAgIHAuY2xvc2VkID09PSBmYWxzZSA/IFtdIDogKHBvbHlnb25TaGFwZShwLnhwb2ludHMgPz8gW10sIHAueXBvaW50cyA/PyBbXSwgcC5ob2xlcykgPz8gW10pLFxuICAgICk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYi54cG9pbnRzKSkge1xuICAgIGlmIChiLmNsb3NlZCA9PT0gZmFsc2UpIHJldHVybiBbXTsgLy8gb3BlbiBwb2x5bGluZSBlbmNsb3NlcyBub3RoaW5nXG4gICAgY29uc3Qgc2hhcGUgPSBwb2x5Z29uU2hhcGUoYi54cG9pbnRzLCBiLnlwb2ludHMgPz8gW10sIGIuaG9sZXMpO1xuICAgIHJldHVybiBzaGFwZSA/IFtzaGFwZV0gOiBbXTtcbiAgfVxuICBpZiAodHlwZW9mIGIud2lkdGggPT09ICdudW1iZXInICYmIHR5cGVvZiBiLmhlaWdodCA9PT0gJ251bWJlcicpIHtcbiAgICBjb25zdCB4ID0gYi54ID8/IDA7XG4gICAgY29uc3QgeSA9IGIueSA/PyAwO1xuICAgIC8vIE5vcm1hbGlzZSBhIHJlY3RhbmdsZSBkcmFnZ2VkIHJpZ2h0LXRvLWxlZnQgLyBib3R0b20tdG8tdG9wLlxuICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbih4LCB4ICsgYi53aWR0aCk7XG4gICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgsIHggKyBiLndpZHRoKTtcbiAgICBjb25zdCBtaW5ZID0gTWF0aC5taW4oeSwgeSArIGIuaGVpZ2h0KTtcbiAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgoeSwgeSArIGIuaGVpZ2h0KTtcbiAgICBpZiAobWF4WCA9PT0gbWluWCB8fCBtYXhZID09PSBtaW5ZKSByZXR1cm4gW107XG4gICAgY29uc3QgYm91bmRzID0geyBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIH07XG4gICAgcmV0dXJuIFt7IGJvdW5kcywgaGl0OiAocHgsIHB5KSA9PiBpbkJvdW5kcyhib3VuZHMsIHB4LCBweSkgfV07XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG4vKipcbiAqIEEgc2VsZWN0aW9uIGZyb20gYW4gZXhwbGljaXQgbGlzdCBvZiBvYnNlcnZhdGlvbiBpbmRpY2VzLlxuICpcbiAqIFdoYXQgYSBsYXNzbyBpbiBhIGxpbmtlZCBwbG90IHByb2R1Y2VzOiB0aGUgcGxvdCBrbm93cyB3aGljaCBwb2ludHMgdGhlIHVzZXIgZHJld1xuICogYXJvdW5kLCBhbmQgdGhlIG1hcCBuZWVkcyB0aGF0IGFzIGEgbWFzayBvdmVyIEFMTCBvYnNlcnZhdGlvbnMuIE91dC1vZi1yYW5nZSBhbmRcbiAqIGR1cGxpY2F0ZSBpbmRpY2VzIGFyZSBpZ25vcmVkIHJhdGhlciB0aGFuIHJlamVjdGVkIOKAlCBhIHBsb3QgbWF5IGhhbmQgYmFjayB0aGUgc2FtZVxuICogcG9pbnQgdHdpY2UsIGFuZCBhIHN0YWxlIGluZGV4IGZyb20gYSBwbG90IGRyYXduIGJlZm9yZSBhIGRhdGFzZXQgY2hhbmdlIG11c3Qgbm90XG4gKiB0aHJvdyBpbiB0aGUgbWlkZGxlIG9mIGEgc2VsZWN0aW9uIGdlc3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RCeUluZGljZXMoaW5kaWNlczogSXRlcmFibGU8bnVtYmVyPiwgb2JzZXJ2YXRpb25Db3VudDogbnVtYmVyKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkob2JzZXJ2YXRpb25Db3VudCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGkpIHx8IGkgPCAwIHx8IGkgPj0gb2JzZXJ2YXRpb25Db3VudCkgY29udGludWU7XG4gICAgaWYgKG1hc2tbaV0pIGNvbnRpbnVlO1xuICAgIG1hc2tbaV0gPSAxO1xuICAgIGNvdW50Kys7XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQgfTtcbn1cblxuLyoqXG4gKiBPYnNlcnZhdGlvbnMgaW5zaWRlIEFOWSBvZiBgcmVnaW9uc2AgKHVuaW9uKS4gQ29vcmRpbmF0ZXMgYXJlIHRyYW5zZm9ybWVkIGJ5XG4gKiBgaW1hZ2VSZWZgIGZpcnN0LCBzbyB0aGUgdGVzdCBoYXBwZW5zIGluIHRoZSBzYW1lIHdvcmxkIHNwYWNlIHRoZSByZWdpb25zIHdlcmVcbiAqIGRyYXduIGluLlxuICpcbiAqIGBjYW5kaWRhdGVzYCwgd2hlbiBnaXZlbiwgcmVzdHJpY3RzIHRoZSB0ZXN0IHRvIHRob3NlIG9ic2VydmF0aW9uIGluZGljZXMg4oCUIGhvd1xuICogYSAyRCB2aWV3IG9mIGEgM0QgZGF0YXNldCBrZWVwcyBhIGRyYXduIHJlZ2lvbiBtZWFuaW5nIHdoYXQgaXQgbG9va3MgbGlrZSBpdFxuICogbWVhbnM6IHRoZSBzaGFwZSB3YXMgZHJhd24gb3ZlciBPTkUgc2VjdGlvbiwgc28gaXQgc2VsZWN0cyB0aGF0IHNlY3Rpb24ncyBjZWxsc1xuICogcmF0aGVyIHRoYW4gdGhlIHdob2xlIGRlcHRoIG9mIHRoZSBzcGVjaW1lbiBiZWhpbmQgdGhlbS4gVGhlIHJldHVybmVkIG1hc2sgc3RheXNcbiAqIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24sIHNvIGV2ZXJ5IGNvbnN1bWVyIChjaGFydHMsIGxlZ2VuZCwgdGhlIDNEIGNsb3VkKSByZWFkcyBpdFxuICogdGhlIHNhbWUgd2F5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0SW5SZWdpb25zKFxuICBvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIGltYWdlUmVmOiBTcGF0aWFsSW1hZ2VSZWYgfCB1bmRlZmluZWQsXG4gIHJlZ2lvbnM6IHJlYWRvbmx5IFJlZ2lvbltdLFxuICBjYW5kaWRhdGVzPzogVWludDMyQXJyYXksXG4pOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG4gPSBvYnNlcnZhdGlvbnMuY291bnQ7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShuKTtcbiAgY29uc3Qgc2hhcGVzID0gcmVnaW9ucy5mbGF0TWFwKChyKSA9PiByZWdpb25TaGFwZXMocikpO1xuICBpZiAoc2hhcGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbWFzaywgY291bnQ6IDAgfTtcblxuICBjb25zdCBbc3gsIHN5XSA9IGltYWdlUmVmPy5zY2FsZSA/PyBbMSwgMV07XG4gIGNvbnN0IFt0eCwgdHldID0gaW1hZ2VSZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF07XG4gIGxldCBjb3VudCA9IDA7XG4gIGNvbnN0IHRvdGFsID0gY2FuZGlkYXRlcyA/IGNhbmRpZGF0ZXMubGVuZ3RoIDogbjtcbiAgZm9yIChsZXQgayA9IDA7IGsgPCB0b3RhbDsgaysrKSB7XG4gICAgY29uc3QgaSA9IGNhbmRpZGF0ZXMgPyBjYW5kaWRhdGVzW2tdIDogaztcbiAgICBjb25zdCBweCA9IG9ic2VydmF0aW9ucy54W2ldICogc3ggKyB0eDtcbiAgICBjb25zdCBweSA9IG9ic2VydmF0aW9ucy55W2ldICogc3kgKyB0eTtcbiAgICBmb3IgKGNvbnN0IHNoYXBlIG9mIHNoYXBlcykge1xuICAgICAgLy8gQm91bmRzIGZpcnN0OiBhIHJheSBjYXN0IHBlciBvYnNlcnZhdGlvbiBwZXIgcmVnaW9uIHdvdWxkIGRvbWluYXRlIGF0XG4gICAgICAvLyAxMF41IG9ic2VydmF0aW9ucywgYW5kIG1vc3QgcG9pbnRzIG1pc3MgbW9zdCByZWdpb25zLlxuICAgICAgaWYgKCFpbkJvdW5kcyhzaGFwZS5ib3VuZHMsIHB4LCBweSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHNoYXBlLmhpdChweCwgcHkpKSB7XG4gICAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQgfTtcbn1cblxuLyoqXG4gKiBTZWxlY3Qgb2JzZXJ2YXRpb25zIHdob3NlIFNDUkVFTiBwcm9qZWN0aW9uIGZhbGxzIGluc2lkZSB0aGUgZHJhd24gcmVnaW9ucy5cbiAqXG4gKiBUaGlzIGlzIGhvdyBhIHJlZ2lvbiBzZWxlY3Rpb24gd29ya3MgaW4gdGhlIDNEIGNsb3VkLiBUaGVyZSBpcyBubyBkYXRhLXNwYWNlXG4gKiBhZmZpbmUgdG8gbWFwIGEgZHJhd24gc2hhcGUgdGhyb3VnaCwgYmVjYXVzZSB0aGUgc2hhcGUgd2FzIGRyYXduIG9uIGEgMkQgc2NyZWVuXG4gKiBhZ2FpbnN0IGEgcGVyc3BlY3RpdmUgY2FtZXJhIOKAlCBzbyB0aGUgb2JzZXJ2YXRpb25zIGNvbWUgdGhlIG90aGVyIHdheSwgYWxyZWFkeVxuICogcHJvamVjdGVkIHRvIGNhbnZhcyBwaXhlbHMgYnkgdGhlIHJlbmRlcmVyICh3aGljaCBvd25zIHRoZSBjYW1lcmEpLCBhbmQgdGhlXG4gKiByZWdpb25zIGFyZSB0ZXN0ZWQgaW4gdGhhdCBzYW1lIHNjcmVlbiBzcGFjZS5cbiAqXG4gKiBUaGUgY29uc2VxdWVuY2UgaXMgd29ydGggYmVpbmcgZXhwbGljaXQgYWJvdXQ6IGEgc2NyZWVuLXNwYWNlIGxhc3NvIHNlbGVjdHNcbiAqIHRocm91Z2ggdGhlIFdIT0xFIERFUFRIIG9mIHRoZSBjbG91ZCwgbGlrZSBhIGNvb2tpZSBjdXR0ZXIsIG5vdCBhIHNsYWIgYXQgc29tZVxuICogY2hvc2VuIHouIFRoYXQgaXMgaW5oZXJlbnQgdG8gZHJhd2luZyBvbiBhIGZsYXQgc2NyZWVuLCBhbmQgaXQgaXMgd2hhdCBuYXBhcmlcbiAqIGFuZCBldmVyeSBvdGhlciBvcmJpdC1jYW1lcmEgcG9pbnQgcGlja2VyIGRvLiBPcmJpdCBhbmQgZHJhdyBhZ2FpbiB0byBjdXQgZnJvbVxuICogYW5vdGhlciBhbmdsZS5cbiAqXG4gKiBgc2NyZWVuYCBpcyBgW3gwLCB5MCwgeDEsIHkxLCDigKZdYCBpbiBjYW52YXMgcGl4ZWxzLCBgY291bnRgIGVudHJpZXMgbG9uZy4gQW5cbiAqIG9ic2VydmF0aW9uIHRoZSBjYW1lcmEgcHV0cyBiZWhpbmQgdGhlIGV5ZSBpcyBnaXZlbiBOYU4gYnkgdGhlIHByb2plY3RvciBhbmRcbiAqIG5ldmVyIHNlbGVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0SW5SZWdpb25zUHJvamVjdGVkKFxuICBzY3JlZW46IEZsb2F0MzJBcnJheSxcbiAgY291bnQ6IG51bWJlcixcbiAgcmVnaW9uczogcmVhZG9ubHkgUmVnaW9uW10sXG4pOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShjb3VudCk7XG4gIGNvbnN0IHNoYXBlcyA9IHJlZ2lvbnMuZmxhdE1hcCgocikgPT4gcmVnaW9uU2hhcGVzKHIpKTtcbiAgaWYgKHNoYXBlcy5sZW5ndGggPT09IDApIHJldHVybiB7IG1hc2ssIGNvdW50OiAwIH07XG5cbiAgbGV0IGhpdHMgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBjb25zdCBweCA9IHNjcmVlbltpICogMl07XG4gICAgY29uc3QgcHkgPSBzY3JlZW5baSAqIDIgKyAxXTtcbiAgICAvLyBCZWhpbmQgdGhlIGNhbWVyYSwgb3Igb3RoZXJ3aXNlIHVucHJvamVjdGFibGUuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocHgpIHx8ICFOdW1iZXIuaXNGaW5pdGUocHkpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHNoYXBlIG9mIHNoYXBlcykge1xuICAgICAgaWYgKCFpbkJvdW5kcyhzaGFwZS5ib3VuZHMsIHB4LCBweSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHNoYXBlLmhpdChweCwgcHkpKSB7XG4gICAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgICBoaXRzKys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudDogaGl0cyB9O1xufVxuXG4vKipcbiAqIE9ic2VydmF0aW9ucyBpbnNpZGUgdGhlIFZPTFVNRSBhIHN0YWNrIG9mIG91dGxpbmVzIGVuY2xvc2VzOiBhIHJlZ2lvbiBjbGFzcyAoYW5cbiAqIGF0bGFzIHN0cnVjdHVyZSB3aXRoIGl0cyBzdWJzdHJ1Y3R1cmVzKSB0aHJvdWdoIGV2ZXJ5IHNlY3Rpb24gb2YgdGhlIGRhdGFzZXQnc1xuICogcmVmZXJlbmNlIHZvbHVtZSwgYXMgaXRzIDNEIHJlY29uc3RydWN0aW9uIHNob3dzIGl0LlxuICpcbiAqIFRoZSBvdXRsaW5lcyBhcmUgaW4gdGhlIHZvbHVtZSdzIG93biBncmlkIOKAlCB4LCB5IGluIHZveGVscywgeiB0aGUgc2xpY2Ug4oCUIHdoaWNoXG4gKiBpcyB3aGVyZSByZWdpb25zIGltcG9ydGVkIG9udG8gdGhlIHZvbHVtZSdzIHN0YWNrIHNpdC4gQW4gb2JzZXJ2YXRpb24gaXMgaW4gdm94ZWxcbiAqIGAo4oyKeCAvIHZ44oyLLCDijIp5IC8gdnnijIssIOKMinogLyB2euKMiylgIChzZWUgYHZvbHVtZUltYWdlUmVmYCksIGFuZCBzZWxlY3RlZCB3aGVuIGl0c1xuICogc2xpY2UncyBvdXRsaW5lcyBjb3ZlciB0aGF0IHZveGVsLCBmaWxsZWQgYXMgdGhlIHJlY29uc3RydWN0aW9uIGZpbGxzIHRoZW0uIE9uZVxuICogc2xpY2UgaXMgcmFzdGVyaXNlZCBhdCBhIHRpbWUsIHNvIGEgc3RydWN0dXJlIHRocm91Z2ggdGhlIHdob2xlIGJyYWluIGNvc3RzIG9uZVxuICogc2xpY2UncyBtYXNrLCBub3QgdGhlIHZvbHVtZSdzLiBBbiBvYnNlcnZhdGlvbiBvdXRzaWRlIHRoZSB2b2x1bWUsIG9yIHdpdGhvdXQgYVxuICogeiwgaXMgbmV2ZXIgc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJbkNsYXNzVm9sdW1lcyhcbiAgb2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICB2b2x1bWU6IFNwYXRpYWxWb2x1bWVNZXRhLFxuICBzbGljZXM6IHJlYWRvbmx5IFNsaWNlT3V0bGluZXNbXSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbiA9IG9ic2VydmF0aW9ucy5jb3VudDtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBjb25zdCB6ID0gb2JzZXJ2YXRpb25zLno7XG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgZGVwdGggfSA9IHZvbHVtZTtcbiAgY29uc3QgW3Z4LCB2eSwgdnpdID0gdm9sdW1lLnZveGVsU2l6ZTtcbiAgY29uc3QgYnlTbGljZSA9IG5ldyBNYXA8bnVtYmVyLCBTbGljZU91dGxpbmVzW10+KCk7XG4gIGZvciAoY29uc3QgcyBvZiBzbGljZXMpIHtcbiAgICBpZiAoIXMucmluZ3MubGVuZ3RoIHx8IHMueiA8IDAgfHwgcy56ID49IGRlcHRoKSBjb250aW51ZTtcbiAgICBjb25zdCBsaXN0ID0gYnlTbGljZS5nZXQocy56KTtcbiAgICBpZiAobGlzdCkgbGlzdC5wdXNoKHMpO1xuICAgIGVsc2UgYnlTbGljZS5zZXQocy56LCBbc10pO1xuICB9XG4gIGlmICgheiB8fCAhYnlTbGljZS5zaXplKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIC8vIFRoZSBvYnNlcnZhdGlvbnMgb2YgZWFjaCBvdXRsaW5lZCBzbGljZSAoYSBjb3VudGluZyBzb3J0IGJ5IHNsaWNlKS5cbiAgY29uc3Qgc2xpY2VPZiA9IG5ldyBJbnQzMkFycmF5KG4pLmZpbGwoLTEpO1xuICBjb25zdCBjb3VudHMgPSBuZXcgVWludDMyQXJyYXkoZGVwdGggKyAxKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCBrID0gTWF0aC5mbG9vcih6W2ldIC8gdnopO1xuICAgIGlmICghYnlTbGljZS5oYXMoaykpIGNvbnRpbnVlO1xuICAgIHNsaWNlT2ZbaV0gPSBrO1xuICAgIGNvdW50c1trICsgMV0rKztcbiAgfVxuICBmb3IgKGxldCBrID0gMDsgayA8IGRlcHRoOyBrKyspIGNvdW50c1trICsgMV0gKz0gY291bnRzW2tdO1xuICBjb25zdCBvcmRlciA9IG5ldyBVaW50MzJBcnJheShjb3VudHNbZGVwdGhdKTtcbiAgY29uc3QgYXQgPSBjb3VudHMuc2xpY2UoMCwgZGVwdGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgaWYgKHNsaWNlT2ZbaV0gPj0gMCkgb3JkZXJbYXRbc2xpY2VPZltpXV0rK10gPSBpO1xuXG4gIGNvbnN0IHBsYW5lID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IFtrLCBvdXRsaW5lc10gb2YgYnlTbGljZSkge1xuICAgIHBsYW5lLmZpbGwoMCk7XG4gICAgZm9yIChjb25zdCBzIG9mIG91dGxpbmVzKSBmaWxsT3V0bGluZXMocGxhbmUsIHdpZHRoLCBoZWlnaHQsIHMpO1xuICAgIGZvciAobGV0IG8gPSBjb3VudHNba107IG8gPCBjb3VudHNbayArIDFdOyBvKyspIHtcbiAgICAgIGNvbnN0IGkgPSBvcmRlcltvXTtcbiAgICAgIGNvbnN0IHB4ID0gTWF0aC5mbG9vcihvYnNlcnZhdGlvbnMueFtpXSAvIHZ4KTtcbiAgICAgIGNvbnN0IHB5ID0gTWF0aC5mbG9vcihvYnNlcnZhdGlvbnMueVtpXSAvIHZ5KTtcbiAgICAgIGlmIChweCA8IDAgfHwgcHkgPCAwIHx8IHB4ID49IHdpZHRoIHx8IHB5ID49IGhlaWdodCkgY29udGludWU7XG4gICAgICBpZiAocGxhbmVbcHkgKiB3aWR0aCArIHB4XSkge1xuICAgICAgICBtYXNrW2ldID0gMTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHR3byBzZWxlY3Rpb25zIGhvbGQgZXhhY3RseSB0aGUgc2FtZSBvYnNlcnZhdGlvbnMuXG4gKlxuICogTGV0cyBhIGNsaWNrIHRvZ2dsZSBhZ2FpbnN0IHRoZSBTRUxFQ1RJT04gcmF0aGVyIHRoYW4gYWdhaW5zdCBhIHJlbWVtYmVyZWRcbiAqIGNsaWNrOiBwaWNraW5nIGEgY2xhc3MgaW4gdGhlIGxlZ2VuZCBhbmQgdGhlbiBjbGlja2luZyB0aGF0IHNhbWUgY2xhc3Mgb24gdGhlXG4gKiBjYW52YXMgc2hvdWxkIGNsZWFyIGl0LCBhbmQgYSByZW1lbWJlcmVkIGNsaWNrIGNhbm5vdCBrbm93IGFib3V0IHRoZSBsZWdlbmQuXG4gKiBDb3VudHMgYXJlIGNvbXBhcmVkIGZpcnN0LCBzbyB0d28gZGlmZmVyZW50IHNlbGVjdGlvbnMgdXN1YWxseSBjb3N0IG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW1lU2VsZWN0aW9uKGE6IFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBiOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IGJvb2xlYW4ge1xuICBpZiAoYS5jb3VudCAhPT0gYi5jb3VudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5tYXNrLmxlbmd0aCAhPT0gYi5tYXNrLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubWFzay5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vcm1hbGlzZWQgdG8gMC8xOiB0aGUgbWFza3MgYXJlIGZsYWdzLCBhbmQgYSB3cml0ZXIgaXMgZnJlZSB0byB1c2UgYW55XG4gICAgLy8gbm9uLXplcm8gdmFsdWUgZm9yIFwic2VsZWN0ZWRcIi5cbiAgICBpZiAoKGEubWFza1tpXSA/IDEgOiAwKSAhPT0gKGIubWFza1tpXSA/IDEgOiAwKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogRXZlcnkgb2JzZXJ2YXRpb24gd2hvc2UgY2F0ZWdvcmljYWwgY29kZSBlcXVhbHMgYGNvZGVgIOKAlCB0aGUgbGVnZW5kIGNsaWNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEJ5Q2F0ZWdvcnkoY29kZXM6IFVpbnQxNkFycmF5LCBjb2RlOiBudW1iZXIpOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShjb2Rlcy5sZW5ndGgpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNvZGVzW2ldID09PSBjb2RlKSB7XG4gICAgICBtYXNrW2ldID0gMTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG4iXX0=
|