@jax-data-science/sci-image-visualizer 0.7.0 → 0.8.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 +1 -1
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.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/implementations/napari-js/napari-loading-badge.mjs +73 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +418 -29
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +35 -1
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +8 -1
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +12 -1
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +2 -1
- package/esm2022/lib/routing-visualizer.service.mjs +5 -1
- package/esm2022/lib/spatial/spatial-tiles.mjs +144 -1
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +198 -9
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +878 -30
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/lib/contracts/display-types.d.ts +4 -2
- package/lib/contracts/plot-type-contribution.contract.d.ts +9 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +12 -1
- package/lib/contracts/spatial-dataset.contract.d.ts +30 -0
- package/lib/contracts/visualizer.contract.d.ts +7 -1
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +20 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +76 -1
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +7 -0
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +3 -1
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +2 -1
- package/lib/spatial/spatial-tiles.d.ts +38 -1
- package/lib/spatial-controls/spatial-controls.component.d.ts +54 -0
- package/package.json +1 -1
|
@@ -166,6 +166,149 @@ export function transcriptLevelFor(pxPerUnit, levels, targetTilePx = 512) {
|
|
|
166
166
|
}
|
|
167
167
|
return best;
|
|
168
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* The bin a selection of genes is grouped into at this zoom, in observation units, or null
|
|
171
|
+
* to draw every transcript. Bins follow the all-gene pyramid's ladder (`baseBin` × 2^m) so a
|
|
172
|
+
* gene selection and "all genes" group alike: the finest bin whose markers land at least
|
|
173
|
+
* `spacingPx` apart on screen. Once the finest bin is that wide, transcripts are drawn as
|
|
174
|
+
* themselves.
|
|
175
|
+
*/
|
|
176
|
+
export function geneBinSize(pxPerUnit, baseBin, levels = 7, spacingPx = GROUP_MIN_SPACING_PX) {
|
|
177
|
+
if (!(pxPerUnit > 0) || !(baseBin > 0))
|
|
178
|
+
return null;
|
|
179
|
+
if (baseBin * pxPerUnit >= spacingPx)
|
|
180
|
+
return null;
|
|
181
|
+
for (let m = 1; m < levels; m++) {
|
|
182
|
+
const bin = baseBin * 2 ** m;
|
|
183
|
+
if (bin * pxPerUnit >= spacingPx)
|
|
184
|
+
return bin;
|
|
185
|
+
}
|
|
186
|
+
return baseBin * 2 ** (levels - 1);
|
|
187
|
+
}
|
|
188
|
+
/** The entries of `t` inside `rect` (observation units). */
|
|
189
|
+
export function clipTranscripts(t, rect) {
|
|
190
|
+
const keep = [];
|
|
191
|
+
for (let i = 0; i < t.count; i++) {
|
|
192
|
+
if (t.x[i] >= rect.x0 && t.x[i] <= rect.x1 && t.y[i] >= rect.y0 && t.y[i] <= rect.y1)
|
|
193
|
+
keep.push(i);
|
|
194
|
+
}
|
|
195
|
+
if (keep.length === t.count)
|
|
196
|
+
return t;
|
|
197
|
+
const pick = (a) => {
|
|
198
|
+
const out = new a.constructor(keep.length);
|
|
199
|
+
keep.forEach((src, i) => { out[i] = a[src]; });
|
|
200
|
+
return out;
|
|
201
|
+
};
|
|
202
|
+
return {
|
|
203
|
+
count: keep.length, aggregated: t.aggregated,
|
|
204
|
+
x: pick(t.x), y: pick(t.y), z: pick(t.z), weight: pick(t.weight), observation: pick(t.observation),
|
|
205
|
+
gene: pick(t.gene),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Group transcripts into `bin`-wide squares of a grid anchored at the origin (so a pan does
|
|
210
|
+
* not move them), one entry per (group, square): `groupOf(gene slot)` says which group a gene
|
|
211
|
+
* is in — its cluster in the gene tree, or itself. Each entry sits at its transcripts'
|
|
212
|
+
* centroid, weighted by how many each stands for; it takes the gene and the cell holding most
|
|
213
|
+
* of them, each summed over all its transcripts in the entry. `group[i]` is entry i's group.
|
|
214
|
+
*/
|
|
215
|
+
export function groupTranscripts(t, bin, groupOf = (g) => g) {
|
|
216
|
+
const index = new Map();
|
|
217
|
+
const sx = [];
|
|
218
|
+
const sy = [];
|
|
219
|
+
const sz = [];
|
|
220
|
+
const w = [];
|
|
221
|
+
const grp = [];
|
|
222
|
+
// Per entry, how many transcripts of each gene (the dominant one gives the icon and colour)
|
|
223
|
+
// and in each cell (the dominant one is the entry's cell).
|
|
224
|
+
const geneW = [];
|
|
225
|
+
const obsW = [];
|
|
226
|
+
for (let i = 0; i < t.count; i++) {
|
|
227
|
+
const gk = groupOf(t.gene[i]);
|
|
228
|
+
const key = `${gk}|${Math.floor(t.x[i] / bin)}|${Math.floor(t.y[i] / bin)}`;
|
|
229
|
+
let k = index.get(key);
|
|
230
|
+
const wi = t.weight[i] || 1;
|
|
231
|
+
if (k === undefined) {
|
|
232
|
+
k = w.length;
|
|
233
|
+
index.set(key, k);
|
|
234
|
+
sx.push(0);
|
|
235
|
+
sy.push(0);
|
|
236
|
+
sz.push(0);
|
|
237
|
+
w.push(0);
|
|
238
|
+
grp.push(gk);
|
|
239
|
+
geneW.push(new Map());
|
|
240
|
+
obsW.push(new Map());
|
|
241
|
+
}
|
|
242
|
+
sx[k] += t.x[i] * wi;
|
|
243
|
+
sy[k] += t.y[i] * wi;
|
|
244
|
+
sz[k] += t.z[i] * wi;
|
|
245
|
+
w[k] += wi;
|
|
246
|
+
geneW[k].set(t.gene[i], (geneW[k].get(t.gene[i]) ?? 0) + wi);
|
|
247
|
+
obsW[k].set(t.observation[i], (obsW[k].get(t.observation[i]) ?? 0) + wi);
|
|
248
|
+
}
|
|
249
|
+
const n = w.length;
|
|
250
|
+
const tile = {
|
|
251
|
+
count: n, aggregated: true,
|
|
252
|
+
x: new Float32Array(n), y: new Float32Array(n), z: new Float32Array(n),
|
|
253
|
+
weight: new Uint32Array(n), observation: new Uint32Array(n), gene: new Uint16Array(n),
|
|
254
|
+
};
|
|
255
|
+
const group = new Int32Array(n);
|
|
256
|
+
for (let k = 0; k < n; k++) {
|
|
257
|
+
tile.x[k] = sx[k] / w[k];
|
|
258
|
+
tile.y[k] = sy[k] / w[k];
|
|
259
|
+
tile.z[k] = sz[k] / w[k];
|
|
260
|
+
tile.weight[k] = w[k];
|
|
261
|
+
tile.observation[k] = dominant(obsW[k]);
|
|
262
|
+
tile.gene[k] = dominant(geneW[k]);
|
|
263
|
+
group[k] = grp[k];
|
|
264
|
+
}
|
|
265
|
+
return { tile, group };
|
|
266
|
+
}
|
|
267
|
+
/** The key with the largest total; the first seen on a tie. */
|
|
268
|
+
function dominant(totals) {
|
|
269
|
+
let best = 0;
|
|
270
|
+
let top = -1;
|
|
271
|
+
for (const [key, v] of totals)
|
|
272
|
+
if (v > top) {
|
|
273
|
+
top = v;
|
|
274
|
+
best = key;
|
|
275
|
+
}
|
|
276
|
+
return best;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* The colour of each gene-tree cluster of a selection, for colouring transcripts by cluster: a
|
|
280
|
+
* cluster named like a group of the cells' grouping takes that group's colour (its cells and its
|
|
281
|
+
* transcripts agree); the others take palette colours in tree order. Clusters are the tree's
|
|
282
|
+
* groups holding a selected gene, then each ungrouped selected gene on its own. Every gene of a
|
|
283
|
+
* cluster gets the same colour — the tree's swatches and the markers use this one map.
|
|
284
|
+
*/
|
|
285
|
+
export function clusterColorMap(genes, groups, cellColors, palette) {
|
|
286
|
+
const chosen = new Set(genes);
|
|
287
|
+
const names = [];
|
|
288
|
+
const grouped = new Set();
|
|
289
|
+
for (const g of groups) {
|
|
290
|
+
const mine = g.genes.filter((x) => chosen.has(x) && !grouped.has(x));
|
|
291
|
+
if (!mine.length)
|
|
292
|
+
continue;
|
|
293
|
+
mine.forEach((x) => grouped.add(x));
|
|
294
|
+
names.push(g.name);
|
|
295
|
+
}
|
|
296
|
+
for (const gene of genes)
|
|
297
|
+
if (!grouped.has(gene))
|
|
298
|
+
names.push(gene);
|
|
299
|
+
const out = new Map();
|
|
300
|
+
let k = 0;
|
|
301
|
+
for (const name of names) {
|
|
302
|
+
if (out.has(name))
|
|
303
|
+
continue;
|
|
304
|
+
out.set(name, cellColors.get(name) ?? palette[k++ % palette.length]);
|
|
305
|
+
}
|
|
306
|
+
return out;
|
|
307
|
+
}
|
|
308
|
+
/** The cluster a selected gene is in: its first gene-tree group holding it, else itself. */
|
|
309
|
+
export function clusterOfGene(gene, groups) {
|
|
310
|
+
return groups.find((g) => g.genes.includes(gene))?.name ?? gene;
|
|
311
|
+
}
|
|
169
312
|
/** Smallest and largest transcript marker, in canvas pixels. */
|
|
170
313
|
export const TRANSCRIPT_MIN_PX = 4;
|
|
171
314
|
export const TRANSCRIPT_MAX_PX = 32;
|
|
@@ -503,4 +646,4 @@ export const INFERNO_SCALE = [
|
|
|
503
646
|
[0, '#000004'], [0.125, '#1b0c41'], [0.25, '#4a0c6b'], [0.375, '#781c6d'], [0.5, '#a52c60'],
|
|
504
647
|
[0.625, '#cf4446'], [0.75, '#ed6925'], [0.875, '#fb9b06'], [1, '#fcffa4'],
|
|
505
648
|
];
|
|
506
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC10aWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLXRpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBdUJILDRGQUE0RjtBQUM1RixNQUFNLFVBQVUsVUFBVSxDQUN4QixPQUFpRSxFQUNqRSxJQUF5QztJQUV6QyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxJQUFJLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqRSxPQUFPLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsZUFBZSxDQUFDLElBQVk7SUFDMUMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBdUIsRUFBRSxJQUE4QztJQUV2RSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQztJQUM1RSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNuRixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUNELE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO0FBQzdGLENBQUM7QUFFRCxNQUFNLFVBQVUsTUFBTSxDQUFDLENBQVU7SUFDL0IsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDdEMsQ0FBQztBQUVELDZGQUE2RjtBQUM3RixNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBWSxFQUFFLEdBQTRCO0lBQzFFLE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixNQUFpQyxFQUFFLElBQVksRUFBRSxPQUFlLEVBQUUsT0FBZSxFQUNqRixHQUE0QixFQUFFLE1BQU0sR0FBRyxJQUFJO0lBRTNDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakUsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxNQUFNLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDdEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDOUIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUM5QixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMzQixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0IsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3BHLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsSUFBYyxFQUFFLEtBQWEsRUFBRSxNQUFtQyxFQUNsRSxNQUE2QixFQUFFLEtBQUssR0FBRyxRQUFRO0lBRS9DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDckMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzNCLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDOUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMxQyxNQUFNLEdBQUcsR0FBYyxFQUFFLENBQUM7SUFDMUIsS0FBSyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ25DLEtBQUssSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFO1lBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7VUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkQsT0FBTyxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUs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LElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUU7UUFDakUsTUFBTSxHQUFHLEdBQUcsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDdkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2xDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxDQUFDO0lBQ0Ysa0RBQWtEO0lBQ2xELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBUyxFQUFFLE1BQWUsRUFBRSxFQUFFO1FBQzFDLE1BQU0sR0FBRyxHQUFHO1lBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVB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QUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM5QixNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDWixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJO29CQUFFLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEUsQ0FBQztZQUNELEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDWixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJO29CQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7WUFDRCxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUFvQixFQUFFLEdBQW1ELEVBQUUsT0FBZSxFQUMxRixFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsVUFBVSxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUU7SUFFdkMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN4QixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdkUsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO0lBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25GLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLEdBQUcsSUFBSTtZQUFFLFNBQVM7UUFDdkIsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFD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Q0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBdUI7SUFDL0MsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDO0lBQzNGLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztDQUMxRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMZXZlbC1vZi1kZXRhaWwgcGxhbm5pbmcgZm9yIHRpbGVkIHNwYXRpYWwgZ2VvbWV0cnkg4oCUIGNlbGwgb3V0bGluZXMgYW5kIHRyYW5zY3JpcHRzLlxuICpcbiAqIFRoZSByZW5kZXJlciBrbm93cyBpdHMgY2FtZXJhIChhIHdvcmxkLXNwYWNlIGNlbnRyZSwgYSB6b29tIGluIGNhbnZhcyBwaXhlbHMgcGVyIHdvcmxkXG4gKiB1bml0LCBhIGNhbnZhcyBzaXplKTsgYSB0aWxlZCBkYXRhc2V0IGtub3dzIGl0cyBncmlkcyAob25lIHBlciBsZXZlbCwgaW4gb2JzZXJ2YXRpb25cbiAqIHVuaXRzKS4gVGhpcyBtb2R1bGUgaXMgdGhlIGJyaWRnZTogd2hpY2ggbGV2ZWwgdGhlIHpvb20gY2FsbHMgZm9yLCB3aGljaCB0aWxlcyBhcmUgb25cbiAqIHNjcmVlbiwgaG93IGJpZyBhIHRyYW5zY3JpcHQgbWFya2VyIHNob3VsZCBiZS4gRXZlcnl0aGluZyBoZXJlIGlzIHB1cmUsIHNvIHRoZSBwb2xpY3lcbiAqIOKAlCB0aGUgcGFydCB0aGF0IGRlY2lkZXMgd2hldGhlciB0aGUgdmlldyBpcyBmYXN0IGFuZCBsZWdpYmxlIOKAlCBpcyB0ZXN0YWJsZSB3aXRob3V0IGFcbiAqIEdQVS5cbiAqXG4gKiBPYnNlcnZhdGlvbiB1bml0cyBtYXAgb250byB3b3JsZCB1bml0cyB0aHJvdWdoIHRoZSBkYXRhc2V0J3MgYGltYWdlUmVmYCBhZmZpbmVcbiAqIChgd29ybGQgPSBkYXRhIMK3IHNjYWxlICsgdHJhbnNsYXRlYCksIHNvIFwicGl4ZWxzIHBlciBvYnNlcnZhdGlvbiB1bml0XCIgaXNcbiAqIGB6b29tIMK3IHNjYWxlYC4gRm9yIGEgWGVuaXVtIGJ1bmRsZSB0aGUgZGF0YSB1bml0IGlzIHRoZSBtaWNyb24gYW5kIHRoZSB3b3JsZCB1bml0IHRoZVxuICogbW9ycGhvbG9neSBwaXhlbC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFNwYXRpYWxCb3VuZHMsIFNwYXRpYWxJbWFnZVJlZiwgU3BhdGlhbFRpbGVMZXZlbCxcbn0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUsIFRyYW5zY3JpcHRHbHlwaE5hbWUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxEYXRhc2V0IH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5cbi8qKiBBIHJlY3RhbmdsZSBpbiBvYnNlcnZhdGlvbiBjb29yZGluYXRlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVJlY3Qge1xuICB4MDogbnVtYmVyO1xuICB5MDogbnVtYmVyO1xuICB4MTogbnVtYmVyO1xuICB5MTogbnVtYmVyO1xufVxuXG4vKiogVGlsZSBhZGRyZXNzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaWxlS2V5IHtcbiAgbGV2ZWw6IG51bWJlcjtcbiAgZ3g6IG51bWJlcjtcbiAgZ3k6IG51bWJlcjtcbn1cblxuLyoqIFdoZXRoZXIgY2VsbCBvdXRsaW5lcyBhcmUgZHJhd246IHRoZSB1c2VyJ3MgY2hvaWNlLCBlbHNlIG9uIHdoZW4gdGhlIGRhdGFzZXQgaGFzIGFueS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZWxsc1Nob3duKFxuICBkYXRhc2V0OiBQaWNrPFNwYXRpYWxEYXRhc2V0LCAncG9seWdvblRpbGVzJyB8ICdwb2x5Z29ucyc+IHwgbnVsbCxcbiAgdmlldzogUGljazxTcGF0aWFsVmlld1N0YXRlLCAnc2hvd0NlbGxzJz4sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYXZhaWxhYmxlID0gISEoZGF0YXNldD8ucG9seWdvblRpbGVzIHx8IGRhdGFzZXQ/LnBvbHlnb25zKTtcbiAgcmV0dXJuIGF2YWlsYWJsZSAmJiAodmlldy5zaG93Q2VsbHMgPz8gdHJ1ZSk7XG59XG5cbi8qKiBBIGNvbHVtbiBob2xkaW5nIGEgaGFuZC1jdXJhdGVkIGNlbGwtdHlwZSBhbm5vdGF0aW9uLCBieSBuYW1pbmcgY29udmVudGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0N1cmF0ZWRDb2x1bW4obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvY3VyYXRlZC9pLnRlc3QobmFtZSk7XG59XG5cbi8qKlxuICogVGhlIGNhdGVnb3JpY2FsIGNvbHVtbiB0aGF0IG5hbWVzIGVhY2ggY2VsbCdzIHR5cGU6IHRoZSB2aWV3J3MgY2hvaWNlIHdoZW4gaXQgaXMgYVxuICogY29sdW1uIG9mIHRoaXMgZGF0YXNldCwgZWxzZSB0aGUgZmlyc3QgY2F0ZWdvcmljYWwgY29sdW1uIHRoYXQgaXMgbm90IGEgY3VyYXRlZFxuICogYW5ub3RhdGlvbiAoYSBwaXBlbGluZSdzIGNsdXN0ZXJpbmcgaXMgdGhlIGRlZmF1bHQ7IGN1cmF0aW9uIGlzIG9wdGVkIGludG8pLCBlbHNlXG4gKiBhbnkgY2F0ZWdvcmljYWwgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2VsbFR5cGVDb2x1bW5Gb3IoXG4gIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICdjZWxsVHlwZUNvbHVtbic+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGNhdGVnb3JpY2FsID0gZGF0YXNldC5jb2x1bW5zLmZpbHRlcigoYykgPT4gYy5raW5kID09PSAnY2F0ZWdvcmljYWwnKTtcbiAgaWYgKHZpZXcuY2VsbFR5cGVDb2x1bW4gJiYgY2F0ZWdvcmljYWwuc29tZSgoYykgPT4gYy5uYW1lID09PSB2aWV3LmNlbGxUeXBlQ29sdW1uKSkge1xuICAgIHJldHVybiB2aWV3LmNlbGxUeXBlQ29sdW1uO1xuICB9XG4gIHJldHVybiAoY2F0ZWdvcmljYWwuZmluZCgoYykgPT4gIWlzQ3VyYXRlZENvbHVtbihjLm5hbWUpKSA/PyBjYXRlZ29yaWNhbFswXSk/Lm5hbWUgPz8gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbGVJZChrOiBUaWxlS2V5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2subGV2ZWx9LyR7ay5neH0vJHtrLmd5fWA7XG59XG5cbi8qKiBDYW52YXMgcGl4ZWxzIHBlciBvYnNlcnZhdGlvbiB1bml0IGFsb25nIHgsIGZvciBhIGNhbWVyYSB6b29tIGFuZCBhIGRhdGHihpJ3b3JsZCBhZmZpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gcGl4ZWxzUGVyRGF0YVVuaXQoem9vbTogbnVtYmVyLCByZWY/OiBTcGF0aWFsSW1hZ2VSZWYgfCBudWxsKTogbnVtYmVyIHtcbiAgcmV0dXJuIHpvb20gKiBNYXRoLmFicyhyZWY/LnNjYWxlPy5bMF0gPz8gMSk7XG59XG5cbi8qKlxuICogVGhlIHBhcnQgb2Ygb2JzZXJ2YXRpb24gc3BhY2UgdGhlIGNhbWVyYSBzaG93cywgcGFkZGVkIGJ5IGBtYXJnaW5gIChhIGZyYWN0aW9uIG9mIHRoZVxuICogdmlld3BvcnQpIHNvIHRpbGVzIGp1c3Qgb2ZmIHNjcmVlbiBhcmUgYWxyZWFkeSB0aGVyZSB3aGVuIGEgcGFuIGJyaW5ncyB0aGVtIGluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmlzaWJsZURhdGFSZWN0KFxuICBjZW50ZXI6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0sIHpvb206IG51bWJlciwgY2FudmFzVzogbnVtYmVyLCBjYW52YXNIOiBudW1iZXIsXG4gIHJlZj86IFNwYXRpYWxJbWFnZVJlZiB8IG51bGwsIG1hcmdpbiA9IDAuMTUsXG4pOiBEYXRhUmVjdCB8IG51bGwge1xuICBpZiAoISh6b29tID4gMCkgfHwgIShjYW52YXNXID4gMCkgfHwgIShjYW52YXNIID4gMCkpIHJldHVybiBudWxsO1xuICBjb25zdCBzeCA9IHJlZj8uc2NhbGU/LlswXSA/PyAxO1xuICBjb25zdCBzeSA9IHJlZj8uc2NhbGU/LlsxXSA/PyAxO1xuICBjb25zdCB0eCA9IHJlZj8udHJhbnNsYXRlPy5bMF0gPz8gMDtcbiAgY29uc3QgdHkgPSByZWY/LnRyYW5zbGF0ZT8uWzFdID8/IDA7XG4gIGNvbnN0IGhhbGZXID0gKGNhbnZhc1cgLyB6b29tIC8gMikgKiAoMSArIDIgKiBtYXJnaW4pO1xuICBjb25zdCBoYWxmSCA9IChjYW52YXNIIC8gem9vbSAvIDIpICogKDEgKyAyICogbWFyZ2luKTtcbiAgY29uc3Qgd3gwID0gY2VudGVyWzBdIC0gaGFsZlc7XG4gIGNvbnN0IHd4MSA9IGNlbnRlclswXSArIGhhbGZXO1xuICBjb25zdCB3eTAgPSBjZW50ZXJbMV0gLSBoYWxmSDtcbiAgY29uc3Qgd3kxID0gY2VudGVyWzFdICsgaGFsZkg7XG4gIGNvbnN0IGF4ID0gKHd4MCAtIHR4KSAvIHN4O1xuICBjb25zdCBieCA9ICh3eDEgLSB0eCkgLyBzeDtcbiAgY29uc3QgYXkgPSAod3kwIC0gdHkpIC8gc3k7XG4gIGNvbnN0IGJ5ID0gKHd5MSAtIHR5KSAvIHN5O1xuICByZXR1cm4geyB4MDogTWF0aC5taW4oYXgsIGJ4KSwgeTA6IE1hdGgubWluKGF5LCBieSksIHgxOiBNYXRoLm1heChheCwgYngpLCB5MTogTWF0aC5tYXgoYXksIGJ5KSB9O1xufVxuXG4vKipcbiAqIFRpbGVzIG9mIG9uZSBsZXZlbCBpbnRlcnNlY3RpbmcgYHJlY3RgLCBjbGlwcGVkIHRvIHRoZSBkYXRhc2V0J3MgYGJvdW5kc2AgKHNvIHpvb21pbmdcbiAqIG91dCBvdmVyIGVtcHR5IGNhbnZhcyBkb2VzIG5vdCBhc2sgZm9yIHRpbGVzIHRoYXQgY2Fubm90IGV4aXN0KS4gT3JkZXJlZCBmcm9tIHRoZVxuICogcmVjdGFuZ2xlJ3MgY2VudHJlIG91dHdhcmQsIHNvIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbiBmaWxscyBpbiBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVzSW5SZWN0KFxuICByZWN0OiBEYXRhUmVjdCwgbGV2ZWw6IG51bWJlciwgbGV2ZWxzOiByZWFkb25seSBTcGF0aWFsVGlsZUxldmVsW10sXG4gIGJvdW5kcz86IFNwYXRpYWxCb3VuZHMgfCBudWxsLCBsaW1pdCA9IEluZmluaXR5LFxuKTogVGlsZUtleVtdIHtcbiAgY29uc3Qgc2l6ZSA9IGxldmVsc1tsZXZlbF0/LnRpbGVTaXplO1xuICBpZiAoIShzaXplID4gMCkpIHJldHVybiBbXTtcbiAgbGV0IHsgeDAsIHkwLCB4MSwgeTEgfSA9IHJlY3Q7XG4gIGlmIChib3VuZHMpIHtcbiAgICB4MCA9IE1hdGgubWF4KHgwLCBib3VuZHNbMF0pO1xuICAgIHkwID0gTWF0aC5tYXgoeTAsIGJvdW5kc1sxXSk7XG4gICAgeDEgPSBNYXRoLm1pbih4MSwgYm91bmRzWzJdKTtcbiAgICB5MSA9IE1hdGgubWluKHkxLCBib3VuZHNbM10pO1xuICAgIGlmICh4MSA8IHgwIHx8IHkxIDwgeTApIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBneDAgPSBNYXRoLmZsb29yKHgwIC8gc2l6ZSk7XG4gIGNvbnN0IGd4MSA9IE1hdGguZmxvb3IoeDEgLyBzaXplKTtcbiAgY29uc3QgZ3kwID0gTWF0aC5mbG9vcih5MCAvIHNpemUpO1xuICBjb25zdCBneTEgPSBNYXRoLmZsb29yKHkxIC8gc2l6ZSk7XG4gIGNvbnN0IGN4ID0gKHJlY3QueDAgKyByZWN0LngxKSAvIDIgLyBzaXplO1xuICBjb25zdCBjeSA9IChyZWN0LnkwICsgcmVjdC55MSkgLyAyIC8gc2l6ZTtcbiAgY29uc3Qgb3V0OiBUaWxlS2V5W10gPSBbXTtcbiAgZm9yIChsZXQgZ3kgPSBneTA7IGd5IDw9IGd5MTsgZ3krKykge1xuICAgIGZvciAobGV0IGd4ID0gZ3gwOyBneCA8PSBneDE7IGd4KyspIG91dC5wdXNoKHsgbGV2ZWwsIGd4LCBneSB9KTtcbiAgfVxuICBvdXQuc29ydCgoYSwgYikgPT4gKChhLmd4ICsgMC41IC0gY3gpICoqIDIgKyAoYS5neSArIDAuNSAtIGN5KSAqKiAyKVxuICAgIC0gKChiLmd4ICsgMC41IC0gY3gpICoqIDIgKyAoYi5neSArIDAuNSAtIGN5KSAqKiAyKSk7XG4gIHJldHVybiBvdXQubGVuZ3RoID4gbGltaXQgPyBvdXQuc2xpY2UoMCwgbGltaXQpIDogb3V0O1xufVxuXG4vKipcbiAqIFR5cGljYWwgY2VsbCBkaWFtZXRlciwgaW4gb2JzZXJ2YXRpb24gdW5pdHMsIHVzZWQgdG8ganVkZ2UgaG93IGxhcmdlIGNlbGxzIGFwcGVhci5cbiAqIERlcml2ZWQgZnJvbSB0aGUgcGVyLW9ic2VydmF0aW9uIHJhZGl1cyB3aGVuIHRoZXJlIGlzIG9uZTsgMTIgwrVtIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGljYWxDZWxsRGlhbWV0ZXIocmFkaXVzOiBGbG9hdDMyQXJyYXkgfCBudW1iZXIgfCB1bmRlZmluZWQsIGZhbGxiYWNrID0gMTIpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHJhZGl1cyA9PT0gJ251bWJlcicpIHJldHVybiByYWRpdXMgPiAwID8gcmFkaXVzICogMiA6IGZhbGxiYWNrO1xuICBpZiAoIXJhZGl1cz8ubGVuZ3RoKSByZXR1cm4gZmFsbGJhY2s7XG4gIC8vIFRoZSBtZWRpYW4gb2YgYSBzYW1wbGUgaXMgcGxlbnR5IOKAlCB0aGlzIHNldHMgYSB0aHJlc2hvbGQsIG5vdCBhIG1lYXN1cmVtZW50LlxuICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihyYWRpdXMubGVuZ3RoIC8gMjA0OCkpO1xuICBjb25zdCBzYW1wbGU6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFkaXVzLmxlbmd0aDsgaSArPSBzdGVwKSB7XG4gICAgaWYgKHJhZGl1c1tpXSA+IDApIHNhbXBsZS5wdXNoKHJhZGl1c1tpXSk7XG4gIH1cbiAgaWYgKCFzYW1wbGUubGVuZ3RoKSByZXR1cm4gZmFsbGJhY2s7XG4gIHNhbXBsZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIHJldHVybiBzYW1wbGVbc2FtcGxlLmxlbmd0aCA+PiAxXSAqIDI7XG59XG5cbi8qKlxuICogT24tc2NyZWVuIGNlbGwgZGlhbWV0ZXIgKHB4KSBhdCBvciBhYm92ZSB3aGljaCBlYWNoIHBvbHlnb24gbGV2ZWwgaXMgdXNlZC4gQSBsZXZlbFxuICogaGFsdmVzIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgb25lIGJlbG93LCBzbyBlYWNoIHNob3VsZCB0YWtlIG92ZXIgd2hlbiB0aGUgY2VsbCBpcyBhYm91dFxuICogaGFsZiBhcyBsYXJnZSBvbiBzY3JlZW4uIEJlbG93IHRoZSBsYXN0IGZpbml0ZSB0aHJlc2hvbGQgb3V0bGluZXMgYXJlIG5vdCBkcmF3biBhdFxuICogYWxsIOKAlCBhIGNlbGwgYSBmZXcgcGl4ZWxzIHdpZGUgaXMgYSBkb3QsIGFuZCB0aGUgb2JzZXJ2YXRpb24gbWFya2VycyBhbHJlYWR5IGRyYXcgaXRcbiAqIGFzIG9uZS5cbiAqXG4gKiBYZW5pdW0ncyBmb3VydGggbGV2ZWwgKDMgdmVydGljZXMgcGVyIGNlbGwpIGlzIGRlbGliZXJhdGVseSBuZXZlciB1c2VkOiBzZWVuIG9uXG4gKiBzY3JlZW4gaXQgaXMgYSBmaWVsZCBvZiB0cmlhbmdsZXMsIHdoaWNoIHJlYWRzIGFzIGFuIGFydGVmYWN0IHJhdGhlciB0aGFuIGFzIGNlbGxzLlxuICogVGhlIGRvdHMgYmVsb3cgOCBweCBzYXkgdGhlIHNhbWUgdGhpbmcgbW9yZSBob25lc3RseS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBPTFlHT05fTEVWRUxfTUlOX0NFTExfUFggPSBbMzYsIDE4LCA4LCBJbmZpbml0eV07XG5cbi8qKlxuICogV2hpY2ggcG9seWdvbiBsZXZlbCBzdWl0cyB0aGlzIHpvb20sIG9yIC0xIGZvciBcInRvbyBzbWFsbCB0byBvdXRsaW5lXCIuXG4gKiBgZGV0YWlsYCA+IDEgcHJlZmVycyBmaW5lciBsZXZlbHMgKHNoYXJwZXIsIHNsb3dlcik7IDwgMSBjb2Fyc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9seWdvbkxldmVsRm9yKFxuICBweFBlclVuaXQ6IG51bWJlciwgY2VsbERpYW1ldGVyOiBudW1iZXIsIGxldmVsQ291bnQ6IG51bWJlciwgZGV0YWlsID0gMSxcbik6IG51bWJlciB7XG4gIGNvbnN0IGNlbGxQeCA9IHB4UGVyVW5pdCAqIGNlbGxEaWFtZXRlciAqIGRldGFpbDtcbiAgY29uc3QgdGFibGUgPSBQT0xZR09OX0xFVkVMX01JTl9DRUxMX1BYO1xuICBmb3IgKGxldCBsID0gMDsgbCA8IGxldmVsQ291bnQ7IGwrKykge1xuICAgIC8vIFBhc3QgdGhlIHRhYmxlLCBrZWVwIGhhbHZpbmc6IGVhY2ggbGV2ZWwgc3RpbGwgaGFsdmVzIHRoZSB2ZXJ0aWNlcy5cbiAgICBjb25zdCBtaW4gPSB0YWJsZVtsXSA/PyB0YWJsZVt0YWJsZS5sZW5ndGggLSAxXSAvIDIgKiogKGwgLSB0YWJsZS5sZW5ndGggKyAxKTtcbiAgICBpZiAoY2VsbFB4ID49IG1pbikgcmV0dXJuIGw7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFdoaWNoIHRyYW5zY3JpcHQgbGV2ZWwgc3VpdHMgdGhpcyB6b29tOiB0aGUgb25lIHdob3NlIHRpbGVzIGNvbWUgb3V0IGNsb3Nlc3QgdG9cbiAqIGB0YXJnZXRUaWxlUHhgIG9uIHNjcmVlbi4gQ29hcnNlciBsZXZlbHMgYWdncmVnYXRlIG1vcmUsIHNvIHRoaXMga2VlcHMgdGhlIG51bWJlciBvZlxuICogbWFya2VycyBwZXIgc2NyZWVuIHJvdWdobHkgY29uc3RhbnQgaG93ZXZlciBmYXIgb3V0IHRoZSBjYW1lcmEgaXMg4oCUIHRoZSBwcm9wZXJ0eSB0aGF0XG4gKiBrZWVwcyB0aGUgdmlldyBmYXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNjcmlwdExldmVsRm9yKFxuICBweFBlclVuaXQ6IG51bWJlciwgbGV2ZWxzOiByZWFkb25seSBTcGF0aWFsVGlsZUxldmVsW10sIHRhcmdldFRpbGVQeCA9IDUxMixcbik6IG51bWJlciB7XG4gIGlmICghbGV2ZWxzLmxlbmd0aCB8fCAhKHB4UGVyVW5pdCA+IDApKSByZXR1cm4gMDtcbiAgbGV0IGJlc3QgPSAwO1xuICBsZXQgYmVzdEVyciA9IEluZmluaXR5O1xuICBmb3IgKGxldCBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwrKykge1xuICAgIGNvbnN0IGVyciA9IE1hdGguYWJzKE1hdGgubG9nMigobGV2ZWxzW2xdLnRpbGVTaXplICogcHhQZXJVbml0KSAvIHRhcmdldFRpbGVQeCkpO1xuICAgIGlmIChlcnIgPCBiZXN0RXJyKSB7XG4gICAgICBiZXN0RXJyID0gZXJyO1xuICAgICAgYmVzdCA9IGw7XG4gICAgfVxuICB9XG4gIHJldHVybiBiZXN0O1xufVxuXG4vKiogU21hbGxlc3QgYW5kIGxhcmdlc3QgdHJhbnNjcmlwdCBtYXJrZXIsIGluIGNhbnZhcyBwaXhlbHMuICovXG5leHBvcnQgY29uc3QgVFJBTlNDUklQVF9NSU5fUFggPSA0O1xuZXhwb3J0IGNvbnN0IFRSQU5TQ1JJUFRfTUFYX1BYID0gMzI7XG4vKipcbiAqIFBoeXNpY2FsIGRpYW1ldGVyIGEgc2luZ2xlIHRyYW5zY3JpcHQgaXMgZHJhd24gYXQsIGluIMK1bSDigJQgY2xlYXJseSBsYXJnZXIgdGhhbiB0aGVcbiAqIGltYWdlZCBzcG90ICh+MC4zIMK1bSkgc28gaXQgc3RheXMgbGVnaWJsZSwgYW5kIHNtYWxsIGVub3VnaCB0aGF0IG5laWdoYm91cmluZ1xuICogbW9sZWN1bGVzIGluc2lkZSBvbmUgY2VsbCBzdGF5IGFwYXJ0LlxuICovXG5leHBvcnQgY29uc3QgVFJBTlNDUklQVF9QSFlTSUNBTF9VTSA9IDEuMjtcblxuLyoqXG4gKiBNYXJrZXIgZGlhbWV0ZXIgaW4gY2FudmFzIHBpeGVscyBmb3IgYW4gZW50cnkgc3RhbmRpbmcgZm9yIGB3ZWlnaHRgIHRyYW5zY3JpcHRzLlxuICpcbiAqIFRoZSBjb252ZW50aW9uIHNwYXRpYWwgdmlld2VycyBzaGFyZSAoZGVjay5nbCdzIGByYWRpdXNNaW5QaXhlbHNgL2ByYWRpdXNNYXhQaXhlbHNgLFxuICogWGVuaXVtIEV4cGxvcmVyJ3MgdHJhbnNjcmlwdCBzaXplKTogYSBQSFlTSUNBTCBzaXplLCBjbGFtcGVkIHRvIGEgc2NyZWVuLXBpeGVsIHJhbmdlLlxuICogWm9vbWVkIG91dCwgbWFya2VycyBzaXQgYXQgdGhlIG1pbmltdW0gYW5kIG5ldmVyIHZhbmlzaDsgem9vbWVkIGluLCB0aGV5IGdyb3cgd2l0aCB0aGVcbiAqIHRpc3N1ZSBpbnN0ZWFkIG9mIHNocmlua2luZyB0byBzcGVja3MgbmV4dCB0byBjZWxscyBodW5kcmVkcyBvZiBwaXhlbHMgd2lkZS4gQSBmaXhlZFxuICogc2NyZWVuIHNpemUgZG9lcyB0aGUgb3Bwb3NpdGUgYXQgaGlnaCB6b29tLCB3aGljaCBpcyB3aGF0IG1hZGUgdHJhbnNjcmlwdHMgZGlzYXBwZWFyXG4gKiBhdCBwaXhlbC1sZXZlbCB6b29tLlxuICpcbiAqIEFnZ3JlZ2F0ZXMgZ3JvdyB3aXRoIHRoZSBjdWJlIHJvb3Qgb2YgdGhlaXIgY291bnQ6IGFyZWEg4oidIGNvdW50IHdvdWxkIGxldCBvbmUgZGVuc2VcbiAqIGFnZ3JlZ2F0ZSBzd2FsbG93IGl0cyBuZWlnaGJvdXJzLCB0aGUgY3ViZSByb290IGtlZXBzIGEgMTAwMC10cmFuc2NyaXB0IGNsdXN0ZXIgY2xlYXJseVxuICogbGFyZ2VyIHRoYW4gYSAxMC10cmFuc2NyaXB0IG9uZSB3aXRob3V0IGNvdmVyaW5nIHRoZSB0aWxlLlxuICpcbiAqIGBweFBlck1pY3JvbmAgaXMgb21pdHRlZCBmb3IgZGF0YSB3aXRoIG5vIGtub3duIHBoeXNpY2FsIHVuaXQ7IHRoZSBtYXJrZXIgaXMgdGhlblxuICogc2NyZWVuLXNpemVkIG9ubHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2NyaXB0TWFya2VyUHgod2VpZ2h0OiBudW1iZXIsIHNjYWxlID0gMSwgcHhQZXJNaWNyb24/OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBjb3VudGVkID0gVFJBTlNDUklQVF9NSU5fUFggKiBNYXRoLmNicnQoTWF0aC5tYXgoMSwgd2VpZ2h0KSk7XG4gIGNvbnN0IHBoeXNpY2FsID0gcHhQZXJNaWNyb24gPyBUUkFOU0NSSVBUX1BIWVNJQ0FMX1VNICogcHhQZXJNaWNyb24gOiAwO1xuICBjb25zdCBweCA9IE1hdGgubWF4KGNvdW50ZWQsIHBoeXNpY2FsKSAqIHNjYWxlO1xuICByZXR1cm4gTWF0aC5taW4oVFJBTlNDUklQVF9NQVhfUFggKiBNYXRoLm1heChzY2FsZSwgMSksIE1hdGgubWF4KFRSQU5TQ1JJUFRfTUlOX1BYICogc2NhbGUsIHB4KSk7XG59XG5cbi8vIOKUgOKUgCBHbHlwaHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBNYXJrZXIgc2hhcGVzIGZvciB0aGUgdHJhbnNjcmlwdCBcImljb25cIiBtb2RlLiBBbGwgc3Rhci1jb252ZXgsIHNvIGEgZmFuIGZpbGxzIHRoZW0uICovXG5leHBvcnQgY29uc3QgVFJBTlNDUklQVF9HTFlQSFMgPSBbXG4gICdjaXJjbGUnLCAnc3RhcicsICd0cmlhbmdsZScsICdzcXVhcmUnLCAnZGlhbW9uZCcsICdjcm9zcycsICdoZXhhZ29uJywgJ3RyaWFuZ2xlLWRvd24nLFxuICAncGVudGFnb24nLCAneCcsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgVHJhbnNjcmlwdEdseXBoID0gdHlwZW9mIFRSQU5TQ1JJUFRfR0xZUEhTW251bWJlcl07XG4vLyBUaGUgdmlldyBzdGF0ZSBuYW1lcyBnbHlwaHMgd2l0aG91dCBpbXBvcnRpbmcgdGhpcyBtb2R1bGU7IGtlZXAgdGhlIHR3byBpbiBzdGVwLlxuY29uc3QgX2dseXBoTmFtZXNNYXRjaDogVHJhbnNjcmlwdEdseXBoIGV4dGVuZHMgVHJhbnNjcmlwdEdseXBoTmFtZVxuICA/IChUcmFuc2NyaXB0R2x5cGhOYW1lIGV4dGVuZHMgVHJhbnNjcmlwdEdseXBoID8gdHJ1ZSA6IG5ldmVyKSA6IG5ldmVyID0gdHJ1ZTtcbnZvaWQgX2dseXBoTmFtZXNNYXRjaDtcblxuLyoqIFVuaXQgb3V0bGluZSBvZiBhIGdseXBoLCByYWRpdXMg4omIIDEsIGNlbnRyZWQgb24gdGhlIG9yaWdpbiwgYXMgYFt4MCwgeTAsIHgxLCB5MSwg4oCmXWAuICovXG5leHBvcnQgZnVuY3Rpb24gZ2x5cGhPdXRsaW5lKGdseXBoOiBUcmFuc2NyaXB0R2x5cGgpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBwb2x5ID0gKG46IG51bWJlciwgcm90ID0gLU1hdGguUEkgLyAyLCByID0gMSkgPT4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkobiAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBjb25zdCBhID0gcm90ICsgKGkgKiAyICogTWF0aC5QSSkgLyBuO1xuICAgICAgb3V0WzIgKiBpXSA9IE1hdGguY29zKGEpICogcjtcbiAgICAgIG91dFsyICogaSArIDFdID0gTWF0aC5zaW4oYSkgKiByO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9O1xuICBjb25zdCBzdGFyID0gKHBvaW50czogbnVtYmVyLCBpbm5lcjogbnVtYmVyLCByb3QgPSAtTWF0aC5QSSAvIDIpID0+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KHBvaW50cyAqIDQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzICogMjsgaSsrKSB7XG4gICAgICBjb25zdCBhID0gcm90ICsgKGkgKiBNYXRoLlBJKSAvIHBvaW50cztcbiAgICAgIGNvbnN0IHIgPSBpICUgMiA9PT0gMCA/IDEgOiBpbm5lcjtcbiAgICAgIG91dFsyICogaV0gPSBNYXRoLmNvcyhhKSAqIHI7XG4gICAgICBvdXRbMiAqIGkgKyAxXSA9IE1hdGguc2luKGEpICogcjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcbiAgLy8gQSBwbHVzIGJ1aWx0IGFzIGEgMTItZ29uOiBhcm1zIG9mIGhhbGYtd2lkdGggdy5cbiAgY29uc3QgcGx1cyA9ICh3OiBudW1iZXIsIHJvdGF0ZTogYm9vbGVhbikgPT4ge1xuICAgIGNvbnN0IHB0cyA9IFtcbiAgICAgIFt3LCAtMV0sIFt3LCAtd10sIFsxLCAtd10sIFsxLCB3XSwgW3csIHddLCBbdywgMV0sXG4gICAgICBbLXcsIDFdLCBbLXcsIHddLCBbLTEsIHddLCBbLTEsIC13XSwgWy13LCAtd10sIFstdywgLTFdLFxuICAgIF07XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShwdHMubGVuZ3RoICogMik7XG4gICAgY29uc3QgYyA9IE1hdGguU1FSVDFfMjtcbiAgICBwdHMuZm9yRWFjaCgoW3gsIHldLCBpKSA9PiB7XG4gICAgICBvdXRbMiAqIGldID0gcm90YXRlID8gKHggLSB5KSAqIGMgOiB4O1xuICAgICAgb3V0WzIgKiBpICsgMV0gPSByb3RhdGUgPyAoeCArIHkpICogYyA6IHk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcbiAgc3dpdGNoIChnbHlwaCkge1xuICAgIGNhc2UgJ2NpcmNsZSc6IHJldHVybiBwb2x5KDEyKTtcbiAgICBjYXNlICdzdGFyJzogcmV0dXJuIHN0YXIoNSwgMC40NSk7XG4gICAgY2FzZSAndHJpYW5nbGUnOiByZXR1cm4gcG9seSgzKTtcbiAgICBjYXNlICd0cmlhbmdsZS1kb3duJzogcmV0dXJuIHBvbHkoMywgTWF0aC5QSSAvIDIpO1xuICAgIGNhc2UgJ3NxdWFyZSc6IHJldHVybiBwb2x5KDQsIE1hdGguUEkgLyA0LCBNYXRoLlNRUlQyICogMC44KTtcbiAgICBjYXNlICdkaWFtb25kJzogcmV0dXJuIHBvbHkoNCwgLU1hdGguUEkgLyAyKTtcbiAgICBjYXNlICdoZXhhZ29uJzogcmV0dXJuIHBvbHkoNiwgMCk7XG4gICAgY2FzZSAncGVudGFnb24nOiByZXR1cm4gcG9seSg1KTtcbiAgICBjYXNlICdjcm9zcyc6IHJldHVybiBwbHVzKDAuMzIsIGZhbHNlKTtcbiAgICBjYXNlICd4JzogcmV0dXJuIHBsdXMoMC4yOCwgdHJ1ZSk7XG4gIH1cbn1cblxuLyoqIFRoZSBnbHlwaCBhIGdlbmUgZ2V0cyBieSBkZWZhdWx0OiBieSBpdHMgcG9zaXRpb24gaW4gdGhlIHNlbGVjdGVkIGxpc3QuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEdseXBoRm9yKHNsb3Q6IG51bWJlcik6IFRyYW5zY3JpcHRHbHlwaCB7XG4gIHJldHVybiBUUkFOU0NSSVBUX0dMWVBIU1tzbG90ICUgVFJBTlNDUklQVF9HTFlQSFMubGVuZ3RoXTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgcG9pbnQgbWFya2VycyBpbnRvIGdseXBoIHJpbmdzIGZvciBhIHNoYXBlcyBsYXllcjogZW50cnkgYGlgIGJlY29tZXMgYSBjb3B5IG9mXG4gKiBgZ2x5cGhzW2dlbmVbaV1dYCBzY2FsZWQgdG8gYHJhZGl1c1tpXWAgYW5kIGNlbnRyZWQgb24gYCh4W2ldLCB5W2ldKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnbHlwaFJpbmdzKFxuICB4OiBGbG9hdDMyQXJyYXksIHk6IEZsb2F0MzJBcnJheSwgcmFkaXVzOiBGbG9hdDMyQXJyYXksIGdseXBoT2Y6IChpOiBudW1iZXIpID0+IEZsb2F0MzJBcnJheSxcbik6IHsgY29vcmRzOiBGbG9hdDMyQXJyYXk7IG9mZnNldHM6IFVpbnQzMkFycmF5IH0ge1xuICBjb25zdCBuID0geC5sZW5ndGg7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkobiArIDEpO1xuICBsZXQgdG90YWwgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIG9mZnNldHNbaV0gPSB0b3RhbDtcbiAgICB0b3RhbCArPSBnbHlwaE9mKGkpLmxlbmd0aCAvIDI7XG4gIH1cbiAgb2Zmc2V0c1tuXSA9IHRvdGFsO1xuICBjb25zdCBjb29yZHMgPSBuZXcgRmxvYXQzMkFycmF5KHRvdGFsICogMik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgY29uc3QgZyA9IGdseXBoT2YoaSk7XG4gICAgY29uc3QgciA9IHJhZGl1c1tpXTtcbiAgICBsZXQgbyA9IG9mZnNldHNbaV0gKiAyO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgZy5sZW5ndGg7IGsgKz0gMikge1xuICAgICAgY29vcmRzW28rK10gPSB4W2ldICsgZ1trXSAqIHI7XG4gICAgICBjb29yZHNbbysrXSA9IHlbaV0gKyBnW2sgKyAxXSAqIHI7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGNvb3Jkcywgb2Zmc2V0cyB9O1xufVxuXG4vLyDilIDilIAgRGlzY3JldGUgY29sb3VyaW5nIHRocm91Z2ggYSBjb2xvcm1hcCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBIHNoYXBlcyBsYXllciBjb2xvdXJzIHRocm91Z2ggYSBjb2xvcm1hcCBMVVQsIG5vdCBwZXItc2hhcGUgUkdCQS4gQSBjYXRlZ29yaWNhbFxuICogcGFsZXR0ZSBiZWNvbWVzIGEgcGllY2V3aXNlLWNvbnN0YW50IGNvbG9ybWFwOiBjYXRlZ29yeSBgY2Agb2YgYG5gIG93bnMgdGhlIGJhbmRcbiAqIGBbYy9uLCAoYysxKS9uKWAsIGFuZCBhIHNoYXBlIHRha2VzIHRoZSB2YWx1ZSBhdCBpdHMgYmFuZCdzIGNlbnRyZSwgc28gdGhlIExVVCdzXG4gKiBsaW5lYXIgZmlsdGVyaW5nIG5ldmVyIGJsZW5kcyB0d28gY2F0ZWdvcmllcy5cbiAqXG4gKiBSZXR1cm5zIHRoZSBzdG9wcyAobGluZWFyIDAuLjEgUkdCKSBhbmQgYSBmdW5jdGlvbiBtYXBwaW5nIGEgY2F0ZWdvcnkgY29kZSB0byB0aGVcbiAqIHZhbHVlIHRvIGhhbmQgdGhlIGxheWVyLiBgbWlzc2luZ2AgaXMgdGhlIGNvbG91ciBvZiB0aGUgZXh0cmEgYmFuZCB1c2VkIGZvciBcIm5vXG4gKiBjYXRlZ29yeVwiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzY3JldGVDb2xvcm1hcFN0b3BzKFxuICByZ2I6IHJlYWRvbmx5IChyZWFkb25seSBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pW10sIG1pc3Npbmc6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbik6IHsgc3RvcHM6IHsgdDogbnVtYmVyOyBjb2xvcjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIH1bXTsgdmFsdWVPZjogKGNvZGU6IG51bWJlcikgPT4gbnVtYmVyIH0ge1xuICBjb25zdCBiYW5kcyA9IFsuLi5yZ2IsIG1pc3NpbmddO1xuICBjb25zdCBuID0gYmFuZHMubGVuZ3RoO1xuICBjb25zdCBzdG9wczogeyB0OiBudW1iZXI7IGNvbG9yOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfVtdID0gW107XG4gIGNvbnN0IGVwcyA9IDFlLTY7XG4gIGJhbmRzLmZvckVhY2goKGMsIGkpID0+IHtcbiAgICBjb25zdCBjb2xvcjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW2NbMF0gLyAyNTUsIGNbMV0gLyAyNTUsIGNbMl0gLyAyNTVdO1xuICAgIHN0b3BzLnB1c2goeyB0OiBpIC8gbiArIChpID09PSAwID8gMCA6IGVwcyksIGNvbG9yIH0pO1xuICAgIHN0b3BzLnB1c2goeyB0OiAoaSArIDEpIC8gbiAtIChpID09PSBuIC0gMSA/IDAgOiBlcHMpLCBjb2xvciB9KTtcbiAgfSk7XG4gIGNvbnN0IG1pc3NpbmdDb2RlID0gbiAtIDE7XG4gIHJldHVybiB7XG4gICAgc3RvcHMsXG4gICAgdmFsdWVPZjogKGNvZGU6IG51bWJlcikgPT4gKChjb2RlIDwgMCB8fCBjb2RlID49IG1pc3NpbmdDb2RlID8gbWlzc2luZ0NvZGUgOiBjb2RlKSArIDAuNSkgLyBuLFxuICB9O1xufVxuXG4vLyDilIDilIAgRGVuc2l0eSByYXN0ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogU2VwYXJhYmxlIEdhdXNzaWFuIGJsdXIgb2YgYSByb3ctbWFqb3IgcmFzdGVyLCBgc2lnbWFgIGluIHJhc3RlciBjZWxscy5cbiAqXG4gKiBBIHBlci1nZW5lIGNvdW50IHJhc3RlciBhdCAxMCDCtW0gaXMgbW9zdGx5IHplcm9zIGFuZCBvbmVzIOKAlCBkcmF3biBhcy1pcyBpdCBpcyBzcGVja2xlLFxuICogbm90IGEgZGVuc2l0eS4gQSDPgyBvZiBvbmUgdG8gdHdvIGNlbGxzICgxMOKAkzIwIMK1bSwgYWJvdXQgYSBjZWxsIGRpYW1ldGVyKSB0dXJucyBpdCBpbnRvXG4gKiBhIGZpZWxkIHRoYXQgcmVhZHMgYXMgdGVycml0b3J5IHdoaWxlIGtlZXBpbmcgc3RydWN0dXJlcyBhIGZldyBjZWxscyB3aWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc21vb3RoUmFzdGVyKHZhbHVlczogRmxvYXQzMkFycmF5LCByb3dzOiBudW1iZXIsIGNvbHM6IG51bWJlciwgc2lnbWE6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGlmICghKHNpZ21hID4gMCkpIHJldHVybiB2YWx1ZXMuc2xpY2UoKTtcbiAgY29uc3QgciA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChzaWdtYSAqIDMpKTtcbiAgY29uc3Qga2VybmVsID0gbmV3IEZsb2F0MzJBcnJheSgyICogciArIDEpO1xuICBsZXQgc3VtID0gMDtcbiAgZm9yIChsZXQgaSA9IC1yOyBpIDw9IHI7IGkrKykgc3VtICs9IChrZXJuZWxbaSArIHJdID0gTWF0aC5leHAoLShpICogaSkgLyAoMiAqIHNpZ21hICogc2lnbWEpKSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2VybmVsLmxlbmd0aDsgaSsrKSBrZXJuZWxbaV0gLz0gc3VtO1xuICBjb25zdCB0bXAgPSBuZXcgRmxvYXQzMkFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICBmb3IgKGxldCB5ID0gMDsgeSA8IHJvd3M7IHkrKykge1xuICAgIGNvbnN0IHJvdyA9IHkgKiBjb2xzO1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgY29sczsgeCsrKSB7XG4gICAgICBsZXQgYWNjID0gMDtcbiAgICAgIGZvciAobGV0IGsgPSAtcjsgayA8PSByOyBrKyspIHtcbiAgICAgICAgY29uc3QgeHggPSB4ICsgaztcbiAgICAgICAgaWYgKHh4ID49IDAgJiYgeHggPCBjb2xzKSBhY2MgKz0gdmFsdWVzW3JvdyArIHh4XSAqIGtlcm5lbFtrICsgcl07XG4gICAgICB9XG4gICAgICB0bXBbcm93ICsgeF0gPSBhY2M7XG4gICAgfVxuICB9XG4gIGZvciAobGV0IHkgPSAwOyB5IDwgcm93czsgeSsrKSB7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBjb2xzOyB4KyspIHtcbiAgICAgIGxldCBhY2MgPSAwO1xuICAgICAgZm9yIChsZXQgayA9IC1yOyBrIDw9IHI7IGsrKykge1xuICAgICAgICBjb25zdCB5eSA9IHkgKyBrO1xuICAgICAgICBpZiAoeXkgPj0gMCAmJiB5eSA8IHJvd3MpIGFjYyArPSB0bXBbeXkgKiBjb2xzICsgeF0gKiBrZXJuZWxbayArIHJdO1xuICAgICAgfVxuICAgICAgb3V0W3kgKiBjb2xzICsgeF0gPSBhY2M7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ29sb3VyIGEgZGVuc2l0eSByYXN0ZXIgYXMgUkdCQSBieXRlczogbG9nLXNjYWxlZCwgd2luZG93ZWQgYXQgYSBoaWdoIHBlcmNlbnRpbGUgb2YgdGhlXG4gKiBub24temVybyB2YWx1ZXMsIGFuZCBmYWRlZCBpbiBmcm9tIHRyYW5zcGFyZW50IHNvIGVtcHR5IHRpc3N1ZSBzaG93cyB3aGF0IGlzIHVuZGVyIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JEZW5zaXR5KFxuICB2YWx1ZXM6IEZsb2F0MzJBcnJheSwgbHV0OiByZWFkb25seSAocmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKVtdLCBvcGFjaXR5OiBudW1iZXIsXG4gIHsgbG9nID0gdHJ1ZSwgcGVyY2VudGlsZSA9IDAuOTk1IH0gPSB7fSxcbik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBuID0gdmFsdWVzLmxlbmd0aDtcbiAgY29uc3QgdCA9IGxvZyA/IHZhbHVlcy5tYXAoKHYpID0+IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgdikpKSA6IHZhbHVlcztcbiAgY29uc3QgcG9zaXRpdmU6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSBpZiAodFtpXSA+IDApIHBvc2l0aXZlLnB1c2godFtpXSk7XG4gIHBvc2l0aXZlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgY29uc3QgYXQgPSBNYXRoLm1pbihwb3NpdGl2ZS5sZW5ndGggLSAxLCBNYXRoLmZsb29yKHBlcmNlbnRpbGUgKiBwb3NpdGl2ZS5sZW5ndGgpKTtcbiAgY29uc3QgaGkgPSBwb3NpdGl2ZS5sZW5ndGggPyBwb3NpdGl2ZVthdF0gOiAxO1xuICBjb25zdCByZ2JhID0gbmV3IFVpbnQ4QXJyYXkobiAqIDQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IGYgPSBNYXRoLm1pbigxLCB0W2ldIC8gKGhpIHx8IDEpKTtcbiAgICBpZiAoZiA8IDAuMDIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGMgPSBsdXRbTWF0aC5taW4obHV0Lmxlbmd0aCAtIDEsIE1hdGgucm91bmQoZiAqIChsdXQubGVuZ3RoIC0gMSkpKV07XG4gICAgcmdiYVs0ICogaV0gPSBjWzBdO1xuICAgIHJnYmFbNCAqIGkgKyAxXSA9IGNbMV07XG4gICAgcmdiYVs0ICogaSArIDJdID0gY1syXTtcbiAgICByZ2JhWzQgKiBpICsgM10gPSBNYXRoLnJvdW5kKDI1NSAqIG9wYWNpdHkgKiBNYXRoLnBvdyhmLCAwLjYpKTtcbiAgfVxuICByZXR1cm4gcmdiYTtcbn1cblxuLy8g4pSA4pSAIEFsbC1nZW5lIHRyYW5zY3JpcHRzOiBncm91cGluZyB1bmRlciBhIG1hcmtlciBidWRnZXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBTbWFsbGVzdCBvbi1zY3JlZW4gc3BhY2luZyBiZXR3ZWVuIGdyb3VwcywgaW4gcHgg4oCUIGJlbG93IGl0IGdyb3VwcyByZWFkIGFzIG5vaXNlLiAqL1xuZXhwb3J0IGNvbnN0IEdST1VQX01JTl9TUEFDSU5HX1BYID0gMTQ7XG5cbi8qKiBBcmVhIG9mIGByZWN0YCBpbnNpZGUgYGJvdW5kc2AgKHRoZSB3aG9sZSByZWN0IHdoZW4gdGhlcmUgYXJlIG5vbmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpc2libGVBcmVhKHJlY3Q6IERhdGFSZWN0LCBib3VuZHM/OiBTcGF0aWFsQm91bmRzIHwgbnVsbCk6IG51bWJlciB7XG4gIGNvbnN0IHgwID0gYm91bmRzID8gTWF0aC5tYXgocmVjdC54MCwgYm91bmRzWzBdKSA6IHJlY3QueDA7XG4gIGNvbnN0IHkwID0gYm91bmRzID8gTWF0aC5tYXgocmVjdC55MCwgYm91bmRzWzFdKSA6IHJlY3QueTA7XG4gIGNvbnN0IHgxID0gYm91bmRzID8gTWF0aC5taW4ocmVjdC54MSwgYm91bmRzWzJdKSA6IHJlY3QueDE7XG4gIGNvbnN0IHkxID0gYm91bmRzID8gTWF0aC5taW4ocmVjdC55MSwgYm91bmRzWzNdKSA6IHJlY3QueTE7XG4gIHJldHVybiBNYXRoLm1heCgwLCB4MSAtIHgwKSAqIE1hdGgubWF4KDAsIHkxIC0geTApO1xufVxuXG5leHBvcnQgdHlwZSBBbGxHZW5lc1BsYW4gPSB7IGtpbmQ6ICdpbmRpdmlkdWFsJyB9IHwgeyBraW5kOiAnYmlucyc7IGxldmVsOiBudW1iZXIgfSB8IHsga2luZDogJ25vbmUnIH07XG5cbi8qKlxuICogSG93IHRvIGRyYXcgZXZlcnkgdHJhbnNjcmlwdCBpbiB2aWV3IHdpdGhvdXQgZXhjZWVkaW5nIGBidWRnZXRgIG1hcmtlcnMuXG4gKlxuICogLSBUaGUgdHJhbnNjcmlwdHMgdGhlbXNlbHZlcywgb25jZSB0aGUgZXN0aW1hdGVkIGNvdW50IGluIHZpZXcgZml0cyB0aGUgYnVkZ2V0LlxuICogLSBPdGhlcndpc2UgdGhlIGZpbmVzdCBweXJhbWlkIGxldmVsIHdob3NlIGJpbnMgYXJlIGF0IGxlYXN0IGBtaW5TcGFjaW5nUHhgIGFwYXJ0IG9uXG4gKiAgIHNjcmVlbiBhbmQgbnVtYmVyIG5vIG1vcmUgdGhhbiB0aGUgYnVkZ2V0IOKAlCBncm91cHMgYmlnIGVub3VnaCB0byByZWFkLCBmZXcgZW5vdWdoXG4gKiAgIHRvIGRyYXcuXG4gKlxuICogVGhlIGNvdW50IGluIHZpZXcgaXMgZXN0aW1hdGVkIGZyb20gdGhlIGF2ZXJhZ2UgZGVuc2l0eSwgd2hpY2ggb3Zlci0gb3IgdW5kZXItc2hvb3RzXG4gKiBsb2NhbGx5OyB0aGUgcmVuZGVyZXIgc3RpbGwgY2FwcyB3aGF0IGl0IGRyYXdzLCBzbyBhbiBlc3RpbWF0ZSBpcyBlbm91Z2ggdG8gY2hvb3NlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsR2VuZXNQbGFuKG86IHtcbiAgcmVjdDogRGF0YVJlY3Q7IGJvdW5kczogU3BhdGlhbEJvdW5kczsgdG90YWw6IG51bWJlcjsgcHhQZXJVbml0OiBudW1iZXI7XG4gIGxldmVsczogcmVhZG9ubHkgeyBiaW5TaXplOiBudW1iZXIgfVtdOyBidWRnZXQ6IG51bWJlcjsgY2FuSW5kaXZpZHVhbDogYm9vbGVhbjtcbiAgbWluU3BhY2luZ1B4PzogbnVtYmVyO1xufSk6IEFsbEdlbmVzUGxhbiB7XG4gIGNvbnN0IGFyZWEgPSB2aXNpYmxlQXJlYShvLnJlY3QsIG8uYm91bmRzKTtcbiAgaWYgKCEoYXJlYSA+IDApKSByZXR1cm4geyBraW5kOiAnbm9uZScgfTtcbiAgY29uc3QgYiA9IG8uYm91bmRzO1xuICBjb25zdCBkZW5zaXR5ID0gby50b3RhbCAvIE1hdGgubWF4KDEsIChiWzJdIC0gYlswXSkgKiAoYlszXSAtIGJbMV0pKTtcbiAgaWYgKG8uY2FuSW5kaXZpZHVhbCAmJiBkZW5zaXR5ICogYXJlYSA8PSBvLmJ1ZGdldCkgcmV0dXJuIHsga2luZDogJ2luZGl2aWR1YWwnIH07XG4gIGlmICghby5sZXZlbHMubGVuZ3RoKSByZXR1cm4geyBraW5kOiAnbm9uZScgfTtcbiAgY29uc3Qgc3BhY2luZyA9IG8ubWluU3BhY2luZ1B4ID8/IEdST1VQX01JTl9TUEFDSU5HX1BYO1xuICBmb3IgKGxldCBsID0gMDsgbCA8IG8ubGV2ZWxzLmxlbmd0aDsgbCsrKSB7XG4gICAgY29uc3QgYmluID0gby5sZXZlbHNbbF0uYmluU2l6ZTtcbiAgICAvLyBUaXNzdWUgcmFyZWx5IGZpbGxzIHRoZSB2aWV3OyAwLjcgb2YgdGhlIGJpbnMgb2NjdXBpZWQgaXMgYSBmYWlyIGd1ZXNzLlxuICAgIGlmIChiaW4gKiBvLnB4UGVyVW5pdCA+PSBzcGFjaW5nICYmIChhcmVhIC8gKGJpbiAqIGJpbikpICogMC43IDw9IG8uYnVkZ2V0KSB7XG4gICAgICByZXR1cm4geyBraW5kOiAnYmlucycsIGxldmVsOiBsIH07XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGtpbmQ6ICdiaW5zJywgbGV2ZWw6IG8ubGV2ZWxzLmxlbmd0aCAtIDEgfTtcbn1cblxuLyoqXG4gKiBEaWFtZXRlciBpbiBweCBvZiBhIGdyb3VwIG9mIGBjb3VudGAgdHJhbnNjcmlwdHMgaW4gYSBiaW4gYGJpblB4YCB3aWRlLCB3aGVyZVxuICogYHJlZkNvdW50YCBpcyBhIHR5cGljYWwgYnVzeSBiaW4gaW4gdmlldyAoaXRzIDk1dGggcGVyY2VudGlsZSkuXG4gKlxuICogQXJlYSBncm93cyB3aXRoIHRoZSBjb3VudCDigJQgYSBiaW4gd2l0aCBhIHF1YXJ0ZXIgb2YgdGhlIHRyYW5zY3JpcHRzIGdldHMgaGFsZiB0aGVcbiAqIGRpYW1ldGVyIOKAlCBiZXR3ZWVuIGEgdGhpcmQgb2YgdGhlIGJpbiAoc28gYSBzcGFyc2UgYmluIGlzIHN0aWxsIHZpc2libGUpIGFuZCBhIGxpdHRsZVxuICogb3ZlciB0aGUgZnVsbCBiaW4gKHNvIGRlbnNlIG5laWdoYm91cnMganVzdCB0b3VjaCByYXRoZXIgdGhhbiBwaWxlIHVwKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwZWRNYXJrZXJQeChjb3VudDogbnVtYmVyLCByZWZDb3VudDogbnVtYmVyLCBiaW5QeDogbnVtYmVyLCBzY2FsZSA9IDEpOiBudW1iZXIge1xuICBjb25zdCBmID0gTWF0aC5zcXJ0KE1hdGgubWluKDEsIGNvdW50IC8gTWF0aC5tYXgoMSwgcmVmQ291bnQpKSk7XG4gIGNvbnN0IGQgPSBiaW5QeCAqICgwLjM1ICsgMC43NSAqIGYpICogc2NhbGU7XG4gIHJldHVybiBNYXRoLm1heChUUkFOU0NSSVBUX01JTl9QWCAqIHNjYWxlLCBNYXRoLm1pbihkLCBiaW5QeCAqIDEuMiAqIE1hdGgubWF4KHNjYWxlLCAxKSkpO1xufVxuXG4vKiogVGhlIGBwYCBxdWFudGlsZSAoMC4uMSkgb2YgYSBjb3VudCB2ZWN0b3Ig4oCUIGEgc2FtcGxlIG9mIGl0IGZvciBsYXJnZSB2ZWN0b3JzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1YW50aWxlT2YodmFsdWVzOiBBcnJheUxpa2U8bnVtYmVyPiwgcDogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIGlmICghbikgcmV0dXJuIDA7XG4gIGNvbnN0IHN0ZXAgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKG4gLyA0MDk2KSk7XG4gIGNvbnN0IHNhbXBsZTogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpICs9IHN0ZXApIHNhbXBsZS5wdXNoKHZhbHVlc1tpXSk7XG4gIHNhbXBsZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIHJldHVybiBzYW1wbGVbTWF0aC5taW4oc2FtcGxlLmxlbmd0aCAtIDEsIE1hdGguZmxvb3IocCAqIHNhbXBsZS5sZW5ndGgpKV07XG59XG5cbi8qKiB7QGxpbmsgdGlsZXNJblJlY3R9IGZvciBhIGdyaWQgd2hvc2UgdGlsZSAoMCwgMCkgc3RhcnRzIGF0IGBvcmlnaW5gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVzSW5SZWN0RnJvbShcbiAgb3JpZ2luOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdLCByZWN0OiBEYXRhUmVjdCwgbGV2ZWw6IG51bWJlcixcbiAgbGV2ZWxzOiByZWFkb25seSBTcGF0aWFsVGlsZUxldmVsW10sIGJvdW5kcz86IFNwYXRpYWxCb3VuZHMgfCBudWxsLCBsaW1pdCA9IEluZmluaXR5LFxuKTogVGlsZUtleVtdIHtcbiAgY29uc3QgW294LCBveV0gPSBvcmlnaW47XG4gIGNvbnN0IHNoaWZ0ZWQgPSB7IHgwOiByZWN0LngwIC0gb3gsIHkwOiByZWN0LnkwIC0gb3ksIHgxOiByZWN0LngxIC0gb3gsIHkxOiByZWN0LnkxIC0gb3kgfTtcbiAgY29uc3QgYjogU3BhdGlhbEJvdW5kcyB8IG51bGwgPSBib3VuZHMgPyBbYm91bmRzWzBdIC0gb3gsIGJvdW5kc1sxXSAtIG95LCBib3VuZHNbMl0gLSBveCwgYm91bmRzWzNdIC0gb3ldIDogbnVsbDtcbiAgcmV0dXJuIHRpbGVzSW5SZWN0KHNoaWZ0ZWQsIGxldmVsLCBsZXZlbHMsIGIsIGxpbWl0KTtcbn1cblxuLyoqIEEgZGVuc2l0eSB3aW5kb3cgZnJvbSB0aGUgbm9uLWVtcHR5IGJpbnM6IDFzdCB0byA5OXRoIHBlcmNlbnRpbGUuICovXG5leHBvcnQgZnVuY3Rpb24gZGVuc2l0eUF1dG9SYW5nZSh2YWx1ZXM6IEFycmF5TGlrZTxudW1iZXI+KTogW251bWJlciwgbnVtYmVyXSB7XG4gIGNvbnN0IHBvc2l0aXZlOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgaWYgKHZhbHVlc1tpXSA+IDApIHBvc2l0aXZlLnB1c2godmFsdWVzW2ldKTtcbiAgaWYgKCFwb3NpdGl2ZS5sZW5ndGgpIHJldHVybiBbMCwgMV07XG4gIHBvc2l0aXZlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgY29uc3QgYXQgPSAocDogbnVtYmVyKSA9PiBwb3NpdGl2ZVtNYXRoLm1pbihwb3NpdGl2ZS5sZW5ndGggLSAxLCBNYXRoLmZsb29yKHAgKiBwb3NpdGl2ZS5sZW5ndGgpKV07XG4gIGNvbnN0IGxvID0gYXQoMC4wMSk7XG4gIGNvbnN0IGhpID0gYXQoMC45OSk7XG4gIHJldHVybiBoaSA+IGxvID8gW2xvLCBoaV0gOiBbMCwgaGkgfHwgMV07XG59XG5cbi8qKlxuICogQ29sb3VyIGRlbnNpdHkgYmlucyB0aHJvdWdoIGBsdXRgIG92ZXIgdGhlIHdpbmRvdyBgW2xvLCBoaV1gIOKAlCBYZW5pdW0gRXhwbG9yZXInc1xuICogXCJzY2FsZSB0aHJlc2hvbGRcIi4gQmlucyBhdCBvciBiZWxvdyBgbG9gIGFyZSB0cmFuc3BhcmVudCwgc28gZW1wdHkgdGlzc3VlIHNob3dzIHRoZVxuICogaW1hZ2UgdW5kZXIgaXQ7IGJpbnMgYXQgb3IgYWJvdmUgYGhpYCBzYXR1cmF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yRGVuc2l0eVdpbmRvdyhcbiAgdmFsdWVzOiBBcnJheUxpa2U8bnVtYmVyPiwgbHV0OiByZWFkb25seSAocmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKVtdLFxuICBvcGFjaXR5OiBudW1iZXIsIGxvOiBudW1iZXIsIGhpOiBudW1iZXIsXG4pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIGNvbnN0IHJnYmEgPSBuZXcgVWludDhBcnJheShuICogNCk7XG4gIGNvbnN0IHNwYW4gPSBoaSA+IGxvID8gaGkgLSBsbyA6IDE7XG4gIGNvbnN0IGEgPSBNYXRoLnJvdW5kKDI1NSAqIG9wYWNpdHkpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IHYgPSB2YWx1ZXNbaV07XG4gICAgaWYgKCEodiA+IGxvKSkgY29udGludWU7XG4gICAgY29uc3QgZiA9IE1hdGgubWluKDEsICh2IC0gbG8pIC8gc3Bhbik7XG4gICAgY29uc3QgYyA9IGx1dFtNYXRoLm1pbihsdXQubGVuZ3RoIC0gMSwgTWF0aC5yb3VuZChmICogKGx1dC5sZW5ndGggLSAxKSkpXTtcbiAgICByZ2JhWzQgKiBpXSA9IGNbMF07XG4gICAgcmdiYVs0ICogaSArIDFdID0gY1sxXTtcbiAgICByZ2JhWzQgKiBpICsgMl0gPSBjWzJdO1xuICAgIHJnYmFbNCAqIGkgKyAzXSA9IGE7XG4gIH1cbiAgcmV0dXJuIHJnYmE7XG59XG5cbi8qKlxuICogSW5mZXJubyAobWF0cGxvdGxpYiksIGFzIGFuIGlubGluZSBgW3N0b3AsIGNvbG91cl1gIHNjYWxlOiB0aGUgZGVuc2l0eSBtYXAncyBkZWZhdWx0LFxuICogYXMgaW4gWGVuaXVtIEV4cGxvcmVyLiBJbmxpbmUgYmVjYXVzZSB0aGUgY29sb3JtYXAgdHJlZSdzIGBJTkZFUk5PX0xVVGAga2V5IGlzIHJlc29sdmVkXG4gKiBhdCBydW50aW1lIGJ5IHRoZSBzdG9yZSwgd2hpY2ggdGhlIHJlbmRlcmVyIGRvZXMgbm90IHNlZS5cbiAqL1xuZXhwb3J0IGNvbnN0IElORkVSTk9fU0NBTEU6IFtudW1iZXIsIHN0cmluZ11bXSA9IFtcbiAgWzAsICcjMDAwMDA0J10sIFswLjEyNSwgJyMxYjBjNDEnXSwgWzAuMjUsICcjNGEwYzZiJ10sIFswLjM3NSwgJyM3ODFjNmQnXSwgWzAuNSwgJyNhNTJjNjAnXSxcbiAgWzAuNjI1LCAnI2NmNDQ0NiddLCBbMC43NSwgJyNlZDY5MjUnXSwgWzAuODc1LCAnI2ZiOWIwNiddLCBbMSwgJyNmY2ZmYTQnXSxcbl07XG4iXX0=
|
|
649
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC10aWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLXRpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBdUJILDRGQUE0RjtBQUM1RixNQUFNLFVBQVUsVUFBVSxDQUN4QixPQUFpRSxFQUNqRSxJQUF5QztJQUV6QyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxJQUFJLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqRSxPQUFPLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsZUFBZSxDQUFDLElBQVk7SUFDMUMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBdUIsRUFBRSxJQUE4QztJQUV2RSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQztJQUM1RSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNuRixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUNELE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO0FBQzdGLENBQUM7QUFFRCxNQUFNLFVBQVUsTUFBTSxDQUFDLENBQVU7SUFDL0IsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDdEMsQ0FBQztBQUVELDZGQUE2RjtBQUM3RixNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBWSxFQUFFLEdBQTRCO0lBQzFFLE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixNQUFpQyxFQUFFLElBQVksRUFBRSxPQUFlLEVBQUUsT0FBZSxFQUNqRixHQUE0QixFQUFFLE1BQU0sR0FBRyxJQUFJO0lBRTNDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakUsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxNQUFNLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDdEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDOUIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUM5QixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMzQixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0IsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3BHLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsSUFBYyxFQUFFLEtBQWEsRUFBRSxNQUFtQyxFQUNsRSxNQUE2QixFQUFFLEtBQUssR0FBRyxRQUFRO0lBRS9DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDckMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzNCLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDOUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMxQyxNQUFNLEdBQUcsR0FBYyxFQUFFLENBQUM7SUFDMUIsS0FBSyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ25DLEtBQUssSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFO1lBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7VUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkQsT0FBTyxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUs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RUFBRSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxLQUFLO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEMsTUFBTSxJQUFJLEdBQUcsQ0FBcUQsQ0FBSSxFQUFLLEVBQUU7UUFDM0UsTUFBTSxHQUFHLEdBQUcsSUFBSyxDQUFDLENBQUMsV0FBb0MsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQztJQUNGLE9BQU87UUFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7UUFDNUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ2xHLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztLQUNuQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsQ0FBd0IsRUFBRSxHQUFXLEVBQUUsVUFBd0MsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFdkYsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDeEMsTUFBTSxFQUFFLEdBQWEsRUFBRSxDQUFDO0lBQ3hCLE1BQU0sRUFBRSxHQUFhLEVBQUUsQ0FBQztJQUN4QixNQUFNLEVBQUUsR0FBYSxFQUFFLENBQUM7SUFDeEIsTUFBTSxDQUFDLEdBQWEsRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQztJQUN6Qiw0RkFBNEY7SUFDNUYsMkRBQTJEO0lBQzNELE1BQU0sS0FBSyxHQUEwQixFQUFFLENBQUM7SUFDeEMsTUFBTSxJQUFJLEdBQTBCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVFLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDcEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDYixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1gsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFD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UUFDMUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQXVCO0lBQy9DLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQztJQUMzRixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUM7Q0FDMUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGV2ZWwtb2YtZGV0YWlsIHBsYW5uaW5nIGZvciB0aWxlZCBzcGF0aWFsIGdlb21ldHJ5IOKAlCBjZWxsIG91dGxpbmVzIGFuZCB0cmFuc2NyaXB0cy5cbiAqXG4gKiBUaGUgcmVuZGVyZXIga25vd3MgaXRzIGNhbWVyYSAoYSB3b3JsZC1zcGFjZSBjZW50cmUsIGEgem9vbSBpbiBjYW52YXMgcGl4ZWxzIHBlciB3b3JsZFxuICogdW5pdCwgYSBjYW52YXMgc2l6ZSk7IGEgdGlsZWQgZGF0YXNldCBrbm93cyBpdHMgZ3JpZHMgKG9uZSBwZXIgbGV2ZWwsIGluIG9ic2VydmF0aW9uXG4gKiB1bml0cykuIFRoaXMgbW9kdWxlIGlzIHRoZSBicmlkZ2U6IHdoaWNoIGxldmVsIHRoZSB6b29tIGNhbGxzIGZvciwgd2hpY2ggdGlsZXMgYXJlIG9uXG4gKiBzY3JlZW4sIGhvdyBiaWcgYSB0cmFuc2NyaXB0IG1hcmtlciBzaG91bGQgYmUuIEV2ZXJ5dGhpbmcgaGVyZSBpcyBwdXJlLCBzbyB0aGUgcG9saWN5XG4gKiDigJQgdGhlIHBhcnQgdGhhdCBkZWNpZGVzIHdoZXRoZXIgdGhlIHZpZXcgaXMgZmFzdCBhbmQgbGVnaWJsZSDigJQgaXMgdGVzdGFibGUgd2l0aG91dCBhXG4gKiBHUFUuXG4gKlxuICogT2JzZXJ2YXRpb24gdW5pdHMgbWFwIG9udG8gd29ybGQgdW5pdHMgdGhyb3VnaCB0aGUgZGF0YXNldCdzIGBpbWFnZVJlZmAgYWZmaW5lXG4gKiAoYHdvcmxkID0gZGF0YSDCtyBzY2FsZSArIHRyYW5zbGF0ZWApLCBzbyBcInBpeGVscyBwZXIgb2JzZXJ2YXRpb24gdW5pdFwiIGlzXG4gKiBgem9vbSDCtyBzY2FsZWAuIEZvciBhIFhlbml1bSBidW5kbGUgdGhlIGRhdGEgdW5pdCBpcyB0aGUgbWljcm9uIGFuZCB0aGUgd29ybGQgdW5pdCB0aGVcbiAqIG1vcnBob2xvZ3kgcGl4ZWwuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBTcGF0aWFsQm91bmRzLCBTcGF0aWFsSW1hZ2VSZWYsIFNwYXRpYWxUaWxlTGV2ZWwsIFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbn0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUsIFRyYW5zY3JpcHRHbHlwaE5hbWUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxEYXRhc2V0IH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5cbi8qKiBBIHJlY3RhbmdsZSBpbiBvYnNlcnZhdGlvbiBjb29yZGluYXRlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVJlY3Qge1xuICB4MDogbnVtYmVyO1xuICB5MDogbnVtYmVyO1xuICB4MTogbnVtYmVyO1xuICB5MTogbnVtYmVyO1xufVxuXG4vKiogVGlsZSBhZGRyZXNzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaWxlS2V5IHtcbiAgbGV2ZWw6IG51bWJlcjtcbiAgZ3g6IG51bWJlcjtcbiAgZ3k6IG51bWJlcjtcbn1cblxuLyoqIFdoZXRoZXIgY2VsbCBvdXRsaW5lcyBhcmUgZHJhd246IHRoZSB1c2VyJ3MgY2hvaWNlLCBlbHNlIG9uIHdoZW4gdGhlIGRhdGFzZXQgaGFzIGFueS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZWxsc1Nob3duKFxuICBkYXRhc2V0OiBQaWNrPFNwYXRpYWxEYXRhc2V0LCAncG9seWdvblRpbGVzJyB8ICdwb2x5Z29ucyc+IHwgbnVsbCxcbiAgdmlldzogUGljazxTcGF0aWFsVmlld1N0YXRlLCAnc2hvd0NlbGxzJz4sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYXZhaWxhYmxlID0gISEoZGF0YXNldD8ucG9seWdvblRpbGVzIHx8IGRhdGFzZXQ/LnBvbHlnb25zKTtcbiAgcmV0dXJuIGF2YWlsYWJsZSAmJiAodmlldy5zaG93Q2VsbHMgPz8gdHJ1ZSk7XG59XG5cbi8qKiBBIGNvbHVtbiBob2xkaW5nIGEgaGFuZC1jdXJhdGVkIGNlbGwtdHlwZSBhbm5vdGF0aW9uLCBieSBuYW1pbmcgY29udmVudGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0N1cmF0ZWRDb2x1bW4obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvY3VyYXRlZC9pLnRlc3QobmFtZSk7XG59XG5cbi8qKlxuICogVGhlIGNhdGVnb3JpY2FsIGNvbHVtbiB0aGF0IG5hbWVzIGVhY2ggY2VsbCdzIHR5cGU6IHRoZSB2aWV3J3MgY2hvaWNlIHdoZW4gaXQgaXMgYVxuICogY29sdW1uIG9mIHRoaXMgZGF0YXNldCwgZWxzZSB0aGUgZmlyc3QgY2F0ZWdvcmljYWwgY29sdW1uIHRoYXQgaXMgbm90IGEgY3VyYXRlZFxuICogYW5ub3RhdGlvbiAoYSBwaXBlbGluZSdzIGNsdXN0ZXJpbmcgaXMgdGhlIGRlZmF1bHQ7IGN1cmF0aW9uIGlzIG9wdGVkIGludG8pLCBlbHNlXG4gKiBhbnkgY2F0ZWdvcmljYWwgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2VsbFR5cGVDb2x1bW5Gb3IoXG4gIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICdjZWxsVHlwZUNvbHVtbic+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGNhdGVnb3JpY2FsID0gZGF0YXNldC5jb2x1bW5zLmZpbHRlcigoYykgPT4gYy5raW5kID09PSAnY2F0ZWdvcmljYWwnKTtcbiAgaWYgKHZpZXcuY2VsbFR5cGVDb2x1bW4gJiYgY2F0ZWdvcmljYWwuc29tZSgoYykgPT4gYy5uYW1lID09PSB2aWV3LmNlbGxUeXBlQ29sdW1uKSkge1xuICAgIHJldHVybiB2aWV3LmNlbGxUeXBlQ29sdW1uO1xuICB9XG4gIHJldHVybiAoY2F0ZWdvcmljYWwuZmluZCgoYykgPT4gIWlzQ3VyYXRlZENvbHVtbihjLm5hbWUpKSA/PyBjYXRlZ29yaWNhbFswXSk/Lm5hbWUgPz8gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbGVJZChrOiBUaWxlS2V5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2subGV2ZWx9LyR7ay5neH0vJHtrLmd5fWA7XG59XG5cbi8qKiBDYW52YXMgcGl4ZWxzIHBlciBvYnNlcnZhdGlvbiB1bml0IGFsb25nIHgsIGZvciBhIGNhbWVyYSB6b29tIGFuZCBhIGRhdGHihpJ3b3JsZCBhZmZpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gcGl4ZWxzUGVyRGF0YVVuaXQoem9vbTogbnVtYmVyLCByZWY/OiBTcGF0aWFsSW1hZ2VSZWYgfCBudWxsKTogbnVtYmVyIHtcbiAgcmV0dXJuIHpvb20gKiBNYXRoLmFicyhyZWY/LnNjYWxlPy5bMF0gPz8gMSk7XG59XG5cbi8qKlxuICogVGhlIHBhcnQgb2Ygb2JzZXJ2YXRpb24gc3BhY2UgdGhlIGNhbWVyYSBzaG93cywgcGFkZGVkIGJ5IGBtYXJnaW5gIChhIGZyYWN0aW9uIG9mIHRoZVxuICogdmlld3BvcnQpIHNvIHRpbGVzIGp1c3Qgb2ZmIHNjcmVlbiBhcmUgYWxyZWFkeSB0aGVyZSB3aGVuIGEgcGFuIGJyaW5ncyB0aGVtIGluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmlzaWJsZURhdGFSZWN0KFxuICBjZW50ZXI6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0sIHpvb206IG51bWJlciwgY2FudmFzVzogbnVtYmVyLCBjYW52YXNIOiBudW1iZXIsXG4gIHJlZj86IFNwYXRpYWxJbWFnZVJlZiB8IG51bGwsIG1hcmdpbiA9IDAuMTUsXG4pOiBEYXRhUmVjdCB8IG51bGwge1xuICBpZiAoISh6b29tID4gMCkgfHwgIShjYW52YXNXID4gMCkgfHwgIShjYW52YXNIID4gMCkpIHJldHVybiBudWxsO1xuICBjb25zdCBzeCA9IHJlZj8uc2NhbGU/LlswXSA/PyAxO1xuICBjb25zdCBzeSA9IHJlZj8uc2NhbGU/LlsxXSA/PyAxO1xuICBjb25zdCB0eCA9IHJlZj8udHJhbnNsYXRlPy5bMF0gPz8gMDtcbiAgY29uc3QgdHkgPSByZWY/LnRyYW5zbGF0ZT8uWzFdID8/IDA7XG4gIGNvbnN0IGhhbGZXID0gKGNhbnZhc1cgLyB6b29tIC8gMikgKiAoMSArIDIgKiBtYXJnaW4pO1xuICBjb25zdCBoYWxmSCA9IChjYW52YXNIIC8gem9vbSAvIDIpICogKDEgKyAyICogbWFyZ2luKTtcbiAgY29uc3Qgd3gwID0gY2VudGVyWzBdIC0gaGFsZlc7XG4gIGNvbnN0IHd4MSA9IGNlbnRlclswXSArIGhhbGZXO1xuICBjb25zdCB3eTAgPSBjZW50ZXJbMV0gLSBoYWxmSDtcbiAgY29uc3Qgd3kxID0gY2VudGVyWzFdICsgaGFsZkg7XG4gIGNvbnN0IGF4ID0gKHd4MCAtIHR4KSAvIHN4O1xuICBjb25zdCBieCA9ICh3eDEgLSB0eCkgLyBzeDtcbiAgY29uc3QgYXkgPSAod3kwIC0gdHkpIC8gc3k7XG4gIGNvbnN0IGJ5ID0gKHd5MSAtIHR5KSAvIHN5O1xuICByZXR1cm4geyB4MDogTWF0aC5taW4oYXgsIGJ4KSwgeTA6IE1hdGgubWluKGF5LCBieSksIHgxOiBNYXRoLm1heChheCwgYngpLCB5MTogTWF0aC5tYXgoYXksIGJ5KSB9O1xufVxuXG4vKipcbiAqIFRpbGVzIG9mIG9uZSBsZXZlbCBpbnRlcnNlY3RpbmcgYHJlY3RgLCBjbGlwcGVkIHRvIHRoZSBkYXRhc2V0J3MgYGJvdW5kc2AgKHNvIHpvb21pbmdcbiAqIG91dCBvdmVyIGVtcHR5IGNhbnZhcyBkb2VzIG5vdCBhc2sgZm9yIHRpbGVzIHRoYXQgY2Fubm90IGV4aXN0KS4gT3JkZXJlZCBmcm9tIHRoZVxuICogcmVjdGFuZ2xlJ3MgY2VudHJlIG91dHdhcmQsIHNvIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbiBmaWxscyBpbiBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVzSW5SZWN0KFxuICByZWN0OiBEYXRhUmVjdCwgbGV2ZWw6IG51bWJlciwgbGV2ZWxzOiByZWFkb25seSBTcGF0aWFsVGlsZUxldmVsW10sXG4gIGJvdW5kcz86IFNwYXRpYWxCb3VuZHMgfCBudWxsLCBsaW1pdCA9IEluZmluaXR5LFxuKTogVGlsZUtleVtdIHtcbiAgY29uc3Qgc2l6ZSA9IGxldmVsc1tsZXZlbF0/LnRpbGVTaXplO1xuICBpZiAoIShzaXplID4gMCkpIHJldHVybiBbXTtcbiAgbGV0IHsgeDAsIHkwLCB4MSwgeTEgfSA9IHJlY3Q7XG4gIGlmIChib3VuZHMpIHtcbiAgICB4MCA9IE1hdGgubWF4KHgwLCBib3VuZHNbMF0pO1xuICAgIHkwID0gTWF0aC5tYXgoeTAsIGJvdW5kc1sxXSk7XG4gICAgeDEgPSBNYXRoLm1pbih4MSwgYm91bmRzWzJdKTtcbiAgICB5MSA9IE1hdGgubWluKHkxLCBib3VuZHNbM10pO1xuICAgIGlmICh4MSA8IHgwIHx8IHkxIDwgeTApIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBneDAgPSBNYXRoLmZsb29yKHgwIC8gc2l6ZSk7XG4gIGNvbnN0IGd4MSA9IE1hdGguZmxvb3IoeDEgLyBzaXplKTtcbiAgY29uc3QgZ3kwID0gTWF0aC5mbG9vcih5MCAvIHNpemUpO1xuICBjb25zdCBneTEgPSBNYXRoLmZsb29yKHkxIC8gc2l6ZSk7XG4gIGNvbnN0IGN4ID0gKHJlY3QueDAgKyByZWN0LngxKSAvIDIgLyBzaXplO1xuICBjb25zdCBjeSA9IChyZWN0LnkwICsgcmVjdC55MSkgLyAyIC8gc2l6ZTtcbiAgY29uc3Qgb3V0OiBUaWxlS2V5W10gPSBbXTtcbiAgZm9yIChsZXQgZ3kgPSBneTA7IGd5IDw9IGd5MTsgZ3krKykge1xuICAgIGZvciAobGV0IGd4ID0gZ3gwOyBneCA8PSBneDE7IGd4KyspIG91dC5wdXNoKHsgbGV2ZWwsIGd4LCBneSB9KTtcbiAgfVxuICBvdXQuc29ydCgoYSwgYikgPT4gKChhLmd4ICsgMC41IC0gY3gpICoqIDIgKyAoYS5neSArIDAuNSAtIGN5KSAqKiAyKVxuICAgIC0gKChiLmd4ICsgMC41IC0gY3gpICoqIDIgKyAoYi5neSArIDAuNSAtIGN5KSAqKiAyKSk7XG4gIHJldHVybiBvdXQubGVuZ3RoID4gbGltaXQgPyBvdXQuc2xpY2UoMCwgbGltaXQpIDogb3V0O1xufVxuXG4vKipcbiAqIFR5cGljYWwgY2VsbCBkaWFtZXRlciwgaW4gb2JzZXJ2YXRpb24gdW5pdHMsIHVzZWQgdG8ganVkZ2UgaG93IGxhcmdlIGNlbGxzIGFwcGVhci5cbiAqIERlcml2ZWQgZnJvbSB0aGUgcGVyLW9ic2VydmF0aW9uIHJhZGl1cyB3aGVuIHRoZXJlIGlzIG9uZTsgMTIgwrVtIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGljYWxDZWxsRGlhbWV0ZXIocmFkaXVzOiBGbG9hdDMyQXJyYXkgfCBudW1iZXIgfCB1bmRlZmluZWQsIGZhbGxiYWNrID0gMTIpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHJhZGl1cyA9PT0gJ251bWJlcicpIHJldHVybiByYWRpdXMgPiAwID8gcmFkaXVzICogMiA6IGZhbGxiYWNrO1xuICBpZiAoIXJhZGl1cz8ubGVuZ3RoKSByZXR1cm4gZmFsbGJhY2s7XG4gIC8vIFRoZSBtZWRpYW4gb2YgYSBzYW1wbGUgaXMgcGxlbnR5IOKAlCB0aGlzIHNldHMgYSB0aHJlc2hvbGQsIG5vdCBhIG1lYXN1cmVtZW50LlxuICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihyYWRpdXMubGVuZ3RoIC8gMjA0OCkpO1xuICBjb25zdCBzYW1wbGU6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFkaXVzLmxlbmd0aDsgaSArPSBzdGVwKSB7XG4gICAgaWYgKHJhZGl1c1tpXSA+IDApIHNhbXBsZS5wdXNoKHJhZGl1c1tpXSk7XG4gIH1cbiAgaWYgKCFzYW1wbGUubGVuZ3RoKSByZXR1cm4gZmFsbGJhY2s7XG4gIHNhbXBsZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIHJldHVybiBzYW1wbGVbc2FtcGxlLmxlbmd0aCA+PiAxXSAqIDI7XG59XG5cbi8qKlxuICogT24tc2NyZWVuIGNlbGwgZGlhbWV0ZXIgKHB4KSBhdCBvciBhYm92ZSB3aGljaCBlYWNoIHBvbHlnb24gbGV2ZWwgaXMgdXNlZC4gQSBsZXZlbFxuICogaGFsdmVzIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgb25lIGJlbG93LCBzbyBlYWNoIHNob3VsZCB0YWtlIG92ZXIgd2hlbiB0aGUgY2VsbCBpcyBhYm91dFxuICogaGFsZiBhcyBsYXJnZSBvbiBzY3JlZW4uIEJlbG93IHRoZSBsYXN0IGZpbml0ZSB0aHJlc2hvbGQgb3V0bGluZXMgYXJlIG5vdCBkcmF3biBhdFxuICogYWxsIOKAlCBhIGNlbGwgYSBmZXcgcGl4ZWxzIHdpZGUgaXMgYSBkb3QsIGFuZCB0aGUgb2JzZXJ2YXRpb24gbWFya2VycyBhbHJlYWR5IGRyYXcgaXRcbiAqIGFzIG9uZS5cbiAqXG4gKiBYZW5pdW0ncyBmb3VydGggbGV2ZWwgKDMgdmVydGljZXMgcGVyIGNlbGwpIGlzIGRlbGliZXJhdGVseSBuZXZlciB1c2VkOiBzZWVuIG9uXG4gKiBzY3JlZW4gaXQgaXMgYSBmaWVsZCBvZiB0cmlhbmdsZXMsIHdoaWNoIHJlYWRzIGFzIGFuIGFydGVmYWN0IHJhdGhlciB0aGFuIGFzIGNlbGxzLlxuICogVGhlIGRvdHMgYmVsb3cgOCBweCBzYXkgdGhlIHNhbWUgdGhpbmcgbW9yZSBob25lc3RseS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBPTFlHT05fTEVWRUxfTUlOX0NFTExfUFggPSBbMzYsIDE4LCA4LCBJbmZpbml0eV07XG5cbi8qKlxuICogV2hpY2ggcG9seWdvbiBsZXZlbCBzdWl0cyB0aGlzIHpvb20sIG9yIC0xIGZvciBcInRvbyBzbWFsbCB0byBvdXRsaW5lXCIuXG4gKiBgZGV0YWlsYCA+IDEgcHJlZmVycyBmaW5lciBsZXZlbHMgKHNoYXJwZXIsIHNsb3dlcik7IDwgMSBjb2Fyc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9seWdvbkxldmVsRm9yKFxuICBweFBlclVuaXQ6IG51bWJlciwgY2VsbERpYW1ldGVyOiBudW1iZXIsIGxldmVsQ291bnQ6IG51bWJlciwgZGV0YWlsID0gMSxcbik6IG51bWJlciB7XG4gIGNvbnN0IGNlbGxQeCA9IHB4UGVyVW5pdCAqIGNlbGxEaWFtZXRlciAqIGRldGFpbDtcbiAgY29uc3QgdGFibGUgPSBQT0xZR09OX0xFVkVMX01JTl9DRUxMX1BYO1xuICBmb3IgKGxldCBsID0gMDsgbCA8IGxldmVsQ291bnQ7IGwrKykge1xuICAgIC8vIFBhc3QgdGhlIHRhYmxlLCBrZWVwIGhhbHZpbmc6IGVhY2ggbGV2ZWwgc3RpbGwgaGFsdmVzIHRoZSB2ZXJ0aWNlcy5cbiAgICBjb25zdCBtaW4gPSB0YWJsZVtsXSA/PyB0YWJsZVt0YWJsZS5sZW5ndGggLSAxXSAvIDIgKiogKGwgLSB0YWJsZS5sZW5ndGggKyAxKTtcbiAgICBpZiAoY2VsbFB4ID49IG1pbikgcmV0dXJuIGw7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFdoaWNoIHRyYW5zY3JpcHQgbGV2ZWwgc3VpdHMgdGhpcyB6b29tOiB0aGUgb25lIHdob3NlIHRpbGVzIGNvbWUgb3V0IGNsb3Nlc3QgdG9cbiAqIGB0YXJnZXRUaWxlUHhgIG9uIHNjcmVlbi4gQ29hcnNlciBsZXZlbHMgYWdncmVnYXRlIG1vcmUsIHNvIHRoaXMga2VlcHMgdGhlIG51bWJlciBvZlxuICogbWFya2VycyBwZXIgc2NyZWVuIHJvdWdobHkgY29uc3RhbnQgaG93ZXZlciBmYXIgb3V0IHRoZSBjYW1lcmEgaXMg4oCUIHRoZSBwcm9wZXJ0eSB0aGF0XG4gKiBrZWVwcyB0aGUgdmlldyBmYXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNjcmlwdExldmVsRm9yKFxuICBweFBlclVuaXQ6IG51bWJlciwgbGV2ZWxzOiByZWFkb25seSBTcGF0aWFsVGlsZUxldmVsW10sIHRhcmdldFRpbGVQeCA9IDUxMixcbik6IG51bWJlciB7XG4gIGlmICghbGV2ZWxzLmxlbmd0aCB8fCAhKHB4UGVyVW5pdCA+IDApKSByZXR1cm4gMDtcbiAgbGV0IGJlc3QgPSAwO1xuICBsZXQgYmVzdEVyciA9IEluZmluaXR5O1xuICBmb3IgKGxldCBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwrKykge1xuICAgIGNvbnN0IGVyciA9IE1hdGguYWJzKE1hdGgubG9nMigobGV2ZWxzW2xdLnRpbGVTaXplICogcHhQZXJVbml0KSAvIHRhcmdldFRpbGVQeCkpO1xuICAgIGlmIChlcnIgPCBiZXN0RXJyKSB7XG4gICAgICBiZXN0RXJyID0gZXJyO1xuICAgICAgYmVzdCA9IGw7XG4gICAgfVxuICB9XG4gIHJldHVybiBiZXN0O1xufVxuXG4vKipcbiAqIFRoZSBiaW4gYSBzZWxlY3Rpb24gb2YgZ2VuZXMgaXMgZ3JvdXBlZCBpbnRvIGF0IHRoaXMgem9vbSwgaW4gb2JzZXJ2YXRpb24gdW5pdHMsIG9yIG51bGxcbiAqIHRvIGRyYXcgZXZlcnkgdHJhbnNjcmlwdC4gQmlucyBmb2xsb3cgdGhlIGFsbC1nZW5lIHB5cmFtaWQncyBsYWRkZXIgKGBiYXNlQmluYCDDlyAyXm0pIHNvIGFcbiAqIGdlbmUgc2VsZWN0aW9uIGFuZCBcImFsbCBnZW5lc1wiIGdyb3VwIGFsaWtlOiB0aGUgZmluZXN0IGJpbiB3aG9zZSBtYXJrZXJzIGxhbmQgYXQgbGVhc3RcbiAqIGBzcGFjaW5nUHhgIGFwYXJ0IG9uIHNjcmVlbi4gT25jZSB0aGUgZmluZXN0IGJpbiBpcyB0aGF0IHdpZGUsIHRyYW5zY3JpcHRzIGFyZSBkcmF3biBhc1xuICogdGhlbXNlbHZlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVCaW5TaXplKFxuICBweFBlclVuaXQ6IG51bWJlciwgYmFzZUJpbjogbnVtYmVyLCBsZXZlbHMgPSA3LCBzcGFjaW5nUHggPSBHUk9VUF9NSU5fU1BBQ0lOR19QWCxcbik6IG51bWJlciB8IG51bGwge1xuICBpZiAoIShweFBlclVuaXQgPiAwKSB8fCAhKGJhc2VCaW4gPiAwKSkgcmV0dXJuIG51bGw7XG4gIGlmIChiYXNlQmluICogcHhQZXJVbml0ID49IHNwYWNpbmdQeCkgcmV0dXJuIG51bGw7XG4gIGZvciAobGV0IG0gPSAxOyBtIDwgbGV2ZWxzOyBtKyspIHtcbiAgICBjb25zdCBiaW4gPSBiYXNlQmluICogMiAqKiBtO1xuICAgIGlmIChiaW4gKiBweFBlclVuaXQgPj0gc3BhY2luZ1B4KSByZXR1cm4gYmluO1xuICB9XG4gIHJldHVybiBiYXNlQmluICogMiAqKiAobGV2ZWxzIC0gMSk7XG59XG5cbi8qKiBUaGUgZW50cmllcyBvZiBgdGAgaW5zaWRlIGByZWN0YCAob2JzZXJ2YXRpb24gdW5pdHMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsaXBUcmFuc2NyaXB0cyh0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsIHJlY3Q6IERhdGFSZWN0KTogU3BhdGlhbFRyYW5zY3JpcHRUaWxlIHtcbiAgY29uc3Qga2VlcDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICBpZiAodC54W2ldID49IHJlY3QueDAgJiYgdC54W2ldIDw9IHJlY3QueDEgJiYgdC55W2ldID49IHJlY3QueTAgJiYgdC55W2ldIDw9IHJlY3QueTEpIGtlZXAucHVzaChpKTtcbiAgfVxuICBpZiAoa2VlcC5sZW5ndGggPT09IHQuY291bnQpIHJldHVybiB0O1xuICBjb25zdCBwaWNrID0gPEEgZXh0ZW5kcyBGbG9hdDMyQXJyYXkgfCBVaW50MzJBcnJheSB8IFVpbnQxNkFycmF5PihhOiBBKTogQSA9PiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IChhLmNvbnN0cnVjdG9yIGFzIG5ldyAobjogbnVtYmVyKSA9PiBBKShrZWVwLmxlbmd0aCk7XG4gICAga2VlcC5mb3JFYWNoKChzcmMsIGkpID0+IHsgb3V0W2ldID0gYVtzcmNdOyB9KTtcbiAgICByZXR1cm4gb3V0O1xuICB9O1xuICByZXR1cm4ge1xuICAgIGNvdW50OiBrZWVwLmxlbmd0aCwgYWdncmVnYXRlZDogdC5hZ2dyZWdhdGVkLFxuICAgIHg6IHBpY2sodC54KSwgeTogcGljayh0LnkpLCB6OiBwaWNrKHQueiksIHdlaWdodDogcGljayh0LndlaWdodCksIG9ic2VydmF0aW9uOiBwaWNrKHQub2JzZXJ2YXRpb24pLFxuICAgIGdlbmU6IHBpY2sodC5nZW5lKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBHcm91cCB0cmFuc2NyaXB0cyBpbnRvIGBiaW5gLXdpZGUgc3F1YXJlcyBvZiBhIGdyaWQgYW5jaG9yZWQgYXQgdGhlIG9yaWdpbiAoc28gYSBwYW4gZG9lc1xuICogbm90IG1vdmUgdGhlbSksIG9uZSBlbnRyeSBwZXIgKGdyb3VwLCBzcXVhcmUpOiBgZ3JvdXBPZihnZW5lIHNsb3QpYCBzYXlzIHdoaWNoIGdyb3VwIGEgZ2VuZVxuICogaXMgaW4g4oCUIGl0cyBjbHVzdGVyIGluIHRoZSBnZW5lIHRyZWUsIG9yIGl0c2VsZi4gRWFjaCBlbnRyeSBzaXRzIGF0IGl0cyB0cmFuc2NyaXB0cydcbiAqIGNlbnRyb2lkLCB3ZWlnaHRlZCBieSBob3cgbWFueSBlYWNoIHN0YW5kcyBmb3I7IGl0IHRha2VzIHRoZSBnZW5lIGFuZCB0aGUgY2VsbCBob2xkaW5nIG1vc3RcbiAqIG9mIHRoZW0sIGVhY2ggc3VtbWVkIG92ZXIgYWxsIGl0cyB0cmFuc2NyaXB0cyBpbiB0aGUgZW50cnkuIGBncm91cFtpXWAgaXMgZW50cnkgaSdzIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBUcmFuc2NyaXB0cyhcbiAgdDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlLCBiaW46IG51bWJlciwgZ3JvdXBPZjogKGdlbmVTbG90OiBudW1iZXIpID0+IG51bWJlciA9IChnKSA9PiBnLFxuKTogeyB0aWxlOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7IGdyb3VwOiBJbnQzMkFycmF5IH0ge1xuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGNvbnN0IHN4OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBzeTogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgc3o6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHc6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGdycDogbnVtYmVyW10gPSBbXTtcbiAgLy8gUGVyIGVudHJ5LCBob3cgbWFueSB0cmFuc2NyaXB0cyBvZiBlYWNoIGdlbmUgKHRoZSBkb21pbmFudCBvbmUgZ2l2ZXMgdGhlIGljb24gYW5kIGNvbG91cilcbiAgLy8gYW5kIGluIGVhY2ggY2VsbCAodGhlIGRvbWluYW50IG9uZSBpcyB0aGUgZW50cnkncyBjZWxsKS5cbiAgY29uc3QgZ2VuZVc6IE1hcDxudW1iZXIsIG51bWJlcj5bXSA9IFtdO1xuICBjb25zdCBvYnNXOiBNYXA8bnVtYmVyLCBudW1iZXI+W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICBjb25zdCBnayA9IGdyb3VwT2YodC5nZW5lW2ldKTtcbiAgICBjb25zdCBrZXkgPSBgJHtna318JHtNYXRoLmZsb29yKHQueFtpXSAvIGJpbil9fCR7TWF0aC5mbG9vcih0LnlbaV0gLyBiaW4pfWA7XG4gICAgbGV0IGsgPSBpbmRleC5nZXQoa2V5KTtcbiAgICBjb25zdCB3aSA9IHQud2VpZ2h0W2ldIHx8IDE7XG4gICAgaWYgKGsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgayA9IHcubGVuZ3RoO1xuICAgICAgaW5kZXguc2V0KGtleSwgayk7XG4gICAgICBzeC5wdXNoKDApOyBzeS5wdXNoKDApOyBzei5wdXNoKDApOyB3LnB1c2goMCk7XG4gICAgICBncnAucHVzaChnayk7IGdlbmVXLnB1c2gobmV3IE1hcCgpKTsgb2JzVy5wdXNoKG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIHN4W2tdICs9IHQueFtpXSAqIHdpO1xuICAgIHN5W2tdICs9IHQueVtpXSAqIHdpO1xuICAgIHN6W2tdICs9IHQueltpXSAqIHdpO1xuICAgIHdba10gKz0gd2k7XG4gICAgZ2VuZVdba10uc2V0KHQuZ2VuZVtpXSwgKGdlbmVXW2tdLmdldCh0LmdlbmVbaV0pID8/IDApICsgd2kpO1xuICAgIG9ic1dba10uc2V0KHQub2JzZXJ2YXRpb25baV0sIChvYnNXW2tdLmdldCh0Lm9ic2VydmF0aW9uW2ldKSA/PyAwKSArIHdpKTtcbiAgfVxuICBjb25zdCBuID0gdy5sZW5ndGg7XG4gIGNvbnN0IHRpbGU6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSA9IHtcbiAgICBjb3VudDogbiwgYWdncmVnYXRlZDogdHJ1ZSxcbiAgICB4OiBuZXcgRmxvYXQzMkFycmF5KG4pLCB5OiBuZXcgRmxvYXQzMkFycmF5KG4pLCB6OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgIHdlaWdodDogbmV3IFVpbnQzMkFycmF5KG4pLCBvYnNlcnZhdGlvbjogbmV3IFVpbnQzMkFycmF5KG4pLCBnZW5lOiBuZXcgVWludDE2QXJyYXkobiksXG4gIH07XG4gIGNvbnN0IGdyb3VwID0gbmV3IEludDMyQXJyYXkobik7XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgaysrKSB7XG4gICAgdGlsZS54W2tdID0gc3hba10gLyB3W2tdO1xuICAgIHRpbGUueVtrXSA9IHN5W2tdIC8gd1trXTtcbiAgICB0aWxlLnpba10gPSBzeltrXSAvIHdba107XG4gICAgdGlsZS53ZWlnaHRba10gPSB3W2tdO1xuICAgIHRpbGUub2JzZXJ2YXRpb25ba10gPSBkb21pbmFudChvYnNXW2tdKTtcbiAgICB0aWxlLmdlbmVba10gPSBkb21pbmFudChnZW5lV1trXSk7XG4gICAgZ3JvdXBba10gPSBncnBba107XG4gIH1cbiAgcmV0dXJuIHsgdGlsZSwgZ3JvdXAgfTtcbn1cblxuLyoqIFRoZSBrZXkgd2l0aCB0aGUgbGFyZ2VzdCB0b3RhbDsgdGhlIGZpcnN0IHNlZW4gb24gYSB0aWUuICovXG5mdW5jdGlvbiBkb21pbmFudCh0b3RhbHM6IE1hcDxudW1iZXIsIG51bWJlcj4pOiBudW1iZXIge1xuICBsZXQgYmVzdCA9IDA7XG4gIGxldCB0b3AgPSAtMTtcbiAgZm9yIChjb25zdCBba2V5LCB2XSBvZiB0b3RhbHMpIGlmICh2ID4gdG9wKSB7IHRvcCA9IHY7IGJlc3QgPSBrZXk7IH1cbiAgcmV0dXJuIGJlc3Q7XG59XG5cbi8qKlxuICogVGhlIGNvbG91ciBvZiBlYWNoIGdlbmUtdHJlZSBjbHVzdGVyIG9mIGEgc2VsZWN0aW9uLCBmb3IgY29sb3VyaW5nIHRyYW5zY3JpcHRzIGJ5IGNsdXN0ZXI6IGFcbiAqIGNsdXN0ZXIgbmFtZWQgbGlrZSBhIGdyb3VwIG9mIHRoZSBjZWxscycgZ3JvdXBpbmcgdGFrZXMgdGhhdCBncm91cCdzIGNvbG91ciAoaXRzIGNlbGxzIGFuZCBpdHNcbiAqIHRyYW5zY3JpcHRzIGFncmVlKTsgdGhlIG90aGVycyB0YWtlIHBhbGV0dGUgY29sb3VycyBpbiB0cmVlIG9yZGVyLiBDbHVzdGVycyBhcmUgdGhlIHRyZWUnc1xuICogZ3JvdXBzIGhvbGRpbmcgYSBzZWxlY3RlZCBnZW5lLCB0aGVuIGVhY2ggdW5ncm91cGVkIHNlbGVjdGVkIGdlbmUgb24gaXRzIG93bi4gRXZlcnkgZ2VuZSBvZiBhXG4gKiBjbHVzdGVyIGdldHMgdGhlIHNhbWUgY29sb3VyIOKAlCB0aGUgdHJlZSdzIHN3YXRjaGVzIGFuZCB0aGUgbWFya2VycyB1c2UgdGhpcyBvbmUgbWFwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2x1c3RlckNvbG9yTWFwKFxuICBnZW5lczogcmVhZG9ubHkgc3RyaW5nW10sIGdyb3VwczogcmVhZG9ubHkgeyBuYW1lOiBzdHJpbmc7IGdlbmVzOiByZWFkb25seSBzdHJpbmdbXSB9W10sXG4gIGNlbGxDb2xvcnM6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPiwgcGFsZXR0ZTogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2hvc2VuID0gbmV3IFNldChnZW5lcyk7XG4gIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBncm91cGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgZyBvZiBncm91cHMpIHtcbiAgICBjb25zdCBtaW5lID0gZy5nZW5lcy5maWx0ZXIoKHgpID0+IGNob3Nlbi5oYXMoeCkgJiYgIWdyb3VwZWQuaGFzKHgpKTtcbiAgICBpZiAoIW1pbmUubGVuZ3RoKSBjb250aW51ZTtcbiAgICBtaW5lLmZvckVhY2goKHgpID0+IGdyb3VwZWQuYWRkKHgpKTtcbiAgICBuYW1lcy5wdXNoKGcubmFtZSk7XG4gIH1cbiAgZm9yIChjb25zdCBnZW5lIG9mIGdlbmVzKSBpZiAoIWdyb3VwZWQuaGFzKGdlbmUpKSBuYW1lcy5wdXNoKGdlbmUpO1xuICBjb25zdCBvdXQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBsZXQgayA9IDA7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGlmIChvdXQuaGFzKG5hbWUpKSBjb250aW51ZTtcbiAgICBvdXQuc2V0KG5hbWUsIGNlbGxDb2xvcnMuZ2V0KG5hbWUpID8/IHBhbGV0dGVbaysrICUgcGFsZXR0ZS5sZW5ndGhdKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogVGhlIGNsdXN0ZXIgYSBzZWxlY3RlZCBnZW5lIGlzIGluOiBpdHMgZmlyc3QgZ2VuZS10cmVlIGdyb3VwIGhvbGRpbmcgaXQsIGVsc2UgaXRzZWxmLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsdXN0ZXJPZkdlbmUoXG4gIGdlbmU6IHN0cmluZywgZ3JvdXBzOiByZWFkb25seSB7IG5hbWU6IHN0cmluZzsgZ2VuZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH1bXSxcbik6IHN0cmluZyB7XG4gIHJldHVybiBncm91cHMuZmluZCgoZykgPT4gZy5nZW5lcy5pbmNsdWRlcyhnZW5lKSk/Lm5hbWUgPz8gZ2VuZTtcbn1cblxuLyoqIFNtYWxsZXN0IGFuZCBsYXJnZXN0IHRyYW5zY3JpcHQgbWFya2VyLCBpbiBjYW52YXMgcGl4ZWxzLiAqL1xuZXhwb3J0IGNvbnN0IFRSQU5TQ1JJUFRfTUlOX1BYID0gNDtcbmV4cG9ydCBjb25zdCBUUkFOU0NSSVBUX01BWF9QWCA9IDMyO1xuLyoqXG4gKiBQaHlzaWNhbCBkaWFtZXRlciBhIHNpbmdsZSB0cmFuc2NyaXB0IGlzIGRyYXduIGF0LCBpbiDCtW0g4oCUIGNsZWFybHkgbGFyZ2VyIHRoYW4gdGhlXG4gKiBpbWFnZWQgc3BvdCAofjAuMyDCtW0pIHNvIGl0IHN0YXlzIGxlZ2libGUsIGFuZCBzbWFsbCBlbm91Z2ggdGhhdCBuZWlnaGJvdXJpbmdcbiAqIG1vbGVjdWxlcyBpbnNpZGUgb25lIGNlbGwgc3RheSBhcGFydC5cbiAqL1xuZXhwb3J0IGNvbnN0IFRSQU5TQ1JJUFRfUEhZU0lDQUxfVU0gPSAxLjI7XG5cbi8qKlxuICogTWFya2VyIGRpYW1ldGVyIGluIGNhbnZhcyBwaXhlbHMgZm9yIGFuIGVudHJ5IHN0YW5kaW5nIGZvciBgd2VpZ2h0YCB0cmFuc2NyaXB0cy5cbiAqXG4gKiBUaGUgY29udmVudGlvbiBzcGF0aWFsIHZpZXdlcnMgc2hhcmUgKGRlY2suZ2wncyBgcmFkaXVzTWluUGl4ZWxzYC9gcmFkaXVzTWF4UGl4ZWxzYCxcbiAqIFhlbml1bSBFeHBsb3JlcidzIHRyYW5zY3JpcHQgc2l6ZSk6IGEgUEhZU0lDQUwgc2l6ZSwgY2xhbXBlZCB0byBhIHNjcmVlbi1waXhlbCByYW5nZS5cbiAqIFpvb21lZCBvdXQsIG1hcmtlcnMgc2l0IGF0IHRoZSBtaW5pbXVtIGFuZCBuZXZlciB2YW5pc2g7IHpvb21lZCBpbiwgdGhleSBncm93IHdpdGggdGhlXG4gKiB0aXNzdWUgaW5zdGVhZCBvZiBzaHJpbmtpbmcgdG8gc3BlY2tzIG5leHQgdG8gY2VsbHMgaHVuZHJlZHMgb2YgcGl4ZWxzIHdpZGUuIEEgZml4ZWRcbiAqIHNjcmVlbiBzaXplIGRvZXMgdGhlIG9wcG9zaXRlIGF0IGhpZ2ggem9vbSwgd2hpY2ggaXMgd2hhdCBtYWRlIHRyYW5zY3JpcHRzIGRpc2FwcGVhclxuICogYXQgcGl4ZWwtbGV2ZWwgem9vbS5cbiAqXG4gKiBBZ2dyZWdhdGVzIGdyb3cgd2l0aCB0aGUgY3ViZSByb290IG9mIHRoZWlyIGNvdW50OiBhcmVhIOKInSBjb3VudCB3b3VsZCBsZXQgb25lIGRlbnNlXG4gKiBhZ2dyZWdhdGUgc3dhbGxvdyBpdHMgbmVpZ2hib3VycywgdGhlIGN1YmUgcm9vdCBrZWVwcyBhIDEwMDAtdHJhbnNjcmlwdCBjbHVzdGVyIGNsZWFybHlcbiAqIGxhcmdlciB0aGFuIGEgMTAtdHJhbnNjcmlwdCBvbmUgd2l0aG91dCBjb3ZlcmluZyB0aGUgdGlsZS5cbiAqXG4gKiBgcHhQZXJNaWNyb25gIGlzIG9taXR0ZWQgZm9yIGRhdGEgd2l0aCBubyBrbm93biBwaHlzaWNhbCB1bml0OyB0aGUgbWFya2VyIGlzIHRoZW5cbiAqIHNjcmVlbi1zaXplZCBvbmx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNjcmlwdE1hcmtlclB4KHdlaWdodDogbnVtYmVyLCBzY2FsZSA9IDEsIHB4UGVyTWljcm9uPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgY291bnRlZCA9IFRSQU5TQ1JJUFRfTUlOX1BYICogTWF0aC5jYnJ0KE1hdGgubWF4KDEsIHdlaWdodCkpO1xuICBjb25zdCBwaHlzaWNhbCA9IHB4UGVyTWljcm9uID8gVFJBTlNDUklQVF9QSFlTSUNBTF9VTSAqIHB4UGVyTWljcm9uIDogMDtcbiAgY29uc3QgcHggPSBNYXRoLm1heChjb3VudGVkLCBwaHlzaWNhbCkgKiBzY2FsZTtcbiAgcmV0dXJuIE1hdGgubWluKFRSQU5TQ1JJUFRfTUFYX1BYICogTWF0aC5tYXgoc2NhbGUsIDEpLCBNYXRoLm1heChUUkFOU0NSSVBUX01JTl9QWCAqIHNjYWxlLCBweCkpO1xufVxuXG4vLyDilIDilIAgR2x5cGhzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogTWFya2VyIHNoYXBlcyBmb3IgdGhlIHRyYW5zY3JpcHQgXCJpY29uXCIgbW9kZS4gQWxsIHN0YXItY29udmV4LCBzbyBhIGZhbiBmaWxscyB0aGVtLiAqL1xuZXhwb3J0IGNvbnN0IFRSQU5TQ1JJUFRfR0xZUEhTID0gW1xuICAnY2lyY2xlJywgJ3N0YXInLCAndHJpYW5nbGUnLCAnc3F1YXJlJywgJ2RpYW1vbmQnLCAnY3Jvc3MnLCAnaGV4YWdvbicsICd0cmlhbmdsZS1kb3duJyxcbiAgJ3BlbnRhZ29uJywgJ3gnLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFRyYW5zY3JpcHRHbHlwaCA9IHR5cGVvZiBUUkFOU0NSSVBUX0dMWVBIU1tudW1iZXJdO1xuLy8gVGhlIHZpZXcgc3RhdGUgbmFtZXMgZ2x5cGhzIHdpdGhvdXQgaW1wb3J0aW5nIHRoaXMgbW9kdWxlOyBrZWVwIHRoZSB0d28gaW4gc3RlcC5cbmNvbnN0IF9nbHlwaE5hbWVzTWF0Y2g6IFRyYW5zY3JpcHRHbHlwaCBleHRlbmRzIFRyYW5zY3JpcHRHbHlwaE5hbWVcbiAgPyAoVHJhbnNjcmlwdEdseXBoTmFtZSBleHRlbmRzIFRyYW5zY3JpcHRHbHlwaCA/IHRydWUgOiBuZXZlcikgOiBuZXZlciA9IHRydWU7XG52b2lkIF9nbHlwaE5hbWVzTWF0Y2g7XG5cbi8qKiBVbml0IG91dGxpbmUgb2YgYSBnbHlwaCwgcmFkaXVzIOKJiCAxLCBjZW50cmVkIG9uIHRoZSBvcmlnaW4sIGFzIGBbeDAsIHkwLCB4MSwgeTEsIOKApl1gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdseXBoT3V0bGluZShnbHlwaDogVHJhbnNjcmlwdEdseXBoKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgcG9seSA9IChuOiBudW1iZXIsIHJvdCA9IC1NYXRoLlBJIC8gMiwgciA9IDEpID0+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KG4gKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgY29uc3QgYSA9IHJvdCArIChpICogMiAqIE1hdGguUEkpIC8gbjtcbiAgICAgIG91dFsyICogaV0gPSBNYXRoLmNvcyhhKSAqIHI7XG4gICAgICBvdXRbMiAqIGkgKyAxXSA9IE1hdGguc2luKGEpICogcjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcbiAgY29uc3Qgc3RhciA9IChwb2ludHM6IG51bWJlciwgaW5uZXI6IG51bWJlciwgcm90ID0gLU1hdGguUEkgLyAyKSA9PiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShwb2ludHMgKiA0KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cyAqIDI7IGkrKykge1xuICAgICAgY29uc3QgYSA9IHJvdCArIChpICogTWF0aC5QSSkgLyBwb2ludHM7XG4gICAgICBjb25zdCByID0gaSAlIDIgPT09IDAgPyAxIDogaW5uZXI7XG4gICAgICBvdXRbMiAqIGldID0gTWF0aC5jb3MoYSkgKiByO1xuICAgICAgb3V0WzIgKiBpICsgMV0gPSBNYXRoLnNpbihhKSAqIHI7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH07XG4gIC8vIEEgcGx1cyBidWlsdCBhcyBhIDEyLWdvbjogYXJtcyBvZiBoYWxmLXdpZHRoIHcuXG4gIGNvbnN0IHBsdXMgPSAodzogbnVtYmVyLCByb3RhdGU6IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCBwdHMgPSBbXG4gICAgICBbdywgLTFdLCBbdywgLXddLCBbMSwgLXddLCBbMSwgd10sIFt3LCB3XSwgW3csIDFdLFxuICAgICAgWy13LCAxXSwgWy13LCB3XSwgWy0xLCB3XSwgWy0xLCAtd10sIFstdywgLXddLCBbLXcsIC0xXSxcbiAgICBdO1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkocHRzLmxlbmd0aCAqIDIpO1xuICAgIGNvbnN0IGMgPSBNYXRoLlNRUlQxXzI7XG4gICAgcHRzLmZvckVhY2goKFt4LCB5XSwgaSkgPT4ge1xuICAgICAgb3V0WzIgKiBpXSA9IHJvdGF0ZSA/ICh4IC0geSkgKiBjIDogeDtcbiAgICAgIG91dFsyICogaSArIDFdID0gcm90YXRlID8gKHggKyB5KSAqIGMgOiB5O1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG4gIHN3aXRjaCAoZ2x5cGgpIHtcbiAgICBjYXNlICdjaXJjbGUnOiByZXR1cm4gcG9seSgxMik7XG4gICAgY2FzZSAnc3Rhcic6IHJldHVybiBzdGFyKDUsIDAuNDUpO1xuICAgIGNhc2UgJ3RyaWFuZ2xlJzogcmV0dXJuIHBvbHkoMyk7XG4gICAgY2FzZSAndHJpYW5nbGUtZG93bic6IHJldHVybiBwb2x5KDMsIE1hdGguUEkgLyAyKTtcbiAgICBjYXNlICdzcXVhcmUnOiByZXR1cm4gcG9seSg0LCBNYXRoLlBJIC8gNCwgTWF0aC5TUVJUMiAqIDAuOCk7XG4gICAgY2FzZSAnZGlhbW9uZCc6IHJldHVybiBwb2x5KDQsIC1NYXRoLlBJIC8gMik7XG4gICAgY2FzZSAnaGV4YWdvbic6IHJldHVybiBwb2x5KDYsIDApO1xuICAgIGNhc2UgJ3BlbnRhZ29uJzogcmV0dXJuIHBvbHkoNSk7XG4gICAgY2FzZSAnY3Jvc3MnOiByZXR1cm4gcGx1cygwLjMyLCBmYWxzZSk7XG4gICAgY2FzZSAneCc6IHJldHVybiBwbHVzKDAuMjgsIHRydWUpO1xuICB9XG59XG5cbi8qKiBUaGUgZ2x5cGggYSBnZW5lIGdldHMgYnkgZGVmYXVsdDogYnkgaXRzIHBvc2l0aW9uIGluIHRoZSBzZWxlY3RlZCBsaXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRHbHlwaEZvcihzbG90OiBudW1iZXIpOiBUcmFuc2NyaXB0R2x5cGgge1xuICByZXR1cm4gVFJBTlNDUklQVF9HTFlQSFNbc2xvdCAlIFRSQU5TQ1JJUFRfR0xZUEhTLmxlbmd0aF07XG59XG5cbi8qKlxuICogRXhwYW5kIHBvaW50IG1hcmtlcnMgaW50byBnbHlwaCByaW5ncyBmb3IgYSBzaGFwZXMgbGF5ZXI6IGVudHJ5IGBpYCBiZWNvbWVzIGEgY29weSBvZlxuICogYGdseXBoc1tnZW5lW2ldXWAgc2NhbGVkIHRvIGByYWRpdXNbaV1gIGFuZCBjZW50cmVkIG9uIGAoeFtpXSwgeVtpXSlgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2x5cGhSaW5ncyhcbiAgeDogRmxvYXQzMkFycmF5LCB5OiBGbG9hdDMyQXJyYXksIHJhZGl1czogRmxvYXQzMkFycmF5LCBnbHlwaE9mOiAoaTogbnVtYmVyKSA9PiBGbG9hdDMyQXJyYXksXG4pOiB7IGNvb3JkczogRmxvYXQzMkFycmF5OyBvZmZzZXRzOiBVaW50MzJBcnJheSB9IHtcbiAgY29uc3QgbiA9IHgubGVuZ3RoO1xuICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KG4gKyAxKTtcbiAgbGV0IHRvdGFsID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBvZmZzZXRzW2ldID0gdG90YWw7XG4gICAgdG90YWwgKz0gZ2x5cGhPZihpKS5sZW5ndGggLyAyO1xuICB9XG4gIG9mZnNldHNbbl0gPSB0b3RhbDtcbiAgY29uc3QgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheSh0b3RhbCAqIDIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IGcgPSBnbHlwaE9mKGkpO1xuICAgIGNvbnN0IHIgPSByYWRpdXNbaV07XG4gICAgbGV0IG8gPSBvZmZzZXRzW2ldICogMjtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGcubGVuZ3RoOyBrICs9IDIpIHtcbiAgICAgIGNvb3Jkc1tvKytdID0geFtpXSArIGdba10gKiByO1xuICAgICAgY29vcmRzW28rK10gPSB5W2ldICsgZ1trICsgMV0gKiByO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBjb29yZHMsIG9mZnNldHMgfTtcbn1cblxuLy8g4pSA4pSAIERpc2NyZXRlIGNvbG91cmluZyB0aHJvdWdoIGEgY29sb3JtYXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQSBzaGFwZXMgbGF5ZXIgY29sb3VycyB0aHJvdWdoIGEgY29sb3JtYXAgTFVULCBub3QgcGVyLXNoYXBlIFJHQkEuIEEgY2F0ZWdvcmljYWxcbiAqIHBhbGV0dGUgYmVjb21lcyBhIHBpZWNld2lzZS1jb25zdGFudCBjb2xvcm1hcDogY2F0ZWdvcnkgYGNgIG9mIGBuYCBvd25zIHRoZSBiYW5kXG4gKiBgW2MvbiwgKGMrMSkvbilgLCBhbmQgYSBzaGFwZSB0YWtlcyB0aGUgdmFsdWUgYXQgaXRzIGJhbmQncyBjZW50cmUsIHNvIHRoZSBMVVQnc1xuICogbGluZWFyIGZpbHRlcmluZyBuZXZlciBibGVuZHMgdHdvIGNhdGVnb3JpZXMuXG4gKlxuICogUmV0dXJucyB0aGUgc3RvcHMgKGxpbmVhciAwLi4xIFJHQikgYW5kIGEgZnVuY3Rpb24gbWFwcGluZyBhIGNhdGVnb3J5IGNvZGUgdG8gdGhlXG4gKiB2YWx1ZSB0byBoYW5kIHRoZSBsYXllci4gYG1pc3NpbmdgIGlzIHRoZSBjb2xvdXIgb2YgdGhlIGV4dHJhIGJhbmQgdXNlZCBmb3IgXCJub1xuICogY2F0ZWdvcnlcIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NyZXRlQ29sb3JtYXBTdG9wcyhcbiAgcmdiOiByZWFkb25seSAocmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKVtdLCBtaXNzaW5nOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4pOiB7IHN0b3BzOiB7IHQ6IG51bWJlcjsgY29sb3I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9W107IHZhbHVlT2Y6IChjb2RlOiBudW1iZXIpID0+IG51bWJlciB9IHtcbiAgY29uc3QgYmFuZHMgPSBbLi4ucmdiLCBtaXNzaW5nXTtcbiAgY29uc3QgbiA9IGJhbmRzLmxlbmd0aDtcbiAgY29uc3Qgc3RvcHM6IHsgdDogbnVtYmVyOyBjb2xvcjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIH1bXSA9IFtdO1xuICBjb25zdCBlcHMgPSAxZS02O1xuICBiYW5kcy5mb3JFYWNoKChjLCBpKSA9PiB7XG4gICAgY29uc3QgY29sb3I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFtjWzBdIC8gMjU1LCBjWzFdIC8gMjU1LCBjWzJdIC8gMjU1XTtcbiAgICBzdG9wcy5wdXNoKHsgdDogaSAvIG4gKyAoaSA9PT0gMCA/IDAgOiBlcHMpLCBjb2xvciB9KTtcbiAgICBzdG9wcy5wdXNoKHsgdDogKGkgKyAxKSAvIG4gLSAoaSA9PT0gbiAtIDEgPyAwIDogZXBzKSwgY29sb3IgfSk7XG4gIH0pO1xuICBjb25zdCBtaXNzaW5nQ29kZSA9IG4gLSAxO1xuICByZXR1cm4ge1xuICAgIHN0b3BzLFxuICAgIHZhbHVlT2Y6IChjb2RlOiBudW1iZXIpID0+ICgoY29kZSA8IDAgfHwgY29kZSA+PSBtaXNzaW5nQ29kZSA/IG1pc3NpbmdDb2RlIDogY29kZSkgKyAwLjUpIC8gbixcbiAgfTtcbn1cblxuLy8g4pSA4pSAIERlbnNpdHkgcmFzdGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFNlcGFyYWJsZSBHYXVzc2lhbiBibHVyIG9mIGEgcm93LW1ham9yIHJhc3RlciwgYHNpZ21hYCBpbiByYXN0ZXIgY2VsbHMuXG4gKlxuICogQSBwZXItZ2VuZSBjb3VudCByYXN0ZXIgYXQgMTAgwrVtIGlzIG1vc3RseSB6ZXJvcyBhbmQgb25lcyDigJQgZHJhd24gYXMtaXMgaXQgaXMgc3BlY2tsZSxcbiAqIG5vdCBhIGRlbnNpdHkuIEEgz4Mgb2Ygb25lIHRvIHR3byBjZWxscyAoMTDigJMyMCDCtW0sIGFib3V0IGEgY2VsbCBkaWFtZXRlcikgdHVybnMgaXQgaW50b1xuICogYSBmaWVsZCB0aGF0IHJlYWRzIGFzIHRlcnJpdG9yeSB3aGlsZSBrZWVwaW5nIHN0cnVjdHVyZXMgYSBmZXcgY2VsbHMgd2lkZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNtb290aFJhc3Rlcih2YWx1ZXM6IEZsb2F0MzJBcnJheSwgcm93czogbnVtYmVyLCBjb2xzOiBudW1iZXIsIHNpZ21hOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICBpZiAoIShzaWdtYSA+IDApKSByZXR1cm4gdmFsdWVzLnNsaWNlKCk7XG4gIGNvbnN0IHIgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwoc2lnbWEgKiAzKSk7XG4gIGNvbnN0IGtlcm5lbCA9IG5ldyBGbG9hdDMyQXJyYXkoMiAqIHIgKyAxKTtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAobGV0IGkgPSAtcjsgaSA8PSByOyBpKyspIHN1bSArPSAoa2VybmVsW2kgKyByXSA9IE1hdGguZXhwKC0oaSAqIGkpIC8gKDIgKiBzaWdtYSAqIHNpZ21hKSkpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGtlcm5lbC5sZW5ndGg7IGkrKykga2VybmVsW2ldIC89IHN1bTtcbiAgY29uc3QgdG1wID0gbmV3IEZsb2F0MzJBcnJheSh2YWx1ZXMubGVuZ3RoKTtcbiAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheSh2YWx1ZXMubGVuZ3RoKTtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCByb3dzOyB5KyspIHtcbiAgICBjb25zdCByb3cgPSB5ICogY29scztcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNvbHM7IHgrKykge1xuICAgICAgbGV0IGFjYyA9IDA7XG4gICAgICBmb3IgKGxldCBrID0gLXI7IGsgPD0gcjsgaysrKSB7XG4gICAgICAgIGNvbnN0IHh4ID0geCArIGs7XG4gICAgICAgIGlmICh4eCA+PSAwICYmIHh4IDwgY29scykgYWNjICs9IHZhbHVlc1tyb3cgKyB4eF0gKiBrZXJuZWxbayArIHJdO1xuICAgICAgfVxuICAgICAgdG1wW3JvdyArIHhdID0gYWNjO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCB5ID0gMDsgeSA8IHJvd3M7IHkrKykge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgY29sczsgeCsrKSB7XG4gICAgICBsZXQgYWNjID0gMDtcbiAgICAgIGZvciAobGV0IGsgPSAtcjsgayA8PSByOyBrKyspIHtcbiAgICAgICAgY29uc3QgeXkgPSB5ICsgaztcbiAgICAgICAgaWYgKHl5ID49IDAgJiYgeXkgPCByb3dzKSBhY2MgKz0gdG1wW3l5ICogY29scyArIHhdICoga2VybmVsW2sgKyByXTtcbiAgICAgIH1cbiAgICAgIG91dFt5ICogY29scyArIHhdID0gYWNjO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENvbG91ciBhIGRlbnNpdHkgcmFzdGVyIGFzIFJHQkEgYnl0ZXM6IGxvZy1zY2FsZWQsIHdpbmRvd2VkIGF0IGEgaGlnaCBwZXJjZW50aWxlIG9mIHRoZVxuICogbm9uLXplcm8gdmFsdWVzLCBhbmQgZmFkZWQgaW4gZnJvbSB0cmFuc3BhcmVudCBzbyBlbXB0eSB0aXNzdWUgc2hvd3Mgd2hhdCBpcyB1bmRlciBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yRGVuc2l0eShcbiAgdmFsdWVzOiBGbG9hdDMyQXJyYXksIGx1dDogcmVhZG9ubHkgKHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSlbXSwgb3BhY2l0eTogbnVtYmVyLFxuICB7IGxvZyA9IHRydWUsIHBlcmNlbnRpbGUgPSAwLjk5NSB9ID0ge30sXG4pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIGNvbnN0IHQgPSBsb2cgPyB2YWx1ZXMubWFwKCh2KSA9PiBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIHYpKSkgOiB2YWx1ZXM7XG4gIGNvbnN0IHBvc2l0aXZlOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgaWYgKHRbaV0gPiAwKSBwb3NpdGl2ZS5wdXNoKHRbaV0pO1xuICBwb3NpdGl2ZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGNvbnN0IGF0ID0gTWF0aC5taW4ocG9zaXRpdmUubGVuZ3RoIC0gMSwgTWF0aC5mbG9vcihwZXJjZW50aWxlICogcG9zaXRpdmUubGVuZ3RoKSk7XG4gIGNvbnN0IGhpID0gcG9zaXRpdmUubGVuZ3RoID8gcG9zaXRpdmVbYXRdIDogMTtcbiAgY29uc3QgcmdiYSA9IG5ldyBVaW50OEFycmF5KG4gKiA0KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCBmID0gTWF0aC5taW4oMSwgdFtpXSAvIChoaSB8fCAxKSk7XG4gICAgaWYgKGYgPCAwLjAyKSBjb250aW51ZTtcbiAgICBjb25zdCBjID0gbHV0W01hdGgubWluKGx1dC5sZW5ndGggLSAxLCBNYXRoLnJvdW5kKGYgKiAobHV0Lmxlbmd0aCAtIDEpKSldO1xuICAgIHJnYmFbNCAqIGldID0gY1swXTtcbiAgICByZ2JhWzQgKiBpICsgMV0gPSBjWzFdO1xuICAgIHJnYmFbNCAqIGkgKyAyXSA9IGNbMl07XG4gICAgcmdiYVs0ICogaSArIDNdID0gTWF0aC5yb3VuZCgyNTUgKiBvcGFjaXR5ICogTWF0aC5wb3coZiwgMC42KSk7XG4gIH1cbiAgcmV0dXJuIHJnYmE7XG59XG5cbi8vIOKUgOKUgCBBbGwtZ2VuZSB0cmFuc2NyaXB0czogZ3JvdXBpbmcgdW5kZXIgYSBtYXJrZXIgYnVkZ2V0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogU21hbGxlc3Qgb24tc2NyZWVuIHNwYWNpbmcgYmV0d2VlbiBncm91cHMsIGluIHB4IOKAlCBiZWxvdyBpdCBncm91cHMgcmVhZCBhcyBub2lzZS4gKi9cbmV4cG9ydCBjb25zdCBHUk9VUF9NSU5fU1BBQ0lOR19QWCA9IDE0O1xuXG4vKiogQXJlYSBvZiBgcmVjdGAgaW5zaWRlIGBib3VuZHNgICh0aGUgd2hvbGUgcmVjdCB3aGVuIHRoZXJlIGFyZSBub25lKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXNpYmxlQXJlYShyZWN0OiBEYXRhUmVjdCwgYm91bmRzPzogU3BhdGlhbEJvdW5kcyB8IG51bGwpOiBudW1iZXIge1xuICBjb25zdCB4MCA9IGJvdW5kcyA/IE1hdGgubWF4KHJlY3QueDAsIGJvdW5kc1swXSkgOiByZWN0LngwO1xuICBjb25zdCB5MCA9IGJvdW5kcyA/IE1hdGgubWF4KHJlY3QueTAsIGJvdW5kc1sxXSkgOiByZWN0LnkwO1xuICBjb25zdCB4MSA9IGJvdW5kcyA/IE1hdGgubWluKHJlY3QueDEsIGJvdW5kc1syXSkgOiByZWN0LngxO1xuICBjb25zdCB5MSA9IGJvdW5kcyA/IE1hdGgubWluKHJlY3QueTEsIGJvdW5kc1szXSkgOiByZWN0LnkxO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgeDEgLSB4MCkgKiBNYXRoLm1heCgwLCB5MSAtIHkwKTtcbn1cblxuZXhwb3J0IHR5cGUgQWxsR2VuZXNQbGFuID0geyBraW5kOiAnaW5kaXZpZHVhbCcgfSB8IHsga2luZDogJ2JpbnMnOyBsZXZlbDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdub25lJyB9O1xuXG4vKipcbiAqIEhvdyB0byBkcmF3IGV2ZXJ5IHRyYW5zY3JpcHQgaW4gdmlldyB3aXRob3V0IGV4Y2VlZGluZyBgYnVkZ2V0YCBtYXJrZXJzLlxuICpcbiAqIC0gVGhlIHRyYW5zY3JpcHRzIHRoZW1zZWx2ZXMsIG9uY2UgdGhlIGVzdGltYXRlZCBjb3VudCBpbiB2aWV3IGZpdHMgdGhlIGJ1ZGdldC5cbiAqIC0gT3RoZXJ3aXNlIHRoZSBmaW5lc3QgcHlyYW1pZCBsZXZlbCB3aG9zZSBiaW5zIGFyZSBhdCBsZWFzdCBgbWluU3BhY2luZ1B4YCBhcGFydCBvblxuICogICBzY3JlZW4gYW5kIG51bWJlciBubyBtb3JlIHRoYW4gdGhlIGJ1ZGdldCDigJQgZ3JvdXBzIGJpZyBlbm91Z2ggdG8gcmVhZCwgZmV3IGVub3VnaFxuICogICB0byBkcmF3LlxuICpcbiAqIFRoZSBjb3VudCBpbiB2aWV3IGlzIGVzdGltYXRlZCBmcm9tIHRoZSBhdmVyYWdlIGRlbnNpdHksIHdoaWNoIG92ZXItIG9yIHVuZGVyLXNob290c1xuICogbG9jYWxseTsgdGhlIHJlbmRlcmVyIHN0aWxsIGNhcHMgd2hhdCBpdCBkcmF3cywgc28gYW4gZXN0aW1hdGUgaXMgZW5vdWdoIHRvIGNob29zZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFsbEdlbmVzUGxhbihvOiB7XG4gIHJlY3Q6IERhdGFSZWN0OyBib3VuZHM6IFNwYXRpYWxCb3VuZHM7IHRvdGFsOiBudW1iZXI7IHB4UGVyVW5pdDogbnVtYmVyO1xuICBsZXZlbHM6IHJlYWRvbmx5IHsgYmluU2l6ZTogbnVtYmVyIH1bXTsgYnVkZ2V0OiBudW1iZXI7IGNhbkluZGl2aWR1YWw6IGJvb2xlYW47XG4gIG1pblNwYWNpbmdQeD86IG51bWJlcjtcbn0pOiBBbGxHZW5lc1BsYW4ge1xuICBjb25zdCBhcmVhID0gdmlzaWJsZUFyZWEoby5yZWN0LCBvLmJvdW5kcyk7XG4gIGlmICghKGFyZWEgPiAwKSkgcmV0dXJuIHsga2luZDogJ25vbmUnIH07XG4gIGNvbnN0IGIgPSBvLmJvdW5kcztcbiAgY29uc3QgZGVuc2l0eSA9IG8udG90YWwgLyBNYXRoLm1heCgxLCAoYlsyXSAtIGJbMF0pICogKGJbM10gLSBiWzFdKSk7XG4gIGlmIChvLmNhbkluZGl2aWR1YWwgJiYgZGVuc2l0eSAqIGFyZWEgPD0gby5idWRnZXQpIHJldHVybiB7IGtpbmQ6ICdpbmRpdmlkdWFsJyB9O1xuICBpZiAoIW8ubGV2ZWxzLmxlbmd0aCkgcmV0dXJuIHsga2luZDogJ25vbmUnIH07XG4gIGNvbnN0IHNwYWNpbmcgPSBvLm1pblNwYWNpbmdQeCA/PyBHUk9VUF9NSU5fU1BBQ0lOR19QWDtcbiAgZm9yIChsZXQgbCA9IDA7IGwgPCBvLmxldmVscy5sZW5ndGg7IGwrKykge1xuICAgIGNvbnN0IGJpbiA9IG8ubGV2ZWxzW2xdLmJpblNpemU7XG4gICAgLy8gVGlzc3VlIHJhcmVseSBmaWxscyB0aGUgdmlldzsgMC43IG9mIHRoZSBiaW5zIG9jY3VwaWVkIGlzIGEgZmFpciBndWVzcy5cbiAgICBpZiAoYmluICogby5weFBlclVuaXQgPj0gc3BhY2luZyAmJiAoYXJlYSAvIChiaW4gKiBiaW4pKSAqIDAuNyA8PSBvLmJ1ZGdldCkge1xuICAgICAgcmV0dXJuIHsga2luZDogJ2JpbnMnLCBsZXZlbDogbCB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBraW5kOiAnYmlucycsIGxldmVsOiBvLmxldmVscy5sZW5ndGggLSAxIH07XG59XG5cbi8qKlxuICogRGlhbWV0ZXIgaW4gcHggb2YgYSBncm91cCBvZiBgY291bnRgIHRyYW5zY3JpcHRzIGluIGEgYmluIGBiaW5QeGAgd2lkZSwgd2hlcmVcbiAqIGByZWZDb3VudGAgaXMgYSB0eXBpY2FsIGJ1c3kgYmluIGluIHZpZXcgKGl0cyA5NXRoIHBlcmNlbnRpbGUpLlxuICpcbiAqIEFyZWEgZ3Jvd3Mgd2l0aCB0aGUgY291bnQg4oCUIGEgYmluIHdpdGggYSBxdWFydGVyIG9mIHRoZSB0cmFuc2NyaXB0cyBnZXRzIGhhbGYgdGhlXG4gKiBkaWFtZXRlciDigJQgYmV0d2VlbiBhIHRoaXJkIG9mIHRoZSBiaW4gKHNvIGEgc3BhcnNlIGJpbiBpcyBzdGlsbCB2aXNpYmxlKSBhbmQgYSBsaXR0bGVcbiAqIG92ZXIgdGhlIGZ1bGwgYmluIChzbyBkZW5zZSBuZWlnaGJvdXJzIGp1c3QgdG91Y2ggcmF0aGVyIHRoYW4gcGlsZSB1cCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cGVkTWFya2VyUHgoY291bnQ6IG51bWJlciwgcmVmQ291bnQ6IG51bWJlciwgYmluUHg6IG51bWJlciwgc2NhbGUgPSAxKTogbnVtYmVyIHtcbiAgY29uc3QgZiA9IE1hdGguc3FydChNYXRoLm1pbigxLCBjb3VudCAvIE1hdGgubWF4KDEsIHJlZkNvdW50KSkpO1xuICBjb25zdCBkID0gYmluUHggKiAoMC4zNSArIDAuNzUgKiBmKSAqIHNjYWxlO1xuICByZXR1cm4gTWF0aC5tYXgoVFJBTlNDUklQVF9NSU5fUFggKiBzY2FsZSwgTWF0aC5taW4oZCwgYmluUHggKiAxLjIgKiBNYXRoLm1heChzY2FsZSwgMSkpKTtcbn1cblxuLyoqIFRoZSBgcGAgcXVhbnRpbGUgKDAuLjEpIG9mIGEgY291bnQgdmVjdG9yIOKAlCBhIHNhbXBsZSBvZiBpdCBmb3IgbGFyZ2UgdmVjdG9ycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZU9mKHZhbHVlczogQXJyYXlMaWtlPG51bWJlcj4sIHA6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICBpZiAoIW4pIHJldHVybiAwO1xuICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihuIC8gNDA5NikpO1xuICBjb25zdCBzYW1wbGU6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSArPSBzdGVwKSBzYW1wbGUucHVzaCh2YWx1ZXNbaV0pO1xuICBzYW1wbGUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICByZXR1cm4gc2FtcGxlW01hdGgubWluKHNhbXBsZS5sZW5ndGggLSAxLCBNYXRoLmZsb29yKHAgKiBzYW1wbGUubGVuZ3RoKSldO1xufVxuXG4vKioge0BsaW5rIHRpbGVzSW5SZWN0fSBmb3IgYSBncmlkIHdob3NlIHRpbGUgKDAsIDApIHN0YXJ0cyBhdCBgb3JpZ2luYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWxlc0luUmVjdEZyb20oXG4gIG9yaWdpbjogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSwgcmVjdDogRGF0YVJlY3QsIGxldmVsOiBudW1iZXIsXG4gIGxldmVsczogcmVhZG9ubHkgU3BhdGlhbFRpbGVMZXZlbFtdLCBib3VuZHM/OiBTcGF0aWFsQm91bmRzIHwgbnVsbCwgbGltaXQgPSBJbmZpbml0eSxcbik6IFRpbGVLZXlbXSB7XG4gIGNvbnN0IFtveCwgb3ldID0gb3JpZ2luO1xuICBjb25zdCBzaGlmdGVkID0geyB4MDogcmVjdC54MCAtIG94LCB5MDogcmVjdC55MCAtIG95LCB4MTogcmVjdC54MSAtIG94LCB5MTogcmVjdC55MSAtIG95IH07XG4gIGNvbnN0IGI6IFNwYXRpYWxCb3VuZHMgfCBudWxsID0gYm91bmRzID8gW2JvdW5kc1swXSAtIG94LCBib3VuZHNbMV0gLSBveSwgYm91bmRzWzJdIC0gb3gsIGJvdW5kc1szXSAtIG95XSA6IG51bGw7XG4gIHJldHVybiB0aWxlc0luUmVjdChzaGlmdGVkLCBsZXZlbCwgbGV2ZWxzLCBiLCBsaW1pdCk7XG59XG5cbi8qKiBBIGRlbnNpdHkgd2luZG93IGZyb20gdGhlIG5vbi1lbXB0eSBiaW5zOiAxc3QgdG8gOTl0aCBwZXJjZW50aWxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbnNpdHlBdXRvUmFuZ2UodmFsdWVzOiBBcnJheUxpa2U8bnVtYmVyPik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBwb3NpdGl2ZTogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIGlmICh2YWx1ZXNbaV0gPiAwKSBwb3NpdGl2ZS5wdXNoKHZhbHVlc1tpXSk7XG4gIGlmICghcG9zaXRpdmUubGVuZ3RoKSByZXR1cm4gWzAsIDFdO1xuICBwb3NpdGl2ZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGNvbnN0IGF0ID0gKHA6IG51bWJlcikgPT4gcG9zaXRpdmVbTWF0aC5taW4ocG9zaXRpdmUubGVuZ3RoIC0gMSwgTWF0aC5mbG9vcihwICogcG9zaXRpdmUubGVuZ3RoKSldO1xuICBjb25zdCBsbyA9IGF0KDAuMDEpO1xuICBjb25zdCBoaSA9IGF0KDAuOTkpO1xuICByZXR1cm4gaGkgPiBsbyA/IFtsbywgaGldIDogWzAsIGhpIHx8IDFdO1xufVxuXG4vKipcbiAqIENvbG91ciBkZW5zaXR5IGJpbnMgdGhyb3VnaCBgbHV0YCBvdmVyIHRoZSB3aW5kb3cgYFtsbywgaGldYCDigJQgWGVuaXVtIEV4cGxvcmVyJ3NcbiAqIFwic2NhbGUgdGhyZXNob2xkXCIuIEJpbnMgYXQgb3IgYmVsb3cgYGxvYCBhcmUgdHJhbnNwYXJlbnQsIHNvIGVtcHR5IHRpc3N1ZSBzaG93cyB0aGVcbiAqIGltYWdlIHVuZGVyIGl0OyBiaW5zIGF0IG9yIGFib3ZlIGBoaWAgc2F0dXJhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckRlbnNpdHlXaW5kb3coXG4gIHZhbHVlczogQXJyYXlMaWtlPG51bWJlcj4sIGx1dDogcmVhZG9ubHkgKHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSlbXSxcbiAgb3BhY2l0eTogbnVtYmVyLCBsbzogbnVtYmVyLCBoaTogbnVtYmVyLFxuKTogVWludDhBcnJheSB7XG4gIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICBjb25zdCByZ2JhID0gbmV3IFVpbnQ4QXJyYXkobiAqIDQpO1xuICBjb25zdCBzcGFuID0gaGkgPiBsbyA/IGhpIC0gbG8gOiAxO1xuICBjb25zdCBhID0gTWF0aC5yb3VuZCgyNTUgKiBvcGFjaXR5KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCB2ID0gdmFsdWVzW2ldO1xuICAgIGlmICghKHYgPiBsbykpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGYgPSBNYXRoLm1pbigxLCAodiAtIGxvKSAvIHNwYW4pO1xuICAgIGNvbnN0IGMgPSBsdXRbTWF0aC5taW4obHV0Lmxlbmd0aCAtIDEsIE1hdGgucm91bmQoZiAqIChsdXQubGVuZ3RoIC0gMSkpKV07XG4gICAgcmdiYVs0ICogaV0gPSBjWzBdO1xuICAgIHJnYmFbNCAqIGkgKyAxXSA9IGNbMV07XG4gICAgcmdiYVs0ICogaSArIDJdID0gY1syXTtcbiAgICByZ2JhWzQgKiBpICsgM10gPSBhO1xuICB9XG4gIHJldHVybiByZ2JhO1xufVxuXG4vKipcbiAqIEluZmVybm8gKG1hdHBsb3RsaWIpLCBhcyBhbiBpbmxpbmUgYFtzdG9wLCBjb2xvdXJdYCBzY2FsZTogdGhlIGRlbnNpdHkgbWFwJ3MgZGVmYXVsdCxcbiAqIGFzIGluIFhlbml1bSBFeHBsb3Jlci4gSW5saW5lIGJlY2F1c2UgdGhlIGNvbG9ybWFwIHRyZWUncyBgSU5GRVJOT19MVVRgIGtleSBpcyByZXNvbHZlZFxuICogYXQgcnVudGltZSBieSB0aGUgc3RvcmUsIHdoaWNoIHRoZSByZW5kZXJlciBkb2VzIG5vdCBzZWUuXG4gKi9cbmV4cG9ydCBjb25zdCBJTkZFUk5PX1NDQUxFOiBbbnVtYmVyLCBzdHJpbmddW10gPSBbXG4gIFswLCAnIzAwMDAwNCddLCBbMC4xMjUsICcjMWIwYzQxJ10sIFswLjI1LCAnIzRhMGM2YiddLCBbMC4zNzUsICcjNzgxYzZkJ10sIFswLjUsICcjYTUyYzYwJ10sXG4gIFswLjYyNSwgJyNjZjQ0NDYnXSwgWzAuNzUsICcjZWQ2OTI1J10sIFswLjg3NSwgJyNmYjliMDYnXSwgWzEsICcjZmNmZmE0J10sXG5dO1xuIl19
|