@jax-data-science/sci-image-visualizer 0.1.0 → 0.2.1
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/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +15 -4
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +46 -1
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +194 -10
- package/esm2022/lib/visualizer.component.mjs +7 -2
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +259 -14
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/implementations/osd/histogram-sampler.d.ts +17 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +25 -0
- package/package.json +1 -1
|
@@ -170,6 +170,51 @@ export class HistogramSampler {
|
|
|
170
170
|
console.warn('[viz:window] per-image window compute failed — using identity 0..255', err);
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Client-side histogram for the SIMPLE (`tiled:false`) path: bin an
|
|
175
|
+
* already-decoded RGBA frame's OWN pixels — no tile server, no fetch. Same
|
|
176
|
+
* output shape as {@link computeImageWindow}: grayscale → [intensity];
|
|
177
|
+
* RGB → [R, G, B]. This is what lets the Channels & Histogram pane work for
|
|
178
|
+
* serverless images (the processing-pipeline preview, DICOM/TIFF stacks),
|
|
179
|
+
* which never hit the tile / `/histogram` endpoints.
|
|
180
|
+
*/
|
|
181
|
+
computeSimpleHistogram(z, data, gray) {
|
|
182
|
+
const cR = new Array(256).fill(0);
|
|
183
|
+
const cG = gray ? null : new Array(256).fill(0);
|
|
184
|
+
const cB = gray ? null : new Array(256).fill(0);
|
|
185
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
186
|
+
if (data[i + 3] === 0)
|
|
187
|
+
continue; // skip transparent padding
|
|
188
|
+
if (gray) {
|
|
189
|
+
cR[maxRgb(data[i], data[i + 1], data[i + 2])]++;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
cR[data[i]]++;
|
|
193
|
+
cG[data[i + 1]]++;
|
|
194
|
+
cB[data[i + 2]]++;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
this.sliceHistograms.set(z, gray ? [histogram256(cR)] : [histogram256(cR), histogram256(cG), histogram256(cB)]);
|
|
198
|
+
this.host.onChannelHistogramsSampled();
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Per-channel histograms for a SIMPLE (`tiled:false`) MULTICHANNEL image: bin
|
|
202
|
+
* each already-decoded channel plane's own pixels (no tile server). One
|
|
203
|
+
* histogram per channel, so the pane's per-channel selector works serverlessly.
|
|
204
|
+
*/
|
|
205
|
+
computeSimpleMultichannelHistograms(z, planes) {
|
|
206
|
+
this.sliceHistograms.set(z, planes.map((p) => {
|
|
207
|
+
const c = new Array(256).fill(0);
|
|
208
|
+
const d = p.data;
|
|
209
|
+
for (let i = 0; i < d.length; i += 4) {
|
|
210
|
+
if (d[i + 3] === 0)
|
|
211
|
+
continue;
|
|
212
|
+
c[d[i]]++; // single-band plane: R=G=B, bin R
|
|
213
|
+
}
|
|
214
|
+
return histogram256(c);
|
|
215
|
+
}));
|
|
216
|
+
this.host.onChannelHistogramsSampled();
|
|
217
|
+
}
|
|
173
218
|
/**
|
|
174
219
|
* Native-bit-depth histogram for >8-bit images, from the server `/histogram`
|
|
175
220
|
* endpoint (the 8-bit canvas tiles can't carry 16-bit values). Cached per
|
|
@@ -214,4 +259,4 @@ export class HistogramSampler {
|
|
|
214
259
|
}
|
|
215
260
|
}
|
|
216
261
|
}
|
|
217
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9ncmFtLXNhbXBsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2QvaGlzdG9ncmFtLXNhbXBsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFjLGNBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBbUNqRSxNQUFNLE9BQU8sZ0JBQWdCO0lBWTNCLFlBQ1UsSUFBZ0IsRUFDaEIsR0FBVyxFQUNYLElBQTBCO1FBRjFCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUNYLFNBQUksR0FBSixJQUFJLENBQXNCO1FBZHBDLG1FQUFtRTtRQUMzRCxvQkFBZSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBQzFELDhFQUE4RTtRQUN0RSxxQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztRQUN6RDs7OzsyQ0FJbUM7UUFDbEIsb0JBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFNM0MsQ0FBQztJQUVKOzBEQUNzRDtJQUN0RCxHQUFHLENBQUMsQ0FBUyxFQUFFLFlBQW9CO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDN0QsQ0FBQztJQUVELGlEQUFpRDtJQUNqRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBb0IsRUFBRSxPQUFlLEVBQUUsQ0FBUztRQUNsRixJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3JCLHVFQUF1RTtZQUN2RSwyRUFBMkU7WUFDM0UsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwRCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2pDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7Z0JBQUUsT0FBTyxDQUFDLDBDQUEwQztZQUN4RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUFFLE9BQU87WUFDcEIsTUFBTSxNQUFNLEdBQWUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRixNQUFNLElBQUksR0FBeUIsRUFBRSxDQUFDO1lBQ3RDLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDcEMsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO29CQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7d0JBQzdCLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUMzRixJQUFJLENBQUMsSUFBSSxDQUNQLENBQUMsS0FBSyxJQUFJLEVBQUU7NEJBQ1YsSUFBSSxDQUFDO2dDQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dDQUN2RCxJQUFJLENBQUMsR0FBRztvQ0FBRSxPQUFPO2dDQUNqQixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO2dDQUN0QixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQ0FDeEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7d0NBQUUsU0FBUztvQ0FDaEMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dDQUNsRCxDQUFDOzRCQUNILENBQUM7NEJBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQ0FDYiw2REFBNkQ7Z0NBQzdELE9BQU8sQ0FBQyxJQUFJLENBQUMsc0RBQXNELEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUNqRixDQUFDO3dCQUNILENBQUMsQ0FBQyxFQUFFLENBQ0wsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUN6QyxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLCtEQUErRDtZQUMvRCxPQUFPLENBQUMsSUFBSSxDQUFDLHdEQUF3RCxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQW9CLEVBQUUsT0FBZSxFQUFFLENBQVM7UUFDdkUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3JCLDRFQUE0RTtZQUM1RSwyRUFBMkU7WUFDM0UsMkVBQTJFO1lBQzNFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNaLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQ3JCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNoQixJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtvQkFBRSxPQUFPLENBQUMseUNBQXlDO1lBQ3pFLENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBNEIsRUFBRSxDQUFDO1lBQzNDLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDcEMsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUU7b0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9ELENBQUM7WUFDRCxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDZCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDWixNQUFNLEVBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFO2dCQUM5QixNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQy9FLElBQUksQ0FBQztvQkFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxDQUFDLEdBQUc7d0JBQUUsT0FBTztvQkFDakIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztvQkFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO3dCQUN4QyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQzs0QkFBRSxTQUFTLENBQUMsMkJBQTJCO3dCQUM1RCxJQUFJLElBQUksRUFBRSxDQUFDOzRCQUNULE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3BELElBQUksQ0FBQyxHQUFHLEdBQUc7Z0NBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQzs0QkFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRztnQ0FBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDOzRCQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDVixDQUFDOzZCQUFNLENBQUM7NEJBQ04sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7NEJBQ2QsRUFBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOzRCQUNuQixFQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3JCLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ2IsMkRBQTJEO29CQUMzRCxPQUFPLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdEUsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUNILENBQUM7WUFDRiwwRUFBMEU7WUFDMUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFHLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRyxDQUFDLENBQUMsQ0FDeEYsQ0FBQztZQUNGLHlFQUF5RTtZQUN6RSxnRUFBZ0U7WUFDaEUsSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxQyxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLHNFQUFzRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVGLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxPQUFlLEVBQUUsQ0FBUyxFQUFFLE9BQWUsRUFBRSxJQUFZO1FBQy9ELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUMsSUFBSSxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsMEVBQTBFO0lBQ2xFLEtBQUssQ0FBQyxXQUFXLENBQ3ZCLE9BQWUsRUFBRSxDQUFTLEVBQUUsT0FBZSxFQUFFLElBQVksRUFBRSxHQUFXO1FBRXRFLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLE9BQU8sWUFBWSxPQUFPLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEgsSUFBSSxDQUFDO1lBQ0gsMEVBQTBFO1lBQzFFLHlFQUF5RTtZQUN6RSxNQUFNLEVBQUUsR0FBRyxNQUFNLGNBQWMsQ0FDN0IsSUFBSSxDQUFDLElBQUk7aUJBQ04sR0FBRyxDQUdELEdBQUcsQ0FBQztpQkFDTixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3hCLENBQUM7WUFDRixJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU07Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDbkMsTUFBTSxHQUFHLEdBQWU7Z0JBQ3RCLGdEQUFnRDtnQkFDaEQsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDNUQsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNO2dCQUNqQixHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRCxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVE7Z0JBQ3JCLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUTtnQkFDckIsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRO2dCQUNyQixXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVc7Z0JBQzNCLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVzthQUM1QixDQUFDO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDcEMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLHFFQUFxRTtZQUNyRSxPQUFPLENBQUMsSUFBSSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IGJ1aWxkVGlsZVVybCwgZmV0Y2hUaWxlUmdiYSB9IGZyb20gJy4vdGlsZS1jbGllbnQnO1xuaW1wb3J0IHsgaGlzdG9ncmFtMjU2LCBtYXhSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW50ZW5zaXR5JztcblxuLyoqXG4gKiBIaXN0b2dyYW0gKyBhdXRvLXdpbmRvdyBzYW1wbGluZyBmb3IgdGhlIE9TRCBiYWNrZW5kIChyZWZhY3RvcmluZyBwbGFuLFxuICogU3RlcCA0IOKAlCBhIHB1cmUgbW92ZSBvdXQgb2YgdGhlIHZpc3VhbGl6ZXIgc2VydmljZSkuIE93bnMgdGhlIHBlci1zbGljZVxuICogOC1iaXQgaGlzdG9ncmFtcyAoc2FtcGxlZCBmcm9tIGRpc3BsYXllZCB0aWxlcykgYW5kIHRoZSBuYXRpdmUtYml0LWRlcHRoXG4gKiBoaXN0b2dyYW1zIChmZXRjaGVkIGZyb20gdGhlIHNlcnZlciBgL2hpc3RvZ3JhbWAgZW5kcG9pbnQpLiBSZWFkLW9ubHkgd2l0aFxuICogcmVzcGVjdCB0byB0aGUgdGlsZS9kaXNwbGF5IHBpcGVsaW5lLlxuICovXG5cbi8qKiBUaGUgZGVzY3JpcHRvciBmaWVsZHMgdGhlIHNhbXBsZXJzIHJlYWQgKHN0cnVjdHVyYWxseSBzYXRpc2ZpZWQgYnkgdGhlXG4gKiAgc2VydmljZSdzIFRpbGVEZXNjcmlwdG9yKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FtcGxlZERlc2NyaXB0b3Ige1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgdGlsZVNpemU6IG51bWJlcjtcbiAgY2hhbm5lbHM/OiBudW1iZXI7XG4gIGxldmVscz86IEFycmF5PHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9ncmFtU2FtcGxlckhvc3Qge1xuICAvKiogUmVhbCBCaW8tRm9ybWF0cyBsZXZlbHMgKHBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHkgdGhlcmUpLiAqL1xuICByZWFsTGV2ZWxzKCk6IG51bWJlcjtcbiAgLyoqIENoYW5uZWwgY291bnQgZm9yIHRoZSBtdWx0aWNoYW5uZWwgc2FtcGxlci4gKi9cbiAgY2hhbm5lbENvdW50KGQ6IFNhbXBsZWREZXNjcmlwdG9yKTogbnVtYmVyO1xuICAvKiogR3JheXNjYWxlIChpbnRlbnNpdHkgaGlzdG9ncmFtICsgYXV0by13aW5kb3cpIHZzIFJHQiAoUi9HL0IgaGlzdG9ncmFtcykuICovXG4gIGlzR3JheXNjYWxlKCk6IGJvb2xlYW47XG4gIC8qKiBIaXN0b2dyYW1zIGxhbmRlZCDigJQgbnVkZ2UgdGhlIHBhbmUgdG8gcmUtcmVhZCAoaXRzIHJldHJ5IHdpbmRvdyBtYXkgaGF2ZVxuICAgKiAgbGFwc2VkKS4gKi9cbiAgb25DaGFubmVsSGlzdG9ncmFtc1NhbXBsZWQoKTogdm9pZDtcbiAgLyoqIEEgZ3JheXNjYWxlIGF1dG8td2luZG93IHdhcyBtZWFzdXJlZCBmcm9tIGZ1bGwtcmVzIHRpbGVzIOKAlCBzZWVkIHRoZVxuICAgKiAgSW50ZW5zaXR5IGNoYW5uZWwgKG9yIHJlLWludmFsaWRhdGUgaWYgdGhlIHVzZXIgYWxyZWFkeSB3aW5kb3dlZCkuICovXG4gIG9uR3JheVdpbmRvd1NhbXBsZWQobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIEhpc3RvZ3JhbVNhbXBsZXIge1xuICAvKiogMjU2LWJpbiBpbnRlbnNpdHkgaGlzdG9ncmFtIHBlciB6LXNsaWNlLCBmcm9tIHNhbXBsZWQgdGlsZXMuICovXG4gIHByaXZhdGUgc2xpY2VIaXN0b2dyYW1zID0gbmV3IE1hcDxudW1iZXIsIElIaXN0b2dyYW1bXT4oKTtcbiAgLyoqIE5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtcyBmcm9tIGAvaGlzdG9ncmFtYCwga2V5ZWQgYCR7en18JHtjaGFubmVsfWAuICovXG4gIHByaXZhdGUgbmF0aXZlSGlzdG9ncmFtcyA9IG5ldyBNYXA8c3RyaW5nLCBJSGlzdG9ncmFtPigpO1xuICAvKiogUGVyLWFwcC1sb2FkIGNhY2hlLWJ1c3RlciBmb3IgYC9oaXN0b2dyYW1gIOKAlCB0aGUgc2VydmVyIG1hcmtzIHRoZVxuICAgKiAgcmVzcG9uc2UgY2FjaGVhYmxlIGZvciAyNGgsIGFuZCBhIGhhcmQgcmVmcmVzaCBjYW4ndCBidXN0IGEgcG9zdC1sb2FkXG4gICAqICBYSFIuIEEgdG9rZW4gc3RhYmxlIHdpdGhpbiBhIHNlc3Npb24gYnV0IG5ldyBvbiBlYWNoIGZ1bGwgbG9hZCBrZWVwcyB0aGVcbiAgICogIGluLXNlc3Npb24gZGVkdXAgKHZpYSBgbmF0aXZlSGlzdG9ncmFtc2ApIHdoaWxlIGFsd2F5cyByZWZsZWN0aW5nIHRoZVxuICAgKiAgbGl2ZSBiYWNrZW5kIGFmdGVyIGEgcmVsb2FkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RDYWNoZUJ1c3RlciA9IERhdGUubm93KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgYXBpOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBob3N0OiBIaXN0b2dyYW1TYW1wbGVySG9zdCxcbiAgKSB7fVxuXG4gIC8qKiBUaGUgc2FtcGxlZCBoaXN0b2dyYW0gZm9yIG9uZSBjaGFubmVsIG9mIHNsaWNlIHosIG9yIG51bGwgdW50aWwgdGhlXG4gICAqICBhc3luYyBzYW1wbGluZyByZXNvbHZlcyAob3IgaWYgaXQgd2FzIHNraXBwZWQpLiAqL1xuICBnZXQoejogbnVtYmVyLCBjaGFubmVsSW5kZXg6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZUhpc3RvZ3JhbXMuZ2V0KHopPy5bY2hhbm5lbEluZGV4XSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIERyb3AgZXZlcnl0aGluZyAodGVhcmRvd24gLyBpbWFnZSBzd2l0Y2gpLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlSGlzdG9ncmFtcy5jbGVhcigpO1xuICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlci1jaGFubmVsIGludGVuc2l0eSBoaXN0b2dyYW1zIGZvciBtdWx0aWNoYW5uZWwgaW1hZ2VzOiBzYW1wbGUgZWFjaFxuICAgKiBjaGFubmVsJ3Mgc2luZ2xlLWJhbmQgdGlsZXMgYXQgdGhlIGNvYXJzZXN0IHJlYWwgbGV2ZWwgYW5kIGJpbiB0aGVcbiAgICogbHVtaW5hbmNlLiBGaXJlLWFuZC1mb3JnZXQuXG4gICAqL1xuICBhc3luYyBjb21wdXRlTXVsdGlDaGFubmVsSGlzdG9ncmFtcyhkOiBTYW1wbGVkRGVzY3JpcHRvciwgaW5mb0I2NDogc3RyaW5nLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdCA9IGQudGlsZVNpemU7XG4gICAgICAvLyBTYW1wbGUgdGhlIENPQVJTRVNUIHJlYWwgbGV2ZWwgKHBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHkgYXQgcmVhbFxuICAgICAgLy8gcmVzb2x1dGlvbnM7IHRoZSBjb2Fyc2VzdCBpcyBzbWFsbCBlbm91Z2ggdG8gYmluIGV2ZW4gZm9yIHdob2xlLXNsaWRlcykuXG4gICAgICBjb25zdCByZXMgPSBNYXRoLm1heCgwLCB0aGlzLmhvc3QucmVhbExldmVscygpIC0gMSk7XG4gICAgICBjb25zdCBsdmwgPSBkLmxldmVscz8uW3Jlc107XG4gICAgICBjb25zdCBsdyA9IGx2bD8ud2lkdGggPz8gZC53aWR0aDtcbiAgICAgIGNvbnN0IGxoID0gbHZsPy5oZWlnaHQgPz8gZC5oZWlnaHQ7XG4gICAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGx3IC8gdCkpO1xuICAgICAgY29uc3Qgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsaCAvIHQpKTtcbiAgICAgIGlmIChjb2xzICogcm93cyA+IDY0KSByZXR1cm47IC8vIGV2ZW4gdGhlIGNvYXJzZXN0IHJlYWwgbGV2ZWwgaXMgdG9vIGJpZ1xuICAgICAgY29uc3QgbkNoID0gdGhpcy5ob3N0LmNoYW5uZWxDb3VudChkKTtcbiAgICAgIGlmIChuQ2ggPCAxKSByZXR1cm47XG4gICAgICBjb25zdCBjb3VudHM6IG51bWJlcltdW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuQ2ggfSwgKCkgPT4gbmV3IEFycmF5KDI1NikuZmlsbCgwKSk7XG4gICAgICBjb25zdCBqb2JzOiBBcnJheTxQcm9taXNlPHZvaWQ+PiA9IFtdO1xuICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgY29sczsgY29sKyspIHtcbiAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG5DaDsgYysrKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBidWlsZFRpbGVVcmwodGhpcy5hcGksIGluZm9CNjQsIHsgcmVzLCBjb2wsIHJvdywgeiwgdGlsZVNpemU6IHQsIGNoYW5uZWw6IGMgfSk7XG4gICAgICAgICAgICBqb2JzLnB1c2goXG4gICAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGltZyA9IGF3YWl0IGZldGNoVGlsZVJnYmEodGhpcy5odHRwLCB1cmwsIDIwMDAwKTtcbiAgICAgICAgICAgICAgICAgIGlmICghaW1nKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gaW1nLmRhdGE7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjYyA9IGNvdW50c1tjXTtcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVtpICsgM10gPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBjY1ttYXhSZ2IoZGF0YVtpXSwgZGF0YVtpICsgMV0sIGRhdGFbaSArIDJdKV0rKztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyB0aWxlIOKAlCB0aGUgaGlzdG9ncmFtIGlzIGp1c3QgbWlzc2luZyBpdHMgY291bnRzLlxuICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdbdml6Omhpc3RvZ3JhbV0gY2hhbm5lbCB0aWxlIHNhbXBsZSBmYWlsZWQsIHNraXBwaW5nJywgdXJsLCBlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChqb2JzKTtcbiAgICAgIHRoaXMuc2xpY2VIaXN0b2dyYW1zLnNldCh6LCBjb3VudHMubWFwKChjKSA9PiBoaXN0b2dyYW0yNTYoYykpKTtcbiAgICAgIHRoaXMuaG9zdC5vbkNoYW5uZWxIaXN0b2dyYW1zU2FtcGxlZCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gTGVhdmUgaGlzdG9ncmFtcyB1bnNldCAodGhlIHBhbmUgc2hvd3MgZW1wdHkpIOKAlCBidXQgc2F5IHdoeS5cbiAgICAgIGNvbnNvbGUud2FybignW3ZpejpoaXN0b2dyYW1dIG11bHRpY2hhbm5lbCBoaXN0b2dyYW0gc2FtcGxpbmcgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSBhIHBlci1pbWFnZSBpbnRlbnNpdHkgd2luZG93IFttaW4sbWF4XSBmb3IgZ3JheXNjYWxlIGF1dG8tcmFuZ2luZyxcbiAgICogbWlycm9yaW5nIHRoZSBoZWF0bWFwJ3MgYXV0by1zdHJldGNoLiBUd28gY29uc3RyYWludHMgZm9yY2UgdGhlIHNhbXBsaW5nXG4gICAqIHN0cmF0ZWd5OlxuICAgKiAgLSBUaGUgd2luZG93IE1VU1QgYmUgaW4gdGhlIHNhbWUgdmFsdWUgc3BhY2UgYXMgdGhlIGRpc3BsYXllZCB0aWxlczogdGhlXG4gICAqICAgIGAvcHJldmlld2AgZW5kcG9pbnQgaXMgc2VydmVyLW5vcm1hbGl6ZWQgd2hpbGUgYC90aWxlYCBzZXJ2ZXMgcmF3XG4gICAqICAgIHVuLW5vcm1hbGl6ZWQgOC1iaXQg4oCUIGEgd2luZG93IGZyb20gdGhlIHByZXZpZXcgd291bGRuJ3QgbWF0Y2guXG4gICAqICAtIEl0IG11c3QgcmVhZCBGVUxMLVJFU09MVVRJT04gdGlsZXMsIG5vdCBhIGRvd25zYW1wbGVkIG92ZXJ2aWV3OlxuICAgKiAgICBhdmVyYWdpbmcgc3BhcnNlIGxvdyB2YWx1ZXMgKGxhYmVsIG1hc2tzKSB0b3dhcmQgMCB3aXBlcyB0aGUgc2lnbmFsLlxuICAgKiBTbyB3ZSBzYW1wbGUgdGhlIGZ1bGwtcmVzIGxldmVsIGFjcm9zcyB0aGUgd2hvbGUgaW1hZ2Ug4oCUIGJvdW5kZWQgdG8gNjRcbiAgICogdGlsZXMgKGEgaHVnZSBncmF5c2NhbGUgaW1hZ2Ugc2FtcGxlcyB0aGUgY29hcnNlc3Qgb3ZlcnZpZXcgZm9yIGhpc3RvZ3JhbXNcbiAgICogb25seSkuIEZpcmUtYW5kLWZvcmdldDsgZmFpbHVyZXMgbGVhdmUgdGhlIHdpbmRvdyB1bnNldCAoaWRlbnRpdHkgMC4uMjU1KS5cbiAgICovXG4gIGFzeW5jIGNvbXB1dGVJbWFnZVdpbmRvdyhkOiBTYW1wbGVkRGVzY3JpcHRvciwgaW5mb0I2NDogc3RyaW5nLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBncmF5ID0gdGhpcy5ob3N0LmlzR3JheXNjYWxlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHQgPSBkLnRpbGVTaXplO1xuICAgICAgLy8gU2FtcGxlIGZ1bGwtcmVzb2x1dGlvbiB3aGVuIHRoZSBncmlkIGlzIHNtYWxsIChhY2N1cmF0ZSBmb3IgdGhlIGdyYXlzY2FsZVxuICAgICAgLy8gYXV0by13aW5kb3cpOyBvdGhlcndpc2Ugc2FtcGxlIHRoZSBjb2Fyc2VzdCBvdmVydmlldyBqdXN0IGZvciBoaXN0b2dyYW1zXG4gICAgICAvLyAod2hvbGUtc2xpZGUgaW1hZ2VzKS4gUkdCIG9ubHkgbmVlZHMgdGhlIGhpc3RvZ3JhbXMsIG5vdCBhbiBhdXRvLXdpbmRvdy5cbiAgICAgIGxldCByZXMgPSAwO1xuICAgICAgbGV0IGNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwoZC53aWR0aCAvIHQpKTtcbiAgICAgIGxldCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGQuaGVpZ2h0IC8gdCkpO1xuICAgICAgbGV0IGZ1bGxSZXMgPSB0cnVlO1xuICAgICAgaWYgKGNvbHMgKiByb3dzID4gNjQpIHtcbiAgICAgICAgcmVzID0gTWF0aC5tYXgoMCwgKGQubGV2ZWxzPy5sZW5ndGggPz8gMSkgLSAxKTtcbiAgICAgICAgY29uc3QgbHZsID0gZC5sZXZlbHM/LltyZXNdO1xuICAgICAgICBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKChsdmw/LndpZHRoID8/IGQud2lkdGgpIC8gdCkpO1xuICAgICAgICByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKChsdmw/LmhlaWdodCA/PyBkLmhlaWdodCkgLyB0KSk7XG4gICAgICAgIGZ1bGxSZXMgPSBmYWxzZTtcbiAgICAgICAgaWYgKGNvbHMgKiByb3dzID4gMzYpIHJldHVybjsgLy8gZXZlbiB0aGUgY29hcnNlc3QgaXMgdG9vIGJpZyDigJQgZ2l2ZSB1cFxuICAgICAgfVxuICAgICAgY29uc3QgY29vcmRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiA9IFtdO1xuICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgY29sczsgY29sKyspIGNvb3Jkcy5wdXNoKFtjb2wsIHJvd10pO1xuICAgICAgfVxuICAgICAgbGV0IG1pbiA9IDI1NTtcbiAgICAgIGxldCBtYXggPSAwO1xuICAgICAgY29uc3QgY1IgPSBuZXcgQXJyYXkoMjU2KS5maWxsKDApO1xuICAgICAgY29uc3QgY0cgPSBncmF5ID8gbnVsbCA6IG5ldyBBcnJheSgyNTYpLmZpbGwoMCk7XG4gICAgICBjb25zdCBjQiA9IGdyYXkgPyBudWxsIDogbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjb29yZHMubWFwKGFzeW5jIChbY29sLCByb3ddKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gYnVpbGRUaWxlVXJsKHRoaXMuYXBpLCBpbmZvQjY0LCB7IHJlcywgY29sLCByb3csIHosIHRpbGVTaXplOiB0IH0pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpbWcgPSBhd2FpdCBmZXRjaFRpbGVSZ2JhKHRoaXMuaHR0cCwgdXJsLCAyMDAwMCk7XG4gICAgICAgICAgICBpZiAoIWltZykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGltZy5kYXRhO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgICAgIGlmIChkYXRhW2kgKyAzXSA9PT0gMCkgY29udGludWU7IC8vIHNraXAgdHJhbnNwYXJlbnQgcGFkZGluZ1xuICAgICAgICAgICAgICBpZiAoZ3JheSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBtYXhSZ2IoZGF0YVtpXSwgZGF0YVtpICsgMV0sIGRhdGFbaSArIDJdKTtcbiAgICAgICAgICAgICAgICBpZiAodiA8IG1pbikgbWluID0gdjtcbiAgICAgICAgICAgICAgICBpZiAodiA+IG1heCkgbWF4ID0gdjtcbiAgICAgICAgICAgICAgICBjUlt2XSsrO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNSW2RhdGFbaV1dKys7XG4gICAgICAgICAgICAgICAgY0chW2RhdGFbaSArIDFdXSsrO1xuICAgICAgICAgICAgICAgIGNCIVtkYXRhW2kgKyAyXV0rKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHRpbGUg4oCUIHdpbmRvdy9oaXN0b2dyYW0ganVzdCBsb3NlIGl0cyBzYW1wbGVzLlxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbdml6OndpbmRvd10gdGlsZSBzYW1wbGUgZmFpbGVkLCBza2lwcGluZycsIHVybCwgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIC8vIENhY2hlIHBlci1jaGFubmVsIGhpc3RvZ3JhbXM6IGdyYXlzY2FsZSDihpIgW2ludGVuc2l0eV07IFJHQiDihpIgW1IsIEcsIEJdLlxuICAgICAgdGhpcy5zbGljZUhpc3RvZ3JhbXMuc2V0KFxuICAgICAgICB6LCBncmF5ID8gW2hpc3RvZ3JhbTI1NihjUildIDogW2hpc3RvZ3JhbTI1NihjUiksIGhpc3RvZ3JhbTI1NihjRyEpLCBoaXN0b2dyYW0yNTYoY0IhKV0sXG4gICAgICApO1xuICAgICAgLy8gR3JheXNjYWxlIGF1dG8td2luZG93IOKAlCBvbmx5IGZyb20gZnVsbC1yZXMgc2FtcGxlcyAoY29hcnNlc3QgYXZlcmFnaW5nXG4gICAgICAvLyBpcyBpbmFjY3VyYXRlKTsgdGhlIGhvc3Qgc2VlZHMgdGhlIGNoYW5uZWwgb3IgcmUtaW52YWxpZGF0ZXMuXG4gICAgICBpZiAoZ3JheSAmJiBmdWxsUmVzICYmIG1heCA+IG1pbiAmJiAobWluID4gMCB8fCBtYXggPCAyNTUpKSB7XG4gICAgICAgIHRoaXMuaG9zdC5vbkdyYXlXaW5kb3dTYW1wbGVkKG1pbiwgbWF4KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3Zpejp3aW5kb3ddIHBlci1pbWFnZSB3aW5kb3cgY29tcHV0ZSBmYWlsZWQg4oCUIHVzaW5nIGlkZW50aXR5IDAuLjI1NScsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtIGZvciA+OC1iaXQgaW1hZ2VzLCBmcm9tIHRoZSBzZXJ2ZXIgYC9oaXN0b2dyYW1gXG4gICAqIGVuZHBvaW50ICh0aGUgOC1iaXQgY2FudmFzIHRpbGVzIGNhbid0IGNhcnJ5IDE2LWJpdCB2YWx1ZXMpLiBDYWNoZWQgcGVyXG4gICAqIHNsaWNlK2NoYW5uZWwgZm9yIHRoZSBzZXNzaW9uLlxuICAgKi9cbiAgbmF0aXZlJChpbmZvQjY0OiBzdHJpbmcsIHo6IG51bWJlciwgY2hhbm5lbDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3Qga2V5ID0gYCR7en18JHtjaGFubmVsfWA7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYXRpdmVIaXN0b2dyYW1zLmdldChrZXkpO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBvZihjYWNoZWQpO1xuICAgIHJldHVybiBmcm9tKHRoaXMuZmV0Y2hOYXRpdmUoaW5mb0I2NCwgeiwgY2hhbm5lbCwgYmlucywga2V5KSk7XG4gIH1cblxuICAvKiogRmV0Y2ggKyBjYWNoZSBvbmUgY2hhbm5lbCdzIG5hdGl2ZSBoaXN0b2dyYW0gZnJvbSBgR0VUIC9oaXN0b2dyYW1gLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoTmF0aXZlKFxuICAgIGluZm9CNjQ6IHN0cmluZywgejogbnVtYmVyLCBjaGFubmVsOiBudW1iZXIsIGJpbnM6IG51bWJlciwga2V5OiBzdHJpbmcsXG4gICk6IFByb21pc2U8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX1oaXN0b2dyYW0/aW5mbz0ke2luZm9CNjR9JmNoYW5uZWw9JHtjaGFubmVsfSZ6PSR7en0mYmlucz0ke2JpbnN9Jl89JHt0aGlzLmhpc3RDYWNoZUJ1c3Rlcn1gO1xuICAgIHRyeSB7XG4gICAgICAvLyBIdHRwQ2xpZW50IGNhbGxzIGdldCBhdXRoIHZpYSB0aGUgQW5ndWxhciBpbnRlcmNlcHRvciAodW5saWtlIE9TRCdzIG93blxuICAgICAgLy8gYWpheCB0aWxlIGxvYWRlciwgd2hpY2ggbmVlZHMgYXV0aEhlYWRlcnMpIOKAlCBtaXJyb3IgdGhlIG90aGVyIGZldGNoZXMuXG4gICAgICBjb25zdCBoaSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAuZ2V0PHtcbiAgICAgICAgICAgIGJpdERlcHRoOiBudW1iZXI7IHJhbmdlTWluOiBudW1iZXI7IHJhbmdlTWF4OiBudW1iZXI7XG4gICAgICAgICAgICBvYnNlcnZlZE1pbjogbnVtYmVyOyBvYnNlcnZlZE1heDogbnVtYmVyOyBiaW5XaWR0aDogbnVtYmVyOyBjb3VudHM6IG51bWJlcltdO1xuICAgICAgICAgIH0+KHVybClcbiAgICAgICAgICAucGlwZSh0aW1lb3V0KDQ1MDAwKSksXG4gICAgICApO1xuICAgICAgaWYgKCFoaSB8fCAhaGkuY291bnRzKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IG91dDogSUhpc3RvZ3JhbSA9IHtcbiAgICAgICAgLy8gTmF0aXZlIGJpbiBsZWZ0LWVkZ2VzOiByYW5nZU1pbiArIGkqYmluV2lkdGguXG4gICAgICAgIGJpbnM6IGhpLmNvdW50cy5tYXAoKF8sIGkpID0+IGhpLnJhbmdlTWluICsgaSAqIGhpLmJpbldpZHRoKSxcbiAgICAgICAgY291bnRzOiBoaS5jb3VudHMsXG4gICAgICAgIG1heDogaGkuY291bnRzLnJlZHVjZSgobSwgYykgPT4gKGMgPiBtID8gYyA6IG0pLCAwKSxcbiAgICAgICAgYml0RGVwdGg6IGhpLmJpdERlcHRoLFxuICAgICAgICByYW5nZU1pbjogaGkucmFuZ2VNaW4sXG4gICAgICAgIHJhbmdlTWF4OiBoaS5yYW5nZU1heCxcbiAgICAgICAgb2JzZXJ2ZWRNaW46IGhpLm9ic2VydmVkTWluLFxuICAgICAgICBvYnNlcnZlZE1heDogaGkub2JzZXJ2ZWRNYXgsXG4gICAgICB9O1xuICAgICAgdGhpcy5uYXRpdmVIaXN0b2dyYW1zLnNldChrZXksIG91dCk7XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gMjAyIChzdGlsbCBjYWNoaW5nKSBvciBhIHRyYW5zaWVudCBlcnJvciDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllcy5cbiAgICAgIGNvbnNvbGUud2FybignW3ZpejpoaXN0b2dyYW1dIG5hdGl2ZSBoaXN0b2dyYW0gZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
262
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9ncmFtLXNhbXBsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2QvaGlzdG9ncmFtLXNhbXBsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFjLGNBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBbUNqRSxNQUFNLE9BQU8sZ0JBQWdCO0lBWTNCLFlBQ1UsSUFBZ0IsRUFDaEIsR0FBVyxFQUNYLElBQTBCO1FBRjFCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUNYLFNBQUksR0FBSixJQUFJLENBQXNCO1FBZHBDLG1FQUFtRTtRQUMzRCxvQkFBZSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBQzFELDhFQUE4RTtRQUN0RSxxQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztRQUN6RDs7OzsyQ0FJbUM7UUFDbEIsb0JBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFNM0MsQ0FBQztJQUVKOzBEQUNzRDtJQUN0RCxHQUFHLENBQUMsQ0FBUyxFQUFFLFlBQW9CO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDN0QsQ0FBQztJQUVELGlEQUFpRDtJQUNqRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMs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QyxXQUFXO2dCQUMzQixXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVc7YUFDNUIsQ0FBQztZQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixxRUFBcUU7WUFDckUsT0FBTyxDQUFDLElBQUksQ0FBQywrQ0FBK0MsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0aW1lb3V0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBidWlsZFRpbGVVcmwsIGZldGNoVGlsZVJnYmEgfSBmcm9tICcuL3RpbGUtY2xpZW50JztcbmltcG9ydCB7IGhpc3RvZ3JhbTI1NiwgbWF4UmdiIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2ludGVuc2l0eSc7XG5cbi8qKlxuICogSGlzdG9ncmFtICsgYXV0by13aW5kb3cgc2FtcGxpbmcgZm9yIHRoZSBPU0QgYmFja2VuZCAocmVmYWN0b3JpbmcgcGxhbixcbiAqIFN0ZXAgNCDigJQgYSBwdXJlIG1vdmUgb3V0IG9mIHRoZSB2aXN1YWxpemVyIHNlcnZpY2UpLiBPd25zIHRoZSBwZXItc2xpY2VcbiAqIDgtYml0IGhpc3RvZ3JhbXMgKHNhbXBsZWQgZnJvbSBkaXNwbGF5ZWQgdGlsZXMpIGFuZCB0aGUgbmF0aXZlLWJpdC1kZXB0aFxuICogaGlzdG9ncmFtcyAoZmV0Y2hlZCBmcm9tIHRoZSBzZXJ2ZXIgYC9oaXN0b2dyYW1gIGVuZHBvaW50KS4gUmVhZC1vbmx5IHdpdGhcbiAqIHJlc3BlY3QgdG8gdGhlIHRpbGUvZGlzcGxheSBwaXBlbGluZS5cbiAqL1xuXG4vKiogVGhlIGRlc2NyaXB0b3IgZmllbGRzIHRoZSBzYW1wbGVycyByZWFkIChzdHJ1Y3R1cmFsbHkgc2F0aXNmaWVkIGJ5IHRoZVxuICogIHNlcnZpY2UncyBUaWxlRGVzY3JpcHRvcikuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbXBsZWREZXNjcmlwdG9yIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHRpbGVTaXplOiBudW1iZXI7XG4gIGNoYW5uZWxzPzogbnVtYmVyO1xuICBsZXZlbHM/OiBBcnJheTx7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvZ3JhbVNhbXBsZXJIb3N0IHtcbiAgLyoqIFJlYWwgQmlvLUZvcm1hdHMgbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5IHRoZXJlKS4gKi9cbiAgcmVhbExldmVscygpOiBudW1iZXI7XG4gIC8qKiBDaGFubmVsIGNvdW50IGZvciB0aGUgbXVsdGljaGFubmVsIHNhbXBsZXIuICovXG4gIGNoYW5uZWxDb3VudChkOiBTYW1wbGVkRGVzY3JpcHRvcik6IG51bWJlcjtcbiAgLyoqIEdyYXlzY2FsZSAoaW50ZW5zaXR5IGhpc3RvZ3JhbSArIGF1dG8td2luZG93KSB2cyBSR0IgKFIvRy9CIGhpc3RvZ3JhbXMpLiAqL1xuICBpc0dyYXlzY2FsZSgpOiBib29sZWFuO1xuICAvKiogSGlzdG9ncmFtcyBsYW5kZWQg4oCUIG51ZGdlIHRoZSBwYW5lIHRvIHJlLXJlYWQgKGl0cyByZXRyeSB3aW5kb3cgbWF5IGhhdmVcbiAgICogIGxhcHNlZCkuICovXG4gIG9uQ2hhbm5lbEhpc3RvZ3JhbXNTYW1wbGVkKCk6IHZvaWQ7XG4gIC8qKiBBIGdyYXlzY2FsZSBhdXRvLXdpbmRvdyB3YXMgbWVhc3VyZWQgZnJvbSBmdWxsLXJlcyB0aWxlcyDigJQgc2VlZCB0aGVcbiAgICogIEludGVuc2l0eSBjaGFubmVsIChvciByZS1pbnZhbGlkYXRlIGlmIHRoZSB1c2VyIGFscmVhZHkgd2luZG93ZWQpLiAqL1xuICBvbkdyYXlXaW5kb3dTYW1wbGVkKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBIaXN0b2dyYW1TYW1wbGVyIHtcbiAgLyoqIDI1Ni1iaW4gaW50ZW5zaXR5IGhpc3RvZ3JhbSBwZXIgei1zbGljZSwgZnJvbSBzYW1wbGVkIHRpbGVzLiAqL1xuICBwcml2YXRlIHNsaWNlSGlzdG9ncmFtcyA9IG5ldyBNYXA8bnVtYmVyLCBJSGlzdG9ncmFtW10+KCk7XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoIGhpc3RvZ3JhbXMgZnJvbSBgL2hpc3RvZ3JhbWAsIGtleWVkIGAke3p9fCR7Y2hhbm5lbH1gLiAqL1xuICBwcml2YXRlIG5hdGl2ZUhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSUhpc3RvZ3JhbT4oKTtcbiAgLyoqIFBlci1hcHAtbG9hZCBjYWNoZS1idXN0ZXIgZm9yIGAvaGlzdG9ncmFtYCDigJQgdGhlIHNlcnZlciBtYXJrcyB0aGVcbiAgICogIHJlc3BvbnNlIGNhY2hlYWJsZSBmb3IgMjRoLCBhbmQgYSBoYXJkIHJlZnJlc2ggY2FuJ3QgYnVzdCBhIHBvc3QtbG9hZFxuICAgKiAgWEhSLiBBIHRva2VuIHN0YWJsZSB3aXRoaW4gYSBzZXNzaW9uIGJ1dCBuZXcgb24gZWFjaCBmdWxsIGxvYWQga2VlcHMgdGhlXG4gICAqICBpbi1zZXNzaW9uIGRlZHVwICh2aWEgYG5hdGl2ZUhpc3RvZ3JhbXNgKSB3aGlsZSBhbHdheXMgcmVmbGVjdGluZyB0aGVcbiAgICogIGxpdmUgYmFja2VuZCBhZnRlciBhIHJlbG9hZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0Q2FjaGVCdXN0ZXIgPSBEYXRlLm5vdygpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGFwaTogc3RyaW5nLFxuICAgIHByaXZhdGUgaG9zdDogSGlzdG9ncmFtU2FtcGxlckhvc3QsXG4gICkge31cblxuICAvKiogVGhlIHNhbXBsZWQgaGlzdG9ncmFtIGZvciBvbmUgY2hhbm5lbCBvZiBzbGljZSB6LCBvciBudWxsIHVudGlsIHRoZVxuICAgKiAgYXN5bmMgc2FtcGxpbmcgcmVzb2x2ZXMgKG9yIGlmIGl0IHdhcyBza2lwcGVkKS4gKi9cbiAgZ2V0KHo6IG51bWJlciwgY2hhbm5lbEluZGV4OiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VIaXN0b2dyYW1zLmdldCh6KT8uW2NoYW5uZWxJbmRleF0gPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBEcm9wIGV2ZXJ5dGhpbmcgKHRlYXJkb3duIC8gaW1hZ2Ugc3dpdGNoKS4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZUhpc3RvZ3JhbXMuY2xlYXIoKTtcbiAgICB0aGlzLm5hdGl2ZUhpc3RvZ3JhbXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXItY2hhbm5lbCBpbnRlbnNpdHkgaGlzdG9ncmFtcyBmb3IgbXVsdGljaGFubmVsIGltYWdlczogc2FtcGxlIGVhY2hcbiAgICogY2hhbm5lbCdzIHNpbmdsZS1iYW5kIHRpbGVzIGF0IHRoZSBjb2Fyc2VzdCByZWFsIGxldmVsIGFuZCBiaW4gdGhlXG4gICAqIGx1bWluYW5jZS4gRmlyZS1hbmQtZm9yZ2V0LlxuICAgKi9cbiAgYXN5bmMgY29tcHV0ZU11bHRpQ2hhbm5lbEhpc3RvZ3JhbXMoZDogU2FtcGxlZERlc2NyaXB0b3IsIGluZm9CNjQ6IHN0cmluZywgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHQgPSBkLnRpbGVTaXplO1xuICAgICAgLy8gU2FtcGxlIHRoZSBDT0FSU0VTVCByZWFsIGxldmVsIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5IGF0IHJlYWxcbiAgICAgIC8vIHJlc29sdXRpb25zOyB0aGUgY29hcnNlc3QgaXMgc21hbGwgZW5vdWdoIHRvIGJpbiBldmVuIGZvciB3aG9sZS1zbGlkZXMpLlxuICAgICAgY29uc3QgcmVzID0gTWF0aC5tYXgoMCwgdGhpcy5ob3N0LnJlYWxMZXZlbHMoKSAtIDEpO1xuICAgICAgY29uc3QgbHZsID0gZC5sZXZlbHM/LltyZXNdO1xuICAgICAgY29uc3QgbHcgPSBsdmw/LndpZHRoID8/IGQud2lkdGg7XG4gICAgICBjb25zdCBsaCA9IGx2bD8uaGVpZ2h0ID8/IGQuaGVpZ2h0O1xuICAgICAgY29uc3QgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsdyAvIHQpKTtcbiAgICAgIGNvbnN0IHJvd3MgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwobGggLyB0KSk7XG4gICAgICBpZiAoY29scyAqIHJvd3MgPiA2NCkgcmV0dXJuOyAvLyBldmVuIHRoZSBjb2Fyc2VzdCByZWFsIGxldmVsIGlzIHRvbyBiaWdcbiAgICAgIGNvbnN0IG5DaCA9IHRoaXMuaG9zdC5jaGFubmVsQ291bnQoZCk7XG4gICAgICBpZiAobkNoIDwgMSkgcmV0dXJuO1xuICAgICAgY29uc3QgY291bnRzOiBudW1iZXJbXVtdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbkNoIH0sICgpID0+IG5ldyBBcnJheSgyNTYpLmZpbGwoMCkpO1xuICAgICAgY29uc3Qgam9iczogQXJyYXk8UHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSB7XG4gICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBuQ2g7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gYnVpbGRUaWxlVXJsKHRoaXMuYXBpLCBpbmZvQjY0LCB7IHJlcywgY29sLCByb3csIHosIHRpbGVTaXplOiB0LCBjaGFubmVsOiBjIH0pO1xuICAgICAgICAgICAgam9icy5wdXNoKFxuICAgICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpbWcgPSBhd2FpdCBmZXRjaFRpbGVSZ2JhKHRoaXMuaHR0cCwgdXJsLCAyMDAwMCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWltZykgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGltZy5kYXRhO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2MgPSBjb3VudHNbY107XG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgY2NbbWF4UmdiKGRhdGFbaV0sIGRhdGFbaSArIDFdLCBkYXRhW2kgKyAyXSldKys7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgdGlsZSDigJQgdGhlIGhpc3RvZ3JhbSBpcyBqdXN0IG1pc3NpbmcgaXRzIGNvdW50cy5cbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignW3ZpejpoaXN0b2dyYW1dIGNoYW5uZWwgdGlsZSBzYW1wbGUgZmFpbGVkLCBza2lwcGluZycsIHVybCwgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoam9icyk7XG4gICAgICB0aGlzLnNsaWNlSGlzdG9ncmFtcy5zZXQoeiwgY291bnRzLm1hcCgoYykgPT4gaGlzdG9ncmFtMjU2KGMpKSk7XG4gICAgICB0aGlzLmhvc3Qub25DaGFubmVsSGlzdG9ncmFtc1NhbXBsZWQoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIExlYXZlIGhpc3RvZ3JhbXMgdW5zZXQgKHRoZSBwYW5lIHNob3dzIGVtcHR5KSDigJQgYnV0IHNheSB3aHkuXG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXo6aGlzdG9ncmFtXSBtdWx0aWNoYW5uZWwgaGlzdG9ncmFtIHNhbXBsaW5nIGZhaWxlZCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgYSBwZXItaW1hZ2UgaW50ZW5zaXR5IHdpbmRvdyBbbWluLG1heF0gZm9yIGdyYXlzY2FsZSBhdXRvLXJhbmdpbmcsXG4gICAqIG1pcnJvcmluZyB0aGUgaGVhdG1hcCdzIGF1dG8tc3RyZXRjaC4gVHdvIGNvbnN0cmFpbnRzIGZvcmNlIHRoZSBzYW1wbGluZ1xuICAgKiBzdHJhdGVneTpcbiAgICogIC0gVGhlIHdpbmRvdyBNVVNUIGJlIGluIHRoZSBzYW1lIHZhbHVlIHNwYWNlIGFzIHRoZSBkaXNwbGF5ZWQgdGlsZXM6IHRoZVxuICAgKiAgICBgL3ByZXZpZXdgIGVuZHBvaW50IGlzIHNlcnZlci1ub3JtYWxpemVkIHdoaWxlIGAvdGlsZWAgc2VydmVzIHJhd1xuICAgKiAgICB1bi1ub3JtYWxpemVkIDgtYml0IOKAlCBhIHdpbmRvdyBmcm9tIHRoZSBwcmV2aWV3IHdvdWxkbid0IG1hdGNoLlxuICAgKiAgLSBJdCBtdXN0IHJlYWQgRlVMTC1SRVNPTFVUSU9OIHRpbGVzLCBub3QgYSBkb3duc2FtcGxlZCBvdmVydmlldzpcbiAgICogICAgYXZlcmFnaW5nIHNwYXJzZSBsb3cgdmFsdWVzIChsYWJlbCBtYXNrcykgdG93YXJkIDAgd2lwZXMgdGhlIHNpZ25hbC5cbiAgICogU28gd2Ugc2FtcGxlIHRoZSBmdWxsLXJlcyBsZXZlbCBhY3Jvc3MgdGhlIHdob2xlIGltYWdlIOKAlCBib3VuZGVkIHRvIDY0XG4gICAqIHRpbGVzIChhIGh1Z2UgZ3JheXNjYWxlIGltYWdlIHNhbXBsZXMgdGhlIGNvYXJzZXN0IG92ZXJ2aWV3IGZvciBoaXN0b2dyYW1zXG4gICAqIG9ubHkpLiBGaXJlLWFuZC1mb3JnZXQ7IGZhaWx1cmVzIGxlYXZlIHRoZSB3aW5kb3cgdW5zZXQgKGlkZW50aXR5IDAuLjI1NSkuXG4gICAqL1xuICBhc3luYyBjb21wdXRlSW1hZ2VXaW5kb3coZDogU2FtcGxlZERlc2NyaXB0b3IsIGluZm9CNjQ6IHN0cmluZywgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ3JheSA9IHRoaXMuaG9zdC5pc0dyYXlzY2FsZSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ID0gZC50aWxlU2l6ZTtcbiAgICAgIC8vIFNhbXBsZSBmdWxsLXJlc29sdXRpb24gd2hlbiB0aGUgZ3JpZCBpcyBzbWFsbCAoYWNjdXJhdGUgZm9yIHRoZSBncmF5c2NhbGVcbiAgICAgIC8vIGF1dG8td2luZG93KTsgb3RoZXJ3aXNlIHNhbXBsZSB0aGUgY29hcnNlc3Qgb3ZlcnZpZXcganVzdCBmb3IgaGlzdG9ncmFtc1xuICAgICAgLy8gKHdob2xlLXNsaWRlIGltYWdlcykuIFJHQiBvbmx5IG5lZWRzIHRoZSBoaXN0b2dyYW1zLCBub3QgYW4gYXV0by13aW5kb3cuXG4gICAgICBsZXQgcmVzID0gMDtcbiAgICAgIGxldCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGQud2lkdGggLyB0KSk7XG4gICAgICBsZXQgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChkLmhlaWdodCAvIHQpKTtcbiAgICAgIGxldCBmdWxsUmVzID0gdHJ1ZTtcbiAgICAgIGlmIChjb2xzICogcm93cyA+IDY0KSB7XG4gICAgICAgIHJlcyA9IE1hdGgubWF4KDAsIChkLmxldmVscz8ubGVuZ3RoID8/IDEpIC0gMSk7XG4gICAgICAgIGNvbnN0IGx2bCA9IGQubGV2ZWxzPy5bcmVzXTtcbiAgICAgICAgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCgobHZsPy53aWR0aCA/PyBkLndpZHRoKSAvIHQpKTtcbiAgICAgICAgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCgobHZsPy5oZWlnaHQgPz8gZC5oZWlnaHQpIC8gdCkpO1xuICAgICAgICBmdWxsUmVzID0gZmFsc2U7XG4gICAgICAgIGlmIChjb2xzICogcm93cyA+IDM2KSByZXR1cm47IC8vIGV2ZW4gdGhlIGNvYXJzZXN0IGlzIHRvbyBiaWcg4oCUIGdpdmUgdXBcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvb3JkczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbXTtcbiAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSBjb29yZHMucHVzaChbY29sLCByb3ddKTtcbiAgICAgIH1cbiAgICAgIGxldCBtaW4gPSAyNTU7XG4gICAgICBsZXQgbWF4ID0gMDtcbiAgICAgIGNvbnN0IGNSID0gbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICAgIGNvbnN0IGNHID0gZ3JheSA/IG51bGwgOiBuZXcgQXJyYXkoMjU2KS5maWxsKDApO1xuICAgICAgY29uc3QgY0IgPSBncmF5ID8gbnVsbCA6IG5ldyBBcnJheSgyNTYpLmZpbGwoMCk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY29vcmRzLm1hcChhc3luYyAoW2NvbCwgcm93XSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IGJ1aWxkVGlsZVVybCh0aGlzLmFwaSwgaW5mb0I2NCwgeyByZXMsIGNvbCwgcm93LCB6LCB0aWxlU2l6ZTogdCB9KTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgZmV0Y2hUaWxlUmdiYSh0aGlzLmh0dHAsIHVybCwgMjAwMDApO1xuICAgICAgICAgICAgaWYgKCFpbWcpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBpbWcuZGF0YTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgICAgICBpZiAoZGF0YVtpICsgM10gPT09IDApIGNvbnRpbnVlOyAvLyBza2lwIHRyYW5zcGFyZW50IHBhZGRpbmdcbiAgICAgICAgICAgICAgaWYgKGdyYXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gbWF4UmdiKGRhdGFbaV0sIGRhdGFbaSArIDFdLCBkYXRhW2kgKyAyXSk7XG4gICAgICAgICAgICAgICAgaWYgKHYgPCBtaW4pIG1pbiA9IHY7XG4gICAgICAgICAgICAgICAgaWYgKHYgPiBtYXgpIG1heCA9IHY7XG4gICAgICAgICAgICAgICAgY1Jbdl0rKztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjUltkYXRhW2ldXSsrO1xuICAgICAgICAgICAgICAgIGNHIVtkYXRhW2kgKyAxXV0rKztcbiAgICAgICAgICAgICAgICBjQiFbZGF0YVtpICsgMl1dKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIFNraXAgdGhpcyB0aWxlIOKAlCB3aW5kb3cvaGlzdG9ncmFtIGp1c3QgbG9zZSBpdHMgc2FtcGxlcy5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW3Zpejp3aW5kb3ddIHRpbGUgc2FtcGxlIGZhaWxlZCwgc2tpcHBpbmcnLCB1cmwsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICAvLyBDYWNoZSBwZXItY2hhbm5lbCBoaXN0b2dyYW1zOiBncmF5c2NhbGUg4oaSIFtpbnRlbnNpdHldOyBSR0Ig4oaSIFtSLCBHLCBCXS5cbiAgICAgIHRoaXMuc2xpY2VIaXN0b2dyYW1zLnNldChcbiAgICAgICAgeiwgZ3JheSA/IFtoaXN0b2dyYW0yNTYoY1IpXSA6IFtoaXN0b2dyYW0yNTYoY1IpLCBoaXN0b2dyYW0yNTYoY0chKSwgaGlzdG9ncmFtMjU2KGNCISldLFxuICAgICAgKTtcbiAgICAgIC8vIEdyYXlzY2FsZSBhdXRvLXdpbmRvdyDigJQgb25seSBmcm9tIGZ1bGwtcmVzIHNhbXBsZXMgKGNvYXJzZXN0IGF2ZXJhZ2luZ1xuICAgICAgLy8gaXMgaW5hY2N1cmF0ZSk7IHRoZSBob3N0IHNlZWRzIHRoZSBjaGFubmVsIG9yIHJlLWludmFsaWRhdGVzLlxuICAgICAgaWYgKGdyYXkgJiYgZnVsbFJlcyAmJiBtYXggPiBtaW4gJiYgKG1pbiA+IDAgfHwgbWF4IDwgMjU1KSkge1xuICAgICAgICB0aGlzLmhvc3Qub25HcmF5V2luZG93U2FtcGxlZChtaW4sIG1heCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXo6d2luZG93XSBwZXItaW1hZ2Ugd2luZG93IGNvbXB1dGUgZmFpbGVkIOKAlCB1c2luZyBpZGVudGl0eSAwLi4yNTUnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGllbnQtc2lkZSBoaXN0b2dyYW0gZm9yIHRoZSBTSU1QTEUgKGB0aWxlZDpmYWxzZWApIHBhdGg6IGJpbiBhblxuICAgKiBhbHJlYWR5LWRlY29kZWQgUkdCQSBmcmFtZSdzIE9XTiBwaXhlbHMg4oCUIG5vIHRpbGUgc2VydmVyLCBubyBmZXRjaC4gU2FtZVxuICAgKiBvdXRwdXQgc2hhcGUgYXMge0BsaW5rIGNvbXB1dGVJbWFnZVdpbmRvd306IGdyYXlzY2FsZSDihpIgW2ludGVuc2l0eV07XG4gICAqIFJHQiDihpIgW1IsIEcsIEJdLiBUaGlzIGlzIHdoYXQgbGV0cyB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSB3b3JrIGZvclxuICAgKiBzZXJ2ZXJsZXNzIGltYWdlcyAodGhlIHByb2Nlc3NpbmctcGlwZWxpbmUgcHJldmlldywgRElDT00vVElGRiBzdGFja3MpLFxuICAgKiB3aGljaCBuZXZlciBoaXQgdGhlIHRpbGUgLyBgL2hpc3RvZ3JhbWAgZW5kcG9pbnRzLlxuICAgKi9cbiAgY29tcHV0ZVNpbXBsZUhpc3RvZ3JhbSh6OiBudW1iZXIsIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5IHwgVWludDhBcnJheSwgZ3JheTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGNSID0gbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICBjb25zdCBjRyA9IGdyYXkgPyBudWxsIDogbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICBjb25zdCBjQiA9IGdyYXkgPyBudWxsIDogbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIGlmIChkYXRhW2kgKyAzXSA9PT0gMCkgY29udGludWU7IC8vIHNraXAgdHJhbnNwYXJlbnQgcGFkZGluZ1xuICAgICAgaWYgKGdyYXkpIHtcbiAgICAgICAgY1JbbWF4UmdiKGRhdGFbaV0sIGRhdGFbaSArIDFdLCBkYXRhW2kgKyAyXSldKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjUltkYXRhW2ldXSsrO1xuICAgICAgICBjRyFbZGF0YVtpICsgMV1dKys7XG4gICAgICAgIGNCIVtkYXRhW2kgKyAyXV0rKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zbGljZUhpc3RvZ3JhbXMuc2V0KFxuICAgICAgeiwgZ3JheSA/IFtoaXN0b2dyYW0yNTYoY1IpXSA6IFtoaXN0b2dyYW0yNTYoY1IpLCBoaXN0b2dyYW0yNTYoY0chKSwgaGlzdG9ncmFtMjU2KGNCISldLFxuICAgICk7XG4gICAgdGhpcy5ob3N0Lm9uQ2hhbm5lbEhpc3RvZ3JhbXNTYW1wbGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyLWNoYW5uZWwgaGlzdG9ncmFtcyBmb3IgYSBTSU1QTEUgKGB0aWxlZDpmYWxzZWApIE1VTFRJQ0hBTk5FTCBpbWFnZTogYmluXG4gICAqIGVhY2ggYWxyZWFkeS1kZWNvZGVkIGNoYW5uZWwgcGxhbmUncyBvd24gcGl4ZWxzIChubyB0aWxlIHNlcnZlcikuIE9uZVxuICAgKiBoaXN0b2dyYW0gcGVyIGNoYW5uZWwsIHNvIHRoZSBwYW5lJ3MgcGVyLWNoYW5uZWwgc2VsZWN0b3Igd29ya3Mgc2VydmVybGVzc2x5LlxuICAgKi9cbiAgY29tcHV0ZVNpbXBsZU11bHRpY2hhbm5lbEhpc3RvZ3JhbXMoXG4gICAgejogbnVtYmVyLCBwbGFuZXM6IEFycmF5PHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXkgfCBVaW50OEFycmF5IH0+LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlSGlzdG9ncmFtcy5zZXQoXG4gICAgICB6LFxuICAgICAgcGxhbmVzLm1hcCgocCkgPT4ge1xuICAgICAgICBjb25zdCBjID0gbmV3IEFycmF5KDI1NikuZmlsbCgwKTtcbiAgICAgICAgY29uc3QgZCA9IHAuZGF0YTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgaWYgKGRbaSArIDNdID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICBjW2RbaV1dKys7IC8vIHNpbmdsZS1iYW5kIHBsYW5lOiBSPUc9QiwgYmluIFJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlzdG9ncmFtMjU2KGMpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLmhvc3Qub25DaGFubmVsSGlzdG9ncmFtc1NhbXBsZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXRpdmUtYml0LWRlcHRoIGhpc3RvZ3JhbSBmb3IgPjgtYml0IGltYWdlcywgZnJvbSB0aGUgc2VydmVyIGAvaGlzdG9ncmFtYFxuICAgKiBlbmRwb2ludCAodGhlIDgtYml0IGNhbnZhcyB0aWxlcyBjYW4ndCBjYXJyeSAxNi1iaXQgdmFsdWVzKS4gQ2FjaGVkIHBlclxuICAgKiBzbGljZStjaGFubmVsIGZvciB0aGUgc2Vzc2lvbi5cbiAgICovXG4gIG5hdGl2ZSQoaW5mb0I2NDogc3RyaW5nLCB6OiBudW1iZXIsIGNoYW5uZWw6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIGNvbnN0IGtleSA9IGAke3p9fCR7Y2hhbm5lbH1gO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMubmF0aXZlSGlzdG9ncmFtcy5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gb2YoY2FjaGVkKTtcbiAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoTmF0aXZlKGluZm9CNjQsIHosIGNoYW5uZWwsIGJpbnMsIGtleSkpO1xuICB9XG5cbiAgLyoqIEZldGNoICsgY2FjaGUgb25lIGNoYW5uZWwncyBuYXRpdmUgaGlzdG9ncmFtIGZyb20gYEdFVCAvaGlzdG9ncmFtYC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE5hdGl2ZShcbiAgICBpbmZvQjY0OiBzdHJpbmcsIHo6IG51bWJlciwgY2hhbm5lbDogbnVtYmVyLCBiaW5zOiBudW1iZXIsIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9aGlzdG9ncmFtP2luZm89JHtpbmZvQjY0fSZjaGFubmVsPSR7Y2hhbm5lbH0mej0ke3p9JmJpbnM9JHtiaW5zfSZfPSR7dGhpcy5oaXN0Q2FjaGVCdXN0ZXJ9YDtcbiAgICB0cnkge1xuICAgICAgLy8gSHR0cENsaWVudCBjYWxscyBnZXQgYXV0aCB2aWEgdGhlIEFuZ3VsYXIgaW50ZXJjZXB0b3IgKHVubGlrZSBPU0QncyBvd25cbiAgICAgIC8vIGFqYXggdGlsZSBsb2FkZXIsIHdoaWNoIG5lZWRzIGF1dGhIZWFkZXJzKSDigJQgbWlycm9yIHRoZSBvdGhlciBmZXRjaGVzLlxuICAgICAgY29uc3QgaGkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgLmdldDx7XG4gICAgICAgICAgICBiaXREZXB0aDogbnVtYmVyOyByYW5nZU1pbjogbnVtYmVyOyByYW5nZU1heDogbnVtYmVyO1xuICAgICAgICAgICAgb2JzZXJ2ZWRNaW46IG51bWJlcjsgb2JzZXJ2ZWRNYXg6IG51bWJlcjsgYmluV2lkdGg6IG51bWJlcjsgY291bnRzOiBudW1iZXJbXTtcbiAgICAgICAgICB9Pih1cmwpXG4gICAgICAgICAgLnBpcGUodGltZW91dCg0NTAwMCkpLFxuICAgICAgKTtcbiAgICAgIGlmICghaGkgfHwgIWhpLmNvdW50cykgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBvdXQ6IElIaXN0b2dyYW0gPSB7XG4gICAgICAgIC8vIE5hdGl2ZSBiaW4gbGVmdC1lZGdlczogcmFuZ2VNaW4gKyBpKmJpbldpZHRoLlxuICAgICAgICBiaW5zOiBoaS5jb3VudHMubWFwKChfLCBpKSA9PiBoaS5yYW5nZU1pbiArIGkgKiBoaS5iaW5XaWR0aCksXG4gICAgICAgIGNvdW50czogaGkuY291bnRzLFxuICAgICAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgICAgIGJpdERlcHRoOiBoaS5iaXREZXB0aCxcbiAgICAgICAgcmFuZ2VNaW46IGhpLnJhbmdlTWluLFxuICAgICAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgICAgIG9ic2VydmVkTWluOiBoaS5vYnNlcnZlZE1pbixcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IGhpLm9ic2VydmVkTWF4LFxuICAgICAgfTtcbiAgICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5zZXQoa2V5LCBvdXQpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIDIwMiAoc3RpbGwgY2FjaGluZykgb3IgYSB0cmFuc2llbnQgZXJyb3Ig4oaSIG51bGw7IHRoZSBwYW5lIHJldHJpZXMuXG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXo6aGlzdG9ncmFtXSBuYXRpdmUgaGlzdG9ncmFtIGZldGNoIGZhaWxlZCcsIGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|