@smarterplan/ngx-smarterplan-core 1.4.17 → 1.4.19

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 (99) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/csv-export/csv-export.component.mjs +3 -3
  3. package/esm2022/lib/components/loader/loader.component.mjs +3 -3
  4. package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +1 -1
  5. package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +3 -3
  6. package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +3 -3
  7. package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +3 -3
  8. package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
  9. package/esm2022/lib/components/support-modal/support-modal.component.mjs +3 -3
  10. package/esm2022/lib/config.mjs +1 -1
  11. package/esm2022/lib/helpers.service.mjs +1 -1
  12. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +1 -1
  13. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +1 -1
  14. package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +1 -1
  15. package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +1 -1
  16. package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +1 -1
  17. package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +22 -22
  18. package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +1 -1
  19. package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +22 -22
  20. package/esm2022/lib/mattertagData.mjs +10 -1
  21. package/esm2022/lib/ngx-smarterplan-core.module.mjs +1 -1
  22. package/esm2022/lib/ngx-smarterplan-core.service.mjs +1 -1
  23. package/esm2022/lib/pipes/duration-to-string.pipe.mjs +1 -1
  24. package/esm2022/lib/pipes/format-date-number-to-digits.pipe.mjs +1 -1
  25. package/esm2022/lib/pipes/hashtag-from-id.pipe.mjs +1 -1
  26. package/esm2022/lib/pipes/safe-url.pipe.mjs +1 -1
  27. package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +1 -1
  28. package/esm2022/lib/pipes/username-from-id.pipe.mjs +1 -1
  29. package/esm2022/lib/services/amplify-cache.service.mjs +1 -1
  30. package/esm2022/lib/services/base-tab.service.mjs +1 -1
  31. package/esm2022/lib/services/baseVisibility.service.mjs +1 -1
  32. package/esm2022/lib/services/content.service.mjs +1 -1
  33. package/esm2022/lib/services/filter.service.mjs +1 -1
  34. package/esm2022/lib/services/intervention.service.mjs +1 -1
  35. package/esm2022/lib/services/locale.service.mjs +1 -1
  36. package/esm2022/lib/services/matterport-import.service.mjs +10 -3
  37. package/esm2022/lib/services/matterport-measurement.service.mjs +1 -1
  38. package/esm2022/lib/services/matterport-navigation.service.mjs +18 -1
  39. package/esm2022/lib/services/matterport-object3d.service.mjs +1 -1
  40. package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
  41. package/esm2022/lib/services/matterport-tag-copy.service.mjs +455 -9
  42. package/esm2022/lib/services/matterport-tag.service.mjs +99 -10
  43. package/esm2022/lib/services/matterport.service.mjs +87 -48
  44. package/esm2022/lib/services/models/affectation.service.mjs +1 -1
  45. package/esm2022/lib/services/models/base-object.service.mjs +1 -1
  46. package/esm2022/lib/services/models/capture.service.mjs +1 -1
  47. package/esm2022/lib/services/models/comment.service.mjs +1 -1
  48. package/esm2022/lib/services/models/domain.service.mjs +1 -1
  49. package/esm2022/lib/services/models/equipment.service.mjs +1 -1
  50. package/esm2022/lib/services/models/event.service.mjs +1 -1
  51. package/esm2022/lib/services/models/feature.service.mjs +1 -1
  52. package/esm2022/lib/services/models/hashtag.service.mjs +1 -1
  53. package/esm2022/lib/services/models/layer.service.mjs +1 -1
  54. package/esm2022/lib/services/models/measurement.service.mjs +1 -1
  55. package/esm2022/lib/services/models/mission.service.mjs +1 -1
  56. package/esm2022/lib/services/models/navigation.service.mjs +1 -1
  57. package/esm2022/lib/services/models/node.service.mjs +1 -1
  58. package/esm2022/lib/services/models/object3D.service.mjs +1 -1
  59. package/esm2022/lib/services/models/operation.service.mjs +1 -1
  60. package/esm2022/lib/services/models/organisation.service.mjs +1 -1
  61. package/esm2022/lib/services/models/plan.service.mjs +1 -1
  62. package/esm2022/lib/services/models/poi.service.mjs +62 -50
  63. package/esm2022/lib/services/models/profile.service.mjs +1 -1
  64. package/esm2022/lib/services/models/property.service.mjs +1 -1
  65. package/esm2022/lib/services/models/space.service.mjs +1 -1
  66. package/esm2022/lib/services/models/template.service.mjs +1 -1
  67. package/esm2022/lib/services/models/ticket.service.mjs +1 -1
  68. package/esm2022/lib/services/models/visit.service.mjs +1 -1
  69. package/esm2022/lib/services/models/zone.service.mjs +9 -5
  70. package/esm2022/lib/services/navigator.service.mjs +1 -1
  71. package/esm2022/lib/services/s3.service.mjs +1 -1
  72. package/esm2022/lib/services/search.service.mjs +1 -1
  73. package/esm2022/lib/services/support.service.mjs +1 -1
  74. package/esm2022/lib/services/tag.service.mjs +16 -16
  75. package/esm2022/lib/services/threejs-import.service.mjs +1 -1
  76. package/esm2022/lib/services/threejs.service.mjs +1 -1
  77. package/esm2022/lib/services/user.service.mjs +1 -1
  78. package/esm2022/lib/services/utils/matterport-transform.util.mjs +1 -1
  79. package/esm2022/lib/services/validators.service.mjs +1 -1
  80. package/esm2022/lib/services/viewer.service.mjs +1 -1
  81. package/esm2022/lib/services/zone-drawer.service.mjs +1 -1
  82. package/esm2022/lib/services/zoneChange.service.mjs +1 -1
  83. package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +1 -1
  84. package/esm2022/lib/types.service.mjs +1 -1
  85. package/esm2022/lib/validators/email.directive.mjs +1 -1
  86. package/esm2022/lib/validators/no-empty.directive.mjs +1 -1
  87. package/esm2022/lib/validators/number.directive.mjs +1 -1
  88. package/esm2022/lib/validators/text.directive.mjs +1 -1
  89. package/esm2022/public-api.mjs +1 -1
  90. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +814 -193
  91. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  92. package/lib/mattertagData.d.ts +4 -0
  93. package/lib/services/matterport-navigation.service.d.ts +9 -0
  94. package/lib/services/matterport-tag-copy.service.d.ts +128 -2
  95. package/lib/services/matterport-tag.service.d.ts +24 -1
  96. package/lib/services/matterport.service.d.ts +12 -3
  97. package/lib/services/models/poi.service.d.ts +1 -0
  98. package/package.json +1 -1
  99. package/src/assets/vs-app.json +67 -67
@@ -114,6 +114,12 @@ export class MatterportService {
114
114
  tagAction = new Subject();
115
115
  /** Views (furnished, defurnished...) exposed by the SDK for the current space. */
116
116
  viewsByType = new Map();
117
+ /** Settles once every static icon texture has been registered (or failed). */
118
+ iconsRegistered = Promise.resolve();
119
+ /** Names of the textures successfully registered in the current SDK session. */
120
+ registeredIcons = new Set();
121
+ /** tagId -> signed source last registered as a custom texture, and its texture name. */
122
+ customIconCache = new Map();
117
123
  currentView = null;
118
124
  viewSubscriptions = [];
119
125
  /** Emits the active view every time the user switches between furnished/defurnished. */
@@ -242,13 +248,16 @@ export class MatterportService {
242
248
  this.addCustomCss();
243
249
  this.pointerService.startAdminCursorTracker(this.sdk, this.container, () => this.poseMatterport, () => this.poseCamera);
244
250
  // Load Mattertag icons and custom subscriptions
251
+ this.registeredIcons.clear();
252
+ this.customIconCache.clear();
253
+ const iconRegistrations = [];
245
254
  switch (module) {
246
255
  case SpModule.IMMO:
247
- this.sdk.Asset.registerTexture('icon-ticket', this.config.my_config.icon_ticket);
248
- this.sdk.Asset.registerTexture('icon-equipment', this.config.my_config.icon_equipment);
249
- this.sdk.Asset.registerTexture('icon-measure', this.config.my_config.icon_measure);
250
- this.sdk.Asset.registerTexture('icon-data', this.config.my_config.icon_data);
251
- this.sdk.Asset.registerTexture('icon-object3d', this.config.my_config.icon_object3d);
256
+ iconRegistrations.push(this.registerIcon('icon-ticket', this.config.my_config.icon_ticket));
257
+ iconRegistrations.push(this.registerIcon('icon-equipment', this.config.my_config.icon_equipment));
258
+ iconRegistrations.push(this.registerIcon('icon-measure', this.config.my_config.icon_measure));
259
+ iconRegistrations.push(this.registerIcon('icon-data', this.config.my_config.icon_data));
260
+ iconRegistrations.push(this.registerIcon('icon-object3d', this.config.my_config.icon_object3d));
252
261
  this.sdk.Measurements.data.subscribe({
253
262
  onAdded: function (index, item, collection) {
254
263
  this.measurementService.setLastMeasure(item.points);
@@ -265,20 +274,19 @@ export class MatterportService {
265
274
  }.bind(this));
266
275
  break;
267
276
  case SpModule.MUSEUM:
268
- this.sdk.Asset.registerTexture('icon-data', this.config.my_config.icon_data);
277
+ iconRegistrations.push(this.registerIcon('icon-data', this.config.my_config.icon_data));
269
278
  break;
270
279
  case SpModule.HOTEL:
271
- this.sdk.Asset.registerTexture('icon_room_available', this.config.my_config.icon_room_available);
272
- this.sdk.Asset.registerTexture('icon_room_unavailable', this.config.my_config.icon_room_unavailable);
273
- this.sdk.Asset.registerTexture('icon_room_chosen', this.config.my_config.icon_room_chosen);
274
- this.sdk.Asset.registerTexture('icon_room_viewed', this.config.my_config.icon_room_viewed);
280
+ iconRegistrations.push(this.registerIcon('icon_room_available', this.config.my_config.icon_room_available));
281
+ iconRegistrations.push(this.registerIcon('icon_room_unavailable', this.config.my_config.icon_room_unavailable));
282
+ iconRegistrations.push(this.registerIcon('icon_room_chosen', this.config.my_config.icon_room_chosen));
283
+ iconRegistrations.push(this.registerIcon('icon_room_viewed', this.config.my_config.icon_room_viewed));
275
284
  break;
276
285
  default:
277
286
  break;
278
287
  }
279
- this.sdk.Asset.registerTexture('icon-position', this.config.my_config.icon_position)
280
- .catch((e) => { if (isDevMode())
281
- console.warn('icon-position texture registration failed', e); });
288
+ iconRegistrations.push(this.registerIcon('icon-position', this.config.my_config.icon_position));
289
+ this.iconsRegistered = Promise.allSettled(iconRegistrations).then(() => undefined);
282
290
  // Current Room (used for getting bounding box and eventually lazy load mattertag or object3D inside current Room)
283
291
  this.sdk.Room.current.subscribe((currentRoom) => {
284
292
  const rooms = Array.isArray(currentRoom) ? currentRoom : (currentRoom ? [currentRoom] : []);
@@ -309,6 +317,10 @@ export class MatterportService {
309
317
  }.bind(this));
310
318
  //Camera mode
311
319
  this.sdk.Mode.current.subscribe((mode) => {
320
+ if (this.navigationService.isUnrequestedFloorplanSwitch(this.cameraMode, mode)) {
321
+ // Top-down dollhouse camera reported as floorplan: still dollhouse, ignore it
322
+ return;
323
+ }
312
324
  if (this.cameraMode !== mode) {
313
325
  this.navigationService.setCameraMode(mode);
314
326
  // Refresh tag visibility on every mode change (INSIDE vs DOLLHOUSE vs FLOORPLAN)
@@ -636,15 +648,29 @@ export class MatterportService {
636
648
  /** Applies a pre-registered icon to a Mattertag. */
637
649
  async setRegistredIconForTag(mattertagID, iconName) {
638
650
  try {
639
- this.matterportTagService.getTagModule(this.sdk, mattertagID).editIcon(mattertagID, iconName);
651
+ await this.matterportTagService.editTagIcon(this.sdk, mattertagID, iconName);
640
652
  }
641
653
  catch (e) {
642
654
  if (isDevMode())
643
655
  console.warn('Could not edit icon', iconName, e);
644
656
  }
645
657
  }
646
- /** Sets the appropriate icon and opacity for a tag based on its type and POI metadata. */
658
+ /** Registers a static texture and remembers its name once the SDK accepted it. */
659
+ async registerIcon(iconName, iconPath) {
660
+ if (!iconPath)
661
+ return;
662
+ try {
663
+ await this.sdk.Asset.registerTexture(iconName, iconPath);
664
+ this.registeredIcons.add(iconName);
665
+ }
666
+ catch (e) {
667
+ if (isDevMode())
668
+ console.warn(`[MatterportService] ${iconName} texture registration failed`, e);
669
+ }
670
+ }
671
+ /** Sets the appropriate icon for a tag based on its type and POI metadata. */
647
672
  async setTagIconAndOpacity(mattertagID, mattertagData) {
673
+ await this.iconsRegistered;
648
674
  if (this.SPModule === SpModule.HOTEL) {
649
675
  const room = mattertagData.getObject();
650
676
  let iconName = `icon_room`;
@@ -658,7 +684,6 @@ export class MatterportService {
658
684
  return;
659
685
  }
660
686
  const stringTagType = poiTypeToString(mattertagData.getType());
661
- let opacity = this.config.my_config.DEFAULT_OPACITY_TAG;
662
687
  let iconName = `icon-${stringTagType}`;
663
688
  const poi = mattertagData.getPoi();
664
689
  if (poi && poi.tagIcon) {
@@ -670,31 +695,45 @@ export class MatterportService {
670
695
  }
671
696
  }
672
697
  if (tagIcon.src) {
673
- const pathSigned = await this.tagService.getSignedTagIconSource(tagIcon.src);
674
- if (pathSigned) {
675
- try {
676
- iconName = `icon-${stringTagType}-${mattertagID}-${mattertagData.customIconIndex}`;
677
- await this.sdk.Asset.registerTexture(iconName, pathSigned);
678
- mattertagData.customIconIndex += 1;
679
- }
680
- catch {
681
- console.log('error registerIcon');
698
+ // keyed on the stored source, not on the signed URL: a new signature every call
699
+ const cached = this.customIconCache.get(mattertagID);
700
+ if (cached && cached.src === tagIcon.src) {
701
+ iconName = cached.iconName;
702
+ }
703
+ else {
704
+ const pathSigned = await this.tagService.getSignedTagIconSource(tagIcon.src);
705
+ if (pathSigned) {
706
+ try {
707
+ const customIconName = `icon-${stringTagType}-${mattertagID}-${mattertagData.customIconIndex}`;
708
+ await this.sdk.Asset.registerTexture(customIconName, pathSigned);
709
+ mattertagData.customIconIndex += 1;
710
+ this.customIconCache.set(mattertagID, { src: tagIcon.src, iconName: customIconName });
711
+ this.registeredIcons.add(customIconName);
712
+ iconName = customIconName;
713
+ }
714
+ catch {
715
+ console.log('error registerIcon');
716
+ }
682
717
  }
683
718
  }
684
719
  }
685
- if (tagIcon.opacity) {
686
- opacity = tagIcon.opacity;
687
- }
688
720
  }
689
721
  await this.editTagIcon(mattertagID, iconName);
690
722
  }
691
723
  /**
692
- * Applies an icon to a tag. The call is awaited and its rejection reported: a
693
- * silently dropped promise here leaves the pin with its default white look.
724
+ * Applies an icon to a tag, unless that icon is already the one applied. The call is
725
+ * awaited and its rejection reported: a silently dropped promise here leaves the pin
726
+ * with its default white look.
694
727
  */
695
728
  async editTagIcon(mattertagID, iconName) {
729
+ if (this.matterportTagService.getCachedTagIcon(mattertagID) === iconName)
730
+ return;
731
+ // A texture that was never registered (no icon configured for this type) can only fail:
732
+ // the pin keeps its default look, as before, without a doomed SDK call.
733
+ if (!this.registeredIcons.has(iconName))
734
+ return;
696
735
  try {
697
- await this.matterportTagService.getTagModule(this.sdk, mattertagID).editIcon(mattertagID, iconName);
736
+ await this.matterportTagService.editTagIcon(this.sdk, mattertagID, iconName);
698
737
  }
699
738
  catch (error) {
700
739
  if (isDevMode())
@@ -797,22 +836,22 @@ export class MatterportService {
797
836
  );
798
837
  }*/
799
838
  addCustomCss() {
800
- const css = `
801
- .footer-ui,
802
- .showcase-footer,
803
- .mp-nova-btn-group,
804
- .footer-divider,
805
- .logo-link,
806
- .footer-logo,
807
- .bottom-ui,
808
- img.logo-image,
809
- img[class^="logo-image"],
810
- img[class*=" logo-image"],
811
- [data-testid="showcase-footer"] {
812
- opacity: 0 !important;
813
- visibility: hidden !important;
814
- pointer-events: none !important;
815
- }
839
+ const css = `
840
+ .footer-ui,
841
+ .showcase-footer,
842
+ .mp-nova-btn-group,
843
+ .footer-divider,
844
+ .logo-link,
845
+ .footer-logo,
846
+ .bottom-ui,
847
+ img.logo-image,
848
+ img[class^="logo-image"],
849
+ img[class*=" logo-image"],
850
+ [data-testid="showcase-footer"] {
851
+ opacity: 0 !important;
852
+ visibility: hidden !important;
853
+ pointer-events: none !important;
854
+ }
816
855
  `;
817
856
  // 1st method: Via Scene SDK
818
857
  if (this.sdk?.Scene?.addStyle) {
@@ -1387,4 +1426,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1387
1426
  type: Inject,
1388
1427
  args: [MATTERPORT_SDK_KEY]
1389
1428
  }] }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.BaseVisibilityService }, { type: i0.NgZone }, { type: i3.MatterportMeasurementService }, { type: i4.MatterportNavigationService }, { type: i5.MatterportPointerService }, { type: i6.MatterportObject3DService }, { type: i7.MatterportTagService }] });
1390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tYXR0ZXJwb3J0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUNMLGVBQWUsRUFDZixJQUFJLEVBQ0wsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUVMLFdBQVcsRUFFWCxtQkFBbUIsRUFJbkIsa0JBQWtCLEVBRWxCLE9BQU8sRUFDUCxRQUFRLEVBQ1Isa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7QUErQjFCLE1BQU0sT0FBTyxpQkFBaUI7SUFxT21CO0lBQ3JDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQTVPSCxHQUFHLENBQU07SUFFUixTQUFTLENBQU07SUFFdkIsa0JBQWtCO0lBQ1YsY0FBYyxDQUFNO0lBRXJCLFVBQVUsQ0FBK0M7SUFFekQsa0JBQWtCLEdBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBRXBELGVBQWUsR0FBRyxLQUFLLENBQUM7SUFFeEIsZUFBZSxHQUFXLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztJQUVyRCxVQUFVLEdBQVcsUUFBUSxDQUFDO0lBRXRDLElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FB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LElBQXNDLEVBQ3RDLE9BQWdCLEVBQ2hCLFdBQW9CO1FBRXBCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6SCxDQUFDO0lBRUQseUJBQXlCO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNDLENBQUM7d0dBMXJEVSxpQkFBaUIsa0JBb09sQixRQUFRLGFBQ1Isa0JBQWtCOzRHQXJPakIsaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQXFPSSxNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTUFUVEVSUE9SVF9TREtfS0VZIH0gZnJvbSAnLi4vdG9rZW5zL21hdHRlcnBvcnQtc2RrLWtleS50b2tlbic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIHBvaVR5cGVUb1N0cmluZyxcbiAgd2FpdFxufSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0dGVydGFnRGF0YSB9IGZyb20gJy4uL21hdHRlcnRhZ0RhdGEnO1xuaW1wb3J0IHtcbiAgRGJPYmplY3RUeXBlLFxuICBGZWF0dXJlVHlwZSxcbiAgSU9iamVjdDNELFxuICBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLFxuICBNYXR0ZXJwb3J0U3Vic2NyaXB0aW9uLFxuICBNYXR0ZXJwb3J0VmlldyxcbiAgTWF0dGVycG9ydFZpZXdDb2xsZWN0aW9uLFxuICBNYXR0ZXJwb3J0Vmlld1R5cGUsXG4gIFBPSSxcbiAgUG9pVHlwZSxcbiAgU3BNb2R1bGUsXG4gIFZpZXdlckludGVyYWN0aW9ucyxcbn0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5pbXBvcnQgeyBCYXNlVGFnU2VydmljZSB9IGZyb20gJy4vdGFnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZVZpc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi9iYXNlVmlzaWJpbGl0eS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBDYW1lcmFNb2RlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5pbXBvcnQgeyBNYXR0ZXJwb3J0TWVhc3VyZW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LW1lYXN1cmVtZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBNYXR0ZXJwb3J0UG9pbnRlclNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQtcG9pbnRlci5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdHRlcnBvcnRPYmplY3QzRFNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQtb2JqZWN0M2Quc2VydmljZSc7XG5pbXBvcnQgeyBNYXR0ZXJwb3J0VGFnU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC10YWcuc2VydmljZSc7XG5cbi8qKlxuICogQ3VzdG9tIFRocmVlanMgT2JqZWN0IDNEIGludGVyZmFjZVxuICovXG5pbnRlcmZhY2UgVGhyZWVKU09iamVjdDNEIHtcbiAgaWQ6IHN0cmluZztcbiAgdXVpZD86IHN0cmluZztcbiAgcG9zaXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIgfVxuICByb3RhdGlvbj86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciB9XG4gIHNjYWxlPzogeyB4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBNUF9TREs6IHsgY29ubmVjdDogRnVuY3Rpb24gfTtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTWF0dGVycG9ydFNlcnZpY2Uge1xuXG4gIHB1YmxpYyBzZGs6IGFueTtcblxuICBwcml2YXRlIGNvbnRhaW5lcjogYW55O1xuXG4gIC8vIFBvc2l0aW9uIGNhbWVyYVxuICBwcml2YXRlIHBvc2VNYXR0ZXJwb3J0OiBhbnk7XG5cbiAgcHVibGljIHBvc2VDYW1lcmE6IHsgcm90YXRpb246IGFueTsgcG9zaXRpb246IGFueTsgc3dlZXA6IGFueSB9O1xuXG4gIHB1YmxpYyBsYXN0Q2FtZXJhUG9zaXRpb246IGFueSA9IHsgeDogMC4wLCB5OiAwLjAsIHo6IDAuMCB9O1xuXG4gIHByaXZhdGUgaXNNZWFzdXJlTW9kZU9uID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBpbnRlcmFjdGlvbk1vZGU6IG51bWJlciA9IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUO1xuXG4gIHByaXZhdGUgY2FtZXJhTW9kZTogc3RyaW5nID0gJ0lOU0lERSc7XG5cbiAgcHVibGljIGdldCBtYXR0ZXJ0YWdJRHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UubWF0dGVydGFnSURzO1xuICB9XG5cbiAgcHVibGljIHNldCBtYXR0ZXJ0YWdJRHModmFsdWU6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLm1hdHRlcnRhZ0lEcyA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBkaWN0aW9ubmFyeVRhZ3MoKTogTWFwPHN0cmluZywgTWF0dGVydGFnRGF0YT4ge1xuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmRpY3Rpb25uYXJ5VGFncztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGljdGlvbm5hcnlPYmplY3RzM0QoKTogTWFwPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRpY3Rpb25uYXJ5T2JqZWN0czNEO1xuICB9XG5cbiAgcHVibGljIGdldCBkaWN0aW9ubmFyeVNjZW5lT2JqZWN0czNEKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5kaWN0aW9ubmFyeVNjZW5lT2JqZWN0czNEO1xuICB9XG5cbiAgcHVibGljIGdldCB0aHJlZUpTU2NlbmUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UudGhyZWVKU1NjZW5lO1xuICB9XG5cbiAgcHVibGljIHNldCB0aHJlZUpTU2NlbmUodmFsdWU6IGFueSkge1xuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnRocmVlSlNTY2VuZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBhemltdXRoYWxDcm93bigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5hemltdXRoYWxDcm93bjtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYXppbXV0aGFsQ3Jvd24odmFsdWU6IGFueSkge1xuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmF6aW11dGhhbENyb3duID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRhZ3NBdHRhY2htZW50cygpOiBPYmplY3Qge1xuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnRhZ3NBdHRhY2htZW50cztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3dlZXBzKCk6IEFycmF5PHN0cmluZz4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5zd2VlcHM7XG4gIH1cblxuICBwdWJsaWMgc2V0IHN3ZWVwcyh2YWx1ZTogQXJyYXk8c3RyaW5nPiB8IG51bGwpIHtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN3ZWVwcyA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzd2VlcENvbGxlY3Rpb24oKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5zd2VlcENvbGxlY3Rpb247XG4gIH1cblxuICBwdWJsaWMgc2V0IHN3ZWVwQ29sbGVjdGlvbih2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5zd2VlcENvbGxlY3Rpb24gPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFN3ZWVwKCk6IFN1YmplY3Q8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFN3ZWVwO1xuICB9XG5cbiAgLy9jYW1lcmEgcG9zaXRpb24gd2l0aCByb3RhdGlvblxuICBwdWJsaWMgY3VycmVudENhbWVyYVBvc2U6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIGdldCBmbG9vcnMoKTogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHNlcXVlbmNlOiBudW1iZXIgfT4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5mbG9vcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0IGZsb29ycyh2YWx1ZTogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHNlcXVlbmNlOiBudW1iZXIgfT4gfCBudWxsKSB7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5mbG9vcnMgPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2N1cnJlbnRTcGFjZUlEOiBzdHJpbmc7XG5cbiAgcHVibGljIGdldCBsYXN0T2JqZWN0M0QoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UubGFzdE9iamVjdDNEO1xuICB9XG5cbiAgcHVibGljIHNldCBsYXN0T2JqZWN0M0QodmFsdWU6IGFueSkge1xuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmxhc3RPYmplY3QzRCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50Um9vbXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRSb29tcztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY3VycmVudFJvb21zKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRTcGFjZUlEKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTcGFjZUlEO1xuICB9XG5cbiAgcHVibGljIHNldCBjdXJyZW50U3BhY2VJRCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3VycmVudFNwYWNlSUQgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9yYmlkZGVuU3dlZXBzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5mb3JiaWRkZW5Td2VlcHM7XG4gIH1cblxuICBwdWJsaWMgc2V0IGZvcmJpZGRlblN3ZWVwcyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZvcmJpZGRlblN3ZWVwcyA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIHRhZ0FjdGlvbjogU3ViamVjdDx7IGFjdGlvbjogc3RyaW5nOyBkYXRhOiBzdHJpbmcgfT4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIC8qKiBWaWV3cyAoZnVybmlzaGVkLCBkZWZ1cm5pc2hlZC4uLikgZXhwb3NlZCBieSB0aGUgU0RLIGZvciB0aGUgY3VycmVudCBzcGFjZS4gKi9cbiAgcHJpdmF0ZSB2aWV3c0J5VHlwZTogTWFwPE1hdHRlcnBvcnRWaWV3VHlwZSwgTWF0dGVycG9ydFZpZXc+ID0gbmV3IE1hcCgpO1xuXG4gIHByaXZhdGUgY3VycmVudFZpZXc6IE1hdHRlcnBvcnRWaWV3IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSB2aWV3U3Vic2NyaXB0aW9uczogTWF0dGVycG9ydFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgLyoqIEVtaXRzIHRoZSBhY3RpdmUgdmlldyBldmVyeSB0aW1lIHRoZSB1c2VyIHN3aXRjaGVzIGJldHdlZW4gZnVybmlzaGVkL2RlZnVybmlzaGVkLiAqL1xuICBwdWJsaWMgb25WaWV3Q2hhbmdlZDogU3ViamVjdDxNYXR0ZXJwb3J0VmlldyB8IG51bGw+ID0gbmV3IFN1YmplY3QoKTtcblxuICAvKiogRGVsYXkgbGVmdCB0byB0aGUgU0RLIHRvIHJlYnVpbGQgdGhlIGxheWVyJ3MgdGFncyBhZnRlciBhIHZpZXcgc3dpdGNoLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBWSUVXX1NXSVRDSF9SRUZSRVNIX0RFTEFZX01TID0gODAwO1xuXG4gIHByaXZhdGUgdmlld1N3aXRjaFJlc3RvcmVUaW1lcjogYW55ID0gbnVsbDtcblxuICBwdWJsaWMgZ2V0IG1hdHRlcnRhZ1RvRm9sbG93KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLm1hdHRlcnRhZ1RvRm9sbG93O1xuICB9XG5cbiAgcHVibGljIHNldCBtYXR0ZXJ0YWdUb0ZvbGxvdyh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UubWF0dGVydGFnVG9Gb2xsb3cgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5UcmFuc2l0aW9uTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Nb2RlO1xuICB9XG5cbiAgcHVibGljIHNldCBpblRyYW5zaXRpb25Nb2RlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Nb2RlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluVHJhbnNpdGlvblN3ZWVwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvblN3ZWVwO1xuICB9XG5cbiAgcHVibGljIHNldCBpblRyYW5zaXRpb25Td2VlcCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uU3dlZXAgPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm9MaWdodEZvck9iamVjdHMgPSB0cnVlO1xuXG4gIHB1YmxpYyBnZXQgY3VycmVudENhbWVyYU1vZGUoKTogQ2FtZXJhTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudENhbWVyYU1vZGU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGN1cnJlbnRDYW1lcmFNb2RlKHZhbHVlOiBDYW1lcmFNb2RlKSB7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBvbkNhbWVyYU1vZGVDaGFuZ2VkKCk6IFN1YmplY3Q8Q2FtZXJhTW9kZT4ge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm9uQ2FtZXJhTW9kZUNoYW5nZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9uUm9vbUNoYW5nZWQoKTogU3ViamVjdDxhbnlbXT4ge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm9uUm9vbUNoYW5nZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9uR29Ub1RhZygpOiBTdWJqZWN0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLm9uR29Ub1RhZztcbiAgfVxuXG4gIHRhZ1NlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlO1xuXG4gIGNvbmZpZzogQ29uZmlnO1xuXG4gIFNQTW9kdWxlOiBTcE1vZHVsZTtcblxuICBwdWJsaWMgZ2V0IG9iamVjdENvbnRyb2woKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2Uub2JqZWN0Q29udHJvbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VjdXJpdHlDYW1lcmFBbmltYXRvcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5zZWN1cml0eUNhbWVyYUFuaW1hdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGlvbnMgb24gbGVmdCBjbGljayB3aGVuIHBvc2l0aW9uaW5nIG1hdHRlcnRhZyBpbiB2aXNpdFxuICAgKi9cbiAgcG9pbnRlckxlZnRDbGlja0hhbmRsZXIgPSAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHtcbiAgICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyk7XG4gICAgICBpZiAobWF0dGVydGFnRGF0YSkge1xuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvc2l0aW9uKHsgLi4udGhpcy5wb3NlTWF0dGVycG9ydC5wb3NpdGlvbiB9KTtcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwoeyAuLi50aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbCB9KTtcbiAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KHRoaXMubWF0dGVydGFnVG9Gb2xsb3csIG1hdHRlcnRhZ0RhdGEpO1xuICAgICAgICB0aGlzLnVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRCh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblZhbGlkYXRlZE1hdHRlcnRhZygpO1xuICB9O1xuXG4gIHBvaW50ZXJSaWdodENsaWNrSGFuZGxlciA9IChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuY2FuY2VsRm9sbG93aW5nQ3Vyc29yKCk7XG4gICAgYWxlcnQoJ2FjdGlvbiBjYW5jZWxsZWQnKTtcbiAgfTtcblxuICBwb2ludGVyTWlkZGxlQ2xpY2tIYW5kbGVyID0gKGUpID0+IHtcbiAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLnVwZGF0ZUN1cnNvckRpc3BsYXkodGhpcy5wb3NlTWF0dGVycG9ydCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCdjb25maWcnKSBjb25maWc6IENvbmZpZyxcbiAgICBASW5qZWN0KE1BVFRFUlBPUlRfU0RLX0tFWSkgcHJpdmF0ZSByZWFkb25seSBzZGtLZXk6IHN0cmluZyxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgYWN0aXZlUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgdmlzaWJpbGl0eVNlcnZpY2U6IEJhc2VWaXNpYmlsaXR5U2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgbWVhc3VyZW1lbnRTZXJ2aWNlOiBNYXR0ZXJwb3J0TWVhc3VyZW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHBvaW50ZXJTZXJ2aWNlOiBNYXR0ZXJwb3J0UG9pbnRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvYmplY3QzRFNlcnZpY2U6IE1hdHRlcnBvcnRPYmplY3QzRFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXR0ZXJwb3J0VGFnU2VydmljZTogTWF0dGVycG9ydFRhZ1NlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBNYXR0ZXJwb3J0IFNESywgc2V0cyB1cCBldmVudCBsaXN0ZW5lcnMsIGFuZCBjb25maWd1cmVzIGFzc2V0cy5cbiAgICogQHBhcmFtIHRhZ1NlcnZpY2UgU2VydmljZSB1c2VkIHRvIGdlbmVyYXRlIGFuZCBpbmplY3QgSFRNTCBpbnRvIHRhZ3MuXG4gICAqIEBwYXJhbSBtb2R1bGUgQXBwbGljYXRpb24gbW9kdWxlIChlLmcuLCBJTU1PLCBNVVNFVU0pIHRvIGVuYWJsZSBzcGVjaWZpYyBmZWF0dXJlcy5cbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdHJ1ZSB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5pdFNkayhcbiAgICB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZSxcbiAgICBtb2R1bGU6IFNwTW9kdWxlID0gU3BNb2R1bGUuSU1NT1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5zZGspIHtcbiAgICAgIC8vIGNsZWFuIGlmIHNkayBpcyBydW5uaW5nIGFscmVhZHlcbiAgICAgIGF3YWl0IHRoaXMuYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncygpO1xuICAgIH1cbiAgICB0aGlzLnRhZ1NlcnZpY2UgPSB0YWdTZXJ2aWNlO1xuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2Uuc2V0VGFnU2VydmljZSh0YWdTZXJ2aWNlKTtcbiAgICB0aGlzLlNQTW9kdWxlID0gbW9kdWxlO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBSZXRyaWV2ZSBET00gZWxlbWVudHNcbiAgICAgIGNvbnN0IHBvaW50ZXJCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnI3ZpZXdlci1wb2ludGVyLXRyaWNrJ1xuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZXdlci1tb2R1bGUnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjdmlld2VyLW1vZHVsZSdcbiAgICAgICkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICBpZiAoIWlmcmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJzb3JCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnI2J1dHRvbidcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCB0ZXh0UGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnI3RleHQnXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLmluaXQodGhpcy5jb250YWluZXIsIHBvaW50ZXJCdG4sIGN1cnNvckJ0biwgdGV4dFBhbmVsLCB7XG4gICAgICAgIG9uTGVmdENsaWNrOiB0aGlzLnBvaW50ZXJMZWZ0Q2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXG4gICAgICAgIG9uUmlnaHRDbGljazogdGhpcy5wb2ludGVyUmlnaHRDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcbiAgICAgICAgb25NaWRkbGVDbGljazogdGhpcy5wb2ludGVyTWlkZGxlQ2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCBTREtcbiAgICAgIGNvbnN0IHNob3djYXNlV2luZG93ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3c7XG4gICAgICBpZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnNkayA9IGF3YWl0IChzaG93Y2FzZVdpbmRvdyBhcyBhbnkpLk1QX1NESy5jb25uZWN0KFxuICAgICAgICAgICAgc2hvd2Nhc2VXaW5kb3csXG4gICAgICAgICAgICB0aGlzLnNka0tleSxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkQ3VzdG9tQ3NzKCk7XG5cbiAgICAgICAgdGhpcy5wb2ludGVyU2VydmljZS5zdGFydEFkbWluQ3Vyc29yVHJhY2tlcihcbiAgICAgICAgICB0aGlzLnNkayxcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgICAoKSA9PiB0aGlzLnBvc2VNYXR0ZXJwb3J0LFxuICAgICAgICAgICgpID0+IHRoaXMucG9zZUNhbWVyYVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIExvYWQgTWF0dGVydGFnIGljb25zIGFuZCBjdXN0b20gc3Vic2NyaXB0aW9uc1xuICAgICAgICBzd2l0Y2ggKG1vZHVsZSkge1xuICAgICAgICAgIGNhc2UgU3BNb2R1bGUuSU1NTzpcbiAgICAgICAgICAgIHRoaXMuc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShcbiAgICAgICAgICAgICAgJ2ljb24tdGlja2V0JyxcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fdGlja2V0XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxuICAgICAgICAgICAgICAnaWNvbi1lcXVpcG1lbnQnLFxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9lcXVpcG1lbnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoXG4gICAgICAgICAgICAgICdpY29uLW1lYXN1cmUnLFxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9tZWFzdXJlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxuICAgICAgICAgICAgICAnaWNvbi1kYXRhJyxcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fZGF0YVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShcbiAgICAgICAgICAgICAgJ2ljb24tb2JqZWN0M2QnLFxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9vYmplY3QzZFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5zZGsuTWVhc3VyZW1lbnRzLmRhdGEuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgb25BZGRlZDogZnVuY3Rpb24gKFxuICAgICAgICAgICAgICAgIGluZGV4OiBhbnksXG4gICAgICAgICAgICAgICAgaXRlbTogeyBwb2ludHM6IGFueSB9LFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb246IGFueVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5zZXRMYXN0TWVhc3VyZShpdGVtLnBvaW50cyk7XG4gICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gKGNvbGxlY3Rpb246IGFueSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd0aGUgZW50aXJlIHVwLXRvLWRhdGUgY29sbGVjdGlvbicsIGNvbGxlY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldERpc3RhbmNlRm9yTGFzdE1lYXN1cmVtZW50KHRoaXMuc2RrLCB0aGlzLmN1cnJlbnRTcGFjZUlEKTtcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNkay5NZWFzdXJlbWVudHMubW9kZS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChtZWFzdXJlbWVudE1vZGVTdGF0ZTogeyBhY3RpdmU6IGFueSB9KSB7XG4gICAgICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnQgbW9kZSBzdGF0ZSBoYXMgY2hhbmdlZFxuICAgICAgICAgICAgICAgIHRoaXMuaXNNZWFzdXJlTW9kZU9uID0gbWVhc3VyZW1lbnRNb2RlU3RhdGUuYWN0aXZlO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdJcyBtZWFzdXJlbWVudCBtb2RlIGN1cnJlbnRseSBhY3RpdmU/ICcsIG1lYXN1cmVtZW50TW9kZVN0YXRlLmFjdGl2ZSk7XG4gICAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgU3BNb2R1bGUuTVVTRVVNOlxuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxuICAgICAgICAgICAgICAnaWNvbi1kYXRhJyxcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fZGF0YVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgU3BNb2R1bGUuSE9URUw6XG4gICAgICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoXG4gICAgICAgICAgICAgICdpY29uX3Jvb21fYXZhaWxhYmxlJyxcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcm9vbV9hdmFpbGFibGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoXG4gICAgICAgICAgICAgICdpY29uX3Jvb21fdW5hdmFpbGFibGUnLFxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9yb29tX3VuYXZhaWxhYmxlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxuICAgICAgICAgICAgICAnaWNvbl9yb29tX2Nob3NlbicsXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3Jvb21fY2hvc2VuXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxuICAgICAgICAgICAgICAnaWNvbl9yb29tX3ZpZXdlZCcsXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3Jvb21fdmlld2VkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKCdpY29uLXBvc2l0aW9uJywgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcG9zaXRpb24pXG4gICAgICAgICAgLmNhdGNoKChlOiBhbnkpID0+IHsgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ2ljb24tcG9zaXRpb24gdGV4dHVyZSByZWdpc3RyYXRpb24gZmFpbGVkJywgZSk7IH0pO1xuXG4gICAgICAgIC8vIEN1cnJlbnQgUm9vbSAodXNlZCBmb3IgZ2V0dGluZyBib3VuZGluZyBib3ggYW5kIGV2ZW50dWFsbHkgbGF6eSBsb2FkIG1hdHRlcnRhZyBvciBvYmplY3QzRCBpbnNpZGUgY3VycmVudCBSb29tKVxuICAgICAgICB0aGlzLnNkay5Sb29tLmN1cnJlbnQuc3Vic2NyaWJlKChjdXJyZW50Um9vbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJvb21zID0gQXJyYXkuaXNBcnJheShjdXJyZW50Um9vbSkgPyBjdXJyZW50Um9vbSA6IChjdXJyZW50Um9vbSA/IFtjdXJyZW50Um9vbV0gOiBbXSk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50Um9vbXMgPSByb29tcztcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm9uUm9vbUNoYW5nZWQubmV4dChyb29tcyk7XG4gICAgICAgICAgLy8gUmVmcmVzaCB0YWcgdmlzaWJpbGl0eSB3aGVuZXZlciB0aGUgcm9vbSBjb250ZXh0IGNoYW5nZXNcbiAgICAgICAgICB0aGlzLnJlZnJlc2hUYWdzVmlzaWJpbGl0eSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyAzRCBwb3NpdGlvbidzIHBvaW50ZXJcbiAgICAgICAgdGhpcy5zZGsuUG9pbnRlci5pbnRlcnNlY3Rpb24uc3Vic2NyaWJlKFxuICAgICAgICAgIGZ1bmN0aW9uIChpbnRlcnNlY3Rpb246IGFueSkge1xuICAgICAgICAgICAgdGhpcy5wb3NlTWF0dGVycG9ydCA9IGludGVyc2VjdGlvbjtcbiAgICAgICAgICAgIHRoaXMucG9zZU1hdHRlcnBvcnQudGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9sZFBvc2VNYXR0ZXJwb3J0UG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5vbGRQb3NlTWF0dGVycG9ydFBvc2l0aW9uID0ge1xuICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICB6OiAwLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGlvbk1vZGUgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUICYmIHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHtcbiAgICAgICAgICAgICAgLy8gZm9sbG93IHRoZSBwb2ludGVyIGFuZCBjaGFuZ2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCB0YWdcbiAgICAgICAgICAgICAgLy8gKHdlIGFyZSBhYm91dCB0byB2YWxpZGF0ZSwgYnV0IGl0IGV4aXN0cyBpbiBzZGsgYWxyZWFkeSlcbiAgICAgICAgICAgICAgdGhpcy5lbmFibGVfZm9sbG93aW5nX3RhZyh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucG9pbnRlclNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5wb2ludGVyU2VydmljZS5zZXRDdXJzb3JQb3NpdGlvbkJ1dHRvbkRpc3BsYXllZChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9DYW1lcmEgbW9kZVxuICAgICAgICB0aGlzLnNkay5Nb2RlLmN1cnJlbnQuc3Vic2NyaWJlKChtb2RlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY2FtZXJhTW9kZSAhPT0gbW9kZSkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5zZXRDYW1lcmFNb2RlKG1vZGUpO1xuICAgICAgICAgICAgLy8gUmVmcmVzaCB0YWcgdmlzaWJpbGl0eSBvbiBldmVyeSBtb2RlIGNoYW5nZSAoSU5TSURFIHZzIERPTExIT1VTRSB2cyBGTE9PUlBMQU4pXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUYWdzVmlzaWJpbGl0eSgpO1xuICAgICAgICAgICAgdGhpcy5jYW1lcmFNb2RlID0gbW9kZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnNkayAmJiB0aGlzLnBvc2VDYW1lcmEpIHtcbiAgICAgICAgICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxuICAgICAgICAgICAgICB0aGlzLnNkayxcbiAgICAgICAgICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudENhbWVyYU1vZGUsXG4gICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3csXG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UsXG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIHN3ZWVwc1xuICAgICAgICB0aGlzLnNkay5Td2VlcC5kYXRhLnN1YnNjcmliZSh7XG4gICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gc3Vic2NyKGNvbGxlY3Rpb246IHt9KSB7XG4gICAgICAgICAgICB0aGlzLnN3ZWVwcyA9IE9iamVjdC5rZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICAgICAgICAgICAgLy8gUmVidWlsZCBzaWQg4oaUIHV1aWQgbWFwcyB3aGVuZXZlciB0aGUgY29sbGVjdGlvbiB1cGRhdGVzXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmJ1aWxkU3dlZXBJZE1hcHMoY29sbGVjdGlvbik7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBzdWJzY3JpYmUgdG8gY3VycmVudCBzd2VlcCDigJMgZW1pdCB1dWlkIChEQiBmb3JtYXQpIGluc3RlYWQgb2YgcmF3IHNpZFxuICAgICAgICB0aGlzLnNkay5Td2VlcC5jdXJyZW50LnN1YnNjcmliZShcbiAgICAgICAgICBmdW5jdGlvbiBzdWJzY3IoY3VycmVudFN3ZWVwOiB7IHNpZDogc3RyaW5nIH0pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50U3dlZXAuc2lkID09PSAnJykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgdXVpZCA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZChjdXJyZW50U3dlZXAuc2lkKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN3ZWVwLm5leHQodXVpZCk7XG4gICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIEZsb29yIGRhdGFcbiAgICAgICAgdGhpcy5zZGsuRmxvb3IuZGF0YS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG9uQ29sbGVjdGlvblVwZGF0ZWQ6IGZ1bmN0aW9uIHVwZCh0aGlzOiBhbnksIGNvbGxlY3Rpb246IGFueSkge1xuICAgICAgICAgICAgdGhpcy5mbG9vcnMgPSBPYmplY3QudmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGN1cnJlbnQgZmxvb3Ig4oCTIGF1dGhvcml0YXRpdmUgc291cmNlIGZvciBtdWx0aS1mbG9vciBmaWx0ZXJpbmdcbiAgICAgICAgdGhpcy5zZGsuRmxvb3IuY3VycmVudC5zdWJzY3JpYmUoKGN1cnJlbnRGbG9vcjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VxID0gY3VycmVudEZsb29yPy5zZXF1ZW5jZSA/PyBudWxsO1xuICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UgPSBzZXE7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0Zsb29yLmN1cnJlbnRdIHNlcXVlbmNlID0nLCBzZXEsICd8IGZ1bGwgPScsIGN1cnJlbnRGbG9vcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEdlbmVyaWMgaGFuZGxlciBmb3IgdGFnIHNlbGVjdGlvbiBldmVudHNcbiAgICAgICAgY29uc3QgaGFuZGxlVGFnU2VsZWN0aW9uID0gYXN5bmMgKHNpZDogc3RyaW5nLCBzb3VyY2U6IHN0cmluZywgZXZ0PzogYW55KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQoc2lkKTtcbiAgICAgICAgICAgIGlmICghbWF0dGVydGFnRGF0YSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgdXJsID0gdGFnU2VydmljZS5nZXRVcmxGb3JTZWVEZXRhaWxzKFxuICAgICAgICAgICAgICBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLFxuICAgICAgICAgICAgICBtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh1cmwgIT09ICcnKSB7XG4gICAgICAgICAgICAgIHRoaXMudmlzaWJpbGl0eVNlcnZpY2UuZGV0YWlsU2hvd2luZy5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdDYW5ub3Qgc2hvdyBkZXRhaWxzIGZvciB0YWcnLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERpc2FibGUgbmF0aXZlIE1hdHRlcnBvcnQgYWN0aW9uc1xuICAgICAgICBjb25zdCBkaXNhYmxlTmF0aXZlQWN0aW9ucyA9IChzaWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5zZGsgfHwgc2lkID09PSB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSByZXR1cm47IC8vIGlnbm9yZSB3aGVuIHdlIGFyZSBpbiBwb3NpdGlvbmluZyBtb2RlXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCBzaWQpO1xuICAgICAgICAgICAgaWYgKHRhZ01vZHVsZT8uYWxsb3dBY3Rpb24pIHtcbiAgICAgICAgICAgICAgdGFnTW9kdWxlLmFsbG93QWN0aW9uKHNpZCwgeyBvcGVuaW5nOiB0cnVlLCBuYXZpZ2F0aW5nOiB0cnVlLCBkb2NraW5nOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIC8vIHNpbGVudGx5IGlnbm9yZSBhbHJlYWR5IHJlbW92ZWQgdGFnc1xuICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmICFlPy5tZXNzYWdlPy5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNYXR0ZXJwb3J0U2VydmljZTogRXJyb3IgZGlzYWJsaW5nIGFjdGlvbnMgZm9yJywgc2lkLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHJlYWNoIFBMQVlJTkcgcGhhc2VcbiAgICAgICAgaWYgKHRoaXMuc2RrLkFwcCAmJiB0aGlzLnNkay5BcHAuc3RhdGUpIHtcbiAgICAgICAgICB0aGlzLnNkay5BcHAuc3RhdGUud2FpdFVudGlsKChzOiBhbnkpID0+IHMucGhhc2UgPT09IHRoaXMuc2RrLkFwcC5QaGFzZS5QTEFZSU5HKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29tbW9uIGxheWVyIGhvbGRpbmcgZXZlcnkgdGFnIGJlZm9yZSBhbnkgdGFnIGlzIGFkZGVkLCBzbyB0aGF0XG4gICAgICAgICAgICAvLyB0YWdzIGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgZnVybmlzaGVkIGFuZCB0aGUgZGVmdXJuaXNoZWQgdmlld3MuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmVuc3VyZVNoYXJlZFRhZ0xheWVyKHRoaXMuc2RrKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdFZpZXdzKCk7XG5cbiAgICAgICAgICAgIHRoaXMuc2RrLkNhbWVyYS5wb3NlLnN1YnNjcmliZSgocG9zZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucG9zZUNhbWVyYSA9IHBvc2U7XG4gICAgICAgICAgICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxuICAgICAgICAgICAgICAgIHRoaXMuc2RrLFxuICAgICAgICAgICAgICAgIHRoaXMuc3dlZXBDb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudENhbWVyYU1vZGUsXG4gICAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyxcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlLFxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxuICAgICAgICAgICAgICAgIHRoaXMuc2RrLFxuICAgICAgICAgICAgICAgIHRoaXMuc3dlZXBDb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudENhbWVyYU1vZGUsXG4gICAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyxcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlLFxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LCAxNTAwKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJhY3Rpb25Nb2RlID09PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCkge1xuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KHRoaXMuc2RrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuc2RrLlRhZyAmJiB0aGlzLnNkay5UYWcuZGF0YSkge1xuICAgICAgICAgICAgICB0aGlzLnNkay5UYWcuZGF0YS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG9uQWRkZWQ6IChzaWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgZGlzYWJsZU5hdGl2ZUFjdGlvbnMoc2lkKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uVXBkYXRlZDogKHNpZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlTmF0aXZlQWN0aW9ucyhzaWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogKGNvbGxlY3Rpb246IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29sbGVjdGlvbikuZm9yRWFjaCgoc2lkKSA9PiBkaXNhYmxlTmF0aXZlQWN0aW9ucyhzaWQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbGJhY2sgcG91ciBsJ8OpdsOpbmVtZW50IGdsb2JhbCB0YWcuY2xpY2tcbiAgICAgICAgdGhpcy5zZGsub24oJ3RhZy5jbGljaycsIChzaWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNYXR0ZXJwb3J0U2VydmljZV0gc2RrLm9uKCd0YWcuY2xpY2snKSByZWNlaXZlZCBmb3Igc2lkOiAke3NpZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFuZGxlVGFnU2VsZWN0aW9uKHNpZCwgJ2dsb2JhbC50YWcuY2xpY2snKTtcbiAgICAgICAgICBkaXNhYmxlTmF0aXZlQWN0aW9ucyhzaWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gUG9pbnRlciB0cmlja1xuICAgICAgICAvLyBDcmVhdGUgYSBkaXYgdGhhdCB3aWxsIGFwcGVhciB3aGVuIHRoZSBjdXJzb3IgaXMgc3RpbGxcbiAgICAgICAgLy8gSXQgd2lsbCBpbnRlcmNlcHQgdGhlIGNsaWNrIG9mIHRoZSBtb3VzZSBiZWZvcmUgaXQgdHJpZ2VycmluZyB0aGUgTWF0dGVycG9ydCdzIHRvdXIgbmF2aWdhdGlvblxuICAgICAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLnN0YXJ0UG9pbnRlclRyaWNrKFxuICAgICAgICAgIHRoaXMuc2RrLFxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLFxuICAgICAgICAgICgpID0+IHRoaXMucG9zZU1hdHRlcnBvcnQsXG4gICAgICAgICAgKCkgPT4gdGhpcy5wb3NlQ2FtZXJhLFxuICAgICAgICAgICgpID0+IHRoaXMuaW50ZXJhY3Rpb25Nb2RlLFxuICAgICAgICAgICgpID0+IHRoaXMubWF0dGVydGFnVG9Gb2xsb3dcbiAgICAgICAgKTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUcmFuc2l0aW9uc1xuICAgICAgICAqL1xuICAgICAgICB0aGlzLnNkay5vbihcbiAgICAgICAgICAndmlld21vZGUuY2hhbmdlc3RhcnQnLFxuICAgICAgICAgIGZ1bmN0aW9uICh0bywgZnJvbSkge1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnU3RhcnRpbmcgdG8gbW92ZSB0byAnICsgdG8gKyAnIGZyb20gJyArIGZyb20pO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Nb2RlID0gdHJ1ZTtcbiAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZGsub24oXG4gICAgICAgICAgJ3ZpZXdtb2RlLmNoYW5nZWVuZCcsXG4gICAgICAgICAgZnVuY3Rpb24gKG9sZE1vZGUsIG5ld01vZGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0VuZGVkIHRvIG1vdmUgdG8gJyArIG5ld01vZGUgKyAnIGZyb20gJyArIG9sZE1vZGUpO1xuICAgICAgICAgICAgaWYgKG5ld01vZGUgIT09ICdtb2RlLnRyYW5zaXRpb25pbmcnKSB7XG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uTW9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNkay5vbihcbiAgICAgICAgICB0aGlzLnNkay5Td2VlcC5FdmVudC5FTlRFUixcbiAgICAgICAgICBmdW5jdGlvbiAob2xkU3dlZXAsIG5ld1N3ZWVwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdMZWF2aW5nIHN3ZWVwICcgKyBvbGRTd2VlcCk7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdFbnRlcmluZyBzd2VlcCAnICsgbmV3U3dlZXApO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Td2VlcCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5QXppbXV0YWxDcm93bigpO1xuICAgICAgICAgICAgLy8gUmVmcmVzaCBvbiBzd2VlcCBpcyByZW1vdmVkIGJlY2F1c2Ugd2Ugb25seSB1cGRhdGUgb24gcm9vbSBvciBmbG9vciBjaGFuZ2VzIG5vdy5cbiAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZGsub24oXG4gICAgICAgICAgdGhpcy5zZGsuU3dlZXAuRXZlbnQuRVhJVCxcbiAgICAgICAgICBmdW5jdGlvbiAoZnJvbVN3ZWVwLCB0b1N3ZWVwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdMZWF2aW5nIHN3ZWVwICcgKyBmcm9tU3dlZXApO1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnVHJhbnNpdGlvbmluZyB0byBzd2VlcCAnICsgdG9Td2VlcCk7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvblN3ZWVwID0gdHJ1ZTtcbiAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0M0RPYmplY3RWaWV3ZXIoKTtcblxuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIG5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQoKSBpbnN0ZWFkLlxuICAgKiBLZXB0IHRlbXBvcmFyaWx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICovXG4gIGdldFN3ZWVwVVVJREZvclNpZChzaWQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQoc2lkKSAhPT0gc2lkXG4gICAgICA/IHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZChzaWQpXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBzZXRMaWdodGluZ09mZigpIHtcbiAgICB0aGlzLm5vTGlnaHRGb3JPYmplY3RzID0gdHJ1ZTtcbiAgfVxuXG4gIGdldERpc3RhbmNlRm9yTGFzdE1lYXN1cmVtZW50KCkge1xuICAgIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldERpc3RhbmNlRm9yTGFzdE1lYXN1cmVtZW50KHRoaXMuc2RrLCB0aGlzLmN1cnJlbnRTcGFjZUlEKTtcbiAgfVxuXG4gIGdldExhc3REaXN0YW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldExhc3REaXN0YW5jZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBzY3JlZW5zaG90IGFuZCBzYXZlcyBiYXNlNjQgaW4gbGFzdFNjcmVlbnNob3RVcmlcbiAgICogQHJldHVybnMgUHJvbWlzZVxuICAgKi9cbiAgdGFrZVNjcmVlblNob3QoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UudGFrZVNjcmVlblNob3QodGhpcy5zZGspO1xuICB9XG5cbiAgZ2V0U2NyZWVuU2hvdFVyaSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0U2NyZWVuU2hvdFVyaSgpO1xuICB9XG5cbiAgZ2V0TGFzdE1lYXN1cmVtZW50KCk6IE9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldExhc3RNZWFzdXJlbWVudCh0aGlzLnBvc2VDYW1lcmEpO1xuICB9XG5cbiAgLy9cbiAgLy8gLS0tLS0tLS0tLSBVdGlscyAtLS0tLS0tLS0tXG4gIC8vXG4gIHByaXZhdGUgZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhLCB0aGlzLnN3ZWVwQ29sbGVjdGlvbik7XG4gIH1cbiAgLyoqXG4gICAqIFN0eWxpbmcgb2YgcG9pbnRlclxuICAgKi9cbiAgdXBkYXRlUG9pbnRlclRyaWNrKCkge1xuICAgIHRoaXMucG9pbnRlclNlcnZpY2UudXBkYXRlUG9pbnRlclRyaWNrKHRoaXMuc2RrLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5wb3NlTWF0dGVycG9ydCwgdGhpcy5wb3NlQ2FtZXJhLCB0aGlzLmludGVyYWN0aW9uTW9kZSwgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSB0YWcgdmlzaWJpbGl0eSByZWZyZXNoIGJhc2VkIG9uIGN1cnJlbnQgY2FtZXJhIG1vZGUsIGZsb29yIGFuZCBzd2VlcC5cbiAgICogRGVsZWdhdGVzIGFsbCBsb2dpYyB0byBNYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoKS5cbiAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgb24gTW9kZSwgU3dlZXAsIEZsb29yIGFuZCBSb29tIGNoYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpICYmIHRoaXMuc3dlZXBDb2xsZWN0aW9uICYmIHRoaXMucG9zZUNhbWVyYT8uc3dlZXApIHtcbiAgICAgICAgY29uc3Qgc3dlZXBEYXRhID0gdGhpcy5zd2VlcENvbGxlY3Rpb25bdGhpcy5wb3NlQ2FtZXJhLnN3ZWVwXTtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW3JlZnJlc2hUYWdzVmlzaWJpbGl0eV0gc3dlZXBEYXRhIGZvciBjdXJyZW50IHN3ZWVwOicsIEpTT04uc3RyaW5naWZ5KHN3ZWVwRGF0YSkpO1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbcmVmcmVzaFRhZ3NWaXNpYmlsaXR5XSBjdXJyZW50Rmxvb3JTZXF1ZW5jZTonLCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlKTtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW3JlZnJlc2hUYWdzVmlzaWJpbGl0eV0gY3VycmVudENhbWVyYU1vZGU6JywgdGhpcy5jdXJyZW50Q2FtZXJhTW9kZSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZVRhZ3NWaXNpYmlsaXR5Rm9yQ29udGV4dChcbiAgICAgICAgdGhpcy5zZGssXG4gICAgICAgIHRoaXMuc3dlZXBDb2xsZWN0aW9uLFxuICAgICAgICB0aGlzLmN1cnJlbnRDYW1lcmFNb2RlLFxuICAgICAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LFxuICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlLFxuICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRSb29tc1xuICAgICAgKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSByZWZyZXNoVGFnc1Zpc2liaWxpdHkgZXJyb3InLCBlcnIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhbHRpbWUgbWF0dGVydGFnIGZvbGxvd2luZyB0aGUgY3Vyc29yXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWcgc3RyaW5nXG4gICAqL1xuICBlbmFibGVfZm9sbG93aW5nX3RhZyhtYXR0ZXJ0YWc6IHN0cmluZykge1xuICAgIGNvbnN0IE9GRlNFVCA9IDAuMDAwMTsgLy8gcXVhc2ktaW52aXNpYmxlIG1haXMgc3VmZml0IMOgIMOpdml0ZXIgbCdpbnRlcmNlcHRpb25cbiAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldFRhZ01vZHVsZSh0aGlzLnNkaywgbWF0dGVydGFnKS5lZGl0UG9zaXRpb24obWF0dGVydGFnLCB7XG4gICAgICBhbmNob3JQb3NpdGlvbjoge1xuICAgICAgICB4OiB0aGlzLnBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uLnggKyBPRkZTRVQsXG4gICAgICAgIHk6IHRoaXMucG9zZU1hdHRlcnBvcnQucG9zaXRpb24ueSxcbiAgICAgICAgejogdGhpcy5wb3NlTWF0dGVycG9ydC5wb3NpdGlvbi56ICsgT0ZGU0VULFxuICAgICAgfSxcbiAgICAgIHN0ZW1WZWN0b3I6IHtcbiAgICAgICAgeDogdGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWwueCAqIDAuMyxcbiAgICAgICAgeTogdGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWwueSAqIDAuMyxcbiAgICAgICAgejogdGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWwueiAqIDAuMyxcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRpc3RhbmNlIGJldHd3ZWVuIHR3byAzRCBwb3NpdGlvbnNcbiAgICogVXNlZCBpbiBvcmRlciB0byBzZWUgaG93IG11Y2ggdGhlIGN1cnNvciBoYXMgbW92ZWQgZnJvbSB0aGUgcHJldmlvdXMgcG9zaXRpb25cbiAgICogQHBhcmFtIHBvczFcbiAgICogQHBhcmFtIHBvczJcbiAgICovXG4gIGdldERpc3RQb3NpdGlvbihwb3MxOiBhbnksIHBvczI6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnBvaW50ZXJTZXJ2aWNlLmdldERpc3RQb3NpdGlvbih0aGlzLnNkaywgdGhpcy5jb250YWluZXIsIHRoaXMucG9zZUNhbWVyYSwgcG9zMSwgcG9zMik7XG4gIH1cblxuICAvL1xuICAvLyAtLS0tLS0tLS0tIE1hdHRlcnRhZyByZWxhdGVkIC0tLS0tLS0tLS1cbiAgLy9cbiAgLyoqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgTWF0dGVydGFnIHRoYXQgZm9sbG93cyB0aGUgdXNlcidzIGN1cnNvciBmb3IgcG9zaXRpb25pbmcuICovXG4gIGFzeW5jIGFkZEN1cnNvck1hdHRlcnRhZyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhKSB7XG4gICAgaWYgKCF0aGlzLnBvc2VNYXR0ZXJwb3J0ICYmIHRoaXMucG9zZUNhbWVyYSkge1xuICAgICAgdGhpcy5wb3NlTWF0dGVycG9ydCA9IHtcbiAgICAgICAgcG9zaXRpb246IHsgLi4udGhpcy5wb3NlQ2FtZXJhLnBvc2l0aW9uIH0sXG4gICAgICAgIG5vcm1hbDogeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9LFxuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBvc2VNYXR0ZXJwb3J0KSB7XG4gICAgICAvLyBCb3RoIHBvc2VzIGNvbWUgZnJvbSBTREsgc3Vic2NyaXB0aW9ucyB0aGF0IG9ubHkgc3RhcnQgb25jZSB0aGUgYXBwIHJlYWNoZXMgUExBWUlORywgc28gYW5cbiAgICAgIC8vIGVhcmx5IGNsaWNrIGxhbmRzIGhlcmUuIFRoZSBjYWxsZXIgYWxyZWFkeSBzd2l0Y2hlZCB0byBBRERJTkcsIGFuZCBsZWF2aW5nIGl0IHRoZXJlIGxvY2tzXG4gICAgICAvLyB0aGUgdmlld2VyIG91dCBvZiBpdHMgb3duIGd1YXJkIC0gZXZlcnkgbGF0ZXIgY2xpY2sgaXMgc2tpcHBlZCBiZWZvcmUgcmVhY2hpbmcgYW55IGNvZGUsXG4gICAgICAvLyB3aGljaCByZWFkcyBhcyBhIHBlcm1hbmVudGx5IGRlYWQgYnV0dG9uIHJhdGhlciB0aGFuIG9uZSBmYWlsZWQgYXR0ZW1wdC5cbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ2FkZEN1cnNvck1hdHRlcnRhZzogbm8gcG9pbnRlciBvciBjYW1lcmEgcG9zZSB5ZXQgLSB0aGUgTWF0dGVycG9ydCBTREsgaGFzIG5vdCByZWFjaGVkICcgK1xuICAgICAgICAgICdQTEFZSU5HLCBzbyB0aGVyZSBpcyBub3doZXJlIHRvIGFuY2hvciB0aGUgdGFnLiBXYWl0IGZvciB0aGUgbW9kZWwgdG8gZmluaXNoIGxvYWRpbmcuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0SW50ZXJhY3Rpb25Nb2RlKFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gYXdhaXQgdGhpcy5hZGRNYXR0ZXJ0YWdUb1ZpZXdlcihtYXR0ZXJ0YWdEYXRhKTtcblxuICAgIGlmICghdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ2FkZEN1cnNvck1hdHRlcnRhZzogdGFnIGNyZWF0aW9uIGZhaWxlZCwgbWF0dGVydGFnVG9Gb2xsb3cgaXMgbnVsbCcpO1xuICAgICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHdhaXQoNTApO1xuICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRJY29uKHRoaXMubWF0dGVydGFnVG9Gb2xsb3csICdpY29uLXBvc2l0aW9uJyk7XG4gICAgICBhd2FpdCB0YWdNb2R1bGUuZWRpdE9wYWNpdHkodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywgMSk7XG4gICAgICBhd2FpdCB0YWdNb2R1bGUuZWRpdFBvc2l0aW9uKHRoaXMubWF0dGVydGFnVG9Gb2xsb3csIHtcbiAgICAgICAgYW5jaG9yUG9zaXRpb246IHsgLi4udGhpcy5wb3NlTWF0dGVycG9ydC5wb3NpdGlvbiB9LFxuICAgICAgICBzdGVtVmVjdG9yOiB7XG4gICAgICAgICAgeDogKHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsPy54ID8/IDApICogMC4zLFxuICAgICAgICAgIHk6ICh0aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbD8ueSA/PyAtMC4xNSkgKiAwLjMsXG4gICAgICAgICAgejogKHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsPy56ID8/IDApICogMC4zLFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRhZ01vZHVsZS5hbGxvd0FjdGlvbih0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LCB7XG4gICAgICAgIG9wZW5pbmc6IHRydWUsIG5hdmlnYXRpbmc6IGZhbHNlLCBkb2NraW5nOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ2FkZEN1cnNvck1hdHRlcnRhZzogZXJyb3IgY29uZmlndXJpbmcgY3Vyc29yIHRhZycsIGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFnQWRkUXVldWUoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS50YWdBZGRRdWV1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdGFnQWRkUXVldWUodmFsdWU6IFByb21pc2U8YW55Pikge1xuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudGFnQWRkUXVldWUgPSB2YWx1ZTtcbiAgfVxuXG4gIGFzeW5jIGFkZE1hdHRlcnRhZ1RvVmlld2VyKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5hZGRNYXR0ZXJ0YWdUb1ZpZXdlcih0aGlzLnNkaywgbWF0dGVydGFnRGF0YSk7XG4gIH1cblxuICAvKiogVHJpZ2dlcnMgY2FsbGJhY2sgYWN0aW9ucyBhZnRlciBhIHRhZydzIHBvc2l0aW9uIGlzIHZhbGlkYXRlZCBieSBhIGxlZnQgY2xpY2suICovXG4gIG9uVmFsaWRhdGVkTWF0dGVydGFnKCkge1xuICAgIHRoaXMuc2V0SW50ZXJhY3Rpb25Nb2RlKFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKTtcbiAgICBjb25zdCBsYXN0VGFnID0gdGhpcy5nZXRMYXN0VGFnKCk7XG4gICAgaWYgKGxhc3RUYWcpIHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrTW9kZSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzXG4gICAgICAgIC5nZXQobGFzdFRhZylcbiAgICAgICAgLmdldENhbGxiYWNrQWN0aW9uTW9kZSgpO1xuICAgICAgdGhpcy5jYWxsYmFja0FmdGVyTWF0dGVydGFnVmFsaWRhdGlvbihjYWxsYmFja01vZGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWdpc3RlcnMgYSBuZXcgaWNvbiB0ZXh0dXJlIGFuZCBhcHBsaWVzIGl0IHRvIGEgc3BlY2lmaWMgTWF0dGVydGFnLiAqL1xuICBhc3luYyBhZGROZXdJY29uQW5kU2V0Rm9yVGFnKG1hdHRlcnRhZ0lEOiBzdHJpbmcsIGljb25QYXRoOiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmFkZE5ld0ljb25BbmRTZXRGb3JUYWcoXG4gICAgICB0aGlzLnNkayxcbiAgICAgIG1hdHRlcnRhZ0lELFxuICAgICAgaWNvblBhdGgsXG4gICAgICBmYWxzZSxcbiAgICAgIDFcbiAgICApO1xuICB9XG5cbiAgLyoqIEFwcGxpZXMgYSBwcmUtcmVnaXN0ZXJlZCBpY29uIHRvIGEgTWF0dGVydGFnLiAqL1xuICBhc3luYyBzZXRSZWdpc3RyZWRJY29uRm9yVGFnKG1hdHRlcnRhZ0lEOiBzdHJpbmcsIGljb25OYW1lOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRUYWdNb2R1bGUodGhpcy5zZGssIG1hdHRlcnRhZ0lEKS5lZGl0SWNvbihtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZWRpdCBpY29uJywgaWNvbk5hbWUsIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBhcHByb3ByaWF0ZSBpY29uIGFuZCBvcGFjaXR5IGZvciBhIHRhZyBiYXNlZCBvbiBpdHMgdHlwZSBhbmQgUE9JIG1ldGFkYXRhLiAqL1xuICBhc3luYyBzZXRUYWdJY29uQW5kT3BhY2l0eShcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGFcbiAgKSB7XG4gICAgaWYgKHRoaXMuU1BNb2R1bGUgPT09IFNwTW9kdWxlLkhPVEVMKSB7XG4gICAgICBjb25zdCByb29tID0gbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKTtcbiAgICAgIGxldCBpY29uTmFtZSA9IGBpY29uX3Jvb21gO1xuICAgICAgaWYgKHJvb20uYXZhaWxhYmxlKSB7XG4gICAgICAgIGljb25OYW1lID0gYCR7aWNvbk5hbWV9X2F2YWlsYWJsZWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpY29uTmFtZSA9IGAke2ljb25OYW1lfV91bmF2YWlsYWJsZWA7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmVkaXRUYWdJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0cmluZ1RhZ1R5cGUgPSBwb2lUeXBlVG9TdHJpbmcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCkpO1xuICAgIGxldCBvcGFjaXR5ID0gdGhpcy5jb25maWcubXlfY29uZmlnLkRFRkFVTFRfT1BBQ0lUWV9UQUc7XG4gICAgbGV0IGljb25OYW1lID0gYGljb24tJHtzdHJpbmdUYWdUeXBlfWA7XG4gICAgY29uc3QgcG9pID0gbWF0dGVydGFnRGF0YS5nZXRQb2koKTtcbiAgICBpZiAocG9pICYmIHBvaS50YWdJY29uKSB7XG4gICAgICBjb25zdCB0YWdJY29uID0gSlNPTi5wYXJzZShwb2kudGFnSWNvbik7XG4gICAgICBpZiAobWF0dGVydGFnRGF0YS5nZXRUeXBlKCkgPT09IFBvaVR5cGUuREFUQSkge1xuICAgICAgICBjb25zdCBmZWF0dXJlID0gbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKTtcbiAgICAgICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gRmVhdHVyZVR5cGUuSU5ESUNBVE9SX1RFTVApIHtcbiAgICAgICAgICB0YWdJY29uLnNyYyA9IHRoaXMudGFnU2VydmljZS5nZXRJY29uVGFnSW1hZ2VGb3JGZWF0dXJlKGZlYXR1cmUsIHBvaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0YWdJY29uLnNyYykge1xuICAgICAgICBjb25zdCBwYXRoU2lnbmVkID0gYXdhaXQgdGhpcy50YWdTZXJ2aWNlLmdldFNpZ25lZFRhZ0ljb25Tb3VyY2UoXG4gICAgICAgICAgdGFnSWNvbi5zcmNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBhdGhTaWduZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWNvbk5hbWUgPSBgaWNvbi0ke3N0cmluZ1RhZ1R5cGV9LSR7bWF0dGVydGFnSUR9LSR7bWF0dGVydGFnRGF0YS5jdXN0b21JY29uSW5kZXh9YDtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShpY29uTmFtZSwgcGF0aFNpZ25lZCk7XG4gICAgICAgICAgICBtYXR0ZXJ0YWdEYXRhLmN1c3RvbUljb25JbmRleCArPSAxO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHJlZ2lzdGVySWNvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRhZ0ljb24ub3BhY2l0eSkge1xuICAgICAgICBvcGFjaXR5ID0gdGFnSWNvbi5vcGFjaXR5O1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLmVkaXRUYWdJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhbiBpY29uIHRvIGEgdGFnLiBUaGUgY2FsbCBpcyBhd2FpdGVkIGFuZCBpdHMgcmVqZWN0aW9uIHJlcG9ydGVkOiBhXG4gICAqIHNpbGVudGx5IGRyb3BwZWQgcHJvbWlzZSBoZXJlIGxlYXZlcyB0aGUgcGluIHdpdGggaXRzIGRlZmF1bHQgd2hpdGUgbG9vay5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZWRpdFRhZ0ljb24obWF0dGVydGFnSUQ6IHN0cmluZywgaWNvbk5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldFRhZ01vZHVsZSh0aGlzLnNkaywgbWF0dGVydGFnSUQpLmVkaXRJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIGVkaXRJY29uIGZhaWxlZCBmb3InLCBtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKiogTmF2aWdhdGVzIHRoZSBjYW1lcmEgdG8gdGhlIG1vc3QgcmVjZW50bHkgY3JlYXRlZCB0YWcuICovXG4gIGFzeW5jIGdvVG9MYXN0VGFnKCkge1xuICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ29Ub0xhc3RUYWcodGhpcy5zZGspO1xuICB9XG5cbiAgLyoqIE5hdmlnYXRlcyB0aGUgY2FtZXJhIHRvIGEgc3BlY2lmaWMgTWF0dGVydGFnIGJ5IGl0cyBJRC4gKi9cbiAgYXN5bmMgZ29Ub1RhZyhtYXR0ZXJ0YWdJRDogc3RyaW5nKSB7XG4gICAgaWYgKCFtYXR0ZXJ0YWdJRC8qIHx8IHRoaXMuaW5UcmFuc2l0aW9uU3dlZXAqLykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkdvVG9UYWcubmV4dChtYXR0ZXJ0YWdJRCk7XG4gICAgICBhd2FpdCB0aGlzLnNkay5Td2VlcC5jdXJyZW50LndhaXRVbnRpbChcbiAgICAgICAgKGN1cnJlbnRTd2VlcCkgPT4gY3VycmVudFN3ZWVwICE9PSAnJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IG10RGF0YSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCk7XG4gICAgICBpZiAobXREYXRhKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gbXREYXRhLmdldFBvc2l0aW9uKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2RrLkNhbWVyYS5sb29rQXQocG9zaXRpb24sIHtcbiAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnNkay5DYW1lcmEuVHJhbnNpdGlvblR5cGUuRkxZXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gYG9wZW5gIG9ubHkgZXhpc3RzIG9uIHRoZSBnbG9iYWwgVGFnIG1vZHVsZSwgbmV2ZXIgb24gYSBsYXllci1zY29wZWQgb25lLlxuICAgICAgYXdhaXQgdGhpcy5zZGsuVGFnLm9wZW4obWF0dGVydGFnSUQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IG5hdmlnYXRlIHRvIHRhZycsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgdmlld2VyIGNhbWVyYSB0byBhIHNwZWNpZmljIDNEIHBvc2l0aW9uIGFuZCBhcHBseSBhIHJvdGF0aW9uLlxuICAgKiBEZWxlZ2F0ZXMgdGhlIGhlYXZ5IGxpZnRpbmcgdG8gTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlLm1vdmVfdG9fcG9zaXRpb24uXG4gICAqIC0gcG9zaXRpb246IHsgeCwgeSwgeiB9XG4gICAqIC0gcm90YXRpb246IHsgeWF3LCBwaXRjaD8sIHJvbGw/IH0gaW4gZGVncmVlcyBieSBkZWZhdWx0XG4gICAqIC0gb3B0aW9uczogb3B0aW9uYWwgdHJhbnNpdGlvbiBhbmQgY29udmVyc2lvbiBzZXR0aW5ncyAoc2VlIG5hdmlnYXRpb24gc2VydmljZSlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnb1RvUG9zaXRpb24oXG4gICAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9LFxuICAgIHJvdGF0aW9uOiB7IHlhdzogbnVtYmVyOyBwaXRjaD86IG51bWJlcjsgcm9sbD86IG51bWJlciB9IHwgbnVsbCA9IG51bGwsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHRyYW5zaXRpb24/OiAnRkxZJyB8ICdJTlNUQU5UJyB8ICdJTU1FRElBVEUnO1xuICAgICAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgICAgIGFuZ2xlc0luRGVncmVlcz86IGJvb2xlYW47XG4gICAgICBvZmZzZXQ/OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbiAgICB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEVuc3VyZSBTREsgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAoIXRoaXMuc2RrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHRlcnBvcnQgU0RLIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgY29uY3VycmVudCBuYXZpZ2F0aW9uIGlmIGFscmVhZHkgaW4gYSBzd2VlcC9tb2RlIHRyYW5zaXRpb25cbiAgICBpZiAodGhpcy5pblRyYW5zaXRpb25Nb2RlIHx8IHRoaXMuaW5UcmFuc2l0aW9uU3dlZXApIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS5kZWJ1ZygnZ29Ub1Bvc2l0aW9uIGFib3J0ZWQ6IHZpZXdlciBpcyBpbiB0cmFuc2l0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIE1hcmsgdHJhbnNpdGlvbiBzdGF0ZSBvbiBuYXZpZ2F0aW9uIHNlcnZpY2UgKG1vdmVfdG9fcG9zaXRpb24gd2lsbCBhbHNvIG1hbmFnZSBmbGFncylcbiAgICAgIHRoaXMuaW5UcmFuc2l0aW9uTW9kZSA9IHRydWU7XG5cbiAgICAgIC8vIERlbGVnYXRlIHRvIG5hdmlnYXRpb24gc2VydmljZSB3aGljaCBjb250YWlucyB0aGUgcm9idXN0IG1vdmVfdG9fcG9zaXRpb24gaW1wbGVtZW50YXRpb25cbiAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UubW92ZV90b19wb3NpdGlvbih0aGlzLnNkaywgcG9zaXRpb24sIHJvdGF0aW9uLCBvcHRpb25zKTtcblxuICAgICAgLy8gVXBkYXRlIGxvY2FsIGNhY2hlZCBjYW1lcmEgaW5mb1xuICAgICAgdGhpcy5sYXN0Q2FtZXJhUG9zaXRpb24gPSB7IC4uLnBvc2l0aW9uIH07XG4gICAgICAvLyBFbWl0IGEgc2ltcGxpZmllZCBjdXJyZW50IGNhbWVyYSBwb3NlIGZvciBzdWJzY3JpYmVyc1xuICAgICAgdGhpcy5jdXJyZW50Q2FtZXJhUG9zZS5uZXh0KHtcbiAgICAgICAgcG9zaXRpb246IHsgLi4ucG9zaXRpb24gfSxcbiAgICAgICAgcm90YXRpb246IHJvdGF0aW9uID8geyAuLi5yb3RhdGlvbiB9IDogbnVsbCxcbiAgICAgICAgc3dlZXA6IHRoaXMucG9zZUNhbWVyYT8uc3dlZXAgPz8gbnVsbFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdnb1RvUG9zaXRpb24gY29tcGxldGVkJywgeyBwb3NpdGlvbiwgcm90YXRpb24sIG9wdGlvbnMgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUuZXJyb3IoJ2dvVG9Qb3NpdGlvbiBlcnJvcicsIGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIEVuc3VyZSB0cmFuc2l0aW9uIGZsYWcgaXMgY2xlYXJlZCAobmF2aWdhdGlvbiBzZXJ2aWNlIG1heSBhbHNvIGNsZWFyIGl0KVxuICAgICAgdGhpcy5pblRyYW5zaXRpb25Nb2RlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAgKiBDb21wdXRlcyB0aGUgY29udGV4dC1hd2FyZSBvcGFjaXR5IGZvciBhIHNpbmdsZSB0YWcgYXQgdGhlIG1vbWVudCBpdCBpcyByZW5kZXJlZC5cbiAgICAqIC0gQ3Vyc29yIHRhZzogYWx3YXlzIHVzZSBwcm92aWRlZCBkZWZhdWx0T3BhY2l0eS5cbiAgICAqIC0gRE9MTEhPVVNFIC8gRkxPT1JQTEFOOiAwIChoaWRkZW4pLlxuICAgICogLSBJTlNJREU6IGZsb29yLWZpbHRlcmVkIHByb3hpbWl0eSBvcGFjaXR5IHZpYSBNYXR0ZXJwb3J0VGFnU2VydmljZS5cbiAgICAqIC0gT3RoZXIgLyB1bmtub3duOiBkZWZhdWx0T3BhY2l0eS5cbiAgICAqL1xuICAvKnByaXZhdGUgX2NvbXB1dGVDb250ZXh0T3BhY2l0eUZvclRhZyhcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsXG4gICAgZGVmYXVsdE9wYWNpdHk6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGlmIChtYXR0ZXJ0YWdJRCA9PT0gdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRPcGFjaXR5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5jb21wdXRlU2luZ2xlVGFnQ29udGV4dE9wYWNpdHkoXG4gICAgICBtYXR0ZXJ0YWdEYXRhLFxuICAgICAgdGhpcy5wb3NlQ2FtZXJhLFxuICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXG4gICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlLFxuICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcbiAgICApO1xuICB9Ki9cblxuICBwcml2YXRlIGFkZEN1c3RvbUNzcygpOiB2b2lkIHtcbiAgICBjb25zdCBjc3MgPSBgXG4gICAgICAuZm9vdGVyLXVpLFxuICAgICAgLnNob3djYXNlLWZvb3RlcixcbiAgICAgIC5tcC1ub3ZhLWJ0bi1ncm91cCxcbiAgICAgIC5mb290ZXItZGl2aWRlcixcbiAgICAgIC5sb2dvLWxpbmssXG4gICAgICAuZm9vdGVyLWxvZ28sXG4gICAgICAuYm90dG9tLXVpLFxuICAgICAgaW1nLmxvZ28taW1hZ2UsXG4gICAgICBpbWdbY2xhc3NePVwibG9nby1pbWFnZVwiXSxcbiAgICAgIGltZ1tjbGFzcyo9XCIgbG9nby1pbWFnZVwiXSxcbiAgICAgIFtkYXRhLXRlc3RpZD1cInNob3djYXNlLWZvb3RlclwiXSB7XG4gICAgICAgIG9wYWNpdHk6IDAgIWltcG9ydGFudDtcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgYDtcblxuICAgIC8vIDFzdCBtZXRob2Q6IFZpYSBTY2VuZSBTREtcbiAgICBpZiAodGhpcy5zZGs/LlNjZW5lPy5hZGRTdHlsZSkge1xuICAgICAgdGhpcy5zZGsuU2NlbmUuYWRkU3R5bGUoY3NzKTtcbiAgICB9XG5cbiAgICAvLyAybmQgbWV0aG9kOiBEaXJlY3QgaW5qZWN0aW9uIGluIGlGcmFtZSBET00gKEZhbGxiYWNrKVxuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN2aWV3ZXItbW9kdWxlJykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgaWYgKGlmcmFtZT8uY29udGVudFdpbmRvdz8uZG9jdW1lbnQpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gY3NzO1xuICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgY29udGVudCBvZiBNYXR0ZXJ0YWcgd2l0aCBtYXR0ZXJ0YWdJRCAoYmlsbGJvYXJkLCBpbmplY3RlZCBodG1sLCB0YWcgaWNvbilcbiAgICogQHBhcmFtIG1hdHRlcnRhZ0lEIHN0cmluZ1xuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGNcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlTWF0dGVyVGFnQ29udGVudEZvclRhZ0lEKFxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUgPSBudWxsLFxuICAgIHRhZ1R5cGU6IFBvaVR5cGUgPSBudWxsXG4gICkge1xuICAgIGlmICh0aGlzLnNkaykge1xuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRUYWdNb2R1bGUodGhpcy5zZGssIG1hdHRlcnRhZ0lEKS5lZGl0QmlsbGJvYXJkKFxuICAgICAgICBtYXR0ZXJ0YWdJRCxcbiAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKS5nZXREYXRhKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTWlzZSDDoCBqb3VyIGRlIGwnaWPDtG5lIGltbcOpZGlhdGVcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChcbiAgICAgIHRoaXMuc2RrLFxuICAgICAgbWF0dGVydGFnSUQsXG4gICAgICBvYmplY3QsXG4gICAgICB0YWdUeXBlLFxuICAgICAgdGhpcy5zZXRUYWdJY29uQW5kT3BhY2l0eS5iaW5kKHRoaXMpLFxuICAgICAgLy8gT24gcGFzc2UgdW5lIGZvbmN0aW9uIHdyYXBwZXIgcXVpIGV4w6ljdXRlIGwnaW5qZWN0aW9uIEhUTUwgc2FucyBibG9xdWVyXG4gICAgICBhc3luYyAodHlwZSwgb2JqLCBzaWQpID0+IHtcbiAgICAgICAgdGhpcy5pbmplY3RIdG1sSW5UYWcodHlwZSwgb2JqLCBzaWQpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0FzeW5jIEhUTUwgdXBkYXRlIGZhaWxlZCBmb3InLCBzaWQsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBpbmplY3RlZCBodG1sIGZvciBNYXR0ZXJ0YWdcbiAgICogQHBhcmFtIG1hdHRlcnRhZ0lEIHN0cmluZ1xuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGNcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlSW5qZWN0ZWRIdG1sRm9yVGFnSUQoXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcbiAgICBvYmplY3Q6IGFueSxcbiAgICB0YWdUeXBlOiBQb2lUeXBlXG4gICkge1xuICAgIGF3YWl0IHRoaXMuaW5qZWN0SHRtbEluVGFnKHRhZ1R5cGUsIG9iamVjdCwgbWF0dGVydGFnSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgTWF0dGVydGFnIGZyb20gVmlld2VyIGJ5IGl0cyBJRFxuICAgKiBAcGFyYW0gbWF0dGVydGFnSUQgc3RyaW5nXG4gICAqL1xuICBkZWxldGVNYXR0ZXJ0YWdGcm9tSWQobWF0dGVydGFnSUQ6IHN0cmluZykge1xuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZGVsZXRlTWF0dGVydGFnRnJvbUlkKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBsYXRlc3QgY3JlYXRlZCBtYXR0ZXJ0YWdcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUxhc3RNYXR0ZXJ0YWcoKSB7XG4gICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5kZWxldGVMYXN0TWF0dGVydGFnKHRoaXMuc2RrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMZWdhY3k6IHVzZWQgdG8gYmUgY2FsbGVkIGFjdGlvbl9hZGRfbWF0dGVydGFnX2Zyb21fUE9JXG4gICAqIEFkZHMgYW5kIGNvbmZpZ3VyZXMgTWF0dGVydGFnIGZvciBhbiBvYmplY3QgKFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGMpIHRoYXQgY29ycmVzcG9uZHMgdG8gUE9JIChjb29yZGluYXRlcywgdGFnSWNvbilcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLi4uXG4gICAqIEBwYXJhbSBwb2kgUE9JXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBjcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxuICAgIHRhZ1R5cGU6IFBvaVR5cGUsXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXG4gICAgcG9pOiBQT0lcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5jcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxuICAgICAgdGhpcy5zZGssXG4gICAgICB0YWdUeXBlLFxuICAgICAgb2JqZWN0LFxuICAgICAgcG9pLFxuICAgICAgdGhpcy5nZXRUYWdGcm9tRWxlbWVudElkLmJpbmQodGhpcyksXG4gICAgICB0aGlzLnNldFRhZ0ljb25BbmRPcGFjaXR5LmJpbmQodGhpcyksXG4gICAgICB0aGlzLmluamVjdEh0bWxJblRhZy5iaW5kKHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmplY3QgY3VzdG9tIEhUTUwgYXMgTWF0dGVydGFnIGNvbnRlbnRcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlIGV0Y1xuICAgKiBAcGFyYW0gdGFnSUQgc3RyaW5nXG4gICAqL1xuICBhc3luYyBpbmplY3RIdG1sSW5UYWcodGFnVHlwZTogUG9pVHlwZSwgb2JqZWN0OiBEYk9iamVjdFR5cGUsIHRhZ0lEOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5pbmplY3RIdG1sSW5UYWcodGhpcy5zZGssIHRhZ1R5cGUsIG9iamVjdCwgdGFnSUQpO1xuICB9XG5cblxuICBhc3luYyBhY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKCkge1xuICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncyh0aGlzLnNkayk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBNYXR0ZXJ0YWcgZnJvbSB2aXNpdCBhc3NvY2lhdGVkIHdpdGggb2JqZWN0IElEICh0aWNrZXRJRCwgZXRjKVxuICAgKiBAcGFyYW0gZWxlbWVudElEIHN0cmluZ1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlTWF0dGVydGFnRm9yT2JqZWN0KGVsZW1lbnRJRDogc3RyaW5nKSB7XG4gICAgY29uc3QgbWF0dGVyVGFnSUQgPSB0aGlzLmdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElEKS50YWc7XG4gICAgaWYgKG1hdHRlclRhZ0lEKSB7XG4gICAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gdGhpcy50YWdBZGRRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQodGhpcy5zZGssIG1hdHRlclRhZ0lEKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50YWdBZGRRdWV1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiB1dWlkIGZyb20gdGhyZWVqc1xuICAgKiBAcGFyYW0gdXVpZFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlT2JqZWN0M0QodXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRlbGV0ZU9iamVjdDNEKHV1aWQpO1xuICB9XG5cbiAgZ2V0T2JqZWN0M0RNb2RlbE5vZGVGcm9tRGljdGlvbm5hcnkodXVpZDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0T2JqZWN0M0RNb2RlbE5vZGVGcm9tRGljdGlvbm5hcnkodXVpZCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyAgTWF0dGVydGFnRGF0YSBhbmQgc3RhcnQgcmVwb3NpdGlvbmluZyAoY3JlYXRlcyB0ZW1wb3JhcnkgbWF0dGVydGFnIHRoYXQgZm9sbG93cyB0aGUgY3Vyc29yKVxuICAgKiBAcGFyYW0gcG9pVHlwZSBQb2lUeXBlXG4gICAqIEBwYXJhbSBlbGVtZW50IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGNcbiAgICovXG4gIGFzeW5jIGFkZE1hdHRlcnRhZ1doZW5SZXBvc2l0aW9uaW5nKHBvaVR5cGU6IFBvaVR5cGUsIGVsZW1lbnQ6IERiT2JqZWN0VHlwZSkge1xuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSBuZXcgTWF0dGVydGFnRGF0YShwb2lUeXBlKTtcbiAgICAvLyBzZXQgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBleGlzdGluZyB0YWdcbiAgICBjb25zdCBbcG9pXSA9IGVsZW1lbnQucG9pcy5pdGVtcztcbiAgICBpZiAocG9pICYmIHBvaS5jb29yZGluYXRlKSB7XG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvc2l0aW9uKEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpKTtcbiAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9pKHBvaSk7IC8vIHRvIGtlZXAgY3VzdG9tIHRhZ0ljb24gYW5kIG9wYWNpdHlcbiAgICB9XG4gICAgbWF0dGVydGFnRGF0YS5zZXRTd2VlcElEKHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZCh0aGlzLnBvc2VDYW1lcmEuc3dlZXApKTtcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldFJvdGF0aW9uKHRoaXMucG9zZUNhbWVyYS5yb3RhdGlvbik7XG4gICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3QoZWxlbWVudCwgcG9pVHlwZSk7XG4gICAgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyA9IGF3YWl0IHRoaXMuYWRkTWF0dGVydGFnVG9WaWV3ZXIobWF0dGVydGFnRGF0YSk7XG5cbiAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuUE9TSVRJT05JTkcpO1xuICAgIGF3YWl0IHRoaXMuYWRkQ3Vyc29yTWF0dGVydGFnKG1hdHRlcnRhZ0RhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgTWF0dGVydGFnRGF0YSBhbmQgbWF0dGVydGFnIHRoYXQgZm9sbG93cyB0aGUgY3Vyc29yIHdoZW4gY2hvb3NpbmcgcG9zaXRpb24gZm9yIGEgbmV3IG9iamVjdFxuICAgKiBAcGFyYW0gcG9pVHlwZVxuICAgKi9cbiAgYXN5bmMgYWRkTWF0dGVydGFnV2hlbkFkZGluZyhwb2lUeXBlOiBQb2lUeXBlKSB7XG4gICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IG5ldyBNYXR0ZXJ0YWdEYXRhKHBvaVR5cGUpO1xuICAgIG1hdHRlcnRhZ0RhdGEuc2V0U3dlZXBJRCh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQodGhpcy5wb3NlQ2FtZXJhLnN3ZWVwKSk7XG4gICAgbWF0dGVydGFnRGF0YS5zZXRSb3RhdGlvbih0aGlzLnBvc2VDYW1lcmEucm90YXRpb24pO1xuXG4gICAgY29uc3QgaW5pdGlhbFBvc2l0aW9uID0gdGhpcy5wb3NlTWF0dGVycG9ydD8ucG9zaXRpb24gPz8gdGhpcy5wb3NlQ2FtZXJhLnBvc2l0aW9uO1xuICAgIGNvbnN0IGluaXRpYWxOb3JtYWwgPSB0aGlzLnBvc2VNYXR0ZXJwb3J0Py5ub3JtYWwgPz8geyB4OiAwLCB5OiAtMC4xNSwgejogMCB9O1xuICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9zaXRpb24oeyAuLi5pbml0aWFsUG9zaXRpb24gfSk7XG4gICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwoeyAuLi5pbml0aWFsTm9ybWFsIH0pO1xuXG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkFERElORyk7XG4gICAgYXdhaXQgdGhpcy5hZGRDdXJzb3JNYXR0ZXJ0YWcobWF0dGVydGFnRGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBmb2xsb3dpbmcgb2YgY3Vyc29yIChtZWFuaW5nIGRlbGV0aW5nIGxhc3QgTWF0dGVydGFnKVxuICAgKi9cbiAgY2FuY2VsRm9sbG93aW5nQ3Vyc29yKCkge1xuICAgIHRoaXMuZGVsZXRlTGFzdE1hdHRlcnRhZygpO1xuICAgIHRoaXMuc2V0SW50ZXJhY3Rpb25Nb2RlKFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKTtcbiAgfVxuXG4gIHNldExhc3RPYmplY3QzRChsYXN0T2JqZWN0M0Q6IFRocmVlSlNPYmplY3QzRCkge1xuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmxhc3RPYmplY3QzRCA9IGxhc3RPYmplY3QzRDtcbiAgfVxuXG4gIGdldExhc3RPYmplY3QzRCgpOiBUaHJlZUpTT2JqZWN0M0Qge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5sYXN0T2JqZWN0M0Q7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgY2FsbGJhY2sgYWZ0ZXIgbWF0dGVydGFnIHBvc2l0aW9uIHdhcyB2YWxpZGF0ZWQgKGNyZWF0aW9uIG9mIG9iamVjdCBvciByZXBvc2l0aW9uaW5nKVxuICAgKiBAcGFyYW0gbW9kZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlXG4gICAqL1xuICBjYWxsYmFja0FmdGVyTWF0dGVydGFnVmFsaWRhdGlvbihtb2RlOiBNYXR0ZXJ0YWdBY3Rpb25Nb2RlKSB7XG4gICAgdGhpcy52aXNpYmlsaXR5U2VydmljZS5kZXRhaWxTaG93aW5nLm5leHQodHJ1ZSk7XG4gICAgY29uc3QgbGFzdFRhZyA9IHRoaXMuZ2V0TGFzdFRhZygpO1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLkFERF9FUVVJUE1FTlQ6XG4gICAgICAgIHRoaXMuZ29Ub0xhc3RUYWcoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2FkZF9lcXVpcGBdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX1RJQ0tFVDpcbiAgICAgICAgdGhpcy5nb1RvTGFzdFRhZygpO1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vYWRkX3RpY2tldGBdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX09CSkVDVDNEOlxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9hZGRfb2JqZWN0M2RgXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLkFERF9EQVRBOlxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XG4gICAgICAgIGxldCB1cmw6IHN0cmluZztcbiAgICAgICAgaWYgKHRoaXMucm91dGVyLnVybC5pbmNsdWRlcygnPycpKSB7XG4gICAgICAgICAgdXJsID0gdGhpcy5yb3V0ZXIudXJsLnN1YnN0cmluZygwLCB0aGlzLnJvdXRlci51cmwuaW5kZXhPZignPycpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cmwgPSB0aGlzLnJvdXRlci51cmw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3VybH0vYWRkX2ZlYXR1cmVgXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLkFERF9ERVNLOlxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9hZGRfZmVhdHVyZWBdLCB7XG4gICAgICAgICAgcXVlcnlQYXJhbXM6IHsgaXNEZXNrOiB0cnVlIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfUk9PTTpcbiAgICAgICAgdGhpcy5nb1RvTGFzdFRhZygpO1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vYWRkX3Jvb21gXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX09CSkVDVDNEOlxuICAgICAgICBpZiAobGFzdFRhZykge1xuICAgICAgICAgIC8vIERPIE5vdGhpbmcgKHJvdXRpbmcpLCBqdXN0XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgICBbYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vb2JqZWN0M2QvJHt0aGlzLmxhc3RPYmplY3QzRC5pZH1gXSxcbiAgICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5QT1NJVElPTl9USUNLRVQ6XG4gICAgICAgIGlmIChsYXN0VGFnKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIGB2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2RldGFpbC8ke3RoaXMuZGljdGlvbm5hcnlUYWdzLmdldChsYXN0VGFnKS5lbGVtZW50SURcbiAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBxdWVyeVBhcmFtczogeyBwb3NpdGlvbmluZzogdHJ1ZSB9IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX0VRVUlQTUVOVDpcbiAgICAgICAgaWYgKGxhc3RUYWcpIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vZXF1aXAvJHt0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobGFzdFRhZykuZWxlbWVudElEXG4gICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5QT1NJVElPTl9EQVRBOlxuICAgICAgICBpZiAobGFzdFRhZykge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2ZVJvdXRlLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSwgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuUE9TSVRJT05fUk9PTTpcbiAgICAgICAgaWYgKGxhc3RUYWcpIHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmVSb3V0ZSxcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IHBvc2l0aW9uaW5nOiB0cnVlIH0sIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSB1cGRhdGVzIGV4aXN0aW5nIE1hdHRlcnRhZyBjb250ZW50IHdpdGggZGF0YSBvZiBvYmplY3QgKFRpY2tldCwgRXF1aXBtZW50LCBEZXNrKVxuICAgKiBAcGFyYW0gbWF0dGVydGFnSUQgc3RyaW5nXG4gICAqIEBwYXJhbSBvYmplY3QgVGlja2V0LCBFcXVpcG1lbnQsIEZlYXR1cmUsIERlc2tcbiAgICogQHBhcmFtIHBvaVR5cGUgUG9pVHlwZVxuICAgKiBAcGFyYW0gcG9pIFBPSVxuICAgKi9cbiAgYXN5bmMgc2V0T2JqZWN0QW5kUG9pSW5UYWcoXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcbiAgICBwb2lUeXBlOiBQb2lUeXBlLFxuICAgIHBvaTogUE9JIHwgbnVsbCA9IG51bGxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKS5zZXRPYmplY3Qob2JqZWN0LCBwb2lUeXBlKTtcbiAgICBpZiAocG9pKSB7XG4gICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpLnNldFBvaShwb2kpO1xuICAgIH1cbiAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpLmVsZW1lbnRJRCA9IG9iamVjdC5pZDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQobWF0dGVydGFnSUQsIG9iamVjdCwgcG9pVHlwZSk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZU1hdHRlclRhZ1Bvc0luU2RrVmlld2VyKFxuICAgICAgICBtYXR0ZXJ0YWdJRCxcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwb2lUeXBlLFxuICAgICAgICBwb2lcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coYGVycm9yIGluIHNldE9iamVjdEFuZFBvaUluVGFnOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlTWF0dGVyVGFnUG9zSW5TZGtWaWV3ZXIoXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcbiAgICBwb2lUeXBlOiBQb2lUeXBlLFxuICAgIHBvaTogUE9JIHwgbnVsbCA9IG51bGxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFwb2kgfHwgIXBvaS5jb29yZGluYXRlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3VwZGF0ZU1hdHRlclRhZ1Bvc0luU2RrVmlld2VyOiBwb2kgb3IgcG9pLmNvb3JkaW5hdGUgaXMgbWlzc2luZycsIHBvaSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IEluZGV4VG9VcGRhdGUgPSBvYmplY3QucG9pcz8uaXRlbXMgPyBvYmplY3QucG9pcy5pdGVtcy5maW5kSW5kZXgoKHUpID0+IHU/LmlkID09PSBwb2kuaWQpIDogLTE7XG4gICAgaWYgKEluZGV4VG9VcGRhdGUgIT09IC0xICYmIG9iamVjdC5wb2lzPy5pdGVtcykge1xuICAgICAgb2JqZWN0LnBvaXMuaXRlbXNbSW5kZXhUb1VwZGF0ZV0gPSBwb2k7XG4gICAgfVxuICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gSlNPTi5wYXJzZShwb2kuY29vcmRpbmF0ZSk7XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSB7XG4gICAgICBhbmNob3JQb3NpdGlvbjoge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB6OiB6LFxuICAgICAgfSxcbiAgICAgIHN0ZW1WZWN0b3I6IHtcbiAgICAgICAgLy8gbWFrZSB0aGUgVGFnIHN0aWNrIHN0cmFpZ2h0IHVwIGFuZCBtYWtlIGl0IDAuMzAgbWV0ZXJzICh+MSBmb290KSB0YWxsXG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAuMyxcbiAgICAgICAgejogMCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldFRhZ01vZHVsZSh0aGlzLnNkaywgbWF0dGVydGFnSUQpLmVkaXRQb3NpdGlvbihtYXR0ZXJ0YWdJRCwgbmV3UG9zaXRpb24pO1xuICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzXG4gICAgICAuZ2V0KG1hdHRlcnRhZ0lEKVxuICAgICAgLnNldFBvc2l0aW9uKG5ld1Bvc2l0aW9uLmFuY2hvclBvc2l0aW9uKTtcblxuICAgIGZvciAobGV0IHRhZ0lkIG9mIHRoaXMubWF0dGVydGFnSURzKSB7XG4gICAgICBjb25zdCBjdXJyZW50VGFnID0gdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KHRhZ0lkKTtcbiAgICAgIGlmICghY3VycmVudFRhZykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50VGFnLmVsZW1lbnRJRCA9PT0gb2JqZWN0LmlkICYmIHRhZ0lkICE9PSBtYXR0ZXJ0YWdJRCkge1xuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmRlbGV0ZU1hdHRlcnRhZ0Zyb21JZCh0aGlzLnNkaywgdGFnSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBtYXR0ZXJUYWdJRCBhbmQgaXRzIHN3ZWVwIGZvciBhbiBvYmplY3QgSUQgKHRpY2tldCBJRCwgZXRjKVxuICAgKiBAcGFyYW0gZWxlbWVudElEIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7dGFnOiBzdHJpbmcgfCBudWxsLCBzd2VlcDogc3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIHB1YmxpYyBnZXRUYWdGcm9tRWxlbWVudElkKGVsZW1lbnRJRDogc3RyaW5nKTogeyB0YWc6IHN0cmluZyB8IG51bGw7IHN3ZWVwOiBzdHJpbmcgfCBudWxsIH0ge1xuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElELCB0aGlzLnN3ZWVwcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBsYXRlc3QgdGFnIGNyZWF0ZWQgaW4gdGhlIHZpc2l0ICh3aGVuIGZvbGxvd2luZyB0aGUgY3Vyc29yIHRvIHBvc2l0aW9uKVxuICAgKiBAcmV0dXJucyBzdHJpbmcgbWF0dGVydGFnSURcbiAgICovXG4gIGdldExhc3RUYWcoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoID09PSAwXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMubWF0dGVydGFnSURzW3RoaXMubWF0dGVydGFnSURzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIE1hdHRlcnRhZ0RhdGEgZm9yIE1hdHRlcnRhZyAocmVwbGFjZXMgZ2V0VGFnRGF0YUZyb21JZClcbiAgICogQHBhcmFtIG1hdHRlcnRhZ0lEXG4gICAqIEByZXR1cm5zIE1hdHRlcnRhZ0RhdGFcbiAgICovXG4gIGdldE1hdHRlclRhZ0RhdGFGb3JNYXR0ZXJ0YWcobWF0dGVydGFnSUQ6IHN0cmluZyk6IE1hdHRlcnRhZ0RhdGEgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zb2xlLmxvZygnY2Fubm90IHJldHJpZXZlIG1hdHRlcnRhZ0RhdGEgZm9yIHRhZycsIG1hdHRlcnRhZ0lEKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvL1xuICAvLyAtLS0tLS0tLS0tIFZpZXdzIChmdXJuaXNoZWQgLyBkZWZ1cm5pc2hlZCkgLS0tLS0tLS0tLVxuICAvL1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBTREsgVmlldyBBUEkgdG8ga2VlcCB0cmFjayBvZiB0aGUgdmlld3MgYXZhaWxhYmxlIGZvciB0aGUgc3BhY2VcbiAgICogYW5kIG9mIHRoZSBhY3RpdmUgb25lLiBUYWdzIGxpdmUgaW4gYSBzaGFyZWQgY29tbW9uIGxheWVyLCBzbyBhIHZpZXcgY2hhbmdlIG9ubHlcbiAgICogcmVxdWlyZXMgcmUtYXBwbHlpbmcgdGhlaXIgdmlzaWJpbGl0eSwgbmV2ZXIgcmUtY3JlYXRpbmcgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgaW5pdFZpZXdzKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJWaWV3U3Vic2NyaXB0aW9ucygpO1xuICAgIHRoaXMudmlld3NCeVR5cGUuY2xlYXIoKTtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gbnVsbDtcblxuICAgIGlmICghdGhpcy5zZGs/LlZpZXc/LnZpZXdzKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSBWaWV3IEFQSSB1bmF2YWlsYWJsZSBvbiB0aGlzIFNESyB2ZXJzaW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy52aWV3U3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zZGsuVmlldy52aWV3cy5zdWJzY3JpYmUoe1xuICAgICAgICBvbkNvbGxlY3Rpb25VcGRhdGVkOiAoY29sbGVjdGlvbjogTWF0dGVycG9ydFZpZXdDb2xsZWN0aW9uKSA9PiB7XG4gICAgICAgICAgLy8gU0RLIGNhbGxiYWNrcyBydW4gb3V0c2lkZSBBbmd1bGFyOiByZS1lbnRlciB0aGUgem9uZSBzbyB0aGUgdmlld3MgbWFkZVxuICAgICAgICAgIC8vIGF2YWlsYWJsZSBoZXJlIChkZWZ1cm5pc2ggYnV0dG9uLi4uKSBhcmUgcGlja2VkIHVwIGJ5IGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlld3NCeVR5cGUuY2xlYXIoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmlldyBvZiBPYmplY3QudmFsdWVzKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgIHRoaXMudmlld3NCeVR5cGUuc2V0KHZpZXcudHlwZSwgdmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gVmlld3MgYXJlIGRpc2NvdmVyZWQgcHJvZ3Jlc3NpdmVseTogbWFrZSBzdXJlIGVhY2ggb25lIGNhcnJpZXMgdGhlIHNoYXJlZFxuICAgICAgICAgIC8vIHRhZyBsYXllciwgb3RoZXJ3aXNlIGl0cyB0YWdzIHdvdWxkIG5vdCBleGlzdCBpbiB0aGF0IHZpZXcuXG4gICAgICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5hdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3ModGhpcy5zZGssIE9iamVjdC52YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy52aWV3U3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zZGsuVmlldy5jdXJyZW50LnN1YnNjcmliZSgodmlldzogTWF0dGVycG9ydFZpZXcpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IHRoaXMuY3VycmVudFZpZXc/LmlkICE9PSB2aWV3Py5pZDtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9IHZpZXc7XG4gICAgICAgIGlmICghY2hhbmdlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlc3RvcmVUYWdzRm9yQWN0aXZlVmlldyh2aWV3KTtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMub25WaWV3Q2hhbmdlZC5uZXh0KHZpZXcpKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZXMgdGhlIG9wYWNpdHkvZW5hYmxlZCBzdGF0ZSB0byBiZSBwdXNoZWQgYWdhaW4gdG8gZXZlcnkgdGFnLiBUaGUgU0RLXG4gICAqIHJlLXJlbmRlcnMgdGhlIHNoYXJlZCBsYXllcidzIHRhZ3Mgb24gYSB2aWV3IHN3YXAsIGFuZCB0aGUgbWVtb2l6ZWQgdmFsdWVzIHdvdWxkXG4gICAqIG90aGVyd2lzZSBtYWtlIHVwZGF0ZVRhZ3NWaXNpYmlsaXR5Rm9yQ29udGV4dCgpIHNraXAgdGhlbSwgbGVhdmluZyB0YWdzIGludmlzaWJsZS5cbiAgICovXG4gIHByaXZhdGUgcmVhcHBseVRhZ3NWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UucmVzZXRWaXNpYmlsaXR5Q2FjaGUoKTtcbiAgICB0aGlzLnJlZnJlc2hUYWdzVmlzaWJpbGl0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dHMgdGhlIHRhZ3MgYmFjayBpbiBzaGFwZSBpbiB0aGUgdmlldyB0aGF0IGp1c3QgYmVjYW1lIGFjdGl2ZS5cbiAgICpcbiAgICogQWN0aXZhdGluZyBhIHZpZXcgcmUtbWF0ZXJpYWxpemVzIHRoZSBzaGFyZWQgbGF5ZXIncyB0YWdzIGZyb20gdGhlIGRlc2NyaXB0b3JzXG4gICAqIHJlY29yZGVkIHdoZW4gdGhleSB3ZXJlIGFkZGVkLCBzbyBldmVyeXRoaW5nIGFwcGxpZWQgdG8gYSB0YWcgKmFmdGVyd2FyZHMqIHRocm91Z2hcbiAgICogdGhlIGdsb2JhbCBUYWcgbW9kdWxlIGlzIGRyb3BwZWQgYWxvbmcgdGhlIHdheTogdGhlIGN1c3RvbSBpY29uICh0aGUgcGluIGZhbGxzIGJhY2tcbiAgICogdG8gdGhlIGRlc2NyaXB0b3IncyB3aGl0ZSkgYW5kIHRoZSBzYW5kYm94IGNhcnJ5aW5nIHRoZSBob3ZlciBjb250ZW50LiBUaGV5IGhhdmUgdG9cbiAgICogYmUgYXBwbGllZCBhZ2FpbiBvbiB0aGUgZnJlc2hseSByZWJ1aWx0IHRhZ3MuXG4gICAqXG4gICAqIFZpc2liaWxpdHkgaXMgcmVmcmVzaGVkIHN0cmFpZ2h0IGF3YXkgc28gdGhlIHRhZ3Mgc2hvdyB1cCB3aXRob3V0IHdhaXRpbmcsIHRoZW5cbiAgICogY29udGVudCBpcyByZS1hcHBsaWVkIG9uY2UgdGhlIHRyYW5zaXRpb24gaXMgb3ZlciDigJQgcmUtYXBwbHlpbmcgaXQgdG9vIGVhcmx5IHdvdWxkXG4gICAqIHRhcmdldCB0YWdzIHRoZSBTREsgaGFzIG5vdCByZWJ1aWx0IHlldC5cbiAgICovXG4gIHByaXZhdGUgcmVzdG9yZVRhZ3NGb3JBY3RpdmVWaWV3KHZpZXc6IE1hdHRlcnBvcnRWaWV3KTogdm9pZCB7XG4gICAgLy8gQSB2aWV3IG9ubHkgbWF0ZXJpYWxpemVzIGl0cyBsYXllcnMgb25jZSBhY3RpdmF0ZWQ6IChyZSlhdHRhY2ggdGhlIHNoYXJlZCBvbmUuXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5hdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3ModGhpcy5zZGssIFt2aWV3XSlcbiAgICAgIC50aGVuKCgpID0+IHRoaXMucmVhcHBseVRhZ3NWaXNpYmlsaXR5KCkpO1xuICAgIHRoaXMucmVhcHBseVRhZ3NWaXNpYmlsaXR5KCk7XG5cbiAgICBjbGVhclRpbWVvdXQodGhpcy52aWV3U3dpdGNoUmVzdG9yZVRpbWVyKTtcbiAgICB0aGlzLnZpZXdTd2l0Y2hSZXN0b3JlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVmcmVzaFRhZ3NDb250ZW50KClcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0U2VydmljZV0gQ2Fubm90IHJlc3RvcmUgdGFncyBmb3IgdmlldycsIHZpZXc/LmlkLCBlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZWFwcGx5VGFnc1Zpc2liaWxpdHkoKSk7XG4gICAgfSwgTWF0dGVycG9ydFNlcnZpY2UuVklFV19TV0lUQ0hfUkVGUkVTSF9ERUxBWV9NUyk7XG4gIH1cblxuICAvKipcbiAgICogUmUtYXBwbGllcyB0aGUgaWNvbiBhbmQgdGhlIGluamVjdGVkIEhUTUwgb2YgZXZlcnkgdGFnIHdlIG93bi4gVXNlZCBhZnRlciBhIHZpZXdcbiAgICogc3dpdGNoLCBzZWUgcmVzdG9yZVRhZ3NGb3JBY3RpdmVWaWV3KCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUYWdzQ29udGVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuc2RrKSByZXR1cm47XG5cbiAgICAvLyBTbmFwc2hvdDogdGhlIGRpY3Rpb25hcnkgY2FuIGJlIG11dGF0ZWQgd2hpbGUgdGhlIGF3YWl0cyBiZWxvdyBhcmUgcGVuZGluZy5cbiAgICBmb3IgKGNvbnN0IFtzaWQsIG1hdHRlcnRhZ0RhdGFdIG9mIFsuLi50aGlzLmRpY3Rpb25uYXJ5VGFnc10pIHtcbiAgICAgIGlmIChzaWQgPT09IHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgdGhpcy5zZXRUYWdJY29uQW5kT3BhY2l0eShzaWQsIG1hdHRlcnRhZ0RhdGEpO1xuICAgICAgdGhpcy5pbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIHNpZClcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSBIVE1MIHJlLWluamVjdGlvbiBmYWlsZWQgZm9yJywgc2lkLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyVmlld1N1YnNjcmlwdGlvbnMoKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudmlld1N3aXRjaFJlc3RvcmVUaW1lcik7XG4gICAgdGhpcy52aWV3U3dpdGNoUmVzdG9yZVRpbWVyID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiB0aGlzLnZpZXdTdWJzY3JpcHRpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdWJzY3JpcHRpb24uY2FuY2VsKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIENhbm5vdCBjYW5jZWwgdmlldyBzdWJzY3JpcHRpb24nLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52aWV3U3Vic2NyaXB0aW9ucyA9IFtdO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgc3BhY2UgcHJvdmlkZXMgYSBkZWZ1cm5pc2hlZCB2aWV3LiAqL1xuICBnZXQgaGFzRGVmdXJuaXNoVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aWV3c0J5VHlwZS5oYXMoTWF0dGVycG9ydFZpZXdUeXBlLkRFRlVSTklTSCk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBkZWZ1cm5pc2hlZCB2aWV3IGlzIHRoZSBhY3RpdmUgb25lLiAqL1xuICBnZXQgaXNEZWZ1cm5pc2hlZFZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFZpZXc/LnR5cGUgPT09IE1hdHRlcnBvcnRWaWV3VHlwZS5ERUZVUk5JU0g7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoZXMgYmV0d2VlbiB0aGUgZGVmdXJuaXNoZWQgdmlldyBhbmQgdGhlIGZ1cm5pc2hlZCBvbmUuXG4gICAqIEBwYXJhbSByZXR1cm5Ub1N0YXJ0IE1vdmUgdGhlIGNhbWVyYSBiYWNrIHRvIHRoZSB2aWV3J3Mgc3RhcnQgbG9jYXRpb24uXG4gICAqL1xuICBhc3luYyB0b2dnbGVEZWZ1cm5pc2hWaWV3KHJldHVyblRvU3RhcnQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuaXNEZWZ1cm5pc2hlZFZpZXdcbiAgICAgID8gdGhpcy52aWV3c0J5VHlwZS5nZXQoTWF0dGVycG9ydFZpZXdUeXBlLkxBWUVSRURfQkFTRSkgPz8gdGhpcy52aWV3c0J5VHlwZS5nZXQoTWF0dGVycG9ydFZpZXdUeXBlLkJBU0UpXG4gICAgICA6IHRoaXMudmlld3NCeVR5cGUuZ2V0KE1hdHRlcnBvcnRWaWV3VHlwZS5ERUZVUk5JU0gpO1xuXG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIE5vIHRhcmdldCB2aWV3IHRvIHN3aXRjaCB0bycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0YXJnZXQuc2V0QWN0aXZlKHJldHVyblRvU3RhcnQpO1xuICB9XG5cbiAgLy9cbiAgLy8gLS0tLS0tLS0tLSBWaWV3ZXIgcmVsYXRlZCAoc3dpdGNoIHZpZXdzLCBnbyB0bykgLS0tLS0tLS0tLVxuICAvL1xuICBhc3luYyBhY3Rpb25fdG9vbGJveF9mbG9vcnBsYW4oKSB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfZmxvb3JwbGFuKHRoaXMuc2RrKTtcbiAgfVxuXG4gIGFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCkge1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcodGhpcy5zZGspO1xuICB9XG5cbiAgYWN0aW9uU2hvd0FsbEZsb29ycygpIHtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvblNob3dBbGxGbG9vcnModGhpcy5zZGspO1xuICB9XG5cbiAgYXN5bmMgYWN0aW9uX3Rvb2xib3hfZG9sbGhvdXNlKCkge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl90b29sYm94X2RvbGxob3VzZSh0aGlzLnNkayk7XG4gIH1cblxuICBhY3Rpb25fdG9vbGJveF9tZXN1cmUoKSB7XG4gICAgY29uc3QgbmV3U3RhdGUgPSAhdGhpcy5pc01lYXN1cmVNb2RlT247XG4gICAgdGhpcy5zZGsuTWVhc3VyZW1lbnRzLnRvZ2dsZU1vZGUobmV3U3RhdGUpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBNZWFzdXJlbWVudCBtb2RlIGlzIG5vdyAke25ld1N0YXRlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgYWN0aW9uX3Rvb2xib3hfY2FuY2VsX21lc3VyZSgpIHtcbiAgICBpZiAodGhpcy5pc01lYXN1cmVNb2RlT24pIHtcbiAgICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfbWVzdXJlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWN0aW9uX2dvX3RvX2Zsb29yKFxuICAgIGZsb29yTmFtZTogc3RyaW5nLFxuICAgIG1hdHRlcnBvcnRGbG9vclNlcXVlbmNlOiBudW1iZXIgPSBudWxsXG4gICkge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl9nb190b19mbG9vcih0aGlzLnNkaywgZmxvb3JOYW1lLCBtYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZSk7XG4gIH1cblxuICBhc3luYyBhY3Rpb25fZ29fdG9fc3dlZXAoc3dlZXA6IHN0cmluZywgcm90YXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0gfCBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uX2dvX3RvX3N3ZWVwKHRoaXMuc2RrLCBzd2VlcCwgcm90YXRpb24pO1xuICB9XG5cbiAgZ2V0Q3VycmVudFN3ZWVwKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRTd2VlcCh0aGlzLnBvc2VDYW1lcmEpO1xuICB9XG5cbiAgZ2V0Q3VycmVudENhbWVyYVBvc2l0aW9uKCk6IHtcbiAgICByb3RhdGlvbjogYW55O1xuICAgIHBvc2l0aW9uOiBhbnk7XG4gICAgc3dlZXA6IGFueTtcbiAgfSB8IG51bGwge1xuICAgIGlmICh0aGlzLnBvc2VDYW1lcmEpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvc2VDYW1lcmE7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc2V0SW50ZXJhY3Rpb25Nb2RlKGludGVyYWN0aW9uTW9kZTogbnVtYmVyKSB7XG4gICAgdGhpcy5pbnRlcmFjdGlvbk1vZGUgPSBpbnRlcmFjdGlvbk1vZGU7XG4gIH1cblxuICBnZXRJbnRlcmFjdGlvbk1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25Nb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCB2YXJpYWJsZXMsIGRlbGV0ZXMgYWxsIHRhZ3MgKHdoZW4gdmlld2VyIGlzIHJlbW92ZXIgb3IgbW9kZWwgY2hhbmdlZD1yZWxvYWQgbmVlZGVkKVxuICAgKi9cbiAgYXN5bmMgY2xlYXJBbGwoKSB7XG4gICAgY29uc29sZS5sb2coJ3JlbW92aW5nIHZpZXdlcicpO1xuICAgIHRoaXMuY2xlYXJWaWV3U3Vic2NyaXB0aW9ucygpO1xuICAgIHRoaXMudmlld3NCeVR5cGUuY2xlYXIoKTtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gbnVsbDtcbiAgICBhd2FpdCB0aGlzLmFjdGlvbl9kZWxldGVfYWxsX21hdHRlcnRhZ3MoKTtcbiAgICB0aGlzLmZsb29ycyA9IG51bGw7XG4gICAgdGhpcy5zd2VlcHMgPSBudWxsO1xuICAgIHRoaXMuc2RrID0gbnVsbDtcblxuICAgIHRoaXMucG9pbnRlclNlcnZpY2UuY2xlYXIoe1xuICAgICAgb25MZWZ0Q2xpY2s6IHRoaXMucG9pbnRlckxlZnRDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcbiAgICAgIG9uUmlnaHRDbGljazogdGhpcy5wb2ludGVyUmlnaHRDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcbiAgICAgIG9uTWlkZGxlQ2xpY2s6IHRoaXMucG9pbnRlck1pZGRsZUNsaWNrSGFuZGxlci5iaW5kKHRoaXMpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JiaWRkZW5Td2VlcHMgPSBbXTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZUZvcmJpZGRlblN3ZWVwcyhmb3JiaWRkZW5Td2VlcHM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVtb3ZlRm9yYmlkZGVuU3dlZXBzKHRoaXMuc2RrLCBmb3JiaWRkZW5Td2VlcHMpO1xuICB9XG5cbiAgLy9cbiAgLy8gLS0tLS0tLS0tLSAzRCBvYmplY3RzIChTREsgQnVuZGxlIG9ubHkpIC0tLS0tLS0tLS1cbiAgLy9cbiAgYXN5bmMgaW5pdDNET2JqZWN0Vmlld2VyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5pbml0M0RPYmplY3RWaWV3ZXIodGhpcy5zZGspO1xuICB9XG5cbiAgYXN5bmMgYWRkM0RPYmplY3QoXG4gICAgb2JqOiBJT2JqZWN0M0QsXG4gICAgbW9kZT86ICd0cmFuc2xhdGUnIHwgJ3JvdGF0ZSdcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuYWRkM0RPYmplY3QodGhpcy5zZGssIG9iaiwgbW9kZSk7XG4gIH1cblxuICB0b2dnbGVPYmplY3RWaXNpYmlsaXR5KG9iamVjdElkOiBhbnkpIHtcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS50b2dnbGVPYmplY3RWaXNpYmlsaXR5KG9iamVjdElkKTtcbiAgfVxuXG4gIGlzT2JqZWN0VmlzaWJsZShvYmplY3RJZDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmlzT2JqZWN0VmlzaWJsZShvYmplY3RJZCk7XG4gIH1cblxuICBhc3luYyBwb2ludENhbWVyYVRvM0RPYmplY3Qob2JqZWN0SWQ6IGFueSkge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5wb2ludENhbWVyYVRvM0RPYmplY3QoXG4gICAgICB0aGlzLnNkayxcbiAgICAgIG9iamVjdElkLFxuICAgICAgdGhpcy5jcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmdvVG9UYWcuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuZGVsZXRlTGFzdE1hdHRlcnRhZy5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5nZXRUYWdGcm9tRWxlbWVudElkLmJpbmQodGhpcylcbiAgICApO1xuICB9XG5cbiAgZ2V0U2NlbmVOb2RlRnJvbU9iamVjdDNESWQodXVpZDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0U2NlbmVOb2RlRnJvbU9iamVjdDNESWQodXVpZCk7XG4gIH1cblxuICBhc3luYyBkaXNwbGF5QXppbXV0YWxDcm93bigpIHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZGlzcGxheUF6aW11dGFsQ3Jvd24odGhpcy5wb3NlQ2FtZXJhKTtcbiAgfVxuXG4gIGFzeW5jIGF0dGFjaEdpem1vQ29udHJvbFRvM0RPYmplY3QoXG4gICAgbW9kZWxOb2RlOiBhbnksXG4gICAgc2NlbmVPYmplY3Q6IGFueSxcbiAgICBtb2RlOiAndHJhbnNsYXRlJyB8ICdyb3RhdGUnIHwgJ3NjYWxlJyxcbiAgICB2aXNpYmxlOiBib29sZWFuLFxuICAgIGlzTmV3T2JqZWN0OiBib29sZWFuXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmF0dGFjaEdpem1vQ29udHJvbFRvM0RPYmplY3QodGhpcy5zZGssIG1vZGVsTm9kZSwgc2NlbmVPYmplY3QsIG1vZGUsIHZpc2libGUsIGlzTmV3T2JqZWN0KTtcbiAgfVxuXG4gIHJlbW92ZUdpem1vRnJvbUxhc3RPYmplY3QoKTogdm9pZCB7XG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UucmVtb3ZlR2l6bW9Gcm9tTGFzdE9iamVjdCgpO1xuICB9XG5cbiAgdG9nZ2xlVmlld0ZydXN0dW0oKTogdm9pZCB7XG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UudG9nZ2xlVmlld0ZydXN0dW0oKTtcbiAgfVxufVxuIl19
1429
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tYXR0ZXJwb3J0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUNMLGVBQWUsRUFDZixJQUFJLEVBQ0wsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUVMLFdBQVcsRUFFWCxtQkFBbUIsRUFJbkIsa0JBQWtCLEVBRWxCLE9BQU8sRUFDUCxRQUFRLEVBQ1Isa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7QUErQjFCLE1BQU0sT0FBTyxpQkFBaUI7SUEyT21CO0lBQ3JDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQWxQSCxHQUFHLENBQU07SUFFUixTQUFTLENBQU07SUFFdkIsa0JBQWtCO0lBQ1YsY0FBYyxDQUFNO0lBRXJCLFVBQVUsQ0FBK0M7SUFFekQsa0JBQWtCLEdBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBRXBELGVBQWUsR0FBRyxLQUFLLENBQUM7SUFFeEIsZUFBZSxHQUFXLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztJQUVyRCxVQUFVLEdBQVcsUUFBUSxDQUFDO0lBRXRDLElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FB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QUFJLENBQUMsSUFBSSxDQUFDLEVBQ25DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3BDLENBQUM7SUFDSixDQUFDO0lBRUQsMEJBQTBCLENBQUMsSUFBWTtRQUNyQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsS0FBSyxDQUFDLDRCQUE0QixDQUNoQyxTQUFjLEVBQ2QsV0FBZ0IsRUFDaEIsSUFBc0MsRUFDdEMsT0FBZ0IsRUFDaEIsV0FBb0I7UUFFcEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3pILENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0MsQ0FBQzt3R0Foc0RVLGlCQUFpQixrQkEwT2xCLFFBQVEsYUFDUixrQkFBa0I7NEdBM09qQixpQkFBaUIsY0FGaEIsTUFBTTs7NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBMk9JLE1BQU07MkJBQUMsUUFBUTs7MEJBQ2YsTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZSwgaXNEZXZNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1BVFRFUlBPUlRfU0RLX0tFWSB9IGZyb20gJy4uL3Rva2Vucy9tYXR0ZXJwb3J0LXNkay1rZXkudG9rZW4nO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1xyXG4gIHBvaVR5cGVUb1N0cmluZyxcclxuICB3YWl0XHJcbn0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0dGVydGFnRGF0YSB9IGZyb20gJy4uL21hdHRlcnRhZ0RhdGEnO1xyXG5pbXBvcnQge1xyXG4gIERiT2JqZWN0VHlwZSxcclxuICBGZWF0dXJlVHlwZSxcclxuICBJT2JqZWN0M0QsXHJcbiAgTWF0dGVydGFnQWN0aW9uTW9kZSxcclxuICBNYXR0ZXJwb3J0U3Vic2NyaXB0aW9uLFxyXG4gIE1hdHRlcnBvcnRWaWV3LFxyXG4gIE1hdHRlcnBvcnRWaWV3Q29sbGVjdGlvbixcclxuICBNYXR0ZXJwb3J0Vmlld1R5cGUsXHJcbiAgUE9JLFxyXG4gIFBvaVR5cGUsXHJcbiAgU3BNb2R1bGUsXHJcbiAgVmlld2VySW50ZXJhY3Rpb25zLFxyXG59IGZyb20gJy4uL3R5cGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlVGFnU2VydmljZSB9IGZyb20gJy4vdGFnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlVmlzaWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuL2Jhc2VWaXNpYmlsaXR5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xyXG5pbXBvcnQgeyBDYW1lcmFNb2RlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnRNZWFzdXJlbWVudFNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQtbWVhc3VyZW1lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXR0ZXJwb3J0UG9pbnRlclNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQtcG9pbnRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0dGVycG9ydE9iamVjdDNEU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1vYmplY3QzZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0dGVycG9ydFRhZ1NlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQtdGFnLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIEN1c3RvbSBUaHJlZWpzIE9iamVjdCAzRCBpbnRlcmZhY2VcclxuICovXHJcbmludGVyZmFjZSBUaHJlZUpTT2JqZWN0M0Qge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgdXVpZD86IHN0cmluZztcclxuICBwb3NpdGlvbj86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciB9XHJcbiAgcm90YXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIgfVxyXG4gIHNjYWxlPzogeyB4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyIH1cclxufVxyXG5cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gIGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgTVBfU0RLOiB7IGNvbm5lY3Q6IEZ1bmN0aW9uIH07XHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWF0dGVycG9ydFNlcnZpY2Uge1xyXG5cclxuICBwdWJsaWMgc2RrOiBhbnk7XHJcblxyXG4gIHByaXZhdGUgY29udGFpbmVyOiBhbnk7XHJcblxyXG4gIC8vIFBvc2l0aW9uIGNhbWVyYVxyXG4gIHByaXZhdGUgcG9zZU1hdHRlcnBvcnQ6IGFueTtcclxuXHJcbiAgcHVibGljIHBvc2VDYW1lcmE6IHsgcm90YXRpb246IGFueTsgcG9zaXRpb246IGFueTsgc3dlZXA6IGFueSB9O1xyXG5cclxuICBwdWJsaWMgbGFzdENhbWVyYVBvc2l0aW9uOiBhbnkgPSB7IHg6IDAuMCwgeTogMC4wLCB6OiAwLjAgfTtcclxuXHJcbiAgcHJpdmF0ZSBpc01lYXN1cmVNb2RlT24gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBpbnRlcmFjdGlvbk1vZGU6IG51bWJlciA9IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUO1xyXG5cclxuICBwcml2YXRlIGNhbWVyYU1vZGU6IHN0cmluZyA9ICdJTlNJREUnO1xyXG5cclxuICBwdWJsaWMgZ2V0IG1hdHRlcnRhZ0lEcygpOiBBcnJheTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLm1hdHRlcnRhZ0lEcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgbWF0dGVydGFnSURzKHZhbHVlOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLm1hdHRlcnRhZ0lEcyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkaWN0aW9ubmFyeVRhZ3MoKTogTWFwPHN0cmluZywgTWF0dGVydGFnRGF0YT4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZGljdGlvbm5hcnlUYWdzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkaWN0aW9ubmFyeU9iamVjdHMzRCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5kaWN0aW9ubmFyeU9iamVjdHMzRDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGljdGlvbm5hcnlTY2VuZU9iamVjdHMzRCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5kaWN0aW9ubmFyeVNjZW5lT2JqZWN0czNEO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB0aHJlZUpTU2NlbmUoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS50aHJlZUpTU2NlbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHRocmVlSlNTY2VuZSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS50aHJlZUpTU2NlbmUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgYXppbXV0aGFsQ3Jvd24oKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5hemltdXRoYWxDcm93bjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgYXppbXV0aGFsQ3Jvd24odmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UuYXppbXV0aGFsQ3Jvd24gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdGFnc0F0dGFjaG1lbnRzKCk6IE9iamVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS50YWdzQXR0YWNobWVudHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHN3ZWVwcygpOiBBcnJheTxzdHJpbmc+IHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5zd2VlcHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHN3ZWVwcyh2YWx1ZTogQXJyYXk8c3RyaW5nPiB8IG51bGwpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uuc3dlZXBzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHN3ZWVwQ29sbGVjdGlvbigpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uuc3dlZXBDb2xsZWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzd2VlcENvbGxlY3Rpb24odmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5zd2VlcENvbGxlY3Rpb24gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFN3ZWVwKCk6IFN1YmplY3Q8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50U3dlZXA7XHJcbiAgfVxyXG5cclxuICAvL2NhbWVyYSBwb3NpdGlvbiB3aXRoIHJvdGF0aW9uXHJcbiAgcHVibGljIGN1cnJlbnRDYW1lcmFQb3NlOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwdWJsaWMgZ2V0IGZsb29ycygpOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgc2VxdWVuY2U6IG51bWJlciB9PiB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZmxvb3JzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBmbG9vcnModmFsdWU6IEFycmF5PHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzZXF1ZW5jZTogbnVtYmVyIH0+IHwgbnVsbCkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5mbG9vcnMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2N1cnJlbnRTcGFjZUlEOiBzdHJpbmc7XHJcblxyXG4gIHB1YmxpYyBnZXQgbGFzdE9iamVjdDNEKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UubGFzdE9iamVjdDNEO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBsYXN0T2JqZWN0M0QodmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UubGFzdE9iamVjdDNEID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRSb29tcygpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnRSb29tcyh2YWx1ZTogYW55W10pIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRTcGFjZUlEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNwYWNlSUQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnRTcGFjZUlEKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRTcGFjZUlEID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGZvcmJpZGRlblN3ZWVwcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5mb3JiaWRkZW5Td2VlcHM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGZvcmJpZGRlblN3ZWVwcyh2YWx1ZTogc3RyaW5nW10pIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZm9yYmlkZGVuU3dlZXBzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdGFnQWN0aW9uOiBTdWJqZWN0PHsgYWN0aW9uOiBzdHJpbmc7IGRhdGE6IHN0cmluZyB9PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKiBWaWV3cyAoZnVybmlzaGVkLCBkZWZ1cm5pc2hlZC4uLikgZXhwb3NlZCBieSB0aGUgU0RLIGZvciB0aGUgY3VycmVudCBzcGFjZS4gKi9cclxuICBwcml2YXRlIHZpZXdzQnlUeXBlOiBNYXA8TWF0dGVycG9ydFZpZXdUeXBlLCBNYXR0ZXJwb3J0Vmlldz4gPSBuZXcgTWFwKCk7XHJcbiAgLyoqIFNldHRsZXMgb25jZSBldmVyeSBzdGF0aWMgaWNvbiB0ZXh0dXJlIGhhcyBiZWVuIHJlZ2lzdGVyZWQgKG9yIGZhaWxlZCkuICovXHJcbiAgcHJpdmF0ZSBpY29uc1JlZ2lzdGVyZWQ6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICAvKiogTmFtZXMgb2YgdGhlIHRleHR1cmVzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IFNESyBzZXNzaW9uLiAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJlZEljb25zOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcclxuICAvKiogdGFnSWQgLT4gc2lnbmVkIHNvdXJjZSBsYXN0IHJlZ2lzdGVyZWQgYXMgYSBjdXN0b20gdGV4dHVyZSwgYW5kIGl0cyB0ZXh0dXJlIG5hbWUuICovXHJcbiAgcHJpdmF0ZSBjdXN0b21JY29uQ2FjaGU6IE1hcDxzdHJpbmcsIHsgc3JjOiBzdHJpbmc7IGljb25OYW1lOiBzdHJpbmcgfT4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHByaXZhdGUgY3VycmVudFZpZXc6IE1hdHRlcnBvcnRWaWV3IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgdmlld1N1YnNjcmlwdGlvbnM6IE1hdHRlcnBvcnRTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICAvKiogRW1pdHMgdGhlIGFjdGl2ZSB2aWV3IGV2ZXJ5IHRpbWUgdGhlIHVzZXIgc3dpdGNoZXMgYmV0d2VlbiBmdXJuaXNoZWQvZGVmdXJuaXNoZWQuICovXHJcbiAgcHVibGljIG9uVmlld0NoYW5nZWQ6IFN1YmplY3Q8TWF0dGVycG9ydFZpZXcgfCBudWxsPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKiBEZWxheSBsZWZ0IHRvIHRoZSBTREsgdG8gcmVidWlsZCB0aGUgbGF5ZXIncyB0YWdzIGFmdGVyIGEgdmlldyBzd2l0Y2guICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVklFV19TV0lUQ0hfUkVGUkVTSF9ERUxBWV9NUyA9IDgwMDtcclxuXHJcbiAgcHJpdmF0ZSB2aWV3U3dpdGNoUmVzdG9yZVRpbWVyOiBhbnkgPSBudWxsO1xyXG5cclxuICBwdWJsaWMgZ2V0IG1hdHRlcnRhZ1RvRm9sbG93KCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UubWF0dGVydGFnVG9Gb2xsb3c7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG1hdHRlcnRhZ1RvRm9sbG93KHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLm1hdHRlcnRhZ1RvRm9sbG93ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGluVHJhbnNpdGlvbk1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Nb2RlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBpblRyYW5zaXRpb25Nb2RlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvbk1vZGUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaW5UcmFuc2l0aW9uU3dlZXAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Td2VlcDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgaW5UcmFuc2l0aW9uU3dlZXAodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uU3dlZXAgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbm9MaWdodEZvck9iamVjdHMgPSB0cnVlO1xyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRDYW1lcmFNb2RlKCk6IENhbWVyYU1vZGUge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudENhbWVyYU1vZGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnRDYW1lcmFNb2RlKHZhbHVlOiBDYW1lcmFNb2RlKSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRDYW1lcmFNb2RlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG9uQ2FtZXJhTW9kZUNoYW5nZWQoKTogU3ViamVjdDxDYW1lcmFNb2RlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5vbkNhbWVyYU1vZGVDaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBvblJvb21DaGFuZ2VkKCk6IFN1YmplY3Q8YW55W10+IHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm9uUm9vbUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG9uR29Ub1RhZygpOiBTdWJqZWN0PHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2Uub25Hb1RvVGFnO1xyXG4gIH1cclxuXHJcbiAgdGFnU2VydmljZTogQmFzZVRhZ1NlcnZpY2U7XHJcblxyXG4gIGNvbmZpZzogQ29uZmlnO1xyXG5cclxuICBTUE1vZHVsZTogU3BNb2R1bGU7XHJcblxyXG4gIHB1YmxpYyBnZXQgb2JqZWN0Q29udHJvbCgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLm9iamVjdENvbnRyb2w7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNlY3VyaXR5Q2FtZXJhQW5pbWF0b3IoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5zZWN1cml0eUNhbWVyYUFuaW1hdG9yO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWN0aW9ucyBvbiBsZWZ0IGNsaWNrIHdoZW4gcG9zaXRpb25pbmcgbWF0dGVydGFnIGluIHZpc2l0XHJcbiAgICovXHJcbiAgcG9pbnRlckxlZnRDbGlja0hhbmRsZXIgPSAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBpZiAodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykge1xyXG4gICAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhID0gdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpO1xyXG4gICAgICBpZiAobWF0dGVydGFnRGF0YSkge1xyXG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9zaXRpb24oeyAuLi50aGlzLnBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uIH0pO1xyXG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0Tm9ybWFsKHsgLi4udGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWwgfSk7XHJcbiAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KHRoaXMubWF0dGVydGFnVG9Gb2xsb3csIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTWF0dGVyVGFnQ29udGVudEZvclRhZ0lEKHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLm9uVmFsaWRhdGVkTWF0dGVydGFnKCk7XHJcbiAgfTtcclxuXHJcbiAgcG9pbnRlclJpZ2h0Q2xpY2tIYW5kbGVyID0gKGUpID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuY2FuY2VsRm9sbG93aW5nQ3Vyc29yKCk7XHJcbiAgICBhbGVydCgnYWN0aW9uIGNhbmNlbGxlZCcpO1xyXG4gIH07XHJcblxyXG4gIHBvaW50ZXJNaWRkbGVDbGlja0hhbmRsZXIgPSAoZSkgPT4ge1xyXG4gICAgdGhpcy5wb2ludGVyU2VydmljZS51cGRhdGVDdXJzb3JEaXNwbGF5KHRoaXMucG9zZU1hdHRlcnBvcnQpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KCdjb25maWcnKSBjb25maWc6IENvbmZpZyxcclxuICAgIEBJbmplY3QoTUFUVEVSUE9SVF9TREtfS0VZKSBwcml2YXRlIHJlYWRvbmx5IHNka0tleTogc3RyaW5nLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWN0aXZlUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSB2aXNpYmlsaXR5U2VydmljZTogQmFzZVZpc2liaWxpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcclxuICAgIHByaXZhdGUgbWVhc3VyZW1lbnRTZXJ2aWNlOiBNYXR0ZXJwb3J0TWVhc3VyZW1lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwb2ludGVyU2VydmljZTogTWF0dGVycG9ydFBvaW50ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBvYmplY3QzRFNlcnZpY2U6IE1hdHRlcnBvcnRPYmplY3QzRFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1hdHRlcnBvcnRUYWdTZXJ2aWNlOiBNYXR0ZXJwb3J0VGFnU2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZXMgdGhlIE1hdHRlcnBvcnQgU0RLLCBzZXRzIHVwIGV2ZW50IGxpc3RlbmVycywgYW5kIGNvbmZpZ3VyZXMgYXNzZXRzLlxyXG4gICAqIEBwYXJhbSB0YWdTZXJ2aWNlIFNlcnZpY2UgdXNlZCB0byBnZW5lcmF0ZSBhbmQgaW5qZWN0IEhUTUwgaW50byB0YWdzLlxyXG4gICAqIEBwYXJhbSBtb2R1bGUgQXBwbGljYXRpb24gbW9kdWxlIChlLmcuLCBJTU1PLCBNVVNFVU0pIHRvIGVuYWJsZSBzcGVjaWZpYyBmZWF0dXJlcy5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0cnVlIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuXHJcbiAgICovXHJcbiAgYXN5bmMgaW5pdFNkayhcclxuICAgIHRhZ1NlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlLFxyXG4gICAgbW9kdWxlOiBTcE1vZHVsZSA9IFNwTW9kdWxlLklNTU9cclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLnNkaykge1xyXG4gICAgICAvLyBjbGVhbiBpZiBzZGsgaXMgcnVubmluZyBhbHJlYWR5XHJcbiAgICAgIGF3YWl0IHRoaXMuYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWdTZXJ2aWNlID0gdGFnU2VydmljZTtcclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2Uuc2V0VGFnU2VydmljZSh0YWdTZXJ2aWNlKTtcclxuICAgIHRoaXMuU1BNb2R1bGUgPSBtb2R1bGU7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAvLyBSZXRyaWV2ZSBET00gZWxlbWVudHNcclxuICAgICAgY29uc3QgcG9pbnRlckJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgJyN2aWV3ZXItcG9pbnRlci10cmljaydcclxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlld2VyLW1vZHVsZScpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICcjdmlld2VyLW1vZHVsZSdcclxuICAgICAgKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcclxuICAgICAgaWYgKCFpZnJhbWUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY3Vyc29yQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAnI2J1dHRvbidcclxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgY29uc3QgdGV4dFBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAnI3RleHQnXHJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLmluaXQodGhpcy5jb250YWluZXIsIHBvaW50ZXJCdG4sIGN1cnNvckJ0biwgdGV4dFBhbmVsLCB7XHJcbiAgICAgICAgb25MZWZ0Q2xpY2s6IHRoaXMucG9pbnRlckxlZnRDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgICAgICBvblJpZ2h0Q2xpY2s6IHRoaXMucG9pbnRlclJpZ2h0Q2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXHJcbiAgICAgICAgb25NaWRkbGVDbGljazogdGhpcy5wb2ludGVyTWlkZGxlQ2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gTG9hZCBTREtcclxuICAgICAgY29uc3Qgc2hvd2Nhc2VXaW5kb3cgPSBpZnJhbWUuY29udGVudFdpbmRvdztcclxuICAgICAgaWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuc2RrID0gYXdhaXQgKHNob3djYXNlV2luZG93IGFzIGFueSkuTVBfU0RLLmNvbm5lY3QoXHJcbiAgICAgICAgICAgIHNob3djYXNlV2luZG93LFxyXG4gICAgICAgICAgICB0aGlzLnNka0tleSxcclxuICAgICAgICAgICAgJydcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRDdXN0b21Dc3MoKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb2ludGVyU2VydmljZS5zdGFydEFkbWluQ3Vyc29yVHJhY2tlcihcclxuICAgICAgICAgIHRoaXMuc2RrLFxyXG4gICAgICAgICAgdGhpcy5jb250YWluZXIsXHJcbiAgICAgICAgICAoKSA9PiB0aGlzLnBvc2VNYXR0ZXJwb3J0LFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5wb3NlQ2FtZXJhXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gTG9hZCBNYXR0ZXJ0YWcgaWNvbnMgYW5kIGN1c3RvbSBzdWJzY3JpcHRpb25zXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkSWNvbnMuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLmN1c3RvbUljb25DYWNoZS5jbGVhcigpO1xyXG4gICAgICAgIGNvbnN0IGljb25SZWdpc3RyYXRpb25zOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcclxuICAgICAgICBzd2l0Y2ggKG1vZHVsZSkge1xyXG4gICAgICAgICAgY2FzZSBTcE1vZHVsZS5JTU1POlxyXG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uLXRpY2tldCcsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3RpY2tldCkpO1xyXG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uLWVxdWlwbWVudCcsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX2VxdWlwbWVudCkpO1xyXG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uLW1lYXN1cmUnLCB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9tZWFzdXJlKSk7XHJcbiAgICAgICAgICAgIGljb25SZWdpc3RyYXRpb25zLnB1c2godGhpcy5yZWdpc3Rlckljb24oJ2ljb24tZGF0YScsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX2RhdGEpKTtcclxuICAgICAgICAgICAgaWNvblJlZ2lzdHJhdGlvbnMucHVzaCh0aGlzLnJlZ2lzdGVySWNvbignaWNvbi1vYmplY3QzZCcsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX29iamVjdDNkKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNkay5NZWFzdXJlbWVudHMuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG9uQWRkZWQ6IGZ1bmN0aW9uIChcclxuICAgICAgICAgICAgICAgIGluZGV4OiBhbnksXHJcbiAgICAgICAgICAgICAgICBpdGVtOiB7IHBvaW50czogYW55IH0sXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBhbnlcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLnNldExhc3RNZWFzdXJlKGl0ZW0ucG9pbnRzKTtcclxuICAgICAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gKGNvbGxlY3Rpb246IGFueSkge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoZSBlbnRpcmUgdXAtdG8tZGF0ZSBjb2xsZWN0aW9uJywgY29sbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5nZXREaXN0YW5jZUZvckxhc3RNZWFzdXJlbWVudCh0aGlzLnNkaywgdGhpcy5jdXJyZW50U3BhY2VJRCk7XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZGsuTWVhc3VyZW1lbnRzLm1vZGUuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChtZWFzdXJlbWVudE1vZGVTdGF0ZTogeyBhY3RpdmU6IGFueSB9KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBtZWFzdXJlbWVudCBtb2RlIHN0YXRlIGhhcyBjaGFuZ2VkXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTWVhc3VyZU1vZGVPbiA9IG1lYXN1cmVtZW50TW9kZVN0YXRlLmFjdGl2ZTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdJcyBtZWFzdXJlbWVudCBtb2RlIGN1cnJlbnRseSBhY3RpdmU/ICcsIG1lYXN1cmVtZW50TW9kZVN0YXRlLmFjdGl2ZSk7XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBTcE1vZHVsZS5NVVNFVU06XHJcbiAgICAgICAgICAgIGljb25SZWdpc3RyYXRpb25zLnB1c2godGhpcy5yZWdpc3Rlckljb24oJ2ljb24tZGF0YScsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX2RhdGEpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFNwTW9kdWxlLkhPVEVMOlxyXG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uX3Jvb21fYXZhaWxhYmxlJywgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcm9vbV9hdmFpbGFibGUpKTtcclxuICAgICAgICAgICAgaWNvblJlZ2lzdHJhdGlvbnMucHVzaCh0aGlzLnJlZ2lzdGVySWNvbignaWNvbl9yb29tX3VuYXZhaWxhYmxlJywgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcm9vbV91bmF2YWlsYWJsZSkpO1xyXG4gICAgICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uX3Jvb21fY2hvc2VuJywgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcm9vbV9jaG9zZW4pKTtcclxuICAgICAgICAgICAgaWNvblJlZ2lzdHJhdGlvbnMucHVzaCh0aGlzLnJlZ2lzdGVySWNvbignaWNvbl9yb29tX3ZpZXdlZCcsIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3Jvb21fdmlld2VkKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpY29uUmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMucmVnaXN0ZXJJY29uKCdpY29uLXBvc2l0aW9uJywgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcG9zaXRpb24pKTtcclxuICAgICAgICB0aGlzLmljb25zUmVnaXN0ZXJlZCA9IFByb21pc2UuYWxsU2V0dGxlZChpY29uUmVnaXN0cmF0aW9ucykudGhlbigoKSA9PiB1bmRlZmluZWQpO1xyXG5cclxuICAgICAgICAvLyBDdXJyZW50IFJvb20gKHVzZWQgZm9yIGdldHRpbmcgYm91bmRpbmcgYm94IGFuZCBldmVudHVhbGx5IGxhenkgbG9hZCBtYXR0ZXJ0YWcgb3Igb2JqZWN0M0QgaW5zaWRlIGN1cnJlbnQgUm9vbSlcclxuICAgICAgICB0aGlzLnNkay5Sb29tLmN1cnJlbnQuc3Vic2NyaWJlKChjdXJyZW50Um9vbSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgcm9vbXMgPSBBcnJheS5pc0FycmF5KGN1cnJlbnRSb29tKSA/IGN1cnJlbnRSb29tIDogKGN1cnJlbnRSb29tID8gW2N1cnJlbnRSb29tXSA6IFtdKTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFJvb21zID0gcm9vbXM7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm9uUm9vbUNoYW5nZWQubmV4dChyb29tcyk7XHJcbiAgICAgICAgICAvLyBSZWZyZXNoIHRhZyB2aXNpYmlsaXR5IHdoZW5ldmVyIHRoZSByb29tIGNvbnRleHQgY2hhbmdlc1xyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoVGFnc1Zpc2liaWxpdHkoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gM0QgcG9zaXRpb24ncyBwb2ludGVyXHJcbiAgICAgICAgdGhpcy5zZGsuUG9pbnRlci5pbnRlcnNlY3Rpb24uc3Vic2NyaWJlKFxyXG4gICAgICAgICAgZnVuY3Rpb24gKGludGVyc2VjdGlvbjogYW55KSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zZU1hdHRlcnBvcnQgPSBpbnRlcnNlY3Rpb247XHJcbiAgICAgICAgICAgIHRoaXMucG9zZU1hdHRlcnBvcnQudGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMub2xkUG9zZU1hdHRlcnBvcnRQb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgIHRoaXMub2xkUG9zZU1hdHRlcnBvcnRQb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgejogMCxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGlvbk1vZGUgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUICYmIHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHtcclxuICAgICAgICAgICAgICAvLyBmb2xsb3cgdGhlIHBvaW50ZXIgYW5kIGNoYW5nZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IHRhZ1xyXG4gICAgICAgICAgICAgIC8vICh3ZSBhcmUgYWJvdXQgdG8gdmFsaWRhdGUsIGJ1dCBpdCBleGlzdHMgaW4gc2RrIGFscmVhZHkpXHJcbiAgICAgICAgICAgICAgdGhpcy5lbmFibGVfZm9sbG93aW5nX3RhZyh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucG9pbnRlclNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLnNldEN1cnNvclBvc2l0aW9uQnV0dG9uRGlzcGxheWVkKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy9DYW1lcmEgbW9kZVxyXG4gICAgICAgIHRoaXMuc2RrLk1vZGUuY3VycmVudC5zdWJzY3JpYmUoKG1vZGUpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmlzVW5yZXF1ZXN0ZWRGbG9vcnBsYW5Td2l0Y2godGhpcy5jYW1lcmFNb2RlLCBtb2RlKSkge1xyXG4gICAgICAgICAgICAvLyBUb3AtZG93biBkb2xsaG91c2UgY2FtZXJhIHJlcG9ydGVkIGFzIGZsb29ycGxhbjogc3RpbGwgZG9sbGhvdXNlLCBpZ25vcmUgaXRcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuY2FtZXJhTW9kZSAhPT0gbW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnNldENhbWVyYU1vZGUobW9kZSk7XHJcbiAgICAgICAgICAgIC8vIFJlZnJlc2ggdGFnIHZpc2liaWxpdHkgb24gZXZlcnkgbW9kZSBjaGFuZ2UgKElOU0lERSB2cyBET0xMSE9VU0UgdnMgRkxPT1JQTEFOKVxyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUYWdzVmlzaWJpbGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbWVyYU1vZGUgPSBtb2RlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLnNkayAmJiB0aGlzLnBvc2VDYW1lcmEpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXHJcbiAgICAgICAgICAgICAgdGhpcy5zZGssXHJcbiAgICAgICAgICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZSxcclxuICAgICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LFxyXG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UsXHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAxMDAwKTtcclxuXHJcbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIHN3ZWVwc1xyXG4gICAgICAgIHRoaXMuc2RrLlN3ZWVwLmRhdGEuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG9uQ29sbGVjdGlvblVwZGF0ZWQ6IGZ1bmN0aW9uIHN1YnNjcihjb2xsZWN0aW9uOiB7fSkge1xyXG4gICAgICAgICAgICB0aGlzLnN3ZWVwcyA9IE9iamVjdC5rZXlzKGNvbGxlY3Rpb24pO1xyXG4gICAgICAgICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XHJcbiAgICAgICAgICAgIC8vIFJlYnVpbGQgc2lkIOKGlCB1dWlkIG1hcHMgd2hlbmV2ZXIgdGhlIGNvbGxlY3Rpb24gdXBkYXRlc1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmJ1aWxkU3dlZXBJZE1hcHMoY29sbGVjdGlvbik7XHJcbiAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHN1YnNjcmliZSB0byBjdXJyZW50IHN3ZWVwIOKAkyBlbWl0IHV1aWQgKERCIGZvcm1hdCkgaW5zdGVhZCBvZiByYXcgc2lkXHJcbiAgICAgICAgdGhpcy5zZGsuU3dlZXAuY3VycmVudC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICBmdW5jdGlvbiBzdWJzY3IoY3VycmVudFN3ZWVwOiB7IHNpZDogc3RyaW5nIH0pIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTd2VlcC5zaWQgPT09ICcnKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHV1aWQgPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQoY3VycmVudFN3ZWVwLnNpZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN3ZWVwLm5leHQodXVpZCk7XHJcbiAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBTdWJzY3JpYmUgdG8gRmxvb3IgZGF0YVxyXG4gICAgICAgIHRoaXMuc2RrLkZsb29yLmRhdGEuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG9uQ29sbGVjdGlvblVwZGF0ZWQ6IGZ1bmN0aW9uIHVwZCh0aGlzOiBhbnksIGNvbGxlY3Rpb246IGFueSkge1xyXG4gICAgICAgICAgICB0aGlzLmZsb29ycyA9IE9iamVjdC52YWx1ZXMoY29sbGVjdGlvbik7XHJcbiAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBjdXJyZW50IGZsb29yIOKAkyBhdXRob3JpdGF0aXZlIHNvdXJjZSBmb3IgbXVsdGktZmxvb3IgZmlsdGVyaW5nXHJcbiAgICAgICAgdGhpcy5zZGsuRmxvb3IuY3VycmVudC5zdWJzY3JpYmUoKGN1cnJlbnRGbG9vcjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzZXEgPSBjdXJyZW50Rmxvb3I/LnNlcXVlbmNlID8/IG51bGw7XHJcbiAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlID0gc2VxO1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbRmxvb3IuY3VycmVudF0gc2VxdWVuY2UgPScsIHNlcSwgJ3wgZnVsbCA9JywgY3VycmVudEZsb29yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEdlbmVyaWMgaGFuZGxlciBmb3IgdGFnIHNlbGVjdGlvbiBldmVudHNcclxuICAgICAgICBjb25zdCBoYW5kbGVUYWdTZWxlY3Rpb24gPSBhc3luYyAoc2lkOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nLCBldnQ/OiBhbnkpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQoc2lkKTtcclxuICAgICAgICAgICAgaWYgKCFtYXR0ZXJ0YWdEYXRhKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRhZ1NlcnZpY2UuZ2V0VXJsRm9yU2VlRGV0YWlscyhcclxuICAgICAgICAgICAgICBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLFxyXG4gICAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmICh1cmwgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy52aXNpYmlsaXR5U2VydmljZS5kZXRhaWxTaG93aW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBzaG93IGRldGFpbHMgZm9yIHRhZycsIGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBEaXNhYmxlIG5hdGl2ZSBNYXR0ZXJwb3J0IGFjdGlvbnNcclxuICAgICAgICBjb25zdCBkaXNhYmxlTmF0aXZlQWN0aW9ucyA9IChzaWQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLnNkayB8fCBzaWQgPT09IHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHJldHVybjsgLy8gaWdub3JlIHdoZW4gd2UgYXJlIGluIHBvc2l0aW9uaW5nIG1vZGVcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCBzaWQpO1xyXG4gICAgICAgICAgICBpZiAodGFnTW9kdWxlPy5hbGxvd0FjdGlvbikge1xyXG4gICAgICAgICAgICAgIHRhZ01vZHVsZS5hbGxvd0FjdGlvbihzaWQsIHsgb3BlbmluZzogdHJ1ZSwgbmF2aWdhdGluZzogdHJ1ZSwgZG9ja2luZzogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICAvLyBzaWxlbnRseSBpZ25vcmUgYWxyZWFkeSByZW1vdmVkIHRhZ3NcclxuICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmICFlPy5tZXNzYWdlPy5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ01hdHRlcnBvcnRTZXJ2aWNlOiBFcnJvciBkaXNhYmxpbmcgYWN0aW9ucyBmb3InLCBzaWQsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHJlYWNoIFBMQVlJTkcgcGhhc2VcclxuICAgICAgICBpZiAodGhpcy5zZGsuQXBwICYmIHRoaXMuc2RrLkFwcC5zdGF0ZSkge1xyXG4gICAgICAgICAgdGhpcy5zZGsuQXBwLnN0YXRlLndhaXRVbnRpbCgoczogYW55KSA9PiBzLnBoYXNlID09PSB0aGlzLnNkay5BcHAuUGhhc2UuUExBWUlORykudGhlbihhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29tbW9uIGxheWVyIGhvbGRpbmcgZXZlcnkgdGFnIGJlZm9yZSBhbnkgdGFnIGlzIGFkZGVkLCBzbyB0aGF0XHJcbiAgICAgICAgICAgIC8vIHRhZ3MgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBmdXJuaXNoZWQgYW5kIHRoZSBkZWZ1cm5pc2hlZCB2aWV3cy5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5lbnN1cmVTaGFyZWRUYWdMYXllcih0aGlzLnNkayk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFZpZXdzKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNkay5DYW1lcmEucG9zZS5zdWJzY3JpYmUoKHBvc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucG9zZUNhbWVyYSA9IHBvc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNkayxcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dlZXBDb2xsZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZSxcclxuICAgICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3csXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZGssXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbixcclxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudENhbWVyYU1vZGUsXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSxcclxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSwgMTUwMCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGlvbk1vZGUgPT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldyh0aGlzLnNkayk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNkay5UYWcgJiYgdGhpcy5zZGsuVGFnLmRhdGEpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNkay5UYWcuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgb25BZGRlZDogKHNpZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVOYXRpdmVBY3Rpb25zKHNpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb25VcGRhdGVkOiAoc2lkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZU5hdGl2ZUFjdGlvbnMoc2lkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvbkNvbGxlY3Rpb25VcGRhdGVkOiAoY29sbGVjdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbGxlY3Rpb24pLmZvckVhY2goKHNpZCkgPT4gZGlzYWJsZU5hdGl2ZUFjdGlvbnMoc2lkKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRmFsbGJhY2sgcG91ciBsJ8OpdsOpbmVtZW50IGdsb2JhbCB0YWcuY2xpY2tcclxuICAgICAgICB0aGlzLnNkay5vbigndGFnLmNsaWNrJywgKHNpZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNYXR0ZXJwb3J0U2VydmljZV0gc2RrLm9uKCd0YWcuY2xpY2snKSByZWNlaXZlZCBmb3Igc2lkOiAke3NpZH1gKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGhhbmRsZVRhZ1NlbGVjdGlvbihzaWQsICdnbG9iYWwudGFnLmNsaWNrJyk7XHJcbiAgICAgICAgICBkaXNhYmxlTmF0aXZlQWN0aW9ucyhzaWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFBvaW50ZXIgdHJpY2tcclxuICAgICAgICAvLyBDcmVhdGUgYSBkaXYgdGhhdCB3aWxsIGFwcGVhciB3aGVuIHRoZSBjdXJzb3IgaXMgc3RpbGxcclxuICAgICAgICAvLyBJdCB3aWxsIGludGVyY2VwdCB0aGUgY2xpY2sgb2YgdGhlIG1vdXNlIGJlZm9yZSBpdCB0cmlnZXJyaW5nIHRoZSBNYXR0ZXJwb3J0J3MgdG91ciBuYXZpZ2F0aW9uXHJcbiAgICAgICAgdGhpcy5wb2ludGVyU2VydmljZS5zdGFydFBvaW50ZXJUcmljayhcclxuICAgICAgICAgIHRoaXMuc2RrLFxyXG4gICAgICAgICAgdGhpcy5jb250YWluZXIsXHJcbiAgICAgICAgICAoKSA9PiB0aGlzLnBvc2VNYXR0ZXJwb3J0LFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5wb3NlQ2FtZXJhLFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5pbnRlcmFjdGlvbk1vZGUsXHJcbiAgICAgICAgICAoKSA9PiB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgKiBUcmFuc2l0aW9uc1xyXG4gICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zZGsub24oXHJcbiAgICAgICAgICAndmlld21vZGUuY2hhbmdlc3RhcnQnLFxyXG4gICAgICAgICAgZnVuY3Rpb24gKHRvLCBmcm9tKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1N0YXJ0aW5nIHRvIG1vdmUgdG8gJyArIHRvICsgJyBmcm9tICcgKyBmcm9tKTtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Nb2RlID0gdHJ1ZTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zZGsub24oXHJcbiAgICAgICAgICAndmlld21vZGUuY2hhbmdlZW5kJyxcclxuICAgICAgICAgIGZ1bmN0aW9uIChvbGRNb2RlLCBuZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0VuZGVkIHRvIG1vdmUgdG8gJyArIG5ld01vZGUgKyAnIGZyb20gJyArIG9sZE1vZGUpO1xyXG4gICAgICAgICAgICBpZiAobmV3TW9kZSAhPT0gJ21vZGUudHJhbnNpdGlvbmluZycpIHtcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvbk1vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNkay5vbihcclxuICAgICAgICAgIHRoaXMuc2RrLlN3ZWVwLkV2ZW50LkVOVEVSLFxyXG4gICAgICAgICAgZnVuY3Rpb24gKG9sZFN3ZWVwLCBuZXdTd2VlcCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdMZWF2aW5nIHN3ZWVwICcgKyBvbGRTd2VlcCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0VudGVyaW5nIHN3ZWVwICcgKyBuZXdTd2VlcCk7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uU3dlZXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5QXppbXV0YWxDcm93bigpO1xyXG4gICAgICAgICAgICAvLyBSZWZyZXNoIG9uIHN3ZWVwIGlzIHJlbW92ZWQgYmVjYXVzZSB3ZSBvbmx5IHVwZGF0ZSBvbiByb29tIG9yIGZsb29yIGNoYW5nZXMgbm93LlxyXG4gICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNkay5vbihcclxuICAgICAgICAgIHRoaXMuc2RrLlN3ZWVwLkV2ZW50LkVYSVQsXHJcbiAgICAgICAgICBmdW5jdGlvbiAoZnJvbVN3ZWVwLCB0b1N3ZWVwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0xlYXZpbmcgc3dlZXAgJyArIGZyb21Td2VlcCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1RyYW5zaXRpb25pbmcgdG8gc3dlZXAgJyArIHRvU3dlZXApO1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvblN3ZWVwID0gdHJ1ZTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0M0RPYmplY3RWaWV3ZXIoKTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIFVzZSBuYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKCkgaW5zdGVhZC5cclxuICAgKiBLZXB0IHRlbXBvcmFyaWx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cclxuICAgKi9cclxuICBnZXRTd2VlcFVVSURGb3JTaWQoc2lkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQoc2lkKSAhPT0gc2lkXHJcbiAgICAgID8gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKHNpZClcclxuICAgICAgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2V0TGlnaHRpbmdPZmYoKSB7XHJcbiAgICB0aGlzLm5vTGlnaHRGb3JPYmplY3RzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldERpc3RhbmNlRm9yTGFzdE1lYXN1cmVtZW50KCkge1xyXG4gICAgdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0RGlzdGFuY2VGb3JMYXN0TWVhc3VyZW1lbnQodGhpcy5zZGssIHRoaXMuY3VycmVudFNwYWNlSUQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFzdERpc3RhbmNlcygpIHtcclxuICAgIHJldHVybiB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5nZXRMYXN0RGlzdGFuY2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUYWtlcyBzY3JlZW5zaG90IGFuZCBzYXZlcyBiYXNlNjQgaW4gbGFzdFNjcmVlbnNob3RVcmlcclxuICAgKiBAcmV0dXJucyBQcm9taXNlXHJcbiAgICovXHJcbiAgdGFrZVNjcmVlblNob3QoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLm1lYXN1cmVtZW50U2VydmljZS50YWtlU2NyZWVuU2hvdCh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBnZXRTY3JlZW5TaG90VXJpKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldFNjcmVlblNob3RVcmkoKTtcclxuICB9XHJcblxyXG4gIGdldExhc3RNZWFzdXJlbWVudCgpOiBPYmplY3Qge1xyXG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldExhc3RNZWFzdXJlbWVudCh0aGlzLnBvc2VDYW1lcmEpO1xyXG4gIH1cclxuXHJcbiAgLy9cclxuICAvLyAtLS0tLS0tLS0tIFV0aWxzIC0tLS0tLS0tLS1cclxuICAvL1xyXG4gIHByaXZhdGUgZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGEsIHRoaXMuc3dlZXBDb2xsZWN0aW9uKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU3R5bGluZyBvZiBwb2ludGVyXHJcbiAgICovXHJcbiAgdXBkYXRlUG9pbnRlclRyaWNrKCkge1xyXG4gICAgdGhpcy5wb2ludGVyU2VydmljZS51cGRhdGVQb2ludGVyVHJpY2sodGhpcy5zZGssIHRoaXMuY29udGFpbmVyLCB0aGlzLnBvc2VNYXR0ZXJwb3J0LCB0aGlzLnBvc2VDYW1lcmEsIHRoaXMuaW50ZXJhY3Rpb25Nb2RlLCB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyaWdnZXJzIGEgdGFnIHZpc2liaWxpdHkgcmVmcmVzaCBiYXNlZCBvbiBjdXJyZW50IGNhbWVyYSBtb2RlLCBmbG9vciBhbmQgc3dlZXAuXHJcbiAgICogRGVsZWdhdGVzIGFsbCBsb2dpYyB0byBNYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoKS5cclxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBvbiBNb2RlLCBTd2VlcCwgRmxvb3IgYW5kIFJvb20gY2hhbmdlcy5cclxuICAgKi9cclxuICBwdWJsaWMgcmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk6IHZvaWQge1xyXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSAmJiB0aGlzLnN3ZWVwQ29sbGVjdGlvbiAmJiB0aGlzLnBvc2VDYW1lcmE/LnN3ZWVwKSB7XHJcbiAgICAgICAgY29uc3Qgc3dlZXBEYXRhID0gdGhpcy5zd2VlcENvbGxlY3Rpb25bdGhpcy5wb3NlQ2FtZXJhLnN3ZWVwXTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKCdbcmVmcmVzaFRhZ3NWaXNpYmlsaXR5XSBzd2VlcERhdGEgZm9yIGN1cnJlbnQgc3dlZXA6JywgSlNPTi5zdHJpbmdpZnkoc3dlZXBEYXRhKSk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW3JlZnJlc2hUYWdzVmlzaWJpbGl0eV0gY3VycmVudEZsb29yU2VxdWVuY2U6JywgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW3JlZnJlc2hUYWdzVmlzaWJpbGl0eV0gY3VycmVudENhbWVyYU1vZGU6JywgdGhpcy5jdXJyZW50Q2FtZXJhTW9kZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXHJcbiAgICAgICAgdGhpcy5zZGssXHJcbiAgICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FtZXJhTW9kZSxcclxuICAgICAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LFxyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UsXHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcclxuICAgICAgKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIHJlZnJlc2hUYWdzVmlzaWJpbGl0eSBlcnJvcicsIGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWFsdGltZSBtYXR0ZXJ0YWcgZm9sbG93aW5nIHRoZSBjdXJzb3JcclxuICAgKiBAcGFyYW0gbWF0dGVydGFnIHN0cmluZ1xyXG4gICAqL1xyXG4gIGVuYWJsZV9mb2xsb3dpbmdfdGFnKG1hdHRlcnRhZzogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBPRkZTRVQgPSAwLjAwMDE7IC8vIHF1YXNpLWludmlzaWJsZSBtYWlzIHN1ZmZpdCDDoCDDqXZpdGVyIGwnaW50ZXJjZXB0aW9uXHJcbiAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldFRhZ01vZHVsZSh0aGlzLnNkaywgbWF0dGVydGFnKS5lZGl0UG9zaXRpb24obWF0dGVydGFnLCB7XHJcbiAgICAgIGFuY2hvclBvc2l0aW9uOiB7XHJcbiAgICAgICAgeDogdGhpcy5wb3NlTWF0dGVycG9ydC5wb3NpdGlvbi54ICsgT0ZGU0VULFxyXG4gICAgICAgIHk6IHRoaXMucG9zZU1hdHRlcnBvcnQucG9zaXRpb24ueSxcclxuICAgICAgICB6OiB0aGlzLnBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uLnogKyBPRkZTRVQsXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0ZW1WZWN0b3I6IHtcclxuICAgICAgICB4OiB0aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbC54ICogMC4zLFxyXG4gICAgICAgIHk6IHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsLnkgKiAwLjMsXHJcbiAgICAgICAgejogdGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWwueiAqIDAuMyxcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGRpc3RhbmNlIGJldHd3ZWVuIHR3byAzRCBwb3NpdGlvbnNcclxuICAgKiBVc2VkIGluIG9yZGVyIHRvIHNlZSBob3cgbXVjaCB0aGUgY3Vyc29yIGhhcyBtb3ZlZCBmcm9tIHRoZSBwcmV2aW91cyBwb3NpdGlvblxyXG4gICAqIEBwYXJhbSBwb3MxXHJcbiAgICogQHBhcmFtIHBvczJcclxuICAgKi9cclxuICBnZXREaXN0UG9zaXRpb24ocG9zMTogYW55LCBwb3MyOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLnBvaW50ZXJTZXJ2aWNlLmdldERpc3RQb3NpdGlvbih0aGlzLnNkaywgdGhpcy5jb250YWluZXIsIHRoaXMucG9zZUNhbWVyYSwgcG9zMSwgcG9zMik7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIC8vIC0tLS0tLS0tLS0gTWF0dGVydGFnIHJlbGF0ZWQgLS0tLS0tLS0tLVxyXG4gIC8vXHJcbiAgLyoqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgTWF0dGVydGFnIHRoYXQgZm9sbG93cyB0aGUgdXNlcidzIGN1cnNvciBmb3IgcG9zaXRpb25pbmcuICovXHJcbiAgYXN5bmMgYWRkQ3Vyc29yTWF0dGVydGFnKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEpIHtcclxuICAgIGlmICghdGhpcy5wb3NlTWF0dGVycG9ydCAmJiB0aGlzLnBvc2VDYW1lcmEpIHtcclxuICAgICAgdGhpcy5wb3NlTWF0dGVycG9ydCA9IHtcclxuICAgICAgICBwb3NpdGlvbjogeyAuLi50aGlzLnBvc2VDYW1lcmEucG9zaXRpb24gfSxcclxuICAgICAgICBub3JtYWw6IHsgeDogMCwgeTogLTAuMTUsIHo6IDAgfSxcclxuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnBvc2VNYXR0ZXJwb3J0KSB7XHJcbiAgICAgIC8vIEJvdGggcG9zZXMgY29tZSBmcm9tIFNESyBzdWJzY3JpcHRpb25zIHRoYXQgb25seSBzdGFydCBvbmNlIHRoZSBhcHAgcmVhY2hlcyBQTEFZSU5HLCBzbyBhblxyXG4gICAgICAvLyBlYXJseSBjbGljayBsYW5kcyBoZXJlLiBUaGUgY2FsbGVyIGFscmVhZHkgc3dpdGNoZWQgdG8gQURESU5HLCBhbmQgbGVhdmluZyBpdCB0aGVyZSBsb2Nrc1xyXG4gICAgICAvLyB0aGUgdmlld2VyIG91dCBvZiBpdHMgb3duIGd1YXJkIC0gZXZlcnkgbGF0ZXIgY2xpY2sgaXMgc2tpcHBlZCBiZWZvcmUgcmVhY2hpbmcgYW55IGNvZGUsXHJcbiAgICAgIC8vIHdoaWNoIHJlYWRzIGFzIGEgcGVybWFuZW50bHkgZGVhZCBidXR0b24gcmF0aGVyIHRoYW4gb25lIGZhaWxlZCBhdHRlbXB0LlxyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAnYWRkQ3Vyc29yTWF0dGVydGFnOiBubyBwb2ludGVyIG9yIGNhbWVyYSBwb3NlIHlldCAtIHRoZSBNYXR0ZXJwb3J0IFNESyBoYXMgbm90IHJlYWNoZWQgJyArXHJcbiAgICAgICAgICAnUExBWUlORywgc28gdGhlcmUgaXMgbm93aGVyZSB0byBhbmNob3IgdGhlIHRhZy4gV2FpdCBmb3IgdGhlIG1vZGVsIHRvIGZpbmlzaCBsb2FkaW5nLicsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gYXdhaXQgdGhpcy5hZGRNYXR0ZXJ0YWdUb1ZpZXdlcihtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICBpZiAoIXRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ2FkZEN1cnNvck1hdHRlcnRhZzogdGFnIGNyZWF0aW9uIGZhaWxlZCwgbWF0dGVydGFnVG9Gb2xsb3cgaXMgbnVsbCcpO1xyXG4gICAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB3YWl0KDUwKTtcclxuICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0SWNvbih0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LCAnaWNvbi1wb3NpdGlvbicpO1xyXG4gICAgICBhd2FpdCB0YWdNb2R1bGUuZWRpdE9wYWNpdHkodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywgMSk7XHJcbiAgICAgIGF3YWl0IHRhZ01vZHVsZS5lZGl0UG9zaXRpb24odGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywge1xyXG4gICAgICAgIGFuY2hvclBvc2l0aW9uOiB7IC4uLnRoaXMucG9zZU1hdHRlcnBvcnQucG9zaXRpb24gfSxcclxuICAgICAgICBzdGVtVmVjdG9yOiB7XHJcbiAgICAgICAgICB4OiAodGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWw/LnggPz8gMCkgKiAwLjMsXHJcbiAgICAgICAgICB5OiAodGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWw/LnkgPz8gLTAuMTUpICogMC4zLFxyXG4gICAgICAgICAgejogKHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsPy56ID8/IDApICogMC4zLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGF3YWl0IHRhZ01vZHVsZS5hbGxvd0FjdGlvbih0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LCB7XHJcbiAgICAgICAgb3BlbmluZzogdHJ1ZSwgbmF2aWdhdGluZzogZmFsc2UsIGRvY2tpbmc6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignYWRkQ3Vyc29yTWF0dGVydGFnOiBlcnJvciBjb25maWd1cmluZyBjdXJzb3IgdGFnJywgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHRhZ0FkZFF1ZXVlKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS50YWdBZGRRdWV1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgdGFnQWRkUXVldWUodmFsdWU6IFByb21pc2U8YW55Pikge1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS50YWdBZGRRdWV1ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkTWF0dGVydGFnVG9WaWV3ZXIobWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuYWRkTWF0dGVydGFnVG9WaWV3ZXIodGhpcy5zZGssIG1hdHRlcnRhZ0RhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRyaWdnZXJzIGNhbGxiYWNrIGFjdGlvbnMgYWZ0ZXIgYSB0YWcncyBwb3NpdGlvbiBpcyB2YWxpZGF0ZWQgYnkgYSBsZWZ0IGNsaWNrLiAqL1xyXG4gIG9uVmFsaWRhdGVkTWF0dGVydGFnKCkge1xyXG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQpO1xyXG4gICAgY29uc3QgbGFzdFRhZyA9IHRoaXMuZ2V0TGFzdFRhZygpO1xyXG4gICAgaWYgKGxhc3RUYWcpIHtcclxuICAgICAgY29uc3QgY2FsbGJhY2tNb2RlID0gdGhpcy5kaWN0aW9ubmFyeVRhZ3NcclxuICAgICAgICAuZ2V0KGxhc3RUYWcpXHJcbiAgICAgICAgLmdldENhbGxiYWNrQWN0aW9uTW9kZSgpO1xyXG4gICAgICB0aGlzLmNhbGxiYWNrQWZ0ZXJNYXR0ZXJ0YWdWYWxpZGF0aW9uKGNhbGxiYWNrTW9kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogUmVnaXN0ZXJzIGEgbmV3IGljb24gdGV4dHVyZSBhbmQgYXBwbGllcyBpdCB0byBhIHNwZWNpZmljIE1hdHRlcnRhZy4gKi9cclxuICBhc3luYyBhZGROZXdJY29uQW5kU2V0Rm9yVGFnKG1hdHRlcnRhZ0lEOiBzdHJpbmcsIGljb25QYXRoOiBzdHJpbmcpIHtcclxuICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuYWRkTmV3SWNvbkFuZFNldEZvclRhZyhcclxuICAgICAgdGhpcy5zZGssXHJcbiAgICAgIG1hdHRlcnRhZ0lELFxyXG4gICAgICBpY29uUGF0aCxcclxuICAgICAgZmFsc2UsXHJcbiAgICAgIDFcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogQXBwbGllcyBhIHByZS1yZWdpc3RlcmVkIGljb24gdG8gYSBNYXR0ZXJ0YWcuICovXHJcbiAgYXN5bmMgc2V0UmVnaXN0cmVkSWNvbkZvclRhZyhtYXR0ZXJ0YWdJRDogc3RyaW5nLCBpY29uTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmVkaXRUYWdJY29uKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ291bGQgbm90IGVkaXQgaWNvbicsIGljb25OYW1lLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBSZWdpc3RlcnMgYSBzdGF0aWMgdGV4dHVyZSBhbmQgcmVtZW1iZXJzIGl0cyBuYW1lIG9uY2UgdGhlIFNESyBhY2NlcHRlZCBpdC4gKi9cclxuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVySWNvbihpY29uTmFtZTogc3RyaW5nLCBpY29uUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWljb25QYXRoKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoaWNvbk5hbWUsIGljb25QYXRoKTtcclxuICAgICAgdGhpcy5yZWdpc3RlcmVkSWNvbnMuYWRkKGljb25OYW1lKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oYFtNYXR0ZXJwb3J0U2VydmljZV0gJHtpY29uTmFtZX0gdGV4dHVyZSByZWdpc3RyYXRpb24gZmFpbGVkYCwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIFNldHMgdGhlIGFwcHJvcHJpYXRlIGljb24gZm9yIGEgdGFnIGJhc2VkIG9uIGl0cyB0eXBlIGFuZCBQT0kgbWV0YWRhdGEuICovXHJcbiAgYXN5bmMgc2V0VGFnSWNvbkFuZE9wYWNpdHkoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YVxyXG4gICkge1xyXG4gICAgYXdhaXQgdGhpcy5pY29uc1JlZ2lzdGVyZWQ7XHJcbiAgICBpZiAodGhpcy5TUE1vZHVsZSA9PT0gU3BNb2R1bGUuSE9URUwpIHtcclxuICAgICAgY29uc3Qgcm9vbSA9IG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCk7XHJcbiAgICAgIGxldCBpY29uTmFtZSA9IGBpY29uX3Jvb21gO1xyXG4gICAgICBpZiAocm9vbS5hdmFpbGFibGUpIHtcclxuICAgICAgICBpY29uTmFtZSA9IGAke2ljb25OYW1lfV9hdmFpbGFibGVgO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGljb25OYW1lID0gYCR7aWNvbk5hbWV9X3VuYXZhaWxhYmxlYDtcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCB0aGlzLmVkaXRUYWdJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHN0cmluZ1RhZ1R5cGUgPSBwb2lUeXBlVG9TdHJpbmcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCkpO1xyXG4gICAgbGV0IGljb25OYW1lID0gYGljb24tJHtzdHJpbmdUYWdUeXBlfWA7XHJcbiAgICBjb25zdCBwb2kgPSBtYXR0ZXJ0YWdEYXRhLmdldFBvaSgpO1xyXG4gICAgaWYgKHBvaSAmJiBwb2kudGFnSWNvbikge1xyXG4gICAgICBjb25zdCB0YWdJY29uID0gSlNPTi5wYXJzZShwb2kudGFnSWNvbik7XHJcbiAgICAgIGlmIChtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSA9PT0gUG9pVHlwZS5EQVRBKSB7XHJcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCk7XHJcbiAgICAgICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gRmVhdHVyZVR5cGUuSU5ESUNBVE9SX1RFTVApIHtcclxuICAgICAgICAgIHRhZ0ljb24uc3JjID0gdGhpcy50YWdTZXJ2aWNlLmdldEljb25UYWdJbWFnZUZvckZlYXR1cmUoZmVhdHVyZSwgcG9pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRhZ0ljb24uc3JjKSB7XHJcbiAgICAgICAgLy8ga2V5ZWQgb24gdGhlIHN0b3JlZCBzb3VyY2UsIG5vdCBvbiB0aGUgc2lnbmVkIFVSTDogYSBuZXcgc2lnbmF0dXJlIGV2ZXJ5IGNhbGxcclxuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmN1c3RvbUljb25DYWNoZS5nZXQobWF0dGVydGFnSUQpO1xyXG4gICAgICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLnNyYyA9PT0gdGFnSWNvbi5zcmMpIHtcclxuICAgICAgICAgIGljb25OYW1lID0gY2FjaGVkLmljb25OYW1lO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBwYXRoU2lnbmVkID0gYXdhaXQgdGhpcy50YWdTZXJ2aWNlLmdldFNpZ25lZFRhZ0ljb25Tb3VyY2UoXHJcbiAgICAgICAgICAgIHRhZ0ljb24uc3JjXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKHBhdGhTaWduZWQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBjb25zdCBjdXN0b21JY29uTmFtZSA9IGBpY29uLSR7c3RyaW5nVGFnVHlwZX0tJHttYXR0ZXJ0YWdJRH0tJHttYXR0ZXJ0YWdEYXRhLmN1c3RvbUljb25JbmRleH1gO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShjdXN0b21JY29uTmFtZSwgcGF0aFNpZ25lZCk7XHJcbiAgICAgICAgICAgICAgbWF0dGVydGFnRGF0YS5jdXN0b21JY29uSW5kZXggKz0gMTtcclxuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUljb25DYWNoZS5zZXQobWF0dGVydGFnSUQsIHsgc3JjOiB0YWdJY29uLnNyYywgaWNvbk5hbWU6IGN1c3RvbUljb25OYW1lIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZEljb25zLmFkZChjdXN0b21JY29uTmFtZSk7XHJcbiAgICAgICAgICAgICAgaWNvbk5hbWUgPSBjdXN0b21JY29uTmFtZTtcclxuICAgICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHJlZ2lzdGVySWNvbicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLmVkaXRUYWdJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBsaWVzIGFuIGljb24gdG8gYSB0YWcsIHVubGVzcyB0aGF0IGljb24gaXMgYWxyZWFkeSB0aGUgb25lIGFwcGxpZWQuIFRoZSBjYWxsIGlzXHJcbiAgICogYXdhaXRlZCBhbmQgaXRzIHJlamVjdGlvbiByZXBvcnRlZDogYSBzaWxlbnRseSBkcm9wcGVkIHByb21pc2UgaGVyZSBsZWF2ZXMgdGhlIHBpblxyXG4gICAqIHdpdGggaXRzIGRlZmF1bHQgd2hpdGUgbG9vay5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGVkaXRUYWdJY29uKG1hdHRlcnRhZ0lEOiBzdHJpbmcsIGljb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldENhY2hlZFRhZ0ljb24obWF0dGVydGFnSUQpID09PSBpY29uTmFtZSkgcmV0dXJuO1xyXG4gICAgLy8gQSB0ZXh0dXJlIHRoYXQgd2FzIG5ldmVyIHJlZ2lzdGVyZWQgKG5vIGljb24gY29uZmlndXJlZCBmb3IgdGhpcyB0eXBlKSBjYW4gb25seSBmYWlsOlxyXG4gICAgLy8gdGhlIHBpbiBrZWVwcyBpdHMgZGVmYXVsdCBsb29rLCBhcyBiZWZvcmUsIHdpdGhvdXQgYSBkb29tZWQgU0RLIGNhbGwuXHJcbiAgICBpZiAoIXRoaXMucmVnaXN0ZXJlZEljb25zLmhhcyhpY29uTmFtZSkpIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZWRpdFRhZ0ljb24odGhpcy5zZGssIG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSBlZGl0SWNvbiBmYWlsZWQgZm9yJywgbWF0dGVydGFnSUQsIGljb25OYW1lLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTmF2aWdhdGVzIHRoZSBjYW1lcmEgdG8gdGhlIG1vc3QgcmVjZW50bHkgY3JlYXRlZCB0YWcuICovXHJcbiAgYXN5bmMgZ29Ub0xhc3RUYWcoKSB7XHJcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdvVG9MYXN0VGFnKHRoaXMuc2RrKTtcclxuICB9XHJcblxyXG4gIC8qKiBOYXZpZ2F0ZXMgdGhlIGNhbWVyYSB0byBhIHNwZWNpZmljIE1hdHRlcnRhZyBieSBpdHMgSUQuICovXHJcbiAgYXN5bmMgZ29Ub1RhZyhtYXR0ZXJ0YWdJRDogc3RyaW5nKSB7XHJcbiAgICBpZiAoIW1hdHRlcnRhZ0lELyogfHwgdGhpcy5pblRyYW5zaXRpb25Td2VlcCovKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25Hb1RvVGFnLm5leHQobWF0dGVydGFnSUQpO1xyXG4gICAgICBhd2FpdCB0aGlzLnNkay5Td2VlcC5jdXJyZW50LndhaXRVbnRpbChcclxuICAgICAgICAoY3VycmVudFN3ZWVwKSA9PiBjdXJyZW50U3dlZXAgIT09ICcnXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IG10RGF0YSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCk7XHJcbiAgICAgIGlmIChtdERhdGEpIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG10RGF0YS5nZXRQb3NpdGlvbigpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2RrLkNhbWVyYS5sb29rQXQocG9zaXRpb24sIHtcclxuICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMuc2RrLkNhbWVyYS5UcmFuc2l0aW9uVHlwZS5GTFlcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBgb3BlbmAgb25seSBleGlzdHMgb24gdGhlIGdsb2JhbCBUYWcgbW9kdWxlLCBuZXZlciBvbiBhIGxheWVyLXNjb3BlZCBvbmUuXHJcbiAgICAgIGF3YWl0IHRoaXMuc2RrLlRhZy5vcGVuKG1hdHRlcnRhZ0lEKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdDYW5ub3QgbmF2aWdhdGUgdG8gdGFnJywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZSB0aGUgdmlld2VyIGNhbWVyYSB0byBhIHNwZWNpZmljIDNEIHBvc2l0aW9uIGFuZCBhcHBseSBhIHJvdGF0aW9uLlxyXG4gICAqIERlbGVnYXRlcyB0aGUgaGVhdnkgbGlmdGluZyB0byBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2UubW92ZV90b19wb3NpdGlvbi5cclxuICAgKiAtIHBvc2l0aW9uOiB7IHgsIHksIHogfVxyXG4gICAqIC0gcm90YXRpb246IHsgeWF3LCBwaXRjaD8sIHJvbGw/IH0gaW4gZGVncmVlcyBieSBkZWZhdWx0XHJcbiAgICogLSBvcHRpb25zOiBvcHRpb25hbCB0cmFuc2l0aW9uIGFuZCBjb252ZXJzaW9uIHNldHRpbmdzIChzZWUgbmF2aWdhdGlvbiBzZXJ2aWNlKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnb1RvUG9zaXRpb24oXHJcbiAgICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0sXHJcbiAgICByb3RhdGlvbjogeyB5YXc6IG51bWJlcjsgcGl0Y2g/OiBudW1iZXI7IHJvbGw/OiBudW1iZXIgfSB8IG51bGwgPSBudWxsLFxyXG4gICAgb3B0aW9ucz86IHtcclxuICAgICAgdHJhbnNpdGlvbj86ICdGTFknIHwgJ0lOU1RBTlQnIHwgJ0lNTUVESUFURSc7XHJcbiAgICAgIGR1cmF0aW9uTXM/OiBudW1iZXI7XHJcbiAgICAgIGFuZ2xlc0luRGVncmVlcz86IGJvb2xlYW47XHJcbiAgICAgIG9mZnNldD86IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG4gICAgfVxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gRW5zdXJlIFNESyBpcyBpbml0aWFsaXplZFxyXG4gICAgaWYgKCF0aGlzLnNkaykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHRlcnBvcnQgU0RLIGlzIG5vdCBpbml0aWFsaXplZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFByZXZlbnQgY29uY3VycmVudCBuYXZpZ2F0aW9uIGlmIGFscmVhZHkgaW4gYSBzd2VlcC9tb2RlIHRyYW5zaXRpb25cclxuICAgIGlmICh0aGlzLmluVHJhbnNpdGlvbk1vZGUgfHwgdGhpcy5pblRyYW5zaXRpb25Td2VlcCkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUuZGVidWcoJ2dvVG9Qb3NpdGlvbiBhYm9ydGVkOiB2aWV3ZXIgaXMgaW4gdHJhbnNpdGlvbicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gTWFyayB0cmFuc2l0aW9uIHN0YXRlIG9uIG5hdmlnYXRpb24gc2VydmljZSAobW92ZV90b19wb3NpdGlvbiB3aWxsIGFsc28gbWFuYWdlIGZsYWdzKVxyXG4gICAgICB0aGlzLmluVHJhbnNpdGlvbk1vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gRGVsZWdhdGUgdG8gbmF2aWdhdGlvbiBzZXJ2aWNlIHdoaWNoIGNvbnRhaW5zIHRoZSByb2J1c3QgbW92ZV90b19wb3NpdGlvbiBpbXBsZW1lbnRhdGlvblxyXG4gICAgICBhd2FpdCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm1vdmVfdG9fcG9zaXRpb24odGhpcy5zZGssIHBvc2l0aW9uLCByb3RhdGlvbiwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAvLyBVcGRhdGUgbG9jYWwgY2FjaGVkIGNhbWVyYSBpbmZvXHJcbiAgICAgIHRoaXMubGFzdENhbWVyYVBvc2l0aW9uID0geyAuLi5wb3NpdGlvbiB9O1xyXG4gICAgICAvLyBFbWl0IGEgc2ltcGxpZmllZCBjdXJyZW50IGNhbWVyYSBwb3NlIGZvciBzdWJzY3JpYmVyc1xyXG4gICAgICB0aGlzLmN1cnJlbnRDYW1lcmFQb3NlLm5leHQoe1xyXG4gICAgICAgIHBvc2l0aW9uOiB7IC4uLnBvc2l0aW9uIH0sXHJcbiAgICAgICAgcm90YXRpb246IHJvdGF0aW9uID8geyAuLi5yb3RhdGlvbiB9IDogbnVsbCxcclxuICAgICAgICBzd2VlcDogdGhpcy5wb3NlQ2FtZXJhPy5zd2VlcCA/PyBudWxsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnZ29Ub1Bvc2l0aW9uIGNvbXBsZXRlZCcsIHsgcG9zaXRpb24sIHJvdGF0aW9uLCBvcHRpb25zIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLmVycm9yKCdnb1RvUG9zaXRpb24gZXJyb3InLCBlcnIpO1xyXG4gICAgICB0aHJvdyBlcnI7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICAvLyBFbnN1cmUgdHJhbnNpdGlvbiBmbGFnIGlzIGNsZWFyZWQgKG5hdmlnYXRpb24gc2VydmljZSBtYXkgYWxzbyBjbGVhciBpdClcclxuICAgICAgdGhpcy5pblRyYW5zaXRpb25Nb2RlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICogQ29tcHV0ZXMgdGhlIGNvbnRleHQtYXdhcmUgb3BhY2l0eSBmb3IgYSBzaW5nbGUgdGFnIGF0IHRoZSBtb21lbnQgaXQgaXMgcmVuZGVyZWQuXHJcbiAgICAqIC0gQ3Vyc29yIHRhZzogYWx3YXlzIHVzZSBwcm92aWRlZCBkZWZhdWx0T3BhY2l0eS5cclxuICAgICogLSBET0xMSE9VU0UgLyBGTE9PUlBMQU46IDAgKGhpZGRlbikuXHJcbiAgICAqIC0gSU5TSURFOiBmbG9vci1maWx0ZXJlZCBwcm94aW1pdHkgb3BhY2l0eSB2aWEgTWF0dGVycG9ydFRhZ1NlcnZpY2UuXHJcbiAgICAqIC0gT3RoZXIgLyB1bmtub3duOiBkZWZhdWx0T3BhY2l0eS5cclxuICAgICovXHJcbiAgLypwcml2YXRlIF9jb21wdXRlQ29udGV4dE9wYWNpdHlGb3JUYWcoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSxcclxuICAgIGRlZmF1bHRPcGFjaXR5OiBudW1iZXJcclxuICApOiBudW1iZXIge1xyXG4gICAgaWYgKG1hdHRlcnRhZ0lEID09PSB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSB7XHJcbiAgICAgIHJldHVybiBkZWZhdWx0T3BhY2l0eTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmNvbXB1dGVTaW5nbGVUYWdDb250ZXh0T3BhY2l0eShcclxuICAgICAgbWF0dGVydGFnRGF0YSxcclxuICAgICAgdGhpcy5wb3NlQ2FtZXJhLFxyXG4gICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbixcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSxcclxuICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcclxuICAgICk7XHJcbiAgfSovXHJcblxyXG4gIHByaXZhdGUgYWRkQ3VzdG9tQ3NzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY3NzID0gYFxyXG4gICAgICAuZm9vdGVyLXVpLFxyXG4gICAgICAuc2hvd2Nhc2UtZm9vdGVyLFxyXG4gICAgICAubXAtbm92YS1idG4tZ3JvdXAsXHJcbiAgICAgIC5mb290ZXItZGl2aWRlcixcclxuICAgICAgLmxvZ28tbGluayxcclxuICAgICAgLmZvb3Rlci1sb2dvLFxyXG4gICAgICAuYm90dG9tLXVpLFxyXG4gICAgICBpbWcubG9nby1pbWFnZSxcclxuICAgICAgaW1nW2NsYXNzXj1cImxvZ28taW1hZ2VcIl0sXHJcbiAgICAgIGltZ1tjbGFzcyo9XCIgbG9nby1pbWFnZVwiXSxcclxuICAgICAgW2RhdGEtdGVzdGlkPVwic2hvd2Nhc2UtZm9vdGVyXCJdIHtcclxuICAgICAgICBvcGFjaXR5OiAwICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgfVxyXG4gICAgYDtcclxuXHJcbiAgICAvLyAxc3QgbWV0aG9kOiBWaWEgU2NlbmUgU0RLXHJcbiAgICBpZiAodGhpcy5zZGs/LlNjZW5lPy5hZGRTdHlsZSkge1xyXG4gICAgICB0aGlzLnNkay5TY2VuZS5hZGRTdHlsZShjc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDJuZCBtZXRob2Q6IERpcmVjdCBpbmplY3Rpb24gaW4gaUZyYW1lIERPTSAoRmFsbGJhY2spXHJcbiAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlld2VyLW1vZHVsZScpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xyXG4gICAgaWYgKGlmcmFtZT8uY29udGVudFdpbmRvdz8uZG9jdW1lbnQpIHtcclxuICAgICAgY29uc3Qgc3R5bGUgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG4gICAgICBzdHlsZS50ZXh0Q29udGVudCA9IGNzcztcclxuICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGNvbnRlbnQgb2YgTWF0dGVydGFnIHdpdGggbWF0dGVydGFnSUQgKGJpbGxib2FyZCwgaW5qZWN0ZWQgaHRtbCwgdGFnIGljb24pXHJcbiAgICogQHBhcmFtIG1hdHRlcnRhZ0lEIHN0cmluZ1xyXG4gICAqIEBwYXJhbSBvYmplY3QgVGlja2V0LCBFcXVpcG1lbnQsIEZlYXR1cmUsIGV0Y1xyXG4gICAqIEBwYXJhbSB0YWdUeXBlIFBvaVR5cGVcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUgPSBudWxsLFxyXG4gICAgdGFnVHlwZTogUG9pVHlwZSA9IG51bGxcclxuICApIHtcclxuICAgIGlmICh0aGlzLnNkaykge1xyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldFRhZ01vZHVsZSh0aGlzLnNkaywgbWF0dGVydGFnSUQpLmVkaXRCaWxsYm9hcmQoXHJcbiAgICAgICAgbWF0dGVydGFnSUQsXHJcbiAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKS5nZXREYXRhKClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNaXNlIMOgIGpvdXIgZGUgbCdpY8O0bmUgaW1tw6lkaWF0ZVxyXG4gICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQoXHJcbiAgICAgIHRoaXMuc2RrLFxyXG4gICAgICBtYXR0ZXJ0YWdJRCxcclxuICAgICAgb2JqZWN0LFxyXG4gICAgICB0YWdUeXBlLFxyXG4gICAgICB0aGlzLnNldFRhZ0ljb25BbmRPcGFjaXR5LmJpbmQodGhpcyksXHJcbiAgICAgIC8vIE9uIHBhc3NlIHVuZSBmb25jdGlvbiB3cmFwcGVyIHF1aSBleMOpY3V0ZSBsJ2luamVjdGlvbiBIVE1MIHNhbnMgYmxvcXVlclxyXG4gICAgICBhc3luYyAodHlwZSwgb2JqLCBzaWQpID0+IHtcclxuICAgICAgICB0aGlzLmluamVjdEh0bWxJblRhZyh0eXBlLCBvYmosIHNpZCkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdBc3luYyBIVE1MIHVwZGF0ZSBmYWlsZWQgZm9yJywgc2lkLCBlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyBpbmplY3RlZCBodG1sIGZvciBNYXR0ZXJ0YWdcclxuICAgKiBAcGFyYW0gbWF0dGVydGFnSUQgc3RyaW5nXHJcbiAgICogQHBhcmFtIG9iamVjdCBUaWNrZXQsIEVxdWlwbWVudCwgRmVhdHVyZSwgZXRjXHJcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZUluamVjdGVkSHRtbEZvclRhZ0lEKFxyXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcclxuICAgIG9iamVjdDogYW55LFxyXG4gICAgdGFnVHlwZTogUG9pVHlwZVxyXG4gICkge1xyXG4gICAgYXdhaXQgdGhpcy5pbmplY3RIdG1sSW5UYWcodGFnVHlwZSwgb2JqZWN0LCBtYXR0ZXJ0YWdJRCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGVzIE1hdHRlcnRhZyBmcm9tIFZpZXdlciBieSBpdHMgSURcclxuICAgKiBAcGFyYW0gbWF0dGVydGFnSUQgc3RyaW5nXHJcbiAgICovXHJcbiAgZGVsZXRlTWF0dGVydGFnRnJvbUlkKG1hdHRlcnRhZ0lEOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZGVsZXRlTWF0dGVydGFnRnJvbUlkKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGVzIGxhdGVzdCBjcmVhdGVkIG1hdHRlcnRhZ1xyXG4gICAqL1xyXG4gIGFzeW5jIGRlbGV0ZUxhc3RNYXR0ZXJ0YWcoKSB7XHJcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmRlbGV0ZUxhc3RNYXR0ZXJ0YWcodGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGVnYWN5OiB1c2VkIHRvIGJlIGNhbGxlZCBhY3Rpb25fYWRkX21hdHRlcnRhZ19mcm9tX1BPSVxyXG4gICAqIEFkZHMgYW5kIGNvbmZpZ3VyZXMgTWF0dGVydGFnIGZvciBhbiBvYmplY3QgKFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGMpIHRoYXQgY29ycmVzcG9uZHMgdG8gUE9JIChjb29yZGluYXRlcywgdGFnSWNvbilcclxuICAgKiBAcGFyYW0gdGFnVHlwZSBQb2lUeXBlXHJcbiAgICogQHBhcmFtIG9iamVjdCBUaWNrZXQsIEVxdWlwbWVudCwgRmVhdHVyZS4uLlxyXG4gICAqIEBwYXJhbSBwb2kgUE9JXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxyXG4gICAgdGFnVHlwZTogUG9pVHlwZSxcclxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxyXG4gICAgcG9pOiBQT0lcclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuY3JlYXRlTWF0dGVydGFnRnJvbVBPSShcclxuICAgICAgdGhpcy5zZGssXHJcbiAgICAgIHRhZ1R5cGUsXHJcbiAgICAgIG9iamVjdCxcclxuICAgICAgcG9pLFxyXG4gICAgICB0aGlzLmdldFRhZ0Zyb21FbGVtZW50SWQuYmluZCh0aGlzKSxcclxuICAgICAgdGhpcy5zZXRUYWdJY29uQW5kT3BhY2l0eS5iaW5kKHRoaXMpLFxyXG4gICAgICB0aGlzLmluamVjdEh0bWxJblRhZy5iaW5kKHRoaXMpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5qZWN0IGN1c3RvbSBIVE1MIGFzIE1hdHRlcnRhZyBjb250ZW50XHJcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxyXG4gICAqIEBwYXJhbSBvYmplY3QgVGlja2V0LCBFcXVpcG1lbnQsIEZlYXR1cmUgZXRjXHJcbiAgICogQHBhcmFtIHRhZ0lEIHN0cmluZ1xyXG4gICAqL1xyXG4gIGFzeW5jIGluamVjdEh0bWxJblRhZyh0YWdUeXBlOiBQb2lUeXBlLCBvYmplY3Q6IERiT2JqZWN0VHlwZSwgdGFnSUQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuaW5qZWN0SHRtbEluVGFnKHRoaXMuc2RrLCB0YWdUeXBlLCBvYmplY3QsIHRhZ0lEKTtcclxuICB9XHJcblxyXG5cclxuICBhc3luYyBhY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKCkge1xyXG4gICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5hY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKHRoaXMuc2RrKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgTWF0dGVydGFnIGZyb20gdmlzaXQgYXNzb2NpYXRlZCB3aXRoIG9iamVjdCBJRCAodGlja2V0SUQsIGV0YylcclxuICAgKiBAcGFyYW0gZWxlbWVudElEIHN0cmluZ1xyXG4gICAqL1xyXG4gIGFzeW5jIGRlbGV0ZU1hdHRlcnRhZ0Zvck9iamVjdChlbGVtZW50SUQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgbWF0dGVyVGFnSUQgPSB0aGlzLmdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElEKS50YWc7XHJcbiAgICBpZiAobWF0dGVyVGFnSUQpIHtcclxuICAgICAgdGhpcy50YWdBZGRRdWV1ZSA9IHRoaXMudGFnQWRkUXVldWUudGhlbihhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQodGhpcy5zZGssIG1hdHRlclRhZ0lEKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50YWdBZGRRdWV1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHV1aWQgZnJvbSB0aHJlZWpzXHJcbiAgICogQHBhcmFtIHV1aWRcclxuICAgKi9cclxuICBhc3luYyBkZWxldGVPYmplY3QzRCh1dWlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5kZWxldGVPYmplY3QzRCh1dWlkKTtcclxuICB9XHJcblxyXG4gIGdldE9iamVjdDNETW9kZWxOb2RlRnJvbURpY3Rpb25uYXJ5KHV1aWQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0T2JqZWN0M0RNb2RlbE5vZGVGcm9tRGljdGlvbm5hcnkodXVpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzICBNYXR0ZXJ0YWdEYXRhIGFuZCBzdGFydCByZXBvc2l0aW9uaW5nIChjcmVhdGVzIHRlbXBvcmFyeSBtYXR0ZXJ0YWcgdGhhdCBmb2xsb3dzIHRoZSBjdXJzb3IpXHJcbiAgICogQHBhcmFtIHBvaVR5cGUgUG9pVHlwZVxyXG4gICAqIEBwYXJhbSBlbGVtZW50IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGNcclxuICAgKi9cclxuICBhc3luYyBhZGRNYXR0ZXJ0YWdXaGVuUmVwb3NpdGlvbmluZyhwb2lUeXBlOiBQb2lUeXBlLCBlbGVtZW50OiBEYk9iamVjdFR5cGUpIHtcclxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSBuZXcgTWF0dGVydGFnRGF0YShwb2lUeXBlKTtcclxuICAgIC8vIHNldCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGV4aXN0aW5nIHRhZ1xyXG4gICAgY29uc3QgW3BvaV0gPSBlbGVtZW50LnBvaXMuaXRlbXM7XHJcbiAgICBpZiAocG9pICYmIHBvaS5jb29yZGluYXRlKSB7XHJcbiAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9zaXRpb24oSlNPTi5wYXJzZShwb2kuY29vcmRpbmF0ZSkpO1xyXG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvaShwb2kpOyAvLyB0byBrZWVwIGN1c3RvbSB0YWdJY29uIGFuZCBvcGFjaXR5XHJcbiAgICB9XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldFN3ZWVwSUQodGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKHRoaXMucG9zZUNhbWVyYS5zd2VlcCkpO1xyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRSb3RhdGlvbih0aGlzLnBvc2VDYW1lcmEucm90YXRpb24pO1xyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3QoZWxlbWVudCwgcG9pVHlwZSk7XHJcbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gYXdhaXQgdGhpcy5hZGRNYXR0ZXJ0YWdUb1ZpZXdlcihtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuUE9TSVRJT05JTkcpO1xyXG4gICAgYXdhaXQgdGhpcy5hZGRDdXJzb3JNYXR0ZXJ0YWcobWF0dGVydGFnRGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIE1hdHRlcnRhZ0RhdGEgYW5kIG1hdHRlcnRhZyB0aGF0IGZvbGxvd3MgdGhlIGN1cnNvciB3aGVuIGNob29zaW5nIHBvc2l0aW9uIGZvciBhIG5ldyBvYmplY3RcclxuICAgKiBAcGFyYW0gcG9pVHlwZVxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE1hdHRlcnRhZ1doZW5BZGRpbmcocG9pVHlwZTogUG9pVHlwZSkge1xyXG4gICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IG5ldyBNYXR0ZXJ0YWdEYXRhKHBvaVR5cGUpO1xyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRTd2VlcElEKHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZCh0aGlzLnBvc2VDYW1lcmEuc3dlZXApKTtcclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0Um90YXRpb24odGhpcy5wb3NlQ2FtZXJhLnJvdGF0aW9uKTtcclxuXHJcbiAgICBjb25zdCBpbml0aWFsUG9zaXRpb24gPSB0aGlzLnBvc2VNYXR0ZXJwb3J0Py5wb3NpdGlvbiA/PyB0aGlzLnBvc2VDYW1lcmEucG9zaXRpb247XHJcbiAgICBjb25zdCBpbml0aWFsTm9ybWFsID0gdGhpcy5wb3NlTWF0dGVycG9ydD8ubm9ybWFsID8/IHsgeDogMCwgeTogLTAuMTUsIHo6IDAgfTtcclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9zaXRpb24oeyAuLi5pbml0aWFsUG9zaXRpb24gfSk7XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldE5vcm1hbCh7IC4uLmluaXRpYWxOb3JtYWwgfSk7XHJcblxyXG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkFERElORyk7XHJcbiAgICBhd2FpdCB0aGlzLmFkZEN1cnNvck1hdHRlcnRhZyhtYXR0ZXJ0YWdEYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbmNlbHMgZm9sbG93aW5nIG9mIGN1cnNvciAobWVhbmluZyBkZWxldGluZyBsYXN0IE1hdHRlcnRhZylcclxuICAgKi9cclxuICBjYW5jZWxGb2xsb3dpbmdDdXJzb3IoKSB7XHJcbiAgICB0aGlzLmRlbGV0ZUxhc3RNYXR0ZXJ0YWcoKTtcclxuICAgIHRoaXMuc2V0SW50ZXJhY3Rpb25Nb2RlKFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKTtcclxuICB9XHJcblxyXG4gIHNldExhc3RPYmplY3QzRChsYXN0T2JqZWN0M0Q6IFRocmVlSlNPYmplY3QzRCkge1xyXG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UubGFzdE9iamVjdDNEID0gbGFzdE9iamVjdDNEO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFzdE9iamVjdDNEKCk6IFRocmVlSlNPYmplY3QzRCB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UubGFzdE9iamVjdDNEO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybXMgY2FsbGJhY2sgYWZ0ZXIgbWF0dGVydGFnIHBvc2l0aW9uIHdhcyB2YWxpZGF0ZWQgKGNyZWF0aW9uIG9mIG9iamVjdCBvciByZXBvc2l0aW9uaW5nKVxyXG4gICAqIEBwYXJhbSBtb2RlIE1hdHRlcnRhZ0FjdGlvbk1vZGVcclxuICAgKi9cclxuICBjYWxsYmFja0FmdGVyTWF0dGVydGFnVmFsaWRhdGlvbihtb2RlOiBNYXR0ZXJ0YWdBY3Rpb25Nb2RlKSB7XHJcbiAgICB0aGlzLnZpc2liaWxpdHlTZXJ2aWNlLmRldGFpbFNob3dpbmcubmV4dCh0cnVlKTtcclxuICAgIGNvbnN0IGxhc3RUYWcgPSB0aGlzLmdldExhc3RUYWcoKTtcclxuICAgIHN3aXRjaCAobW9kZSkge1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX0VRVUlQTUVOVDpcclxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2FkZF9lcXVpcGBdKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLkFERF9USUNLRVQ6XHJcbiAgICAgICAgdGhpcy5nb1RvTGFzdFRhZygpO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9hZGRfdGlja2V0YF0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX09CSkVDVDNEOlxyXG4gICAgICAgIHRoaXMuZ29Ub0xhc3RUYWcoKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vYWRkX29iamVjdDNkYF0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX0RBVEE6XHJcbiAgICAgICAgdGhpcy5nb1RvTGFzdFRhZygpO1xyXG4gICAgICAgIGxldCB1cmw6IHN0cmluZztcclxuICAgICAgICBpZiAodGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCc/JykpIHtcclxuICAgICAgICAgIHVybCA9IHRoaXMucm91dGVyLnVybC5zdWJzdHJpbmcoMCwgdGhpcy5yb3V0ZXIudXJsLmluZGV4T2YoJz8nKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHVybCA9IHRoaXMucm91dGVyLnVybDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3VybH0vYWRkX2ZlYXR1cmVgXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfREVTSzpcclxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2FkZF9mZWF0dXJlYF0sIHtcclxuICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGlzRGVzazogdHJ1ZSB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX1JPT006XHJcbiAgICAgICAgdGhpcy5nb1RvTGFzdFRhZygpO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9hZGRfcm9vbWBdKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX09CSkVDVDNEOlxyXG4gICAgICAgIGlmIChsYXN0VGFnKSB7XHJcbiAgICAgICAgICAvLyBETyBOb3RoaW5nIChyb3V0aW5nKSwganVzdFxyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXHJcbiAgICAgICAgICAgIFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9vYmplY3QzZC8ke3RoaXMubGFzdE9iamVjdDNELmlkfWBdLFxyXG4gICAgICAgICAgICB7IHF1ZXJ5UGFyYW1zOiB7IHBvc2l0aW9uaW5nOiB0cnVlIH0gfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5QT1NJVElPTl9USUNLRVQ6XHJcbiAgICAgICAgaWYgKGxhc3RUYWcpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vZGV0YWlsLyR7dGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KGxhc3RUYWcpLmVsZW1lbnRJRFxyXG4gICAgICAgICAgICAgIH1gLFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB7IHF1ZXJ5UGFyYW1zOiB7IHBvc2l0aW9uaW5nOiB0cnVlIH0gfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5QT1NJVElPTl9FUVVJUE1FTlQ6XHJcbiAgICAgICAgaWYgKGxhc3RUYWcpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vZXF1aXAvJHt0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobGFzdFRhZykuZWxlbWVudElEXHJcbiAgICAgICAgICAgICAgfWAsXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX0RBVEE6XHJcbiAgICAgICAgaWYgKGxhc3RUYWcpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMuYWN0aXZlUm91dGUsXHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IHBvc2l0aW9uaW5nOiB0cnVlIH0sIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIlxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuUE9TSVRJT05fUk9PTTpcclxuICAgICAgICBpZiAobGFzdFRhZykge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmVSb3V0ZSxcclxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSwgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGdWxseSB1cGRhdGVzIGV4aXN0aW5nIE1hdHRlcnRhZyBjb250ZW50IHdpdGggZGF0YSBvZiBvYmplY3QgKFRpY2tldCwgRXF1aXBtZW50LCBEZXNrKVxyXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWdJRCBzdHJpbmdcclxuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBEZXNrXHJcbiAgICogQHBhcmFtIHBvaVR5cGUgUG9pVHlwZVxyXG4gICAqIEBwYXJhbSBwb2kgUE9JXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0T2JqZWN0QW5kUG9pSW5UYWcoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXHJcbiAgICBwb2lUeXBlOiBQb2lUeXBlLFxyXG4gICAgcG9pOiBQT0kgfCBudWxsID0gbnVsbFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKS5zZXRPYmplY3Qob2JqZWN0LCBwb2lUeXBlKTtcclxuICAgIGlmIChwb2kpIHtcclxuICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKS5zZXRQb2kocG9pKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCkuZWxlbWVudElEID0gb2JqZWN0LmlkO1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy51cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQobWF0dGVydGFnSUQsIG9iamVjdCwgcG9pVHlwZSk7XHJcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlTWF0dGVyVGFnUG9zSW5TZGtWaWV3ZXIoXHJcbiAgICAgICAgbWF0dGVydGFnSUQsXHJcbiAgICAgICAgb2JqZWN0LFxyXG4gICAgICAgIHBvaVR5cGUsXHJcbiAgICAgICAgcG9pXHJcbiAgICAgICk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBlcnJvciBpbiBzZXRPYmplY3RBbmRQb2lJblRhZzogJHtlfWApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlTWF0dGVyVGFnUG9zSW5TZGtWaWV3ZXIoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXHJcbiAgICBwb2lUeXBlOiBQb2lUeXBlLFxyXG4gICAgcG9pOiBQT0kgfCBudWxsID0gbnVsbFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFwb2kgfHwgIXBvaS5jb29yZGluYXRlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybigndXBkYXRlTWF0dGVyVGFnUG9zSW5TZGtWaWV3ZXI6IHBvaSBvciBwb2kuY29vcmRpbmF0ZSBpcyBtaXNzaW5nJywgcG9pKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgSW5kZXhUb1VwZGF0ZSA9IG9iamVjdC5wb2lzPy5pdGVtcyA/IG9iamVjdC5wb2lzLml0ZW1zLmZpbmRJbmRleCgodSkgPT4gdT8uaWQgPT09IHBvaS5pZCkgOiAtMTtcclxuICAgIGlmIChJbmRleFRvVXBkYXRlICE9PSAtMSAmJiBvYmplY3QucG9pcz8uaXRlbXMpIHtcclxuICAgICAgb2JqZWN0LnBvaXMuaXRlbXNbSW5kZXhUb1VwZGF0ZV0gPSBwb2k7XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IHgsIHksIHogfSA9IEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpO1xyXG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSB7XHJcbiAgICAgIGFuY2hvclBvc2l0aW9uOiB7XHJcbiAgICAgICAgeDogeCxcclxuICAgICAgICB5OiB5LFxyXG4gICAgICAgIHo6IHosXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0ZW1WZWN0b3I6IHtcclxuICAgICAgICAvLyBtYWtlIHRoZSBUYWcgc3RpY2sgc3RyYWlnaHQgdXAgYW5kIG1ha2UgaXQgMC4zMCBtZXRlcnMgKH4xIGZvb3QpIHRhbGxcclxuICAgICAgICB4OiAwLFxyXG4gICAgICAgIHk6IDAuMyxcclxuICAgICAgICB6OiAwLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCkuZWRpdFBvc2l0aW9uKG1hdHRlcnRhZ0lELCBuZXdQb3NpdGlvbik7XHJcbiAgICB0aGlzLmRpY3Rpb25uYXJ5VGFnc1xyXG4gICAgICAuZ2V0KG1hdHRlcnRhZ0lEKVxyXG4gICAgICAuc2V0UG9zaXRpb24obmV3UG9zaXRpb24uYW5jaG9yUG9zaXRpb24pO1xyXG5cclxuICAgIGZvciAobGV0IHRhZ0lkIG9mIHRoaXMubWF0dGVydGFnSURzKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRUYWcgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQodGFnSWQpO1xyXG4gICAgICBpZiAoIWN1cnJlbnRUYWcpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY3VycmVudFRhZy5lbGVtZW50SUQgPT09IG9iamVjdC5pZCAmJiB0YWdJZCAhPT0gbWF0dGVydGFnSUQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmRlbGV0ZU1hdHRlcnRhZ0Zyb21JZCh0aGlzLnNkaywgdGFnSWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIG1hdHRlclRhZ0lEIGFuZCBpdHMgc3dlZXAgZm9yIGFuIG9iamVjdCBJRCAodGlja2V0IElELCBldGMpXHJcbiAgICogQHBhcmFtIGVsZW1lbnRJRCBzdHJpbmdcclxuICAgKiBAcmV0dXJucyB7dGFnOiBzdHJpbmcgfCBudWxsLCBzd2VlcDogc3RyaW5nIHwgbnVsbH1cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SUQ6IHN0cmluZyk6IHsgdGFnOiBzdHJpbmcgfCBudWxsOyBzd2VlcDogc3RyaW5nIHwgbnVsbCB9IHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElELCB0aGlzLnN3ZWVwcyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIGxhdGVzdCB0YWcgY3JlYXRlZCBpbiB0aGUgdmlzaXQgKHdoZW4gZm9sbG93aW5nIHRoZSBjdXJzb3IgdG8gcG9zaXRpb24pXHJcbiAgICogQHJldHVybnMgc3RyaW5nIG1hdHRlcnRhZ0lEXHJcbiAgICovXHJcbiAgZ2V0TGFzdFRhZygpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmICh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgID8gbnVsbFxyXG4gICAgICAgIDogdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIE1hdHRlcnRhZ0RhdGEgZm9yIE1hdHRlcnRhZyAocmVwbGFjZXMgZ2V0VGFnRGF0YUZyb21JZClcclxuICAgKiBAcGFyYW0gbWF0dGVydGFnSURcclxuICAgKiBAcmV0dXJucyBNYXR0ZXJ0YWdEYXRhXHJcbiAgICovXHJcbiAgZ2V0TWF0dGVyVGFnRGF0YUZvck1hdHRlcnRhZyhtYXR0ZXJ0YWdJRDogc3RyaW5nKTogTWF0dGVydGFnRGF0YSB8IG51bGwge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChtYXR0ZXJ0YWdJRCk7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgY29uc29sZS5sb2coJ2Nhbm5vdCByZXRyaWV2ZSBtYXR0ZXJ0YWdEYXRhIGZvciB0YWcnLCBtYXR0ZXJ0YWdJRCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgLy8gLS0tLS0tLS0tLSBWaWV3cyAoZnVybmlzaGVkIC8gZGVmdXJuaXNoZWQpIC0tLS0tLS0tLS1cclxuICAvL1xyXG5cclxuICAvKipcclxuICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBTREsgVmlldyBBUEkgdG8ga2VlcCB0cmFjayBvZiB0aGUgdmlld3MgYXZhaWxhYmxlIGZvciB0aGUgc3BhY2VcclxuICAgKiBhbmQgb2YgdGhlIGFjdGl2ZSBvbmUuIFRhZ3MgbGl2ZSBpbiBhIHNoYXJlZCBjb21tb24gbGF5ZXIsIHNvIGEgdmlldyBjaGFuZ2Ugb25seVxyXG4gICAqIHJlcXVpcmVzIHJlLWFwcGx5aW5nIHRoZWlyIHZpc2liaWxpdHksIG5ldmVyIHJlLWNyZWF0aW5nIHRoZW0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0Vmlld3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyVmlld1N1YnNjcmlwdGlvbnMoKTtcclxuICAgIHRoaXMudmlld3NCeVR5cGUuY2xlYXIoKTtcclxuICAgIHRoaXMuY3VycmVudFZpZXcgPSBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5zZGs/LlZpZXc/LnZpZXdzKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIFZpZXcgQVBJIHVuYXZhaWxhYmxlIG9uIHRoaXMgU0RLIHZlcnNpb24nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudmlld1N1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgdGhpcy5zZGsuVmlldy52aWV3cy5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG9uQ29sbGVjdGlvblVwZGF0ZWQ6IChjb2xsZWN0aW9uOiBNYXR0ZXJwb3J0Vmlld0NvbGxlY3Rpb24pID0+IHtcclxuICAgICAgICAgIC8vIFNESyBjYWxsYmFja3MgcnVuIG91dHNpZGUgQW5ndWxhcjogcmUtZW50ZXIgdGhlIHpvbmUgc28gdGhlIHZpZXdzIG1hZGVcclxuICAgICAgICAgIC8vIGF2YWlsYWJsZSBoZXJlIChkZWZ1cm5pc2ggYnV0dG9uLi4uKSBhcmUgcGlja2VkIHVwIGJ5IGNoYW5nZSBkZXRlY3Rpb24uXHJcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdzQnlUeXBlLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmlldyBvZiBPYmplY3QudmFsdWVzKGNvbGxlY3Rpb24pKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy52aWV3c0J5VHlwZS5zZXQodmlldy50eXBlLCB2aWV3KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvLyBWaWV3cyBhcmUgZGlzY292ZXJlZCBwcm9ncmVzc2l2ZWx5OiBtYWtlIHN1cmUgZWFjaCBvbmUgY2FycmllcyB0aGUgc2hhcmVkXHJcbiAgICAgICAgICAvLyB0YWcgbGF5ZXIsIG90aGVyd2lzZSBpdHMgdGFncyB3b3VsZCBub3QgZXhpc3QgaW4gdGhhdCB2aWV3LlxyXG4gICAgICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5hdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3ModGhpcy5zZGssIE9iamVjdC52YWx1ZXMoY29sbGVjdGlvbikpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudmlld1N1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgdGhpcy5zZGsuVmlldy5jdXJyZW50LnN1YnNjcmliZSgodmlldzogTWF0dGVycG9ydFZpZXcpID0+IHtcclxuICAgICAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5jdXJyZW50Vmlldz8uaWQgIT09IHZpZXc/LmlkO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSB2aWV3O1xyXG4gICAgICAgIGlmICghY2hhbmdlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucmVzdG9yZVRhZ3NGb3JBY3RpdmVWaWV3KHZpZXcpO1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm9uVmlld0NoYW5nZWQubmV4dCh2aWV3KSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yY2VzIHRoZSBvcGFjaXR5L2VuYWJsZWQgc3RhdGUgdG8gYmUgcHVzaGVkIGFnYWluIHRvIGV2ZXJ5IHRhZy4gVGhlIFNES1xyXG4gICAqIHJlLXJlbmRlcnMgdGhlIHNoYXJlZCBsYXllcidzIHRhZ3Mgb24gYSB2aWV3IHN3YXAsIGFuZCB0aGUgbWVtb2l6ZWQgdmFsdWVzIHdvdWxkXHJcbiAgICogb3RoZXJ3aXNlIG1ha2UgdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KCkgc2tpcCB0aGVtLCBsZWF2aW5nIHRhZ3MgaW52aXNpYmxlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhcHBseVRhZ3NWaXNpYmlsaXR5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5yZXNldFZpc2liaWxpdHlDYWNoZSgpO1xyXG4gICAgdGhpcy5yZWZyZXNoVGFnc1Zpc2liaWxpdHkoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1dHMgdGhlIHRhZ3MgYmFjayBpbiBzaGFwZSBpbiB0aGUgdmlldyB0aGF0IGp1c3QgYmVjYW1lIGFjdGl2ZS5cclxuICAgKlxyXG4gICAqIEFjdGl2YXRpbmcgYSB2aWV3IHJlLW1hdGVyaWFsaXplcyB0aGUgc2hhcmVkIGxheWVyJ3MgdGFncyBmcm9tIHRoZSBkZXNjcmlwdG9yc1xyXG4gICAqIHJlY29yZGVkIHdoZW4gdGhleSB3ZXJlIGFkZGVkLCBzbyBldmVyeXRoaW5nIGFwcGxpZWQgdG8gYSB0YWcgKmFmdGVyd2FyZHMqIHRocm91Z2hcclxuICAgKiB0aGUgZ2xvYmFsIFRhZyBtb2R1bGUgaXMgZHJvcHBlZCBhbG9uZyB0aGUgd2F5OiB0aGUgY3VzdG9tIGljb24gKHRoZSBwaW4gZmFsbHMgYmFja1xyXG4gICAqIHRvIHRoZSBkZXNjcmlwdG9yJ3Mgd2hpdGUpIGFuZCB0aGUgc2FuZGJveCBjYXJyeWluZyB0aGUgaG92ZXIgY29udGVudC4gVGhleSBoYXZlIHRvXHJcbiAgICogYmUgYXBwbGllZCBhZ2FpbiBvbiB0aGUgZnJlc2hseSByZWJ1aWx0IHRhZ3MuXHJcbiAgICpcclxuICAgKiBWaXNpYmlsaXR5IGlzIHJlZnJlc2hlZCBzdHJhaWdodCBhd2F5IHNvIHRoZSB0YWdzIHNob3cgdXAgd2l0aG91dCB3YWl0aW5nLCB0aGVuXHJcbiAgICogY29udGVudCBpcyByZS1hcHBsaWVkIG9uY2UgdGhlIHRyYW5zaXRpb24gaXMgb3ZlciDigJQgcmUtYXBwbHlpbmcgaXQgdG9vIGVhcmx5IHdvdWxkXHJcbiAgICogdGFyZ2V0IHRhZ3MgdGhlIFNESyBoYXMgbm90IHJlYnVpbHQgeWV0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzdG9yZVRhZ3NGb3JBY3RpdmVWaWV3KHZpZXc6IE1hdHRlcnBvcnRWaWV3KTogdm9pZCB7XHJcbiAgICAvLyBBIHZpZXcgb25seSBtYXRlcmlhbGl6ZXMgaXRzIGxheWVycyBvbmNlIGFjdGl2YXRlZDogKHJlKWF0dGFjaCB0aGUgc2hhcmVkIG9uZS5cclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuYXR0YWNoU2hhcmVkVGFnTGF5ZXJUb1ZpZXdzKHRoaXMuc2RrLCBbdmlld10pXHJcbiAgICAgIC50aGVuKCgpID0+IHRoaXMucmVhcHBseVRhZ3NWaXNpYmlsaXR5KCkpO1xyXG4gICAgdGhpcy5yZWFwcGx5VGFnc1Zpc2liaWxpdHkoKTtcclxuXHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy52aWV3U3dpdGNoUmVzdG9yZVRpbWVyKTtcclxuICAgIHRoaXMudmlld1N3aXRjaFJlc3RvcmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlZnJlc2hUYWdzQ29udGVudCgpXHJcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSBDYW5ub3QgcmVzdG9yZSB0YWdzIGZvciB2aWV3Jywgdmlldz8uaWQsIGUpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZWFwcGx5VGFnc1Zpc2liaWxpdHkoKSk7XHJcbiAgICB9LCBNYXR0ZXJwb3J0U2VydmljZS5WSUVXX1NXSVRDSF9SRUZSRVNIX0RFTEFZX01TKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlLWFwcGxpZXMgdGhlIGljb24gYW5kIHRoZSBpbmplY3RlZCBIVE1MIG9mIGV2ZXJ5IHRhZyB3ZSBvd24uIFVzZWQgYWZ0ZXIgYSB2aWV3XHJcbiAgICogc3dpdGNoLCBzZWUgcmVzdG9yZVRhZ3NGb3JBY3RpdmVWaWV3KCkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVGFnc0NvbnRlbnQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMuc2RrKSByZXR1cm47XHJcblxyXG4gICAgLy8gU25hcHNob3Q6IHRoZSBkaWN0aW9uYXJ5IGNhbiBiZSBtdXRhdGVkIHdoaWxlIHRoZSBhd2FpdHMgYmVsb3cgYXJlIHBlbmRpbmcuXHJcbiAgICBmb3IgKGNvbnN0IFtzaWQsIG1hdHRlcnRhZ0RhdGFdIG9mIFsuLi50aGlzLmRpY3Rpb25uYXJ5VGFnc10pIHtcclxuICAgICAgaWYgKHNpZCA9PT0gdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykgY29udGludWU7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0VGFnSWNvbkFuZE9wYWNpdHkoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgdGhpcy5pbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIHNpZClcclxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0U2VydmljZV0gSFRNTCByZS1pbmplY3Rpb24gZmFpbGVkIGZvcicsIHNpZCwgZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJWaWV3U3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcclxuICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdTd2l0Y2hSZXN0b3JlVGltZXIpO1xyXG4gICAgdGhpcy52aWV3U3dpdGNoUmVzdG9yZVRpbWVyID0gbnVsbDtcclxuICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHRoaXMudmlld1N1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBzdWJzY3JpcHRpb24uY2FuY2VsKCk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSBDYW5ub3QgY2FuY2VsIHZpZXcgc3Vic2NyaXB0aW9uJywgZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudmlld1N1YnNjcmlwdGlvbnMgPSBbXTtcclxuICB9XHJcblxyXG4gIC8qKiBUcnVlIHdoZW4gdGhlIHNwYWNlIHByb3ZpZGVzIGEgZGVmdXJuaXNoZWQgdmlldy4gKi9cclxuICBnZXQgaGFzRGVmdXJuaXNoVmlldygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnZpZXdzQnlUeXBlLmhhcyhNYXR0ZXJwb3J0Vmlld1R5cGUuREVGVVJOSVNIKTtcclxuICB9XHJcblxyXG4gIC8qKiBUcnVlIHdoZW4gdGhlIGRlZnVybmlzaGVkIHZpZXcgaXMgdGhlIGFjdGl2ZSBvbmUuICovXHJcbiAgZ2V0IGlzRGVmdXJuaXNoZWRWaWV3KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFZpZXc/LnR5cGUgPT09IE1hdHRlcnBvcnRWaWV3VHlwZS5ERUZVUk5JU0g7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTd2l0Y2hlcyBiZXR3ZWVuIHRoZSBkZWZ1cm5pc2hlZCB2aWV3IGFuZCB0aGUgZnVybmlzaGVkIG9uZS5cclxuICAgKiBAcGFyYW0gcmV0dXJuVG9TdGFydCBNb3ZlIHRoZSBjYW1lcmEgYmFjayB0byB0aGUgdmlldydzIHN0YXJ0IGxvY2F0aW9uLlxyXG4gICAqL1xyXG4gIGFzeW5jIHRvZ2dsZURlZnVybmlzaFZpZXcocmV0dXJuVG9TdGFydDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmlzRGVmdXJuaXNoZWRWaWV3XHJcbiAgICAgID8gdGhpcy52aWV3c0J5VHlwZS5nZXQoTWF0dGVycG9ydFZpZXdUeXBlLkxBWUVSRURfQkFTRSkgPz8gdGhpcy52aWV3c0J5VHlwZS5nZXQoTWF0dGVycG9ydFZpZXdUeXBlLkJBU0UpXHJcbiAgICAgIDogdGhpcy52aWV3c0J5VHlwZS5nZXQoTWF0dGVycG9ydFZpZXdUeXBlLkRFRlVSTklTSCk7XHJcblxyXG4gICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0U2VydmljZV0gTm8gdGFyZ2V0IHZpZXcgdG8gc3dpdGNoIHRvJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGF3YWl0IHRhcmdldC5zZXRBY3RpdmUocmV0dXJuVG9TdGFydCk7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIC8vIC0tLS0tLS0tLS0gVmlld2VyIHJlbGF0ZWQgKHN3aXRjaCB2aWV3cywgZ28gdG8pIC0tLS0tLS0tLS1cclxuICAvL1xyXG4gIGFzeW5jIGFjdGlvbl90b29sYm94X2Zsb29ycGxhbigpIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl90b29sYm94X2Zsb29ycGxhbih0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcodGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgYWN0aW9uU2hvd0FsbEZsb29ycygpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uU2hvd0FsbEZsb29ycyh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhY3Rpb25fdG9vbGJveF9kb2xsaG91c2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fdG9vbGJveF9kb2xsaG91c2UodGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgYWN0aW9uX3Rvb2xib3hfbWVzdXJlKCkge1xyXG4gICAgY29uc3QgbmV3U3RhdGUgPSAhdGhpcy5pc01lYXN1cmVNb2RlT247XHJcbiAgICB0aGlzLnNkay5NZWFzdXJlbWVudHMudG9nZ2xlTW9kZShuZXdTdGF0ZSkudGhlbigoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgIGBNZWFzdXJlbWVudCBtb2RlIGlzIG5vdyAke25ld1N0YXRlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFjdGlvbl90b29sYm94X2NhbmNlbF9tZXN1cmUoKSB7XHJcbiAgICBpZiAodGhpcy5pc01lYXN1cmVNb2RlT24pIHtcclxuICAgICAgdGhpcy5hY3Rpb25fdG9vbGJveF9tZXN1cmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl9nb190b19mbG9vcihcclxuICAgIGZsb29yTmFtZTogc3RyaW5nLFxyXG4gICAgbWF0dGVycG9ydEZsb29yU2VxdWVuY2U6IG51bWJlciA9IG51bGxcclxuICApIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl9nb190b19mbG9vcih0aGlzLnNkaywgZmxvb3JOYW1lLCBtYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhY3Rpb25fZ29fdG9fc3dlZXAoc3dlZXA6IHN0cmluZywgcm90YXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0gfCBudWxsKSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fZ29fdG9fc3dlZXAodGhpcy5zZGssIHN3ZWVwLCByb3RhdGlvbik7XHJcbiAgfVxyXG5cclxuICBnZXRDdXJyZW50U3dlZXAoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRDdXJyZW50U3dlZXAodGhpcy5wb3NlQ2FtZXJhKTtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRDYW1lcmFQb3NpdGlvbigpOiB7XHJcbiAgICByb3RhdGlvbjogYW55O1xyXG4gICAgcG9zaXRpb246IGFueTtcclxuICAgIHN3ZWVwOiBhbnk7XHJcbiAgfSB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMucG9zZUNhbWVyYSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5wb3NlQ2FtZXJhO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXRJbnRlcmFjdGlvbk1vZGUoaW50ZXJhY3Rpb25Nb2RlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaW50ZXJhY3Rpb25Nb2RlID0gaW50ZXJhY3Rpb25Nb2RlO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW50ZXJhY3Rpb25Nb2RlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25Nb2RlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgYWxsIHZhcmlhYmxlcywgZGVsZXRlcyBhbGwgdGFncyAod2hlbiB2aWV3ZXIgaXMgcmVtb3ZlciBvciBtb2RlbCBjaGFuZ2VkPXJlbG9hZCBuZWVkZWQpXHJcbiAgICovXHJcbiAgYXN5bmMgY2xlYXJBbGwoKSB7XHJcbiAgICBjb25zb2xlLmxvZygncmVtb3Zpbmcgdmlld2VyJyk7XHJcbiAgICB0aGlzLmNsZWFyVmlld1N1YnNjcmlwdGlvbnMoKTtcclxuICAgIHRoaXMudmlld3NCeVR5cGUuY2xlYXIoKTtcclxuICAgIHRoaXMuY3VycmVudFZpZXcgPSBudWxsO1xyXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25fZGVsZXRlX2FsbF9tYXR0ZXJ0YWdzKCk7XHJcbiAgICB0aGlzLmZsb29ycyA9IG51bGw7XHJcbiAgICB0aGlzLnN3ZWVwcyA9IG51bGw7XHJcbiAgICB0aGlzLnNkayA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5wb2ludGVyU2VydmljZS5jbGVhcih7XHJcbiAgICAgIG9uTGVmdENsaWNrOiB0aGlzLnBvaW50ZXJMZWZ0Q2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXHJcbiAgICAgIG9uUmlnaHRDbGljazogdGhpcy5wb2ludGVyUmlnaHRDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgICAgb25NaWRkbGVDbGljazogdGhpcy5wb2ludGVyTWlkZGxlQ2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZvcmJpZGRlblN3ZWVwcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlRm9yYmlkZGVuU3dlZXBzKGZvcmJpZGRlblN3ZWVwczogc3RyaW5nW10pIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlbW92ZUZvcmJpZGRlblN3ZWVwcyh0aGlzLnNkaywgZm9yYmlkZGVuU3dlZXBzKTtcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgLy8gLS0tLS0tLS0tLSAzRCBvYmplY3RzIChTREsgQnVuZGxlIG9ubHkpIC0tLS0tLS0tLS1cclxuICAvL1xyXG4gIGFzeW5jIGluaXQzRE9iamVjdFZpZXdlcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5pbml0M0RPYmplY3RWaWV3ZXIodGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkM0RPYmplY3QoXHJcbiAgICBvYmo6IElPYmplY3QzRCxcclxuICAgIG1vZGU/OiAndHJhbnNsYXRlJyB8ICdyb3RhdGUnXHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5hZGQzRE9iamVjdCh0aGlzLnNkaywgb2JqLCBtb2RlKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU9iamVjdFZpc2liaWxpdHkob2JqZWN0SWQ6IGFueSkge1xyXG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UudG9nZ2xlT2JqZWN0VmlzaWJpbGl0eShvYmplY3RJZCk7XHJcbiAgfVxyXG5cclxuICBpc09iamVjdFZpc2libGUob2JqZWN0SWQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmlzT2JqZWN0VmlzaWJsZShvYmplY3RJZCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwb2ludENhbWVyYVRvM0RPYmplY3Qob2JqZWN0SWQ6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnBvaW50Q2FtZXJhVG8zRE9iamVjdChcclxuICAgICAgdGhpcy5zZGssXHJcbiAgICAgIG9iamVjdElkLFxyXG4gICAgICB0aGlzLmNyZWF0ZU1hdHRlcnRhZ0Zyb21QT0kuYmluZCh0aGlzKSxcclxuICAgICAgdGhpcy5nb1RvVGFnLmJpbmQodGhpcyksXHJcbiAgICAgIHRoaXMuZGVsZXRlTGFzdE1hdHRlcnRhZy5iaW5kKHRoaXMpLFxyXG4gICAgICB0aGlzLmdldFRhZ0Zyb21FbGVtZW50SWQuYmluZCh0aGlzKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldFNjZW5lTm9kZUZyb21PYmplY3QzRElkKHV1aWQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZ2V0U2NlbmVOb2RlRnJvbU9iamVjdDNESWQodXVpZCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkaXNwbGF5QXppbXV0YWxDcm93bigpIHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5kaXNwbGF5QXppbXV0YWxDcm93bih0aGlzLnBvc2VDYW1lcmEpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYXR0YWNoR2l6bW9Db250cm9sVG8zRE9iamVjdChcclxuICAgIG1vZGVsTm9kZTogYW55LFxyXG4gICAgc2NlbmVPYmplY3Q6IGFueSxcclxuICAgIG1vZGU6ICd0cmFuc2xhdGUnIHwgJ3JvdGF0ZScgfCAnc2NhbGUnLFxyXG4gICAgdmlzaWJsZTogYm9vbGVhbixcclxuICAgIGlzTmV3T2JqZWN0OiBib29sZWFuXHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5hdHRhY2hHaXptb0NvbnRyb2xUbzNET2JqZWN0KHRoaXMuc2RrLCBtb2RlbE5vZGUsIHNjZW5lT2JqZWN0LCBtb2RlLCB2aXNpYmxlLCBpc05ld09iamVjdCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVHaXptb0Zyb21MYXN0T2JqZWN0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5vYmplY3QzRFNlcnZpY2UucmVtb3ZlR2l6bW9Gcm9tTGFzdE9iamVjdCgpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlVmlld0ZydXN0dW0oKTogdm9pZCB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS50b2dnbGVWaWV3RnJ1c3R1bSgpO1xyXG4gIH1cclxufVxyXG4iXX0=