@jax-data-science/sci-image-visualizer 0.6.0 → 0.7.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.
Files changed (29) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +28 -1
  2. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +3 -1
  3. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  4. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  5. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +195 -0
  6. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +10 -2
  7. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +1098 -0
  8. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +6 -3
  9. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +185 -8
  10. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +120 -2
  11. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +76 -1
  12. package/esm2022/lib/routing-visualizer.service.mjs +10 -1
  13. package/esm2022/lib/spatial/spatial-tiles.mjs +506 -0
  14. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +659 -19
  15. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2909 -62
  16. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  17. package/lib/contracts/display-types.d.ts +94 -1
  18. package/lib/contracts/ports/spatial-data.port.d.ts +59 -1
  19. package/lib/contracts/spatial-dataset.contract.d.ts +167 -0
  20. package/lib/contracts/visualizer.contract.d.ts +22 -1
  21. package/lib/implementations/napari-js/napari-navigator.d.ts +72 -0
  22. package/lib/implementations/napari-js/napari-region-overlay.d.ts +3 -0
  23. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +240 -0
  24. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +42 -2
  25. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +26 -2
  26. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -1
  27. package/lib/spatial/spatial-tiles.d.ts +222 -0
  28. package/lib/spatial-controls/spatial-controls.component.d.ts +234 -3
  29. package/package.json +1 -1
@@ -3,7 +3,7 @@ import { Injectable } from '@angular/core';
3
3
  import { BehaviorSubject, firstValueFrom } from 'rxjs';
4
4
  import { timeout } from 'rxjs/operators';
5
5
  import { findColumnMeta, } from '../../contracts/spatial-dataset.contract';
6
- import { assertManifestVersion, datasetFromManifest, decodeColumn, decodeCoords, decodeEmbedding, decodeFeatureVector, decodePolygons, decodeRadius, } from './spatial-wire';
6
+ import { assertManifestVersion, datasetFromManifest, decodeColumn, decodeCoords, decodeDensity, decodeEmbedding, decodeFeatureVector, decodePolygonTile, decodePolygons, decodeRadius, decodeTranscriptTile, } from './spatial-wire';
7
7
  import * as i0 from "@angular/core";
8
8
  import * as i1 from "@angular/common/http";
9
9
  /**
@@ -43,6 +43,7 @@ export class SupersededError extends Error {
43
43
  }
44
44
  export class SpatialDataHttpService {
45
45
  static { this.CACHE_LIMIT = 32; }
46
+ static { this.TILE_CACHE_LIMIT = 384; }
46
47
  constructor(http) {
47
48
  this.http = http;
48
49
  /** Server root, normalised to end with exactly one `/`. */
@@ -64,8 +65,15 @@ export class SpatialDataHttpService {
64
65
  this.cache = new Map();
65
66
  /** In-flight requests, so double-clicking a gene issues one fetch. */
66
67
  this.inFlight = new Map();
68
+ /**
69
+ * Tiles get their own, larger cache: panning revisits them constantly, and one screen
70
+ * of a zoomed-out section is dozens of them — far past the vector cache's limit.
71
+ */
72
+ this.tileCache = new Map();
67
73
  this.volumePromise = null;
68
74
  this.polygonsPromise = null;
75
+ /** Small JSON answers, keyed by URL — hovering back and forth must not refetch. */
76
+ this.summaryCache = new Map();
69
77
  }
70
78
  // ── configuration ───────────────────────────────────────────────────────
71
79
  /** Point the adapter at a server. Clears any loaded dataset. */
@@ -137,6 +145,8 @@ export class SpatialDataHttpService {
137
145
  this.manifest = null;
138
146
  this.cache.clear();
139
147
  this.inFlight.clear();
148
+ this.tileCache.clear();
149
+ this.summaryCache.clear();
140
150
  this.polygonsPromise = null;
141
151
  this.volumePromise = null;
142
152
  if (this.dataset$.value !== null)
@@ -201,6 +211,114 @@ export class SpatialDataHttpService {
201
211
  .catch((err) => { this.polygonsPromise = null; throw err; });
202
212
  return this.polygonsPromise;
203
213
  }
214
+ getPolygonTile(set, level, gx, gy) {
215
+ const manifest = this.requireManifest();
216
+ if (!manifest.polygonTiles) {
217
+ return Promise.reject(new Error('[spatial] this dataset has no tiled polygons'));
218
+ }
219
+ const path = `spatial/${encodeURIComponent(manifest.id)}/polygon-tile/`
220
+ + `${encodeURIComponent(set)}/${level}/${gx}/${gy}`;
221
+ return this.cachedTile(path, () => this.getBinary(path).then(decodePolygonTile));
222
+ }
223
+ getTranscriptTile(level, gx, gy, query) {
224
+ const manifest = this.requireManifest();
225
+ if (!manifest.transcriptTiles) {
226
+ return Promise.reject(new Error('[spatial] this dataset has no tiled transcripts'));
227
+ }
228
+ const genes = query.genes.map(encodeURIComponent).join(',');
229
+ const box = query.box ? `&box=${query.box.join(',')}` : '';
230
+ const path = `spatial/${encodeURIComponent(manifest.id)}/transcript-tile/${level}/${gx}/${gy}`
231
+ + `?genes=${genes}&quality=${query.quality ?? 'high'}${box}`;
232
+ return this.cachedTile(path, () => this.getBinary(path).then(decodeTranscriptTile));
233
+ }
234
+ getTranscriptBins(level, tx, ty) {
235
+ const manifest = this.requireManifest();
236
+ if (!manifest.transcriptBins) {
237
+ return Promise.reject(new Error('[spatial] this dataset has no transcript pyramid'));
238
+ }
239
+ const path = `spatial/${encodeURIComponent(manifest.id)}/transcript-bins/${level}/${tx}/${ty}`;
240
+ return this.cachedTile(path, () => this.getBinary(path).then(decodeTranscriptTile));
241
+ }
242
+ getTranscriptSummary(query) {
243
+ const manifest = this.requireManifest();
244
+ const params = [];
245
+ if (query.box)
246
+ params.push(`box=${query.box.map((v) => +v.toFixed(3)).join(',')}`);
247
+ if (query.genes?.length)
248
+ params.push(`genes=${query.genes.map(encodeURIComponent).join(',')}`);
249
+ if (query.cells?.length)
250
+ params.push(`cells=${query.cells.join(',')}`);
251
+ const url = `spatial/${encodeURIComponent(manifest.id)}/transcript-summary?${params.join('&')}`;
252
+ let hit = this.summaryCache.get(url);
253
+ if (!hit) {
254
+ hit = this.getJson(url);
255
+ hit.catch(() => this.summaryCache.delete(url));
256
+ this.summaryCache.set(url, hit);
257
+ if (this.summaryCache.size > 256)
258
+ this.summaryCache.delete(this.summaryCache.keys().next().value);
259
+ }
260
+ return hit;
261
+ }
262
+ getDensity(genes, binSize) {
263
+ const manifest = this.requireManifest();
264
+ if (!manifest.density)
265
+ return Promise.reject(new Error('[spatial] this dataset has no density raster'));
266
+ const list = [...genes];
267
+ const bin = binSize ? `&bin=${binSize}` : '';
268
+ return this.fetchCached(`density:${list.join(',')}:${binSize ?? ''}`, () => this.getBinary(`spatial/${encodeURIComponent(manifest.id)}/density?genes=${list.map(encodeURIComponent).join(',')}${bin}`).then((buf) => decodeDensity(buf, list)));
269
+ }
270
+ async importGroups(label, table) {
271
+ const manifest = this.requireManifest();
272
+ const url = `${this.baseUrl}spatial/${encodeURIComponent(manifest.id)}/groups?name=${encodeURIComponent(label)}`;
273
+ // HttpClient, not fetch: a host's interceptors (its auth header) must apply to the
274
+ // upload as they do to every read, or a protected server refuses it.
275
+ let body;
276
+ try {
277
+ body = await firstValueFrom(this.http.post(url, table, {
278
+ headers: { 'Content-Type': 'text/csv' },
279
+ }).pipe(timeout(this.timeoutMs)));
280
+ }
281
+ catch (err) {
282
+ const e = err;
283
+ throw new Error(e?.error?.error ?? `[spatial] import failed (HTTP ${e?.status ?? '?'})`);
284
+ }
285
+ const column = body.column;
286
+ // The new column joins the dataset: re-emit so every panel sees it.
287
+ const current = this.dataset$.value;
288
+ if (current && this.manifest?.id === manifest.id) {
289
+ const columns = current.columns.filter((c) => c.name !== column.name).concat(column);
290
+ this.manifest = { ...this.manifest, columns };
291
+ this.cache.delete(`column:${column.name}`);
292
+ this.dataset$.next({ ...current, columns });
293
+ }
294
+ return { column, matched: body.matched };
295
+ }
296
+ getTranscriptCounts(genes) {
297
+ const manifest = this.requireManifest();
298
+ return this.getJson(`spatial/${encodeURIComponent(manifest.id)}/transcript-counts?genes=${genes.map(encodeURIComponent).join(',')}`);
299
+ }
300
+ /** LRU over tile promises, so concurrent asks share one request and a failure is not kept. */
301
+ cachedTile(key, load) {
302
+ const hit = this.tileCache.get(key);
303
+ if (hit) {
304
+ this.tileCache.delete(key);
305
+ this.tileCache.set(key, hit);
306
+ return hit;
307
+ }
308
+ const mine = this.selectToken;
309
+ const promise = load().catch((err) => {
310
+ if (this.tileCache.get(key) === promise)
311
+ this.tileCache.delete(key);
312
+ throw err;
313
+ });
314
+ if (mine === this.selectToken) {
315
+ this.tileCache.set(key, promise);
316
+ while (this.tileCache.size > SpatialDataHttpService.TILE_CACHE_LIMIT) {
317
+ this.tileCache.delete(this.tileCache.keys().next().value);
318
+ }
319
+ }
320
+ return promise;
321
+ }
204
322
  /**
205
323
  * The reference volume's voxels, single-flighted like the polygons.
206
324
  *
@@ -301,4 +419,4 @@ export class SpatialDataHttpService {
301
419
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialDataHttpService, decorators: [{
302
420
  type: Injectable
303
421
  }], ctorParameters: () => [{ type: i1.HttpClient }] });
304
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1kYXRhLWh0dHAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL3NwYXRpYWwtZGF0YS1odHRwL3NwYXRpYWwtZGF0YS1odHRwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFLTCxjQUFjLEdBQ2YsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRCxPQUFPLEVBR0wscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixZQUFZLEVBQ1osWUFBWSxFQUNaLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLFlBQVksR0FDYixNQUFNLGdCQUFnQixDQUFDOzs7QUFFeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLEtBQUs7SUFDeEMsWUFBWSxFQUFVO1FBQ3BCLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBU0QsTUFBTSxPQUFPLHNCQUFzQjthQW9CVCxnQkFBVyxHQUFHLEVBQUUsQUFBTCxDQUFNO0lBUXpDLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUEzQnBDLDJEQUEyRDtRQUNuRCxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ3JCOzBCQUNrQjtRQUNWLGNBQVMsR0FBRyxNQUFNLENB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LENBQUMsQ0FBQyxDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFZO1FBQzVCLE9BQU8sY0FBYyxDQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUM7YUFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FDakMsQ0FBQztJQUNKLENBQUM7OEdBcFNVLHNCQUFzQjtrSEFBdEIsc0JBQXNCOzsyRkFBdEIsc0JBQXNCO2tCQURsQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNwYXRpYWxEYXRhUG9ydCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy9zcGF0aWFsLWRhdGEucG9ydCc7XG5pbXBvcnQge1xuICBTcGF0aWFsQ29sdW1uLFxuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbEVtYmVkZGluZyxcbiAgU3BhdGlhbFBvbHlnb25zLFxuICBmaW5kQ29sdW1uTWV0YSxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQge1xuICBTcGF0aWFsRGF0YXNldFN1bW1hcnksXG4gIFNwYXRpYWxNYW5pZmVzdCxcbiAgYXNzZXJ0TWFuaWZlc3RWZXJzaW9uLFxuICBkYXRhc2V0RnJvbU1hbmlmZXN0LFxuICBkZWNvZGVDb2x1bW4sXG4gIGRlY29kZUNvb3JkcyxcbiAgZGVjb2RlRW1iZWRkaW5nLFxuICBkZWNvZGVGZWF0dXJlVmVjdG9yLFxuICBkZWNvZGVQb2x5Z29ucyxcbiAgZGVjb2RlUmFkaXVzLFxufSBmcm9tICcuL3NwYXRpYWwtd2lyZSc7XG5cbi8qKlxuICogUmVmZXJlbmNlIHtAbGluayBTcGF0aWFsRGF0YVBvcnR9IGFkYXB0ZXIgZm9yIHRoZSB3aXJlIGZvcm1hdCB0aGUgYnVuZGxlZFxuICogZXhhbXBsZSBzZXJ2ZXIgc3BlYWtzIChzZWUgYHNwYXRpYWwtd2lyZS50c2AgYW5kXG4gKiBgZXhhbXBsZXMvdGlsZS1zZXJ2ZXIvbGliL3NwYXRpYWwubWpzYCkuXG4gKlxuICogT1BUSU9OQUwgQU5EIFVOQk9VTkQgQlkgREVGQVVMVCDigJQgdGhpcyBzZXJ2aWNlIGlzIGBASW5qZWN0YWJsZSgpYCB3aXRob3V0XG4gKiBgcHJvdmlkZWRJbmAsIHNvIG5vdGhpbmcgZ2V0cyBpdCB1bmxlc3MgYSBob3N0IGV4cGxpY2l0bHkgcHJvdmlkZXMgaXQ6XG4gKlxuICogYGBgdHNcbiAqIHByb3ZpZGVyczogW1xuICogICBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlLFxuICogICB7IHByb3ZpZGU6IFNQQVRJQUxfREFUQV9QT1JULCB1c2VFeGlzdGluZzogU3BhdGlhbERhdGFIdHRwU2VydmljZSB9LFxuICogXVxuICogYGBgXG4gKlxuICogVGhhdCBtaXJyb3JzIGBDZWxscG9zZVNlZ21lbnRlclNlcnZpY2VgOiBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHRoZVxuICogbGlicmFyeSBzaGlwcyBmb3IgY29udmVuaWVuY2UsIG5vdCBhIGRlZmF1bHQgdGhlIHBvcnQgaW52ZXJzaW9uIGlzIHF1aWV0bHlcbiAqIGdpdmluZyB1cCBvbi4gQSBob3N0IHdpdGggaXRzIG93biBiYWNrZW5kIGltcGxlbWVudHMgYFNwYXRpYWxEYXRhUG9ydGBcbiAqIGRpcmVjdGx5IGFuZCBuZXZlciB0b3VjaGVzIHRoaXMgY2xhc3MuXG4gKlxuICogUmVxdWVzdHMgZ28gdGhyb3VnaCBBbmd1bGFyJ3MgYEh0dHBDbGllbnRgIChub3QgYGZldGNoYCkgc28gdGhlIGhvc3Qnc1xuICogaW50ZXJjZXB0b3JzIOKAlCBhdXRoIGhlYWRlcnMgYWJvdmUgYWxsIOKAlCBhcHBseSwgbWF0Y2hpbmcgYHRpbGUtY2xpZW50LnRzYC5cbiAqL1xuLyoqXG4gKiBBIGRhdGFzZXQgc2VsZWN0aW9uIHRoYXQgYSBuZXdlciBzZWxlY3Rpb24gKG9yIGEgYGNsZWFyYCkgb3ZlcnRvb2suXG4gKlxuICogVGhyb3duIHJhdGhlciB0aGFuIHJlc29sdmVkIHNvIGEgY2FsbGVyIGNhbm5vdCBtaXN0YWtlIGl0IGZvciBcInRoaXMgZGF0YXNldCBpc1xuICogbm93IGxvYWRlZFwiOiBub3RoaW5nIHdhcyBwdWJsaXNoZWQsIG9uIHB1cnBvc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXBlcnNlZGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgW3NwYXRpYWxdIHNlbGVjdGlvbiBvZiBcIiR7aWR9XCIgd2FzIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBvbmVgKTtcbiAgICB0aGlzLm5hbWUgPSAnU3VwZXJzZWRlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFdoYXQgdGhlIExSVSBjYW4gaG9sZC4gT25lIGFsaWFzIHJhdGhlciB0aGFuIGEgdW5pb24gcmVwZWF0ZWQgYXQgZWFjaCB1c2UsIHNvIGFkZGluZyBhIHBheWxvYWRcbiAqIGtpbmQgaXMgYSBzaW5nbGUgZWRpdCBpbnN0ZWFkIG9mIGZvdXIgdGhhdCBjYW4gZHJpZnQgYXBhcnQuXG4gKi9cbnR5cGUgQ2FjaGVkUGF5bG9hZCA9IFNwYXRpYWxDb2x1bW4gfCBGbG9hdDMyQXJyYXkgfCBTcGF0aWFsRW1iZWRkaW5nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU3BhdGlhbERhdGFIdHRwU2VydmljZSBpbXBsZW1lbnRzIFNwYXRpYWxEYXRhUG9ydCB7XG4gIC8qKiBTZXJ2ZXIgcm9vdCwgbm9ybWFsaXNlZCB0byBlbmQgd2l0aCBleGFjdGx5IG9uZSBgL2AuICovXG4gIHByaXZhdGUgYmFzZVVybCA9ICcnO1xuICAvKiogUGVyLXJlcXVlc3QgY2VpbGluZy4gVmVjdG9ycyBhcmUgc21hbGw7IGEgaHVuZyByZXF1ZXN0IHNob3VsZCBub3Qgd2VkZ2VcbiAgICogIHRoZSBwaWNrZXIuICovXG4gIHByaXZhdGUgdGltZW91dE1zID0gMzBfMDAwO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YXNldCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNwYXRpYWxEYXRhc2V0IHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgbWFuaWZlc3Q6IFNwYXRpYWxNYW5pZmVzdCB8IG51bGwgPSBudWxsO1xuICAvKiogQnVtcGVkIGJ5IGV2ZXJ5IGBzZWxlY3REYXRhc2V0YCBhbmQgZXZlcnkgYGNsZWFyYCwgc28gYSBzZWxlY3Rpb24gdGhhdFxuICAgKiAgZmluaXNoZXMgYWZ0ZXIgYSBuZXdlciBpbnRlbnQgY2FuIHRlbGwgYW5kIGRyb3Agd2hhdCBpdCBmZXRjaGVkLiAqL1xuICBwcml2YXRlIHNlbGVjdFRva2VuID0gMDtcblxuICAvKipcbiAgICogTG9hZGVkIHZlY3RvcnMsIGtleWVkIGBjb2x1bW46PG5hbWU+YCAvIGBmZWF0dXJlOjxuYW1lPmAuIEJvdW5kZWQgTFJVOlxuICAgKiBjb2xvdXJpbmcgYnkgY2x1c3RlciDihpIgYnkgYSBnZW5lIOKGkiBiYWNrIGJ5IGNsdXN0ZXIgbXVzdCBub3QgcmVmZXRjaCwgYnV0IGFuXG4gICAqIGFmdGVybm9vbiBvZiBicm93c2luZyBnZW5lcyBtdXN0IG5vdCBncm93IHdpdGhvdXQgbGltaXQgZWl0aGVyIChvbmUgdmVjdG9yXG4gICAqIGlzIGA0wrdOYCBieXRlcyDigJQgMiBNQiBhdCA1MDBrIGNlbGxzKS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkUGF5bG9hZD4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0FDSEVfTElNSVQgPSAzMjtcblxuICAvKiogSW4tZmxpZ2h0IHJlcXVlc3RzLCBzbyBkb3VibGUtY2xpY2tpbmcgYSBnZW5lIGlzc3VlcyBvbmUgZmV0Y2guICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5GbGlnaHQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxDYWNoZWRQYXlsb2FkPj4oKTtcblxuICBwcml2YXRlIHZvbHVtZVByb21pc2U6IFByb21pc2U8VWludDhBcnJheT4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwb2x5Z29uc1Byb21pc2U6IFByb21pc2U8U3BhdGlhbFBvbHlnb25zPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge31cblxuICAvLyDilIDilIAgY29uZmlndXJhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUG9pbnQgdGhlIGFkYXB0ZXIgYXQgYSBzZXJ2ZXIuIENsZWFycyBhbnkgbG9hZGVkIGRhdGFzZXQuICovXG4gIGNvbmZpZ3VyZShvcHRpb25zOiB7IGJhc2VVcmw6IHN0cmluZzsgdGltZW91dE1zPzogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBjb25zdCByYXcgPSBvcHRpb25zLmJhc2VVcmwgPz8gJyc7XG4gICAgdGhpcy5iYXNlVXJsID0gcmF3LmVuZHNXaXRoKCcvJykgPyByYXcgOiBgJHtyYXd9L2A7XG4gICAgaWYgKG9wdGlvbnMudGltZW91dE1zICE9PSB1bmRlZmluZWQpIHRoaXMudGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXM7XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqIERhdGFzZXRzIHRoaXMgc2VydmVyIG9mZmVycywgZm9yIGEgaG9zdC1zaWRlIHBpY2tlci4gKi9cbiAgbGlzdERhdGFzZXRzKCk6IFByb21pc2U8U3BhdGlhbERhdGFzZXRTdW1tYXJ5W10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRKc29uPHsgZGF0YXNldHM6IFNwYXRpYWxEYXRhc2V0U3VtbWFyeVtdIH0+KCdzcGF0aWFsL2RhdGFzZXRzJylcbiAgICAgIC50aGVuKChyKSA9PiByLmRhdGFzZXRzID8/IFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgZGF0YXNldCdzIG1hbmlmZXN0LCBXSVRIT1VUIHNlbGVjdGluZyBpdC4gTGV0cyBhIGhvc3QgaW5zcGVjdCB3aGF0IGFcbiAgICogc2VydmVyIG9mZmVycyDigJQgY29sdW1uIGFuZCBmZWF0dXJlIG1ldGFkYXRhLCBhbmQgd2hpY2ggaW1hZ2UgYSBkYXRhc2V0XG4gICAqIHJlZ2lzdGVycyBvbnRvIOKAlCB3aGlsZSBidWlsZGluZyBhIHBpY2tlciwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGxvYWQgZWFjaFxuICAgKiBkYXRhc2V0IHRvIGZpbmQgb3V0LlxuICAgKi9cbiAgcmVhZE1hbmlmZXN0KGlkOiBzdHJpbmcpOiBQcm9taXNlPFNwYXRpYWxNYW5pZmVzdD4ge1xuICAgIHJldHVybiB0aGlzLmdldEpzb248U3BhdGlhbE1hbmlmZXN0Pihgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L21hbmlmZXN0YClcbiAgICAgIC50aGVuKChtYW5pZmVzdCkgPT4ge1xuICAgICAgICBhc3NlcnRNYW5pZmVzdFZlcnNpb24obWFuaWZlc3QpO1xuICAgICAgICByZXR1cm4gbWFuaWZlc3Q7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgZGF0YXNldCBhbmQgcHVibGlzaCBpdCBvbiB7QGxpbmsgZ2V0RGF0YXNldCR9LiBGZXRjaGVzIHRoZSBtYW5pZmVzdCxcbiAgICogdGhlbiB0aGUgdmVjdG9ycyB0aGF0IGFyZSBhbHdheXMgbmVlZGVkIChjb29yZGluYXRlcywgYW5kIGlkcy9yYWRpdXMgd2hlblxuICAgKiB0aGUgbWFuaWZlc3Qgc2F5cyB0aGV5IGV4aXN0KSDigJQgbm90aGluZyBlbHNlLlxuICAgKi9cbiAgYXN5bmMgc2VsZWN0RGF0YXNldChpZDogc3RyaW5nKTogUHJvbWlzZTxTcGF0aWFsRGF0YXNldD4ge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICAvLyBTZWxlY3Rpb25zIGFyZSBTRVFVRU5DRUQ6IHRoaXMgaXMgZm91ciBhd2FpdHMgZGVlcCwgc28gYSBzbG93ZXIgZWFybGllclxuICAgIC8vIGNhbGwgd291bGQgb3RoZXJ3aXNlIGFzc2lnbiBgdGhpcy5tYW5pZmVzdGAgb3IgcHVibGlzaCBpdHMgZGF0YXNldCBhZnRlciBhXG4gICAgLy8gbGF0ZXIgb25lIOKAlCBsZWF2aW5nIHRoZSBtYW5pZmVzdCBhbmQgdGhlIG9ic2VydmF0aW9ucyBmcm9tIHR3byBkaWZmZXJlbnRcbiAgICAvLyBkYXRhc2V0cywgd2hpY2ggaXMgd29yc2UgdGhhbiBlaXRoZXIgYmVpbmcgbGF0ZS5cbiAgICBjb25zdCBtaW5lID0gKyt0aGlzLnNlbGVjdFRva2VuO1xuICAgIGNvbnN0IHN1cGVyc2VkZWQgPSAoKSA9PiBtaW5lICE9PSB0aGlzLnNlbGVjdFRva2VuO1xuICAgIGNvbnN0IHBhdGggPSBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YDtcblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgdGhpcy5nZXRKc29uPFNwYXRpYWxNYW5pZmVzdD4oYCR7cGF0aH0vbWFuaWZlc3RgKTtcbiAgICBhc3NlcnRNYW5pZmVzdFZlcnNpb24obWFuaWZlc3QpO1xuICAgIGlmIChzdXBlcnNlZGVkKCkpIHRocm93IG5ldyBTdXBlcnNlZGVkRXJyb3IoaWQpO1xuICAgIHRoaXMubWFuaWZlc3QgPSBtYW5pZmVzdDtcblxuICAgIGNvbnN0IGNvb3Jkc0J1ZiA9IGF3YWl0IHRoaXMuZ2V0QmluYXJ5KGAke3BhdGh9L2Nvb3Jkc2ApO1xuICAgIGlmIChzdXBlcnNlZGVkKCkpIHRocm93IG5ldyBTdXBlcnNlZGVkRXJyb3IoaWQpO1xuICAgIGNvbnN0IGNvb3JkcyA9IGRlY29kZUNvb3Jkcyhjb29yZHNCdWYsIG1hbmlmZXN0LmNvdW50LCAhIW1hbmlmZXN0Lmhhc1opO1xuXG4gICAgY29uc3QgaWRzID0gbWFuaWZlc3QuaGFzSWRzXG4gICAgICA/IChhd2FpdCB0aGlzLmdldEpzb248eyBpZHM6IHN0cmluZ1tdIH0+KGAke3BhdGh9L2lkc2ApKS5pZHNcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJhZGl1cyA9IG1hbmlmZXN0LnJhZGl1cz8ubW9kZSA9PT0gJ3Blci1vYnNlcnZhdGlvbidcbiAgICAgID8gZGVjb2RlUmFkaXVzKGF3YWl0IHRoaXMuZ2V0QmluYXJ5KGAke3BhdGh9L3JhZGl1c2ApLCBtYW5pZmVzdC5jb3VudClcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChzdXBlcnNlZGVkKCkpIHRocm93IG5ldyBTdXBlcnNlZGVkRXJyb3IoaWQpO1xuXG4gICAgY29uc3QgZGF0YXNldCA9IGRhdGFzZXRGcm9tTWFuaWZlc3QobWFuaWZlc3QsIGNvb3JkcywgeyBpZHMsIHJhZGl1cyB9KTtcbiAgICB0aGlzLmRhdGFzZXQkLm5leHQoZGF0YXNldCk7XG4gICAgcmV0dXJuIGRhdGFzZXQ7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgbG9hZGVkIGRhdGFzZXQgYW5kIGV2ZXJ5IGNhY2hlZCB2ZWN0b3IuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIC8vIEEgY2xlYXIgaXMgaXRzZWxmIHRoZSBuZXdlc3QgaW50ZW50LCBzbyBpdCBzdXBlcnNlZGVzIGFueSBzZWxlY3Rpb24gc3RpbGxcbiAgICAvLyBpbiBmbGlnaHQgcmF0aGVyIHRoYW4gbGV0dGluZyBvbmUgbGFuZCBhZnRlcndhcmRzLlxuICAgIHRoaXMuc2VsZWN0VG9rZW4rKztcbiAgICB0aGlzLm1hbmlmZXN0ID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5pbkZsaWdodC5jbGVhcigpO1xuICAgIHRoaXMucG9seWdvbnNQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZVByb21pc2UgPSBudWxsO1xuICAgIGlmICh0aGlzLmRhdGFzZXQkLnZhbHVlICE9PSBudWxsKSB0aGlzLmRhdGFzZXQkLm5leHQobnVsbCk7XG4gIH1cblxuICAvLyDilIDilIAgU3BhdGlhbERhdGFQb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldERhdGFzZXQkKCk6IE9ic2VydmFibGU8U3BhdGlhbERhdGFzZXQgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YXNldCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRDb2x1bW4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxTcGF0aWFsQ29sdW1uPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmRhdGFzZXQkLnZhbHVlITtcbiAgICBjb25zdCBtZXRhID0gZmluZENvbHVtbk1ldGEoZGF0YXNldCwgbmFtZSk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICAvLyBSZWplY3QgcmF0aGVyIHRoYW4gcmVzb2x2ZSBlbXB0eTogYSB0eXBvIG11c3Qgc3VyZmFjZSBhcyBhbiBlcnJvciwgbm90XG4gICAgICAvLyBhcyBhIHBsb3QgdGhhdCBzaWxlbnRseSByZW5kZXJzIGV2ZXJ5IHBvaW50IGFzIFwibm8gZGF0YVwiLlxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcbiAgICAgICAgYFtzcGF0aWFsXSB1bmtub3duIGNvbHVtbiBcIiR7bmFtZX1cIi4gQXZhaWxhYmxlOiAke2RhdGFzZXQuY29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKX1gLFxuICAgICAgKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZldGNoQ2FjaGVkKFxuICAgICAgYGNvbHVtbjoke25hbWV9YCxcbiAgICAgICgpID0+IHRoaXMuZ2V0QmluYXJ5KGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1hbmlmZXN0LmlkKX0vY29sdW1uLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfWApXG4gICAgICAgIC50aGVuKChidWYpID0+IGRlY29kZUNvbHVtbihidWYsIG1ldGEsIG1hbmlmZXN0LmNvdW50KSksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxDb2x1bW4+O1xuICB9XG5cbiAgZ2V0RW1iZWRkaW5nKG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3BhdGlhbEVtYmVkZGluZz4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBjb25zdCBtZXRhID0gbWFuaWZlc3QuZW1iZWRkaW5ncz8uZmluZCgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFtzcGF0aWFsXSB1bmtub3duIGVtYmVkZGluZyBcIiR7bmFtZX1cImApKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWQoXG4gICAgICBgZW1iZWRkaW5nOiR7bmFtZX1gLFxuICAgICAgKCkgPT4gdGhpcy5nZXRCaW5hcnkoXG4gICAgICAgIGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1hbmlmZXN0LmlkKX0vZW1iZWRkaW5nLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfWAsXG4gICAgICApLnRoZW4oKGJ1ZikgPT4gZGVjb2RlRW1iZWRkaW5nKGJ1ZiwgbWV0YSwgbWFuaWZlc3QuY291bnQpKSxcbiAgICApIGFzIFByb21pc2U8U3BhdGlhbEVtYmVkZGluZz47XG4gIH1cblxuICBnZXRGZWF0dXJlVmVjdG9yKG5hbWU6IHN0cmluZyk6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGNvbnN0IG5hbWVzID0gbWFuaWZlc3QuZmVhdHVyZXM/Lm5hbWVzO1xuICAgIGlmIChuYW1lcyAmJiAhbmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFtzcGF0aWFsXSB1bmtub3duIGZlYXR1cmUgXCIke25hbWV9XCJgKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZldGNoQ2FjaGVkKFxuICAgICAgYGZlYXR1cmU6JHtuYW1lfWAsXG4gICAgICAoKSA9PiB0aGlzLmdldEJpbmFyeShgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L2ZlYXR1cmUvJHtlbmNvZGVVUklDb21wb25lbnQobmFtZSl9YClcbiAgICAgICAgLnRoZW4oKGJ1ZikgPT4gZGVjb2RlRmVhdHVyZVZlY3RvcihidWYsIG1hbmlmZXN0LmNvdW50KSksXG4gICAgKSBhcyBQcm9taXNlPEZsb2F0MzJBcnJheT47XG4gIH1cblxuICBhc3luYyBzZWFyY2hGZWF0dXJlcyhxdWVyeTogc3RyaW5nLCBsaW1pdCA9IDUwKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICAvLyBBIGRhdGFzZXQgdGhhdCBpbmxpbmVkIGl0cyBuYW1lcyAodGFyZ2V0ZWQgcGFuZWwpIGlzIGZpbHRlcmVkIGxvY2FsbHkg4oCUXG4gICAgLy8gbm8gcm91bmQtdHJpcCBmb3IgYSBrZXlzdHJva2UuXG4gICAgY29uc3QgbmFtZXMgPSBtYW5pZmVzdC5mZWF0dXJlcz8ubmFtZXM7XG4gICAgaWYgKG5hbWVzKSB7XG4gICAgICBjb25zdCBxID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBuYW1lcy5maWx0ZXIoKG4pID0+IG4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkuc2xpY2UoMCwgbGltaXQpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L2ZlYXR1cmVzYFxuICAgICAgKyBgP3E9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfSZsaW1pdD0ke2xpbWl0fWA7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldEpzb248eyBuYW1lczogc3RyaW5nW10gfT4odXJsKSkubmFtZXMgPz8gW107XG4gIH1cblxuICBnZXRQb2x5Z29ucygpOiBQcm9taXNlPFNwYXRpYWxQb2x5Z29ucz4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBpZiAoIW1hbmlmZXN0LnBvbHlnb25zKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdbc3BhdGlhbF0gdGhpcyBkYXRhc2V0IGhhcyBubyBwb2x5Z29uIGdlb21ldHJ5JykpO1xuICAgIH1cbiAgICAvLyBHZW9tZXRyeSBpcyBvbmUgbGFyZ2UgYmxvYiByYXRoZXIgdGhhbiBhIHBlci1uYW1lIHZlY3Rvciwgc28gaXQgZ2V0cyBpdHNcbiAgICAvLyBvd24gc2luZ2xlLWZsaWdodCBzbG90IGluc3RlYWQgb2YgYSBjYWNoZSBlbnRyeS5cbiAgICB0aGlzLnBvbHlnb25zUHJvbWlzZSA/Pz0gdGhpc1xuICAgICAgLmdldEJpbmFyeShgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3BvbHlnb25zYClcbiAgICAgIC50aGVuKGRlY29kZVBvbHlnb25zKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHsgdGhpcy5wb2x5Z29uc1Byb21pc2UgPSBudWxsOyB0aHJvdyBlcnI7IH0pO1xuICAgIHJldHVybiB0aGlzLnBvbHlnb25zUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIHZvbHVtZSdzIHZveGVscywgc2luZ2xlLWZsaWdodGVkIGxpa2UgdGhlIHBvbHlnb25zLlxuICAgKlxuICAgKiBWYWxpZGF0ZWQgYWdhaW5zdCB0aGUgbWFuaWZlc3QncyBkZWNsYXJlZCBkaW1lbnNpb25zIGJlZm9yZSBpdCBpcyBoYW5kZWRcbiAgICogYmFjazogYSBzaG9ydCBvciBsb25nIGJ1ZmZlciByZWFkIGFzIGEgM0QgdGV4dHVyZSBkb2VzIG5vdCBmYWlsLCBpdCBzaGVhcnNcbiAgICogdGhlIGFuYXRvbXkgaW50byBkaWFnb25hbCBzdHJlYWtzLCBhbmQgdGhhdCBpcyBmYXIgaGFyZGVyIHRvIHJlY29nbmlzZSBhcyBhXG4gICAqIHRyYW5zcG9ydCBwcm9ibGVtIHRoYW4gYW4gZXJyb3IgaXMuXG4gICAqL1xuICBnZXRWb2x1bWUoKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGNvbnN0IG1ldGEgPSBtYW5pZmVzdC52b2x1bWU7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdbc3BhdGlhbF0gdGhpcyBkYXRhc2V0IGhhcyBubyByZWZlcmVuY2Ugdm9sdW1lJykpO1xuICAgIH1cbiAgICB0aGlzLnZvbHVtZVByb21pc2UgPz89IHRoaXNcbiAgICAgIC5nZXRCaW5hcnkoYHNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS92b2x1bWVgKVxuICAgICAgLnRoZW4oKGJ1ZikgPT4ge1xuICAgICAgICBjb25zdCB3YW50ID0gbWV0YS53aWR0aCAqIG1ldGEuaGVpZ2h0ICogbWV0YS5kZXB0aDtcbiAgICAgICAgaWYgKGJ1Zi5ieXRlTGVuZ3RoICE9PSB3YW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFtzcGF0aWFsXSB2b2x1bWUgaXMgJHtidWYuYnl0ZUxlbmd0aH0gYnl0ZXMsIGV4cGVjdGVkICR7d2FudH0gYFxuICAgICAgICAgICAgKyBgKCR7bWV0YS53aWR0aH14JHttZXRhLmhlaWdodH14JHttZXRhLmRlcHRofSlgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHsgdGhpcy52b2x1bWVQcm9taXNlID0gbnVsbDsgdGhyb3cgZXJyOyB9KTtcbiAgICByZXR1cm4gdGhpcy52b2x1bWVQcm9taXNlO1xuICB9XG5cbiAgLy8g4pSA4pSAIGludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIHJlcXVpcmVNYW5pZmVzdCgpOiBTcGF0aWFsTWFuaWZlc3Qge1xuICAgIGlmICghdGhpcy5tYW5pZmVzdCB8fCAhdGhpcy5kYXRhc2V0JC52YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gbm8gZGF0YXNldCBzZWxlY3RlZCDigJQgY2FsbCBzZWxlY3REYXRhc2V0KCkgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ2FjaGUgKyBzaW5nbGUtZmxpZ2h0IGFyb3VuZCBhIHZlY3RvciBmZXRjaC5cbiAgICpcbiAgICogS2V5cyBhcmUgTE9HSUNBTCDigJQgYGZlYXR1cmU6R0FQREhgLCBub3QgYDxkYXRhc2V0Pi9mZWF0dXJlOkdBUERIYCDigJQgYmVjYXVzZSBgY2xlYXIoKWBcbiAgICogZW1wdGllcyB0aGUgbWFwcyBvbiBldmVyeSBzd2l0Y2gsIHNvIHR3byBkYXRhc2V0cyBuZXZlciBob2xkIGVudHJpZXMgYXQgb25jZS4gV2hhdFxuICAgKiB0aGF0IGRvZXMgbm90IGNvdmVyIGlzIGEgcmVxdWVzdCBzdGlsbCBpbiB0aGUgYWlyIHdoZW4gdGhlIHN3aXRjaCBoYXBwZW5zOiBgY2xlYXIoKWBcbiAgICogY2Fubm90IGNhbmNlbCBhbiBIVFRQIGNhbGwsIHNvIGEgdmVjdG9yIGZldGNoZWQgZm9yIGRhdGFzZXQgQSBjYW4gcmVzb2x2ZSBhZnRlciBCIGhhc1xuICAgKiBiZWVuIHNlbGVjdGVkIGFuZCB3cml0ZSBpdHNlbGYgaW50byBCJ3MgY2FjaGUgdW5kZXIgYSBrZXkgQiB3b3VsZCByZWFkLiBCb3RoIGRhdGFzZXRzXG4gICAqIGhhdmluZyBhIGdlbmUgb2YgdGhhdCBuYW1lIGlzIHRoZSBjb21tb24gY2FzZSwgbm90IHRoZSB1bmx1Y2t5IG9uZSwgYW5kIHRoZSByZXN1bHQgaXNcbiAgICogYSBwbG90IG9mIEEncyBleHByZXNzaW9uIG92ZXIgQidzIGNlbGxzIOKAlCB3aGljaCBsb29rcyBsaWtlIGRhdGEsIG5vdCBsaWtlIGEgZmF1bHQuXG4gICAqXG4gICAqIFNvIHRoZSBnZW5lcmF0aW9uIGlzIGNoZWNrZWQgYWZ0ZXIgdGhlIGF3YWl0LCBhbmQgdGhlIGluLWZsaWdodCBzbG90IGlzIGNsZWFyZWQgb25seVxuICAgKiB3aGVuIHRoZSBwcm9taXNlIHN0aWxsIHNpdHRpbmcgaW4gaXQgaXMgdGhpcyBvbmU6IGEgbGF0ZSBhcnJpdmFsIG11c3Qgbm90IGV2aWN0IHRoZVxuICAgKiBlbnRyeSBhIG5ld2VyIHJlcXVlc3QgZm9yIHRoZSBzYW1lIGtleSBpcyBhbHJlYWR5IHNoYXJpbmcuXG4gICAqL1xuICBwcml2YXRlIGZldGNoQ2FjaGVkKGtleTogc3RyaW5nLCBsb2FkOiAoKSA9PiBQcm9taXNlPENhY2hlZFBheWxvYWQ+KTogUHJvbWlzZTxDYWNoZWRQYXlsb2FkPiB7XG4gICAgY29uc3QgaGl0ID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoaGl0KSB7XG4gICAgICAvLyBSZS1pbnNlcnQgdG8gbWFyayBtb3N0LXJlY2VudGx5LXVzZWQgKE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyKS5cbiAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmNhY2hlLnNldChrZXksIGhpdCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGhpdCk7XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLmluRmxpZ2h0LmdldChrZXkpO1xuICAgIGlmIChwZW5kaW5nKSByZXR1cm4gcGVuZGluZztcblxuICAgIGNvbnN0IG1pbmUgPSB0aGlzLnNlbGVjdFRva2VuO1xuICAgIGNvbnN0IHByb21pc2U6IFByb21pc2U8Q2FjaGVkUGF5bG9hZD4gPSBsb2FkKClcbiAgICAgIC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAvLyBTdGlsbCByZXR1cm5lZCB0byB0aGUgY2FsbGVyIHRoYXQgYXNrZWQ6IGl0IG1heSB3ZWxsIGJlIGEgY29tcG9uZW50IHRoYXQgaXNcbiAgICAgICAgLy8gaXRzZWxmIGJlaW5nIHRvcm4gZG93biwgYW5kIHJlamVjdGluZyBoZXJlIHdvdWxkIHN1cmZhY2UgYSBzd2l0Y2ggYXMgYW4gZXJyb3IuXG4gICAgICAgIC8vIFdoYXQgbXVzdCBub3QgaGFwcGVuIGlzIHRoZSB2YWx1ZSBiZWluZyBrZXB0IGZvciB3aG9ldmVyIGNvbWVzIG5leHQuXG4gICAgICAgIGlmIChtaW5lID09PSB0aGlzLnNlbGVjdFRva2VuKSB7XG4gICAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5ldmljdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluRmxpZ2h0LmdldChrZXkpID09PSBwcm9taXNlKSB0aGlzLmluRmxpZ2h0LmRlbGV0ZShrZXkpO1xuICAgICAgfSk7XG4gICAgdGhpcy5pbkZsaWdodC5zZXQoa2V5LCBwcm9taXNlKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgZXZpY3QoKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMuY2FjaGUuc2l6ZSA+IFNwYXRpYWxEYXRhSHR0cFNlcnZpY2UuQ0FDSEVfTElNSVQpIHtcbiAgICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMuY2FjaGUua2V5cygpLm5leHQoKS52YWx1ZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAob2xkZXN0ID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEpzb248VD4ocGF0aDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5odHRwLmdldDxUPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWApLnBpcGUodGltZW91dCh0aGlzLnRpbWVvdXRNcykpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldEJpbmFyeShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5odHRwLmdldChgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWAsIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIH0pXG4gICAgICAgIC5waXBlKHRpbWVvdXQodGhpcy50aW1lb3V0TXMpKSxcbiAgICApO1xuICB9XG59XG4iXX0=
422
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1kYXRhLWh0dHAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL3NwYXRpYWwtZGF0YS1odHRwL3NwYXRpYWwtZGF0YS1odHRwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6QyxPQUFPLEVBV0wsY0FBYyxHQUNmLE1BQU0sMENBQTBDLENBQUM7QUFDbEQsT0FBTyxFQUdMLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsWUFBWSxFQUNaLFlBQVksRUFDWixhQUFhLEVBQ2IsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFlBQVksRUFDWixvQkFBb0IsR0FDckIsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRXhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0g7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxLQUFLO0lBQ3hDLFlBQVksRUFBVTtRQUNwQixLQUFLLENBQUMsMkJBQTJCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7Q0FDRjtBQVNELE1BQU0sT0FBTyxzQkFBc0I7YUFvQlQsZ0JBQVcsR0FBRyxFQUFFLEFBQUwsQ0FBTTthQVVqQixxQkFBZ0IsR0FBRyxHQUFHLEFBQU4sQ0FBTztJQUsvQyxZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBbENw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QUFTLENBQUMsQ0FBQyxDQUNqQyxDQUFDO0lBQ0osQ0FBQzs4R0EvYVUsc0JBQXNCO2tIQUF0QixzQkFBc0I7OzJGQUF0QixzQkFBc0I7a0JBRGxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNwYXRpYWxEYXRhUG9ydCwgVHJhbnNjcmlwdFRpbGVRdWVyeSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy9zcGF0aWFsLWRhdGEucG9ydCc7XG5pbXBvcnQge1xuICBTcGF0aWFsQ29sdW1uLFxuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbERlbnNpdHlSYXN0ZXIsXG4gIFNwYXRpYWxFbWJlZGRpbmcsXG4gIFNwYXRpYWxQb2x5Z29uVGlsZSxcbiAgU3BhdGlhbFBvbHlnb25zLFxuICBDYXRlZ29yaWNhbENvbHVtbk1ldGEsXG4gIFNwYXRpYWxUcmFuc2NyaXB0Q291bnRzLFxuICBTcGF0aWFsVHJhbnNjcmlwdFN1bW1hcnksXG4gIFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgZmluZENvbHVtbk1ldGEsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbERhdGFzZXRTdW1tYXJ5LFxuICBTcGF0aWFsTWFuaWZlc3QsXG4gIGFzc2VydE1hbmlmZXN0VmVyc2lvbixcbiAgZGF0YXNldEZyb21NYW5pZmVzdCxcbiAgZGVjb2RlQ29sdW1uLFxuICBkZWNvZGVDb29yZHMsXG4gIGRlY29kZURlbnNpdHksXG4gIGRlY29kZUVtYmVkZGluZyxcbiAgZGVjb2RlRmVhdHVyZVZlY3RvcixcbiAgZGVjb2RlUG9seWdvblRpbGUsXG4gIGRlY29kZVBvbHlnb25zLFxuICBkZWNvZGVSYWRpdXMsXG4gIGRlY29kZVRyYW5zY3JpcHRUaWxlLFxufSBmcm9tICcuL3NwYXRpYWwtd2lyZSc7XG5cbi8qKlxuICogUmVmZXJlbmNlIHtAbGluayBTcGF0aWFsRGF0YVBvcnR9IGFkYXB0ZXIgZm9yIHRoZSB3aXJlIGZvcm1hdCB0aGUgYnVuZGxlZFxuICogZXhhbXBsZSBzZXJ2ZXIgc3BlYWtzIChzZWUgYHNwYXRpYWwtd2lyZS50c2AgYW5kXG4gKiBgZXhhbXBsZXMvdGlsZS1zZXJ2ZXIvbGliL3NwYXRpYWwubWpzYCkuXG4gKlxuICogT1BUSU9OQUwgQU5EIFVOQk9VTkQgQlkgREVGQVVMVCDigJQgdGhpcyBzZXJ2aWNlIGlzIGBASW5qZWN0YWJsZSgpYCB3aXRob3V0XG4gKiBgcHJvdmlkZWRJbmAsIHNvIG5vdGhpbmcgZ2V0cyBpdCB1bmxlc3MgYSBob3N0IGV4cGxpY2l0bHkgcHJvdmlkZXMgaXQ6XG4gKlxuICogYGBgdHNcbiAqIHByb3ZpZGVyczogW1xuICogICBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlLFxuICogICB7IHByb3ZpZGU6IFNQQVRJQUxfREFUQV9QT1JULCB1c2VFeGlzdGluZzogU3BhdGlhbERhdGFIdHRwU2VydmljZSB9LFxuICogXVxuICogYGBgXG4gKlxuICogVGhhdCBtaXJyb3JzIGBDZWxscG9zZVNlZ21lbnRlclNlcnZpY2VgOiBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHRoZVxuICogbGlicmFyeSBzaGlwcyBmb3IgY29udmVuaWVuY2UsIG5vdCBhIGRlZmF1bHQgdGhlIHBvcnQgaW52ZXJzaW9uIGlzIHF1aWV0bHlcbiAqIGdpdmluZyB1cCBvbi4gQSBob3N0IHdpdGggaXRzIG93biBiYWNrZW5kIGltcGxlbWVudHMgYFNwYXRpYWxEYXRhUG9ydGBcbiAqIGRpcmVjdGx5IGFuZCBuZXZlciB0b3VjaGVzIHRoaXMgY2xhc3MuXG4gKlxuICogUmVxdWVzdHMgZ28gdGhyb3VnaCBBbmd1bGFyJ3MgYEh0dHBDbGllbnRgIChub3QgYGZldGNoYCkgc28gdGhlIGhvc3Qnc1xuICogaW50ZXJjZXB0b3JzIOKAlCBhdXRoIGhlYWRlcnMgYWJvdmUgYWxsIOKAlCBhcHBseSwgbWF0Y2hpbmcgYHRpbGUtY2xpZW50LnRzYC5cbiAqL1xuLyoqXG4gKiBBIGRhdGFzZXQgc2VsZWN0aW9uIHRoYXQgYSBuZXdlciBzZWxlY3Rpb24gKG9yIGEgYGNsZWFyYCkgb3ZlcnRvb2suXG4gKlxuICogVGhyb3duIHJhdGhlciB0aGFuIHJlc29sdmVkIHNvIGEgY2FsbGVyIGNhbm5vdCBtaXN0YWtlIGl0IGZvciBcInRoaXMgZGF0YXNldCBpc1xuICogbm93IGxvYWRlZFwiOiBub3RoaW5nIHdhcyBwdWJsaXNoZWQsIG9uIHB1cnBvc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXBlcnNlZGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgW3NwYXRpYWxdIHNlbGVjdGlvbiBvZiBcIiR7aWR9XCIgd2FzIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBvbmVgKTtcbiAgICB0aGlzLm5hbWUgPSAnU3VwZXJzZWRlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFdoYXQgdGhlIExSVSBjYW4gaG9sZC4gT25lIGFsaWFzIHJhdGhlciB0aGFuIGEgdW5pb24gcmVwZWF0ZWQgYXQgZWFjaCB1c2UsIHNvIGFkZGluZyBhIHBheWxvYWRcbiAqIGtpbmQgaXMgYSBzaW5nbGUgZWRpdCBpbnN0ZWFkIG9mIGZvdXIgdGhhdCBjYW4gZHJpZnQgYXBhcnQuXG4gKi9cbnR5cGUgQ2FjaGVkUGF5bG9hZCA9IFNwYXRpYWxDb2x1bW4gfCBGbG9hdDMyQXJyYXkgfCBTcGF0aWFsRW1iZWRkaW5nIHwgU3BhdGlhbERlbnNpdHlSYXN0ZXI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlIGltcGxlbWVudHMgU3BhdGlhbERhdGFQb3J0IHtcbiAgLyoqIFNlcnZlciByb290LCBub3JtYWxpc2VkIHRvIGVuZCB3aXRoIGV4YWN0bHkgb25lIGAvYC4gKi9cbiAgcHJpdmF0ZSBiYXNlVXJsID0gJyc7XG4gIC8qKiBQZXItcmVxdWVzdCBjZWlsaW5nLiBWZWN0b3JzIGFyZSBzbWFsbDsgYSBodW5nIHJlcXVlc3Qgc2hvdWxkIG5vdCB3ZWRnZVxuICAgKiAgdGhlIHBpY2tlci4gKi9cbiAgcHJpdmF0ZSB0aW1lb3V0TXMgPSAzMF8wMDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhc2V0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3BhdGlhbERhdGFzZXQgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBtYW5pZmVzdDogU3BhdGlhbE1hbmlmZXN0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCdW1wZWQgYnkgZXZlcnkgYHNlbGVjdERhdGFzZXRgIGFuZCBldmVyeSBgY2xlYXJgLCBzbyBhIHNlbGVjdGlvbiB0aGF0XG4gICAqICBmaW5pc2hlcyBhZnRlciBhIG5ld2VyIGludGVudCBjYW4gdGVsbCBhbmQgZHJvcCB3aGF0IGl0IGZldGNoZWQuICovXG4gIHByaXZhdGUgc2VsZWN0VG9rZW4gPSAwO1xuXG4gIC8qKlxuICAgKiBMb2FkZWQgdmVjdG9ycywga2V5ZWQgYGNvbHVtbjo8bmFtZT5gIC8gYGZlYXR1cmU6PG5hbWU+YC4gQm91bmRlZCBMUlU6XG4gICAqIGNvbG91cmluZyBieSBjbHVzdGVyIOKGkiBieSBhIGdlbmUg4oaSIGJhY2sgYnkgY2x1c3RlciBtdXN0IG5vdCByZWZldGNoLCBidXQgYW5cbiAgICogYWZ0ZXJub29uIG9mIGJyb3dzaW5nIGdlbmVzIG11c3Qgbm90IGdyb3cgd2l0aG91dCBsaW1pdCBlaXRoZXIgKG9uZSB2ZWN0b3JcbiAgICogaXMgYDTCt05gIGJ5dGVzIOKAlCAyIE1CIGF0IDUwMGsgY2VsbHMpLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRQYXlsb2FkPigpO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDQUNIRV9MSU1JVCA9IDMyO1xuXG4gIC8qKiBJbi1mbGlnaHQgcmVxdWVzdHMsIHNvIGRvdWJsZS1jbGlja2luZyBhIGdlbmUgaXNzdWVzIG9uZSBmZXRjaC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbkZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPENhY2hlZFBheWxvYWQ+PigpO1xuXG4gIC8qKlxuICAgKiBUaWxlcyBnZXQgdGhlaXIgb3duLCBsYXJnZXIgY2FjaGU6IHBhbm5pbmcgcmV2aXNpdHMgdGhlbSBjb25zdGFudGx5LCBhbmQgb25lIHNjcmVlblxuICAgKiBvZiBhIHpvb21lZC1vdXQgc2VjdGlvbiBpcyBkb3plbnMgb2YgdGhlbSDigJQgZmFyIHBhc3QgdGhlIHZlY3RvciBjYWNoZSdzIGxpbWl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0aWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxTcGF0aWFsUG9seWdvblRpbGUgfCBTcGF0aWFsVHJhbnNjcmlwdFRpbGU+PigpO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUSUxFX0NBQ0hFX0xJTUlUID0gMzg0O1xuXG4gIHByaXZhdGUgdm9sdW1lUHJvbWlzZTogUHJvbWlzZTxVaW50OEFycmF5PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBvbHlnb25zUHJvbWlzZTogUHJvbWlzZTxTcGF0aWFsUG9seWdvbnM+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7fVxuXG4gIC8vIOKUgOKUgCBjb25maWd1cmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBQb2ludCB0aGUgYWRhcHRlciBhdCBhIHNlcnZlci4gQ2xlYXJzIGFueSBsb2FkZWQgZGF0YXNldC4gKi9cbiAgY29uZmlndXJlKG9wdGlvbnM6IHsgYmFzZVVybDogc3RyaW5nOyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGNvbnN0IHJhdyA9IG9wdGlvbnMuYmFzZVVybCA/PyAnJztcbiAgICB0aGlzLmJhc2VVcmwgPSByYXcuZW5kc1dpdGgoJy8nKSA/IHJhdyA6IGAke3Jhd30vYDtcbiAgICBpZiAob3B0aW9ucy50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCkgdGhpcy50aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcztcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKiogRGF0YXNldHMgdGhpcyBzZXJ2ZXIgb2ZmZXJzLCBmb3IgYSBob3N0LXNpZGUgcGlja2VyLiAqL1xuICBsaXN0RGF0YXNldHMoKTogUHJvbWlzZTxTcGF0aWFsRGF0YXNldFN1bW1hcnlbXT4ge1xuICAgIHJldHVybiB0aGlzLmdldEpzb248eyBkYXRhc2V0czogU3BhdGlhbERhdGFzZXRTdW1tYXJ5W10gfT4oJ3NwYXRpYWwvZGF0YXNldHMnKVxuICAgICAgLnRoZW4oKHIpID0+IHIuZGF0YXNldHMgPz8gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uZSBkYXRhc2V0J3MgbWFuaWZlc3QsIFdJVEhPVVQgc2VsZWN0aW5nIGl0LiBMZXRzIGEgaG9zdCBpbnNwZWN0IHdoYXQgYVxuICAgKiBzZXJ2ZXIgb2ZmZXJzIOKAlCBjb2x1bW4gYW5kIGZlYXR1cmUgbWV0YWRhdGEsIGFuZCB3aGljaCBpbWFnZSBhIGRhdGFzZXRcbiAgICogcmVnaXN0ZXJzIG9udG8g4oCUIHdoaWxlIGJ1aWxkaW5nIGEgcGlja2VyLCByYXRoZXIgdGhhbiBoYXZpbmcgdG8gbG9hZCBlYWNoXG4gICAqIGRhdGFzZXQgdG8gZmluZCBvdXQuXG4gICAqL1xuICByZWFkTWFuaWZlc3QoaWQ6IHN0cmluZyk6IFByb21pc2U8U3BhdGlhbE1hbmlmZXN0PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SnNvbjxTcGF0aWFsTWFuaWZlc3Q+KGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX0vbWFuaWZlc3RgKVxuICAgICAgLnRoZW4oKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIGFzc2VydE1hbmlmZXN0VmVyc2lvbihtYW5pZmVzdCk7XG4gICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBkYXRhc2V0IGFuZCBwdWJsaXNoIGl0IG9uIHtAbGluayBnZXREYXRhc2V0JH0uIEZldGNoZXMgdGhlIG1hbmlmZXN0LFxuICAgKiB0aGVuIHRoZSB2ZWN0b3JzIHRoYXQgYXJlIGFsd2F5cyBuZWVkZWQgKGNvb3JkaW5hdGVzLCBhbmQgaWRzL3JhZGl1cyB3aGVuXG4gICAqIHRoZSBtYW5pZmVzdCBzYXlzIHRoZXkgZXhpc3QpIOKAlCBub3RoaW5nIGVsc2UuXG4gICAqL1xuICBhc3luYyBzZWxlY3REYXRhc2V0KGlkOiBzdHJpbmcpOiBQcm9taXNlPFNwYXRpYWxEYXRhc2V0PiB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIC8vIFNlbGVjdGlvbnMgYXJlIFNFUVVFTkNFRDogdGhpcyBpcyBmb3VyIGF3YWl0cyBkZWVwLCBzbyBhIHNsb3dlciBlYXJsaWVyXG4gICAgLy8gY2FsbCB3b3VsZCBvdGhlcndpc2UgYXNzaWduIGB0aGlzLm1hbmlmZXN0YCBvciBwdWJsaXNoIGl0cyBkYXRhc2V0IGFmdGVyIGFcbiAgICAvLyBsYXRlciBvbmUg4oCUIGxlYXZpbmcgdGhlIG1hbmlmZXN0IGFuZCB0aGUgb2JzZXJ2YXRpb25zIGZyb20gdHdvIGRpZmZlcmVudFxuICAgIC8vIGRhdGFzZXRzLCB3aGljaCBpcyB3b3JzZSB0aGFuIGVpdGhlciBiZWluZyBsYXRlLlxuICAgIGNvbnN0IG1pbmUgPSArK3RoaXMuc2VsZWN0VG9rZW47XG4gICAgY29uc3Qgc3VwZXJzZWRlZCA9ICgpID0+IG1pbmUgIT09IHRoaXMuc2VsZWN0VG9rZW47XG4gICAgY29uc3QgcGF0aCA9IGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gO1xuXG4gICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCB0aGlzLmdldEpzb248U3BhdGlhbE1hbmlmZXN0PihgJHtwYXRofS9tYW5pZmVzdGApO1xuICAgIGFzc2VydE1hbmlmZXN0VmVyc2lvbihtYW5pZmVzdCk7XG4gICAgaWYgKHN1cGVyc2VkZWQoKSkgdGhyb3cgbmV3IFN1cGVyc2VkZWRFcnJvcihpZCk7XG4gICAgdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0O1xuXG4gICAgY29uc3QgY29vcmRzQnVmID0gYXdhaXQgdGhpcy5nZXRCaW5hcnkoYCR7cGF0aH0vY29vcmRzYCk7XG4gICAgaWYgKHN1cGVyc2VkZWQoKSkgdGhyb3cgbmV3IFN1cGVyc2VkZWRFcnJvcihpZCk7XG4gICAgY29uc3QgY29vcmRzID0gZGVjb2RlQ29vcmRzKGNvb3Jkc0J1ZiwgbWFuaWZlc3QuY291bnQsICEhbWFuaWZlc3QuaGFzWik7XG5cbiAgICBjb25zdCBpZHMgPSBtYW5pZmVzdC5oYXNJZHNcbiAgICAgID8gKGF3YWl0IHRoaXMuZ2V0SnNvbjx7IGlkczogc3RyaW5nW10gfT4oYCR7cGF0aH0vaWRzYCkpLmlkc1xuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmFkaXVzID0gbWFuaWZlc3QucmFkaXVzPy5tb2RlID09PSAncGVyLW9ic2VydmF0aW9uJ1xuICAgICAgPyBkZWNvZGVSYWRpdXMoYXdhaXQgdGhpcy5nZXRCaW5hcnkoYCR7cGF0aH0vcmFkaXVzYCksIG1hbmlmZXN0LmNvdW50KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHN1cGVyc2VkZWQoKSkgdGhyb3cgbmV3IFN1cGVyc2VkZWRFcnJvcihpZCk7XG5cbiAgICBjb25zdCBkYXRhc2V0ID0gZGF0YXNldEZyb21NYW5pZmVzdChtYW5pZmVzdCwgY29vcmRzLCB7IGlkcywgcmFkaXVzIH0pO1xuICAgIHRoaXMuZGF0YXNldCQubmV4dChkYXRhc2V0KTtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBsb2FkZWQgZGF0YXNldCBhbmQgZXZlcnkgY2FjaGVkIHZlY3Rvci4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgLy8gQSBjbGVhciBpcyBpdHNlbGYgdGhlIG5ld2VzdCBpbnRlbnQsIHNvIGl0IHN1cGVyc2VkZXMgYW55IHNlbGVjdGlvbiBzdGlsbFxuICAgIC8vIGluIGZsaWdodCByYXRoZXIgdGhhbiBsZXR0aW5nIG9uZSBsYW5kIGFmdGVyd2FyZHMuXG4gICAgdGhpcy5zZWxlY3RUb2tlbisrO1xuICAgIHRoaXMubWFuaWZlc3QgPSBudWxsO1xuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmluRmxpZ2h0LmNsZWFyKCk7XG4gICAgdGhpcy50aWxlQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnN1bW1hcnlDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucG9seWdvbnNQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZVByb21pc2UgPSBudWxsO1xuICAgIGlmICh0aGlzLmRhdGFzZXQkLnZhbHVlICE9PSBudWxsKSB0aGlzLmRhdGFzZXQkLm5leHQobnVsbCk7XG4gIH1cblxuICAvLyDilIDilIAgU3BhdGlhbERhdGFQb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldERhdGFzZXQkKCk6IE9ic2VydmFibGU8U3BhdGlhbERhdGFzZXQgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YXNldCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRDb2x1bW4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxTcGF0aWFsQ29sdW1uPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmRhdGFzZXQkLnZhbHVlITtcbiAgICBjb25zdCBtZXRhID0gZmluZENvbHVtbk1ldGEoZGF0YXNldCwgbmFtZSk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICAvLyBSZWplY3QgcmF0aGVyIHRoYW4gcmVzb2x2ZSBlbXB0eTogYSB0eXBvIG11c3Qgc3VyZmFjZSBhcyBhbiBlcnJvciwgbm90XG4gICAgICAvLyBhcyBhIHBsb3QgdGhhdCBzaWxlbnRseSByZW5kZXJzIGV2ZXJ5IHBvaW50IGFzIFwibm8gZGF0YVwiLlxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcbiAgICAgICAgYFtzcGF0aWFsXSB1bmtub3duIGNvbHVtbiBcIiR7bmFtZX1cIi4gQXZhaWxhYmxlOiAke2RhdGFzZXQuY29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKX1gLFxuICAgICAgKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZldGNoQ2FjaGVkKFxuICAgICAgYGNvbHVtbjoke25hbWV9YCxcbiAgICAgICgpID0+IHRoaXMuZ2V0QmluYXJ5KGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1hbmlmZXN0LmlkKX0vY29sdW1uLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfWApXG4gICAgICAgIC50aGVuKChidWYpID0+IGRlY29kZUNvbHVtbihidWYsIG1ldGEsIG1hbmlmZXN0LmNvdW50KSksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxDb2x1bW4+O1xuICB9XG5cbiAgZ2V0RW1iZWRkaW5nKG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3BhdGlhbEVtYmVkZGluZz4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBjb25zdCBtZXRhID0gbWFuaWZlc3QuZW1iZWRkaW5ncz8uZmluZCgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFtzcGF0aWFsXSB1bmtub3duIGVtYmVkZGluZyBcIiR7bmFtZX1cImApKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWQoXG4gICAgICBgZW1iZWRkaW5nOiR7bmFtZX1gLFxuICAgICAgKCkgPT4gdGhpcy5nZXRCaW5hcnkoXG4gICAgICAgIGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1hbmlmZXN0LmlkKX0vZW1iZWRkaW5nLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfWAsXG4gICAgICApLnRoZW4oKGJ1ZikgPT4gZGVjb2RlRW1iZWRkaW5nKGJ1ZiwgbWV0YSwgbWFuaWZlc3QuY291bnQpKSxcbiAgICApIGFzIFByb21pc2U8U3BhdGlhbEVtYmVkZGluZz47XG4gIH1cblxuICBnZXRGZWF0dXJlVmVjdG9yKG5hbWU6IHN0cmluZyk6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGNvbnN0IG5hbWVzID0gbWFuaWZlc3QuZmVhdHVyZXM/Lm5hbWVzO1xuICAgIGlmIChuYW1lcyAmJiAhbmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFtzcGF0aWFsXSB1bmtub3duIGZlYXR1cmUgXCIke25hbWV9XCJgKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZldGNoQ2FjaGVkKFxuICAgICAgYGZlYXR1cmU6JHtuYW1lfWAsXG4gICAgICAoKSA9PiB0aGlzLmdldEJpbmFyeShgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L2ZlYXR1cmUvJHtlbmNvZGVVUklDb21wb25lbnQobmFtZSl9YClcbiAgICAgICAgLnRoZW4oKGJ1ZikgPT4gZGVjb2RlRmVhdHVyZVZlY3RvcihidWYsIG1hbmlmZXN0LmNvdW50KSksXG4gICAgKSBhcyBQcm9taXNlPEZsb2F0MzJBcnJheT47XG4gIH1cblxuICBhc3luYyBzZWFyY2hGZWF0dXJlcyhxdWVyeTogc3RyaW5nLCBsaW1pdCA9IDUwKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICAvLyBBIGRhdGFzZXQgdGhhdCBpbmxpbmVkIGl0cyBuYW1lcyAodGFyZ2V0ZWQgcGFuZWwpIGlzIGZpbHRlcmVkIGxvY2FsbHkg4oCUXG4gICAgLy8gbm8gcm91bmQtdHJpcCBmb3IgYSBrZXlzdHJva2UuXG4gICAgY29uc3QgbmFtZXMgPSBtYW5pZmVzdC5mZWF0dXJlcz8ubmFtZXM7XG4gICAgaWYgKG5hbWVzKSB7XG4gICAgICBjb25zdCBxID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBuYW1lcy5maWx0ZXIoKG4pID0+IG4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkuc2xpY2UoMCwgbGltaXQpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L2ZlYXR1cmVzYFxuICAgICAgKyBgP3E9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfSZsaW1pdD0ke2xpbWl0fWA7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldEpzb248eyBuYW1lczogc3RyaW5nW10gfT4odXJsKSkubmFtZXMgPz8gW107XG4gIH1cblxuICBnZXRQb2x5Z29ucygpOiBQcm9taXNlPFNwYXRpYWxQb2x5Z29ucz4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBpZiAoIW1hbmlmZXN0LnBvbHlnb25zKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdbc3BhdGlhbF0gdGhpcyBkYXRhc2V0IGhhcyBubyBwb2x5Z29uIGdlb21ldHJ5JykpO1xuICAgIH1cbiAgICAvLyBHZW9tZXRyeSBpcyBvbmUgbGFyZ2UgYmxvYiByYXRoZXIgdGhhbiBhIHBlci1uYW1lIHZlY3Rvciwgc28gaXQgZ2V0cyBpdHNcbiAgICAvLyBvd24gc2luZ2xlLWZsaWdodCBzbG90IGluc3RlYWQgb2YgYSBjYWNoZSBlbnRyeS5cbiAgICB0aGlzLnBvbHlnb25zUHJvbWlzZSA/Pz0gdGhpc1xuICAgICAgLmdldEJpbmFyeShgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3BvbHlnb25zYClcbiAgICAgIC50aGVuKGRlY29kZVBvbHlnb25zKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHsgdGhpcy5wb2x5Z29uc1Byb21pc2UgPSBudWxsOyB0aHJvdyBlcnI7IH0pO1xuICAgIHJldHVybiB0aGlzLnBvbHlnb25zUHJvbWlzZTtcbiAgfVxuXG4gIGdldFBvbHlnb25UaWxlKHNldDogc3RyaW5nLCBsZXZlbDogbnVtYmVyLCBneDogbnVtYmVyLCBneTogbnVtYmVyKTogUHJvbWlzZTxTcGF0aWFsUG9seWdvblRpbGU+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgaWYgKCFtYW5pZmVzdC5wb2x5Z29uVGlsZXMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1tzcGF0aWFsXSB0aGlzIGRhdGFzZXQgaGFzIG5vIHRpbGVkIHBvbHlnb25zJykpO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gYHNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS9wb2x5Z29uLXRpbGUvYFxuICAgICAgKyBgJHtlbmNvZGVVUklDb21wb25lbnQoc2V0KX0vJHtsZXZlbH0vJHtneH0vJHtneX1gO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZFRpbGUocGF0aCwgKCkgPT4gdGhpcy5nZXRCaW5hcnkocGF0aCkudGhlbihkZWNvZGVQb2x5Z29uVGlsZSkpIGFzXG4gICAgICBQcm9taXNlPFNwYXRpYWxQb2x5Z29uVGlsZT47XG4gIH1cblxuICBnZXRUcmFuc2NyaXB0VGlsZShcbiAgICBsZXZlbDogbnVtYmVyLCBneDogbnVtYmVyLCBneTogbnVtYmVyLCBxdWVyeTogVHJhbnNjcmlwdFRpbGVRdWVyeSxcbiAgKTogUHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdFRpbGU+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgaWYgKCFtYW5pZmVzdC50cmFuc2NyaXB0VGlsZXMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1tzcGF0aWFsXSB0aGlzIGRhdGFzZXQgaGFzIG5vIHRpbGVkIHRyYW5zY3JpcHRzJykpO1xuICAgIH1cbiAgICBjb25zdCBnZW5lcyA9IHF1ZXJ5LmdlbmVzLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJywnKTtcbiAgICBjb25zdCBib3ggPSBxdWVyeS5ib3ggPyBgJmJveD0ke3F1ZXJ5LmJveC5qb2luKCcsJyl9YCA6ICcnO1xuICAgIGNvbnN0IHBhdGggPSBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3RyYW5zY3JpcHQtdGlsZS8ke2xldmVsfS8ke2d4fS8ke2d5fWBcbiAgICAgICsgYD9nZW5lcz0ke2dlbmVzfSZxdWFsaXR5PSR7cXVlcnkucXVhbGl0eSA/PyAnaGlnaCd9JHtib3h9YDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRUaWxlKHBhdGgsICgpID0+IHRoaXMuZ2V0QmluYXJ5KHBhdGgpLnRoZW4oZGVjb2RlVHJhbnNjcmlwdFRpbGUpKSBhc1xuICAgICAgUHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdFRpbGU+O1xuICB9XG5cbiAgZ2V0VHJhbnNjcmlwdEJpbnMobGV2ZWw6IG51bWJlciwgdHg6IG51bWJlciwgdHk6IG51bWJlcik6IFByb21pc2U8U3BhdGlhbFRyYW5zY3JpcHRUaWxlPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGlmICghbWFuaWZlc3QudHJhbnNjcmlwdEJpbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1tzcGF0aWFsXSB0aGlzIGRhdGFzZXQgaGFzIG5vIHRyYW5zY3JpcHQgcHlyYW1pZCcpKTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1hbmlmZXN0LmlkKX0vdHJhbnNjcmlwdC1iaW5zLyR7bGV2ZWx9LyR7dHh9LyR7dHl9YDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRUaWxlKHBhdGgsICgpID0+IHRoaXMuZ2V0QmluYXJ5KHBhdGgpLnRoZW4oZGVjb2RlVHJhbnNjcmlwdFRpbGUpKSBhc1xuICAgICAgUHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdFRpbGU+O1xuICB9XG5cbiAgLyoqIFNtYWxsIEpTT04gYW5zd2Vycywga2V5ZWQgYnkgVVJMIOKAlCBob3ZlcmluZyBiYWNrIGFuZCBmb3J0aCBtdXN0IG5vdCByZWZldGNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1bW1hcnlDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFNwYXRpYWxUcmFuc2NyaXB0U3VtbWFyeT4+KCk7XG5cbiAgZ2V0VHJhbnNjcmlwdFN1bW1hcnkocXVlcnk6IHtcbiAgICBib3g/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTsgZ2VuZXM/OiBzdHJpbmdbXTsgY2VsbHM/OiBudW1iZXJbXTtcbiAgfSk6IFByb21pc2U8U3BhdGlhbFRyYW5zY3JpcHRTdW1tYXJ5PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAocXVlcnkuYm94KSBwYXJhbXMucHVzaChgYm94PSR7cXVlcnkuYm94Lm1hcCgodikgPT4gK3YudG9GaXhlZCgzKSkuam9pbignLCcpfWApO1xuICAgIGlmIChxdWVyeS5nZW5lcz8ubGVuZ3RoKSBwYXJhbXMucHVzaChgZ2VuZXM9JHtxdWVyeS5nZW5lcy5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcsJyl9YCk7XG4gICAgaWYgKHF1ZXJ5LmNlbGxzPy5sZW5ndGgpIHBhcmFtcy5wdXNoKGBjZWxscz0ke3F1ZXJ5LmNlbGxzLmpvaW4oJywnKX1gKTtcbiAgICBjb25zdCB1cmwgPSBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3RyYW5zY3JpcHQtc3VtbWFyeT8ke3BhcmFtcy5qb2luKCcmJyl9YDtcbiAgICBsZXQgaGl0ID0gdGhpcy5zdW1tYXJ5Q2FjaGUuZ2V0KHVybCk7XG4gICAgaWYgKCFoaXQpIHtcbiAgICAgIGhpdCA9IHRoaXMuZ2V0SnNvbjxTcGF0aWFsVHJhbnNjcmlwdFN1bW1hcnk+KHVybCk7XG4gICAgICBoaXQuY2F0Y2goKCkgPT4gdGhpcy5zdW1tYXJ5Q2FjaGUuZGVsZXRlKHVybCkpO1xuICAgICAgdGhpcy5zdW1tYXJ5Q2FjaGUuc2V0KHVybCwgaGl0KTtcbiAgICAgIGlmICh0aGlzLnN1bW1hcnlDYWNoZS5zaXplID4gMjU2KSB0aGlzLnN1bW1hcnlDYWNoZS5kZWxldGUodGhpcy5zdW1tYXJ5Q2FjaGUua2V5cygpLm5leHQoKS52YWx1ZSEpO1xuICAgIH1cbiAgICByZXR1cm4gaGl0O1xuICB9XG5cbiAgZ2V0RGVuc2l0eShnZW5lczogc3RyaW5nW10sIGJpblNpemU/OiBudW1iZXIpOiBQcm9taXNlPFNwYXRpYWxEZW5zaXR5UmFzdGVyPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGlmICghbWFuaWZlc3QuZGVuc2l0eSkgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignW3NwYXRpYWxdIHRoaXMgZGF0YXNldCBoYXMgbm8gZGVuc2l0eSByYXN0ZXInKSk7XG4gICAgY29uc3QgbGlzdCA9IFsuLi5nZW5lc107XG4gICAgY29uc3QgYmluID0gYmluU2l6ZSA/IGAmYmluPSR7YmluU2l6ZX1gIDogJyc7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWQoXG4gICAgICBgZGVuc2l0eToke2xpc3Quam9pbignLCcpfToke2JpblNpemUgPz8gJyd9YCxcbiAgICAgICgpID0+IHRoaXMuZ2V0QmluYXJ5KFxuICAgICAgICBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L2RlbnNpdHk/Z2VuZXM9JHtsaXN0Lm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJywnKX0ke2Jpbn1gLFxuICAgICAgKS50aGVuKChidWYpID0+IGRlY29kZURlbnNpdHkoYnVmLCBsaXN0KSksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxEZW5zaXR5UmFzdGVyPjtcbiAgfVxuXG4gIGFzeW5jIGltcG9ydEdyb3VwcyhsYWJlbDogc3RyaW5nLCB0YWJsZTogc3RyaW5nKTogUHJvbWlzZTx7IGNvbHVtbjogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhOyBtYXRjaGVkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmJhc2VVcmx9c3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L2dyb3Vwcz9uYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGxhYmVsKX1gO1xuICAgIC8vIEh0dHBDbGllbnQsIG5vdCBmZXRjaDogYSBob3N0J3MgaW50ZXJjZXB0b3JzIChpdHMgYXV0aCBoZWFkZXIpIG11c3QgYXBwbHkgdG8gdGhlXG4gICAgLy8gdXBsb2FkIGFzIHRoZXkgZG8gdG8gZXZlcnkgcmVhZCwgb3IgYSBwcm90ZWN0ZWQgc2VydmVyIHJlZnVzZXMgaXQuXG4gICAgbGV0IGJvZHk6IHsgY29sdW1uOiBDYXRlZ29yaWNhbENvbHVtbk1ldGE7IG1hdGNoZWQ6IG51bWJlciB9O1xuICAgIHRyeSB7XG4gICAgICBib2R5ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0PHsgY29sdW1uOiBDYXRlZ29yaWNhbENvbHVtbk1ldGE7IG1hdGNoZWQ6IG51bWJlciB9Pih1cmwsIHRhYmxlLCB7XG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ3RleHQvY3N2JyB9LFxuICAgICAgICB9KS5waXBlKHRpbWVvdXQodGhpcy50aW1lb3V0TXMpKSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBlID0gZXJyIGFzIEh0dHBFcnJvclJlc3BvbnNlO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGU/LmVycm9yPy5lcnJvciA/PyBgW3NwYXRpYWxdIGltcG9ydCBmYWlsZWQgKEhUVFAgJHtlPy5zdGF0dXMgPz8gJz8nfSlgKTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uID0gYm9keS5jb2x1bW47XG4gICAgLy8gVGhlIG5ldyBjb2x1bW4gam9pbnMgdGhlIGRhdGFzZXQ6IHJlLWVtaXQgc28gZXZlcnkgcGFuZWwgc2VlcyBpdC5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kYXRhc2V0JC52YWx1ZTtcbiAgICBpZiAoY3VycmVudCAmJiB0aGlzLm1hbmlmZXN0Py5pZCA9PT0gbWFuaWZlc3QuaWQpIHtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBjdXJyZW50LmNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLm5hbWUgIT09IGNvbHVtbi5uYW1lKS5jb25jYXQoY29sdW1uKTtcbiAgICAgIHRoaXMubWFuaWZlc3QgPSB7IC4uLnRoaXMubWFuaWZlc3QsIGNvbHVtbnMgfTtcbiAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGBjb2x1bW46JHtjb2x1bW4ubmFtZX1gKTtcbiAgICAgIHRoaXMuZGF0YXNldCQubmV4dCh7IC4uLmN1cnJlbnQsIGNvbHVtbnMgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbHVtbiwgbWF0Y2hlZDogYm9keS5tYXRjaGVkIH07XG4gIH1cblxuICBnZXRUcmFuc2NyaXB0Q291bnRzKGdlbmVzOiBzdHJpbmdbXSk6IFByb21pc2U8U3BhdGlhbFRyYW5zY3JpcHRDb3VudHM+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SnNvbjxTcGF0aWFsVHJhbnNjcmlwdENvdW50cz4oXG4gICAgICBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3RyYW5zY3JpcHQtY291bnRzP2dlbmVzPSR7Z2VuZXMubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbignLCcpfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBMUlUgb3ZlciB0aWxlIHByb21pc2VzLCBzbyBjb25jdXJyZW50IGFza3Mgc2hhcmUgb25lIHJlcXVlc3QgYW5kIGEgZmFpbHVyZSBpcyBub3Qga2VwdC4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRUaWxlPFQgZXh0ZW5kcyBTcGF0aWFsUG9seWdvblRpbGUgfCBTcGF0aWFsVHJhbnNjcmlwdFRpbGU+KFxuICAgIGtleTogc3RyaW5nLCBsb2FkOiAoKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBoaXQgPSB0aGlzLnRpbGVDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoaGl0KSB7XG4gICAgICB0aGlzLnRpbGVDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMudGlsZUNhY2hlLnNldChrZXksIGhpdCk7XG4gICAgICByZXR1cm4gaGl0IGFzIFByb21pc2U8VD47XG4gICAgfVxuICAgIGNvbnN0IG1pbmUgPSB0aGlzLnNlbGVjdFRva2VuO1xuICAgIGNvbnN0IHByb21pc2UgPSBsb2FkKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgaWYgKHRoaXMudGlsZUNhY2hlLmdldChrZXkpID09PSBwcm9taXNlKSB0aGlzLnRpbGVDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgICBpZiAobWluZSA9PT0gdGhpcy5zZWxlY3RUb2tlbikge1xuICAgICAgdGhpcy50aWxlQ2FjaGUuc2V0KGtleSwgcHJvbWlzZSk7XG4gICAgICB3aGlsZSAodGhpcy50aWxlQ2FjaGUuc2l6ZSA+IFNwYXRpYWxEYXRhSHR0cFNlcnZpY2UuVElMRV9DQUNIRV9MSU1JVCkge1xuICAgICAgICB0aGlzLnRpbGVDYWNoZS5kZWxldGUodGhpcy50aWxlQ2FjaGUua2V5cygpLm5leHQoKS52YWx1ZSEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIHZvbHVtZSdzIHZveGVscywgc2luZ2xlLWZsaWdodGVkIGxpa2UgdGhlIHBvbHlnb25zLlxuICAgKlxuICAgKiBWYWxpZGF0ZWQgYWdhaW5zdCB0aGUgbWFuaWZlc3QncyBkZWNsYXJlZCBkaW1lbnNpb25zIGJlZm9yZSBpdCBpcyBoYW5kZWRcbiAgICogYmFjazogYSBzaG9ydCBvciBsb25nIGJ1ZmZlciByZWFkIGFzIGEgM0QgdGV4dHVyZSBkb2VzIG5vdCBmYWlsLCBpdCBzaGVhcnNcbiAgICogdGhlIGFuYXRvbXkgaW50byBkaWFnb25hbCBzdHJlYWtzLCBhbmQgdGhhdCBpcyBmYXIgaGFyZGVyIHRvIHJlY29nbmlzZSBhcyBhXG4gICAqIHRyYW5zcG9ydCBwcm9ibGVtIHRoYW4gYW4gZXJyb3IgaXMuXG4gICAqL1xuICBnZXRWb2x1bWUoKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGNvbnN0IG1ldGEgPSBtYW5pZmVzdC52b2x1bWU7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdbc3BhdGlhbF0gdGhpcyBkYXRhc2V0IGhhcyBubyByZWZlcmVuY2Ugdm9sdW1lJykpO1xuICAgIH1cbiAgICB0aGlzLnZvbHVtZVByb21pc2UgPz89IHRoaXNcbiAgICAgIC5nZXRCaW5hcnkoYHNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS92b2x1bWVgKVxuICAgICAgLnRoZW4oKGJ1ZikgPT4ge1xuICAgICAgICBjb25zdCB3YW50ID0gbWV0YS53aWR0aCAqIG1ldGEuaGVpZ2h0ICogbWV0YS5kZXB0aDtcbiAgICAgICAgaWYgKGJ1Zi5ieXRlTGVuZ3RoICE9PSB3YW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFtzcGF0aWFsXSB2b2x1bWUgaXMgJHtidWYuYnl0ZUxlbmd0aH0gYnl0ZXMsIGV4cGVjdGVkICR7d2FudH0gYFxuICAgICAgICAgICAgKyBgKCR7bWV0YS53aWR0aH14JHttZXRhLmhlaWdodH14JHttZXRhLmRlcHRofSlgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHsgdGhpcy52b2x1bWVQcm9taXNlID0gbnVsbDsgdGhyb3cgZXJyOyB9KTtcbiAgICByZXR1cm4gdGhpcy52b2x1bWVQcm9taXNlO1xuICB9XG5cbiAgLy8g4pSA4pSAIGludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIHJlcXVpcmVNYW5pZmVzdCgpOiBTcGF0aWFsTWFuaWZlc3Qge1xuICAgIGlmICghdGhpcy5tYW5pZmVzdCB8fCAhdGhpcy5kYXRhc2V0JC52YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gbm8gZGF0YXNldCBzZWxlY3RlZCDigJQgY2FsbCBzZWxlY3REYXRhc2V0KCkgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ2FjaGUgKyBzaW5nbGUtZmxpZ2h0IGFyb3VuZCBhIHZlY3RvciBmZXRjaC5cbiAgICpcbiAgICogS2V5cyBhcmUgTE9HSUNBTCDigJQgYGZlYXR1cmU6R0FQREhgLCBub3QgYDxkYXRhc2V0Pi9mZWF0dXJlOkdBUERIYCDigJQgYmVjYXVzZSBgY2xlYXIoKWBcbiAgICogZW1wdGllcyB0aGUgbWFwcyBvbiBldmVyeSBzd2l0Y2gsIHNvIHR3byBkYXRhc2V0cyBuZXZlciBob2xkIGVudHJpZXMgYXQgb25jZS4gV2hhdFxuICAgKiB0aGF0IGRvZXMgbm90IGNvdmVyIGlzIGEgcmVxdWVzdCBzdGlsbCBpbiB0aGUgYWlyIHdoZW4gdGhlIHN3aXRjaCBoYXBwZW5zOiBgY2xlYXIoKWBcbiAgICogY2Fubm90IGNhbmNlbCBhbiBIVFRQIGNhbGwsIHNvIGEgdmVjdG9yIGZldGNoZWQgZm9yIGRhdGFzZXQgQSBjYW4gcmVzb2x2ZSBhZnRlciBCIGhhc1xuICAgKiBiZWVuIHNlbGVjdGVkIGFuZCB3cml0ZSBpdHNlbGYgaW50byBCJ3MgY2FjaGUgdW5kZXIgYSBrZXkgQiB3b3VsZCByZWFkLiBCb3RoIGRhdGFzZXRzXG4gICAqIGhhdmluZyBhIGdlbmUgb2YgdGhhdCBuYW1lIGlzIHRoZSBjb21tb24gY2FzZSwgbm90IHRoZSB1bmx1Y2t5IG9uZSwgYW5kIHRoZSByZXN1bHQgaXNcbiAgICogYSBwbG90IG9mIEEncyBleHByZXNzaW9uIG92ZXIgQidzIGNlbGxzIOKAlCB3aGljaCBsb29rcyBsaWtlIGRhdGEsIG5vdCBsaWtlIGEgZmF1bHQuXG4gICAqXG4gICAqIFNvIHRoZSBnZW5lcmF0aW9uIGlzIGNoZWNrZWQgYWZ0ZXIgdGhlIGF3YWl0LCBhbmQgdGhlIGluLWZsaWdodCBzbG90IGlzIGNsZWFyZWQgb25seVxuICAgKiB3aGVuIHRoZSBwcm9taXNlIHN0aWxsIHNpdHRpbmcgaW4gaXQgaXMgdGhpcyBvbmU6IGEgbGF0ZSBhcnJpdmFsIG11c3Qgbm90IGV2aWN0IHRoZVxuICAgKiBlbnRyeSBhIG5ld2VyIHJlcXVlc3QgZm9yIHRoZSBzYW1lIGtleSBpcyBhbHJlYWR5IHNoYXJpbmcuXG4gICAqL1xuICBwcml2YXRlIGZldGNoQ2FjaGVkKGtleTogc3RyaW5nLCBsb2FkOiAoKSA9PiBQcm9taXNlPENhY2hlZFBheWxvYWQ+KTogUHJvbWlzZTxDYWNoZWRQYXlsb2FkPiB7XG4gICAgY29uc3QgaGl0ID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoaGl0KSB7XG4gICAgICAvLyBSZS1pbnNlcnQgdG8gbWFyayBtb3N0LXJlY2VudGx5LXVzZWQgKE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyKS5cbiAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmNhY2hlLnNldChrZXksIGhpdCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGhpdCk7XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLmluRmxpZ2h0LmdldChrZXkpO1xuICAgIGlmIChwZW5kaW5nKSByZXR1cm4gcGVuZGluZztcblxuICAgIGNvbnN0IG1pbmUgPSB0aGlzLnNlbGVjdFRva2VuO1xuICAgIGNvbnN0IHByb21pc2U6IFByb21pc2U8Q2FjaGVkUGF5bG9hZD4gPSBsb2FkKClcbiAgICAgIC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAvLyBTdGlsbCByZXR1cm5lZCB0byB0aGUgY2FsbGVyIHRoYXQgYXNrZWQ6IGl0IG1heSB3ZWxsIGJlIGEgY29tcG9uZW50IHRoYXQgaXNcbiAgICAgICAgLy8gaXRzZWxmIGJlaW5nIHRvcm4gZG93biwgYW5kIHJlamVjdGluZyBoZXJlIHdvdWxkIHN1cmZhY2UgYSBzd2l0Y2ggYXMgYW4gZXJyb3IuXG4gICAgICAgIC8vIFdoYXQgbXVzdCBub3QgaGFwcGVuIGlzIHRoZSB2YWx1ZSBiZWluZyBrZXB0IGZvciB3aG9ldmVyIGNvbWVzIG5leHQuXG4gICAgICAgIGlmIChtaW5lID09PSB0aGlzLnNlbGVjdFRva2VuKSB7XG4gICAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5ldmljdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluRmxpZ2h0LmdldChrZXkpID09PSBwcm9taXNlKSB0aGlzLmluRmxpZ2h0LmRlbGV0ZShrZXkpO1xuICAgICAgfSk7XG4gICAgdGhpcy5pbkZsaWdodC5zZXQoa2V5LCBwcm9taXNlKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgZXZpY3QoKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMuY2FjaGUuc2l6ZSA+IFNwYXRpYWxEYXRhSHR0cFNlcnZpY2UuQ0FDSEVfTElNSVQpIHtcbiAgICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMuY2FjaGUua2V5cygpLm5leHQoKS52YWx1ZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAob2xkZXN0ID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEpzb248VD4ocGF0aDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5odHRwLmdldDxUPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWApLnBpcGUodGltZW91dCh0aGlzLnRpbWVvdXRNcykpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldEJpbmFyeShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5odHRwLmdldChgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWAsIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIH0pXG4gICAgICAgIC5waXBlKHRpbWVvdXQodGhpcy50aW1lb3V0TXMpKSxcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -33,7 +33,18 @@ import { NO_CATEGORY, } from '../../contracts/spatial-dataset.contract';
33
33
  * GET {base}/spatial/{id}/feature/{name} -> f32[N]
34
34
  * GET {base}/spatial/{id}/features?q=&limit= -> { names: string[] }
35
35
  * GET {base}/spatial/{id}/polygons -> u32 count, u32[count+1] offsets, f32[2*rings] coords
36
+ * GET {base}/spatial/{id}/polygon-tile/{set}/{level}/{gx}/{gy}
37
+ * -> u32 count, u32[count] obs, u32[count+1] offsets, f32 coords
38
+ * GET {base}/spatial/{id}/transcript-tile/{level}/{gx}/{gy}?genes=A,B&quality=high|all
39
+ * -> see decodeTranscriptTile
40
+ * GET {base}/spatial/{id}/density?genes=A,B -> f32[rows*cols]
41
+ * GET {base}/spatial/{id}/transcript-bins/{level}/{tx}/{ty}
42
+ * -> transcript-tile layout, one entry per bin
36
43
  * ```
44
+ *
45
+ * The three tiled routes are optional and advertised in the manifest
46
+ * (`polygonTiles`, `transcriptTiles`, `density`); a server without them never
47
+ * sees them requested.
37
48
  */
38
49
  /** Bumped when the layout changes incompatibly; the client refuses anything else. */
39
50
  export const SPATIAL_WIRE_VERSION = 1;
@@ -143,6 +154,65 @@ export function decodePolygons(buf) {
143
154
  const coords = new Float32Array(buf, coordsByteOffset, vertexCount * 2);
144
155
  return { coords, offsets, count };
145
156
  }
157
+ /**
158
+ * `GET /polygon-tile/...` → one tile of rings with their owning observations. Layout
159
+ * `[u32 count][u32 obs × count][u32 offsets × (count+1)][f32 coords × 2·offsets[count]]`.
160
+ */
161
+ export function decodePolygonTile(buf) {
162
+ assertLittleEndian();
163
+ if (buf.byteLength < 8) {
164
+ throw new Error('[spatial] polygon tile: response too short for a header');
165
+ }
166
+ const count = new Uint32Array(buf, 0, 1)[0];
167
+ const observation = new Uint32Array(buf, 4, count);
168
+ const offsets = new Uint32Array(buf, 4 + count * 4, count + 1);
169
+ const vertexCount = offsets[count];
170
+ const coordsByteOffset = 4 + count * 4 + (count + 1) * 4;
171
+ assertByteLength(buf, coordsByteOffset + vertexCount * 8, 'polygon tile');
172
+ return {
173
+ count, observation, offsets,
174
+ coords: new Float32Array(buf, coordsByteOffset, vertexCount * 2),
175
+ };
176
+ }
177
+ /**
178
+ * `GET /transcript-tile/...` → transcripts or aggregates. Layout, 4-byte aligned:
179
+ * `[u32 n][u32 flags][f32 x·n][f32 y·n][f32 z·n][u32 weight·n][u32 obs·n][u16 gene·n, padded]`;
180
+ * flags bit 0 marks an aggregated level.
181
+ */
182
+ export function decodeTranscriptTile(buf) {
183
+ assertLittleEndian();
184
+ if (buf.byteLength < 8) {
185
+ throw new Error('[spatial] transcript tile: response too short for a header');
186
+ }
187
+ const [n, flags] = new Uint32Array(buf, 0, 2);
188
+ const genePad = Math.ceil((n * 2) / 4) * 4;
189
+ assertByteLength(buf, 8 + n * 20 + genePad, 'transcript tile');
190
+ return {
191
+ count: n,
192
+ aggregated: (flags & 1) === 1,
193
+ x: new Float32Array(buf, 8, n),
194
+ y: new Float32Array(buf, 8 + n * 4, n),
195
+ z: new Float32Array(buf, 8 + n * 8, n),
196
+ weight: new Uint32Array(buf, 8 + n * 12, n),
197
+ observation: new Uint32Array(buf, 8 + n * 16, n),
198
+ gene: new Uint16Array(buf, 8 + n * 20, n),
199
+ };
200
+ }
201
+ /**
202
+ * `GET /density?genes=&bin=` → the summed raster. Layout
203
+ * `[u32 rows][u32 cols][f32 cellW][f32 cellH][f32 originX][f32 originY][f32 rows·cols]`:
204
+ * the geometry travels with the values because re-binning changes it.
205
+ */
206
+ export function decodeDensity(buf, genes) {
207
+ assertLittleEndian();
208
+ if (buf.byteLength < 24)
209
+ throw new Error('[spatial] density: response too short for a header');
210
+ const [rows, cols] = new Uint32Array(buf, 0, 2);
211
+ const [cw, ch, ox, oy] = new Float32Array(buf, 8, 4);
212
+ assertByteLength(buf, 24 + rows * cols * 4, 'density');
213
+ const meta = { rows, cols, gridSize: [cw, ch], origin: [ox, oy] };
214
+ return { meta, genes, values: new Float32Array(buf, 24, rows * cols) };
215
+ }
146
216
  /**
147
217
  * Fold a manifest plus its fetched coordinate/id/radius vectors into the
148
218
  * library-facing {@link SpatialDataset}. Column and feature *values* are not
@@ -174,6 +244,11 @@ export function datasetFromManifest(manifest, coords, extras = {}) {
174
244
  ...(manifest.micronsPerUnit !== undefined
175
245
  ? { micronsPerUnit: manifest.micronsPerUnit }
176
246
  : {}),
247
+ ...(manifest.polygonTiles ? { polygonTiles: manifest.polygonTiles } : {}),
248
+ ...(manifest.transcriptTiles ? { transcriptTiles: manifest.transcriptTiles } : {}),
249
+ ...(manifest.density ? { density: manifest.density } : {}),
250
+ ...(manifest.transcriptBins ? { transcriptBins: manifest.transcriptBins } : {}),
251
+ ...(manifest.transcriptBinsStatus ? { transcriptBinsStatus: manifest.transcriptBinsStatus } : {}),
177
252
  };
178
253
  }
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC13aXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvc3BhdGlhbC1kYXRhLWh0dHAvc3BhdGlhbC13aXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxXQUFXLEdBV1osTUFBTSwwQ0FBMEMsQ0FBQztBQUVsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUFFSCxxRkFBcUY7QUFDckYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBaUN0QyxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLGNBQWM7SUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxrQkFBa0I7SUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUU7WUFDdkUsdUVBQXVFLENBQ3hFLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLGdCQUFnQixDQUFDLEdBQWdCLEVBQUUsUUFBZ0IsRUFBRSxJQUFZO0lBQ3hFLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLGFBQWEsSUFBSSxjQUFjLFFBQVEsZUFBZSxHQUFHLENBQUMsVUFBVSxJQUFJO1lBQ3hFLG1EQUFtRCxDQUNwRCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFFBQXlCO0lBQzdELElBQUks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QyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUM1QyxDQUFDO0lBQ0YsT0FBTztRQUNMLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtRQUNmLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtRQUNuQixZQUFZO1FBQ1osT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRTtRQUMvQixHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdELEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRSxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsS0FBSyxTQUFTO1lBQ3ZDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFO1lBQzdDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgQ29udGludW91c0NvbHVtbk1ldGEsXG4gIE5PX0NBVEVHT1JZLFxuICBTcGF0aWFsQ29sdW1uLFxuICBTcGF0aWFsQ29sdW1uTWV0YSxcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxFbWJlZGRpbmcsXG4gIFNwYXRpYWxFbWJlZGRpbmdNZXRhLFxuICBTcGF0aWFsRmVhdHVyZU1ldGEsXG4gIFNwYXRpYWxJbWFnZVJlZixcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgU3BhdGlhbFBvbHlnb25zLFxuICBTcGF0aWFsVm9sdW1lTWV0YSxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5cbi8qKlxuICogVGhlIHdpcmUgZm9ybWF0IHRoZSBidW5kbGVkIGV4YW1wbGUgc2VydmVyIHNwZWFrcywgYW5kIGl0cyBkZWNvZGVycy5cbiAqXG4gKiBQdXJlIGJ5IGRlc2lnbiDigJQgbm8gQW5ndWxhciwgbm8gUnhKUywgbm8gSFRUUCDigJQgc28gdGhlIGZvcm1hdCBpcyB0ZXN0YWJsZSBvblxuICogaXRzIG93biBhbmQgcmV1c2FibGUgYnkgYW55IHRyYW5zcG9ydCAoYFNwYXRpYWxEYXRhSHR0cFNlcnZpY2VgIGlzIG9uZSkuXG4gKiBNaXJyb3JzIHRoZSBzcGxpdCBpbiBgcGxvdGx5LXRyYWNlLWJ1aWxkZXJzLnRzYDogdGhlIHNoYXBlIGxpdmVzIGluIGEgcHVyZVxuICogbW9kdWxlLCB0aGUgc2VydmljZSBqdXN0IG1vdmVzIGJ5dGVzLlxuICpcbiAqIFdIWSBCSU5BUllcbiAqIC0tLS0tLS0tLS1cbiAqIFZlY3RvcnMgYXJlIG9uZSBgRmxvYXQzMkFycmF5YC9gVWludDE2QXJyYXlgIHBlciByZXF1ZXN0LCBkZWxpdmVyZWQgYXMgcmF3XG4gKiBsaXR0bGUtZW5kaWFuIGJ5dGVzLiBKU09OIHdvdWxkIGNvc3QgfjjigJMxMsOXIHRoZSBzaXplIGFuZCBhIHBhcnNlIHRoYXRcbiAqIGFsbG9jYXRlcyBvbmUgSlMgbnVtYmVyIHBlciB2YWx1ZTsgYSB0eXBlZC1hcnJheSB2aWV3IG92ZXIgdGhlIHJlc3BvbnNlXG4gKiBidWZmZXIgaXMgemVyby1jb3B5IGFuZCB1cGxvYWRzIHRvIHRoZSBHUFUgZGlyZWN0bHkuXG4gKlxuICogRU5ESUFOTkVTU1xuICogLS0tLS0tLS0tLVxuICogTGl0dGxlLWVuZGlhbiwgYXNzZXJ0ZWQgYXQgZGVjb2RlLiBFdmVyeSBwbGF0Zm9ybSBhIGJyb3dzZXIgcnVucyBvbiB0b2RheSBpc1xuICogbGl0dGxlLWVuZGlhbiwgc28gYSBgRGF0YVZpZXdgIGJ5dGUtYnktYnl0ZSByZWFkIHdvdWxkIGNvc3QgcmVhbCB0aW1lIGZvciBhXG4gKiBjYXNlIHRoYXQgZG9lcyBub3Qgb2NjdXIg4oCUIGJ1dCBmYWlsaW5nIGxvdWRseSBiZWF0cyByZW5kZXJpbmcgdHJhbnNwb3NlZFxuICogZ2FyYmFnZSBpZiBpdCBldmVyIGRvZXMuXG4gKlxuICogRU5EUE9JTlRTIChiYXNlID0gdGhlIHNlcnZlciByb290KVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogYGBgXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwvZGF0YXNldHMgICAgICAgICAgICAgIC0+IHsgZGF0YXNldHM6IFt7IGlkLCBuYW1lLCBjb3VudCB9XSB9XG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9tYW5pZmVzdCAgICAgICAgIC0+IFNwYXRpYWxNYW5pZmVzdFxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vY29vcmRzICAgICAgICAgICAtPiBmMzJbTl0geCwgZjMyW05dIHksIGYzMltOXSB6P1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vcmFkaXVzICAgICAgICAgICAtPiBmMzJbTl0gICAgICAgICAgIChwZXItb2JzZXJ2YXRpb24gcmFkaXVzIG9ubHkpXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9pZHMgICAgICAgICAgICAgIC0+IHsgaWRzOiBzdHJpbmdbXSB9IChoYXNJZHMgb25seSlcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2NvbHVtbi97bmFtZX0gICAgLT4gdTE2W05dIGNvZGVzIHwgZjMyW05dIHZhbHVlc1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vZmVhdHVyZS97bmFtZX0gICAtPiBmMzJbTl1cbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2ZlYXR1cmVzP3E9JmxpbWl0PSAtPiB7IG5hbWVzOiBzdHJpbmdbXSB9XG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9wb2x5Z29ucyAgICAgICAgIC0+IHUzMiBjb3VudCwgdTMyW2NvdW50KzFdIG9mZnNldHMsIGYzMlsyKnJpbmdzXSBjb29yZHNcbiAqIGBgYFxuICovXG5cbi8qKiBCdW1wZWQgd2hlbiB0aGUgbGF5b3V0IGNoYW5nZXMgaW5jb21wYXRpYmx5OyB0aGUgY2xpZW50IHJlZnVzZXMgYW55dGhpbmcgZWxzZS4gKi9cbmV4cG9ydCBjb25zdCBTUEFUSUFMX1dJUkVfVkVSU0lPTiA9IDE7XG5cbi8qKiBQZXItb2JzZXJ2YXRpb24gbWFya2VyIHJhZGl1czogb25lIHNoYXJlZCB2YWx1ZSwgb3IgYSBzZXJ2ZWQgZjMyIHZlY3Rvci4gKi9cbmV4cG9ydCB0eXBlIFNwYXRpYWxSYWRpdXNTcGVjID1cbiAgfCB7IG1vZGU6ICd1bmlmb3JtJzsgdmFsdWU6IG51bWJlciB9XG4gIHwgeyBtb2RlOiAncGVyLW9ic2VydmF0aW9uJyB9O1xuXG4vKiogYEdFVCAvc3BhdGlhbC97aWR9L21hbmlmZXN0YCDigJQgZXZlcnl0aGluZyBjaGVhcCBlbm91Z2ggdG8gc2VuZCB1cCBmcm9udC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbE1hbmlmZXN0IHtcbiAgdmVyc2lvbjogbnVtYmVyO1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBOIOKAlCBvYnNlcnZhdGlvbiBjb3VudDsgZXZlcnkgc2VydmVkIHZlY3RvciBoYXMgZXhhY3RseSB0aGlzIGxlbmd0aC4gKi9cbiAgY291bnQ6IG51bWJlcjtcbiAgaGFzWj86IGJvb2xlYW47XG4gIGhhc0lkcz86IGJvb2xlYW47XG4gIHJhZGl1cz86IFNwYXRpYWxSYWRpdXNTcGVjO1xuICBjb2x1bW5zOiBTcGF0aWFsQ29sdW1uTWV0YVtdO1xuICBmZWF0dXJlcz86IFNwYXRpYWxGZWF0dXJlTWV0YTtcbiAgcG9seWdvbnM/OiB7IGNvdW50OiBudW1iZXIgfTtcbiAgaW1hZ2VSZWY/OiBTcGF0aWFsSW1hZ2VSZWY7XG4gIHZvbHVtZT86IFNwYXRpYWxWb2x1bWVNZXRhO1xuICBlbWJlZGRpbmdzPzogU3BhdGlhbEVtYmVkZGluZ01ldGFbXTtcbiAgbWljcm9uc1BlclVuaXQ/OiBudW1iZXI7XG59XG5cbi8qKiBgR0VUIC9zcGF0aWFsL2RhdGFzZXRzYCAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsRGF0YXNldFN1bW1hcnkge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbi8qKiBUcnVlIG9uIGEgbGl0dGxlLWVuZGlhbiBob3N0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCk6IGJvb2xlYW4ge1xuICBjb25zdCBwcm9iZSA9IG5ldyBVaW50MTZBcnJheShbMV0pO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocHJvYmUuYnVmZmVyKVswXSA9PT0gMTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0TGl0dGxlRW5kaWFuKCk6IHZvaWQge1xuICBpZiAoIWlzTGl0dGxlRW5kaWFuKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnW3NwYXRpYWxdIHdpcmUgZm9ybWF0IGlzIGxpdHRsZS1lbmRpYW47IHRoaXMgcGxhdGZvcm0gaXMgYmlnLWVuZGlhbi4gJyArXG4gICAgICAnU2VydmUgSlNPTiB2ZWN0b3JzLCBvciBieXRlLXN3YXAgaW4gYSBjdXN0b20gU3BhdGlhbERhdGFQb3J0IGFkYXB0ZXIuJyxcbiAgICApO1xuICB9XG59XG5cbi8qKiBHdWFyZCBhIGRlY29kZSBhZ2FpbnN0IGEgdHJ1bmNhdGVkIG9yIG92ZXJzaXplZCByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIGFzc2VydEJ5dGVMZW5ndGgoYnVmOiBBcnJheUJ1ZmZlciwgZXhwZWN0ZWQ6IG51bWJlciwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCAhPT0gZXhwZWN0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgW3NwYXRpYWxdICR7d2hhdH06IGV4cGVjdGVkICR7ZXhwZWN0ZWR9IGJ5dGVzLCBnb3QgJHtidWYuYnl0ZUxlbmd0aH0uIGAgK1xuICAgICAgJ01hbmlmZXN0IGNvdW50IGFuZCBzZXJ2ZWQgdmVjdG9yIGxlbmd0aCBkaXNhZ3JlZS4nLFxuICAgICk7XG4gIH1cbn1cblxuLyoqIFJlamVjdCBhIG1hbmlmZXN0IHRoaXMgY2xpZW50IGNhbm5vdCByZWFkLCB3aXRoIGEgbWVzc2FnZSBuYW1pbmcgdGhlIGZpeC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNYW5pZmVzdFZlcnNpb24obWFuaWZlc3Q6IFNwYXRpYWxNYW5pZmVzdCk6IHZvaWQge1xuICBpZiAobWFuaWZlc3QudmVyc2lvbiAhPT0gU1BBVElBTF9XSVJFX1ZFUlNJT04pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgW3NwYXRpYWxdIHVuc3VwcG9ydGVkIHdpcmUgdmVyc2lvbiAke21hbmlmZXN0LnZlcnNpb259IGAgK1xuICAgICAgYCh0aGlzIGNsaWVudCBzcGVha3MgJHtTUEFUSUFMX1dJUkVfVkVSU0lPTn0pLiBVcGRhdGUgdGhlIHNlcnZlciBvciB0aGUgbGlicmFyeS5gLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBgR0VUIC9jb29yZHNgIOKGkiB4L3koL3opLiBPbmUgcmVxdWVzdCByYXRoZXIgdGhhbiB0d28gb3IgdGhyZWU6IHRoZSB2ZWN0b3JzXG4gKiBhcmUgYWx3YXlzIGZldGNoZWQgdG9nZXRoZXIsIGFuZCBhIHNpbmdsZSByZXNwb25zZSBrZWVwcyB0aGVtIGNvbnNpc3RlbnQgaWZcbiAqIHRoZSBkYXRhc2V0IGNoYW5nZXMgdW5kZXJuZWF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUNvb3JkcyhcbiAgYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlciwgaGFzWiA9IGZhbHNlLFxuKTogUGljazxTcGF0aWFsT2JzZXJ2YXRpb25zLCAneCcgfCAneScgfCAneic+IHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGNvbnN0IGF4ZXMgPSBoYXNaID8gMyA6IDI7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb3VudCAqIGF4ZXMgKiA0LCAnY29vcmRzJyk7XG4gIGNvbnN0IHggPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpO1xuICBjb25zdCB5ID0gbmV3IEZsb2F0MzJBcnJheShidWYsIGNvdW50ICogNCwgY291bnQpO1xuICBjb25zdCB6ID0gaGFzWiA/IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDgsIGNvdW50KSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgeCwgeSwgeiB9O1xufVxuXG4vKiogYEdFVCAvcmFkaXVzYCDihpIgcGVyLW9ic2VydmF0aW9uIHJhZGlpIGluIGltYWdlIHBpeGVscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVSYWRpdXMoYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiA0LCAncmFkaXVzJyk7XG4gIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpO1xufVxuXG4vKiogYEdFVCAvZmVhdHVyZS97bmFtZX1gIOKGkiBvbmUgZ2VuZSdzIGV4cHJlc3Npb24gdmVjdG9yLiAqL1xuLyoqXG4gKiBgR0VUIC9zcGF0aWFsL3tpZH0vZW1iZWRkaW5nL3tuYW1lfWAg4oCUIG9uZSBwbGFuZSBwZXIgZGltZW5zaW9uLCBzYW1lIGxheW91dCBhcyBjb29yZHMuXG4gKlxuICogU3RydWN0IG9mIGFycmF5cywgbm90IGludGVybGVhdmVkOiBldmVyeSBkaW1lbnNpb24gaXMgY29udGlndW91cywgc28gYW4gYXhpcyBjYW4gYmUgaGFuZGVkIHRvXG4gKiB0aGUgcmVuZGVyZXIgYXMgYSB2aWV3IHdpdGggbm8gY29weSBhbmQgbm8gc3RyaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRW1iZWRkaW5nKFxuICBidWY6IEFycmF5QnVmZmVyLCBtZXRhOiBTcGF0aWFsRW1iZWRkaW5nTWV0YSwgY291bnQ6IG51bWJlcixcbik6IFNwYXRpYWxFbWJlZGRpbmcge1xuICBhc3NlcnRMaXR0bGVFbmRpYW4oKTtcbiAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogbWV0YS5kaW1zICogNCwgYGVtYmVkZGluZyBcIiR7bWV0YS5uYW1lfVwiYCk7XG4gIHJldHVybiB7XG4gICAgbWV0YSxcbiAgICB4OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpLFxuICAgIHk6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDQsIGNvdW50KSxcbiAgICAuLi4obWV0YS5kaW1zID09PSAzID8geyB6OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgY291bnQgKiA4LCBjb3VudCkgfSA6IHt9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZlYXR1cmVWZWN0b3IoYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiA0LCAnZmVhdHVyZSB2ZWN0b3InKTtcbiAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCk7XG59XG5cbi8qKlxuICogYEdFVCAvY29sdW1uL3tuYW1lfWAg4oaSIGEgbG9hZGVkIGNvbHVtbiwgdHlwZWQgYnkgaXRzIGRlc2NyaXB0b3I6IGB1MTZgIGNvZGVzXG4gKiBmb3IgYSBjYXRlZ29yaWNhbCwgYGYzMmAgdmFsdWVzIGZvciBhIGNvbnRpbnVvdXMuIENvZGVzIG91dHNpZGUgdGhlIGNhdGVnb3J5XG4gKiBsaXN0IGFyZSBub3JtYWxpc2VkIHRvIHtAbGluayBOT19DQVRFR09SWX0gc28gYSByZW5kZXJlciBjYW4gdHJ1c3QgdGhlXG4gKiBpbnZhcmlhbnQgaW5zdGVhZCBvZiBib3VuZHMtY2hlY2tpbmcgZXZlcnkgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb2x1bW4oXG4gIGJ1ZjogQXJyYXlCdWZmZXIsIG1ldGE6IFNwYXRpYWxDb2x1bW5NZXRhLCBjb3VudDogbnVtYmVyLFxuKTogU3BhdGlhbENvbHVtbiB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAobWV0YS5raW5kID09PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogMiwgYGNvbHVtbiBcIiR7bWV0YS5uYW1lfVwiYCk7XG4gICAgY29uc3QgY29kZXMgPSBuZXcgVWludDE2QXJyYXkoYnVmLCAwLCBjb3VudCk7XG4gICAgY29uc3QgbiA9IChtZXRhIGFzIENhdGVnb3JpY2FsQ29sdW1uTWV0YSkuY2F0ZWdvcmllcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNvZGVzW2ldID49IG4pIGNvZGVzW2ldID0gTk9fQ0FURUdPUlk7XG4gICAgfVxuICAgIHJldHVybiB7IG1ldGE6IG1ldGEgYXMgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLCBjb2RlcyB9O1xuICB9XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb3VudCAqIDQsIGBjb2x1bW4gXCIke21ldGEubmFtZX1cImApO1xuICByZXR1cm4geyBtZXRhOiBtZXRhIGFzIENvbnRpbnVvdXNDb2x1bW5NZXRhLCB2YWx1ZXM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCkgfTtcbn1cblxuLyoqXG4gKiBgR0VUIC9wb2x5Z29uc2Ag4oaSIGJvdW5kYXJ5IHJpbmdzLiBMYXlvdXQgaXNcbiAqIGBbdTMyIGNvdW50XVt1MzIgb2Zmc2V0cyDDlyAoY291bnQrMSldW2YzMiBjb29yZHMgw5cgMsK3b2Zmc2V0c1tjb3VudF1dYDsgZXZlcnlcbiAqIGZpZWxkIGlzIDQtYnl0ZSB3aWRlIHNvIGVhY2ggdHlwZWQtYXJyYXkgdmlldyBzdGF5cyBhbGlnbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUG9seWdvbnMoYnVmOiBBcnJheUJ1ZmZlcik6IFNwYXRpYWxQb2x5Z29ucyB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCA4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gcG9seWdvbnM6IHJlc3BvbnNlIHRvbyBzaG9ydCBmb3IgYSBoZWFkZXInKTtcbiAgfVxuICBjb25zdCBjb3VudCA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDEpWzBdO1xuICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGJ1ZiwgNCwgY291bnQgKyAxKTtcbiAgY29uc3QgdmVydGV4Q291bnQgPSBvZmZzZXRzW2NvdW50XTtcbiAgY29uc3QgY29vcmRzQnl0ZU9mZnNldCA9IDQgKyAoY291bnQgKyAxKSAqIDQ7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb29yZHNCeXRlT2Zmc2V0ICsgdmVydGV4Q291bnQgKiAyICogNCwgJ3BvbHlnb25zJyk7XG4gIGNvbnN0IGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb29yZHNCeXRlT2Zmc2V0LCB2ZXJ0ZXhDb3VudCAqIDIpO1xuICByZXR1cm4geyBjb29yZHMsIG9mZnNldHMsIGNvdW50IH07XG59XG5cbi8qKlxuICogRm9sZCBhIG1hbmlmZXN0IHBsdXMgaXRzIGZldGNoZWQgY29vcmRpbmF0ZS9pZC9yYWRpdXMgdmVjdG9ycyBpbnRvIHRoZVxuICogbGlicmFyeS1mYWNpbmcge0BsaW5rIFNwYXRpYWxEYXRhc2V0fS4gQ29sdW1uIGFuZCBmZWF0dXJlICp2YWx1ZXMqIGFyZSBub3RcbiAqIHBhcnQgb2YgdGhpcyDigJQgdGhleSBzdGF5IGxhenkgYmVoaW5kIHRoZSBwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YXNldEZyb21NYW5pZmVzdChcbiAgbWFuaWZlc3Q6IFNwYXRpYWxNYW5pZmVzdCxcbiAgY29vcmRzOiBQaWNrPFNwYXRpYWxPYnNlcnZhdGlvbnMsICd4JyB8ICd5JyB8ICd6Jz4sXG4gIGV4dHJhczogeyBpZHM/OiBzdHJpbmdbXTsgcmFkaXVzPzogRmxvYXQzMkFycmF5IH0gPSB7fSxcbik6IFNwYXRpYWxEYXRhc2V0IHtcbiAgYXNzZXJ0TWFuaWZlc3RWZXJzaW9uKG1hbmlmZXN0KTtcbiAgY29uc3QgcmFkaXVzID0gbWFuaWZlc3QucmFkaXVzPy5tb2RlID09PSAndW5pZm9ybSdcbiAgICA/IG1hbmlmZXN0LnJhZGl1cy52YWx1ZVxuICAgIDogZXh0cmFzLnJhZGl1cztcbiAgY29uc3Qgb2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zID0ge1xuICAgIGNvdW50OiBtYW5pZmVzdC5jb3VudCxcbiAgICB4OiBjb29yZHMueCxcbiAgICB5OiBjb29yZHMueSxcbiAgICAuLi4oY29vcmRzLnogPyB7IHo6IGNvb3Jkcy56IH0gOiB7fSksXG4gICAgLi4uKGV4dHJhcy5pZHMgPyB7IGlkczogZXh0cmFzLmlkcyB9IDoge30pLFxuICAgIC4uLihyYWRpdXMgIT09IHVuZGVmaW5lZCA/IHsgcmFkaXVzIH0gOiB7fSksXG4gIH07XG4gIHJldHVybiB7XG4gICAgaWQ6IG1hbmlmZXN0LmlkLFxuICAgIG5hbWU6IG1hbmlmZXN0Lm5hbWUsXG4gICAgb2JzZXJ2YXRpb25zLFxuICAgIGNvbHVtbnM6IG1hbmlmZXN0LmNvbHVtbnMgPz8gW10sXG4gICAgLi4uKG1hbmlmZXN0LmZlYXR1cmVzID8geyBmZWF0dXJlczogbWFuaWZlc3QuZmVhdHVyZXMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QucG9seWdvbnMgPyB7IHBvbHlnb25zOiBtYW5pZmVzdC5wb2x5Z29ucyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5pbWFnZVJlZiA/IHsgaW1hZ2VSZWY6IG1hbmlmZXN0LmltYWdlUmVmIH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnZvbHVtZSA/IHsgdm9sdW1lOiBtYW5pZmVzdC52b2x1bWUgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QuZW1iZWRkaW5ncz8ubGVuZ3RoID8geyBlbWJlZGRpbmdzOiBtYW5pZmVzdC5lbWJlZGRpbmdzIH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0Lm1pY3JvbnNQZXJVbml0ICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBtaWNyb25zUGVyVW5pdDogbWFuaWZlc3QubWljcm9uc1BlclVuaXQgfVxuICAgICAgOiB7fSksXG4gIH07XG59XG4iXX0=
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC13aXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvc3BhdGlhbC1kYXRhLWh0dHAvc3BhdGlhbC13aXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxXQUFXLEdBbUJaLE1BQU0sMENBQTBDLENBQUM7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7QUFFSCxxRkFBcUY7QUFDckYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBc0N0QyxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLGNBQWM7SUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxrQkFBa0I7SUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUU7WUFDdkUsdUVBQXVFLENBQ3hFLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLGdCQUFnQixDQUFDLEdBQWdCLEVBQUUsUUFBZ0IsRUFBRSxJQUFZO0lBQ3hFLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLGFBQWEsSUFBSSxjQUFjLFFBQVEsZUFBZSxHQUFHLENBQUMsVUFBVSxJQUFJO1lBQ3hFLG1EQUFtRCxDQUNwRCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFFBQXlCO0lBQzdELElBQUksUUFBUSxDQUFDLE9BQU8sS0FBSyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0NBQXNDLFFBQVEsQ0FBQyxPQUFPLEdBQUc7WUFDekQsdUJBQXVCLG9CQUFvQixzQ0FBc0MsQ0FDbEYsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLEdBQWdCLEVBQUUsS0FBYSxFQUFFLElBQUksR0FBRyxLQUFLO0lBRTdDLGtCQUFrQixFQUFFLENBQUM7SUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDckIsQ0FBQztBQUVELDZEQUE2RDtBQUM3RCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQWdCLEVBQUUsS0FBYTtJQUMxRCxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsNERBQTREO0FBQzVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsR0FBZ0IsRUFBRSxJQUEwQixFQUFFLEtBQWE7SUFFM0Qsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLGNBQWMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDekUsT0FBTztRQUNMLElBQUk7UUFDSixDQUFDLEVBQUUsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDbEMsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUMxQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUMzRSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxHQUFnQixFQUFFLEtBQWE7SUFDakUsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixHQUFnQixFQUFFLElBQXVCLEVBQUUsS0FBYTtJQUV4RCxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUUsQ0FBQztRQUNoQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxXQUFXLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzFELE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLEdBQUksSUFBOEIsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQzVDLENBQUM7UUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQTZCLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUNELGdCQUFnQixDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFdBQVcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDMUQsT0FBTyxFQUFFLElBQUksRUFBRSxJQUE0QixFQUFFLE1BQU0sRUFBRSxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDekYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQWdCO0lBQzdDLGtCQUFrQixFQUFFLENBQUM7SUFDckIsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsR0FBRyxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsR0FBZ0I7SUFDaEQsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekQsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLGdCQUFnQixHQUFHLFdBQVcsR0FBRyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDMUUsT0FBTztRQUNMLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTztRQUMzQixNQUFNLEVBQUUsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUM7S0FDakUsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEdBQWdCO0lBQ25ELGtCQUFrQixFQUFFLENBQUM7SUFDckIsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELENBQUMsQ0FBQztJQUNoRixDQUFDO0lBQ0QsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMvRCxPQUFPO1FBQ0wsS0FBSyxFQUFFLENBQUM7UUFDUixVQUFVLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUM3QixDQUFDLEVBQUUsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUIsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0MsV0FBVyxFQUFFLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDMUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxHQUFnQixFQUFFLEtBQWU7SUFDN0Qsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEdBQUcsRUFBRTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUMvRixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEQsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckQsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBdUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN0RixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsUUFBeUIsRUFDekIsTUFBa0QsRUFDbEQsU0FBb0QsRUFBRTtJQUV0RCxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksS0FBSyxTQUFTO1FBQ2hELENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUs7UUFDdkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEIsTUFBTSxZQUFZLEdBQXdCO1FBQ3hDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztRQUNyQixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDWCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDNUMsQ0FBQztJQUNGLE9BQU87UUFDTCxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUU7UUFDZixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsWUFBWTtRQUNaLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUU7UUFDL0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdELEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZELEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0UsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEtBQUssU0FBUztZQUN2QyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRTtZQUM3QyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLEdBQUcsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRixHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9FLEdBQUcsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNsRyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgQ29udGludW91c0NvbHVtbk1ldGEsXG4gIE5PX0NBVEVHT1JZLFxuICBTcGF0aWFsQ29sdW1uLFxuICBTcGF0aWFsQ29sdW1uTWV0YSxcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxEZW5zaXR5TWV0YSxcbiAgU3BhdGlhbERlbnNpdHlSYXN0ZXIsXG4gIFNwYXRpYWxFbWJlZGRpbmcsXG4gIFNwYXRpYWxFbWJlZGRpbmdNZXRhLFxuICBTcGF0aWFsRmVhdHVyZU1ldGEsXG4gIFNwYXRpYWxJbWFnZVJlZixcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgU3BhdGlhbFBvbHlnb25UaWxlLFxuICBTcGF0aWFsUG9seWdvblRpbGVzTWV0YSxcbiAgU3BhdGlhbFBvbHlnb25zLFxuICBTcGF0aWFsVHJhbnNjcmlwdEJpbnNNZXRhLFxuICBTcGF0aWFsVHJhbnNjcmlwdEJpbnNTdGF0dXMsXG4gIFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgU3BhdGlhbFRyYW5zY3JpcHRUaWxlc01ldGEsXG4gIFNwYXRpYWxWb2x1bWVNZXRhLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGUgd2lyZSBmb3JtYXQgdGhlIGJ1bmRsZWQgZXhhbXBsZSBzZXJ2ZXIgc3BlYWtzLCBhbmQgaXRzIGRlY29kZXJzLlxuICpcbiAqIFB1cmUgYnkgZGVzaWduIOKAlCBubyBBbmd1bGFyLCBubyBSeEpTLCBubyBIVFRQIOKAlCBzbyB0aGUgZm9ybWF0IGlzIHRlc3RhYmxlIG9uXG4gKiBpdHMgb3duIGFuZCByZXVzYWJsZSBieSBhbnkgdHJhbnNwb3J0IChgU3BhdGlhbERhdGFIdHRwU2VydmljZWAgaXMgb25lKS5cbiAqIE1pcnJvcnMgdGhlIHNwbGl0IGluIGBwbG90bHktdHJhY2UtYnVpbGRlcnMudHNgOiB0aGUgc2hhcGUgbGl2ZXMgaW4gYSBwdXJlXG4gKiBtb2R1bGUsIHRoZSBzZXJ2aWNlIGp1c3QgbW92ZXMgYnl0ZXMuXG4gKlxuICogV0hZIEJJTkFSWVxuICogLS0tLS0tLS0tLVxuICogVmVjdG9ycyBhcmUgb25lIGBGbG9hdDMyQXJyYXlgL2BVaW50MTZBcnJheWAgcGVyIHJlcXVlc3QsIGRlbGl2ZXJlZCBhcyByYXdcbiAqIGxpdHRsZS1lbmRpYW4gYnl0ZXMuIEpTT04gd291bGQgY29zdCB+OOKAkzEyw5cgdGhlIHNpemUgYW5kIGEgcGFyc2UgdGhhdFxuICogYWxsb2NhdGVzIG9uZSBKUyBudW1iZXIgcGVyIHZhbHVlOyBhIHR5cGVkLWFycmF5IHZpZXcgb3ZlciB0aGUgcmVzcG9uc2VcbiAqIGJ1ZmZlciBpcyB6ZXJvLWNvcHkgYW5kIHVwbG9hZHMgdG8gdGhlIEdQVSBkaXJlY3RseS5cbiAqXG4gKiBFTkRJQU5ORVNTXG4gKiAtLS0tLS0tLS0tXG4gKiBMaXR0bGUtZW5kaWFuLCBhc3NlcnRlZCBhdCBkZWNvZGUuIEV2ZXJ5IHBsYXRmb3JtIGEgYnJvd3NlciBydW5zIG9uIHRvZGF5IGlzXG4gKiBsaXR0bGUtZW5kaWFuLCBzbyBhIGBEYXRhVmlld2AgYnl0ZS1ieS1ieXRlIHJlYWQgd291bGQgY29zdCByZWFsIHRpbWUgZm9yIGFcbiAqIGNhc2UgdGhhdCBkb2VzIG5vdCBvY2N1ciDigJQgYnV0IGZhaWxpbmcgbG91ZGx5IGJlYXRzIHJlbmRlcmluZyB0cmFuc3Bvc2VkXG4gKiBnYXJiYWdlIGlmIGl0IGV2ZXIgZG9lcy5cbiAqXG4gKiBFTkRQT0lOVFMgKGJhc2UgPSB0aGUgc2VydmVyIHJvb3QpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBgYGBcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC9kYXRhc2V0cyAgICAgICAgICAgICAgLT4geyBkYXRhc2V0czogW3sgaWQsIG5hbWUsIGNvdW50IH1dIH1cbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L21hbmlmZXN0ICAgICAgICAgLT4gU3BhdGlhbE1hbmlmZXN0XG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9jb29yZHMgICAgICAgICAgIC0+IGYzMltOXSB4LCBmMzJbTl0geSwgZjMyW05dIHo/XG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9yYWRpdXMgICAgICAgICAgIC0+IGYzMltOXSAgICAgICAgICAgKHBlci1vYnNlcnZhdGlvbiByYWRpdXMgb25seSlcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2lkcyAgICAgICAgICAgICAgLT4geyBpZHM6IHN0cmluZ1tdIH0gKGhhc0lkcyBvbmx5KVxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vY29sdW1uL3tuYW1lfSAgICAtPiB1MTZbTl0gY29kZXMgfCBmMzJbTl0gdmFsdWVzXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9mZWF0dXJlL3tuYW1lfSAgIC0+IGYzMltOXVxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vZmVhdHVyZXM/cT0mbGltaXQ9IC0+IHsgbmFtZXM6IHN0cmluZ1tdIH1cbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L3BvbHlnb25zICAgICAgICAgLT4gdTMyIGNvdW50LCB1MzJbY291bnQrMV0gb2Zmc2V0cywgZjMyWzIqcmluZ3NdIGNvb3Jkc1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vcG9seWdvbi10aWxlL3tzZXR9L3tsZXZlbH0ve2d4fS97Z3l9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHUzMiBjb3VudCwgdTMyW2NvdW50XSBvYnMsIHUzMltjb3VudCsxXSBvZmZzZXRzLCBmMzIgY29vcmRzXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS90cmFuc2NyaXB0LXRpbGUve2xldmVsfS97Z3h9L3tneX0/Z2VuZXM9QSxCJnF1YWxpdHk9aGlnaHxhbGxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gc2VlIGRlY29kZVRyYW5zY3JpcHRUaWxlXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9kZW5zaXR5P2dlbmVzPUEsQiAtPiBmMzJbcm93cypjb2xzXVxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vdHJhbnNjcmlwdC1iaW5zL3tsZXZlbH0ve3R4fS97dHl9XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHRyYW5zY3JpcHQtdGlsZSBsYXlvdXQsIG9uZSBlbnRyeSBwZXIgYmluXG4gKiBgYGBcbiAqXG4gKiBUaGUgdGhyZWUgdGlsZWQgcm91dGVzIGFyZSBvcHRpb25hbCBhbmQgYWR2ZXJ0aXNlZCBpbiB0aGUgbWFuaWZlc3RcbiAqIChgcG9seWdvblRpbGVzYCwgYHRyYW5zY3JpcHRUaWxlc2AsIGBkZW5zaXR5YCk7IGEgc2VydmVyIHdpdGhvdXQgdGhlbSBuZXZlclxuICogc2VlcyB0aGVtIHJlcXVlc3RlZC5cbiAqL1xuXG4vKiogQnVtcGVkIHdoZW4gdGhlIGxheW91dCBjaGFuZ2VzIGluY29tcGF0aWJseTsgdGhlIGNsaWVudCByZWZ1c2VzIGFueXRoaW5nIGVsc2UuICovXG5leHBvcnQgY29uc3QgU1BBVElBTF9XSVJFX1ZFUlNJT04gPSAxO1xuXG4vKiogUGVyLW9ic2VydmF0aW9uIG1hcmtlciByYWRpdXM6IG9uZSBzaGFyZWQgdmFsdWUsIG9yIGEgc2VydmVkIGYzMiB2ZWN0b3IuICovXG5leHBvcnQgdHlwZSBTcGF0aWFsUmFkaXVzU3BlYyA9XG4gIHwgeyBtb2RlOiAndW5pZm9ybSc7IHZhbHVlOiBudW1iZXIgfVxuICB8IHsgbW9kZTogJ3Blci1vYnNlcnZhdGlvbicgfTtcblxuLyoqIGBHRVQgL3NwYXRpYWwve2lkfS9tYW5pZmVzdGAg4oCUIGV2ZXJ5dGhpbmcgY2hlYXAgZW5vdWdoIHRvIHNlbmQgdXAgZnJvbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxNYW5pZmVzdCB7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogTiDigJQgb2JzZXJ2YXRpb24gY291bnQ7IGV2ZXJ5IHNlcnZlZCB2ZWN0b3IgaGFzIGV4YWN0bHkgdGhpcyBsZW5ndGguICovXG4gIGNvdW50OiBudW1iZXI7XG4gIGhhc1o/OiBib29sZWFuO1xuICBoYXNJZHM/OiBib29sZWFuO1xuICByYWRpdXM/OiBTcGF0aWFsUmFkaXVzU3BlYztcbiAgY29sdW1uczogU3BhdGlhbENvbHVtbk1ldGFbXTtcbiAgZmVhdHVyZXM/OiBTcGF0aWFsRmVhdHVyZU1ldGE7XG4gIHBvbHlnb25zPzogeyBjb3VudDogbnVtYmVyIH07XG4gIGltYWdlUmVmPzogU3BhdGlhbEltYWdlUmVmO1xuICB2b2x1bWU/OiBTcGF0aWFsVm9sdW1lTWV0YTtcbiAgZW1iZWRkaW5ncz86IFNwYXRpYWxFbWJlZGRpbmdNZXRhW107XG4gIG1pY3JvbnNQZXJVbml0PzogbnVtYmVyO1xuICBwb2x5Z29uVGlsZXM/OiBTcGF0aWFsUG9seWdvblRpbGVzTWV0YTtcbiAgdHJhbnNjcmlwdFRpbGVzPzogU3BhdGlhbFRyYW5zY3JpcHRUaWxlc01ldGE7XG4gIGRlbnNpdHk/OiBTcGF0aWFsRGVuc2l0eU1ldGE7XG4gIHRyYW5zY3JpcHRCaW5zPzogU3BhdGlhbFRyYW5zY3JpcHRCaW5zTWV0YTtcbiAgdHJhbnNjcmlwdEJpbnNTdGF0dXM/OiBTcGF0aWFsVHJhbnNjcmlwdEJpbnNTdGF0dXM7XG59XG5cbi8qKiBgR0VUIC9zcGF0aWFsL2RhdGFzZXRzYCAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsRGF0YXNldFN1bW1hcnkge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbi8qKiBUcnVlIG9uIGEgbGl0dGxlLWVuZGlhbiBob3N0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCk6IGJvb2xlYW4ge1xuICBjb25zdCBwcm9iZSA9IG5ldyBVaW50MTZBcnJheShbMV0pO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocHJvYmUuYnVmZmVyKVswXSA9PT0gMTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0TGl0dGxlRW5kaWFuKCk6IHZvaWQge1xuICBpZiAoIWlzTGl0dGxlRW5kaWFuKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnW3NwYXRpYWxdIHdpcmUgZm9ybWF0IGlzIGxpdHRsZS1lbmRpYW47IHRoaXMgcGxhdGZvcm0gaXMgYmlnLWVuZGlhbi4gJyArXG4gICAgICAnU2VydmUgSlNPTiB2ZWN0b3JzLCBvciBieXRlLXN3YXAgaW4gYSBjdXN0b20gU3BhdGlhbERhdGFQb3J0IGFkYXB0ZXIuJyxcbiAgICApO1xuICB9XG59XG5cbi8qKiBHdWFyZCBhIGRlY29kZSBhZ2FpbnN0IGEgdHJ1bmNhdGVkIG9yIG92ZXJzaXplZCByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIGFzc2VydEJ5dGVMZW5ndGgoYnVmOiBBcnJheUJ1ZmZlciwgZXhwZWN0ZWQ6IG51bWJlciwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCAhPT0gZXhwZWN0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgW3NwYXRpYWxdICR7d2hhdH06IGV4cGVjdGVkICR7ZXhwZWN0ZWR9IGJ5dGVzLCBnb3QgJHtidWYuYnl0ZUxlbmd0aH0uIGAgK1xuICAgICAgJ01hbmlmZXN0IGNvdW50IGFuZCBzZXJ2ZWQgdmVjdG9yIGxlbmd0aCBkaXNhZ3JlZS4nLFxuICAgICk7XG4gIH1cbn1cblxuLyoqIFJlamVjdCBhIG1hbmlmZXN0IHRoaXMgY2xpZW50IGNhbm5vdCByZWFkLCB3aXRoIGEgbWVzc2FnZSBuYW1pbmcgdGhlIGZpeC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNYW5pZmVzdFZlcnNpb24obWFuaWZlc3Q6IFNwYXRpYWxNYW5pZmVzdCk6IHZvaWQge1xuICBpZiAobWFuaWZlc3QudmVyc2lvbiAhPT0gU1BBVElBTF9XSVJFX1ZFUlNJT04pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgW3NwYXRpYWxdIHVuc3VwcG9ydGVkIHdpcmUgdmVyc2lvbiAke21hbmlmZXN0LnZlcnNpb259IGAgK1xuICAgICAgYCh0aGlzIGNsaWVudCBzcGVha3MgJHtTUEFUSUFMX1dJUkVfVkVSU0lPTn0pLiBVcGRhdGUgdGhlIHNlcnZlciBvciB0aGUgbGlicmFyeS5gLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBgR0VUIC9jb29yZHNgIOKGkiB4L3koL3opLiBPbmUgcmVxdWVzdCByYXRoZXIgdGhhbiB0d28gb3IgdGhyZWU6IHRoZSB2ZWN0b3JzXG4gKiBhcmUgYWx3YXlzIGZldGNoZWQgdG9nZXRoZXIsIGFuZCBhIHNpbmdsZSByZXNwb25zZSBrZWVwcyB0aGVtIGNvbnNpc3RlbnQgaWZcbiAqIHRoZSBkYXRhc2V0IGNoYW5nZXMgdW5kZXJuZWF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUNvb3JkcyhcbiAgYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlciwgaGFzWiA9IGZhbHNlLFxuKTogUGljazxTcGF0aWFsT2JzZXJ2YXRpb25zLCAneCcgfCAneScgfCAneic+IHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGNvbnN0IGF4ZXMgPSBoYXNaID8gMyA6IDI7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb3VudCAqIGF4ZXMgKiA0LCAnY29vcmRzJyk7XG4gIGNvbnN0IHggPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpO1xuICBjb25zdCB5ID0gbmV3IEZsb2F0MzJBcnJheShidWYsIGNvdW50ICogNCwgY291bnQpO1xuICBjb25zdCB6ID0gaGFzWiA/IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDgsIGNvdW50KSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgeCwgeSwgeiB9O1xufVxuXG4vKiogYEdFVCAvcmFkaXVzYCDihpIgcGVyLW9ic2VydmF0aW9uIHJhZGlpIGluIGltYWdlIHBpeGVscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVSYWRpdXMoYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiA0LCAncmFkaXVzJyk7XG4gIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpO1xufVxuXG4vKiogYEdFVCAvZmVhdHVyZS97bmFtZX1gIOKGkiBvbmUgZ2VuZSdzIGV4cHJlc3Npb24gdmVjdG9yLiAqL1xuLyoqXG4gKiBgR0VUIC9zcGF0aWFsL3tpZH0vZW1iZWRkaW5nL3tuYW1lfWAg4oCUIG9uZSBwbGFuZSBwZXIgZGltZW5zaW9uLCBzYW1lIGxheW91dCBhcyBjb29yZHMuXG4gKlxuICogU3RydWN0IG9mIGFycmF5cywgbm90IGludGVybGVhdmVkOiBldmVyeSBkaW1lbnNpb24gaXMgY29udGlndW91cywgc28gYW4gYXhpcyBjYW4gYmUgaGFuZGVkIHRvXG4gKiB0aGUgcmVuZGVyZXIgYXMgYSB2aWV3IHdpdGggbm8gY29weSBhbmQgbm8gc3RyaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRW1iZWRkaW5nKFxuICBidWY6IEFycmF5QnVmZmVyLCBtZXRhOiBTcGF0aWFsRW1iZWRkaW5nTWV0YSwgY291bnQ6IG51bWJlcixcbik6IFNwYXRpYWxFbWJlZGRpbmcge1xuICBhc3NlcnRMaXR0bGVFbmRpYW4oKTtcbiAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogbWV0YS5kaW1zICogNCwgYGVtYmVkZGluZyBcIiR7bWV0YS5uYW1lfVwiYCk7XG4gIHJldHVybiB7XG4gICAgbWV0YSxcbiAgICB4OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpLFxuICAgIHk6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDQsIGNvdW50KSxcbiAgICAuLi4obWV0YS5kaW1zID09PSAzID8geyB6OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgY291bnQgKiA4LCBjb3VudCkgfSA6IHt9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZlYXR1cmVWZWN0b3IoYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiA0LCAnZmVhdHVyZSB2ZWN0b3InKTtcbiAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCk7XG59XG5cbi8qKlxuICogYEdFVCAvY29sdW1uL3tuYW1lfWAg4oaSIGEgbG9hZGVkIGNvbHVtbiwgdHlwZWQgYnkgaXRzIGRlc2NyaXB0b3I6IGB1MTZgIGNvZGVzXG4gKiBmb3IgYSBjYXRlZ29yaWNhbCwgYGYzMmAgdmFsdWVzIGZvciBhIGNvbnRpbnVvdXMuIENvZGVzIG91dHNpZGUgdGhlIGNhdGVnb3J5XG4gKiBsaXN0IGFyZSBub3JtYWxpc2VkIHRvIHtAbGluayBOT19DQVRFR09SWX0gc28gYSByZW5kZXJlciBjYW4gdHJ1c3QgdGhlXG4gKiBpbnZhcmlhbnQgaW5zdGVhZCBvZiBib3VuZHMtY2hlY2tpbmcgZXZlcnkgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb2x1bW4oXG4gIGJ1ZjogQXJyYXlCdWZmZXIsIG1ldGE6IFNwYXRpYWxDb2x1bW5NZXRhLCBjb3VudDogbnVtYmVyLFxuKTogU3BhdGlhbENvbHVtbiB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAobWV0YS5raW5kID09PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogMiwgYGNvbHVtbiBcIiR7bWV0YS5uYW1lfVwiYCk7XG4gICAgY29uc3QgY29kZXMgPSBuZXcgVWludDE2QXJyYXkoYnVmLCAwLCBjb3VudCk7XG4gICAgY29uc3QgbiA9IChtZXRhIGFzIENhdGVnb3JpY2FsQ29sdW1uTWV0YSkuY2F0ZWdvcmllcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNvZGVzW2ldID49IG4pIGNvZGVzW2ldID0gTk9fQ0FURUdPUlk7XG4gICAgfVxuICAgIHJldHVybiB7IG1ldGE6IG1ldGEgYXMgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLCBjb2RlcyB9O1xuICB9XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb3VudCAqIDQsIGBjb2x1bW4gXCIke21ldGEubmFtZX1cImApO1xuICByZXR1cm4geyBtZXRhOiBtZXRhIGFzIENvbnRpbnVvdXNDb2x1bW5NZXRhLCB2YWx1ZXM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCkgfTtcbn1cblxuLyoqXG4gKiBgR0VUIC9wb2x5Z29uc2Ag4oaSIGJvdW5kYXJ5IHJpbmdzLiBMYXlvdXQgaXNcbiAqIGBbdTMyIGNvdW50XVt1MzIgb2Zmc2V0cyDDlyAoY291bnQrMSldW2YzMiBjb29yZHMgw5cgMsK3b2Zmc2V0c1tjb3VudF1dYDsgZXZlcnlcbiAqIGZpZWxkIGlzIDQtYnl0ZSB3aWRlIHNvIGVhY2ggdHlwZWQtYXJyYXkgdmlldyBzdGF5cyBhbGlnbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUG9seWdvbnMoYnVmOiBBcnJheUJ1ZmZlcik6IFNwYXRpYWxQb2x5Z29ucyB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCA4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gcG9seWdvbnM6IHJlc3BvbnNlIHRvbyBzaG9ydCBmb3IgYSBoZWFkZXInKTtcbiAgfVxuICBjb25zdCBjb3VudCA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDEpWzBdO1xuICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGJ1ZiwgNCwgY291bnQgKyAxKTtcbiAgY29uc3QgdmVydGV4Q291bnQgPSBvZmZzZXRzW2NvdW50XTtcbiAgY29uc3QgY29vcmRzQnl0ZU9mZnNldCA9IDQgKyAoY291bnQgKyAxKSAqIDQ7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb29yZHNCeXRlT2Zmc2V0ICsgdmVydGV4Q291bnQgKiAyICogNCwgJ3BvbHlnb25zJyk7XG4gIGNvbnN0IGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb29yZHNCeXRlT2Zmc2V0LCB2ZXJ0ZXhDb3VudCAqIDIpO1xuICByZXR1cm4geyBjb29yZHMsIG9mZnNldHMsIGNvdW50IH07XG59XG5cbi8qKlxuICogYEdFVCAvcG9seWdvbi10aWxlLy4uLmAg4oaSIG9uZSB0aWxlIG9mIHJpbmdzIHdpdGggdGhlaXIgb3duaW5nIG9ic2VydmF0aW9ucy4gTGF5b3V0XG4gKiBgW3UzMiBjb3VudF1bdTMyIG9icyDDlyBjb3VudF1bdTMyIG9mZnNldHMgw5cgKGNvdW50KzEpXVtmMzIgY29vcmRzIMOXIDLCt29mZnNldHNbY291bnRdXWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQb2x5Z29uVGlsZShidWY6IEFycmF5QnVmZmVyKTogU3BhdGlhbFBvbHlnb25UaWxlIHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCA8IDgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1tzcGF0aWFsXSBwb2x5Z29uIHRpbGU6IHJlc3BvbnNlIHRvbyBzaG9ydCBmb3IgYSBoZWFkZXInKTtcbiAgfVxuICBjb25zdCBjb3VudCA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDEpWzBdO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShidWYsIDQsIGNvdW50KTtcbiAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShidWYsIDQgKyBjb3VudCAqIDQsIGNvdW50ICsgMSk7XG4gIGNvbnN0IHZlcnRleENvdW50ID0gb2Zmc2V0c1tjb3VudF07XG4gIGNvbnN0IGNvb3Jkc0J5dGVPZmZzZXQgPSA0ICsgY291bnQgKiA0ICsgKGNvdW50ICsgMSkgKiA0O1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY29vcmRzQnl0ZU9mZnNldCArIHZlcnRleENvdW50ICogOCwgJ3BvbHlnb24gdGlsZScpO1xuICByZXR1cm4ge1xuICAgIGNvdW50LCBvYnNlcnZhdGlvbiwgb2Zmc2V0cyxcbiAgICBjb29yZHM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb29yZHNCeXRlT2Zmc2V0LCB2ZXJ0ZXhDb3VudCAqIDIpLFxuICB9O1xufVxuXG4vKipcbiAqIGBHRVQgL3RyYW5zY3JpcHQtdGlsZS8uLi5gIOKGkiB0cmFuc2NyaXB0cyBvciBhZ2dyZWdhdGVzLiBMYXlvdXQsIDQtYnl0ZSBhbGlnbmVkOlxuICogYFt1MzIgbl1bdTMyIGZsYWdzXVtmMzIgeMK3bl1bZjMyIHnCt25dW2YzMiB6wrduXVt1MzIgd2VpZ2h0wrduXVt1MzIgb2JzwrduXVt1MTYgZ2VuZcK3biwgcGFkZGVkXWA7XG4gKiBmbGFncyBiaXQgMCBtYXJrcyBhbiBhZ2dyZWdhdGVkIGxldmVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVHJhbnNjcmlwdFRpbGUoYnVmOiBBcnJheUJ1ZmZlcik6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCA4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gdHJhbnNjcmlwdCB0aWxlOiByZXNwb25zZSB0b28gc2hvcnQgZm9yIGEgaGVhZGVyJyk7XG4gIH1cbiAgY29uc3QgW24sIGZsYWdzXSA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDIpO1xuICBjb25zdCBnZW5lUGFkID0gTWF0aC5jZWlsKChuICogMikgLyA0KSAqIDQ7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCA4ICsgbiAqIDIwICsgZ2VuZVBhZCwgJ3RyYW5zY3JpcHQgdGlsZScpO1xuICByZXR1cm4ge1xuICAgIGNvdW50OiBuLFxuICAgIGFnZ3JlZ2F0ZWQ6IChmbGFncyAmIDEpID09PSAxLFxuICAgIHg6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCA4LCBuKSxcbiAgICB5OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgOCArIG4gKiA0LCBuKSxcbiAgICB6OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgOCArIG4gKiA4LCBuKSxcbiAgICB3ZWlnaHQ6IG5ldyBVaW50MzJBcnJheShidWYsIDggKyBuICogMTIsIG4pLFxuICAgIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkoYnVmLCA4ICsgbiAqIDE2LCBuKSxcbiAgICBnZW5lOiBuZXcgVWludDE2QXJyYXkoYnVmLCA4ICsgbiAqIDIwLCBuKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBgR0VUIC9kZW5zaXR5P2dlbmVzPSZiaW49YCDihpIgdGhlIHN1bW1lZCByYXN0ZXIuIExheW91dFxuICogYFt1MzIgcm93c11bdTMyIGNvbHNdW2YzMiBjZWxsV11bZjMyIGNlbGxIXVtmMzIgb3JpZ2luWF1bZjMyIG9yaWdpblldW2YzMiByb3dzwrdjb2xzXWA6XG4gKiB0aGUgZ2VvbWV0cnkgdHJhdmVscyB3aXRoIHRoZSB2YWx1ZXMgYmVjYXVzZSByZS1iaW5uaW5nIGNoYW5nZXMgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVEZW5zaXR5KGJ1ZjogQXJyYXlCdWZmZXIsIGdlbmVzOiBzdHJpbmdbXSk6IFNwYXRpYWxEZW5zaXR5UmFzdGVyIHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCA8IDI0KSB0aHJvdyBuZXcgRXJyb3IoJ1tzcGF0aWFsXSBkZW5zaXR5OiByZXNwb25zZSB0b28gc2hvcnQgZm9yIGEgaGVhZGVyJyk7XG4gIGNvbnN0IFtyb3dzLCBjb2xzXSA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDIpO1xuICBjb25zdCBbY3csIGNoLCBveCwgb3ldID0gbmV3IEZsb2F0MzJBcnJheShidWYsIDgsIDQpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgMjQgKyByb3dzICogY29scyAqIDQsICdkZW5zaXR5Jyk7XG4gIGNvbnN0IG1ldGE6IFNwYXRpYWxEZW5zaXR5TWV0YSA9IHsgcm93cywgY29scywgZ3JpZFNpemU6IFtjdywgY2hdLCBvcmlnaW46IFtveCwgb3ldIH07XG4gIHJldHVybiB7IG1ldGEsIGdlbmVzLCB2YWx1ZXM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAyNCwgcm93cyAqIGNvbHMpIH07XG59XG5cbi8qKlxuICogRm9sZCBhIG1hbmlmZXN0IHBsdXMgaXRzIGZldGNoZWQgY29vcmRpbmF0ZS9pZC9yYWRpdXMgdmVjdG9ycyBpbnRvIHRoZVxuICogbGlicmFyeS1mYWNpbmcge0BsaW5rIFNwYXRpYWxEYXRhc2V0fS4gQ29sdW1uIGFuZCBmZWF0dXJlICp2YWx1ZXMqIGFyZSBub3RcbiAqIHBhcnQgb2YgdGhpcyDigJQgdGhleSBzdGF5IGxhenkgYmVoaW5kIHRoZSBwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YXNldEZyb21NYW5pZmVzdChcbiAgbWFuaWZlc3Q6IFNwYXRpYWxNYW5pZmVzdCxcbiAgY29vcmRzOiBQaWNrPFNwYXRpYWxPYnNlcnZhdGlvbnMsICd4JyB8ICd5JyB8ICd6Jz4sXG4gIGV4dHJhczogeyBpZHM/OiBzdHJpbmdbXTsgcmFkaXVzPzogRmxvYXQzMkFycmF5IH0gPSB7fSxcbik6IFNwYXRpYWxEYXRhc2V0IHtcbiAgYXNzZXJ0TWFuaWZlc3RWZXJzaW9uKG1hbmlmZXN0KTtcbiAgY29uc3QgcmFkaXVzID0gbWFuaWZlc3QucmFkaXVzPy5tb2RlID09PSAndW5pZm9ybSdcbiAgICA/IG1hbmlmZXN0LnJhZGl1cy52YWx1ZVxuICAgIDogZXh0cmFzLnJhZGl1cztcbiAgY29uc3Qgb2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zID0ge1xuICAgIGNvdW50OiBtYW5pZmVzdC5jb3VudCxcbiAgICB4OiBjb29yZHMueCxcbiAgICB5OiBjb29yZHMueSxcbiAgICAuLi4oY29vcmRzLnogPyB7IHo6IGNvb3Jkcy56IH0gOiB7fSksXG4gICAgLi4uKGV4dHJhcy5pZHMgPyB7IGlkczogZXh0cmFzLmlkcyB9IDoge30pLFxuICAgIC4uLihyYWRpdXMgIT09IHVuZGVmaW5lZCA/IHsgcmFkaXVzIH0gOiB7fSksXG4gIH07XG4gIHJldHVybiB7XG4gICAgaWQ6IG1hbmlmZXN0LmlkLFxuICAgIG5hbWU6IG1hbmlmZXN0Lm5hbWUsXG4gICAgb2JzZXJ2YXRpb25zLFxuICAgIGNvbHVtbnM6IG1hbmlmZXN0LmNvbHVtbnMgPz8gW10sXG4gICAgLi4uKG1hbmlmZXN0LmZlYXR1cmVzID8geyBmZWF0dXJlczogbWFuaWZlc3QuZmVhdHVyZXMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QucG9seWdvbnMgPyB7IHBvbHlnb25zOiBtYW5pZmVzdC5wb2x5Z29ucyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5pbWFnZVJlZiA/IHsgaW1hZ2VSZWY6IG1hbmlmZXN0LmltYWdlUmVmIH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnZvbHVtZSA/IHsgdm9sdW1lOiBtYW5pZmVzdC52b2x1bWUgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QuZW1iZWRkaW5ncz8ubGVuZ3RoID8geyBlbWJlZGRpbmdzOiBtYW5pZmVzdC5lbWJlZGRpbmdzIH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0Lm1pY3JvbnNQZXJVbml0ICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBtaWNyb25zUGVyVW5pdDogbWFuaWZlc3QubWljcm9uc1BlclVuaXQgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnBvbHlnb25UaWxlcyA/IHsgcG9seWdvblRpbGVzOiBtYW5pZmVzdC5wb2x5Z29uVGlsZXMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QudHJhbnNjcmlwdFRpbGVzID8geyB0cmFuc2NyaXB0VGlsZXM6IG1hbmlmZXN0LnRyYW5zY3JpcHRUaWxlcyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5kZW5zaXR5ID8geyBkZW5zaXR5OiBtYW5pZmVzdC5kZW5zaXR5IH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnRyYW5zY3JpcHRCaW5zID8geyB0cmFuc2NyaXB0QmluczogbWFuaWZlc3QudHJhbnNjcmlwdEJpbnMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QudHJhbnNjcmlwdEJpbnNTdGF0dXMgPyB7IHRyYW5zY3JpcHRCaW5zU3RhdHVzOiBtYW5pZmVzdC50cmFuc2NyaXB0Qmluc1N0YXR1cyB9IDoge30pLFxuICB9O1xufVxuIl19