@smarterplan/ngx-smarterplan-core 1.4.19 → 1.4.21

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/helpers.service.mjs +28 -2
  2. package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +28 -7
  3. package/esm2022/lib/services/filter.service.mjs +8 -3
  4. package/esm2022/lib/services/matterport-object3d.service.mjs +657 -133
  5. package/esm2022/lib/services/matterport.service.mjs +330 -9
  6. package/esm2022/lib/services/models/base-object.service.mjs +10 -9
  7. package/esm2022/lib/services/models/equipment.service.mjs +27 -2
  8. package/esm2022/lib/services/models/feature.service.mjs +14 -1
  9. package/esm2022/lib/services/models/measurement.service.mjs +17 -1
  10. package/esm2022/lib/services/sweep-locator.service.mjs +114 -0
  11. package/esm2022/lib/services/threejs.service.mjs +840 -35
  12. package/esm2022/lib/services/utils/matterport-framing.util.mjs +63 -0
  13. package/esm2022/lib/services/viewer.service.mjs +193 -10
  14. package/esm2022/lib/types.service.mjs +3 -1
  15. package/esm2022/public-api.mjs +2 -1
  16. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +2886 -776
  17. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  18. package/lib/helpers.service.d.ts +17 -0
  19. package/lib/services/matterport-object3d.service.d.ts +125 -5
  20. package/lib/services/matterport.service.d.ts +106 -7
  21. package/lib/services/models/base-object.service.d.ts +3 -4
  22. package/lib/services/models/measurement.service.d.ts +1 -0
  23. package/lib/services/sweep-locator.service.d.ts +54 -0
  24. package/lib/services/threejs.service.d.ts +304 -10
  25. package/lib/services/utils/matterport-framing.util.d.ts +40 -0
  26. package/lib/services/viewer.service.d.ts +87 -2
  27. package/lib/types.service.d.ts +42 -1
  28. package/package.json +1 -1
  29. package/public-api.d.ts +1 -0
@@ -9,18 +9,20 @@ import { ViewerInteractions, PoiType, SpModule, } from '../types.service';
9
9
  import { makeSecurityCamera, securityCameraType } from "../matterport-extensions/security-camera/SecurityCamera";
10
10
  import { ViewFrustumMeshType, makeViewFrustumMesh } from "../matterport-extensions/view-frustum-mesh/ViewFrustumMesh";
11
11
  import { getSignedFile } from './s3.service';
12
- import { parseThreeJsPlacement } from '../helpers.service';
12
+ import { getThreeJsPoiOrigin, parseThreeJsPlacement, THREEJS_MODEL_UP_OPTIONS } from '../helpers.service';
13
13
  import * as i0 from "@angular/core";
14
14
  import * as i1 from "./models/poi.service";
15
15
  import * as i2 from "./matterport.service";
16
16
  import * as i3 from "./threejs.service";
17
- import * as i4 from "../config";
17
+ import * as i4 from "./sweep-locator.service";
18
+ import * as i5 from "../config";
18
19
  export class ViewerService {
19
20
  sdkKey;
20
21
  config;
21
22
  poiService;
22
23
  matterportService;
23
24
  threeJsService;
25
+ sweepLocator;
24
26
  viewerMode = 'Matterport';
25
27
  currentModel3D;
26
28
  tourUrl;
@@ -36,6 +38,20 @@ export class ViewerService {
36
38
  * lists that feed tags are exactly that.
37
39
  */
38
40
  currentSpaceID = null;
41
+ /**
42
+ * The Three.js capture on screen, or null in Matterport.
43
+ *
44
+ * A space can hold several 3D models. A tag placed in one is recorded with it, so that model
45
+ * keeps showing the tag whatever selection of tags it is otherwise restricted to.
46
+ */
47
+ currentCaptureID = null;
48
+ /**
49
+ * Whether the 3D model on screen has been calibrated against the tags' shared space.
50
+ *
51
+ * Calibrating is what says the model and that space overlap. Until then a tag placed in the model
52
+ * is in the model's own coordinates: it belongs to no Matterport sweep and to no other visit.
53
+ */
54
+ threeJsCalibrated = false;
39
55
  sweepToMove;
40
56
  rotationToMove;
41
57
  goToTriggered = new Subject();
@@ -64,12 +80,13 @@ export class ViewerService {
64
80
  },
65
81
  };
66
82
  isObjectLoaded = false;
67
- constructor(sdkKey, config, poiService, matterportService, threeJsService) {
83
+ constructor(sdkKey, config, poiService, matterportService, threeJsService, sweepLocator) {
68
84
  this.sdkKey = sdkKey;
69
85
  this.config = config;
70
86
  this.poiService = poiService;
71
87
  this.matterportService = matterportService;
72
88
  this.threeJsService = threeJsService;
89
+ this.sweepLocator = sweepLocator;
73
90
  this.setMode('Matterport');
74
91
  }
75
92
  /*-----------------------------------------------------------------------------------------------------------------
@@ -275,14 +292,77 @@ export class ViewerService {
275
292
  if (![position?.x, position?.y, position?.z].every((value) => typeof value === 'number')) {
276
293
  return;
277
294
  }
295
+ const origin = getThreeJsPoiOrigin(poi);
278
296
  this.threeJsService.upsertTag({
279
297
  id: object.id,
280
298
  position,
281
299
  poiType: poi.type,
282
300
  label: object.name ?? object.title ?? null,
283
301
  iconUrl: await this.resolveTagIconUrl(poi),
302
+ originCaptureID: origin?.captureID ?? null,
303
+ frame: origin?.frame ?? null,
284
304
  });
285
305
  }
306
+ /**
307
+ * Stores the tags the last calibration had to rewrite, and returns how many it could not.
308
+ *
309
+ * Calibrating keeps the tags placed in this model where they are by changing their coordinates
310
+ * rather than their place (see ThreeJsService.applyAlignmentKeepingOwnTags). The scene already
311
+ * shows the result; this writes it down. Call it once the calibration itself is stored - with the
312
+ * old calibration still on record, the old coordinates are the ones that match it.
313
+ */
314
+ async persistRebasedThreeJsTags() {
315
+ const rebased = this.threeJsService.takeRebasedTags();
316
+ let failed = 0;
317
+ await Promise.all(rebased.map(async (tag) => {
318
+ try {
319
+ const poi = await this.poiService.getPoiByElementId(tag.id);
320
+ if (!poi?.id) {
321
+ return;
322
+ }
323
+ let metadata = {};
324
+ try {
325
+ metadata = (poi.metadata ? JSON.parse(poi.metadata) : {}) ?? {};
326
+ }
327
+ catch {
328
+ metadata = {};
329
+ }
330
+ // In the shared space from here on, so no longer marked as being in the model's own.
331
+ delete metadata.frame;
332
+ if (metadata.normal) {
333
+ metadata.normal = tag.rotateDirection(metadata.normal);
334
+ }
335
+ if (this.currentCaptureID) {
336
+ metadata.captureID = this.currentCaptureID;
337
+ }
338
+ await this.poiService.updatePoi({
339
+ id: poi.id,
340
+ coordinate: JSON.stringify(tag.position),
341
+ metadata: JSON.stringify(metadata),
342
+ // Its place in the tour may have changed with its coordinates - or it may have one for
343
+ // the first time, now that the model is calibrated.
344
+ matterportSweepID: await this.findNearestSweepForThreeJs(tag.position),
345
+ });
346
+ }
347
+ catch (error) {
348
+ failed += 1;
349
+ console.warn(`ViewerService: could not store the new coordinates of tag ${tag.id}`, error);
350
+ }
351
+ }));
352
+ return { stored: rebased.length - failed, failed };
353
+ }
354
+ /** How many tags the calibration walkthrough could still use: the ones from elsewhere. */
355
+ getThreeJsCalibrationCandidateCount() {
356
+ return this.checkMode('threejs') ? this.threeJsService.getCalibrationCandidateCount() : 0;
357
+ }
358
+ /** How many tags from elsewhere are not on the 3D model, and so are not shown on it. */
359
+ getThreeJsOffModelTagCount() {
360
+ return this.checkMode('threejs') ? this.threeJsService.getOffModelTagCount() : 0;
361
+ }
362
+ /** The tags registered in the Three.js scene, shown or not. */
363
+ getThreeJsTags() {
364
+ return this.checkMode('threejs') ? this.threeJsService.getTags() : [];
365
+ }
286
366
  /**
287
367
  * The image to draw a tag with, mirroring what Matterport shows for the same POI.
288
368
  *
@@ -375,6 +455,7 @@ export class ViewerService {
375
455
  if (!alignment) {
376
456
  return null;
377
457
  }
458
+ this.threeJsCalibrated = true;
378
459
  // Merged into whatever the capture already stores, so an existing camera placement survives.
379
460
  let stored = {};
380
461
  try {
@@ -429,7 +510,11 @@ export class ViewerService {
429
510
  if (!this.checkMode('threejs')) {
430
511
  return;
431
512
  }
432
- this.threeJsService.setTagAlignment(parseThreeJsPlacement(metadata)?.alignment ?? null);
513
+ const alignment = parseThreeJsPlacement(metadata)?.alignment ?? null;
514
+ this.threeJsCalibrated = !!alignment;
515
+ // Which tags were placed in this model is decided against the capture on screen.
516
+ this.threeJsService.setCurrentCapture(this.currentCaptureID);
517
+ this.threeJsService.setTagAlignment(alignment);
433
518
  }
434
519
  /**
435
520
  * Enable tag placement menu to add a new element depending on its type (TICKET, DATA, EQUIPMENT etc)
@@ -508,12 +593,106 @@ export class ViewerService {
508
593
  if (this.checkMode('Matterport')) {
509
594
  this.matterportService.action_toolbox_mesure();
510
595
  }
596
+ // Matterport's SDK brings its own measuring tool; the Three.js viewer has to provide one.
597
+ if (this.checkMode('threejs')) {
598
+ this.threeJsService.startMeasuring();
599
+ }
511
600
  }
512
601
  action_toolbox_cancel_mesure() {
513
602
  // Matterport
514
603
  if (this.checkMode('Matterport')) {
515
604
  this.matterportService.action_toolbox_cancel_mesure();
516
605
  }
606
+ if (this.checkMode('threejs')) {
607
+ this.threeJsService.cancelMeasuring();
608
+ // The toolbar toggles on this flag; left on, the next click would switch measuring "off"
609
+ // instead of starting a new one.
610
+ this.toolboxStates.mesure.stat = false;
611
+ }
612
+ }
613
+ /** While measuring in the Three.js viewer: points and segment lengths so far, null if abandoned. */
614
+ get threeJsMeasurementProgress$() {
615
+ return this.threeJsService.measurementProgress$;
616
+ }
617
+ /** Ends the Three.js measurement in progress, or returns null when it has fewer than two points. */
618
+ finishThreeJsMeasurement() {
619
+ if (!this.checkMode('threejs')) {
620
+ return null;
621
+ }
622
+ const measurement = this.threeJsService.finishMeasuring();
623
+ if (measurement) {
624
+ this.toolboxStates.mesure.stat = false;
625
+ }
626
+ return measurement;
627
+ }
628
+ /** The measurement last finished in the Three.js viewer, for the form that saves it. */
629
+ getThreeJsLastMeasurement() {
630
+ return this.checkMode('threejs') ? this.threeJsService.getLastMeasurement() : null;
631
+ }
632
+ /**
633
+ * The Matterport sweep nearest to a point picked in the Three.js viewer, or null.
634
+ *
635
+ * For callers that write their own POI, as the measurement form does - anything created through
636
+ * createPoiForThreeJsPlacement already gets this.
637
+ */
638
+ findNearestSweepForThreeJs(point) {
639
+ // An uncalibrated model's coordinates are its own. Measured against the Matterport sweeps they
640
+ // could land near one by coincidence, and the tag would turn up in the tour somewhere arbitrary.
641
+ if (!this.threeJsCalibrated) {
642
+ return Promise.resolve(null);
643
+ }
644
+ return this.sweepLocator.findNearestSweep(point, this.currentSpaceID);
645
+ }
646
+ /**
647
+ * The metadata a POI placed in the Three.js viewer is stored with: which 3D model it was placed
648
+ * in, and - when that model is not calibrated - that its coordinates are the model's own.
649
+ */
650
+ buildThreeJsPoiMetadata(extra = {}) {
651
+ return JSON.stringify({
652
+ ...extra,
653
+ ...(this.currentCaptureID ? { captureID: this.currentCaptureID } : {}),
654
+ ...(this.currentCaptureID && !this.threeJsCalibrated ? { frame: 'model' } : {}),
655
+ });
656
+ }
657
+ /** Which of the 3D model's axes is being treated as up. */
658
+ getThreeJsModelUp() {
659
+ return this.threeJsService.getModelUp();
660
+ }
661
+ /**
662
+ * Turns the 3D model to the next candidate for "which axis is up", and returns the capture
663
+ * metadata with that choice written in, for the caller to store.
664
+ *
665
+ * The vertical axis is worked out from the geometry when a model loads, and that can be wrong:
666
+ * a narrow corridor and a low slab are the same shape turned over. This is the way to correct it.
667
+ */
668
+ cycleThreeJsModelUp(existingMetadata) {
669
+ if (!this.checkMode('threejs')) {
670
+ return null;
671
+ }
672
+ const current = THREEJS_MODEL_UP_OPTIONS.indexOf(this.threeJsService.getModelUp());
673
+ const up = THREEJS_MODEL_UP_OPTIONS[(current + 1) % THREEJS_MODEL_UP_OPTIONS.length];
674
+ this.threeJsService.setModelUp(up);
675
+ let stored = {};
676
+ try {
677
+ stored = existingMetadata ? JSON.parse(existingMetadata) : {};
678
+ }
679
+ catch {
680
+ stored = {};
681
+ }
682
+ stored.up = up;
683
+ return { up, metadata: JSON.stringify(stored) };
684
+ }
685
+ /** Chooses the tag for the calibration pair being matched by id, instead of by clicking it. */
686
+ selectThreeJsAlignmentTag(elementId) {
687
+ return this.checkMode('threejs') && this.threeJsService.selectAlignmentTag(elementId);
688
+ }
689
+ /** How far the visible tags sit from the 3D model, in model radii. Null without both. */
690
+ getThreeJsTagDistanceFromModel() {
691
+ return this.checkMode('threejs') ? this.threeJsService.getTagDistanceFromModel() : null;
692
+ }
693
+ /** How many tags the Three.js scene is showing. */
694
+ getThreeJsTagCount() {
695
+ return this.checkMode('threejs') ? this.threeJsService.getTagCount() : 0;
517
696
  }
518
697
  async action_update_poi(poi, isValid, element) {
519
698
  if (this.checkMode('Matterport')) {
@@ -603,11 +782,15 @@ export class ViewerService {
603
782
  if (!placement || !element?.id) {
604
783
  return null;
605
784
  }
785
+ // Without a sweep the tag is left off everything on the Matterport side that is organised by
786
+ // sweep - the floor plan most visibly, which only draws tags whose sweep belongs to it.
787
+ const matterportSweepID = await this.findNearestSweepForThreeJs(placement.position);
606
788
  const poi = await this.poiService.createPOIForSpaceID({
607
789
  coordinate: JSON.stringify(placement.position),
608
790
  type: poiType,
609
791
  elementID: element.id,
610
- metadata: JSON.stringify({ normal: placement.normal }),
792
+ metadata: this.buildThreeJsPoiMetadata({ normal: placement.normal }),
793
+ ...(matterportSweepID ? { matterportSweepID } : {}),
611
794
  });
612
795
  // Draw it straight away rather than waiting for the next refresh, so the user sees where the
613
796
  // thing they just created ended up. Through the same path the refresh uses, so it arrives with
@@ -737,7 +920,7 @@ export class ViewerService {
737
920
  const placement = parseThreeJsPlacement(placementMetadata);
738
921
  // The key, not the signed URL, is what identifies the model across loads - the signature makes
739
922
  // every URL unique, which is exactly why the browser's own cache never helps here.
740
- this.threeJsService.loadGLTFModel(url, placement?.cameraPosition, placement?.rotation, key);
923
+ this.threeJsService.loadGLTFModel(url, placement?.cameraPosition, placement?.rotation, key, placement?.up);
741
924
  }
742
925
  /**
743
926
  * Loads a 3D model into the Three.js scene (OBJ).
@@ -832,7 +1015,7 @@ export class ViewerService {
832
1015
  isObject3DLoadedInPosition() {
833
1016
  return this.isObjectLoaded;
834
1017
  }
835
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ViewerService, deps: [{ token: MATTERPORT_SDK_KEY }, { token: 'config' }, { token: i1.PoiService }, { token: i2.MatterportService }, { token: i3.ThreeJsService }], target: i0.ɵɵFactoryTarget.Injectable });
1018
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ViewerService, deps: [{ token: MATTERPORT_SDK_KEY }, { token: 'config' }, { token: i1.PoiService }, { token: i2.MatterportService }, { token: i3.ThreeJsService }, { token: i4.SweepLocatorService }], target: i0.ɵɵFactoryTarget.Injectable });
836
1019
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ViewerService, providedIn: 'root' });
837
1020
  }
838
1021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ViewerService, decorators: [{
@@ -843,8 +1026,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
843
1026
  }], ctorParameters: () => [{ type: undefined, decorators: [{
844
1027
  type: Inject,
845
1028
  args: [MATTERPORT_SDK_KEY]
846
- }] }, { type: i4.Config, decorators: [{
1029
+ }] }, { type: i5.Config, decorators: [{
847
1030
  type: Inject,
848
1031
  args: ['config']
849
- }] }, { type: i1.PoiService }, { type: i2.MatterportService }, { type: i3.ThreeJsService }] });
850
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFDOUIseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSS9CLE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsT0FBTyxFQUtQLFFBQVEsR0FDVCxNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ2pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBRXRILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7OztBQU0zRCxNQUFNLE9BQU8sYUFBYTtJQThEdUI7SUFDVjtJQUMzQjtJQUNBO0lBQ0E7SUFqRUYsVUFBVSxHQUFXLFlBQVksQ0FBQztJQUVuQyxjQUFjLENBQVM7SUFFdEIsT0FBTyxDQUFTO0lBRWpCLFVBQVUsR0FLWixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRVosWUFBWSxHQUFxQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRS9DLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFakIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUU3Qjs7Ozs7O09BTUc7SUFDSSxjQUFjLEdBQWtCLElBQUks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UUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWF3YWl0LWluLWxvb3AgKi9cclxuLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXHJcbi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1BVFRFUlBPUlRfU0RLX0tFWSB9IGZyb20gJy4uL3Rva2Vucy9tYXR0ZXJwb3J0LXNkay1rZXkudG9rZW4nO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnRTZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUaHJlZUpzU2VydmljZSB9IGZyb20gJy4vdGhyZWVqcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVRhZ1NlcnZpY2UgfSBmcm9tICcuL3RhZy5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBEYk9iamVjdFR5cGUsXHJcbiAgUE9JLFxyXG4gIFZpZXdlckludGVyYWN0aW9ucyxcclxuICBQb2lUeXBlLFxyXG4gIENvbW1lbnQsXHJcbiAgRXF1aXBtZW50LFxyXG4gIFRpY2tldCxcclxuICBGZWF0dXJlLFxyXG4gIFNwTW9kdWxlLFxyXG59IGZyb20gJy4uL3R5cGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb2lTZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvcG9pLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBtYWtlU2VjdXJpdHlDYW1lcmEsIHNlY3VyaXR5Q2FtZXJhVHlwZSB9IGZyb20gXCIuLi9tYXR0ZXJwb3J0LWV4dGVuc2lvbnMvc2VjdXJpdHktY2FtZXJhL1NlY3VyaXR5Q2FtZXJhXCI7XHJcbmltcG9ydCB7IFZpZXdGcnVzdHVtTWVzaFR5cGUsIG1ha2VWaWV3RnJ1c3R1bU1lc2ggfSBmcm9tIFwiLi4vbWF0dGVycG9ydC1leHRlbnNpb25zL3ZpZXctZnJ1c3R1bS1tZXNoL1ZpZXdGcnVzdHVtTWVzaFwiO1xyXG5pbXBvcnQgeyBOYXZpZ2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi9uYXZpZ2F0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IGdldFNpZ25lZEZpbGUgfSBmcm9tICcuL3MzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBwYXJzZVRocmVlSnNQbGFjZW1lbnQgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFZpZXdlclNlcnZpY2Uge1xyXG4gIHByaXZhdGUgdmlld2VyTW9kZTogc3RyaW5nID0gJ01hdHRlcnBvcnQnO1xyXG5cclxuICBwdWJsaWMgY3VycmVudE1vZGVsM0Q6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSB0b3VyVXJsOiBzdHJpbmc7XHJcblxyXG4gIHB1YmxpYyB2aWV3ZXJJc09uOiBTdWJqZWN0PHtcclxuICAgIHNwYWNlSUQ6IHN0cmluZyB8IG51bGw7XHJcbiAgICBtb2RlbDNEOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgc3dlZXA6IHN0cmluZyB8IG51bGw7XHJcbiAgICByb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgfSB8IG51bGw7XHJcbiAgfT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwdWJsaWMgZGF0YUlzTG9hZGVkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHVibGljIGlzTG9hZGVkID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBzaG93aW5nVmlld2VyID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBzcGFjZSBiZWluZyB2aWV3ZWQsIHdoaWNoZXZlciB2aWV3ZXIgaXMgc2hvd2luZyBpdC5cclxuICAgKlxyXG4gICAqIE1hdHRlcnBvcnRTZXJ2aWNlIGNhcnJpZXMgaXRzIG93biBjb3B5LCBzZXQgd2hpbGUgaXRzIFNESyBjb25uZWN0cyAtIHdoaWNoIG5ldmVyIGhhcHBlbnMgaW5cclxuICAgKiBUaHJlZS5qcyBtb2RlLiBBbnl0aGluZyB0aGF0IHJlYWRzIG9ubHkgdGhhdCBvbmUgc2lsZW50bHkgZG9lcyBub3RoaW5nIGZvciBhIDNEIG1vZGVsLCBhbmQgdGhlXHJcbiAgICogbGlzdHMgdGhhdCBmZWVkIHRhZ3MgYXJlIGV4YWN0bHkgdGhhdC5cclxuICAgKi9cclxuICBwdWJsaWMgY3VycmVudFNwYWNlSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwdWJsaWMgc3dlZXBUb01vdmU6IHN0cmluZyB8IG51bGw7XHJcblxyXG4gIHB1YmxpYyByb3RhdGlvblRvTW92ZTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgfSB8IG51bGw7XHJcblxyXG4gIHB1YmxpYyBnb1RvVHJpZ2dlcmVkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHVibGljIHRvb2xib3hTdGF0ZXMgPSB7XHJcbiAgICBkb2xsaG91c2U6IHtcclxuICAgICAgc3RhdDogZmFsc2UsXHJcbiAgICAgIGljb25JZDogJ3VpLWRvbGxob3VzZScsXHJcbiAgICAgIHNob3coKSB7XHJcbiAgICAgIH0sXHJcbiAgICAgIGhpZGUoKSB7XHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgZmxvb3JwbGFuOiB7XHJcbiAgICAgIHN0YXQ6IGZhbHNlLFxyXG4gICAgfSxcclxuICAgIG1lc3VyZToge1xyXG4gICAgICBzdGF0OiBmYWxzZSxcclxuICAgICAgaWNvbklkOiAndWktbWVzdXJlJyxcclxuICAgICAgc2hvdygpIHtcclxuICAgICAgfSxcclxuICAgICAgaGlkZSgpIHtcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBmaWx0ZXI6IHtcclxuICAgICAgc3RhdDogZmFsc2UsXHJcbiAgICB9LFxyXG4gIH07XHJcbiAgcHJpdmF0ZSBpc09iamVjdExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoTUFUVEVSUE9SVF9TREtfS0VZKSBwcml2YXRlIHJlYWRvbmx5IHNka0tleTogc3RyaW5nLFxyXG4gICAgQEluamVjdCgnY29uZmlnJykgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IENvbmZpZyxcclxuICAgIHByaXZhdGUgcG9pU2VydmljZTogUG9pU2VydmljZSxcclxuICAgIHByaXZhdGUgbWF0dGVycG9ydFNlcnZpY2U6IE1hdHRlcnBvcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0aHJlZUpzU2VydmljZTogVGhyZWVKc1NlcnZpY2UsXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNldE1vZGUoJ01hdHRlcnBvcnQnKTtcclxuICB9XHJcblxyXG5cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICBVdGlsc1xyXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG5cclxuICBjaGVja01vZGUoaW5kZXhNb2RlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdlck1vZGUgPT09IGluZGV4TW9kZTtcclxuICB9XHJcblxyXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgIFNldHRlcnNcclxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbiAgc2V0TW9kZShpbmRleE1vZGU6IHN0cmluZykge1xyXG4gICAgLy8gTGVhdmluZyBUaHJlZS5qcyBtZWFucyBubyBUaHJlZS5qcyB3b3JrIHNob3VsZCBzdGlsbCBiZSBydW5uaW5nLiBUaGUgc2VydmljZSBiZWhpbmQgaXQgaXMgYVxyXG4gICAgLy8gc2luZ2xldG9uIGFuZCBvdXRsaXZlcyB0aGUgY29tcG9uZW50LCBzbyBhIGRvd25sb2FkIHN0YXJ0ZWQgZm9yIGEgbW9kZWwgdGhlIHVzZXIgaGFzIG5hdmlnYXRlZFxyXG4gICAgLy8gYXdheSBmcm9tIHdvdWxkIG90aGVyd2lzZSBmaW5pc2ggLSBhbmQgaXRzIHBhcnNlIHdvdWxkIGhvbGQgdGhlIG1haW4gdGhyZWFkIGZvciBzZWNvbmRzLFxyXG4gICAgLy8gc3RhbGxpbmcgd2hhdGV2ZXIgdmlld2VyIHRoZXkgYWN0dWFsbHkgb3BlbmVkLlxyXG4gICAgaWYgKHRoaXMudmlld2VyTW9kZSA9PT0gJ3RocmVlanMnICYmIGluZGV4TW9kZSAhPT0gJ3RocmVlanMnKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuZGVzdHJveSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3ZXJNb2RlID0gaW5kZXhNb2RlO1xyXG4gIH1cclxuXHJcbiAgc2V0VG91clVybChvcHRpb25zOiB7XHJcbiAgICBtb2RlbDNkOiBzdHJpbmcsXHJcbiAgICBzaG93SWNvblBsYW4/OiBib29sZWFuLFxyXG4gICAgc2hvd0ljb25Eb2xsaG91c2U/OiBib29sZWFuLFxyXG4gICAgc2hvd0ljb25GbG9vcnM/OiBib29sZWFuLFxyXG4gICAgc2hvd1F1aWNrU3RhcnQ/OiBib29sZWFuLFxyXG4gICAgc2hvd0Z1bGxzY3JlZW4/OiBib29sZWFuLFxyXG4gICAgc2hvd0d1aWRlZFRvdXI/OiBib29sZWFuLFxyXG4gICAgc2hvd0hpZ2hsaWdodFJlZWw/OiBib29sZWFuLFxyXG4gICAgc2hvd0RlZnVybmlzaD86IGJvb2xlYW4sXHJcbiAgICBzaG93Um9vbU1lYXN1cmVtZW50cz86IGJvb2xlYW5cclxuICB9KSB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIG1vZGVsM2QsXHJcbiAgICAgIHNob3dJY29uUGxhbiA9IHRydWUsXHJcbiAgICAgIHNob3dJY29uRG9sbGhvdXNlID0gdHJ1ZSxcclxuICAgICAgc2hvd0ljb25GbG9vcnMgPSB0cnVlLFxyXG4gICAgICBzaG93UXVpY2tTdGFydCA9IHRydWUsXHJcbiAgICAgIHNob3dGdWxsc2NyZWVuID0gdHJ1ZSxcclxuICAgICAgc2hvd0d1aWRlZFRvdXIgPSB0cnVlLFxyXG4gICAgICBzaG93SGlnaGxpZ2h0UmVlbCA9IHRydWUsXHJcbiAgICAgIHNob3dEZWZ1cm5pc2ggPSB0cnVlLFxyXG4gICAgICBzaG93Um9vbU1lYXN1cmVtZW50cyA9IHRydWVcclxuICAgIH0gPSBvcHRpb25zO1xyXG5cclxuICAgIGNvbnN0IGJhc2VVcmwgPSBgL2Fzc2V0cy9idW5kbGUvc2hvd2Nhc2UuaHRtbGA7XHJcblxyXG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIC8vIE1vZMOobGVcclxuICAgIHBhcmFtcy5wdXNoKGBtPSR7bW9kZWwzZH1gKTtcclxuXHJcbiAgICAvLyBDb21wb3J0ZW1lbnQgZ8OpbsOpcmFsXHJcbiAgICBwYXJhbXMucHVzaChgcGxheT0xYCk7XHJcbiAgICBwYXJhbXMucHVzaChgdWk9MWApO1xyXG4gICAgcGFyYW1zLnB1c2goYHRpdGxlPTBgKTtcclxuICAgIHBhcmFtcy5wdXNoKGBsb2c9MGApO1xyXG4gICAgcGFyYW1zLnB1c2goYGJyYW5kPTBgKTtcclxuICAgIHBhcmFtcy5wdXNoKGBzZWFyY2g9MGApO1xyXG4gICAgcGFyYW1zLnB1c2goYGFwcGxpY2F0aW9uS2V5PSR7dGhpcy5zZGtLZXl9YCk7XHJcbiAgICBwYXJhbXMucHVzaChgbWRzPTBgKTtcclxuXHJcbiAgICAvLyBRdWljayBzdGFydFxyXG4gICAgaWYgKHNob3dRdWlja1N0YXJ0KSB7XHJcbiAgICAgIHBhcmFtcy5wdXNoKGBxcz0xYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmxvb3JwbGFuIChwbGFuKVxyXG4gICAgaWYgKCFzaG93SWNvblBsYW4pIHtcclxuICAgICAgcGFyYW1zLnB1c2goYGZwPTBgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEb2xsaG91c2UgKG1haXNvbi9wb3Vww6llKVxyXG4gICAgaWYgKCFzaG93SWNvbkRvbGxob3VzZSkge1xyXG4gICAgICBwYXJhbXMucHVzaChgZGg9MGApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFPDqWxlY3RldXIgZOKAmcOpdGFnZXNcclxuICAgIGlmICghc2hvd0ljb25GbG9vcnMpIHtcclxuICAgICAgcGFyYW1zLnB1c2goYHNmPTBgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHdWlkZWQgdG91clxyXG4gICAgaWYgKCFzaG93R3VpZGVkVG91cikge1xyXG4gICAgICBwYXJhbXMucHVzaChgZ3Q9MGApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhpZ2hsaWdodCByZWVsIChiYW5kZSBkdSBiYXMpXHJcbiAgICBpZiAoIXNob3dIaWdobGlnaHRSZWVsKSB7XHJcbiAgICAgIC8vIFNlbG9uIHRvbiBidW5kbGUgOiBocj0xIG91IGhyPTAgbWFzcXVlXHJcbiAgICAgIHBhcmFtcy5wdXNoKGBocj0xYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGxlaW4gw6ljcmFuXHJcbiAgICBpZiAoIXNob3dGdWxsc2NyZWVuKSB7XHJcbiAgICAgIHBhcmFtcy5wdXNoKGBmcz0wYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVmdXJuaXNoXHJcbiAgICBpZiAoc2hvd0RlZnVybmlzaCkge1xyXG4gICAgICBwYXJhbXMucHVzaChgYWQ9MWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJvb20gTWVhc3VyZW1lbnRzXHJcbiAgICBpZiAoc2hvd1Jvb21NZWFzdXJlbWVudHMpIHtcclxuICAgICAgcGFyYW1zLnB1c2goYG1lYXN1cmVtZW50cz0xYCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50b3VyVXJsID0gYCR7YmFzZVVybH0/JHtwYXJhbXMuam9pbihcIiZcIil9YDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNsZWFyQWxsKCkge1xyXG4gICAgLy8gdGhpcy5zd2VlcFRvTW92ZSA9IG51bGw7XHJcbiAgICAvLyB0aGlzLnJvdGF0aW9uVG9Nb3ZlID0gbnVsbDtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgICAvLyBNaXJyb3JzIHRoZSBNYXR0ZXJwb3J0IGJyYW5jaDogdGhlIHNwYWNlIGlzIG5vIGxvbmdlciBvbiBzY3JlZW4sIHNvIHdoYXRldmVyIHdhcyBsb2FkZWRcclxuICAgICAgLy8gZm9yIGl0IGhhcyB0byBiZSBkcm9wcGVkIGJlZm9yZSBhbm90aGVyIHZpc2l0IG9wZW5zLlxyXG4gICAgICB0aGlzLnZpZXdlcklzT24ubmV4dCh7XHJcbiAgICAgICAgc3BhY2VJRDogbnVsbCxcclxuICAgICAgICBtb2RlbDNEOiBudWxsLFxyXG4gICAgICAgIHN3ZWVwOiBudWxsLFxyXG4gICAgICAgIHJvdGF0aW9uOiBudWxsLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmNsZWFyQWxsKCk7XHJcbiAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcclxuICAgICAgICBzcGFjZUlEOiBudWxsLFxyXG4gICAgICAgIG1vZGVsM0Q6IG51bGwsXHJcbiAgICAgICAgc3dlZXA6IG51bGwsXHJcbiAgICAgICAgcm90YXRpb246IG51bGwsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgR2V0dGVyc1xyXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG5cclxuICBnZXRNb2RlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudmlld2VyTW9kZTtcclxuICB9XHJcblxyXG4gIGdldFZpZXdlclNlbGVjdGVkU2VydmljZSgpIHtcclxuICAgIC8vIE1hdHRlcnBvcnRcclxuICAgIC8vIGlmICh0aGlzLmNoZWNrTW9kZShcIk1hdHRlcnBvcnRcIikpIHtcclxuICAgIC8vICAgICByZXR1cm4gdGhpcy5nZXRNYXR0ZXJwb3J0U2VydmljZSgpO1xyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0TWF0dGVycG9ydFNlcnZpY2UoKTtcclxuICB9XHJcblxyXG4gIGdldFRvdXJVcmwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50b3VyVXJsO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF0dGVycG9ydFNlcnZpY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0U2VydmljZTtcclxuICB9XHJcblxyXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgIEdlbmVyaWMgTWFpbiBhY3Rpb24gZnVuY3Rpb25zXHJcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgc2V0U3dlZXBUb01vdmUoc3dlZXA6IHN0cmluZykge1xyXG4gICAgdGhpcy5zd2VlcFRvTW92ZSA9IHN3ZWVwO1xyXG4gIH1cclxuXHJcbiAgc2V0Um90YXRpb25Ub01vdmUocm90YXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IH0pIHtcclxuICAgIHRoaXMucm90YXRpb25Ub01vdmUgPSByb3RhdGlvbjtcclxuICB9XHJcblxyXG5cclxuICBhc3luYyBhY3Rpb25fbW92ZV90b190YWcoZWxlbWVudElkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIC8vIE1hdHRlcnBvcnRcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SWQpO1xyXG4gICAgICBpZiAocmVzdWx0LnRhZykge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ29Ub1RhZyhyZXN1bHQudGFnKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocmVzdWx0LnN3ZWVwKSB7XHJcbiAgICAgICAgdGhpcy5zd2VlcFRvTW92ZSA9IHJlc3VsdC5zd2VlcDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBXaXRob3V0IHRoaXMgdGhlIGNhbGxlciBmYWxscyB0aHJvdWdoIHRvIGdldE1vZGVsM2RBbmRTd2VlcCwgd2hpY2ggcmVzb2x2ZXMgYSB2aXNpdCBmcm9tIHRoZVxyXG4gICAgLy8gUE9JJ3Mgc3dlZXAgLSBhIFRocmVlLmpzIFBPSSBoYXMgbm9uZSwgc28gaXQgZmFpbHMgYW5kIHJlcG9ydHMgdGhlIG1vZGVsIGFzIHVucmVhY2hhYmxlIGV2ZW5cclxuICAgIC8vIHRob3VnaCB0aGUgdGFnIGlzIG9uIHNjcmVlbi5cclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpICYmIHRoaXMudGhyZWVKc1NlcnZpY2UuaGFzVGFnKGVsZW1lbnRJZCkpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5nb1RvVGFnKGVsZW1lbnRJZCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBNYXR0ZXJ0YWdzIHRvIFZpZXdlclxyXG4gICAqIEBwYXJhbSBvYmplY3RzIExpc3Qgb2Ygb2JqZWN0cyAodGlja2V0cywgZXF1aXBtZW50cykgZXRjIHRvIGJlIGFkZGVkIGFzIE1hdHRlcnRhZ3NcclxuICAgKi9cclxuICBhc3luYyBhZGRPYmplY3RUYWdzVG9WaWV3ZXIob2JqZWN0czogRGJPYmplY3RUeXBlW10pIHtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBvYmplY3RzLm1hcChhc3luYyAob2JqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcG9pID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLmdldFBvaUJ5RWxlbWVudElkKG9iamVjdC5pZCEpO1xyXG4gICAgICAgIGlmIChwb2kgJiYgcG9pLmNvb3JkaW5hdGUpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuYWN0aW9uQWRkT2JqZWN0RnJvbVBPSShvYmplY3QsIHBvaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIC8vIE5ld2x5IGNyZWF0ZWQgdGFncyBoYXZlIG5vIG9wYWNpdHkvYWxsb3dBY3Rpb24gYXBwbGllZCB5ZXQgKG9ubHkgc2V0IGJ5XHJcbiAgICAvLyB1cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQsIHdoaWNoIHJ1bnMgb24gTW9kZS9Td2VlcC9GbG9vci9Sb29tL0NhbWVyYVxyXG4gICAgLy8gZXZlbnRzKS4gSWYgdGhpcyBiYXRjaCBsb2FkZWQgYWZ0ZXIgdGhvc2UgZmlyZWQsIHRoZSB0YWdzIHN0YXkgaW4gd2hhdGV2ZXJcclxuICAgIC8vIGRlZmF1bHQgc3RhdGUgdGhlIFNESyBnYXZlIHRoZW0gdW50aWwgc29tZXRoaW5nIGVsc2UgbnVkZ2VzIGEgcmVmcmVzaC5cclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBhY3Rpb25BZGRPYmplY3RGcm9tUE9JKG9iamVjdDogRGJPYmplY3RUeXBlLCBwb2k6IFBPSSkge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuY3JlYXRlTWF0dGVydGFnRnJvbVBPSShcclxuICAgICAgICBwb2kudHlwZSEsXHJcbiAgICAgICAgb2JqZWN0LFxyXG4gICAgICAgIHBvaVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWRkVGhyZWVKc1RhZ0Zyb21QT0kob2JqZWN0LCBwb2kpO1xyXG4gICAgfVxyXG4gICAgLy8gQ3VwaXhcclxuICAgIC8vIFRPRE9cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERyYXdzIGEgUE9JIGFzIGEgdGFnIGluIHRoZSBUaHJlZS5qcyBzY2VuZS5cclxuICAgKlxyXG4gICAqIEJvdGggdmlld2VycyBhcmUgZmVkIGJ5IHRoZSBzYW1lIHN1YnNjcmlwdGlvbnMgb24gdGhlIHNhbWUgUE9JIHJlY29yZHMsIHNvIGEgdGFnIGNyZWF0ZWQgaW5cclxuICAgKiBlaXRoZXIgb25lIHNob3dzIHVwIGluIHRoZSBvdGhlciB3aXRob3V0IGFueSBzeW5jaW5nIG9mIGl0cyBvd24gLSB0aGlzIGlzIGp1c3QgdGhlIFRocmVlLmpzIGVuZFxyXG4gICAqIG9mIHRoZSBwaXBlbGluZSB0aGF0IGFscmVhZHkgZHJpdmVzIE1hdHRlcnBvcnQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBhZGRUaHJlZUpzVGFnRnJvbVBPSShvYmplY3Q6IERiT2JqZWN0VHlwZSwgcG9pOiBQT0kpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghcG9pLmNvb3JkaW5hdGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHBvc2l0aW9uID0gSlNPTi5wYXJzZShwb2kuY29vcmRpbmF0ZSk7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgY29uc29sZS53YXJuKGBWaWV3ZXJTZXJ2aWNlOiB1bnBhcnNlYWJsZSBQT0kgY29vcmRpbmF0ZSBmb3IgZWxlbWVudCAke29iamVjdC5pZH06YCwgcG9pLmNvb3JkaW5hdGUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIVtwb3NpdGlvbj8ueCwgcG9zaXRpb24/LnksIHBvc2l0aW9uPy56XS5ldmVyeSgodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnVwc2VydFRhZyh7XHJcbiAgICAgIGlkOiBvYmplY3QuaWQsXHJcbiAgICAgIHBvc2l0aW9uLFxyXG4gICAgICBwb2lUeXBlOiBwb2kudHlwZSxcclxuICAgICAgbGFiZWw6IG9iamVjdC5uYW1lID8/IG9iamVjdC50aXRsZSA/PyBudWxsLFxyXG4gICAgICBpY29uVXJsOiBhd2FpdCB0aGlzLnJlc29sdmVUYWdJY29uVXJsKHBvaSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBpbWFnZSB0byBkcmF3IGEgdGFnIHdpdGgsIG1pcnJvcmluZyB3aGF0IE1hdHRlcnBvcnQgc2hvd3MgZm9yIHRoZSBzYW1lIFBPSS5cclxuICAgKlxyXG4gICAqIE1hdHRlcnBvcnQgcmVnaXN0ZXJzIG9uZSB0ZXh0dXJlIHBlciB0eXBlIChgaWNvbi10aWNrZXRgLCBgaWNvbi1lcXVpcG1lbnRgLi4uKSBmcm9tIHRoZSBzYW1lXHJcbiAgICogY29uZmlnIGVudHJpZXMgdXNlZCBoZXJlLCBhbmQgb3ZlcnJpZGVzIGl0IHdpdGggdGhlIFBPSSdzIG93biBpY29uIHdoZW4gaXQgaGFzIG9uZS4gUmVhZGluZyB0aGVcclxuICAgKiBzYW1lIHR3byBzb3VyY2VzIGlzIHdoYXQga2VlcHMgYSB0YWcgbG9va2luZyBsaWtlIGl0c2VsZiBhY3Jvc3MgdGhlIHR3byB2aWV3ZXJzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVRhZ0ljb25VcmwocG9pOiBQT0kpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIGlmIChwb2kudGFnSWNvbikge1xyXG4gICAgICAvLyBTdG9yZWQgYXMgSlNPTiAoeyBzcmMsIG9wYWNpdHkgfSkgYnkgdGhlIE1hdHRlcnBvcnQgcGF0aCwgYnV0IG9sZGVyIHJlY29yZHMgYXJlIGEgYmFyZSBrZXkuXHJcbiAgICAgIGxldCBzb3VyY2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocG9pLnRhZ0ljb24pO1xyXG4gICAgICAgIHNvdXJjZSA9IHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnID8gcGFyc2VkIDogcGFyc2VkPy5zcmMgPz8gbnVsbDtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgc291cmNlID0gcG9pLnRhZ0ljb247XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNvdXJjZSkge1xyXG4gICAgICAgIGNvbnN0IHNpZ25lZCA9IGF3YWl0IGdldFNpZ25lZEZpbGUoc291cmNlKTtcclxuICAgICAgICBpZiAoc2lnbmVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gc2lnbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFRhZ0ljb25VcmwocG9pLnR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBjb25maWd1cmVkIGljb24gZm9yIGEgUE9JIHR5cGUsIG9yIG51bGwgd2hlbiB0aGF0IHR5cGUgaGFzIG5vbmUuICovXHJcbiAgcHJpdmF0ZSBkZWZhdWx0VGFnSWNvblVybChwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgaWNvbnMgPSB0aGlzLmNvbmZpZz8ubXlfY29uZmlnO1xyXG4gICAgaWYgKCFpY29ucykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHN3aXRjaCAocG9pVHlwZSkge1xyXG4gICAgICBjYXNlIFBvaVR5cGUuVElDS0VUOlxyXG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX3RpY2tldCA/PyBudWxsO1xyXG4gICAgICBjYXNlIFBvaVR5cGUuRVFVSVBNRU5UOlxyXG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX2VxdWlwbWVudCA/PyBudWxsO1xyXG4gICAgICBjYXNlIFBvaVR5cGUuTUVBU1VSRTpcclxuICAgICAgICByZXR1cm4gaWNvbnMuaWNvbl9tZWFzdXJlID8/IG51bGw7XHJcbiAgICAgIGNhc2UgUG9pVHlwZS5PQkpFQ1QzRDpcclxuICAgICAgICByZXR1cm4gaWNvbnMuaWNvbl9vYmplY3QzZCA/PyBudWxsO1xyXG4gICAgICBjYXNlIFBvaVR5cGUuREFUQTpcclxuICAgICAgY2FzZSBQb2lUeXBlLkRFU0s6XHJcbiAgICAgICAgcmV0dXJuIGljb25zLmljb25fZGF0YSA/PyBudWxsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIE1vdmVzIHRoZSBUaHJlZS5qcyBjYW1lcmEgdG8gZnJhbWUgYSB0YWcsIG1pcnJvcmluZyBNYXR0ZXJwb3J0J3MgZ29Ub1RhZy4gKi9cclxuICBnb1RvVGhyZWVKc1RhZyhlbGVtZW50SWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5nb1RvVGFnKGVsZW1lbnRJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogU2hvd3Mgb25seSB0YWdzIG9mIHRoZSBnaXZlbiBQT0kgdHlwZXM7IG51bGwgY2xlYXJzIHRoZSBmaWx0ZXIuICovXHJcbiAgc2V0VmlzaWJsZVRocmVlSnNUYWdUeXBlcyh0eXBlczogUG9pVHlwZVtdIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRWaXNpYmxlVGFnVHlwZXModHlwZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWxpZ25tZW50IHdhbGt0aHJvdWdoOiBwaWNrIGEgdGFnLCB0aGVuIGNsaWNrIHdoZXJlIGl0IHJlYWxseSBzaXRzLCB0aHJlZSB0aW1lcyBvdmVyLlxyXG4gICAqXHJcbiAgICogVXNlcyB0YWdzIHRoYXQgYWxyZWFkeSBleGlzdCwgc28gbm90aGluZyBpcyBjcmVhdGVkIGFuZCBub3RoaW5nIGlzIHdyaXR0ZW4gdW50aWwgdGhlIGNhbGxlclxyXG4gICAqIHNhdmVzIHRoZSByZXN1bHQuIFNlZSB0aHJlZUpzQWxpZ25tZW50UHJvZ3Jlc3MkIGZvciB3aGF0IHRoZSBVSSBzaG91bGQgYmUgYXNraW5nIGZvci5cclxuICAgKi9cclxuICBzdGFydFRocmVlSnNUYWdBbGlnbm1lbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnN0YXJ0VGFnQWxpZ25tZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWxUaHJlZUpzVGFnQWxpZ25tZW50KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxUYWdBbGlnbm1lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB0aHJlZUpzQWxpZ25tZW50UHJvZ3Jlc3MkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UuYWxpZ25tZW50UHJvZ3Jlc3MkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29sdmVzIHRoZSBhbGlnbm1lbnQgYW5kIGFwcGxpZXMgaXQgdG8gdGhlIHNjZW5lLCByZXR1cm5pbmcgaXQgYXMgdGhlIEpTT04gdG8gc3RvcmUgaW4gdGhlXHJcbiAgICogY2FwdHVyZSdzIG1ldGFkYXRhLiBOdWxsIG1lYW5zIHRoZSB0aHJlZSB0YWdzIHdlcmUgY29sbGluZWFyIGFuZCBub3RoaW5nIHdhcyBhcHBsaWVkLlxyXG4gICAqL1xyXG4gIHNvbHZlVGhyZWVKc1RhZ0FsaWdubWVudChleGlzdGluZ01ldGFkYXRhPzogc3RyaW5nKTogeyBhbGlnbm1lbnQ6IGFueTsgbWV0YWRhdGE6IHN0cmluZyB9IHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbGlnbm1lbnQgPSB0aGlzLnRocmVlSnNTZXJ2aWNlLnNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCk7XHJcbiAgICBpZiAoIWFsaWdubWVudCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIC8vIE1lcmdlZCBpbnRvIHdoYXRldmVyIHRoZSBjYXB0dXJlIGFscmVhZHkgc3RvcmVzLCBzbyBhbiBleGlzdGluZyBjYW1lcmEgcGxhY2VtZW50IHN1cnZpdmVzLlxyXG4gICAgbGV0IHN0b3JlZDogYW55ID0ge307XHJcbiAgICB0cnkge1xyXG4gICAgICBzdG9yZWQgPSBleGlzdGluZ01ldGFkYXRhID8gSlNPTi5wYXJzZShleGlzdGluZ01ldGFkYXRhKSA6IHt9O1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHN0b3JlZCA9IHt9O1xyXG4gICAgfVxyXG4gICAgc3RvcmVkLmFsaWdubWVudCA9IGFsaWdubWVudDtcclxuICAgIHJldHVybiB7IGFsaWdubWVudCwgbWV0YWRhdGE6IEpTT04uc3RyaW5naWZ5KHN0b3JlZCkgfTtcclxuICB9XHJcblxyXG4gIC8qKiBTaG93cyBvciBoaWRlcyBhIHNpbmdsZSBUaHJlZS5qcyB0YWcuICovXHJcbiAgc2V0VGhyZWVKc1RhZ1Zpc2liaWxpdHkoZWxlbWVudElkOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc2V0VGFnVmlzaWJpbGl0eShlbGVtZW50SWQsIHZpc2libGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWN0aW9uX2RlbGV0ZV9lbGVtZW50KGVsZW1lbnQ6IERiT2JqZWN0VHlwZSkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5kZWxldGVNYXR0ZXJ0YWdGb3JPYmplY3QoZWxlbWVudC5pZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnJlbW92ZVRhZyhlbGVtZW50LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIGEgVGhyZWUuanMgbW9kZWwgbG9hZCBhY3R1YWxseSBzdG9wcGVkIHNob3J0LCByYXRoZXIgdGhhbiBtZXJlbHkgYmVpbmcgYXNrZWQgdG8uICovXHJcbiAgZ2V0IHRocmVlSnNNb2RlbExvYWRDYW5jZWxsZWQkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UubW9kZWxMb2FkQ2FuY2VsbGVkJDtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9wcyB0aGUgVGhyZWUuanMgbW9kZWwgZG93bmxvYWQgaW4gcHJvZ3Jlc3MuICovXHJcbiAgY2FuY2VsVGhyZWVKc01vZGVsTG9hZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2FuY2VsTW9kZWxMb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogRW1pdHMgYSB0YWcncyBsYWJlbCB3aGlsZSB0aGUgcG9pbnRlciBpcyBvdmVyIGl0IGluIHRoZSBUaHJlZS5qcyBzY2VuZS4gKi9cclxuICBnZXQgdGhyZWVKc1RhZ0hvdmVyZWQkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UudGFnSG92ZXJlZCQ7XHJcbiAgfVxyXG5cclxuICAvKiogRW1pdHMgdGhlIGVsZW1lbnQgaWQgb2YgYSB0YWcgY2xpY2tlZCBpbiB0aGUgVGhyZWUuanMgc2NlbmUuICovXHJcbiAgZ2V0IHRocmVlSnNUYWdDbGlja2VkJCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLnRhZ0NsaWNrZWQkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbGllcyB0aGUgdmlzaXQncyBzdG9yZWQgdGFnIGFsaWdubWVudCwgbWFwcGluZyBjYXB0dXJlZCB0YWcgY29vcmRpbmF0ZXMgb250byB0aGlzIG1vZGVsLlxyXG4gICAqXHJcbiAgICogU2FmZSB0byBjYWxsIGJlZm9yZSB0aGUgbW9kZWwgb3IgYW55IHRhZyBleGlzdHM6IGl0IGlzIGEgdHJhbnNmb3JtIG9uIHRoZSBncm91cCBib3RoIGVuZCB1cFxyXG4gICAqIHVuZGVyLCBzbyBpdCBhcHBsaWVzIHRvIHdoYXRldmVyIGFycml2ZXMgbGF0ZXIuXHJcbiAgICovXHJcbiAgc2V0VGhyZWVKc1RhZ0FsaWdubWVudEZyb21NZXRhZGF0YShtZXRhZGF0YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRUYWdBbGlnbm1lbnQocGFyc2VUaHJlZUpzUGxhY2VtZW50KG1ldGFkYXRhKT8uYWxpZ25tZW50ID8/IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlIHRhZyBwbGFjZW1lbnQgbWVudSB0byBhZGQgYSBuZXcgZWxlbWVudCBkZXBlbmRpbmcgb24gaXRzIHR5cGUgKFRJQ0tFVCwgREFUQSwgRVFVSVBNRU5UIGV0YylcclxuICAgKi9cclxuICBhc3luYyBhY3Rpb25BZGROZXdFbGVtZW50VG9WaWV3ZXIocG9pVHlwZTogUG9pVHlwZSkge1xyXG4gICAgdGhpcy5hY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpO1xyXG5cclxuICAgIC8vIE1hdHRlcnBvcnRcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSAmJlxyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldEludGVyYWN0aW9uTW9kZSgpID09PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVFxyXG4gICAgKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWRkTWF0dGVydGFnV2hlbkFkZGluZyhwb2lUeXBlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc3RhcnRUYWdQbGFjZW1lbnQocG9pVHlwZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMYXVuY2hlcyB0aGUgcmVwb3NpdGlvbmluZyBvZiBhbiBleGlzdGluZyBNYXR0ZXJ0YWcgcmVsYXRlZCB0byBwYXJhbWV0ZXIgb2JqZWN0XHJcbiAgICogQHBhcmFtIGVsZW1lbnQgb2JqZWN0IChUSUNLRVQsIEVRVUlQTUVOVCwgRkVBVFVSRSwgZXRjKVxyXG4gICAqIEBwYXJhbSBwb2lUeXBlIHR5cGUgb2Ygb2JqZWN0XHJcbiAgICovXHJcbiAgYXN5bmMgYWN0aW9uUmVwb3NpdGlvbkVsZW1lbnRJblZpZXdlcihcclxuICAgIGVsZW1lbnQ6IERiT2JqZWN0VHlwZSxcclxuICAgIHBvaVR5cGU6IFBvaVR5cGVcclxuICApIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSAmJlxyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldEludGVyYWN0aW9uTW9kZSgpID09PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVFxyXG4gICAgKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWRkTWF0dGVydGFnV2hlblJlcG9zaXRpb25pbmcocG9pVHlwZSwgZWxlbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbmFibGUgdGlja2V0IHBsYWNlbWVudCBtZW51IHRvIGFkZCBhIG5ldyB0aWNrZXRcclxuICAgKi9cclxuICBhY3Rpb25fY2FuY2VsZWQoKSB7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmNhbmNlbEZvbGxvd2luZ0N1cnNvcigpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWN0aW9uU2hvd0FsbEZsb29ycygpIHtcclxuICAgIC8vIE1hdHRlcnBvcnRcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uU2hvd0FsbEZsb29ycygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWN0aW9uX3Rvb2xib3hfZG9sbGhvdXNlKCkge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldEludGVyYWN0aW9uTW9kZSgpICE9PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuYWN0aW9uX2NhbmNlbGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCk7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvbl90b29sYm94X2RvbGxob3VzZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWN0aW9uX2Zsb29ycGxhbigpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSAhPT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcclxuICAgICkge1xyXG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xyXG4gICAgfVxyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9mbG9vcnBsYW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFjdGlvbl90b29sYm94X21lc3VyZSgpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSAhPT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcclxuICAgICkge1xyXG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKTtcclxuICAgIC8vIE1hdHRlcnBvcnRcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfbWVzdXJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBhY3Rpb25fdXBkYXRlX3BvaShcclxuICAgIHBvaTogUE9JLFxyXG4gICAgaXNWYWxpZDogYm9vbGVhbixcclxuICAgIGVsZW1lbnQ6IERiT2JqZWN0VHlwZVxyXG4gICk6IFByb21pc2U8UE9JPiB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBpZiAoaXNWYWxpZCkge1xyXG4gICAgICAgIGNvbnN0IGxhc3RUYWcgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLm1hdHRlcnRhZ1RvRm9sbG93XHJcbiAgICAgICAgICA/IHRoaXMubWF0dGVycG9ydFNlcnZpY2UubWF0dGVydGFnVG9Gb2xsb3dcclxuICAgICAgICAgIDogdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRMYXN0VGFnKCk7XHJcbiAgICAgICAgaWYgKCFsYXN0VGFnKSB7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldE1hdHRlclRhZ0RhdGFGb3JNYXR0ZXJ0YWcobGFzdFRhZyk7XHJcbiAgICAgICAgaWYgKCF0YWdEYXRhKSB7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwb2lNZXRhZGF0YSA9ICghIXBvaSAmJiBwb2kubWV0YWRhdGEpID8gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpIDoge307XHJcbiAgICAgICAgcG9pTWV0YWRhdGEubm9ybWFsID0gdGFnRGF0YS5nZXROb3JtYWwoKTtcclxuICAgICAgICBpZiAoIXBvaSkge1xyXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBvaUlucHV0ID0ge1xyXG4gICAgICAgICAgaWQ6IHBvaS5pZCxcclxuICAgICAgICAgIGNvb3JkaW5hdGU6IHRhZ0RhdGEuZ2V0Q29vcmRpbmF0ZVN0cmluZygpLFxyXG4gICAgICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHRhZ0RhdGEuZ2V0U3dlZXBJRCgpLFxyXG4gICAgICAgICAgbWV0YWRhdGE6IEpTT04uc3RyaW5naWZ5KHBvaU1ldGFkYXRhKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRQb2k6IFBPSSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS51cGRhdGVQb2kocG9pSW5wdXQpO1xyXG4gICAgICAgIHRhZ0RhdGEuc2V0UG9pKHVwZGF0ZWRQb2kpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0T2JqZWN0QW5kUG9pSW5UYWcobGFzdFRhZywgZWxlbWVudCwgUG9pVHlwZS5ERVNLLCB1cGRhdGVkUG9pKTtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmluamVjdEh0bWxJblRhZyhcclxuICAgICAgICAgIHBvaS50eXBlISxcclxuICAgICAgICAgIGVsZW1lbnQsXHJcbiAgICAgICAgICBsYXN0VGFnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNldFRhZ0ljb25BbmRPcGFjaXR5KGxhc3RUYWcsIHRhZ0RhdGEpO1xyXG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ29Ub1RhZyhsYXN0VGFnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cGRhdGVkUG9pKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmRlbGV0ZUxhc3RNYXR0ZXJ0YWcoKTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbW1pdFRocmVlSnNUYWdQbGFjZW1lbnQocG9pLCBpc1ZhbGlkLCBlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXcml0ZXMgdGhlIHNwb3QgcGlja2VkIGluIHRoZSBUaHJlZS5qcyBzY2VuZSBpbnRvIHRoZSBQT0ksIG1pcnJvcmluZyB0aGUgTWF0dGVycG9ydCBicmFuY2guXHJcbiAgICpcclxuICAgKiBUaGUgY29vcmRpbmF0ZSBnb2VzIGluIHRoZSBzYW1lIGZpZWxkIGFuZCB0aGUgc2FtZSBzcGFjZSBNYXR0ZXJwb3J0IHdyaXRlcywgd2hpY2ggaXMgd2hhdCBtYWtlc1xyXG4gICAqIGEgdGFnIGNyZWF0ZWQgaGVyZSBzaG93IHVwIGluIHRoZSByaWdodCBwbGFjZSB0aGVyZSAtIGFuZCB0aGUgb3RoZXIgd2F5IHJvdW5kLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0VGhyZWVKc1RhZ1BsYWNlbWVudChcclxuICAgIHBvaTogUE9JLFxyXG4gICAgaXNWYWxpZDogYm9vbGVhbixcclxuICAgIGVsZW1lbnQ6IERiT2JqZWN0VHlwZVxyXG4gICk6IFByb21pc2U8UE9JPiB7XHJcbiAgICBjb25zdCBwbGFjZW1lbnQgPSB0aGlzLnRocmVlSnNTZXJ2aWNlLmdldFBlbmRpbmdUYWdQbGFjZW1lbnQoKTtcclxuICAgIGlmICghaXNWYWxpZCB8fCAhcGxhY2VtZW50IHx8ICFwb2kpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBvaU1ldGFkYXRhID0gcG9pLm1ldGFkYXRhID8gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpIDoge307XHJcbiAgICBwb2lNZXRhZGF0YS5ub3JtYWwgPSBwbGFjZW1lbnQubm9ybWFsO1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRQb2kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UudXBkYXRlUG9pKHtcclxuICAgICAgaWQ6IHBvaS5pZCxcclxuICAgICAgY29vcmRpbmF0ZTogSlNPTi5zdHJpbmdpZnkocGxhY2VtZW50LnBvc2l0aW9uKSxcclxuICAgICAgbWV0YWRhdGE6IEpTT04uc3RyaW5naWZ5KHBvaU1ldGFkYXRhKSxcclxuICAgICAgLy8gbWF0dGVycG9ydFN3ZWVwSUQgaXMgbGVmdCBhcyBpdCB3YXM6IHRoaXMgdmlld2VyIGhhcyBubyBzd2VlcHMsIGFuZCBNYXR0ZXJwb3J0IGZpbHRlcnMgdGFnXHJcbiAgICAgIC8vIHZpc2liaWxpdHkgYnkgdGhlbSwgc28gY2xlYXJpbmcgaXQgd291bGQgaGlkZSB0aGUgdGFnIG92ZXIgdGhlcmUuXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnVwc2VydFRhZyh7XHJcbiAgICAgIGlkOiBlbGVtZW50LmlkLFxyXG4gICAgICBwb3NpdGlvbjogcGxhY2VtZW50LnBvc2l0aW9uLFxyXG4gICAgICBwb2lUeXBlOiB1cGRhdGVkUG9pPy50eXBlID8/IHBvaS50eXBlLFxyXG4gICAgICBpY29uVXJsOiB1cGRhdGVkUG9pPy50YWdJY29uID8gYXdhaXQgZ2V0U2lnbmVkRmlsZSh1cGRhdGVkUG9pLnRhZ0ljb24pIDogbnVsbCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcclxuXHJcbiAgICByZXR1cm4gdXBkYXRlZFBvaTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgdGhlIFBPSSBmb3IgYW4gZWxlbWVudCBqdXN0IHBsYWNlZCBpbiB0aGUgVGhyZWUuanMgc2NlbmUuXHJcbiAgICpcclxuICAgKiBUaGUgTWF0dGVycG9ydCBwYXRoIHJlYWNoZXMgdGhlIHNhbWUgcmVzdWx0IHRocm91Z2ggaXRzIHRhZyBkaWN0aW9uYXJ5IC0gdGhlIHRhZyBleGlzdHMgZmlyc3RcclxuICAgKiBhbmQgY2FycmllcyB0aGUgY29vcmRpbmF0ZXMuIFRocmVlLmpzIGhhcyBubyBzdWNoIG9iamVjdCwgc28gdGhlIHBsYWNlbWVudCBjYXB0dXJlZCBhdCBjbGlja1xyXG4gICAqIHRpbWUgaXMgdGhlIG9ubHkgcmVjb3JkIG9mIHdoZXJlIHRoZSB1c2VyIHBvaW50ZWQsIGFuZCBpdCBoYXMgdG8gYmVjb21lIGEgUE9JIGhlcmUgb3IgaXQgaXNcclxuICAgKiBsb3N0IHdoZW4gdGhlIGZvcm0gY2xvc2VzLlxyXG4gICAqXHJcbiAgICogUmV0dXJucyBudWxsIHdoZW4gdGhlcmUgaXMgbm8gcGVuZGluZyBwbGFjZW1lbnQsIHdoaWNoIGlzIHRoZSBub3JtYWwgY2FzZSBpbiBNYXR0ZXJwb3J0IG1vZGUuXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlUG9pRm9yVGhyZWVKc1BsYWNlbWVudChlbGVtZW50OiBEYk9iamVjdFR5cGUsIHBvaVR5cGU6IFBvaVR5cGUpOiBQcm9taXNlPFBPSSB8IG51bGw+IHtcclxuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0UGVuZGluZ1RhZ1BsYWNlbWVudCgpO1xyXG4gICAgaWYgKCFwbGFjZW1lbnQgfHwgIWVsZW1lbnQ/LmlkKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5jcmVhdGVQT0lGb3JTcGFjZUlEKHtcclxuICAgICAgY29vcmRpbmF0ZTogSlNPTi5zdHJpbmdpZnkocGxhY2VtZW50LnBvc2l0aW9uKSxcclxuICAgICAgdHlwZTogcG9pVHlwZSxcclxuICAgICAgZWxlbWVudElEOiBlbGVtZW50LmlkLFxyXG4gICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoeyBub3JtYWw6IHBsYWNlbWVudC5ub3JtYWwgfSksXHJcbiAgICB9IGFzIFBPSSk7XHJcblxyXG4gICAgLy8gRHJhdyBpdCBzdHJhaWdodCBhd2F5IHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSBuZXh0IHJlZnJlc2gsIHNvIHRoZSB1c2VyIHNlZXMgd2hlcmUgdGhlXHJcbiAgICAvLyB0aGluZyB0aGV5IGp1c3QgY3JlYXRlZCBlbmRlZCB1cC4gVGhyb3VnaCB0aGUgc2FtZSBwYXRoIHRoZSByZWZyZXNoIHVzZXMsIHNvIGl0IGFycml2ZXMgd2l0aFxyXG4gICAgLy8gdGhlIHR5cGUncyBpY29uIGluc3RlYWQgb2YgdGhlIGJhcmUgbWFya2VyIC0gdGhlIGRpZmZlcmVuY2Ugd2FzIHZpc2libGUgdW50aWwgdGhlIG5leHQgcmVsb2FkLlxyXG4gICAgYXdhaXQgdGhpcy5hZGRUaHJlZUpzVGFnRnJvbVBPSShlbGVtZW50LCBwb2kpO1xyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcclxuICAgIHJldHVybiBwb2k7XHJcbiAgfVxyXG5cclxuICAvKiogRW1pdHMgd2hlbiBhIHRhZyBpcyBkcm9wcGVkIG9uIHRoZSBtb2RlbCBpbiB0aGUgVGhyZWUuanMgc2NlbmUuICovXHJcbiAgZ2V0IHRocmVlSnNUYWdQbGFjZWQkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UudGFnUGxhY2VkJDtcclxuICB9XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSBjYWxpYnJhdGlvbiB3YWxrdGhyb3VnaCBpcyBhYmFuZG9uZWQsIGluY2x1ZGluZyB2aWEgRXNjYXBlLiAqL1xyXG4gIGdldCB0aHJlZUpzQWxpZ25tZW50Q2FuY2VsbGVkJCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLmFsaWdubWVudENhbmNlbGxlZCQ7XHJcbiAgfVxyXG5cclxuICAvKiogTGVhdmVzIFRocmVlLmpzIHRhZyBwbGFjZW1lbnQgbW9kZSB3aXRob3V0IHBsYWNpbmcgYW55dGhpbmcuICovXHJcbiAgY2FuY2VsVGhyZWVKc1RhZ1BsYWNlbWVudCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2FuY2VsVGFnUGxhY2VtZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlZGl0T25seVRhZ1N0eWxlRm9yUG9pKHBvaTogUE9JLCBvYmplY3Q6IERiT2JqZWN0VHlwZSkge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChwb2kuZWxlbWVudElEKTtcclxuICAgICAgaWYgKHRhZ0RhdGEudGFnKSB7XHJcbiAgICAgICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0TWF0dGVyVGFnRGF0YUZvck1hdHRlcnRhZyhcclxuICAgICAgICAgIHRhZ0RhdGEudGFnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIFBvaVR5cGUuUk9PTSk7XHJcbiAgICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5zZXRUYWdJY29uQW5kT3BhY2l0eSh0YWdEYXRhLnRhZywgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEljb25BbmRTZXRGb3JQb2kocG9pOiBQT0ksIGljb25QYXRoOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQocG9pLmVsZW1lbnRJRCk7XHJcbiAgICAgIGlmICh0YWdEYXRhLnRhZykge1xyXG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWRkTmV3SWNvbkFuZFNldEZvclRhZyh0YWdEYXRhLnRhZywgaWNvblBhdGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VUb1JlZ2lzdHJlZEljb25Gb3JQb2kocG9pOiBQT0ksIGljb25OYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQocG9pLmVsZW1lbnRJRCk7XHJcbiAgICAgIGlmICh0YWdEYXRhLnRhZykge1xyXG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0UmVnaXN0cmVkSWNvbkZvclRhZyh0YWdEYXRhLnRhZywgaWNvbk5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVIdG1sVGFnRm9yUG9pV2l0aE9iamVjdChwb2k6IFBPSSwgb2JqZWN0OiBEYk9iamVjdFR5cGUpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQocG9pLmVsZW1lbnRJRCk7XHJcbiAgICAgIGlmICh0YWdEYXRhLnRhZykge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UudXBkYXRlSW5qZWN0ZWRIdG1sRm9yVGFnSUQoXHJcbiAgICAgICAgICB0YWdEYXRhLnRhZyxcclxuICAgICAgICAgIG9iamVjdCxcclxuICAgICAgICAgIHBvaS50eXBlXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZSBhbiBleGlzdGluZyBwb2kgaW4gTWF0dGVycG9ydFxyXG4gICAqIEBwYXJhbSBwb2lcclxuICAgKiBAcGFyYW0gZWxlbWVudFxyXG4gICAqL1xyXG4gIGFzeW5jIGFjdGlvbl9tb3ZlX3BvaV92aXN1YWxseShcclxuICAgIHBvaTogUE9JLFxyXG4gICAgZWxlbWVudDogVGlja2V0IHwgRmVhdHVyZSB8IEVxdWlwbWVudCB8IENvbW1lbnRcclxuICApIHtcclxuICAgIGF3YWl0IHRoaXMuYWN0aW9uX2RlbGV0ZV9lbGVtZW50KGVsZW1lbnQpO1xyXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25BZGRPYmplY3RGcm9tUE9JKGVsZW1lbnQsIHBvaSk7XHJcbiAgfVxyXG5cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBDdXBpeFxyXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG5cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBNYXR0ZXJwb3J0XHJcbiAgICBodHRwczovL21hdHRlcnBvcnQuZ2l0aHViLmlvL3Nob3djYXNlLXNkay9kb2NzL3Nkay9yZWZlcmVuY2UvY3VycmVudC9tb2R1bGVzL21hdHRlcnRhZy5odG1sI2FkZFxyXG4gICAgaHR0cHM6Ly9tYXR0ZXJwb3J0LmdpdGh1Yi5pby9zaG93Y2FzZS1zZGsvZG9jcy9zZGsvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy9tYXR0ZXJ0YWcuaHRtbCNyZW1vdmVcclxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG5cclxuICBpbml0VGhyZWVKcyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5pbml0KGNhbnZhcyk7XHJcbiAgICAvLyBUaGUgdGFnIHBpcGVsaW5lIGlzIGdhdGVkIG9uIHRoaXMgZmxhZywgd2hpY2ggdW50aWwgbm93IG9ubHkgdGhlIE1hdHRlcnBvcnQgU0RLIHNldC4gQVxyXG4gICAgLy8gVGhyZWUuanMgdmlzaXQgbmV2ZXIgcmVhY2hlcyB0aGF0IGNvZGUsIHNvIGV2ZXJ5IHRhZyB3YXMgZHJvcHBlZCBiZWZvcmUgaXQgY291bGQgYmUgZHJhd24uXHJcbiAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSB0cnVlO1xyXG5cclxuICAgIC8vIEV2ZXJ5dGhpbmcgdGhhdCBsb2FkcyBkYXRhIGZvciBhIHNwYWNlIC0gdGlja2V0cywgZXF1aXBtZW50cywgZmVhdHVyZXMsIG1lYXN1cmVtZW50cyAtIGhhbmdzXHJcbiAgICAvLyBvZmYgdGhpcyBldmVudCwgd2hpY2ggTWF0dGVycG9ydCByYWlzZXMgb25jZSBpdHMgU0RLIHN0YXJ0cyBwbGF5aW5nLiBBIFRocmVlLmpzIHZpc2l0IG5ldmVyXHJcbiAgICAvLyB0b3VjaGVzIHRoZSBTREssIHNvIG5vdGhpbmcgZXZlciBhbm5vdW5jZWQgdGhlIHNwYWNlIGFuZCBldmVyeSBsaXN0IGNhbWUgYmFjayBlbXB0eS5cclxuICAgIGlmICh0aGlzLmN1cnJlbnRTcGFjZUlEKSB7XHJcbiAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcclxuICAgICAgICBzcGFjZUlEOiB0aGlzLmN1cnJlbnRTcGFjZUlELFxyXG4gICAgICAgIG1vZGVsM0Q6IG51bGwsXHJcbiAgICAgICAgc3dlZXA6IG51bGwsXHJcbiAgICAgICAgcm90YXRpb246IG51bGwsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmRhdGFJc0xvYWRlZC5uZXh0KHRydWUpO1xyXG4gICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGEgM0QgbW9kZWwgaW50byB0aGUgVGhyZWUuanMgc2NlbmUgKEdMVEYpLlxyXG4gICAqIE9ubHkgd29ya3Mgd2hlbiB0aGUgdmlld2VyIGlzIGluICd0aHJlZWpzJyBtb2RlLlxyXG4gICAqL1xyXG4gIGxvYWRHTFRGTW9kZWwodXJsOiBzdHJpbmcsIGNhbWVyYVBvc2l0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCByb3RhdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5sb2FkR0xURk1vZGVsKHVybCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGEgR0xCIHN0b3JlZCBpbiBTMywgZ2l2ZW4gaXRzIGtleSAoZS5nLiBgdmlzaXRzLzxpZD4vbW9kZWwuZ2xiYCkuXHJcbiAgICpcclxuICAgKiBSZXNvbHZlcyB0aGUga2V5IHRvIGEgc2lnbmVkIFVSTCBmaXJzdCwgdGhlbiBsb2FkcyBpdCBsaWtlIGFueSBvdGhlci4gVGhlIHNpZ25lZCBVUkwgb25seVxyXG4gICAqIGNvdmVycyBhdXRoZW50aWNhdGlvbiAtIHRoZSBidWNrZXQgc3RpbGwgbmVlZHMgYSBDT1JTIHJ1bGUgYWxsb3dpbmcgR0VUIGZyb20gdGhlIGFwcCdzIG9yaWdpbixcclxuICAgKiBvciB0aGUgYnJvd3NlciBibG9ja3MgdGhlIGRvd25sb2FkIGJlZm9yZSBpdCBzdGFydHMuXHJcbiAgICpcclxuICAgKiBgcGxhY2VtZW50TWV0YWRhdGFgIGlzIHRoZSBjYXB0dXJlJ3Mgc3RvcmVkIHBsYWNlbWVudDsgd2hlbiBhYnNlbnQgb3IgdW51c2FibGUgdGhlIHZpZXdlciBmYWxsc1xyXG4gICAqIGJhY2sgdG8gZnJhbWluZyB0aGUgbW9kZWwgYXV0b21hdGljYWxseS5cclxuICAgKi9cclxuICBhc3luYyBsb2FkR0xURk1vZGVsRnJvbVMzKGtleTogc3RyaW5nLCBwbGFjZW1lbnRNZXRhZGF0YT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEEga2V5IHVuZGVyIGFzc2V0cy8gaXMgc2VydmVkIGJ5IHRoZSBhcHAgaXRzZWxmLCBzbyBpdCBuZWVkcyBubyBzaWduaW5nLiBUaGlzIGlzIHdoYXQgbGV0cyBhXHJcbiAgICAvLyBtb2RlbCBidW5kbGVkIHdpdGggdGhlIGJ1aWxkIHN0YW5kIGluIGZvciBvbmUgaW4gUzMgd2hpbGUgdGhlIHR3byBhcmUgb3RoZXJ3aXNlIGlkZW50aWNhbC5cclxuICAgIGNvbnN0IGlzTG9jYWxBc3NldCA9IGtleS5zdGFydHNXaXRoKCdhc3NldHMvJyk7XHJcbiAgICBjb25zdCB1cmwgPSBpc0xvY2FsQXNzZXQgPyBrZXkgOiBhd2FpdCBnZXRTaWduZWRGaWxlKGtleSk7XHJcbiAgICBpZiAoIXVybCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBWaWV3ZXJTZXJ2aWNlOiBjb3VsZCBub3QgcmVzb2x2ZSBhIHNpZ25lZCBVUkwgZm9yIHRoZSAzRCBtb2RlbCBhdCBcIiR7a2V5fVwiLmApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBwbGFjZW1lbnQgPSBwYXJzZVRocmVlSnNQbGFjZW1lbnQocGxhY2VtZW50TWV0YWRhdGEpO1xyXG4gICAgLy8gVGhlIGtleSwgbm90IHRoZSBzaWduZWQgVVJMLCBpcyB3aGF0IGlkZW50aWZpZXMgdGhlIG1vZGVsIGFjcm9zcyBsb2FkcyAtIHRoZSBzaWduYXR1cmUgbWFrZXNcclxuICAgIC8vIGV2ZXJ5IFVSTCB1bmlxdWUsIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoZSBicm93c2VyJ3Mgb3duIGNhY2hlIG5ldmVyIGhlbHBzIGhlcmUuXHJcbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmxvYWRHTFRGTW9kZWwodXJsLCBwbGFjZW1lbnQ/LmNhbWVyYVBvc2l0aW9uLCBwbGFjZW1lbnQ/LnJvdGF0aW9uLCBrZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZHMgYSAzRCBtb2RlbCBpbnRvIHRoZSBUaHJlZS5qcyBzY2VuZSAoT0JKKS5cclxuICAgKi9cclxuICBsb2FkT2JqTW9kZWwobXRsVXJsOiBzdHJpbmcsIG9ialVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UubG9hZE9iak1vZGVsKG10bFVybCwgb2JqVXJsLCBjYW1lcmFQb3NpdGlvbiwgcm90YXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHRocmVlSnNPYmplY3RIb3ZlcmVkJCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLm9iamVjdEhvdmVyZWQkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRocmVlSnNPYmplY3RDbGlja2VkJCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLm9iamVjdENsaWNrZWQkO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVtaXRzIHRydWUgd2hpbGUgYSBoZWF2eSAub2JqIGZpbGUgaXMgYmVpbmcgcGFyc2VkIChpbiBhIHdvcmtlciwgd2hlbiBhdmFpbGFibGUpLCBmYWxzZSBvbmNlIGRvbmUuICovXHJcbiAgZ2V0IHRocmVlSnNNb2RlbExvYWRpbmckKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UubW9kZWxMb2FkaW5nJDtcclxuICB9XHJcblxyXG4gIC8qKiBEb3dubG9hZCBwcm9ncmVzcyBmb3IgR0xCIG1vZGVscyBhcyBhIDAtMSBmcmFjdGlvbiwgb3IgbnVsbCB3aGVuIHRoZSBzaXplIGlzbid0IGtub3duIHVwZnJvbnQuICovXHJcbiAgZ2V0IHRocmVlSnNNb2RlbExvYWRQcm9ncmVzcyQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5tb2RlbExvYWRQcm9ncmVzcyQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlcnMgdGhlIFdlYiBXb3JrZXIgdXNlZCB0byBwYXJzZSBoZWF2eSAub2JqIGZpbGVzIG9mZiB0aGUgbWFpbiB0aHJlYWQuXHJcbiAgICogTXVzdCBiZSBjcmVhdGVkIGJ5IHRoZSBhcHAgKHNlZSBvYmotcGFyc2VyLndvcmtlci50cyksIHNpbmNlIHRoaXMgbGlicmFyeSBjYW4ndCBidW5kbGUgd29ya2VyIGZpbGVzLlxyXG4gICAqL1xyXG4gIHNldE9ialBhcnNlcldvcmtlcih3b3JrZXI6IFdvcmtlcik6IHZvaWQge1xyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRPYmpQYXJzZXJXb3JrZXIod29ya2VyKTtcclxuICB9XHJcblxyXG4gIGFkZFRocmVlSnNPYmplY3RzKG9ianM6IGFueVtdKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnVwZGF0ZU9ianNUb1NjZW5lKG9ianMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaW5pdE1hdHRlcnBvcnRTZGsoXHJcbiAgICBzcGFjZUlEOiBzdHJpbmcsXHJcbiAgICBtb2RlbDNEOiBzdHJpbmcsXHJcbiAgICB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZSxcclxuICAgIG1vZHVsZTogU3BNb2R1bGUgPSBTcE1vZHVsZS5JTU1PXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmlzTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmN1cnJlbnRTcGFjZUlEID0gc3BhY2VJRDtcclxuICAgIGlmICh0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNkaykge1xyXG4gICAgICBhd2FpdCB0aGlzLmNsZWFyQWxsKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0U2VydmljZVxyXG4gICAgICAuaW5pdFNkayh0YWdTZXJ2aWNlLCBtb2R1bGUpXHJcbiAgICAgIC50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICBjb25zdCB7IHNkayB9ID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZTtcclxuXHJcbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICAgIHNkay5TY2VuZS5yZWdpc3RlcihzZWN1cml0eUNhbWVyYVR5cGUsIG1ha2VTZWN1cml0eUNhbWVyYS5iaW5kKHNkay5TY2VuZSkpLFxyXG4gICAgICAgICAgICBzZGsuU2NlbmUucmVnaXN0ZXIoVmlld0ZydXN0dW1NZXNoVHlwZSwgbWFrZVZpZXdGcnVzdHVtTWVzaC5iaW5kKHNkay5TY2VuZSkpXHJcbiAgICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIHNkay5BcHAuc3RhdGUuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoYXBwU3RhdGUpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdUaGUgY3VycmVudCBwaGFzZTogJywgYXBwU3RhdGUucGhhc2UpO1xyXG4gICAgICAgICAgICAgIGlmIChhcHBTdGF0ZS5waGFzZSA9PT0gc2RrLkFwcC5QaGFzZS5QTEFZSU5HKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVGhlIGFwcCBpcyBwbGF5aW5nJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJJc09uLm5leHQoe1xyXG4gICAgICAgICAgICAgICAgICBzcGFjZUlELFxyXG4gICAgICAgICAgICAgICAgICBtb2RlbDNELFxyXG4gICAgICAgICAgICAgICAgICBzd2VlcDogdGhpcy5zd2VlcFRvTW92ZSxcclxuICAgICAgICAgICAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb25Ub01vdmUsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUlzTG9hZGVkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dlZXBUb01vdmUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3RhdGlvblRvTW92ZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgdGhpcy52aWV3ZXJJc09uLm5leHQoe1xyXG4gICAgICAgICAgICBzcGFjZUlELFxyXG4gICAgICAgICAgICBtb2RlbDNELFxyXG4gICAgICAgICAgICBzd2VlcDogdGhpcy5zd2VlcFRvTW92ZSxcclxuICAgICAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb25Ub01vdmUsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMuZGF0YUlzTG9hZGVkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuc3dlZXBUb01vdmUgPSBudWxsO1xyXG4gICAgICAgICAgdGhpcy5yb3RhdGlvblRvTW92ZSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVGb3JiaWRkZW5Td2VlcHMoZm9yYmlkZGVuU3dlZXBzOiBzdHJpbmdbXSkge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5yZW1vdmVGb3JiaWRkZW5Td2VlcHMoZm9yYmlkZGVuU3dlZXBzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldE9iamVjdDNETG9hZGVkSW5Qb3NpdGlvbihvYmplY3RMb2FkZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNPYmplY3RMb2FkZWQgPSBvYmplY3RMb2FkZWQ7XHJcbiAgfVxyXG5cclxuICBpc09iamVjdDNETG9hZGVkSW5Qb3NpdGlvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzT2JqZWN0TG9hZGVkO1xyXG4gIH1cclxufVxyXG4iXX0=
1032
+ }] }, { type: i1.PoiService }, { type: i2.MatterportService }, { type: i3.ThreeJsService }, { type: i4.SweepLocatorService }] });
1033
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFDOUIseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSy9CLE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsT0FBTyxFQUtQLFFBQVEsR0FDVCxNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ2pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBRXRILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFrQixNQUFNLG9CQUFvQixDQUFDOzs7Ozs7O0FBTTFILE1BQU0sT0FBTyxhQUFhO0lBOEV1QjtJQUNWO0lBQzNCO0lBQ0E7SUFDQTtJQUNBO0lBbEZGLFVBQVUsR0FBVyxZQUFZLENBQUM7SUFFbkMsY0FBYyxDQUFTO0lBRXRCLE9BQU8sQ0FBUztJQUVqQixVQUFVLEdBS1osSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUVaLFlBQVksR0FBcUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUUvQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRWpCLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFFN0I7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QyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBRTNCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzNCLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxlQUF5QjtRQUM3QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxZQUFxQjtRQUMvQyxJQUFJLENBQUMsY0FBYyxHQUFHLFlBQVksQ0FBQztJQUNyQyxDQUFDO0lBRUQsMEJBQTBCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO3dHQXpxQ1UsYUFBYSxrQkE4RWQsa0JBQWtCLGFBQ2xCLFFBQVE7NEdBL0VQLGFBQWEsY0FGWixNQUFNOzs0RkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBK0VJLE1BQU07MkJBQUMsa0JBQWtCOzswQkFDekIsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cclxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cclxuLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTUFUVEVSUE9SVF9TREtfS0VZIH0gZnJvbSAnLi4vdG9rZW5zL21hdHRlcnBvcnQtc2RrLWtleS50b2tlbic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWF0dGVycG9ydFNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRocmVlSnNNZWFzdXJlbWVudCwgVGhyZWVKc1NlcnZpY2UgfSBmcm9tICcuL3RocmVlanMuc2VydmljZSc7XHJcbmltcG9ydCB7IFN3ZWVwTG9jYXRvclNlcnZpY2UgfSBmcm9tICcuL3N3ZWVwLWxvY2F0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VUYWdTZXJ2aWNlIH0gZnJvbSAnLi90YWcuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgRGJPYmplY3RUeXBlLFxyXG4gIFBPSSxcclxuICBWaWV3ZXJJbnRlcmFjdGlvbnMsXHJcbiAgUG9pVHlwZSxcclxuICBDb21tZW50LFxyXG4gIEVxdWlwbWVudCxcclxuICBUaWNrZXQsXHJcbiAgRmVhdHVyZSxcclxuICBTcE1vZHVsZSxcclxufSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9pU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL3BvaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgbWFrZVNlY3VyaXR5Q2FtZXJhLCBzZWN1cml0eUNhbWVyYVR5cGUgfSBmcm9tIFwiLi4vbWF0dGVycG9ydC1leHRlbnNpb25zL3NlY3VyaXR5LWNhbWVyYS9TZWN1cml0eUNhbWVyYVwiO1xyXG5pbXBvcnQgeyBWaWV3RnJ1c3R1bU1lc2hUeXBlLCBtYWtlVmlld0ZydXN0dW1NZXNoIH0gZnJvbSBcIi4uL21hdHRlcnBvcnQtZXh0ZW5zaW9ucy92aWV3LWZydXN0dW0tbWVzaC9WaWV3RnJ1c3R1bU1lc2hcIjtcclxuaW1wb3J0IHsgTmF2aWdhdG9yU2VydmljZSB9IGZyb20gJy4vbmF2aWdhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBnZXRTaWduZWRGaWxlIH0gZnJvbSAnLi9zMy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZ2V0VGhyZWVKc1BvaU9yaWdpbiwgcGFyc2VUaHJlZUpzUGxhY2VtZW50LCBUSFJFRUpTX01PREVMX1VQX09QVElPTlMsIFRocmVlSnNNb2RlbFVwIH0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWaWV3ZXJTZXJ2aWNlIHtcclxuICBwcml2YXRlIHZpZXdlck1vZGU6IHN0cmluZyA9ICdNYXR0ZXJwb3J0JztcclxuXHJcbiAgcHVibGljIGN1cnJlbnRNb2RlbDNEOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgdG91clVybDogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgdmlld2VySXNPbjogU3ViamVjdDx7XHJcbiAgICBzcGFjZUlEOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgbW9kZWwzRDogc3RyaW5nIHwgbnVsbDtcclxuICAgIHN3ZWVwOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcm90YXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IH0gfCBudWxsO1xyXG4gIH0+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHVibGljIGRhdGFJc0xvYWRlZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHB1YmxpYyBpc0xvYWRlZCA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgc2hvd2luZ1ZpZXdlciA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc3BhY2UgYmVpbmcgdmlld2VkLCB3aGljaGV2ZXIgdmlld2VyIGlzIHNob3dpbmcgaXQuXHJcbiAgICpcclxuICAgKiBNYXR0ZXJwb3J0U2VydmljZSBjYXJyaWVzIGl0cyBvd24gY29weSwgc2V0IHdoaWxlIGl0cyBTREsgY29ubmVjdHMgLSB3aGljaCBuZXZlciBoYXBwZW5zIGluXHJcbiAgICogVGhyZWUuanMgbW9kZS4gQW55dGhpbmcgdGhhdCByZWFkcyBvbmx5IHRoYXQgb25lIHNpbGVudGx5IGRvZXMgbm90aGluZyBmb3IgYSAzRCBtb2RlbCwgYW5kIHRoZVxyXG4gICAqIGxpc3RzIHRoYXQgZmVlZCB0YWdzIGFyZSBleGFjdGx5IHRoYXQuXHJcbiAgICovXHJcbiAgcHVibGljIGN1cnJlbnRTcGFjZUlEOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIFRocmVlLmpzIGNhcHR1cmUgb24gc2NyZWVuLCBvciBudWxsIGluIE1hdHRlcnBvcnQuXHJcbiAgICpcclxuICAgKiBBIHNwYWNlIGNhbiBob2xkIHNldmVyYWwgM0QgbW9kZWxzLiBBIHRhZyBwbGFjZWQgaW4gb25lIGlzIHJlY29yZGVkIHdpdGggaXQsIHNvIHRoYXQgbW9kZWxcclxuICAgKiBrZWVwcyBzaG93aW5nIHRoZSB0YWcgd2hhdGV2ZXIgc2VsZWN0aW9uIG9mIHRhZ3MgaXQgaXMgb3RoZXJ3aXNlIHJlc3RyaWN0ZWQgdG8uXHJcbiAgICovXHJcbiAgcHVibGljIGN1cnJlbnRDYXB0dXJlSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSAzRCBtb2RlbCBvbiBzY3JlZW4gaGFzIGJlZW4gY2FsaWJyYXRlZCBhZ2FpbnN0IHRoZSB0YWdzJyBzaGFyZWQgc3BhY2UuXHJcbiAgICpcclxuICAgKiBDYWxpYnJhdGluZyBpcyB3aGF0IHNheXMgdGhlIG1vZGVsIGFuZCB0aGF0IHNwYWNlIG92ZXJsYXAuIFVudGlsIHRoZW4gYSB0YWcgcGxhY2VkIGluIHRoZSBtb2RlbFxyXG4gICAqIGlzIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlczogaXQgYmVsb25ncyB0byBubyBNYXR0ZXJwb3J0IHN3ZWVwIGFuZCB0byBubyBvdGhlciB2aXNpdC5cclxuICAgKi9cclxuICBwcml2YXRlIHRocmVlSnNDYWxpYnJhdGVkID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBzd2VlcFRvTW92ZTogc3RyaW5nIHwgbnVsbDtcclxuXHJcbiAgcHVibGljIHJvdGF0aW9uVG9Nb3ZlOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB9IHwgbnVsbDtcclxuXHJcbiAgcHVibGljIGdvVG9UcmlnZ2VyZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwdWJsaWMgdG9vbGJveFN0YXRlcyA9IHtcclxuICAgIGRvbGxob3VzZToge1xyXG4gICAgICBzdGF0OiBmYWxzZSxcclxuICAgICAgaWNvbklkOiAndWktZG9sbGhvdXNlJyxcclxuICAgICAgc2hvdygpIHtcclxuICAgICAgfSxcclxuICAgICAgaGlkZSgpIHtcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBmbG9vcnBsYW46IHtcclxuICAgICAgc3RhdDogZmFsc2UsXHJcbiAgICB9LFxyXG4gICAgbWVzdXJlOiB7XHJcbiAgICAgIHN0YXQ6IGZhbHNlLFxyXG4gICAgICBpY29uSWQ6ICd1aS1tZXN1cmUnLFxyXG4gICAgICBzaG93KCkge1xyXG4gICAgICB9LFxyXG4gICAgICBoaWRlKCkge1xyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIGZpbHRlcjoge1xyXG4gICAgICBzdGF0OiBmYWxzZSxcclxuICAgIH0sXHJcbiAgfTtcclxuICBwcml2YXRlIGlzT2JqZWN0TG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChNQVRURVJQT1JUX1NES19LRVkpIHByaXZhdGUgcmVhZG9ubHkgc2RrS2V5OiBzdHJpbmcsXHJcbiAgICBASW5qZWN0KCdjb25maWcnKSBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBwb2lTZXJ2aWNlOiBQb2lTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtYXR0ZXJwb3J0U2VydmljZTogTWF0dGVycG9ydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRocmVlSnNTZXJ2aWNlOiBUaHJlZUpzU2VydmljZSxcclxuICAgIHByaXZhdGUgc3dlZXBMb2NhdG9yOiBTd2VlcExvY2F0b3JTZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgdGhpcy5zZXRNb2RlKCdNYXR0ZXJwb3J0Jyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgVXRpbHNcclxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbiAgY2hlY2tNb2RlKGluZGV4TW9kZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy52aWV3ZXJNb2RlID09PSBpbmRleE1vZGU7XHJcbiAgfVxyXG5cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICBTZXR0ZXJzXHJcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcblxyXG4gIHNldE1vZGUoaW5kZXhNb2RlOiBzdHJpbmcpIHtcclxuICAgIC8vIExlYXZpbmcgVGhyZWUuanMgbWVhbnMgbm8gVGhyZWUuanMgd29yayBzaG91bGQgc3RpbGwgYmUgcnVubmluZy4gVGhlIHNlcnZpY2UgYmVoaW5kIGl0IGlzIGFcclxuICAgIC8vIHNpbmdsZXRvbiBhbmQgb3V0bGl2ZXMgdGhlIGNvbXBvbmVudCwgc28gYSBkb3dubG9hZCBzdGFydGVkIGZvciBhIG1vZGVsIHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWRcclxuICAgIC8vIGF3YXkgZnJvbSB3b3VsZCBvdGhlcndpc2UgZmluaXNoIC0gYW5kIGl0cyBwYXJzZSB3b3VsZCBob2xkIHRoZSBtYWluIHRocmVhZCBmb3Igc2Vjb25kcyxcclxuICAgIC8vIHN0YWxsaW5nIHdoYXRldmVyIHZpZXdlciB0aGV5IGFjdHVhbGx5IG9wZW5lZC5cclxuICAgIGlmICh0aGlzLnZpZXdlck1vZGUgPT09ICd0aHJlZWpzJyAmJiBpbmRleE1vZGUgIT09ICd0aHJlZWpzJykge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmRlc3Ryb3koKTtcclxuICAgIH1cclxuICAgIHRoaXMudmlld2VyTW9kZSA9IGluZGV4TW9kZTtcclxuICB9XHJcblxyXG4gIHNldFRvdXJVcmwob3B0aW9uczoge1xyXG4gICAgbW9kZWwzZDogc3RyaW5nLFxyXG4gICAgc2hvd0ljb25QbGFuPzogYm9vbGVhbixcclxuICAgIHNob3dJY29uRG9sbGhvdXNlPzogYm9vbGVhbixcclxuICAgIHNob3dJY29uRmxvb3JzPzogYm9vbGVhbixcclxuICAgIHNob3dRdWlja1N0YXJ0PzogYm9vbGVhbixcclxuICAgIHNob3dGdWxsc2NyZWVuPzogYm9vbGVhbixcclxuICAgIHNob3dHdWlkZWRUb3VyPzogYm9vbGVhbixcclxuICAgIHNob3dIaWdobGlnaHRSZWVsPzogYm9vbGVhbixcclxuICAgIHNob3dEZWZ1cm5pc2g/OiBib29sZWFuLFxyXG4gICAgc2hvd1Jvb21NZWFzdXJlbWVudHM/OiBib29sZWFuXHJcbiAgfSkge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBtb2RlbDNkLFxyXG4gICAgICBzaG93SWNvblBsYW4gPSB0cnVlLFxyXG4gICAgICBzaG93SWNvbkRvbGxob3VzZSA9IHRydWUsXHJcbiAgICAgIHNob3dJY29uRmxvb3JzID0gdHJ1ZSxcclxuICAgICAgc2hvd1F1aWNrU3RhcnQgPSB0cnVlLFxyXG4gICAgICBzaG93RnVsbHNjcmVlbiA9IHRydWUsXHJcbiAgICAgIHNob3dHdWlkZWRUb3VyID0gdHJ1ZSxcclxuICAgICAgc2hvd0hpZ2hsaWdodFJlZWwgPSB0cnVlLFxyXG4gICAgICBzaG93RGVmdXJuaXNoID0gdHJ1ZSxcclxuICAgICAgc2hvd1Jvb21NZWFzdXJlbWVudHMgPSB0cnVlXHJcbiAgICB9ID0gb3B0aW9ucztcclxuXHJcbiAgICBjb25zdCBiYXNlVXJsID0gYC9hc3NldHMvYnVuZGxlL3Nob3djYXNlLmh0bWxgO1xyXG5cclxuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvLyBNb2TDqGxlXHJcbiAgICBwYXJhbXMucHVzaChgbT0ke21vZGVsM2R9YCk7XHJcblxyXG4gICAgLy8gQ29tcG9ydGVtZW50IGfDqW7DqXJhbFxyXG4gICAgcGFyYW1zLnB1c2goYHBsYXk9MWApO1xyXG4gICAgcGFyYW1zLnB1c2goYHVpPTFgKTtcclxuICAgIHBhcmFtcy5wdXNoKGB0aXRsZT0wYCk7XHJcbiAgICBwYXJhbXMucHVzaChgbG9nPTBgKTtcclxuICAgIHBhcmFtcy5wdXNoKGBicmFuZD0wYCk7XHJcbiAgICBwYXJhbXMucHVzaChgc2VhcmNoPTBgKTtcclxuICAgIHBhcmFtcy5wdXNoKGBhcHBsaWNhdGlvbktleT0ke3RoaXMuc2RrS2V5fWApO1xyXG4gICAgcGFyYW1zLnB1c2goYG1kcz0wYCk7XHJcblxyXG4gICAgLy8gUXVpY2sgc3RhcnRcclxuICAgIGlmIChzaG93UXVpY2tTdGFydCkge1xyXG4gICAgICBwYXJhbXMucHVzaChgcXM9MWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZsb29ycGxhbiAocGxhbilcclxuICAgIGlmICghc2hvd0ljb25QbGFuKSB7XHJcbiAgICAgIHBhcmFtcy5wdXNoKGBmcD0wYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRG9sbGhvdXNlIChtYWlzb24vcG91cMOpZSlcclxuICAgIGlmICghc2hvd0ljb25Eb2xsaG91c2UpIHtcclxuICAgICAgcGFyYW1zLnB1c2goYGRoPTBgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTw6lsZWN0ZXVyIGTigJnDqXRhZ2VzXHJcbiAgICBpZiAoIXNob3dJY29uRmxvb3JzKSB7XHJcbiAgICAgIHBhcmFtcy5wdXNoKGBzZj0wYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR3VpZGVkIHRvdXJcclxuICAgIGlmICghc2hvd0d1aWRlZFRvdXIpIHtcclxuICAgICAgcGFyYW1zLnB1c2goYGd0PTBgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBIaWdobGlnaHQgcmVlbCAoYmFuZGUgZHUgYmFzKVxyXG4gICAgaWYgKCFzaG93SGlnaGxpZ2h0UmVlbCkge1xyXG4gICAgICAvLyBTZWxvbiB0b24gYnVuZGxlIDogaHI9MSBvdSBocj0wIG1hc3F1ZVxyXG4gICAgICBwYXJhbXMucHVzaChgaHI9MWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBsZWluIMOpY3JhblxyXG4gICAgaWYgKCFzaG93RnVsbHNjcmVlbikge1xyXG4gICAgICBwYXJhbXMucHVzaChgZnM9MGApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERlZnVybmlzaFxyXG4gICAgaWYgKHNob3dEZWZ1cm5pc2gpIHtcclxuICAgICAgcGFyYW1zLnB1c2goYGFkPTFgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSb29tIE1lYXN1cmVtZW50c1xyXG4gICAgaWYgKHNob3dSb29tTWVhc3VyZW1lbnRzKSB7XHJcbiAgICAgIHBhcmFtcy5wdXNoKGBtZWFzdXJlbWVudHM9MWApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudG91clVybCA9IGAke2Jhc2VVcmx9PyR7cGFyYW1zLmpvaW4oXCImXCIpfWA7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjbGVhckFsbCgpIHtcclxuICAgIC8vIHRoaXMuc3dlZXBUb01vdmUgPSBudWxsO1xyXG4gICAgLy8gdGhpcy5yb3RhdGlvblRvTW92ZSA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmRlc3Ryb3koKTtcclxuICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgLy8gTWlycm9ycyB0aGUgTWF0dGVycG9ydCBicmFuY2g6IHRoZSBzcGFjZSBpcyBubyBsb25nZXIgb24gc2NyZWVuLCBzbyB3aGF0ZXZlciB3YXMgbG9hZGVkXHJcbiAgICAgIC8vIGZvciBpdCBoYXMgdG8gYmUgZHJvcHBlZCBiZWZvcmUgYW5vdGhlciB2aXNpdCBvcGVucy5cclxuICAgICAgdGhpcy52aWV3ZXJJc09uLm5leHQoe1xyXG4gICAgICAgIHNwYWNlSUQ6IG51bGwsXHJcbiAgICAgICAgbW9kZWwzRDogbnVsbCxcclxuICAgICAgICBzd2VlcDogbnVsbCxcclxuICAgICAgICByb3RhdGlvbjogbnVsbCxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jbGVhckFsbCgpO1xyXG4gICAgICB0aGlzLnZpZXdlcklzT24ubmV4dCh7XHJcbiAgICAgICAgc3BhY2VJRDogbnVsbCxcclxuICAgICAgICBtb2RlbDNEOiBudWxsLFxyXG4gICAgICAgIHN3ZWVwOiBudWxsLFxyXG4gICAgICAgIHJvdGF0aW9uOiBudWxsLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgIEdldHRlcnNcclxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbiAgZ2V0TW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdlck1vZGU7XHJcbiAgfVxyXG5cclxuICBnZXRWaWV3ZXJTZWxlY3RlZFNlcnZpY2UoKSB7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICAvLyBpZiAodGhpcy5jaGVja01vZGUoXCJNYXR0ZXJwb3J0XCIpKSB7XHJcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2V0TWF0dGVycG9ydFNlcnZpY2UoKTtcclxuICAgIC8vIH1cclxuICAgIHJldHVybiB0aGlzLmdldE1hdHRlcnBvcnRTZXJ2aWNlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRUb3VyVXJsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudG91clVybDtcclxuICB9XHJcblxyXG4gIGdldE1hdHRlcnBvcnRTZXJ2aWNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFNlcnZpY2U7XHJcbiAgfVxyXG5cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICBHZW5lcmljIE1haW4gYWN0aW9uIGZ1bmN0aW9uc1xyXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIHNldFN3ZWVwVG9Nb3ZlKHN3ZWVwOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3dlZXBUb01vdmUgPSBzd2VlcDtcclxuICB9XHJcblxyXG4gIHNldFJvdGF0aW9uVG9Nb3ZlKHJvdGF0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB9KSB7XHJcbiAgICB0aGlzLnJvdGF0aW9uVG9Nb3ZlID0gcm90YXRpb247XHJcbiAgfVxyXG5cclxuXHJcbiAgYXN5bmMgYWN0aW9uX21vdmVfdG9fdGFnKGVsZW1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElkKTtcclxuICAgICAgaWYgKHJlc3VsdC50YWcpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdvVG9UYWcocmVzdWx0LnRhZyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlc3VsdC5zd2VlcCkge1xyXG4gICAgICAgIHRoaXMuc3dlZXBUb01vdmUgPSByZXN1bHQuc3dlZXA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gV2l0aG91dCB0aGlzIHRoZSBjYWxsZXIgZmFsbHMgdGhyb3VnaCB0byBnZXRNb2RlbDNkQW5kU3dlZXAsIHdoaWNoIHJlc29sdmVzIGEgdmlzaXQgZnJvbSB0aGVcclxuICAgIC8vIFBPSSdzIHN3ZWVwIC0gYSBUaHJlZS5qcyBQT0kgaGFzIG5vbmUsIHNvIGl0IGZhaWxzIGFuZCByZXBvcnRzIHRoZSBtb2RlbCBhcyB1bnJlYWNoYWJsZSBldmVuXHJcbiAgICAvLyB0aG91Z2ggdGhlIHRhZyBpcyBvbiBzY3JlZW4uXHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSAmJiB0aGlzLnRocmVlSnNTZXJ2aWNlLmhhc1RhZyhlbGVtZW50SWQpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuZ29Ub1RhZyhlbGVtZW50SWQpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgTWF0dGVydGFncyB0byBWaWV3ZXJcclxuICAgKiBAcGFyYW0gb2JqZWN0cyBMaXN0IG9mIG9iamVjdHMgKHRpY2tldHMsIGVxdWlwbWVudHMpIGV0YyB0byBiZSBhZGRlZCBhcyBNYXR0ZXJ0YWdzXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkT2JqZWN0VGFnc1RvVmlld2VyKG9iamVjdHM6IERiT2JqZWN0VHlwZVtdKSB7XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgb2JqZWN0cy5tYXAoYXN5bmMgKG9iamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5nZXRQb2lCeUVsZW1lbnRJZChvYmplY3QuaWQhKTtcclxuICAgICAgICBpZiAocG9pICYmIHBvaS5jb29yZGluYXRlKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbkFkZE9iamVjdEZyb21QT0kob2JqZWN0LCBwb2kpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICAvLyBOZXdseSBjcmVhdGVkIHRhZ3MgaGF2ZSBubyBvcGFjaXR5L2FsbG93QWN0aW9uIGFwcGxpZWQgeWV0IChvbmx5IHNldCBieVxyXG4gICAgLy8gdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0LCB3aGljaCBydW5zIG9uIE1vZGUvU3dlZXAvRmxvb3IvUm9vbS9DYW1lcmFcclxuICAgIC8vIGV2ZW50cykuIElmIHRoaXMgYmF0Y2ggbG9hZGVkIGFmdGVyIHRob3NlIGZpcmVkLCB0aGUgdGFncyBzdGF5IGluIHdoYXRldmVyXHJcbiAgICAvLyBkZWZhdWx0IHN0YXRlIHRoZSBTREsgZ2F2ZSB0aGVtIHVudGlsIHNvbWV0aGluZyBlbHNlIG51ZGdlcyBhIHJlZnJlc2guXHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnJlZnJlc2hUYWdzVmlzaWJpbGl0eSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWN0aW9uQWRkT2JqZWN0RnJvbVBPSShvYmplY3Q6IERiT2JqZWN0VHlwZSwgcG9pOiBQT0kpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmNyZWF0ZU1hdHRlcnRhZ0Zyb21QT0koXHJcbiAgICAgICAgcG9pLnR5cGUhLFxyXG4gICAgICAgIG9iamVjdCxcclxuICAgICAgICBwb2lcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFkZFRocmVlSnNUYWdGcm9tUE9JKG9iamVjdCwgcG9pKTtcclxuICAgIH1cclxuICAgIC8vIEN1cGl4XHJcbiAgICAvLyBUT0RPXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEcmF3cyBhIFBPSSBhcyBhIHRhZyBpbiB0aGUgVGhyZWUuanMgc2NlbmUuXHJcbiAgICpcclxuICAgKiBCb3RoIHZpZXdlcnMgYXJlIGZlZCBieSB0aGUgc2FtZSBzdWJzY3JpcHRpb25zIG9uIHRoZSBzYW1lIFBPSSByZWNvcmRzLCBzbyBhIHRhZyBjcmVhdGVkIGluXHJcbiAgICogZWl0aGVyIG9uZSBzaG93cyB1cCBpbiB0aGUgb3RoZXIgd2l0aG91dCBhbnkgc3luY2luZyBvZiBpdHMgb3duIC0gdGhpcyBpcyBqdXN0IHRoZSBUaHJlZS5qcyBlbmRcclxuICAgKiBvZiB0aGUgcGlwZWxpbmUgdGhhdCBhbHJlYWR5IGRyaXZlcyBNYXR0ZXJwb3J0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYWRkVGhyZWVKc1RhZ0Zyb21QT0kob2JqZWN0OiBEYk9iamVjdFR5cGUsIHBvaTogUE9JKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXBvaS5jb29yZGluYXRlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgICB0cnkge1xyXG4gICAgICBwb3NpdGlvbiA9IEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIGNvbnNvbGUud2FybihgVmlld2VyU2VydmljZTogdW5wYXJzZWFibGUgUE9JIGNvb3JkaW5hdGUgZm9yIGVsZW1lbnQgJHtvYmplY3QuaWR9OmAsIHBvaS5jb29yZGluYXRlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCFbcG9zaXRpb24/LngsIHBvc2l0aW9uPy55LCBwb3NpdGlvbj8uel0uZXZlcnkoKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb3JpZ2luID0gZ2V0VGhyZWVKc1BvaU9yaWdpbihwb2kpO1xyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS51cHNlcnRUYWcoe1xyXG4gICAgICBpZDogb2JqZWN0LmlkLFxyXG4gICAgICBwb3NpdGlvbixcclxuICAgICAgcG9pVHlwZTogcG9pLnR5cGUsXHJcbiAgICAgIGxhYmVsOiBvYmplY3QubmFtZSA/PyBvYmplY3QudGl0bGUgPz8gbnVsbCxcclxuICAgICAgaWNvblVybDogYXdhaXQgdGhpcy5yZXNvbHZlVGFnSWNvblVybChwb2kpLFxyXG4gICAgICBvcmlnaW5DYXB0dXJlSUQ6IG9yaWdpbj8uY2FwdHVyZUlEID8/IG51bGwsXHJcbiAgICAgIGZyYW1lOiBvcmlnaW4/LmZyYW1lID8/IG51bGwsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyB0aGUgdGFncyB0aGUgbGFzdCBjYWxpYnJhdGlvbiBoYWQgdG8gcmV3cml0ZSwgYW5kIHJldHVybnMgaG93IG1hbnkgaXQgY291bGQgbm90LlxyXG4gICAqXHJcbiAgICogQ2FsaWJyYXRpbmcga2VlcHMgdGhlIHRhZ3MgcGxhY2VkIGluIHRoaXMgbW9kZWwgd2hlcmUgdGhleSBhcmUgYnkgY2hhbmdpbmcgdGhlaXIgY29vcmRpbmF0ZXNcclxuICAgKiByYXRoZXIgdGhhbiB0aGVpciBwbGFjZSAoc2VlIFRocmVlSnNTZXJ2aWNlLmFwcGx5QWxpZ25tZW50S2VlcGluZ093blRhZ3MpLiBUaGUgc2NlbmUgYWxyZWFkeVxyXG4gICAqIHNob3dzIHRoZSByZXN1bHQ7IHRoaXMgd3JpdGVzIGl0IGRvd24uIENhbGwgaXQgb25jZSB0aGUgY2FsaWJyYXRpb24gaXRzZWxmIGlzIHN0b3JlZCAtIHdpdGggdGhlXHJcbiAgICogb2xkIGNhbGlicmF0aW9uIHN0aWxsIG9uIHJlY29yZCwgdGhlIG9sZCBjb29yZGluYXRlcyBhcmUgdGhlIG9uZXMgdGhhdCBtYXRjaCBpdC5cclxuICAgKi9cclxuICBhc3luYyBwZXJzaXN0UmViYXNlZFRocmVlSnNUYWdzKCk6IFByb21pc2U8eyBzdG9yZWQ6IG51bWJlcjsgZmFpbGVkOiBudW1iZXIgfT4ge1xyXG4gICAgY29uc3QgcmViYXNlZCA9IHRoaXMudGhyZWVKc1NlcnZpY2UudGFrZVJlYmFzZWRUYWdzKCk7XHJcbiAgICBsZXQgZmFpbGVkID0gMDtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHJlYmFzZWQubWFwKGFzeW5jICh0YWcpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwb2kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UuZ2V0UG9pQnlFbGVtZW50SWQodGFnLmlkKTtcclxuICAgICAgICBpZiAoIXBvaT8uaWQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG1ldGFkYXRhOiBhbnkgPSB7fTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbWV0YWRhdGEgPSAocG9pLm1ldGFkYXRhID8gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpIDoge30pID8/IHt9O1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgbWV0YWRhdGEgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSW4gdGhlIHNoYXJlZCBzcGFjZSBmcm9tIGhlcmUgb24sIHNvIG5vIGxvbmdlciBtYXJrZWQgYXMgYmVpbmcgaW4gdGhlIG1vZGVsJ3Mgb3duLlxyXG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5mcmFtZTtcclxuICAgICAgICBpZiAobWV0YWRhdGEubm9ybWFsKSB7XHJcbiAgICAgICAgICBtZXRhZGF0YS5ub3JtYWwgPSB0YWcucm90YXRlRGlyZWN0aW9uKG1ldGFkYXRhLm5vcm1hbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYXB0dXJlSUQpIHtcclxuICAgICAgICAgIG1ldGFkYXRhLmNhcHR1cmVJRCA9IHRoaXMuY3VycmVudENhcHR1cmVJRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLnVwZGF0ZVBvaSh7XHJcbiAgICAgICAgICBpZDogcG9pLmlkLFxyXG4gICAgICAgICAgY29vcmRpbmF0ZTogSlNPTi5zdHJpbmdpZnkodGFnLnBvc2l0aW9uKSxcclxuICAgICAgICAgIG1ldGFkYXRhOiBKU09OLnN0cmluZ2lmeShtZXRhZGF0YSksXHJcbiAgICAgICAgICAvLyBJdHMgcGxhY2UgaW4gdGhlIHRvdXIgbWF5IGhhdmUgY2hhbmdlZCB3aXRoIGl0cyBjb29yZGluYXRlcyAtIG9yIGl0IG1heSBoYXZlIG9uZSBmb3JcclxuICAgICAgICAgIC8vIHRoZSBmaXJzdCB0aW1lLCBub3cgdGhhdCB0aGUgbW9kZWwgaXMgY2FsaWJyYXRlZC5cclxuICAgICAgICAgIG1hdHRlcnBvcnRTd2VlcElEOiBhd2FpdCB0aGlzLmZpbmROZWFyZXN0U3dlZXBGb3JUaHJlZUpzKHRhZy5wb3NpdGlvbiksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgZmFpbGVkICs9IDE7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBWaWV3ZXJTZXJ2aWNlOiBjb3VsZCBub3Qgc3RvcmUgdGhlIG5ldyBjb29yZGluYXRlcyBvZiB0YWcgJHt0YWcuaWR9YCwgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgICByZXR1cm4geyBzdG9yZWQ6IHJlYmFzZWQubGVuZ3RoIC0gZmFpbGVkLCBmYWlsZWQgfTtcclxuICB9XHJcblxyXG4gIC8qKiBIb3cgbWFueSB0YWdzIHRoZSBjYWxpYnJhdGlvbiB3YWxrdGhyb3VnaCBjb3VsZCBzdGlsbCB1c2U6IHRoZSBvbmVzIGZyb20gZWxzZXdoZXJlLiAqL1xyXG4gIGdldFRocmVlSnNDYWxpYnJhdGlvbkNhbmRpZGF0ZUNvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSA/IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0Q2FsaWJyYXRpb25DYW5kaWRhdGVDb3VudCgpIDogMDtcclxuICB9XHJcblxyXG4gIC8qKiBIb3cgbWFueSB0YWdzIGZyb20gZWxzZXdoZXJlIGFyZSBub3Qgb24gdGhlIDNEIG1vZGVsLCBhbmQgc28gYXJlIG5vdCBzaG93biBvbiBpdC4gKi9cclxuICBnZXRUaHJlZUpzT2ZmTW9kZWxUYWdDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykgPyB0aGlzLnRocmVlSnNTZXJ2aWNlLmdldE9mZk1vZGVsVGFnQ291bnQoKSA6IDA7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHRhZ3MgcmVnaXN0ZXJlZCBpbiB0aGUgVGhyZWUuanMgc2NlbmUsIHNob3duIG9yIG5vdC4gKi9cclxuICBnZXRUaHJlZUpzVGFncygpIHtcclxuICAgIHJldHVybiB0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpID8gdGhpcy50aHJlZUpzU2VydmljZS5nZXRUYWdzKCkgOiBbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBpbWFnZSB0byBkcmF3IGEgdGFnIHdpdGgsIG1pcnJvcmluZyB3aGF0IE1hdHRlcnBvcnQgc2hvd3MgZm9yIHRoZSBzYW1lIFBPSS5cclxuICAgKlxyXG4gICAqIE1hdHRlcnBvcnQgcmVnaXN0ZXJzIG9uZSB0ZXh0dXJlIHBlciB0eXBlIChgaWNvbi10aWNrZXRgLCBgaWNvbi1lcXVpcG1lbnRgLi4uKSBmcm9tIHRoZSBzYW1lXHJcbiAgICogY29uZmlnIGVudHJpZXMgdXNlZCBoZXJlLCBhbmQgb3ZlcnJpZGVzIGl0IHdpdGggdGhlIFBPSSdzIG93biBpY29uIHdoZW4gaXQgaGFzIG9uZS4gUmVhZGluZyB0aGVcclxuICAgKiBzYW1lIHR3byBzb3VyY2VzIGlzIHdoYXQga2VlcHMgYSB0YWcgbG9va2luZyBsaWtlIGl0c2VsZiBhY3Jvc3MgdGhlIHR3byB2aWV3ZXJzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVRhZ0ljb25VcmwocG9pOiBQT0kpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIGlmIChwb2kudGFnSWNvbikge1xyXG4gICAgICAvLyBTdG9yZWQgYXMgSlNPTiAoeyBzcmMsIG9wYWNpdHkgfSkgYnkgdGhlIE1hdHRlcnBvcnQgcGF0aCwgYnV0IG9sZGVyIHJlY29yZHMgYXJlIGEgYmFyZSBrZXkuXHJcbiAgICAgIGxldCBzb3VyY2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocG9pLnRhZ0ljb24pO1xyXG4gICAgICAgIHNvdXJjZSA9IHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnID8gcGFyc2VkIDogcGFyc2VkPy5zcmMgPz8gbnVsbDtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgc291cmNlID0gcG9pLnRhZ0ljb247XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNvdXJjZSkge1xyXG4gICAgICAgIGNvbnN0IHNpZ25lZCA9IGF3YWl0IGdldFNpZ25lZEZpbGUoc291cmNlKTtcclxuICAgICAgICBpZiAoc2lnbmVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gc2lnbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFRhZ0ljb25VcmwocG9pLnR5cGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBjb25maWd1cmVkIGljb24gZm9yIGEgUE9JIHR5cGUsIG9yIG51bGwgd2hlbiB0aGF0IHR5cGUgaGFzIG5vbmUuICovXHJcbiAgcHJpdmF0ZSBkZWZhdWx0VGFnSWNvblVybChwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgaWNvbnMgPSB0aGlzLmNvbmZpZz8ubXlfY29uZmlnO1xyXG4gICAgaWYgKCFpY29ucykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHN3aXRjaCAocG9pVHlwZSkge1xyXG4gICAgICBjYXNlIFBvaVR5cGUuVElDS0VUOlxyXG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX3RpY2tldCA/PyBudWxsO1xyXG4gICAgICBjYXNlIFBvaVR5cGUuRVFVSVBNRU5UOlxyXG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX2VxdWlwbWVudCA/PyBudWxsO1xyXG4gICAgICBjYXNlIFBvaVR5cGUuTUVBU1VSRTpcclxuICAgICAgICByZXR1cm4gaWNvbnMuaWNvbl9tZWFzdXJlID8/IG51bGw7XHJcbiAgICAgIGNhc2UgUG9pVHlwZS5PQkpFQ1QzRDpcclxuICAgICAgICByZXR1cm4gaWNvbnMuaWNvbl9vYmplY3QzZCA/PyBudWxsO1xyXG4gICAgICBjYXNlIFBvaVR5cGUuREFUQTpcclxuICAgICAgY2FzZSBQb2lUeXBlLkRFU0s6XHJcbiAgICAgICAgcmV0dXJuIGljb25zLmljb25fZGF0YSA/PyBudWxsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIE1vdmVzIHRoZSBUaHJlZS5qcyBjYW1lcmEgdG8gZnJhbWUgYSB0YWcsIG1pcnJvcmluZyBNYXR0ZXJwb3J0J3MgZ29Ub1RhZy4gKi9cclxuICBnb1RvVGhyZWVKc1RhZyhlbGVtZW50SWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5nb1RvVGFnKGVsZW1lbnRJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogU2hvd3Mgb25seSB0YWdzIG9mIHRoZSBnaXZlbiBQT0kgdHlwZXM7IG51bGwgY2xlYXJzIHRoZSBmaWx0ZXIuICovXHJcbiAgc2V0VmlzaWJsZVRocmVlSnNUYWdUeXBlcyh0eXBlczogUG9pVHlwZVtdIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRWaXNpYmxlVGFnVHlwZXModHlwZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWxpZ25tZW50IHdhbGt0aHJvdWdoOiBwaWNrIGEgdGFnLCB0aGVuIGNsaWNrIHdoZXJlIGl0IHJlYWxseSBzaXRzLCB0aHJlZSB0aW1lcyBvdmVyLlxyXG4gICAqXHJcbiAgICogVXNlcyB0YWdzIHRoYXQgYWxyZWFkeSBleGlzdCwgc28gbm90aGluZyBpcyBjcmVhdGVkIGFuZCBub3RoaW5nIGlzIHdyaXR0ZW4gdW50aWwgdGhlIGNhbGxlclxyXG4gICAqIHNhdmVzIHRoZSByZXN1bHQuIFNlZSB0aHJlZUpzQWxpZ25tZW50UHJvZ3Jlc3MkIGZvciB3aGF0IHRoZSBVSSBzaG91bGQgYmUgYXNraW5nIGZvci5cclxuICAgKi9cclxuICBzdGFydFRocmVlSnNUYWdBbGlnbm1lbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnN0YXJ0VGFnQWxpZ25tZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWxUaHJlZUpzVGFnQWxpZ25tZW50KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxUYWdBbGlnbm1lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB0aHJlZUpzQWxpZ25tZW50UHJvZ3Jlc3MkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UuYWxpZ25tZW50UHJvZ3Jlc3MkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29sdmVzIHRoZSBhbGlnbm1lbnQgYW5kIGFwcGxpZXMgaXQgdG8gdGhlIHNjZW5lLCByZXR1cm5pbmcgaXQgYXMgdGhlIEpTT04gdG8gc3RvcmUgaW4gdGhlXHJcbiAgICogY2FwdHVyZSdzIG1ldGFkYXRhLiBOdWxsIG1lYW5zIHRoZSB0aHJlZSB0YWdzIHdlcmUgY29sbGluZWFyIGFuZCBub3RoaW5nIHdhcyBhcHBsaWVkLlxyXG4gICAqL1xyXG4gIHNvbHZlVGhyZWVKc1RhZ0FsaWdubWVudChleGlzdGluZ01ldGFkYXRhPzogc3RyaW5nKTogeyBhbGlnbm1lbnQ6IGFueTsgbWV0YWRhdGE6IHN0cmluZyB9IHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbGlnbm1lbnQgPSB0aGlzLnRocmVlSnNTZXJ2aWNlLnNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCk7XHJcbiAgICBpZiAoIWFsaWdubWVudCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMudGhyZWVKc0NhbGlicmF0ZWQgPSB0cnVlO1xyXG4gICAgLy8gTWVyZ2VkIGludG8gd2hhdGV2ZXIgdGhlIGNhcHR1cmUgYWxyZWFkeSBzdG9yZXMsIHNvIGFuIGV4aXN0aW5nIGNhbWVyYSBwbGFjZW1lbnQgc3Vydml2ZXMuXHJcbiAgICBsZXQgc3RvcmVkOiBhbnkgPSB7fTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHN0b3JlZCA9IGV4aXN0aW5nTWV0YWRhdGEgPyBKU09OLnBhcnNlKGV4aXN0aW5nTWV0YWRhdGEpIDoge307XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgc3RvcmVkID0ge307XHJcbiAgICB9XHJcbiAgICBzdG9yZWQuYWxpZ25tZW50ID0gYWxpZ25tZW50O1xyXG4gICAgcmV0dXJuIHsgYWxpZ25tZW50LCBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFNob3dzIG9yIGhpZGVzIGEgc2luZ2xlIFRocmVlLmpzIHRhZy4gKi9cclxuICBzZXRUaHJlZUpzVGFnVmlzaWJpbGl0eShlbGVtZW50SWQ6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRUYWdWaXNpYmlsaXR5KGVsZW1lbnRJZCwgdmlzaWJsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBhY3Rpb25fZGVsZXRlX2VsZW1lbnQoZWxlbWVudDogRGJPYmplY3RUeXBlKSB7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmRlbGV0ZU1hdHRlcnRhZ0Zvck9iamVjdChlbGVtZW50LmlkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UucmVtb3ZlVGFnKGVsZW1lbnQuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEVtaXRzIHdoZW4gYSBUaHJlZS5qcyBtb2RlbCBsb2FkIGFjdHVhbGx5IHN0b3BwZWQgc2hvcnQsIHJhdGhlciB0aGFuIG1lcmVseSBiZWluZyBhc2tlZCB0by4gKi9cclxuICBnZXQgdGhyZWVKc01vZGVsTG9hZENhbmNlbGxlZCQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5tb2RlbExvYWRDYW5jZWxsZWQkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3BzIHRoZSBUaHJlZS5qcyBtb2RlbCBkb3dubG9hZCBpbiBwcm9ncmVzcy4gKi9cclxuICBjYW5jZWxUaHJlZUpzTW9kZWxMb2FkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxNb2RlbExvYWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBFbWl0cyBhIHRhZydzIGxhYmVsIHdoaWxlIHRoZSBwb2ludGVyIGlzIG92ZXIgaXQgaW4gdGhlIFRocmVlLmpzIHNjZW5lLiAqL1xyXG4gIGdldCB0aHJlZUpzVGFnSG92ZXJlZCQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS50YWdIb3ZlcmVkJDtcclxuICB9XHJcblxyXG4gIC8qKiBFbWl0cyB0aGUgZWxlbWVudCBpZCBvZiBhIHRhZyBjbGlja2VkIGluIHRoZSBUaHJlZS5qcyBzY2VuZS4gKi9cclxuICBnZXQgdGhyZWVKc1RhZ0NsaWNrZWQkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UudGFnQ2xpY2tlZCQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBsaWVzIHRoZSB2aXNpdCdzIHN0b3JlZCB0YWcgYWxpZ25tZW50LCBtYXBwaW5nIGNhcHR1cmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoaXMgbW9kZWwuXHJcbiAgICpcclxuICAgKiBTYWZlIHRvIGNhbGwgYmVmb3JlIHRoZSBtb2RlbCBvciBhbnkgdGFnIGV4aXN0czogaXQgaXMgYSB0cmFuc2Zvcm0gb24gdGhlIGdyb3VwIGJvdGggZW5kIHVwXHJcbiAgICogdW5kZXIsIHNvIGl0IGFwcGxpZXMgdG8gd2hhdGV2ZXIgYXJyaXZlcyBsYXRlci5cclxuICAgKi9cclxuICBzZXRUaHJlZUpzVGFnQWxpZ25tZW50RnJvbU1ldGFkYXRhKG1ldGFkYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbGlnbm1lbnQgPSBwYXJzZVRocmVlSnNQbGFjZW1lbnQobWV0YWRhdGEpPy5hbGlnbm1lbnQgPz8gbnVsbDtcclxuICAgIHRoaXMudGhyZWVKc0NhbGlicmF0ZWQgPSAhIWFsaWdubWVudDtcclxuICAgIC8vIFdoaWNoIHRhZ3Mgd2VyZSBwbGFjZWQgaW4gdGhpcyBtb2RlbCBpcyBkZWNpZGVkIGFnYWluc3QgdGhlIGNhcHR1cmUgb24gc2NyZWVuLlxyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRDdXJyZW50Q2FwdHVyZSh0aGlzLmN1cnJlbnRDYXB0dXJlSUQpO1xyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRUYWdBbGlnbm1lbnQoYWxpZ25tZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuYWJsZSB0YWcgcGxhY2VtZW50IG1lbnUgdG8gYWRkIGEgbmV3IGVsZW1lbnQgZGVwZW5kaW5nIG9uIGl0cyB0eXBlIChUSUNLRVQsIERBVEEsIEVRVUlQTUVOVCBldGMpXHJcbiAgICovXHJcbiAgYXN5bmMgYWN0aW9uQWRkTmV3RWxlbWVudFRvVmlld2VyKHBvaVR5cGU6IFBvaVR5cGUpIHtcclxuICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKTtcclxuXHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykgJiZcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSA9PT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcclxuICAgICkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE1hdHRlcnRhZ1doZW5BZGRpbmcocG9pVHlwZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnN0YXJ0VGFnUGxhY2VtZW50KHBvaVR5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGF1bmNoZXMgdGhlIHJlcG9zaXRpb25pbmcgb2YgYW4gZXhpc3RpbmcgTWF0dGVydGFnIHJlbGF0ZWQgdG8gcGFyYW1ldGVyIG9iamVjdFxyXG4gICAqIEBwYXJhbSBlbGVtZW50IG9iamVjdCAoVElDS0VULCBFUVVJUE1FTlQsIEZFQVRVUkUsIGV0YylcclxuICAgKiBAcGFyYW0gcG9pVHlwZSB0eXBlIG9mIG9iamVjdFxyXG4gICAqL1xyXG4gIGFzeW5jIGFjdGlvblJlcG9zaXRpb25FbGVtZW50SW5WaWV3ZXIoXHJcbiAgICBlbGVtZW50OiBEYk9iamVjdFR5cGUsXHJcbiAgICBwb2lUeXBlOiBQb2lUeXBlXHJcbiAgKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykgJiZcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSA9PT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcclxuICAgICkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE1hdHRlcnRhZ1doZW5SZXBvc2l0aW9uaW5nKHBvaVR5cGUsIGVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlIHRpY2tldCBwbGFjZW1lbnQgbWVudSB0byBhZGQgYSBuZXcgdGlja2V0XHJcbiAgICovXHJcbiAgYWN0aW9uX2NhbmNlbGVkKCkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jYW5jZWxGb2xsb3dpbmdDdXJzb3IoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2FuY2VsVGFnUGxhY2VtZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpIHtcclxuICAgIC8vIE1hdHRlcnBvcnRcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFjdGlvblNob3dBbGxGbG9vcnMoKSB7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvblNob3dBbGxGbG9vcnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFjdGlvbl90b29sYm94X2RvbGxob3VzZSgpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSAhPT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcclxuICAgICkge1xyXG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfY2FuY2VsX21lc3VyZSgpO1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9kb2xsaG91c2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl9mbG9vcnBsYW4oKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5hY3Rpb25fY2FuY2VsZWQoKTtcclxuICAgIH1cclxuICAgIC8vIE1hdHRlcnBvcnRcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfZmxvb3JwbGFuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9tZXN1cmUoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5hY3Rpb25fY2FuY2VsZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCk7XHJcbiAgICAvLyBNYXR0ZXJwb3J0XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFjdGlvbl90b29sYm94X21lc3VyZSgpO1xyXG4gICAgfVxyXG4gICAgLy8gTWF0dGVycG9ydCdzIFNESyBicmluZ3MgaXRzIG93biBtZWFzdXJpbmcgdG9vbDsgdGhlIFRocmVlLmpzIHZpZXdlciBoYXMgdG8gcHJvdmlkZSBvbmUuXHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnN0YXJ0TWVhc3VyaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCkge1xyXG4gICAgLy8gTWF0dGVycG9ydFxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9jYW5jZWxfbWVzdXJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbE1lYXN1cmluZygpO1xyXG4gICAgICAvLyBUaGUgdG9vbGJhciB0b2dnbGVzIG9uIHRoaXMgZmxhZzsgbGVmdCBvbiwgdGhlIG5leHQgY2xpY2sgd291bGQgc3dpdGNoIG1lYXN1cmluZyBcIm9mZlwiXHJcbiAgICAgIC8vIGluc3RlYWQgb2Ygc3RhcnRpbmcgYSBuZXcgb25lLlxyXG4gICAgICB0aGlzLnRvb2xib3hTdGF0ZXMubWVzdXJlLnN0YXQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBXaGlsZSBtZWFzdXJpbmcgaW4gdGhlIFRocmVlLmpzIHZpZXdlcjogcG9pbnRzIGFuZCBzZWdtZW50IGxlbmd0aHMgc28gZmFyLCBudWxsIGlmIGFiYW5kb25lZC4gKi9cclxuICBnZXQgdGhyZWVKc01lYXN1cmVtZW50UHJvZ3Jlc3MkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UubWVhc3VyZW1lbnRQcm9ncmVzcyQ7XHJcbiAgfVxyXG5cclxuICAvKiogRW5kcyB0aGUgVGhyZWUuanMgbWVhc3VyZW1lbnQgaW4gcHJvZ3Jlc3MsIG9yIHJldHVybnMgbnVsbCB3aGVuIGl0IGhhcyBmZXdlciB0aGFuIHR3byBwb2ludHMuICovXHJcbiAgZmluaXNoVGhyZWVKc01lYXN1cmVtZW50KCk6IFRocmVlSnNNZWFzdXJlbWVudCB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWVhc3VyZW1lbnQgPSB0aGlzLnRocmVlSnNTZXJ2aWNlLmZpbmlzaE1lYXN1cmluZygpO1xyXG4gICAgaWYgKG1lYXN1cmVtZW50KSB7XHJcbiAgICAgIHRoaXMudG9vbGJveFN0YXRlcy5tZXN1cmUuc3RhdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1lYXN1cmVtZW50O1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBtZWFzdXJlbWVudCBsYXN0IGZpbmlzaGVkIGluIHRoZSBUaHJlZS5qcyB2aWV3ZXIsIGZvciB0aGUgZm9ybSB0aGF0IHNhdmVzIGl0LiAqL1xyXG4gIGdldFRocmVlSnNMYXN0TWVhc3VyZW1lbnQoKTogVGhyZWVKc01lYXN1cmVtZW50IHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSA/IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0TGFzdE1lYXN1cmVtZW50KCkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIE1hdHRlcnBvcnQgc3dlZXAgbmVhcmVzdCB0byBhIHBvaW50IHBpY2tlZCBpbiB0aGUgVGhyZWUuanMgdmlld2VyLCBvciBudWxsLlxyXG4gICAqXHJcbiAgICogRm9yIGNhbGxlcnMgdGhhdCB3cml0ZSB0aGVpciBvd24gUE9JLCBhcyB0aGUgbWVhc3VyZW1lbnQgZm9ybSBkb2VzIC0gYW55dGhpbmcgY3JlYXRlZCB0aHJvdWdoXHJcbiAgICogY3JlYXRlUG9pRm9yVGhyZWVKc1BsYWNlbWVudCBhbHJlYWR5IGdldHMgdGhpcy5cclxuICAgKi9cclxuICBmaW5kTmVhcmVzdFN3ZWVwRm9yVGhyZWVKcyhwb2ludDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIC8vIEFuIHVuY2FsaWJyYXRlZCBtb2RlbCdzIGNvb3JkaW5hdGVzIGFyZSBpdHMgb3duLiBNZWFzdXJlZCBhZ2FpbnN0IHRoZSBNYXR0ZXJwb3J0IHN3ZWVwcyB0aGV5XHJcbiAgICAvLyBjb3VsZCBsYW5kIG5lYXIgb25lIGJ5IGNvaW5jaWRlbmNlLCBhbmQgdGhlIHRhZyB3b3VsZCB0dXJuIHVwIGluIHRoZSB0b3VyIHNvbWV3aGVyZSBhcmJpdHJhcnkuXHJcbiAgICBpZiAoIXRoaXMudGhyZWVKc0NhbGlicmF0ZWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnN3ZWVwTG9jYXRvci5maW5kTmVhcmVzdFN3ZWVwKHBvaW50LCB0aGlzLmN1cnJlbnRTcGFjZUlEKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtZXRhZGF0YSBhIFBPSSBwbGFjZWQgaW4gdGhlIFRocmVlLmpzIHZpZXdlciBpcyBzdG9yZWQgd2l0aDogd2hpY2ggM0QgbW9kZWwgaXQgd2FzIHBsYWNlZFxyXG4gICAqIGluLCBhbmQgLSB3aGVuIHRoYXQgbW9kZWwgaXMgbm90IGNhbGlicmF0ZWQgLSB0aGF0IGl0cyBjb29yZGluYXRlcyBhcmUgdGhlIG1vZGVsJ3Mgb3duLlxyXG4gICAqL1xyXG4gIGJ1aWxkVGhyZWVKc1BvaU1ldGFkYXRhKGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgLi4uZXh0cmEsXHJcbiAgICAgIC4uLih0aGlzLmN1cnJlbnRDYXB0dXJlSUQgPyB7IGNhcHR1cmVJRDogdGhpcy5jdXJyZW50Q2FwdHVyZUlEIH0gOiB7fSksXHJcbiAgICAgIC4uLih0aGlzLmN1cnJlbnRDYXB0dXJlSUQgJiYgIXRoaXMudGhyZWVKc0NhbGlicmF0ZWQgPyB7IGZyYW1lOiAnbW9kZWwnIH0gOiB7fSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGljaCBvZiB0aGUgM0QgbW9kZWwncyBheGVzIGlzIGJlaW5nIHRyZWF0ZWQgYXMgdXAuICovXHJcbiAgZ2V0VGhyZWVKc01vZGVsVXAoKTogVGhyZWVKc01vZGVsVXAge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0TW9kZWxVcCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHVybnMgdGhlIDNEIG1vZGVsIHRvIHRoZSBuZXh0IGNhbmRpZGF0ZSBmb3IgXCJ3aGljaCBheGlzIGlzIHVwXCIsIGFuZCByZXR1cm5zIHRoZSBjYXB0dXJlXHJcbiAgICogbWV0YWRhdGEgd2l0aCB0aGF0IGNob2ljZSB3cml0dGVuIGluLCBmb3IgdGhlIGNhbGxlciB0byBzdG9yZS5cclxuICAgKlxyXG4gICAqIFRoZSB2ZXJ0aWNhbCBheGlzIGlzIHdvcmtlZCBvdXQgZnJvbSB0aGUgZ2VvbWV0cnkgd2hlbiBhIG1vZGVsIGxvYWRzLCBhbmQgdGhhdCBjYW4gYmUgd3Jvbmc6XHJcbiAgICogYSBuYXJyb3cgY29ycmlkb3IgYW5kIGEgbG93IHNsYWIgYXJlIHRoZSBzYW1lIHNoYXBlIHR1cm5lZCBvdmVyLiBUaGlzIGlzIHRoZSB3YXkgdG8gY29ycmVjdCBpdC5cclxuICAgKi9cclxuICBjeWNsZVRocmVlSnNNb2RlbFVwKGV4aXN0aW5nTWV0YWRhdGE6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiB7IHVwOiBUaHJlZUpzTW9kZWxVcDsgbWV0YWRhdGE6IHN0cmluZyB9IHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjdXJyZW50ID0gVEhSRUVKU19NT0RFTF9VUF9PUFRJT05TLmluZGV4T2YodGhpcy50aHJlZUpzU2VydmljZS5nZXRNb2RlbFVwKCkpO1xyXG4gICAgY29uc3QgdXAgPSBUSFJFRUpTX01PREVMX1VQX09QVElPTlNbKGN1cnJlbnQgKyAxKSAlIFRIUkVFSlNfTU9ERUxfVVBfT1BUSU9OUy5sZW5ndGhdO1xyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRNb2RlbFVwKHVwKTtcclxuXHJcbiAgICBsZXQgc3RvcmVkOiBhbnkgPSB7fTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHN0b3JlZCA9IGV4aXN0aW5nTWV0YWRhdGEgPyBKU09OLnBhcnNlKGV4aXN0aW5nTWV0YWRhdGEpIDoge307XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgc3RvcmVkID0ge307XHJcbiAgICB9XHJcbiAgICBzdG9yZWQudXAgPSB1cDtcclxuICAgIHJldHVybiB7IHVwLCBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIENob29zZXMgdGhlIHRhZyBmb3IgdGhlIGNhbGlicmF0aW9uIHBhaXIgYmVpbmcgbWF0Y2hlZCBieSBpZCwgaW5zdGVhZCBvZiBieSBjbGlja2luZyBpdC4gKi9cclxuICBzZWxlY3RUaHJlZUpzQWxpZ25tZW50VGFnKGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSAmJiB0aGlzLnRocmVlSnNTZXJ2aWNlLnNlbGVjdEFsaWdubWVudFRhZyhlbGVtZW50SWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhvdyBmYXIgdGhlIHZpc2libGUgdGFncyBzaXQgZnJvbSB0aGUgM0QgbW9kZWwsIGluIG1vZGVsIHJhZGlpLiBOdWxsIHdpdGhvdXQgYm90aC4gKi9cclxuICBnZXRUaHJlZUpzVGFnRGlzdGFuY2VGcm9tTW9kZWwoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSA/IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0VGFnRGlzdGFuY2VGcm9tTW9kZWwoKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogSG93IG1hbnkgdGFncyB0aGUgVGhyZWUuanMgc2NlbmUgaXMgc2hvd2luZy4gKi9cclxuICBnZXRUaHJlZUpzVGFnQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpID8gdGhpcy50aHJlZUpzU2VydmljZS5nZXRUYWdDb3VudCgpIDogMDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl91cGRhdGVfcG9pKFxyXG4gICAgcG9pOiBQT0ksXHJcbiAgICBpc1ZhbGlkOiBib29sZWFuLFxyXG4gICAgZWxlbWVudDogRGJPYmplY3RUeXBlXHJcbiAgKTogUHJvbWlzZTxQT0k+IHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIGlmIChpc1ZhbGlkKSB7XHJcbiAgICAgICAgY29uc3QgbGFzdFRhZyA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UubWF0dGVydGFnVG9Gb2xsb3dcclxuICAgICAgICAgID8gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5tYXR0ZXJ0YWdUb0ZvbGxvd1xyXG4gICAgICAgICAgOiB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldExhc3RUYWcoKTtcclxuICAgICAgICBpZiAoIWxhc3RUYWcpIHtcclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0TWF0dGVyVGFnRGF0YUZvck1hdHRlcnRhZyhsYXN0VGFnKTtcclxuICAgICAgICBpZiAoIXRhZ0RhdGEpIHtcclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9pKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBvaU1ldGFkYXRhID0gKCEhcG9pICYmIHBvaS5tZXRhZGF0YSkgPyBKU09OLnBhcnNlKHBvaS5tZXRhZGF0YSkgOiB7fTtcclxuICAgICAgICBwb2lNZXRhZGF0YS5ub3JtYWwgPSB0YWdEYXRhLmdldE5vcm1hbCgpO1xyXG4gICAgICAgIGlmICghcG9pKSB7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcG9pSW5wdXQgPSB7XHJcbiAgICAgICAgICBpZDogcG9pLmlkLFxyXG4gICAgICAgICAgY29vcmRpbmF0ZTogdGFnRGF0YS5nZXRDb29yZGluYXRlU3RyaW5nKCksXHJcbiAgICAgICAgICBtYXR0ZXJwb3J0U3dlZXBJRDogdGFnRGF0YS5nZXRTd2VlcElEKCksXHJcbiAgICAgICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkocG9pTWV0YWRhdGEpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFBvaTogUE9JID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLnVwZGF0ZVBvaShwb2lJbnB1dCk7XHJcbiAgICAgICAgdGFnRGF0YS5zZXRQb2kodXBkYXRlZFBvaSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5zZXRPYmplY3RBbmRQb2lJblRhZyhsYXN0VGFnLCBlbGVtZW50LCBQb2lUeXBlLkRFU0ssIHVwZGF0ZWRQb2kpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuaW5qZWN0SHRtbEluVGFnKFxyXG4gICAgICAgICAgcG9pLnR5cGUhLFxyXG4gICAgICAgICAgZWxlbWVudCxcclxuICAgICAgICAgIGxhc3RUYWdcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0VGFnSWNvbkFuZE9wYWNpdHkobGFzdFRhZywgdGFnRGF0YSk7XHJcbiAgICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nb1RvVGFnKGxhc3RUYWcpO1xyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVwZGF0ZWRQb2kpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZGVsZXRlTGFzdE1hdHRlcnRhZygpO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29tbWl0VGhyZWVKc1RhZ1BsYWNlbWVudChwb2ksIGlzVmFsaWQsIGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdyaXRlcyB0aGUgc3BvdCBwaWNrZWQgaW4gdGhlIFRocmVlLmpzIHNjZW5lIGludG8gdGhlIFBPSSwgbWlycm9yaW5nIHRoZSBNYXR0ZXJwb3J0IGJyYW5jaC5cclxuICAgKlxyXG4gICAqIFRoZSBjb29yZGluYXRlIGdvZXMgaW4gdGhlIHNhbWUgZmllbGQgYW5kIHRoZSBzYW1lIHNwYWNlIE1hdHRlcnBvcnQgd3JpdGVzLCB3aGljaCBpcyB3aGF0IG1ha2VzXHJcbiAgICogYSB0YWcgY3JlYXRlZCBoZXJlIHNob3cgdXAgaW4gdGhlIHJpZ2h0IHBsYWNlIHRoZXJlIC0gYW5kIHRoZSBvdGhlciB3YXkgcm91bmQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBjb21taXRUaHJlZUpzVGFnUGxhY2VtZW50KFxyXG4gICAgcG9pOiBQT0ksXHJcbiAgICBpc1ZhbGlkOiBib29sZWFuLFxyXG4gICAgZWxlbWVudDogRGJPYmplY3RUeXBlXHJcbiAgKTogUHJvbWlzZTxQT0k+IHtcclxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0UGVuZGluZ1RhZ1BsYWNlbWVudCgpO1xyXG4gICAgaWYgKCFpc1ZhbGlkIHx8ICFwbGFjZW1lbnQgfHwgIXBvaSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBvaSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcG9pTWV0YWRhdGEgPSBwb2kubWV0YWRhdGEgPyBKU09OLnBhcnNlKHBvaS5tZXRhZGF0YSkgOiB7fTtcclxuICAgIHBvaU1ldGFkYXRhLm5vcm1hbCA9IHBsYWNlbWVudC5ub3JtYWw7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZFBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS51cGRhdGVQb2koe1xyXG4gICAgICBpZDogcG9pLmlkLFxyXG4gICAgICBjb29yZGluYXRlOiBKU09OLnN0cmluZ2lmeShwbGFjZW1lbnQucG9zaXRpb24pLFxyXG4gICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkocG9pTWV0YWRhdGEpLFxyXG4gICAgICAvLyBtYXR0ZXJwb3J0U3dlZXBJRCBpcyBsZWZ0IGFzIGl0IHdhczogdGhpcyB2aWV3ZXIgaGFzIG5vIHN3ZWVwcywgYW5kIE1hdHRlcnBvcnQgZmlsdGVycyB0YWdcclxuICAgICAgLy8gdmlzaWJpbGl0eSBieSB0aGVtLCBzbyBjbGVhcmluZyBpdCB3b3VsZCBoaWRlIHRoZSB0YWcgb3ZlciB0aGVyZS5cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UudXBzZXJ0VGFnKHtcclxuICAgICAgaWQ6IGVsZW1lbnQuaWQsXHJcbiAgICAgIHBvc2l0aW9uOiBwbGFjZW1lbnQucG9zaXRpb24sXHJcbiAgICAgIHBvaVR5cGU6IHVwZGF0ZWRQb2k/LnR5cGUgPz8gcG9pLnR5cGUsXHJcbiAgICAgIGljb25Vcmw6IHVwZGF0ZWRQb2k/LnRhZ0ljb24gPyBhd2FpdCBnZXRTaWduZWRGaWxlKHVwZGF0ZWRQb2kudGFnSWNvbikgOiBudWxsLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkUG9pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyB0aGUgUE9JIGZvciBhbiBlbGVtZW50IGp1c3QgcGxhY2VkIGluIHRoZSBUaHJlZS5qcyBzY2VuZS5cclxuICAgKlxyXG4gICAqIFRoZSBNYXR0ZXJwb3J0IHBhdGggcmVhY2hlcyB0aGUgc2FtZSByZXN1bHQgdGhyb3VnaCBpdHMgdGFnIGRpY3Rpb25hcnkgLSB0aGUgdGFnIGV4aXN0cyBmaXJzdFxyXG4gICAqIGFuZCBjYXJyaWVzIHRoZSBjb29yZGluYXRlcy4gVGhyZWUuanMgaGFzIG5vIHN1Y2ggb2JqZWN0LCBzbyB0aGUgcGxhY2VtZW50IGNhcHR1cmVkIGF0IGNsaWNrXHJcbiAgICogdGltZSBpcyB0aGUgb25seSByZWNvcmQgb2Ygd2hlcmUgdGhlIHVzZXIgcG9pbnRlZCwgYW5kIGl0IGhhcyB0byBiZWNvbWUgYSBQT0kgaGVyZSBvciBpdCBpc1xyXG4gICAqIGxvc3Qgd2hlbiB0aGUgZm9ybSBjbG9zZXMuXHJcbiAgICpcclxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGVyZSBpcyBubyBwZW5kaW5nIHBsYWNlbWVudCwgd2hpY2ggaXMgdGhlIG5vcm1hbCBjYXNlIGluIE1hdHRlcnBvcnQgbW9kZS5cclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVQb2lGb3JUaHJlZUpzUGxhY2VtZW50KGVsZW1lbnQ6IERiT2JqZWN0VHlwZSwgcG9pVHlwZTogUG9pVHlwZSk6IFByb21pc2U8UE9JIHwgbnVsbD4ge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy50aHJlZUpzU2VydmljZS5nZXRQZW5kaW5nVGFnUGxhY2VtZW50KCk7XHJcbiAgICBpZiAoIXBsYWNlbWVudCB8fCAhZWxlbWVudD8uaWQpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2l0aG91dCBhIHN3ZWVwIHRoZSB0YWcgaXMgbGVmdCBvZmYgZXZlcnl0aGluZyBvbiB0aGUgTWF0dGVycG9ydCBzaWRlIHRoYXQgaXMgb3JnYW5pc2VkIGJ5XHJcbiAgICAvLyBzd2VlcCAtIHRoZSBmbG9vciBwbGFuIG1vc3QgdmlzaWJseSwgd2hpY2ggb25seSBkcmF3cyB0YWdzIHdob3NlIHN3ZWVwIGJlbG9uZ3MgdG8gaXQuXHJcbiAgICBjb25zdCBtYXR0ZXJwb3J0U3dlZXBJRCA9IGF3YWl0IHRoaXMuZmluZE5lYXJlc3RTd2VlcEZvclRocmVlSnMocGxhY2VtZW50LnBvc2l0aW9uKTtcclxuICAgIGNvbnN0IHBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5jcmVhdGVQT0lGb3JTcGFjZUlEKHtcclxuICAgICAgY29vcmRpbmF0ZTogSlNPTi5zdHJpbmdpZnkocGxhY2VtZW50LnBvc2l0aW9uKSxcclxuICAgICAgdHlwZTogcG9pVHlwZSxcclxuICAgICAgZWxlbWVudElEOiBlbGVtZW50LmlkLFxyXG4gICAgICBtZXRhZGF0YTogdGhpcy5idWlsZFRocmVlSnNQb2lNZXRhZGF0YSh7IG5vcm1hbDogcGxhY2VtZW50Lm5vcm1hbCB9KSxcclxuICAgICAgLi4uKG1hdHRlcnBvcnRTd2VlcElEID8geyBtYXR0ZXJwb3J0U3dlZXBJRCB9IDoge30pLFxyXG4gICAgfSBhcyBQT0kpO1xyXG5cclxuICAgIC8vIERyYXcgaXQgc3RyYWlnaHQgYXdheSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgbmV4dCByZWZyZXNoLCBzbyB0aGUgdXNlciBzZWVzIHdoZXJlIHRoZVxyXG4gICAgLy8gdGhpbmcgdGhleSBqdXN0IGNyZWF0ZWQgZW5kZWQgdXAuIFRocm91Z2ggdGhlIHNhbWUgcGF0aCB0aGUgcmVmcmVzaCB1c2VzLCBzbyBpdCBhcnJpdmVzIHdpdGhcclxuICAgIC8vIHRoZSB0eXBlJ3MgaWNvbiBpbnN0ZWFkIG9mIHRoZSBiYXJlIG1hcmtlciAtIHRoZSBkaWZmZXJlbmNlIHdhcyB2aXNpYmxlIHVudGlsIHRoZSBuZXh0IHJlbG9hZC5cclxuICAgIGF3YWl0IHRoaXMuYWRkVGhyZWVKc1RhZ0Zyb21QT0koZWxlbWVudCwgcG9pKTtcclxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2FuY2VsVGFnUGxhY2VtZW50KCk7XHJcbiAgICByZXR1cm4gcG9pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVtaXRzIHdoZW4gYSB0YWcgaXMgZHJvcHBlZCBvbiB0aGUgbW9kZWwgaW4gdGhlIFRocmVlLmpzIHNjZW5lLiAqL1xyXG4gIGdldCB0aHJlZUpzVGFnUGxhY2VkJCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLnRhZ1BsYWNlZCQ7XHJcbiAgfVxyXG5cclxuICAvKiogRW1pdHMgd2hlbiB0aGUgY2FsaWJyYXRpb24gd2Fsa3Rocm91Z2ggaXMgYWJhbmRvbmVkLCBpbmNsdWRpbmcgdmlhIEVzY2FwZS4gKi9cclxuICBnZXQgdGhyZWVKc0FsaWdubWVudENhbmNlbGxlZCQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5hbGlnbm1lbnRDYW5jZWxsZWQkO1xyXG4gIH1cclxuXHJcbiAgLyoqIExlYXZlcyBUaHJlZS5qcyB0YWcgcGxhY2VtZW50IG1vZGUgd2l0aG91dCBwbGFjaW5nIGFueXRoaW5nLiAqL1xyXG4gIGNhbmNlbFRocmVlSnNUYWdQbGFjZW1lbnQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZWRpdE9ubHlUYWdTdHlsZUZvclBvaShwb2k6IFBPSSwgb2JqZWN0OiBEYk9iamVjdFR5cGUpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQocG9pLmVsZW1lbnRJRCk7XHJcbiAgICAgIGlmICh0YWdEYXRhLnRhZykge1xyXG4gICAgICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldE1hdHRlclRhZ0RhdGFGb3JNYXR0ZXJ0YWcoXHJcbiAgICAgICAgICB0YWdEYXRhLnRhZ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3Qob2JqZWN0LCBQb2lUeXBlLlJPT00pO1xyXG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0VGFnSWNvbkFuZE9wYWNpdHkodGFnRGF0YS50YWcsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRJY29uQW5kU2V0Rm9yUG9pKHBvaTogUE9JLCBpY29uUGF0aDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xyXG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcclxuICAgICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE5ld0ljb25BbmRTZXRGb3JUYWcodGFnRGF0YS50YWcsIGljb25QYXRoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVG9SZWdpc3RyZWRJY29uRm9yUG9pKHBvaTogUE9JLCBpY29uTmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xyXG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcclxuICAgICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNldFJlZ2lzdHJlZEljb25Gb3JUYWcodGFnRGF0YS50YWcsIGljb25OYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlSHRtbFRhZ0ZvclBvaVdpdGhPYmplY3QocG9pOiBQT0ksIG9iamVjdDogRGJPYmplY3RUeXBlKSB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xyXG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xyXG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnVwZGF0ZUluamVjdGVkSHRtbEZvclRhZ0lEKFxyXG4gICAgICAgICAgdGFnRGF0YS50YWcsXHJcbiAgICAgICAgICBvYmplY3QsXHJcbiAgICAgICAgICBwb2kudHlwZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vdmUgYW4gZXhpc3RpbmcgcG9pIGluIE1hdHRlcnBvcnRcclxuICAgKiBAcGFyYW0gcG9pXHJcbiAgICogQHBhcmFtIGVsZW1lbnRcclxuICAgKi9cclxuICBhc3luYyBhY3Rpb25fbW92ZV9wb2lfdmlzdWFsbHkoXHJcbiAgICBwb2k6IFBPSSxcclxuICAgIGVsZW1lbnQ6IFRpY2tldCB8IEZlYXR1cmUgfCBFcXVpcG1lbnQgfCBDb21tZW50XHJcbiAgKSB7XHJcbiAgICBhd2FpdCB0aGlzLmFjdGlvbl9kZWxldGVfZWxlbWVudChlbGVtZW50KTtcclxuICAgIGF3YWl0IHRoaXMuYWN0aW9uQWRkT2JqZWN0RnJvbVBPSShlbGVtZW50LCBwb2kpO1xyXG4gIH1cclxuXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgQ3VwaXhcclxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgTWF0dGVycG9ydFxyXG4gICAgaHR0cHM6Ly9tYXR0ZXJwb3J0LmdpdGh1Yi5pby9zaG93Y2FzZS1zZGsvZG9jcy9zZGsvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy9tYXR0ZXJ0YWcuaHRtbCNhZGRcclxuICAgIGh0dHBzOi8vbWF0dGVycG9ydC5naXRodWIuaW8vc2hvd2Nhc2Utc2RrL2RvY3Mvc2RrL3JlZmVyZW5jZS9jdXJyZW50L21vZHVsZXMvbWF0dGVydGFnLmh0bWwjcmVtb3ZlXHJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuXHJcbiAgaW5pdFRocmVlSnMoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuaW5pdChjYW52YXMpO1xyXG4gICAgLy8gVGhlIHRhZyBwaXBlbGluZSBpcyBnYXRlZCBvbiB0aGlzIGZsYWcsIHdoaWNoIHVudGlsIG5vdyBvbmx5IHRoZSBNYXR0ZXJwb3J0IFNESyBzZXQuIEFcclxuICAgIC8vIFRocmVlLmpzIHZpc2l0IG5ldmVyIHJlYWNoZXMgdGhhdCBjb2RlLCBzbyBldmVyeSB0YWcgd2FzIGRyb3BwZWQgYmVmb3JlIGl0IGNvdWxkIGJlIGRyYXduLlxyXG4gICAgdGhpcy5zaG93aW5nVmlld2VyID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBFdmVyeXRoaW5nIHRoYXQgbG9hZHMgZGF0YSBmb3IgYSBzcGFjZSAtIHRpY2tldHMsIGVxdWlwbWVudHMsIGZlYXR1cmVzLCBtZWFzdXJlbWVudHMgLSBoYW5nc1xyXG4gICAgLy8gb2ZmIHRoaXMgZXZlbnQsIHdoaWNoIE1hdHRlcnBvcnQgcmFpc2VzIG9uY2UgaXRzIFNESyBzdGFydHMgcGxheWluZy4gQSBUaHJlZS5qcyB2aXNpdCBuZXZlclxyXG4gICAgLy8gdG91Y2hlcyB0aGUgU0RLLCBzbyBub3RoaW5nIGV2ZXIgYW5ub3VuY2VkIHRoZSBzcGFjZSBhbmQgZXZlcnkgbGlzdCBjYW1lIGJhY2sgZW1wdHkuXHJcbiAgICBpZiAodGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICB0aGlzLnZpZXdlcklzT24ubmV4dCh7XHJcbiAgICAgICAgc3BhY2VJRDogdGhpcy5jdXJyZW50U3BhY2VJRCxcclxuICAgICAgICBtb2RlbDNEOiBudWxsLFxyXG4gICAgICAgIHN3ZWVwOiBudWxsLFxyXG4gICAgICAgIHJvdGF0aW9uOiBudWxsLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5kYXRhSXNMb2FkZWQubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyBhIDNEIG1vZGVsIGludG8gdGhlIFRocmVlLmpzIHNjZW5lIChHTFRGKS5cclxuICAgKiBPbmx5IHdvcmtzIHdoZW4gdGhlIHZpZXdlciBpcyBpbiAndGhyZWVqcycgbW9kZS5cclxuICAgKi9cclxuICBsb2FkR0xURk1vZGVsKHVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XHJcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UubG9hZEdMVEZNb2RlbCh1cmwsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyBhIEdMQiBzdG9yZWQgaW4gUzMsIGdpdmVuIGl0cyBrZXkgKGUuZy4gYHZpc2l0cy88aWQ+L21vZGVsLmdsYmApLlxyXG4gICAqXHJcbiAgICogUmVzb2x2ZXMgdGhlIGtleSB0byBhIHNpZ25lZCBVUkwgZmlyc3QsIHRoZW4gbG9hZHMgaXQgbGlrZSBhbnkgb3RoZXIuIFRoZSBzaWduZWQgVVJMIG9ubHlcclxuICAgKiBjb3ZlcnMgYXV0aGVudGljYXRpb24gLSB0aGUgYnVja2V0IHN0aWxsIG5lZWRzIGEgQ09SUyBydWxlIGFsbG93aW5nIEdFVCBmcm9tIHRoZSBhcHAncyBvcmlnaW4sXHJcbiAgICogb3IgdGhlIGJyb3dzZXIgYmxvY2tzIHRoZSBkb3dubG9hZCBiZWZvcmUgaXQgc3RhcnRzLlxyXG4gICAqXHJcbiAgICogYHBsYWNlbWVudE1ldGFkYXRhYCBpcyB0aGUgY2FwdHVyZSdzIHN0b3JlZCBwbGFjZW1lbnQ7IHdoZW4gYWJzZW50IG9yIHVudXNhYmxlIHRoZSB2aWV3ZXIgZmFsbHNcclxuICAgKiBiYWNrIHRvIGZyYW1pbmcgdGhlIG1vZGVsIGF1dG9tYXRpY2FsbHkuXHJcbiAgICovXHJcbiAgYXN5bmMgbG9hZEdMVEZNb2RlbEZyb21TMyhrZXk6IHN0cmluZywgcGxhY2VtZW50TWV0YWRhdGE/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBBIGtleSB1bmRlciBhc3NldHMvIGlzIHNlcnZlZCBieSB0aGUgYXBwIGl0c2VsZiwgc28gaXQgbmVlZHMgbm8gc2lnbmluZy4gVGhpcyBpcyB3aGF0IGxldHMgYVxyXG4gICAgLy8gbW9kZWwgYnVuZGxlZCB3aXRoIHRoZSBidWlsZCBzdGFuZCBpbiBmb3Igb25lIGluIFMzIHdoaWxlIHRoZSB0d28gYXJlIG90aGVyd2lzZSBpZGVudGljYWwuXHJcbiAgICBjb25zdCBpc0xvY2FsQXNzZXQgPSBrZXkuc3RhcnRzV2l0aCgnYXNzZXRzLycpO1xyXG4gICAgY29uc3QgdXJsID0gaXNMb2NhbEFzc2V0ID8ga2V5IDogYXdhaXQgZ2V0U2lnbmVkRmlsZShrZXkpO1xyXG4gICAgaWYgKCF1cmwpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgVmlld2VyU2VydmljZTogY291bGQgbm90IHJlc29sdmUgYSBzaWduZWQgVVJMIGZvciB0aGUgM0QgbW9kZWwgYXQgXCIke2tleX1cIi5gKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGxhY2VtZW50ID0gcGFyc2VUaHJlZUpzUGxhY2VtZW50KHBsYWNlbWVudE1ldGFkYXRhKTtcclxuICAgIC8vIFRoZSBrZXksIG5vdCB0aGUgc2lnbmVkIFVSTCwgaXMgd2hhdCBpZGVudGlmaWVzIHRoZSBtb2RlbCBhY3Jvc3MgbG9hZHMgLSB0aGUgc2lnbmF0dXJlIG1ha2VzXHJcbiAgICAvLyBldmVyeSBVUkwgdW5pcXVlLCB3aGljaCBpcyBleGFjdGx5IHdoeSB0aGUgYnJvd3NlcidzIG93biBjYWNoZSBuZXZlciBoZWxwcyBoZXJlLlxyXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5sb2FkR0xURk1vZGVsKHVybCwgcGxhY2VtZW50Py5jYW1lcmFQb3NpdGlvbiwgcGxhY2VtZW50Py5yb3RhdGlvbiwga2V5LCBwbGFjZW1lbnQ/LnVwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGEgM0QgbW9kZWwgaW50byB0aGUgVGhyZWUuanMgc2NlbmUgKE9CSikuXHJcbiAgICovXHJcbiAgbG9hZE9iak1vZGVsKG10bFVybDogc3RyaW5nLCBvYmpVcmw6IHN0cmluZywgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xyXG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmxvYWRPYmpNb2RlbChtdGxVcmwsIG9ialVybCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB0aHJlZUpzT2JqZWN0SG92ZXJlZCQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5vYmplY3RIb3ZlcmVkJDtcclxuICB9XHJcblxyXG4gIGdldCB0aHJlZUpzT2JqZWN0Q2xpY2tlZCQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5vYmplY3RDbGlja2VkJDtcclxuICB9XHJcblxyXG4gIC8qKiBFbWl0cyB0cnVlIHdoaWxlIGEgaGVhdnkgLm9iaiBmaWxlIGlzIGJlaW5nIHBhcnNlZCAoaW4gYSB3b3JrZXIsIHdoZW4gYXZhaWxhYmxlKSwgZmFsc2Ugb25jZSBkb25lLiAqL1xyXG4gIGdldCB0aHJlZUpzTW9kZWxMb2FkaW5nJCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLm1vZGVsTG9hZGluZyQ7XHJcbiAgfVxyXG5cclxuICAvKiogRG93bmxvYWQgcHJvZ3Jlc3MgZm9yIEdMQiBtb2RlbHMgYXMgYSAwLTEgZnJhY3Rpb24sIG9yIG51bGwgd2hlbiB0aGUgc2l6ZSBpc24ndCBrbm93biB1cGZyb250LiAqL1xyXG4gIGdldCB0aHJlZUpzTW9kZWxMb2FkUHJvZ3Jlc3MkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UubW9kZWxMb2FkUHJvZ3Jlc3MkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXJzIHRoZSBXZWIgV29ya2VyIHVzZWQgdG8gcGFyc2UgaGVhdnkgLm9iaiBmaWxlcyBvZmYgdGhlIG1haW4gdGhyZWFkLlxyXG4gICAqIE11c3QgYmUgY3JlYXRlZCBieSB0aGUgYXBwIChzZWUgb2JqLXBhcnNlci53b3JrZXIudHMpLCBzaW5jZSB0aGlzIGxpYnJhcnkgY2FuJ3QgYnVuZGxlIHdvcmtlciBmaWxlcy5cclxuICAgKi9cclxuICBzZXRPYmpQYXJzZXJXb3JrZXIod29ya2VyOiBXb3JrZXIpOiB2b2lkIHtcclxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc2V0T2JqUGFyc2VyV29ya2VyKHdvcmtlcik7XHJcbiAgfVxyXG5cclxuICBhZGRUaHJlZUpzT2JqZWN0cyhvYmpzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcclxuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS51cGRhdGVPYmpzVG9TY2VuZShvYmpzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGluaXRNYXR0ZXJwb3J0U2RrKFxyXG4gICAgc3BhY2VJRDogc3RyaW5nLFxyXG4gICAgbW9kZWwzRDogc3RyaW5nLFxyXG4gICAgdGFnU2VydmljZTogQmFzZVRhZ1NlcnZpY2UsXHJcbiAgICBtb2R1bGU6IFNwTW9kdWxlID0gU3BNb2R1bGUuSU1NT1xyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jdXJyZW50U3BhY2VJRCA9IHNwYWNlSUQ7XHJcbiAgICBpZiAodGhpcy5tYXR0ZXJwb3J0U2VydmljZS5zZGspIHtcclxuICAgICAgYXdhaXQgdGhpcy5jbGVhckFsbCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFNlcnZpY2VcclxuICAgICAgLmluaXRTZGsodGFnU2VydmljZSwgbW9kdWxlKVxyXG4gICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgY29uc3QgeyBzZGsgfSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2U7XHJcblxyXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICBzZGsuU2NlbmUucmVnaXN0ZXIoc2VjdXJpdHlDYW1lcmFUeXBlLCBtYWtlU2VjdXJpdHlDYW1lcmEuYmluZChzZGsuU2NlbmUpKSxcclxuICAgICAgICAgICAgc2RrLlNjZW5lLnJlZ2lzdGVyKFZpZXdGcnVzdHVtTWVzaFR5cGUsIG1ha2VWaWV3RnJ1c3R1bU1lc2guYmluZChzZGsuU2NlbmUpKVxyXG4gICAgICAgICAgXSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBzZGsuQXBwLnN0YXRlLnN1YnNjcmliZShcclxuICAgICAgICAgICAgZnVuY3Rpb24gKGFwcFN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnVGhlIGN1cnJlbnQgcGhhc2U6ICcsIGFwcFN0YXRlLnBoYXNlKTtcclxuICAgICAgICAgICAgICBpZiAoYXBwU3RhdGUucGhhc2UgPT09IHNkay5BcHAuUGhhc2UuUExBWUlORykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1RoZSBhcHAgaXMgcGxheWluZycpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcclxuICAgICAgICAgICAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICAgICAgICAgICAgbW9kZWwzRCxcclxuICAgICAgICAgICAgICAgICAgc3dlZXA6IHRoaXMuc3dlZXBUb01vdmUsXHJcbiAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uVG9Nb3ZlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFJc0xvYWRlZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3ZWVwVG9Nb3ZlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMucm90YXRpb25Ub01vdmUgPSBudWxsO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcclxuICAgICAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICAgICAgbW9kZWwzRCxcclxuICAgICAgICAgICAgc3dlZXA6IHRoaXMuc3dlZXBUb01vdmUsXHJcbiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uVG9Nb3ZlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLmRhdGFJc0xvYWRlZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnN3ZWVwVG9Nb3ZlID0gbnVsbDtcclxuICAgICAgICAgIHRoaXMucm90YXRpb25Ub01vdmUgPSBudWxsO1xyXG5cclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRm9yYmlkZGVuU3dlZXBzKGZvcmJpZGRlblN3ZWVwczogc3RyaW5nW10pIHtcclxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XHJcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UucmVtb3ZlRm9yYmlkZGVuU3dlZXBzKGZvcmJpZGRlblN3ZWVwcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRPYmplY3QzRExvYWRlZEluUG9zaXRpb24ob2JqZWN0TG9hZGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzT2JqZWN0TG9hZGVkID0gb2JqZWN0TG9hZGVkO1xyXG4gIH1cclxuXHJcbiAgaXNPYmplY3QzRExvYWRlZEluUG9zaXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc09iamVjdExvYWRlZDtcclxuICB9XHJcbn1cclxuIl19