mmhglobal-dynamicform 2.24.3 → 2.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -581,7 +581,7 @@ export class MainService {
581
581
  group.form.reset();
582
582
  // Reload the workflow button if the TypeCode is 'FUNCTION'
583
583
  if (this.isTypeCodeFunction(event)) {
584
- this.reloadWorkflowButton(group, event.data.zButtonName);
584
+ this.reloadWorkflowButton(group, event.data);
585
585
  }
586
586
  }
587
587
  if (actionSegment === ActionType.Edit) {
@@ -606,7 +606,6 @@ export class MainService {
606
606
  });
607
607
  }
608
608
  if (group.isCloneNew) {
609
- this.reloadAllWorkflowButtonList(group);
610
609
  this.afterCloneNewModel(group, group.zModel);
611
610
  }
612
611
  else {
@@ -615,17 +614,6 @@ export class MainService {
615
614
  }
616
615
  })).subscribe();
617
616
  }
618
- reloadAllWorkflowButtonList(group) {
619
- const workflowButtonList = Object.keys(group.zComponents)
620
- .filter(key => key.startsWith('zworkflowbuttons_'))
621
- .reduce((obj, key) => {
622
- obj[key] = group.zComponents[key];
623
- return obj;
624
- }, {});
625
- Object.values(workflowButtonList).forEach(value => {
626
- value['loadButton']();
627
- });
628
- }
629
617
  createModel(event, group) {
630
618
  const fg = group.form;
631
619
  const resMessage = group.SuccessCreatedMessage || DefaultMessage.recordCreated;
@@ -760,7 +748,7 @@ export class MainService {
760
748
  this.newModel(null, group);
761
749
  // Reload the workflow button if the TypeCode is 'FUNCTION'
762
750
  if (this.isTypeCodeFunction(event)) {
763
- this.reloadWorkflowButton(group, event.data.zButtonName);
751
+ this.reloadWorkflowButton(group, event.data);
764
752
  }
765
753
  // Clear the trigger flag
766
754
  group.isTriggered = false;
@@ -832,9 +820,23 @@ export class MainService {
832
820
  isTypeCodeFunction(event) {
833
821
  return event?.data?.TypeCode === 'FUNCTION';
834
822
  }
835
- reloadWorkflowButton(group, zButtonName) {
836
- const workflowButtons = ZComponentHelper.getComponent(group, `zworkflowbuttons_${zButtonName}`);
837
- workflowButtons?.['loadButton']?.();
823
+ reloadWorkflowButton(group, data) {
824
+ // Changed to should reload all workflow button if it trigger new/clonenew via the form page.
825
+ //if (data.reloadAllWorkflowButton) {
826
+ const workflowButtonList = Object.keys(group.zComponents)
827
+ .filter(key => key.startsWith('zworkflowbuttons_'))
828
+ .reduce((obj, key) => {
829
+ obj[key] = group.zComponents[key];
830
+ return obj;
831
+ }, {});
832
+ Object.values(workflowButtonList).forEach(value => {
833
+ value?.['loadButton']?.();
834
+ });
835
+ //}
836
+ //else {
837
+ // const workflowButtons = ZComponentHelper.getComponent(group, `zworkflowbuttons_${data.zButtonName}`);
838
+ // workflowButtons?.['loadButton']?.();
839
+ //}
838
840
  }
839
841
  isFormDirtyAndValid(fg, group, isSkipDirty = false, event) {
840
842
  if (!isSkipDirty && !fg.dirty) {
@@ -1038,9 +1040,6 @@ export class MainService {
1038
1040
  this.signalrService.joinGroup(firstProjectCode);
1039
1041
  }
1040
1042
  }
1041
- else {
1042
- console.warn('signalR not enabled.');
1043
- }
1044
1043
  }
1045
1044
  handleSignalRModificationAlert(formId) {
1046
1045
  if (this.signalrService.signalREnabled() && this.environment.enableFormPageModificationAlert) {
@@ -1186,4 +1185,4 @@ export function refreshGrid(group) {
1186
1185
  }
1187
1186
  group.isTriggered = false;
1188
1187
  }
1189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFpQyxNQUFNLGlCQUFpQixDQUFDO0FBS2pILDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsZUFBZSxFQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFRLE1BQU0sTUFBTSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBTy9ELE9BQU8sRUFDUSxXQUFXLEVBQWdCLGdCQUFnQixFQUVYLE1BQU0sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUNwRyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7OztBQU16QixNQUFNLE9BQU8sV0FBVztJQWlCdEIsWUFDVSxNQUFjLEVBQ2QsY0FBOEIsRUFDOUIsU0FBMEIsRUFDMUIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsa0JBQXNDLEVBQ3RDLDRCQUEwRCxFQUMxRCxhQUE0QixFQUM1QixZQUEwQixFQUMxQixZQUEwQixFQUMxQixjQUFxQyxFQUNyQyxZQUFvQyxFQUNwQyxrQkFBc0MsRUFDdEMsY0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsV0FBd0I7UUFuQnhCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFD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QUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLEtBQUssVUFBVSxFQUFFO1lBQzlJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JEO0lBQ0gsQ0FBQztJQUNELFlBQVk7SUFFSixtQkFBbUIsQ0FBQyxLQUFhO1FBQ3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLElBQUksS0FBSyxDQUFDO1FBQ2hFLElBQUksV0FBVyxFQUFFO1lBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekM7SUFDSCxDQUFDOzt3R0F6NENVLFdBQVc7NEdBQVgsV0FBVyxjQUhWLE1BQU07MkZBR1AsV0FBVztrQkFKdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7O0FBODRDRCxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQWE7SUFDdkMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBVSxDQUFDO0lBQ25ELElBQUksWUFBWSxFQUFFO1FBQ2hCLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUN4QjtJQUNELEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudFJlZiwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25TdGFydCwgTmF2aWdhdGlvbkVuZCwgTmF2aWdhdGlvbkVycm9yLCBSb3V0ZXIsIEV2ZW50LCBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIsIE5hdkNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mLCBmb3JrSm9pbiwgZnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YXAsIHN3aXRjaE1hcCwgbWFwLCBtZXJnZUFsbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGlhbG9nUmVmLCBEaWFsb2dTZXJ2aWNlLCBEaWFsb2dTZXR0aW5ncyB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRpYWxvZyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7IFpDb21wb25lbnREZWJ1Z1NlcnZpY2UgfSBmcm9tICcuL3pjb21wb25lbnQuZGVidWcuc2VydmljZSc7XHJcbmltcG9ydCB7IFpHcmlkIH0gZnJvbSAnLi4vemdyaWQvemdyaWQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlLCBNb2RhbFJlc3BvbnNlIH0gZnJvbSAnbW1oZ2xvYmFsLXptb2RhbCc7XHJcbmltcG9ydCB7XHJcbiAgQWxlcnRCdXR0b24sIE1FU1NBR0VUWVBFLCBBbGVydFNlcnZpY2UsIFpDb21wb25lbnRIZWxwZXIsIE1vZGFsUGFnZVBhcmFtcyxcclxuICBDYWNoZVNlcnZpY2UsIEZpZWxkU2VydmljZSwgUmVzb3VyY2VBcGlTZXJ2aWNlLCBUcmFuc2xhdGlvblNlcnZpY2UsIFdlYkFwaVNlcnZpY2UsIFN0b3JhZ2VTZXNzaW9uU2VydmljZSwgT0F1dGgyU2VydmljZSwgU2lnbmFsclNlcnZpY2UsIENvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2UsXHJcbiAgWkNvbXBvbmVudE91dHB1dEV2ZW50LCBaQ29yZVNlcnZpY2UsIFpGaWVsZCwgWkdyb3VwLCBEZWZhdWx0TWVzc2FnZSwgRGVmYXVsdERpYWxvZ1RpdGxlLCBBY3Rpb25UeXBlLCBUb2FzdFNlcnZpY2UsIEF1dGhTZXJ2aWNlLCBGb3JtVHlwZVxyXG59IGZyb20gJ21taGdsb2JhbC16Y29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE1haW5TZXJ2aWNlIHtcclxuICBwcml2YXRlIGdyb3VwOiBaR3JvdXA7XHJcbiAgcHJpdmF0ZSBvYXV0aEVudmlyb25tZW50VXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudDtcclxuICBwcml2YXRlIGJhY2tOYXZpZ2F0aW9uUGF0aDogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIHJvdXRlUGFyYW06IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBwcmV2aW91c1JvdXRlUGFyYW06IHN0cmluZztcclxuICBwdWJsaWMgY3VycmVudFVybDogc3RyaW5nID0gJyc7XHJcblxyXG4gIHByaXZhdGUgTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVkgPSAncm91dGVQYXJhbSc7XHJcbiAgcHJpdmF0ZSBQUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZID0gJ3ByZXZpb3VzUGFnZVJvdXRlUGFyYW0nO1xyXG4gIHByaXZhdGUgQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVkgPSAnYmFja05hdmlnYXRpb25QYXRoJztcclxuICBwcml2YXRlIE5BVklHQVRFRF9SRUxPQURfR1JJRF9TVE9SQUdFX0tFWSA9ICduYXZpZ2F0ZWRSZWxvYWRHcmlkJztcclxuICBwcml2YXRlIENMT05FX05FV19NT0RFTF9DQUNIRV9LRVkgPSAnY2xvbmVOZXdNb2RlbCc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjcmV0S2V5ID0gJ215LXNlY3JldC1rZXknO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgbW9kYWxDdHJsOiBNb2RhbENvbnRyb2xsZXIsXHJcbiAgICBwcml2YXRlIG5hdkNvbnRyb2xsZXI6IE5hdkNvbnRyb2xsZXIsXHJcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6IENhY2hlU2VydmljZSxcclxuICAgIHByaXZhdGUgZmllbGRTZXJ2aWNlOiBGaWVsZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlc291cmNlQXBpU2VydmljZTogUmVzb3VyY2VBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlOiBDb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB3ZWJBcGlTZXJ2aWNlOiBXZWJBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB6Y29yZVNlcnZpY2U6IFpDb3JlU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRlYnVnU2VydmljZTogWkNvbXBvbmVudERlYnVnU2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNpZ25hbHJTZXJ2aWNlOiBTaWduYWxyU2VydmljZSxcclxuICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgb2F1dGgyU2VydmljZTogT0F1dGgyU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZVxyXG4gICkge1xyXG4gICAgY29uc29sZS5sb2coJ01haW5TZXJ2aWNlIGNvbnN0cnVjdG9yJyk7XHJcbiAgICB0aGlzLmVudmlyb25tZW50ID0gdGhpcy56Y29yZVNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKTtcclxuICAgIHRoaXMub2F1dGhFbnZpcm9ubWVudFVybCA9IHRoaXMuZW52aXJvbm1lbnQuZTFPYXV0aFVybCArICcvJztcclxuICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQpIHtcclxuICAgICAgICAvLyBTaG93IHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlPy5kaXNtaXNzQWxsKCk7XHJcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2U/LmRpc21pc3NBbGwoKTtcclxuICAgICAgICB0aGlzLm1vZGFsU2VydmljZT8uZGlzbWlzc0FsbCgpO1xyXG4gICAgICAgIC8vIFJlc2V0IHRoZSByb3V0ZVBhcmFtLGJhY2tOYXZpZ2F0aW9uUGF0aCBhbmQgcmVsYXRlZCBzZXNzaW9uU3RvcmFnZSBjdXJyZW50IHBhZ2UgaXMgc3RhcnR1cCBwYWdlXHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0U3RhcnR1cFBhZ2UoKSA9PT0gZXZlbnQudXJsKSB7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0Um91dGVQYXJhbSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFVybCA9IGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzO1xyXG4gICAgICAgIC8vIEhpZGUgcHJvZ3Jlc3Mgc3Bpbm5lciBvciBwcm9ncmVzcyBiYXJcclxuICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvcikge1xyXG4gICAgICAgIC8vIEhpZGUgcHJvZ3Jlc3Mgc3Bpbm5lciBvciBwcm9ncmVzcyBiYXJcclxuICAgICAgICAvLyBQcmVzZW50IGVycm9yIHRvIHVzZXJcclxuICAgICAgICBjb25zb2xlLmxvZyhldmVudC5lcnJvcik7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVMYXN0TmF2aWdhdGVSZWNvcmQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gZm9yIHNpZ25hbFIgYWxlcnRcclxuICBwdWJsaWMgZ2V0TGlzdEZpZWxkTmFtZSA9IChmaWVsZE5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpLnNldChcIm5hbWVcIiwgZmllbGROYW1lKTtcclxuICAgIHJldHVybiB0aGlzLm9hdXRoMlNlcnZpY2UuaHR0cEdldCQodGhpcy5maWVsZFNlcnZpY2UuZG93bmxvYWRMaXN0RmllbGRVcmwsIHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKHJlcyA9PiAocmVzIGFzIGFueSkuRmllbGRFbGVtZW50TWFzdGVySWQpLFxyXG4gICAgICBzd2l0Y2hNYXAoaWQgPT4gdGhpcy5vYXV0aDJTZXJ2aWNlLmh0dHBHZXQkKHRoaXMuZmllbGRTZXJ2aWNlLmRvd25sb2FkRm9ybUZpZWxkVXJsLCB7IGlkIH0pKSxcclxuICAgICAgbWFwKHJlcyA9PiAocmVzIGFzIGFueSkuTmFtZSBhcyBzdHJpbmcpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRm9ybUxpc3RGaWVsZHMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5kYXRhRm9ybUZpZWxkcyA9IHt9O1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2UuZGF0YUxpc3RGaWVsZHMgPSB7fTtcclxuICAgIHRoaXMuZmllbGRTZXJ2aWNlLmRhdGFMaXN0RmllbGRJdGVtcyA9IHt9O1xyXG4gIH1cclxuXHJcbiAgZGlhbG9nT3BlbihvcHRpb25zOiBEaWFsb2dTZXR0aW5ncyk6IERpYWxvZ1JlZiB7XHJcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4ob3B0aW9ucyk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBzdGFydFVwKCkge1xyXG4gICAgY29uc29sZS5sb2coJ0F0IG1haW4uc2VydmljZSAoU3RhcnRVcCkgLi4uJyk7XHJcbiAgfVxyXG5cclxuICBzZXRHcm91cChncm91cDogWkdyb3VwKSB7XHJcbiAgICB0aGlzLmdyb3VwID0gZ3JvdXA7XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5zZXRHcm91cChncm91cCk7XHJcbiAgICB0aGlzLnJlc291cmNlQXBpU2VydmljZS5zZXRHcm91cChncm91cCk7XHJcbiAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy5zZXRHcm91cEZvckRlYnVnZ2VyKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGdldFJlc291cmNlU2VydmVyRGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JvdXBGaWVsZHMoXHJcbiAgICBmaWVsZEVsZW1lbnROYW1lOiBzdHJpbmcsXHJcbiAgICBmb3JtVHlwZTogRm9ybVR5cGUgfCAnTGlzdEZpZWxkJyB8ICdGb3JtRmllbGQnLFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgZmllbGRFbGVtZW50TmFtZSxcclxuICAgICAgZm9ybVR5cGUsXHJcbiAgICAgIGdyb3VwLFxyXG4gICAgICBwcm9wZXJ0eU5hbWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplR3JvdXAoXHJcbiAgICBncm91cDogWkdyb3VwLFxyXG4gICAgY3RybE5hbWU6IHN0cmluZyxcclxuICAgIHBhZ2VOYW1lOiBzdHJpbmcsXHJcbiAgICBtZTogYW55XHJcbiAgKTogU3Vic2NyaXB0aW9uIHtcclxuICAgIGlmIChtZS5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgbWUuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBncm91cC5yZXNvdXJjZVVSTE5hbWUgfHwgY3RybE5hbWU7XHJcbiAgICBncm91cC5yZXNvdXJjZVVSTE5hbWUgPSByZXNvdXJjZU5hbWU7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cCwge1xyXG4gICAgICByZXNvdXJjZVVSTDogdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKHJlc291cmNlTmFtZSksXHJcbiAgICAgIGdyaWRDb2x1bW5GaWVsZHM6IHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgICAgY3RybE5hbWUsXHJcbiAgICAgICAgXCJGb3JtRmllbGRcIixcclxuICAgICAgICBudWxsLFxyXG4gICAgICAgIG51bGxcclxuICAgICAgKSxcclxuICAgICAgY3RybFNjb3BlOiBtZSxcclxuICAgICAgcGFnZU5hbWUsXHJcbiAgICAgIGN0cmxOYW1lLFxyXG4gICAgICAvLyBjcmVhdGVNb2RlbFVSTDogXCIvY3JlYXRlXCIgKyBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICBlZGl0TW9kZWxVUkw6IGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIC8vIGxpc3RNb2RlbFVSTDogXCIvbGlzdFwiICsgY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgLy8gZm9ybUhlYWRlcjogXCIuLi5cIixcclxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxyXG4gICAgICBmaWVsZHM6IFtdLFxyXG4gICAgICB6TW9kZWw6IHt9LFxyXG4gICAgICB6Q29tcG9uZW50czoge30sXHJcbiAgICAgIHpEYXRhOiB7fSxcclxuICAgICAgc3ViamVjdDogbmV3IEJlaGF2aW9yU3ViamVjdDxaQ29tcG9uZW50T3V0cHV0RXZlbnQ+KG51bGwpLFxyXG4gICAgICAvLyBmb3JtOiBudWxsIGFzIEZvcm1Hcm91cCwgLy8gcmVtb3ZlZCBmb3IgYnVnIGZpeC5cclxuICAgICAgY2FuY2VsQnV0dG9uTmFtZTogXCJDbG9zZVwiLFxyXG4gICAgICB6QnV0dG9uc0NvdW50OiAwLFxyXG4gICAgICAvLyB0b3BSaWdodEFjdGlvbkJ1dHRvbjogW10sXHJcbiAgICAgIC8vIG9uQWN0aW9uOiB0aGlzLm9uQWN0aW9uLmJpbmQodGhpcyksXHJcbiAgICAgIGJhY2tOYXZpZ2F0aW9uOiB0aGlzLmJhY2tOYXZpZ2F0aW9uLmJpbmQodGhpcyksXHJcbiAgICAgIGhpc3RvcnlCYWNrOiB0aGlzLmhpc3RvcnlCYWNrLmJpbmQodGhpcyksXHJcbiAgICAgIHJlZnJlc2hQYWdlOiB0aGlzLnJlZnJlc2hQYWdlLmJpbmQodGhpcyksXHJcbiAgICAgIHJlZnJlc2hHcmlkOiB0aGlzLnJlZnJlc2hHcmlkLmJpbmQodGhpcyksXHJcbiAgICAgIHVwZGF0ZU1vZGVsOiB0aGlzLnVwZGF0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGNyZWF0ZU1vZGVsOiB0aGlzLmNyZWF0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGNsb25lTmV3TW9kZWw6IHRoaXMuY2xvbmVOZXdNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBkZWxldGVNb2RlbDogdGhpcy5kZWxldGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBuZXdNb2RlbDogdGhpcy5uZXdNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICAvLyB1cGRhdGVFZGl0TW9kZTogdGhpcy51cGRhdGVFZGl0TW9kZS5iaW5kKHRoaXMpLFxyXG4gICAgICAvLyBfaXNEZWJ1Z2dpbmc6IGVudmlyb25tZW50LmRlYnVnU2Vzc2lvbiB8fCBmYWxzZSxcclxuICAgICAgLy8gX2RlYnVnOiB7XHJcbiAgICAgIC8vICAgekRhdGE6ICB7IGNvbGxlY3RlZEFjdGl2aXRpZXM6IFtdLCBhY3Rpdml0eUNvdW50OiAwIH1cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBhZnRlckdldE1vZGVsU3VjY2VzczogbnVsbCxcclxuICAgICAgLy8gYmVmb3JlVXBkYXRlTW9kZWw6IG51bGwsXHJcbiAgICAgIC8vIGlzRWRpdDogZmFsc2VcclxuICAgIH0pO1xyXG5cclxuICAgIG1lLnN1YnNjcmlwdGlvbiA9IGdyb3VwLnN1YmplY3Quc3Vic2NyaWJlKChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSA9PlxyXG4gICAgICB0aGlzLnN1YmplY3RFdmVudChldmVudCwgZ3JvdXAsIG1lKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gbWUuc3Vic2NyaXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0TW9kZWwkKGdyb3VwOiBaR3JvdXAsIGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgcmVjSWQgPSBpZCB8fCBncm91cC5yZWZlcmVuY2VJZDtcclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2VcclxuICAgICAgLmh0dHBHZXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyByZWNJZCwgbnVsbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGdyb3VwLnpNb2RlbCA9IHptb2RlbDtcclxuICAgICAgICAgIC8vaWYgKFxyXG4gICAgICAgICAgLy8gIGdyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkICYmXHJcbiAgICAgICAgICAvLyAgT2JqZWN0LmtleXMoem1vZGVsKS5pbmRleE9mKGdyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkKSAhPT0gLTEgJiZcclxuICAgICAgICAgIC8vICAhZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlLmVuZHNXaXRoKFwiLmVkaXRcIilcclxuICAgICAgICAgIC8vKSB7XHJcbiAgICAgICAgICAvLyAgZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlID1cclxuICAgICAgICAgIC8vICAgIGdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZSArXHJcbiAgICAgICAgICAvLyAgICBcIi9cIiArXHJcbiAgICAgICAgICAvLyAgICB6bW9kZWxbZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGRdLnRvU3RyaW5nKCkgK1xyXG4gICAgICAgICAgLy8gICAgXCIvZWRpdFwiO1xyXG4gICAgICAgICAgLy99XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIGlmIChncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBjYW5FeGl0KGZvcm06IEZvcm1Hcm91cCk6IGJvb2xlYW4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIGlmICghZm9ybSB8fCAhZm9ybS5kaXJ0eSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZm9ybVsnc2tpcERpcnR5Q2hlY2snXSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5hbGVydFNlcnZpY2VcclxuICAgICAgLnNob3coXCJEYXRhIG5vdCBzYXZlIHlldFwiLCBcIkFyZSB5b3Ugc3VyZSB3YW50IHRvIGRpc2NhcmQgdGhlIGNoYW5nZXM/XCIsIFtcclxuICAgICAgICBcIkNhbmNlbFwiLFxyXG4gICAgICAgIFwiRGlzY2FyZCBDaGFuZ2VzXCIsXHJcbiAgICAgIF0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgocmVwbHkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJEaXNjYXJkIENoYW5nZXNcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBjbG9zZU1vZGFsRm9ybShncm91cD86IFpHcm91cCkge1xyXG4gICAgaWYgKGdyb3VwICYmIGdyb3VwLnN1YmplY3QpIHtcclxuICAgICAgZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcIk1vZGFsU2VydmljZS5jbG9zZVwiLFxyXG4gICAgICAgIHRhcmdldDogXCJtb2RhbEdyb3VwLm1vZGFsQ2FuY2VsKClcIlxyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5tb2RhbEN0cmwuZGlzbWlzcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3ViamVjdEV2ZW50KGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LnRhcmdldCB8fCBldmVudC50YXJnZXQuc3RhcnRzV2l0aChcIm1vZGFsR3JvdXAuXCIpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKFwiPj4gU3ViamVjdEV2ZW50XCIsIGV2ZW50KTtcclxuICAgIGxldCBjYWxsRnVuYztcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjYWxsRnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbChcclxuICAgICAgICBncm91cC5jdHJsU2NvcGUsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgIGdyb3VwXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShldmVudC5UYXJnZXQsIGdyb3VwKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBcIkVycm9yIHdoZW4gZ2V0R3JvdXBWYWx1ZTogXCIsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgIFwiID4gRXJyb3I6IFwiLFxyXG4gICAgICAgIGVycm9yXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FsbEZ1bmMoZXZlbnQpO1xyXG4gICAgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIGNvbnN0IG5ld0Z1bmMgPSBjYWxsRnVuYy5iaW5kKG1lKTtcclxuICAgICAgbmV3RnVuYyhldmVudCwgZ3JvdXAsIG1lKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIGlmIChldmVudC50eXBlLmVuZHNXaXRoKFwib25OYXZpZ2F0ZVRvXCIpKSB7XHJcbiAgICAgICAgY29uc3QgblVybCA9IGV2ZW50LnRhcmdldC5yZXBsYWNlKFwiLzppZFwiLCBcIi9cIiArIGV2ZW50LmRhdGEpO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtuVXJsXSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJ6Z3JpZC1jZWxsQ2xpY2tcIikge1xyXG4gICAgICAgIC8vIChjYWxsRnVuYy5zdGFydHNXaXRoKCdlZGl0JykpIHsgIHpncmlkLWNlbGxDbGlja1xyXG4gICAgICAgIGNvbnN0IGNOYW1lID0gY2FsbEZ1bmMuc2xpY2UoNCk7XHJcbiAgICAgICAgLy8gLy8gZGVidWdnZXI7XHJcbiAgICAgICAgLy8gY29uc3QgbW9kYWxHcm91cFBhcmFtOiBNb2RhbFBhZ2VQYXJhbXMgPSB7fTtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uY29udHJvbGxlck5hbWUgPSBjTmFtZTtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0ucmVmZXJJZCA9IGV2ZW50LmRhdGEuSWQ7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLmNvbEZpZWxkcyQgPSBldmVudC5jb2x1bW5GaWVsZHMkO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5wYXJlbnRHcm91cCA9IG1lLmdyb3VwO1xyXG5cclxuICAgICAgICAvLyB0aGlzLm9wZW5Nb2RhbEZvcm0obW9kYWxHcm91cFBhcmFtKTtcclxuICAgICAgICB0aGlzLnNob3d6TW9kYWwoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkRWxlbWVudE5hbWU6IGNOYW1lLFxyXG4gICAgICAgICAgICBmaWVsZEVsZW1lbnRPYnNlcnZhYmxlJDogZXZlbnQuY29sdW1uRmllbGRzJCxcclxuICAgICAgICAgICAgcGFyZW50R3JvdXA6IGdyb3VwLFxyXG4gICAgICAgICAgICB6TW9kZWw6IHt9LFxyXG4gICAgICAgICAgICBmb3JtSGVhZGVyOiAnJyxcclxuICAgICAgICAgICAgcmVmZXJJZDogZXZlbnQuZGF0YS5JZFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInpncmlkLWNlbGxDbGlja1wiKSB7XHJcbiAgICAgICAgaWYgKGNhbGxGdW5jLm5hdmlnYXRlVXJsKSB7XHJcbiAgICAgICAgICBjb25zdCB1cmwgPSBjYWxsRnVuYy5uYXZpZ2F0ZVVybC5yZXBsYWNlKFwiOmlkXCIsIGV2ZW50LmRhdGEuSWQpO1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbGxGdW5jLmZvcm1IZWFkZXIpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd3pNb2RhbChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGZpZWxkRWxlbWVudE5hbWU6IGNhbGxGdW5jLmN0cmxOYW1lLFxyXG4gICAgICAgICAgICAgIGZpZWxkRWxlbWVudE9ic2VydmFibGUkOiBldmVudC5jb2x1bW5GaWVsZHMkLFxyXG4gICAgICAgICAgICAgIHBhcmVudEdyb3VwOiBtZS5ncm91cCxcclxuICAgICAgICAgICAgICB6TW9kZWw6IHt9LFxyXG4gICAgICAgICAgICAgIGZvcm1IZWFkZXI6IGNhbGxGdW5jLmZvcm1IZWFkZXIsXHJcbiAgICAgICAgICAgICAgcmVmZXJJZDogZXZlbnQuZGF0YS5JZFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBcIkludmFsaWQgY2FsbEZ1bmMgdHlwZTogXCIsXHJcbiAgICAgICAgICBjYWxsRnVuYyxcclxuICAgICAgICAgIFwiIGV2ZW50LlRhcmdldDogXCIsXHJcbiAgICAgICAgICBldmVudC50YXJnZXRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMub3Blbk1vZGFsRm9ybUJ5Q29tcG9uZW50KGNhbGxGdW5jLnR5cGUsIGV2ZW50LkRhdGEuSWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiRnVuY3Rpb24gbm90IGRlZmluZWQgaW4gZ3JvdXAgZm9yOiBcIixcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgXCIsIEV2ZW50OiBcIixcclxuICAgICAgICBldmVudFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlU3VjY2VzcyhyZXM6IFJlc3BvbnNlIHwgYW55LCBzdWNjZXNzTXNnOiBzdHJpbmcpOiBSZXNwb25zZSB7XHJcbiAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcyAmJiByZXMuUHJvY2Vzc2luZ1N0YXR1cykge1xyXG4gICAgICBpZiAodGhpcy5ncm91cD8uZGlzYWJsZVN1Y2Nlc3NDcmVhdGVNc2cgfHwgdGhpcy5ncm91cD8uZGlzYWJsZVN1Y2Nlc3NVcGRhdGVNc2cgfHwgdGhpcy5ncm91cD8uZGlzYWJsZVN1Y2Nlc3NEZWxldGVNc2cpIHtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzZXQgc2Vzc2lvbnN0b3JhZ2UgdG8gdHJpZ2dlciB1cGRhdGUgdXBvbiBjcmVhdGVkXHJcblxyXG4gICAgICAvLyBBbGVydCB1c2VyIHVwZGF0ZS9zYXZlIHN1Y2Nlc3NcclxuICAgICAgdGhpcy53ZWJBcGlTZXJ2aWNlLnNob3dIdHRwUmVzcG9uc2VNZXNzYWdlKE1FU1NBR0VUWVBFLlN1Y2Nlc3MsIHN1Y2Nlc3NNc2csIG51bGwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICB0aGlzLmdyb3VwLmlzVHJpZ2dlcmVkID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXM6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmhhbmRsZUVycm9yKHJlcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcm91dGVOYXZpZ2F0ZShwYWdlTmFtZTogc3RyaW5nLCBwYWdlUGFyYW1zOiBzdHJpbmdbXSwgcm91dGVSZWxhdGl2ZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgIHRoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhwYWdlUGFyYW1zKTtcclxuICAgIGNvbnN0IHNuYXBzaG90VXJsID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZVsnX3JvdXRlclN0YXRlJ10uc25hcHNob3QudXJsLnNwbGl0KCc/JylbMF07XHJcbiAgICBjb25zdCBwYWdlVXJsID0gcm91dGVSZWxhdGl2ZSA/IHNuYXBzaG90VXJsICsgJy8nICsgcGFnZU5hbWUgOiBwYWdlTmFtZTtcclxuXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcGFnZVVybF0sIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXROYXZpZ2F0aW9uUGFyYW1zKHVybFBhcmFtczogc3RyaW5nW10pIHtcclxuICAgIC8vIElmIGl0IGlzIG51bGwgb3IgdW5kZWZpbmVkXHJcbiAgICBpZiAoIXRoaXMuYmFja05hdmlnYXRpb25QYXRoKSB7XHJcbiAgICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzVmFsdWVJbkxhc3RFbGVtZW50KHRoaXMuYmFja05hdmlnYXRpb25QYXRoLCB0aGlzLnJvdXRlci51cmwpKSB7XHJcbiAgICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoLnB1c2godGhpcy5yb3V0ZXIudXJsKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldFJvdXRlUGFyYW0odXJsUGFyYW1zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRSb3V0ZVBhcmFtKHJvdXRlUGFyYW1zOiBzdHJpbmdbXSkge1xyXG4gICAgLy8gSWYgaXQgaXMgbnVsbCBvciB1bmRlZmluZWRcclxuICAgIGlmICghdGhpcy5yb3V0ZVBhcmFtKSB7XHJcbiAgICAgIHRoaXMucm91dGVQYXJhbSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZpbHRlciBvdXQgYW55IGVtcHR5IHN0cmluZyByb3V0ZSBwYXJhbXMgYW5kIGpvaW4gdGhlbSBpbnRvIGEgc2luZ2xlIHN0cmluZ1xyXG4gICAgY29uc3QgbmV3Um91dGVQYXJhbSA9ICcvJyArIE9iamVjdC52YWx1ZXMocm91dGVQYXJhbXMpLmZpbHRlcihlbCA9PiBlbCAhPT0gJycpLmpvaW4oJy8nKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUluTGFzdEVsZW1lbnQodGhpcy5yb3V0ZVBhcmFtLCBuZXdSb3V0ZVBhcmFtKSkge1xyXG4gICAgICBpZiAocm91dGVQYXJhbXMpIHtcclxuICAgICAgICAvLyBDYXB0dXJlIHRoZSBwcmV2aW91cyBwYWdlJ3Mgcm91dGUgcGFyYW0gdG8gYmUgdXNlZCBmb3IgYmFja25hdmlnYXRpb24gY2hlY2tpbmdcclxuICAgICAgICB0aGlzLnByZXZpb3VzUm91dGVQYXJhbSA9IHRoaXMucm91dGVQYXJhbVt0aGlzLnJvdXRlUGFyYW0ubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyByb3V0ZSBwYXJhbSBleGlzdHMsIGNoZWNrIGlmIHRoZSBsYXN0IHNlZ21lbnQgaXMgJ25ldycgb3IgJ3VwZGF0ZSdcclxuICAgICAgICBpZiAodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0pIHtcclxuICAgICAgICAgIGNvbnN0IHBhcmFtU2VnbWVudCA9IHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtLnNwbGl0KFwiL1wiKTtcclxuICAgICAgICAgIGNvbnN0IGFjdGlvblNlZ21lbnQgPSBwYXJhbVNlZ21lbnRbcGFyYW1TZWdtZW50Lmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgLy8gSWYgdGhlIGxhc3Qgc2VnbWVudCBpcyAnbmV3JyBvciAndXBkYXRlJywgc3RvcmUgdGhlIHByZXZpb3VzIHJvdXRlIHBhcmFtIGluIHNlc3Npb24gc3RvcmFnZVxyXG4gICAgICAgICAgY29uc3QgdmFsaWRBY3Rpb25UeXBlcyA9IFtBY3Rpb25UeXBlLk5ldy50b1N0cmluZygpLCBBY3Rpb25UeXBlLkVkaXQudG9TdHJpbmcoKSwgQWN0aW9uVHlwZS5VcGRhdGUudG9TdHJpbmcoKV07XHJcblxyXG4gICAgICAgICAgaWYgKHZhbGlkQWN0aW9uVHlwZXMuaW5jbHVkZXMoYWN0aW9uU2VnbWVudCkpIHtcclxuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5QUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnByZXZpb3VzUm91dGVQYXJhbSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQWRkIHRoZSBuZXcgcm91dGUgcGFyYW0gdG8gdGhlIHJvdXRlUGFyYW0gYXJyYXkgYW5kIHN0b3JlIGl0IGluIHNlc3Npb24gc3RvcmFnZVxyXG4gICAgICAgIHRoaXMucm91dGVQYXJhbS5wdXNoKG5ld1JvdXRlUGFyYW0pO1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVmFsdWVJbkxhc3RFbGVtZW50KGFycmF5OiBhbnlbXSwgdGFyZ2V0VmFsdWU6IGFueSkge1xyXG4gICAgaWYgKGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdID09PSB0YXJnZXRWYWx1ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuYXZpZ2F0ZUZyb21NZW51KHBhZ2VOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHsgc3RhcnRVcFBhZ2UgfSA9IHRoaXMuZW52aXJvbm1lbnQ7XHJcbiAgICB0aGlzLnNldFJvdXRlUGFyYW0oW2Ake3N0YXJ0VXBQYWdlfWBdKTtcclxuICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoLnB1c2godGhpcy5nZXRTdGFydHVwUGFnZSgpKTtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KFt0aGlzLmdldFN0YXJ0dXBQYWdlKCldKSk7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcGFnZU5hbWVdLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRSb3V0ZVBhcmFtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtID0gW107XHJcbiAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCA9IFtdO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5yb3V0ZVBhcmFtKSk7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXROYXZpZ2F0aW9uUGFyYW1zKCk6IGFueVtdIHtcclxuICAgIHRoaXMucm91dGVQYXJhbSA9IHRoaXMucm91dGVQYXJhbSB8fCBbXTtcclxuXHJcbiAgICBpZiAodGhpcy5yb3V0ZVBhcmFtLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zdCBzdG9yZWRQYXJhbXMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVkpO1xyXG4gICAgICBpZiAoc3RvcmVkUGFyYW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMucm91dGVQYXJhbSA9IEpTT04ucGFyc2Uoc3RvcmVkUGFyYW1zKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzdG9yZWQgcm91dGVQYXJhbTonLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coJ05vIHN0b3JlZCBuYXZpZ2F0aW9uIHBhcmFtcyBmb3VuZC4nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5yb3V0ZVBhcmFtO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE5hdmlnYXRpb25QYXJlbnRQYXJhbSgpOiBhbnkge1xyXG4gICAgY29uc3QgbmF2aWdhdGlvblBhcmVudFBhcmFtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvblBhcmFtcygpO1xyXG5cclxuICAgIGlmIChuYXZpZ2F0aW9uUGFyZW50UGFyYW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIG5hdmlnYXRpb25QYXJlbnRQYXJhbXNbbmF2aWdhdGlvblBhcmVudFBhcmFtcy5sZW5ndGggLSAyXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gcGFyZW50IHBhcmFtcyBub3QgZm91bmQuJyk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXROYXZpZ2F0aW9uQ3VycmVudFBhcmFtKCk6IGFueSB7XHJcbiAgICBjb25zdCBuYXZpZ2F0aW9uQ3VycmVudFBhcmFtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvblBhcmFtcygpO1xyXG5cclxuICAgIGlmIChuYXZpZ2F0aW9uQ3VycmVudFBhcmFtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBuYXZpZ2F0aW9uQ3VycmVudFBhcmFtc1tuYXZpZ2F0aW9uQ3VycmVudFBhcmFtcy5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gY3VycmVudCBwYXJhbXMgbm90IGZvdW5kLicpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTogYW55IHtcclxuICAgIGlmICh0aGlzLnByZXZpb3VzUm91dGVQYXJhbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIFJldHVybiB0aGUgY2FjaGVkIHZhbHVlIGlmIGl0IGV4aXN0c1xyXG4gICAgICByZXR1cm4gdGhpcy5wcmV2aW91c1JvdXRlUGFyYW07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcHJldmlvdXNSb3V0ZVBhcmFtU3RyID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVkpO1xyXG4gICAgaWYgKHByZXZpb3VzUm91dGVQYXJhbVN0cikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzUm91dGVQYXJhbSA9IEpTT04ucGFyc2UocHJldmlvdXNSb3V0ZVBhcmFtU3RyKTtcclxuICAgICAgICB0aGlzLnByZXZpb3VzUm91dGVQYXJhbSA9IHByZXZpb3VzUm91dGVQYXJhbTtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXNSb3V0ZVBhcmFtO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgVW5hYmxlIHRvIHBhcnNlIHByZXZpb3VzIHJvdXRlIHBhcmFtIGZyb20gc2Vzc2lvbiBzdG9yYWdlOiAke2Vycm9yfWApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ05vIHByZXZpb3VzIHBhZ2Ugcm91dGUgcGFyYW0gZm91bmQgaW4gc2Vzc2lvbiBzdG9yYWdlLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZVByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZSh0aGlzLlBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhc3ROYXZpZ2F0ZVJlY29yZCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk7XHJcbiAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSkgfHwgXCJudWxsXCIpO1xyXG4gICAgaWYgKHRoaXMuYmFja05hdmlnYXRpb25QYXRoKSB7XHJcbiAgICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoLnBvcCgpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiTm8gYmFjayBuYXZpZ2F0aW9uIHBhdGggZm91bmQgaW4gc2Vzc2lvbi5cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSkgfHwgXCJudWxsXCIpO1xyXG4gICAgaWYgKHRoaXMucm91dGVQYXJhbSkge1xyXG4gICAgICB0aGlzLnJvdXRlUGFyYW0ucG9wKCk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFwicm91dGVQYXJhbSBzZXNzaW9uIGlzIG51bGwuXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGJhY2tOYXZpZ2F0aW9uKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChncm91cFsnaXNFbWJlZGRlZFBhZ2UnXSkge1xyXG4gICAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNsb3NlQ29udGFpbmVyVmlldyhncm91cCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ3JvdXAuYmVmb3JlQmFja05hdmlnYXRpb25QYWdlKSB7XHJcbiAgICAgIGdyb3VwLmJlZm9yZUJhY2tOYXZpZ2F0aW9uUGFnZShncm91cCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbmF2aWdhdGVCYWNrVG9QcmV2aW91c1BhZ2UoZ3JvdXA6IFpHcm91cCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgIGNvbnN0IGJhY2tOYXZpZ2F0aW9uUGF0aDogc3RyaW5nW10gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSkpO1xyXG4gICAgY29uc3QgYmFja05hdmlnYXRpb25VUkwgPSBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgfHwgYmFja05hdmlnYXRpb25QYXRoW2JhY2tOYXZpZ2F0aW9uUGF0aC5sZW5ndGggLSAxXTtcclxuXHJcbiAgICBpZiAoIWJhY2tOYXZpZ2F0aW9uVVJMKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBuYXZpZ2F0aW5nIGJhY2sgdG8gcHJldmlvdXMgcGFnZTogYmFja05hdmlnYXRpb25VUkwgaXMgbm90IHNldC5cIik7XHJcbiAgICAgIC8vdGhyb3cgbmV3IEVycm9yKFwiQmFja05hdmlnYXRpb25QYXRoIG5vdCBzZXQuXCIpO1xyXG4gICAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuZ2V0U3RhcnR1cFBhZ2UoKSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlKSB7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzUm91dGVQYXJhbSA9IHRoaXMuZ2V0UHJldmlvdXNQYWdlUm91dGVQYXJhbSgpO1xyXG4gICAgICBjb25zdCBwcmV2aW91c0N1cnJlbnRSb3V0ZVBhcmFtID0gdGhpcy5nZXROYXZpZ2F0aW9uQ3VycmVudFBhcmFtKCk7XHJcbiAgICAgIGlmICh0aGlzLnJvdXRlUGFyYW0ubGVuZ3RoID09PSAwICYmIHRoaXMucm91dGVOYXZpZ2F0ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuZ2V0U3RhcnR1cFBhZ2UoKSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChwcmV2aW91c1JvdXRlUGFyYW0gJiYgcHJldmlvdXNSb3V0ZVBhcmFtID09PSBwcmV2aW91c0N1cnJlbnRSb3V0ZVBhcmFtKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW1vdmVMYXN0Um91dGVQYXJhbSgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRFRF9SRUxPQURfR1JJRF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodHJ1ZSkpO1xyXG5cclxuICAgIGlmICh0aGlzLmNhY2hlU2VydmljZS5nZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpKSB7XHJcbiAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGJhY2tOYXZpZ2F0aW9uVVJMLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBuYXZpZ2F0aW5nIGJhY2sgdG8gcHJldmlvdXMgcGFnZTogJHtlcnJvci5tZXNzYWdlfWApO1xyXG4gICAgICAvL3Rocm93IGVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFN0YXJ0dXBQYWdlKCkge1xyXG4gICAgY29uc3QgeyBzdGFydFVwUGFnZSB9ID0gdGhpcy5lbnZpcm9ubWVudDtcclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGUgc3RhcnR1cCBwYWdlIHN0YXJ0cyB3aXRoIGEgdW5kZXJzY29yZS5cclxuICAgIGlmIChzdGFydFVwUGFnZS5zdGFydHNXaXRoKCdfJykpIHtcclxuICAgICAgcmV0dXJuIGAvJHtzdGFydFVwUGFnZS5zbGljZSgxKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIG5vdCwgcHJlcGVuZCBhIGZvcndhcmQgc2xhc2ggYW5kIHJldHVybi5cclxuICAgIHJldHVybiBgLyR7c3RhcnRVcFBhZ2V9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGlzdG9yeUJhY2soKSB7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JvdXBbJ2lzRW1iZWRkZWRQYWdlJ10pIHtcclxuICAgICAgdGhpcy5jbG9zZUNvbnRhaW5lclZpZXcodGhpcy5ncm91cCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5hdkNvbnRyb2xsZXIucG9wKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaEdyaWQoXHJcbiAgICBldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIG1lOiBhbnksXHJcbiAgICBncmlkT3B0aW9uTmFtZT86IHN0cmluZ1xyXG4gICkge1xyXG4gICAgZ3JpZE9wdGlvbk5hbWUgPSBncmlkT3B0aW9uTmFtZSB8fCBcImdyaWRPcHRpb25zXCI7XHJcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgIGNvbnN0IGdyaWRPcHRpb24gPSBldmVudC50YXJnZXRcclxuICAgICAgICAudHJpbSgpXHJcbiAgICAgICAgLnJlcGxhY2UoXCIoXCIsIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoXCIpXCIsIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoXCJncm91cC5yZWZyZXNoR3JpZFwiLCBcIlwiKTtcclxuICAgICAgaWYgKGdyaWRPcHRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGdyaWRPcHRpb25OYW1lID0gZ3JpZE9wdGlvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHpncmlkQ29udHJvbCA9IGdyb3VwW2dyaWRPcHRpb25OYW1lXSBhcyBaR3JpZDtcclxuICAgIGlmICh6Z3JpZENvbnRyb2wpIHtcclxuICAgICAgemdyaWRDb250cm9sLmdldERhdGEoKTtcclxuICAgIH1cclxuICAgIGdyb3VwWydpc1RyaWdnZXJlZCddID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2hQYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5yb3V0ZVJldXNlU3RyYXRlZ3kuc2hvdWxkUmV1c2VSb3V0ZSA9ICgpID0+IGZhbHNlO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIub25TYW1lVXJsTmF2aWdhdGlvbiA9ICdyZWxvYWQnO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ1BhdGg6ICcsIHRoaXMuYWN0aXZhdGVkUm91dGVbJ19yb3V0ZXJTdGF0ZSddLnNuYXBzaG90LnVybCk7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jcm0vY3VzdG9tZXInXSk7XHJcbiAgfVxyXG5cclxuICBnZXRDbG9uZU5ld0NhY2hlWk1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGNhY2hlWk1vZGVsID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgIGlmIChjYWNoZVpNb2RlbCkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICAgIGdyb3VwLnpNb2RlbCA9IGNhY2hlWk1vZGVsO1xyXG4gICAgICBncm91cC56TW9kZWwuSWQgPSAwO1xyXG4gICAgfVxyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbmV3TW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgb2YoW10pLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJCZWZvcmUgbmV3LCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlTmV3TW9kZWwoZ3JvdXApO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImN1cnJlbnQgdXJsOiBcIiwgdGhpcy5yb3V0ZXIudXJsKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBncm91cC5wYXJlbnRSZWZlcmVuY2VJZCB8fCBcIjBcIjtcclxuICAgICAgICAvL2NvbnN0IHBhdGhTZWdtZW50ID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KFwiL1wiKTtcclxuICAgICAgICAvL2NvbnN0IGxhc3RTZWdtZW50ID0gcGF0aFNlZ21lbnRbcGF0aFNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5hdmlnYXRpb25QYXJhbSA9IHRoaXMuZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpO1xyXG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25TZWdtZW50cyA9IGN1cnJlbnROYXZpZ2F0aW9uUGFyYW0gPyBjdXJyZW50TmF2aWdhdGlvblBhcmFtLnNwbGl0KCcvJykgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBncm91cC5pc0Nsb25lTmV3ID8gQWN0aW9uVHlwZS5OZXcgOiBBY3Rpb25UeXBlLkVkaXQ7XHJcbiAgICAgICAgY29uc3QgYWN0aW9uU2VnbWVudCA9IGdyb3VwLmlzQ2xvbmVOZXcgPyAobmF2aWdhdGlvblNlZ21lbnRzID8gbmF2aWdhdGlvblNlZ21lbnRzW25hdmlnYXRpb25TZWdtZW50cy5sZW5ndGggLSAxXSA6IEFjdGlvblR5cGUuTmV3KSA6IGRlZmF1bHRBY3Rpb247XHJcblxyXG4gICAgICAgIGlmIChncm91cC5pc0xpc3RGb3JtKSB7XHJcbiAgICAgICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKFtyZWZlcmVuY2VJZCwgQWN0aW9uVHlwZS5OZXcudG9TdHJpbmcoKV0pO1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2dyb3VwLmVkaXRNb2RlbFVSTF0sIHtcclxuICAgICAgICAgICAgcmVsYXRpdmVUbzogZ3JvdXAuY3RybFNjb3BlLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gMTogRnJvbSBMaXN0IE5ldyhhY3Rpb246IG5ldykgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDI6IEZyb20gRm9ybSBOZXcoYWN0aW9uOiBuZXcpID09PiBDbGVhciBmb3JtXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyAzOiBGcm9tIEZvcm0gTmV3KGFjdGlvbjogbmV3KSwgaXNDbG9uZU5ldyA9PT4gRE9OVCBDbGVhciBmb3JtXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyA0OiBGcm9tIEZvcm0gTmV3KGFjdGlvbjogbmV3KSwgaXNDbG9uZU5ldywgU2F2ZSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtIChXaGVuIENyZWF0ZU1vZGVsLCBuZWVkIGNoYW5nZSBpc0Nsb25lTmV3ID0gZmFsc2UpXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyA1OiBGcm9tIExpc3Qgb3BlbiByZWNvcmQoYWN0aW9uOiBlZGl0KSwgaXNDbG9uZU5ldyA9PT4gRE9OVCBDbGVhciBmb3JtXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyA2OiBGcm9tIExpc3Qgb3BlbiByZWNvcmQoYWN0aW9uOiBlZGl0KSwgaXNDbG9uZU5ldywgU2F2ZSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtIChXaGVuIFVwZGF0ZU1vZGVsLCBuZWVkIGNoYW5nZSBpc0Nsb25lTmV3ID0gZmFsc2UpXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyA3OiBGcm9tIExpc3Qgb3BlbiByZWNvcmQoYWN0aW9uOiBlZGl0KSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyA4OiBGcm9tIExpc3Qgb3BlbiByZWNvcmQoYWN0aW9uOiBlZGl0KSwgQ2xpY2sgTmV3LCBTYXZlLCBpc0Nsb25lTmV3ID09PiBET05UIENsZWFyIGZvcm1cclxuXHJcbiAgICAgICAgICBpZiAoYWN0aW9uU2VnbWVudCA9PT0gQWN0aW9uVHlwZS5FZGl0IHx8IGFjdGlvblNlZ21lbnQgPT09IEFjdGlvblR5cGUuTmV3KSB7XHJcbiAgICAgICAgICAgIGlmICghZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICAgICAgICAgIGdyb3VwLmZvcm0ucmVzZXQoKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSB3b3JrZmxvdyBidXR0b24gaWYgdGhlIFR5cGVDb2RlIGlzICdGVU5DVElPTidcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc1R5cGVDb2RlRnVuY3Rpb24oZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZFdvcmtmbG93QnV0dG9uKGdyb3VwLCBldmVudC5kYXRhLnpCdXR0b25OYW1lKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFjdGlvblNlZ21lbnQgPT09IEFjdGlvblR5cGUuRWRpdCkge1xyXG4gICAgICAgICAgICAgIC8vIGNsZWFyIGNsb25lTmV3TW9kZWwgY2FjaGUoaWYgaGF2ZSlcclxuICAgICAgICAgICAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2UuY2xlYXJDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy90aGlzLnNldE5hdmlnYXRpb25QYXJhbXMoW3JlZmVyZW5jZUlkLCAnbmV3J10pO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTtcclxuICAgICAgICAgICAgICB0aGlzLnNldFJvdXRlUGFyYW0oW3JlZmVyZW5jZUlkLCBBY3Rpb25UeXBlLk5ldy50b1N0cmluZygpXSk7XHJcblxyXG4gICAgICAgICAgICAgIGdyb3VwLnpNb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0gPSByZWZlcmVuY2VJZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBncm91cC5pc0VkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNOZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKFtyZWZlcmVuY2VJZCwgQWN0aW9uVHlwZS5OZXcudG9TdHJpbmcoKV0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2dyb3VwLmVkaXRNb2RlbFVSTF0sIHtcclxuICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBncm91cC5jdHJsU2NvcGUuYWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVsb2FkQWxsV29ya2Zsb3dCdXR0b25MaXN0KGdyb3VwKTtcclxuICAgICAgICAgICAgdGhpcy5hZnRlckNsb25lTmV3TW9kZWwoZ3JvdXAsIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hZnRlck5ld01vZGVsKGdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxvYWRBbGxXb3JrZmxvd0J1dHRvbkxpc3QoZ3JvdXApIHtcclxuICAgIGNvbnN0IHdvcmtmbG93QnV0dG9uTGlzdCA9IE9iamVjdC5rZXlzKGdyb3VwLnpDb21wb25lbnRzKVxyXG4gICAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aCgnendvcmtmbG93YnV0dG9uc18nKSlcclxuICAgICAgLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcclxuICAgICAgICBvYmpba2V5XSA9IGdyb3VwLnpDb21wb25lbnRzW2tleV07XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgfSwge30pO1xyXG5cclxuICAgIE9iamVjdC52YWx1ZXMod29ya2Zsb3dCdXR0b25MaXN0KS5mb3JFYWNoKHZhbHVlID0+IHtcclxuICAgICAgdmFsdWVbJ2xvYWRCdXR0b24nXSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NDcmVhdGVkTWVzc2FnZSB8fCBEZWZhdWx0TWVzc2FnZS5yZWNvcmRDcmVhdGVkO1xyXG4gICAgbGV0IGNyZWF0ZU1vZGVscmVzID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIWZnLmRpcnR5KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihEZWZhdWx0TWVzc2FnZS5ub3REaXJ0eU1lc3NhZ2UpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmcudmFsaWQpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLnNob3dGb3JtR3JvdXBFcnJvck1lc3NhZ2UoZ3JvdXAsIGZnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIG9mKGdyb3VwLnpNb2RlbCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBjcmVhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5ncm91cC5za2lwQ3JlYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICBjb25zdCBuZXdNb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgICAgWkNvbXBvbmVudEhlbHBlci5yZW1vdmVOdWxsRmllbGRzKG5ld01vZGVsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoZ3JvdXAucmVzb3VyY2VVUkwsIG5ld01vZGVsKS5waXBlKFxyXG4gICAgICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIGNyZWF0ZU1vZGVscmVzID0gcmVzcDtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCByZXNNZXNzYWdlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgoem1vZGVsOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIGNyZWF0ZWQsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZHpNb2RlbChmZywgem1vZGVsLCBncm91cCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJDcmVhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgIGlmIChjcmVhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzID09IG51bGwgfHwgY3JlYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cyA9PSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAocmVzcCAmJiBncm91cC56TW9kZWwuSWQgIT09IDApIHtcclxuICAgICAgICAgICAgZ3JvdXAuaXNOZXcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncm91cC5jYW5jZWxCdXR0b25OYW1lID0gXCJDbG9zZVwiO1xyXG4gICAgICAgICAgICAvLyBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcCk7XHJcbiAgICAgICAgICAgIC8vIGZnLnBhdGNoVmFsdWUocmVzcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG5cclxuICAgICAgICAgIGlmICgoZ3JvdXAuaXNDbG9zZUFmdGVyU3VjY2VzcyB8fCBncm91cC5pc0Nsb3NlQWZ0ZXJDcmVhdGVkKSAmJiAhZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBmZy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRvbmUgdXBkYXRlTW9kZWwgdXBkYXRlZCB6TW9kZWw6XCIsIGZnLnZhbHVlKTtcclxuICAgICAgICAvLyB0aGlzLnRvYXN0U2VydmljZS5zaG93KFwiUmVjb3JkIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQsIGdyb3VwKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgZm9ybTogRm9ybUdyb3VwID0gbnVsbCwgdXBkYXRlQVBJT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+ID0gbnVsbCwgaXNTa2lwRGlydHkgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBmZyA9IGZvcm0gfHwgZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXNNZXNzYWdlID0gZ3JvdXAuU3VjY2Vzc1VwZGF0ZWRNZXNzYWdlIHx8IERlZmF1bHRNZXNzYWdlLnJlY29yZFVwZGF0ZWQ7XHJcbiAgICBsZXQgdXBkYXRlTW9kZWxyZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0Zvcm1EaXJ0eUFuZFZhbGlkKGZnLCBncm91cCwgaXNTa2lwRGlydHksIGV2ZW50KSkge1xyXG4gICAgICBpZiAoaXNTa2lwRGlydHkpIHtcclxuICAgICAgICBmZy5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVBUElPYnNlcnZhYmxlID0gdXBkYXRlQVBJT2JzZXJ2YWJsZSB8fCB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFB1dCQoYCR7Z3JvdXAucmVzb3VyY2VVUkx9LyR7Z3JvdXAuek1vZGVsLklkfWAsIGdyb3VwLnpNb2RlbCwgZmFsc2UpLnBpcGUoXHJcbiAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgICAvL3RoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIFwiUmVjb3JkIGlzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKVxyXG4gICAgICApKTtcclxuXHJcbiAgICByZXR1cm4gb2YoZ3JvdXAuek1vZGVsKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIHVwZGF0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFncm91cC5za2lwVXBkYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gdXBkYXRlQVBJT2JzZXJ2YWJsZTtcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgocmVzcDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciB1cGRhdGVkLCByZXNwb25zZTpcIiwgcmVzcCk7XHJcbiAgICAgICAgdXBkYXRlTW9kZWxyZXMgPSByZXNwO1xyXG4gICAgICAgIGdyb3VwLmlzQ2xvbmVOZXcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZHpNb2RlbChmZywgcmVzcCwgZ3JvdXApO1xyXG4gICAgICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJVcGRhdGVNb2RlbChncm91cCwgcmVzcCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICBpZiAodXBkYXRlTW9kZWxyZXMgJiYgdXBkYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cykge1xyXG4gICAgICAgICAgaWYgKGdyb3VwLmlzQ2xvc2VBZnRlclN1Y2Nlc3MgfHwgZ3JvdXAuaXNDbG9zZUFmdGVyVXBkYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvbmVzIGEgbmV3IG1vZGVsIGZvciBhIFpHcm91cCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgWkNvbXBvbmVudE91dHB1dEV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtaQ29tcG9uZW50T3V0cHV0RXZlbnR9IGV2ZW50IC0gVGhlIFpDb21wb25lbnRPdXRwdXRFdmVudCB0cmlnZ2VyaW5nIHRoZSBjbG9uZS5cclxuICAgKiBAcGFyYW0ge1pHcm91cH0gZ3JvdXAgLSBUaGUgWkdyb3VwIHRvIGNsb25lIHRoZSBuZXcgbW9kZWwgZm9yLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2xvbmVOZXdNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICAvLyBTZXQgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIG1vZGVsIGlzIGJlaW5nIGNsb25lZFxyXG4gICAgZ3JvdXAuaXNDbG9uZU5ldyA9IHRydWU7XHJcblxyXG4gICAgLy8gRXh0cmFjdCB0aGUgZnVuY3Rpb24gdmFsdWUgZnJvbSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudFxyXG4gICAgY29uc3QgeyB0YXJnZXQgfSA9IGV2ZW50O1xyXG4gICAgY29uc3QgZnVuY3Rpb25WYWx1ZSA9IHRhcmdldD8ubWF0Y2goL1xcKChbXildKylcXCkvKT8uWzFdO1xyXG5cclxuICAgIC8vIElmIHRoZSBmdW5jdGlvbiB2YWx1ZSBpcyAndHJ1ZScsIHJlc2V0IHRoZSBmb3JtIGFuZCBtb2RlbFxyXG4gICAgaWYgKGZ1bmN0aW9uVmFsdWUgPT09ICd0cnVlJykge1xyXG4gICAgICBncm91cC56TW9kZWwgPSB7fTtcclxuICAgICAgZ3JvdXAuZm9ybS5yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERlZmluZSB0aGUgdmFsdWVzIGZvciB0aGUgV0ZTIG1vZGVsXHJcbiAgICBjb25zdCBuZXdNb2RlbFZhbHVlcyA9IHtcclxuICAgICAgSWQ6IDAsXHJcbiAgICAgIFdGU19Eb2N1bWVudElkOiBudWxsLFxyXG4gICAgICBXRlNfU3RhdHVzQ29kZTogbnVsbCxcclxuICAgICAgV0ZTX1N0YXR1c0lkOiBudWxsLFxyXG4gICAgICBXRlNfU3RhdHVzTmFtZTogbnVsbCxcclxuICAgIH07XHJcblxyXG4gICAgLy8gQXNzaWduIHRoZSBXRlMgbW9kZWwgdmFsdWVzIHRvIHRoZSBmb3JtIHZhbHVlIGFuZCBaTW9kZWxcclxuICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuZm9ybS52YWx1ZSwgbmV3TW9kZWxWYWx1ZXMpO1xyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGdyb3VwLmZvcm0udmFsdWUpO1xyXG5cclxuICAgIC8vIFBhdGNoIHRoZSBmb3JtIHdpdGggdGhlIFpNb2RlbCwgbWFyayBpdCBhcyBkaXJ0eSwgYW5kIGNhY2hlIHRoZSBaTW9kZWxcclxuICAgIGNvbnN0IGZnID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBmZy5wYXRjaFZhbHVlKGdyb3VwLnpNb2RlbCk7XHJcbiAgICBmZy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy5jYWNoZVNlcnZpY2Uuc2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZLCBncm91cC56TW9kZWwpO1xyXG5cclxuICAgIC8vIENhbGwgdGhlIG5ld01vZGVsIGZ1bmN0aW9uIGZvciB0aGUgZ3JvdXBcclxuICAgIHRoaXMubmV3TW9kZWwobnVsbCwgZ3JvdXApO1xyXG5cclxuICAgIC8vIFJlbG9hZCB0aGUgd29ya2Zsb3cgYnV0dG9uIGlmIHRoZSBUeXBlQ29kZSBpcyAnRlVOQ1RJT04nXHJcbiAgICBpZiAodGhpcy5pc1R5cGVDb2RlRnVuY3Rpb24oZXZlbnQpKSB7XHJcbiAgICAgIHRoaXMucmVsb2FkV29ya2Zsb3dCdXR0b24oZ3JvdXAsIGV2ZW50LmRhdGEuekJ1dHRvbk5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsZWFyIHRoZSB0cmlnZ2VyIGZsYWdcclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlbGV0ZU1vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGZnOiBGb3JtR3JvdXAgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHJlc01lc3NhZ2UgPSBncm91cC5TdWNjZXNzRGVsZXRlZE1lc3NhZ2UgfHwgRGVmYXVsdE1lc3NhZ2UucmVjb3JkRGVsZXRlZDtcclxuXHJcbiAgICBvZihncm91cC56TW9kZWwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBkZWxldGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZURlbGV0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmFsZXJ0U2VydmljZS5zaG93KFwiRGVsZXRlIFJlY29yZFwiLCBEZWZhdWx0TWVzc2FnZS5jb25maXJtYXRpb24sXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICB7IHRleHQ6IFwiTm9cIiwgY3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCIgfSBhcyBBbGVydEJ1dHRvbixcclxuICAgICAgICAgICAgICB7IHRleHQ6IFwiWWVzXCIsIGNzc0NsYXNzOiBcInByaW1hcnlcIiB9IGFzIEFsZXJ0QnV0dG9uXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgocmVwbHk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5ID09PSBcIlllc1wiKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgICAgIGdyb3VwLnpNb2RlbC5EaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBsZXQgdGVtcFJlc3BvbnNlID0ge307XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2VcclxuICAgICAgICAgICAgICAuaHR0cFB1dCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIGdyb3VwLnpNb2RlbC5JZCwgZ3JvdXAuek1vZGVsKVxyXG4gICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGVtcFJlc3BvbnNlID0gT2JqZWN0LmFzc2lnbih7fSwgcmVzKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciBkZWxldGVkLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyRGVsZXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAvL3RoaXMuaGlzdG9yeUJhY2soKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRlbXBSZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wUmVzcG9uc2VbJ1Byb2Nlc3NpbmdTdGF0dXMnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmcucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja05hdmlnYXRpb24obnVsbCwgZ3JvdXAsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBncm91cC56TW9kZWwuRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhdGNoVXBkYXRlZHpNb2RlbChmZzogRm9ybUdyb3VwLCByZXNwOiBhbnksIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmIChyZXNwKSB7XHJcbiAgICAgIGlmIChyZXNwLkRhdGEpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcC5EYXRhKTtcclxuICAgICAgICBjb25zdCByZXN1bHREYXRhID0gWkNvbXBvbmVudEhlbHBlci5yZW1vdmVUZXh0RWRpdG9yVmFsdWVGcm9tRm9ybVBhdGNoaW5nKHJlc3AuRGF0YSwgZ3JvdXApO1xyXG4gICAgICAgIGZnLnBhdGNoVmFsdWUocmVzdWx0RGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocmVzcFtcIklkXCJdKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIHJlc3ApO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdERhdGEgPSBaQ29tcG9uZW50SGVscGVyLnJlbW92ZVRleHRFZGl0b3JWYWx1ZUZyb21Gb3JtUGF0Y2hpbmcocmVzcCwgZ3JvdXApO1xyXG4gICAgICAgIGZnLnBhdGNoVmFsdWUocmVzdWx0RGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJGYWlsZWQgdG8gcGF0Y2hVcGRhdGVkek1vZGVsIHRvIHRoZSBmb3JtZ3JvdXBcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBncm91cC5yZWZlcmVuY2VJZCA9IGdyb3VwLnpNb2RlbC5JZDtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcblxyXG4gICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNUeXBlQ29kZUZ1bmN0aW9uKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpIHtcclxuICAgIHJldHVybiBldmVudD8uZGF0YT8uVHlwZUNvZGUgPT09ICdGVU5DVElPTic7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbG9hZFdvcmtmbG93QnV0dG9uKGdyb3VwOiBaR3JvdXAsIHpCdXR0b25OYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHdvcmtmbG93QnV0dG9ucyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50KGdyb3VwLCBgendvcmtmbG93YnV0dG9uc18ke3pCdXR0b25OYW1lfWApO1xyXG4gICAgd29ya2Zsb3dCdXR0b25zPy5bJ2xvYWRCdXR0b24nXT8uKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNGb3JtRGlydHlBbmRWYWxpZChmZzogRm9ybUdyb3VwLCBncm91cDogWkdyb3VwLCBpc1NraXBEaXJ0eSA9IGZhbHNlLCBldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWlzU2tpcERpcnR5ICYmICFmZy5kaXJ0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oRGVmYXVsdE1lc3NhZ2Uubm90RGlydHlNZXNzYWdlKTtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50ICYmIGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdID8gZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdIDogRGVmYXVsdE1lc3NhZ2Uubm90RGlydHlNZXNzYWdlO1xyXG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93T2theShEZWZhdWx0RGlhbG9nVGl0bGUubm90aGluZ1RvVXBkYXRlLCBtZXNzYWdlLCBbXCJjb2wtNVwiXSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZS5zaG93Rm9ybUdyb3VwRXJyb3JNZXNzYWdlKGdyb3VwLCBmZyk7XHJcbiAgICAgIGZnLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgZmcubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVEZWxldGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVOZXdNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZU5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZU5ld29kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZU5ld01vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVDcmVhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVDcmVhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuek1vZGVsLklkKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcInpNb2RlbC5JZCBpcyBub3QgZGVmaW5lZFwiLCBncm91cC56TW9kZWwpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgaWYgKCFncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckdldE1vZGVsU3VjY2VzcyBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cCk7XHJcbiAgfVxyXG5cclxuICBhZnRlck5ld01vZGVsKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlck5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyTmV3TW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJOZXdNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckNyZWF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJVcGRhdGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckRlbGV0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckRlbGV0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyRGVsZXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBhZnRlckNsb25lTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckNsb25lTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJDbG9uZU5ld01vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyQ2xvbmVOZXdNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIGFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBvbkFjdGlvbihncm91cDogWkdyb3VwKSB7XHJcbiAgLy8gICB0aGlzLmFjdGlvblNoZWV0Q3RybFxyXG4gIC8vICAgICAuY3JlYXRlKHtcclxuICAvLyAgICAgICBoZWFkZXI6IFwiQ2hvb3NlIGFuIEFjdGlvblwiLFxyXG4gIC8vICAgICAgIGJ1dHRvbnM6IGdyb3VwLnRvcFJpZ2h0QWN0aW9uQnV0dG9uXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIC50aGVuKGFjdGlvblNoZWV0RWwgPT4ge1xyXG4gIC8vICAgICAgIGFjdGlvblNoZWV0RWwucHJlc2VudCgpO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldE1vZGVsVmFsdWUocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGdyb3VwOiBaR3JvdXApIHtcclxuICAvLyAgIGdyb3VwLnpNb2RlbFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XHJcbiAgLy8gICBpZiAoZ3JvdXAuaXNMb2FkaW5nKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGZnID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgLy8gICBpZiAoIWZnKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICwgbm8tZGVidWdnZXJcclxuICAvLyAgICAgZGVidWdnZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBmYyA9IGZnLmNvbnRyb2xzW3Byb3BlcnR5TmFtZV07XHJcbiAgLy8gICBpZiAoIWZjKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyXHJcbiAgLy8gICAgIGRlYnVnZ2VyO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZmMuc2V0VmFsdWUodmFsdWUpO1xyXG4gIC8vICAgZmMubWFya0FzRGlydHkoKTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBzaG93ek1vZGFsKG1vZGFsUGFnZVBhcmFtczogTW9kYWxQYWdlUGFyYW1zKTogT2JzZXJ2YWJsZTxNb2RhbFJlc3BvbnNlPiB7XHJcbiAgICBpZiAobW9kYWxQYWdlUGFyYW1zLnBhcmVudEdyb3VwKSB7XHJcbiAgICAgIC8vIGRpc2FibGUgaXNUcmlnZ2VyZWQgYmVmb3JlIGRpc3BsYXkgdGhlIHBvcHVwLlxyXG4gICAgICBtb2RhbFBhZ2VQYXJhbXMucGFyZW50R3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsUGFnZVBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVQb3N0KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdOYW1lJzogbmFtZSxcclxuICAgICAgJ1ZhbHVlJzogSlNPTi5zdHJpbmdpZnkodmFsdWUpXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKGNvb2tpZVN0b3JlVVJMLCBjb29raWVTdG9yZVZhbHVlKS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJncmlkIGNvbmZpZyBzYXZlZChcIiArIHJlcy5zdGF0dXMgKyBcIik6IFwiLCByZXMpO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZUdldChuYW1lOiBzdHJpbmcsIGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXMvP25hbWU9XCIgKyBuYW1lO1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cEdldCQoY29va2llU3RvcmVVUkwsIHsgaGVhZGVyczogYWNjZXNzVG9rZW4gfSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZURlbGV0ZU11bHRpcGxlKG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcIkFkbWluL0RlbGV0ZU11bHRpcGxlQ29va2llc1wiO1xyXG4gICAgY29uc3QgY29va2llU3RvcmVWYWx1ZSA9IHtcclxuICAgICAgJ2NvbnRhaW5OYW1lJzogbmFtZVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChjb29raWVTdG9yZVVSTCwgY29va2llU3RvcmVWYWx1ZSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0VsZW1lbnRCeUlkKGlkOiBzdHJpbmcsIGJlaGF2aW9yOiAnc21vb3RoJyB8ICdhdXRvJyA9ICdzbW9vdGgnKSB7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3IgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJhbnNsYXRpb25QYWdlRWxlbWVudChncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IG9ic0xpc3QgPSBuZXcgQXJyYXk8T2JzZXJ2YWJsZTxhbnk+PigpO1xyXG4gICAgaWYgKGdyb3VwLmZvcm1IZWFkZXIpIHtcclxuICAgICAgb2JzTGlzdC5wdXNoKHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLiR0cmFuc2xhdGVTaW5nbGVJdGVtKGdyb3VwLCBcImZvcm1IZWFkZXJcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChncm91cC5uYXZJdGVtcyAmJiBncm91cC5uYXZJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIG9ic0xpc3QucHVzaCh0aGlzLnRyYW5zbGF0aW9uU2VydmljZS4kdHJhbnNsYXRlSXRlbUxpc3QoZ3JvdXAubmF2SXRlbXMsIFwidGV4dFwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9ic0xpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKG9ic0xpc3QpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vI3JlZ2lvbiBzaWduYWxSIHNlcnZpY2VcclxuICBwdWJsaWMgam9pblByb2plY3RTaWduYWxSKHByb2plY3RDb2RlPzogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5zaWduYWxyU2VydmljZS5zaWduYWxSRW5hYmxlZCgpKSB7XHJcbiAgICAgIGlmIChwcm9qZWN0Q29kZSkge1xyXG4gICAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuam9pbkdyb3VwKHByb2plY3RDb2RlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBXZSBkZWZhdWx0IGZpcnN0IHByb2plY3QgY29kZSBpbiBlbnZpcm9ubWVudCBhcyBncm91cFxyXG4gICAgICAgIGNvbnN0IGVudmlyb25tZW50ID0gdGhpcy56Y29yZVNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKTtcclxuICAgICAgICBjb25zdCBmaXJzdFByb2plY3RDb2RlID0gZW52aXJvbm1lbnQucHJvamVjdENvZGVzWzBdO1xyXG4gICAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuam9pbkdyb3VwKGZpcnN0UHJvamVjdENvZGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdzaWduYWxSIG5vdCBlbmFibGVkLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVNpZ25hbFJNb2RpZmljYXRpb25BbGVydChmb3JtSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuc2lnbmFsclNlcnZpY2Uuc2lnbmFsUkVuYWJsZWQoKSAmJiB0aGlzLmVudmlyb25tZW50LmVuYWJsZUZvcm1QYWdlTW9kaWZpY2F0aW9uQWxlcnQpIHtcclxuICAgICAgY29uc3QgZXZlbnROYW1lID0gYCR7d2luZG93LmxvY2F0aW9uLmhyZWZ9YC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csIFwiJDFcIik7XHJcbiAgICAgIGlmICghdGhpcy5ncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyKSB7XHJcbiAgICAgICAgdGhpcy5ncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyID0ge307XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyWydhbGVydEZvcm1Nb2RpZmllZCddID0gdGhpcy5hbGVydEZvcm1Nb2RpZmllZC5iaW5kKHRoaXMsIGZvcm1JZCk7XHJcblxyXG4gICAgICB0aGlzLnNpZ25hbHJTZXJ2aWNlLnVuc3Vic2NyaWJlRnJvbUV2ZW50KGAke2V2ZW50TmFtZX1gKTsgLy8gdW5zdWJzY3JpYmUgdGhlIGV2ZW50IGJlZm9yZSBzdWJzY3JpYmUgdG8gZXZlbnQgYWdhaW4uXHJcbiAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuc3Vic2NyaWJlVG9FdmVudCh0aGlzLmdyb3VwLCBgJHtldmVudE5hbWV9YCwgYGdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIuYWxlcnRGb3JtTW9kaWZpZWRgKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ2VuYWJsZUZvcm1QYWdlTW9kaWZpY2F0aW9uQWxlcnQgbm90IGVuYWJsZWQuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFsZXJ0Rm9ybU1vZGlmaWVkKGZvcm1JZDogc3RyaW5nLCBncm91cDogWkdyb3VwLCByZXNwOiBhbnksIGV2ZW50TmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXJlc3ApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3BSZXN1bHQgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG5cclxuICAgIGlmICghcmVzcFJlc3VsdC5Vc2VyTmFtZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZvcm1JZCA9PT0gcmVzcFJlc3VsdC5JZD8udG9TdHJpbmcoKSAmJiBldmVudE5hbWUgPT09IHdpbmRvdy5sb2NhdGlvbi5ocmVmKSB7XHJcbiAgICAgIGlmIChyZXNwUmVzdWx0LlVzZXJOYW1lID09PSB0aGlzLmF1dGhTZXJ2aWNlLmUxVG9rZW4ubXlQcm9maWxlLlVzZXJOYW1lKSB7XHJcbiAgICAgICAgaWYgKHJlc3BSZXN1bHQuQWN0aW9uID09PSBBY3Rpb25UeXBlLlVwZGF0ZSkge1xyXG4gICAgICAgICAgdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBHZXQkKGAke3RoaXMuZ3JvdXAucmVzb3VyY2VVUkx9LyR7Zm9ybUlkfWAsIG51bGwpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZWxvYWREYXRhQW5kV29ya2Zsb3dCdXR0b24ocmVzcCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHJlc3BSZXN1bHQuQWN0aW9uID09PSBBY3Rpb25UeXBlLkRlbGV0ZSkge1xyXG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc2hvdyhcIlJlY29yZCBEZWxldGVkIGJ5IEFub3RoZXIgVXNlclwiLCBcIlRoZSBjdXJyZW50IHJlY29yZCBoYXMgYmVlbiBkZWxldGVkIGJ5IGFub3RoZXIgdXNlci5cIiwgW1xyXG4gICAgICAgICAgICB7IHRleHQ6IFwiT0tcIiwgY3NzQ2xhc3M6IFwicHJpbWFyeVwiIH0gYXMgQWxlcnRCdXR0b25cclxuICAgICAgICAgIF0sIFtcImNvbC02XCJdLCB1bmRlZmluZWQsIHRydWUpLnBpcGUoc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVwbHkgPT09IFwiT0tcIikge1xyXG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVCYWNrVG9QcmV2aW91c1BhZ2UoZ3JvdXApO1xyXG4gICAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJlc3BSZXN1bHQuQWN0aW9uID09PSBBY3Rpb25UeXBlLlVwZGF0ZSkge1xyXG4gICAgICAgICAgdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBHZXQkKGAke3RoaXMuZ3JvdXAucmVzb3VyY2VVUkx9LyR7Zm9ybUlkfWAsIG51bGwpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3AgJiYgcmVzcC5Sb3dWZXJzaW9uKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlc3AuUm93VmVyc2lvbiAhPT0gdGhpcy5ncm91cC56TW9kZWw/LlJvd1ZlcnNpb24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJUaGUgY3VycmVudCBwYWdlIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IG90aGVyIHVzZXJzLlwiLCBcIldvdWxkIHlvdSBsaWtlIHRvIHJlZnJlc2ggdGhlIHBhZ2UgZGF0YT9cIiwgW1xyXG4gICAgICAgICAgICAgICAgICB7IHRleHQ6IFwiTm9cIiwgY3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCIgfSBhcyBBbGVydEJ1dHRvbixcclxuICAgICAgICAgICAgICAgICAgeyB0ZXh0OiBcIlllc1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgXSwgW1wiY29sLTZcIl0sIHVuZGVmaW5lZCwgdHJ1ZSkucGlwZShzd2l0Y2hNYXAoKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJZZXNcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkRGF0YUFuZFdvcmtmbG93QnV0dG9uKHJlc3ApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3dQZXJtYW5lbnRseSgnVGhlIGRhdGEgb24gdGhlIGN1cnJlbnQgcGFnZSBpcyBub3QgdXAgdG8gZGF0ZSwgYXMgaXQgaGFzIGJlZW4gc2F2ZWQgYW5kIG92ZXJ3cml0dGVuIGJ5IGFub3RoZXIgdXNlci4gUGxlYXNlIHJlZnJlc2ggdGhlIHBhZ2UuJywgJ3RvcCcsICd3YXJuaW5nJyk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQWxlcnQgcmVjZWl2ZWQgcmVnYXJkaW5nIGZvcm0gbW9kaWZpY2F0aW9uLCBSb3dWZXJzaW9uIHJlbWFpbnMgdW5hbHRlcmVkLiBObyBmdXJ0aGVyIGFjdGlvbiBoYXMgYmVlbiB0YWtlbi5gKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbG9hZERhdGFBbmRXb3JrZmxvd0J1dHRvbih6TW9kZWw6IGFueSkge1xyXG4gICAgdGhpcy5ncm91cC56TW9kZWwgPSB6TW9kZWw7XHJcbiAgICBjb25zdCBmZzogRm9ybUdyb3VwID0gdGhpcy5ncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGZnLnBhdGNoVmFsdWUodGhpcy5ncm91cC56TW9kZWwpO1xyXG4gICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuXHJcbiAgICAvLyBDYXB0dXJlIGFsbCB3b3JrZmxvdyBidXR0b25zXHJcbiAgICBjb25zdCB3b3JrZmxvd0J1dHRvbnMgPSBPYmplY3Qua2V5cyh0aGlzLmdyb3VwLnpDb21wb25lbnRzKVxyXG4gICAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aChcInp3b3JrZmxvd2J1dHRvbnNfXCIpKVxyXG4gICAgICAubWFwKGtleSA9PiB0aGlzLmdyb3VwLnpDb21wb25lbnRzW2tleV0pO1xyXG5cclxuICAgIC8vIFJlbG9hZCB3b3JrZmxvdyBidXR0b25zXHJcbiAgICB3b3JrZmxvd0J1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xyXG4gICAgICBidXR0b24ubG9hZEJ1dHRvbigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIERFQ1xyXG4gIHB1YmxpYyBhc3luYyBsb2FkQ29udGFpbmVyVmlldyhlbGVtZW50Q29udGFpbmVyOiBhbnksIGNvbnRhaW5lclBhZ2U6IGFueSwgZGF0YTogWkZpZWxkLCBncm91cD86IFpHcm91cCkge1xyXG4gICAgaWYgKCFlbGVtZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRWxlbWVudENvbnRhaW5lciBpcyBudWxsLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29udGFpbmVyUGFnZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkNvbnRhaW5lclBhZ2UgaXMgbnVsbC5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3Q29udGFpbmVyUmVmID0gZWxlbWVudENvbnRhaW5lci52aWV3Q29udGFpbmVyUmVmO1xyXG4gICAgdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xyXG5cclxuICAgIGNvbnN0IGVtYmVkZGVkZ3JvdXAgPSBuZXcgWkdyb3VwKCk7XHJcbiAgICB0aGlzLnNldEdyb3VwRm9yRGVidWdnZXIoZW1iZWRkZWRncm91cCk7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+ID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29udGFpbmVyUGFnZSk7XHJcblxyXG4gICAgZW1iZWRkZWRncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlOyAvLyBlbmFibGUgYmFjayB0aGUgYnV0dG9uIGZvciB0cmlnZ2VyaW5nLlxyXG5cclxuICAgIC8vIE9iamVjdC5hc3NpZ24oY29tcG9uZW50UmVmLmluc3RhbmNlW1wiZ3JvdXBcIl0sIGdyb3VwKTtcclxuICAgIE9iamVjdC5hc3NpZ24oY29tcG9uZW50UmVmLmluc3RhbmNlW1wiZ3JvdXBcIl0sIGVtYmVkZGVkZ3JvdXApO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24oY29tcG9uZW50UmVmLmluc3RhbmNlW1wiZ3JvdXBcIl0sIHsgcGFyZW50R3JvdXA6IGdyb3VwLCBpc0VtYmVkZGVkUGFnZTogdHJ1ZSwgZWxlbWVudENvbnRhaW5lcjogZWxlbWVudENvbnRhaW5lciwgQ29udGFpbmVyRm9ybUF1dG9TY3JvbGw6IGRhdGEuQ29udGFpbmVyRm9ybUF1dG9TY3JvbGwgfSk7XHJcblxyXG4gICAgLy8gdG9kbzogYWRkIGluIHByb3BcclxuICAgIGlmIChkYXRhICYmIGRhdGEuQ29udGFpbmVyRm9ybUF1dG9TY3JvbGwpIHtcclxuICAgICAgdGhpcy5zY3JvbGxUb0VtYmJlZENvbXBvbmVudFBhZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0VtYmJlZENvbXBvbmVudFBhZ2UobWlsbGlTZWNvbmRzOiBudW1iZXIgPSAxNTAwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlbmRPZkdyaWREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVuZC1vZi1ncmlkXCIpO1xyXG4gICAgY29uc3QgZW5kT2ZHcmlkUG9zaXRpb25JbmZvID0gZW5kT2ZHcmlkRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgeUNvb3IgPSAoZW5kT2ZHcmlkUG9zaXRpb25JbmZvPy55IHx8IDYzMCkgLSAxMDtcclxuXHJcbiAgICBjb25zdCBtYWluSW9uQ29udGVudDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpb24tY29udGVudC1tYWluLXBhZ2VcIik7XHJcbiAgICByZXR1cm4gbWFpbklvbkNvbnRlbnQuc2Nyb2xsQnlQb2ludCgwLCB5Q29vciwgbWlsbGlTZWNvbmRzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb1RvcE9mUGFnZShtaWxsaVNlY29uZHM6IG51bWJlciA9IDE1MDApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1haW5Jb25Db250ZW50OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImlvbi1jb250ZW50LW1haW4tcGFnZVwiKTtcclxuICAgIHJldHVybiBtYWluSW9uQ29udGVudC5zY3JvbGxUb1BvaW50KDAsIDAsIG1pbGxpU2Vjb25kcykgYXMgUHJvbWlzZTx2b2lkPjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjbG9zZUNvbnRhaW5lclZpZXcoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKGdyb3VwW2BwYXJlbnRHcm91cGBdICYmIGdyb3VwW2BwYXJlbnRHcm91cGBdW2BlMUNsb3NlR3JpZENvbnRhaW5lcmBdICYmIHR5cGVvZiBncm91cFtgcGFyZW50R3JvdXBgXVtgZTFDbG9zZUdyaWRDb250YWluZXJgXSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIGdyb3VwW2BwYXJlbnRHcm91cGBdW2BlMUNsb3NlR3JpZENvbnRhaW5lcmBdKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHByaXZhdGUgc2V0R3JvdXBGb3JEZWJ1Z2dlcihncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBpc0RlYnVnZ2luZyA9IHRoaXMuemNvcmVTZXJ2aWNlLmlzRGVidWdTZXNzaW9uKCkgfHwgZmFsc2U7XHJcbiAgICBpZiAoaXNEZWJ1Z2dpbmcpIHtcclxuICAgICAgdGhpcy5kZWJ1Z1NlcnZpY2Uub25Jbml0RGVidWdnZXIoZ3JvdXApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2hHcmlkKGdyb3VwOiBaR3JvdXApIHtcclxuICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtcImdyaWRPcHRpb25zXCJdIGFzIFpHcmlkO1xyXG4gIGlmICh6Z3JpZENvbnRyb2wpIHtcclxuICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgfVxyXG4gIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbn1cclxuIl19
1188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFpQyxNQUFNLGlCQUFpQixDQUFDO0FBS2pILDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsZUFBZSxFQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFRLE1BQU0sTUFBTSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBTy9ELE9BQU8sRUFDUSxXQUFXLEVBQWdCLGdCQUFnQixFQUVYLE1BQU0sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUNwRyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7OztBQU16QixNQUFNLE9BQU8sV0FBVztJQWlCdEIsWUFDVSxNQUFjLEVBQ2QsY0FBOEIsRUFDOUIsU0FBMEIsRUFDMUIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsa0JBQXNDLEVBQ3RDLDRCQUEwRCxFQUMxRCxhQUE0QixFQUM1QixZQUEwQixFQUMxQixZQUEwQixFQUMxQixjQUFxQyxFQUNyQyxZQUFvQyxFQUNwQyxrQkFBc0MsRUFDdEMsY0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsV0FBd0I7UUFuQnhCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFD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RDtJQUNILENBQUM7SUFDRCxZQUFZO0lBRUosbUJBQW1CLENBQUMsS0FBYTtRQUN2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxJQUFJLEtBQUssQ0FBQztRQUNoRSxJQUFJLFdBQVcsRUFBRTtZQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQzs7d0dBeDRDVSxXQUFXOzRHQUFYLFdBQVcsY0FIVixNQUFNOzJGQUdQLFdBQVc7a0JBSnZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COztBQTY0Q0QsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFhO0lBQ3ZDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQVUsQ0FBQztJQUNuRCxJQUFJLFlBQVksRUFBRTtRQUNoQixZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDeEI7SUFDRCxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnRSZWYsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uU3RhcnQsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25FcnJvciwgUm91dGVyLCBFdmVudCwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBOYXZDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBvZiwgZm9ya0pvaW4sIGZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwLCBzd2l0Y2hNYXAsIG1hcCwgbWVyZ2VBbGwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IERpYWxvZ1JlZiwgRGlhbG9nU2VydmljZSwgRGlhbG9nU2V0dGluZ3MgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kaWFsb2cnO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50RGVidWdTZXJ2aWNlIH0gZnJvbSAnLi96Y29tcG9uZW50LmRlYnVnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBaR3JpZCB9IGZyb20gJy4uL3pncmlkL3pncmlkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1vZGFsU2VydmljZSwgTW9kYWxSZXNwb25zZSB9IGZyb20gJ21taGdsb2JhbC16bW9kYWwnO1xyXG5pbXBvcnQge1xyXG4gIEFsZXJ0QnV0dG9uLCBNRVNTQUdFVFlQRSwgQWxlcnRTZXJ2aWNlLCBaQ29tcG9uZW50SGVscGVyLCBNb2RhbFBhZ2VQYXJhbXMsXHJcbiAgQ2FjaGVTZXJ2aWNlLCBGaWVsZFNlcnZpY2UsIFJlc291cmNlQXBpU2VydmljZSwgVHJhbnNsYXRpb25TZXJ2aWNlLCBXZWJBcGlTZXJ2aWNlLCBTdG9yYWdlU2Vzc2lvblNlcnZpY2UsIE9BdXRoMlNlcnZpY2UsIFNpZ25hbHJTZXJ2aWNlLCBDb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLFxyXG4gIFpDb21wb25lbnRPdXRwdXRFdmVudCwgWkNvcmVTZXJ2aWNlLCBaRmllbGQsIFpHcm91cCwgRGVmYXVsdE1lc3NhZ2UsIERlZmF1bHREaWFsb2dUaXRsZSwgQWN0aW9uVHlwZSwgVG9hc3RTZXJ2aWNlLCBBdXRoU2VydmljZSwgRm9ybVR5cGVcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNYWluU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBncm91cDogWkdyb3VwO1xyXG4gIHByaXZhdGUgb2F1dGhFbnZpcm9ubWVudFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgZW52aXJvbm1lbnQ7XHJcbiAgcHJpdmF0ZSBiYWNrTmF2aWdhdGlvblBhdGg6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSByb3V0ZVBhcmFtOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHByaXZhdGUgcHJldmlvdXNSb3V0ZVBhcmFtOiBzdHJpbmc7XHJcbiAgcHVibGljIGN1cnJlbnRVcmw6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwcml2YXRlIE5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZID0gJ3JvdXRlUGFyYW0nO1xyXG4gIHByaXZhdGUgUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSA9ICdwcmV2aW91c1BhZ2VSb3V0ZVBhcmFtJztcclxuICBwcml2YXRlIEJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZID0gJ2JhY2tOYXZpZ2F0aW9uUGF0aCc7XHJcbiAgcHJpdmF0ZSBOQVZJR0FURURfUkVMT0FEX0dSSURfU1RPUkFHRV9LRVkgPSAnbmF2aWdhdGVkUmVsb2FkR3JpZCc7XHJcbiAgcHJpdmF0ZSBDTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZID0gJ2Nsb25lTmV3TW9kZWwnO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHNlY3JldEtleSA9ICdteS1zZWNyZXQta2V5JztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBDYWNoZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXNvdXJjZUFwaVNlcnZpY2U6IFJlc291cmNlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZTogQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgemNvcmVTZXJ2aWNlOiBaQ29yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkZWJ1Z1NlcnZpY2U6IFpDb21wb25lbnREZWJ1Z1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzaWduYWxyU2VydmljZTogU2lnbmFsclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIG9hdXRoMlNlcnZpY2U6IE9BdXRoMlNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2VcclxuICApIHtcclxuICAgIGNvbnNvbGUubG9nKCdNYWluU2VydmljZSBjb25zdHJ1Y3RvcicpO1xyXG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IHRoaXMuemNvcmVTZXJ2aWNlLmdldEVudmlyb25tZW50KCk7XHJcbiAgICB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgPSB0aGlzLmVudmlyb25tZW50LmUxT2F1dGhVcmwgKyAnLyc7XHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XHJcbiAgICAgICAgLy8gU2hvdyBwcm9ncmVzcyBzcGlubmVyIG9yIHByb2dyZXNzIGJhclxyXG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50KTtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZT8uZGlzbWlzc0FsbCgpO1xyXG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlPy5kaXNtaXNzQWxsKCk7XHJcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2U/LmRpc21pc3NBbGwoKTtcclxuICAgICAgICAvLyBSZXNldCB0aGUgcm91dGVQYXJhbSxiYWNrTmF2aWdhdGlvblBhdGggYW5kIHJlbGF0ZWQgc2Vzc2lvblN0b3JhZ2UgY3VycmVudCBwYWdlIGlzIHN0YXJ0dXAgcGFnZVxyXG4gICAgICAgIGlmICh0aGlzLmdldFN0YXJ0dXBQYWdlKCkgPT09IGV2ZW50LnVybCkge1xyXG4gICAgICAgICAgdGhpcy5yZXNldFJvdXRlUGFyYW0oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRVcmwgPSBldmVudC51cmxBZnRlclJlZGlyZWN0cztcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgLy8gUHJlc2VudCBlcnJvciB0byB1c2VyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZXJyb3IpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRlUmVjb3JkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIGZvciBzaWduYWxSIGFsZXJ0XHJcbiAgcHVibGljIGdldExpc3RGaWVsZE5hbWUgPSAoZmllbGROYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJuYW1lXCIsIGZpZWxkTmFtZSk7XHJcbiAgICByZXR1cm4gdGhpcy5vYXV0aDJTZXJ2aWNlLmh0dHBHZXQkKHRoaXMuZmllbGRTZXJ2aWNlLmRvd25sb2FkTGlzdEZpZWxkVXJsLCBwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcChyZXMgPT4gKHJlcyBhcyBhbnkpLkZpZWxkRWxlbWVudE1hc3RlcklkKSxcclxuICAgICAgc3dpdGNoTWFwKGlkID0+IHRoaXMub2F1dGgyU2VydmljZS5odHRwR2V0JCh0aGlzLmZpZWxkU2VydmljZS5kb3dubG9hZEZvcm1GaWVsZFVybCwgeyBpZCB9KSksXHJcbiAgICAgIG1hcChyZXMgPT4gKHJlcyBhcyBhbnkpLk5hbWUgYXMgc3RyaW5nKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckZvcm1MaXN0RmllbGRzID0gKCkgPT4ge1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2UuZGF0YUZvcm1GaWVsZHMgPSB7fTtcclxuICAgIHRoaXMuZmllbGRTZXJ2aWNlLmRhdGFMaXN0RmllbGRzID0ge307XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5kYXRhTGlzdEZpZWxkSXRlbXMgPSB7fTtcclxuICB9XHJcblxyXG4gIGRpYWxvZ09wZW4ob3B0aW9uczogRGlhbG9nU2V0dGluZ3MpOiBEaWFsb2dSZWYge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKG9wdGlvbnMpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgc3RhcnRVcCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdBdCBtYWluLnNlcnZpY2UgKFN0YXJ0VXApIC4uLicpO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JvdXAoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy5ncm91cCA9IGdyb3VwO1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy53ZWJBcGlTZXJ2aWNlLnNldEdyb3VwKGdyb3VwKTtcclxuICAgIHRoaXMuc2V0R3JvdXBGb3JEZWJ1Z2dlcihncm91cCk7XHJcbiAgfVxyXG5cclxuICBnZXRSZXNvdXJjZVNlcnZlckRhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UubG9hZERhdGEoKTtcclxuICB9XHJcblxyXG4gIGdldEdyb3VwRmllbGRzKFxyXG4gICAgZmllbGRFbGVtZW50TmFtZTogc3RyaW5nLFxyXG4gICAgZm9ybVR5cGU6IEZvcm1UeXBlIHwgJ0xpc3RGaWVsZCcgfCAnRm9ybUZpZWxkJyxcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgIGZpZWxkRWxlbWVudE5hbWUsXHJcbiAgICAgIGZvcm1UeXBlLFxyXG4gICAgICBncm91cCxcclxuICAgICAgcHJvcGVydHlOYW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZUdyb3VwKFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIGN0cmxOYW1lOiBzdHJpbmcsXHJcbiAgICBwYWdlTmFtZTogc3RyaW5nLFxyXG4gICAgbWU6IGFueVxyXG4gICk6IFN1YnNjcmlwdGlvbiB7XHJcbiAgICBpZiAobWUuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIG1lLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gZ3JvdXAucmVzb3VyY2VVUkxOYW1lIHx8IGN0cmxOYW1lO1xyXG4gICAgZ3JvdXAucmVzb3VyY2VVUkxOYW1lID0gcmVzb3VyY2VOYW1lO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAsIHtcclxuICAgICAgcmVzb3VyY2VVUkw6IHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmdldFVSTChyZXNvdXJjZU5hbWUpLFxyXG4gICAgICBncmlkQ29sdW1uRmllbGRzOiB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKFxyXG4gICAgICAgIGN0cmxOYW1lLFxyXG4gICAgICAgIFwiRm9ybUZpZWxkXCIsXHJcbiAgICAgICAgbnVsbCxcclxuICAgICAgICBudWxsXHJcbiAgICAgICksXHJcbiAgICAgIGN0cmxTY29wZTogbWUsXHJcbiAgICAgIHBhZ2VOYW1lLFxyXG4gICAgICBjdHJsTmFtZSxcclxuICAgICAgLy8gY3JlYXRlTW9kZWxVUkw6IFwiL2NyZWF0ZVwiICsgY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgZWRpdE1vZGVsVVJMOiBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAvLyBsaXN0TW9kZWxVUkw6IFwiL2xpc3RcIiArIGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIC8vIGZvcm1IZWFkZXI6IFwiLi4uXCIsXHJcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcclxuICAgICAgZmllbGRzOiBbXSxcclxuICAgICAgek1vZGVsOiB7fSxcclxuICAgICAgekNvbXBvbmVudHM6IHt9LFxyXG4gICAgICB6RGF0YToge30sXHJcbiAgICAgIHN1YmplY3Q6IG5ldyBCZWhhdmlvclN1YmplY3Q8WkNvbXBvbmVudE91dHB1dEV2ZW50PihudWxsKSxcclxuICAgICAgLy8gZm9ybTogbnVsbCBhcyBGb3JtR3JvdXAsIC8vIHJlbW92ZWQgZm9yIGJ1ZyBmaXguXHJcbiAgICAgIGNhbmNlbEJ1dHRvbk5hbWU6IFwiQ2xvc2VcIixcclxuICAgICAgekJ1dHRvbnNDb3VudDogMCxcclxuICAgICAgLy8gdG9wUmlnaHRBY3Rpb25CdXR0b246IFtdLFxyXG4gICAgICAvLyBvbkFjdGlvbjogdGhpcy5vbkFjdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgICBiYWNrTmF2aWdhdGlvbjogdGhpcy5iYWNrTmF2aWdhdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgICBoaXN0b3J5QmFjazogdGhpcy5oaXN0b3J5QmFjay5iaW5kKHRoaXMpLFxyXG4gICAgICByZWZyZXNoUGFnZTogdGhpcy5yZWZyZXNoUGFnZS5iaW5kKHRoaXMpLFxyXG4gICAgICByZWZyZXNoR3JpZDogdGhpcy5yZWZyZXNoR3JpZC5iaW5kKHRoaXMpLFxyXG4gICAgICB1cGRhdGVNb2RlbDogdGhpcy51cGRhdGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBjcmVhdGVNb2RlbDogdGhpcy5jcmVhdGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBjbG9uZU5ld01vZGVsOiB0aGlzLmNsb25lTmV3TW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgZGVsZXRlTW9kZWw6IHRoaXMuZGVsZXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgbmV3TW9kZWw6IHRoaXMubmV3TW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgLy8gdXBkYXRlRWRpdE1vZGU6IHRoaXMudXBkYXRlRWRpdE1vZGUuYmluZCh0aGlzKSxcclxuICAgICAgLy8gX2lzRGVidWdnaW5nOiBlbnZpcm9ubWVudC5kZWJ1Z1Nlc3Npb24gfHwgZmFsc2UsXHJcbiAgICAgIC8vIF9kZWJ1Zzoge1xyXG4gICAgICAvLyAgIHpEYXRhOiAgeyBjb2xsZWN0ZWRBY3Rpdml0aWVzOiBbXSwgYWN0aXZpdHlDb3VudDogMCB9XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3M6IG51bGwsXHJcbiAgICAgIC8vIGJlZm9yZVVwZGF0ZU1vZGVsOiBudWxsLFxyXG4gICAgICAvLyBpc0VkaXQ6IGZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICBtZS5zdWJzY3JpcHRpb24gPSBncm91cC5zdWJqZWN0LnN1YnNjcmliZSgoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCkgPT5cclxuICAgICAgdGhpcy5zdWJqZWN0RXZlbnQoZXZlbnQsIGdyb3VwLCBtZSlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIG1lLnN1YnNjcmlwdGlvbjtcclxuICB9XHJcblxyXG4gIGdldE1vZGVsJChncm91cDogWkdyb3VwLCBpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IHJlY0lkID0gaWQgfHwgZ3JvdXAucmVmZXJlbmNlSWQ7XHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgIC5odHRwR2V0JChncm91cC5yZXNvdXJjZVVSTCArIFwiL1wiICsgcmVjSWQsIG51bGwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBncm91cC56TW9kZWwgPSB6bW9kZWw7XHJcbiAgICAgICAgICAvL2lmIChcclxuICAgICAgICAgIC8vICBncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZCAmJlxyXG4gICAgICAgICAgLy8gIE9iamVjdC5rZXlzKHptb2RlbCkuaW5kZXhPZihncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZCkgIT09IC0xICYmXHJcbiAgICAgICAgICAvLyAgIWdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZS5lbmRzV2l0aChcIi5lZGl0XCIpXHJcbiAgICAgICAgICAvLykge1xyXG4gICAgICAgICAgLy8gIGdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZSA9XHJcbiAgICAgICAgICAvLyAgICBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgK1xyXG4gICAgICAgICAgLy8gICAgXCIvXCIgK1xyXG4gICAgICAgICAgLy8gICAgem1vZGVsW2dyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkXS50b1N0cmluZygpICtcclxuICAgICAgICAgIC8vICAgIFwiL2VkaXRcIjtcclxuICAgICAgICAgIC8vfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZ3JvdXAuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MoZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgY2FuRXhpdChmb3JtOiBGb3JtR3JvdXApOiBib29sZWFuIHwgT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWZvcm0gfHwgIWZvcm0uZGlydHkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZvcm1bJ3NraXBEaXJ0eUNoZWNrJ10pIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYWxlcnRTZXJ2aWNlXHJcbiAgICAgIC5zaG93KFwiRGF0YSBub3Qgc2F2ZSB5ZXRcIiwgXCJBcmUgeW91IHN1cmUgd2FudCB0byBkaXNjYXJkIHRoZSBjaGFuZ2VzP1wiLCBbXHJcbiAgICAgICAgXCJDYW5jZWxcIixcclxuICAgICAgICBcIkRpc2NhcmQgQ2hhbmdlc1wiLFxyXG4gICAgICBdKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVwbHkgPT09IFwiRGlzY2FyZCBDaGFuZ2VzXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VNb2RhbEZvcm0oZ3JvdXA/OiBaR3JvdXApIHtcclxuICAgIGlmIChncm91cCAmJiBncm91cC5zdWJqZWN0KSB7XHJcbiAgICAgIGdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogXCJNb2RhbFNlcnZpY2UuY2xvc2VcIixcclxuICAgICAgICB0YXJnZXQ6IFwibW9kYWxHcm91cC5tb2RhbENhbmNlbCgpXCJcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3MoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1YmplY3RFdmVudChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC50YXJnZXQgfHwgZXZlbnQudGFyZ2V0LnN0YXJ0c1dpdGgoXCJtb2RhbEdyb3VwLlwiKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcIj4+IFN1YmplY3RFdmVudFwiLCBldmVudCk7XHJcbiAgICBsZXQgY2FsbEZ1bmM7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY2FsbEZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwoXHJcbiAgICAgICAgZ3JvdXAuY3RybFNjb3BlLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBncm91cFxyXG4gICAgICApO1xyXG4gICAgICAvLyBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZXZlbnQuVGFyZ2V0LCBncm91cCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJFcnJvciB3aGVuIGdldEdyb3VwVmFsdWU6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiA+IEVycm9yOiBcIixcclxuICAgICAgICBlcnJvclxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNhbGxGdW5jKGV2ZW50KTtcclxuICAgIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBjb25zdCBuZXdGdW5jID0gY2FsbEZ1bmMuYmluZChtZSk7XHJcbiAgICAgIG5ld0Z1bmMoZXZlbnQsIGdyb3VwLCBtZSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZS5lbmRzV2l0aChcIm9uTmF2aWdhdGVUb1wiKSkge1xyXG4gICAgICAgIGNvbnN0IG5VcmwgPSBldmVudC50YXJnZXQucmVwbGFjZShcIi86aWRcIiwgXCIvXCIgKyBldmVudC5kYXRhKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbblVybF0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICAvLyAoY2FsbEZ1bmMuc3RhcnRzV2l0aCgnZWRpdCcpKSB7ICB6Z3JpZC1jZWxsQ2xpY2tcclxuICAgICAgICBjb25zdCBjTmFtZSA9IGNhbGxGdW5jLnNsaWNlKDQpO1xyXG4gICAgICAgIC8vIC8vIGRlYnVnZ2VyO1xyXG4gICAgICAgIC8vIGNvbnN0IG1vZGFsR3JvdXBQYXJhbTogTW9kYWxQYWdlUGFyYW1zID0ge307XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLmNvbnRyb2xsZXJOYW1lID0gY05hbWU7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnJlZmVySWQgPSBldmVudC5kYXRhLklkO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb2xGaWVsZHMkID0gZXZlbnQuY29sdW1uRmllbGRzJDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0ucGFyZW50R3JvdXAgPSBtZS5ncm91cDtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtKG1vZGFsR3JvdXBQYXJhbSk7XHJcbiAgICAgICAgdGhpcy5zaG93ek1vZGFsKFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZEVsZW1lbnROYW1lOiBjTmFtZSxcclxuICAgICAgICAgICAgZmllbGRFbGVtZW50T2JzZXJ2YWJsZSQ6IGV2ZW50LmNvbHVtbkZpZWxkcyQsXHJcbiAgICAgICAgICAgIHBhcmVudEdyb3VwOiBncm91cCxcclxuICAgICAgICAgICAgek1vZGVsOiB7fSxcclxuICAgICAgICAgICAgZm9ybUhlYWRlcjogJycsXHJcbiAgICAgICAgICAgIHJlZmVySWQ6IGV2ZW50LmRhdGEuSWRcclxuICAgICAgICAgIH1cclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJ6Z3JpZC1jZWxsQ2xpY2tcIikge1xyXG4gICAgICAgIGlmIChjYWxsRnVuYy5uYXZpZ2F0ZVVybCkge1xyXG4gICAgICAgICAgY29uc3QgdXJsID0gY2FsbEZ1bmMubmF2aWdhdGVVcmwucmVwbGFjZShcIjppZFwiLCBldmVudC5kYXRhLklkKTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYWxsRnVuYy5mb3JtSGVhZGVyKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3d6TW9kYWwoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBmaWVsZEVsZW1lbnROYW1lOiBjYWxsRnVuYy5jdHJsTmFtZSxcclxuICAgICAgICAgICAgICBmaWVsZEVsZW1lbnRPYnNlcnZhYmxlJDogZXZlbnQuY29sdW1uRmllbGRzJCxcclxuICAgICAgICAgICAgICBwYXJlbnRHcm91cDogbWUuZ3JvdXAsXHJcbiAgICAgICAgICAgICAgek1vZGVsOiB7fSxcclxuICAgICAgICAgICAgICBmb3JtSGVhZGVyOiBjYWxsRnVuYy5mb3JtSGVhZGVyLFxyXG4gICAgICAgICAgICAgIHJlZmVySWQ6IGV2ZW50LmRhdGEuSWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgXCJJbnZhbGlkIGNhbGxGdW5jIHR5cGU6IFwiLFxyXG4gICAgICAgICAgY2FsbEZ1bmMsXHJcbiAgICAgICAgICBcIiBldmVudC5UYXJnZXQ6IFwiLFxyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLm9wZW5Nb2RhbEZvcm1CeUNvbXBvbmVudChjYWxsRnVuYy50eXBlLCBldmVudC5EYXRhLklkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBcIkZ1bmN0aW9uIG5vdCBkZWZpbmVkIGluIGdyb3VwIGZvcjogXCIsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgIFwiLCBFdmVudDogXCIsXHJcbiAgICAgICAgZXZlbnRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVN1Y2Nlc3MocmVzOiBSZXNwb25zZSB8IGFueSwgc3VjY2Vzc01zZzogc3RyaW5nKTogUmVzcG9uc2Uge1xyXG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXMgJiYgcmVzLlByb2Nlc3NpbmdTdGF0dXMpIHtcclxuICAgICAgaWYgKHRoaXMuZ3JvdXA/LmRpc2FibGVTdWNjZXNzQ3JlYXRlTXNnIHx8IHRoaXMuZ3JvdXA/LmRpc2FibGVTdWNjZXNzVXBkYXRlTXNnIHx8IHRoaXMuZ3JvdXA/LmRpc2FibGVTdWNjZXNzRGVsZXRlTXNnKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IHNlc3Npb25zdG9yYWdlIHRvIHRyaWdnZXIgdXBkYXRlIHVwb24gY3JlYXRlZFxyXG5cclxuICAgICAgLy8gQWxlcnQgdXNlciB1cGRhdGUvc2F2ZSBzdWNjZXNzXHJcbiAgICAgIHRoaXMud2ViQXBpU2VydmljZS5zaG93SHR0cFJlc3BvbnNlTWVzc2FnZShNRVNTQUdFVFlQRS5TdWNjZXNzLCBzdWNjZXNzTXNnLCBudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyeVVwZGF0ZUdyb3VwVHJpZ2dlcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgdGhpcy5ncm91cC5pc1RyaWdnZXJlZCA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXJyb3IocmVzOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5oYW5kbGVFcnJvcihyZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJvdXRlTmF2aWdhdGUocGFnZU5hbWU6IHN0cmluZywgcGFnZVBhcmFtczogc3RyaW5nW10sIHJvdXRlUmVsYXRpdmU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnNldE5hdmlnYXRpb25QYXJhbXMocGFnZVBhcmFtcyk7XHJcbiAgICBjb25zdCBzbmFwc2hvdFVybCA9IHRoaXMuYWN0aXZhdGVkUm91dGVbJ19yb3V0ZXJTdGF0ZSddLnNuYXBzaG90LnVybC5zcGxpdCgnPycpWzBdO1xyXG4gICAgY29uc3QgcGFnZVVybCA9IHJvdXRlUmVsYXRpdmUgPyBzbmFwc2hvdFVybCArICcvJyArIHBhZ2VOYW1lIDogcGFnZU5hbWU7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3BhZ2VVcmxdLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TmF2aWdhdGlvblBhcmFtcyh1cmxQYXJhbXM6IHN0cmluZ1tdKSB7XHJcbiAgICAvLyBJZiBpdCBpcyBudWxsIG9yIHVuZGVmaW5lZFxyXG4gICAgaWYgKCF0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkge1xyXG4gICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5pc1ZhbHVlSW5MYXN0RWxlbWVudCh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCwgdGhpcy5yb3V0ZXIudXJsKSkge1xyXG4gICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aC5wdXNoKHRoaXMucm91dGVyLnVybCk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMuYmFja05hdmlnYXRpb25QYXRoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRSb3V0ZVBhcmFtKHVybFBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Um91dGVQYXJhbShyb3V0ZVBhcmFtczogc3RyaW5nW10pIHtcclxuICAgIC8vIElmIGl0IGlzIG51bGwgb3IgdW5kZWZpbmVkXHJcbiAgICBpZiAoIXRoaXMucm91dGVQYXJhbSkge1xyXG4gICAgICB0aGlzLnJvdXRlUGFyYW0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGaWx0ZXIgb3V0IGFueSBlbXB0eSBzdHJpbmcgcm91dGUgcGFyYW1zIGFuZCBqb2luIHRoZW0gaW50byBhIHNpbmdsZSBzdHJpbmdcclxuICAgIGNvbnN0IG5ld1JvdXRlUGFyYW0gPSAnLycgKyBPYmplY3QudmFsdWVzKHJvdXRlUGFyYW1zKS5maWx0ZXIoZWwgPT4gZWwgIT09ICcnKS5qb2luKCcvJyk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzVmFsdWVJbkxhc3RFbGVtZW50KHRoaXMucm91dGVQYXJhbSwgbmV3Um91dGVQYXJhbSkpIHtcclxuICAgICAgaWYgKHJvdXRlUGFyYW1zKSB7XHJcbiAgICAgICAgLy8gQ2FwdHVyZSB0aGUgcHJldmlvdXMgcGFnZSdzIHJvdXRlIHBhcmFtIHRvIGJlIHVzZWQgZm9yIGJhY2tuYXZpZ2F0aW9uIGNoZWNraW5nXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0gPSB0aGlzLnJvdXRlUGFyYW1bdGhpcy5yb3V0ZVBhcmFtLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgcm91dGUgcGFyYW0gZXhpc3RzLCBjaGVjayBpZiB0aGUgbGFzdCBzZWdtZW50IGlzICduZXcnIG9yICd1cGRhdGUnXHJcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJhbVNlZ21lbnQgPSB0aGlzLnByZXZpb3VzUm91dGVQYXJhbS5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25TZWdtZW50ID0gcGFyYW1TZWdtZW50W3BhcmFtU2VnbWVudC5sZW5ndGggLSAxXTtcclxuICAgICAgICAgIC8vIElmIHRoZSBsYXN0IHNlZ21lbnQgaXMgJ25ldycgb3IgJ3VwZGF0ZScsIHN0b3JlIHRoZSBwcmV2aW91cyByb3V0ZSBwYXJhbSBpbiBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgICAgIGNvbnN0IHZhbGlkQWN0aW9uVHlwZXMgPSBbQWN0aW9uVHlwZS5OZXcudG9TdHJpbmcoKSwgQWN0aW9uVHlwZS5FZGl0LnRvU3RyaW5nKCksIEFjdGlvblR5cGUuVXBkYXRlLnRvU3RyaW5nKCldO1xyXG5cclxuICAgICAgICAgIGlmICh2YWxpZEFjdGlvblR5cGVzLmluY2x1ZGVzKGFjdGlvblNlZ21lbnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IHJvdXRlIHBhcmFtIHRvIHRoZSByb3V0ZVBhcmFtIGFycmF5IGFuZCBzdG9yZSBpdCBpbiBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgICB0aGlzLnJvdXRlUGFyYW0ucHVzaChuZXdSb3V0ZVBhcmFtKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbHVlSW5MYXN0RWxlbWVudChhcnJheTogYW55W10sIHRhcmdldFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChhcnJheVthcnJheS5sZW5ndGggLSAxXSA9PT0gdGFyZ2V0VmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmF2aWdhdGVGcm9tTWVudShwYWdlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB7IHN0YXJ0VXBQYWdlIH0gPSB0aGlzLmVudmlyb25tZW50O1xyXG4gICAgdGhpcy5zZXRSb3V0ZVBhcmFtKFtgJHtzdGFydFVwUGFnZX1gXSk7XHJcbiAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aC5wdXNoKHRoaXMuZ2V0U3RhcnR1cFBhZ2UoKSk7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShbdGhpcy5nZXRTdGFydHVwUGFnZSgpXSkpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3BhZ2VOYW1lXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0Um91dGVQYXJhbSgpOiB2b2lkIHtcclxuICAgIHRoaXMucm91dGVQYXJhbSA9IFtdO1xyXG4gICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TmF2aWdhdGlvblBhcmFtcygpOiBhbnlbXSB7XHJcbiAgICB0aGlzLnJvdXRlUGFyYW0gPSB0aGlzLnJvdXRlUGFyYW0gfHwgW107XHJcblxyXG4gICAgaWYgKHRoaXMucm91dGVQYXJhbS5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc3Qgc3RvcmVkUGFyYW1zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZKTtcclxuICAgICAgaWYgKHN0b3JlZFBhcmFtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHN0b3JlZFBhcmFtcyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgc3RvcmVkIHJvdXRlUGFyYW06JywgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdObyBzdG9yZWQgbmF2aWdhdGlvbiBwYXJhbXMgZm91bmQuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucm91dGVQYXJhbTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXROYXZpZ2F0aW9uUGFyZW50UGFyYW0oKTogYW55IHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25QYXJlbnRQYXJhbXMgPSB0aGlzLmdldE5hdmlnYXRpb25QYXJhbXMoKTtcclxuXHJcbiAgICBpZiAobmF2aWdhdGlvblBhcmVudFBhcmFtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBuYXZpZ2F0aW9uUGFyZW50UGFyYW1zW25hdmlnYXRpb25QYXJlbnRQYXJhbXMubGVuZ3RoIC0gMl07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdOYXZpZ2F0aW9uIHBhcmVudCBwYXJhbXMgbm90IGZvdW5kLicpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpOiBhbnkge1xyXG4gICAgY29uc3QgbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMgPSB0aGlzLmdldE5hdmlnYXRpb25QYXJhbXMoKTtcclxuXHJcbiAgICBpZiAobmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXNbbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdOYXZpZ2F0aW9uIGN1cnJlbnQgcGFyYW1zIG5vdCBmb3VuZC4nKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBSZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZSBpZiBpdCBleGlzdHNcclxuICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZXZpb3VzUm91dGVQYXJhbVN0ciA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5QUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZKTtcclxuICAgIGlmIChwcmV2aW91c1JvdXRlUGFyYW1TdHIpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwcmV2aW91c1JvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHByZXZpb3VzUm91dGVQYXJhbVN0cik7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0gPSBwcmV2aW91c1JvdXRlUGFyYW07XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzUm91dGVQYXJhbTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYFVuYWJsZSB0byBwYXJzZSBwcmV2aW91cyByb3V0ZSBwYXJhbSBmcm9tIHNlc3Npb24gc3RvcmFnZTogJHtlcnJvcn1gKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdObyBwcmV2aW91cyBwYWdlIHJvdXRlIHBhcmFtIGZvdW5kIGluIHNlc3Npb24gc3RvcmFnZS4nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUodGhpcy5QUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVMYXN0TmF2aWdhdGVSZWNvcmQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpO1xyXG4gICAgdGhpcy5yZW1vdmVMYXN0Um91dGVQYXJhbSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVkpIHx8IFwibnVsbFwiKTtcclxuICAgIGlmICh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkge1xyXG4gICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aC5wb3AoKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIk5vIGJhY2sgbmF2aWdhdGlvbiBwYXRoIGZvdW5kIGluIHNlc3Npb24uXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVkpIHx8IFwibnVsbFwiKTtcclxuICAgIGlmICh0aGlzLnJvdXRlUGFyYW0pIHtcclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtLnBvcCgpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcInJvdXRlUGFyYW0gc2Vzc2lvbiBpcyBudWxsLlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBiYWNrTmF2aWdhdGlvbihldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBtZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoZ3JvdXBbJ2lzRW1iZWRkZWRQYWdlJ10pIHtcclxuICAgICAgZ3JvdXBbJ2lzVHJpZ2dlcmVkJ10gPSBmYWxzZTtcclxuICAgICAgdGhpcy5jbG9zZUNvbnRhaW5lclZpZXcoZ3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGdyb3VwLmJlZm9yZUJhY2tOYXZpZ2F0aW9uUGFnZSkge1xyXG4gICAgICBncm91cC5iZWZvcmVCYWNrTmF2aWdhdGlvblBhZ2UoZ3JvdXApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwOiBaR3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuXHJcbiAgICBjb25zdCBiYWNrTmF2aWdhdGlvblBhdGg6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVkpKTtcclxuICAgIGNvbnN0IGJhY2tOYXZpZ2F0aW9uVVJMID0gZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlIHx8IGJhY2tOYXZpZ2F0aW9uUGF0aFtiYWNrTmF2aWdhdGlvblBhdGgubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgaWYgKCFiYWNrTmF2aWdhdGlvblVSTCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6IGJhY2tOYXZpZ2F0aW9uVVJMIGlzIG5vdCBzZXQuXCIpO1xyXG4gICAgICAvL3Rocm93IG5ldyBFcnJvcihcIkJhY2tOYXZpZ2F0aW9uUGF0aCBub3Qgc2V0LlwiKTtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmdldFN0YXJ0dXBQYWdlKCksIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZSkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c1JvdXRlUGFyYW0gPSB0aGlzLmdldFByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTtcclxuICAgICAgY29uc3QgcHJldmlvdXNDdXJyZW50Um91dGVQYXJhbSA9IHRoaXMuZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpO1xyXG4gICAgICBpZiAodGhpcy5yb3V0ZVBhcmFtLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnJvdXRlTmF2aWdhdGUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmdldFN0YXJ0dXBQYWdlKCksIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAocHJldmlvdXNSb3V0ZVBhcmFtICYmIHByZXZpb3VzUm91dGVQYXJhbSA9PT0gcHJldmlvdXNDdXJyZW50Um91dGVQYXJhbSkge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTtcclxuICAgICAgICB0aGlzLnJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FURURfUkVMT0FEX0dSSURfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcclxuXHJcbiAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKSkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChiYWNrTmF2aWdhdGlvblVSTCwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgLy90aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTdGFydHVwUGFnZSgpIHtcclxuICAgIGNvbnN0IHsgc3RhcnRVcFBhZ2UgfSA9IHRoaXMuZW52aXJvbm1lbnQ7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0YXJ0dXAgcGFnZSBzdGFydHMgd2l0aCBhIHVuZGVyc2NvcmUuXHJcbiAgICBpZiAoc3RhcnRVcFBhZ2Uuc3RhcnRzV2l0aCgnXycpKSB7XHJcbiAgICAgIHJldHVybiBgLyR7c3RhcnRVcFBhZ2Uuc2xpY2UoMSl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBub3QsIHByZXBlbmQgYSBmb3J3YXJkIHNsYXNoIGFuZCByZXR1cm4uXHJcbiAgICByZXR1cm4gYC8ke3N0YXJ0VXBQYWdlfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhpc3RvcnlCYWNrKCkge1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLmdyb3VwWydpc0VtYmVkZGVkUGFnZSddKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VDb250YWluZXJWaWV3KHRoaXMuZ3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5uYXZDb250cm9sbGVyLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hHcmlkKFxyXG4gICAgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCxcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBtZTogYW55LFxyXG4gICAgZ3JpZE9wdGlvbk5hbWU/OiBzdHJpbmdcclxuICApIHtcclxuICAgIGdyaWRPcHRpb25OYW1lID0gZ3JpZE9wdGlvbk5hbWUgfHwgXCJncmlkT3B0aW9uc1wiO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCkge1xyXG4gICAgICBjb25zdCBncmlkT3B0aW9uID0gZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgLnRyaW0oKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKFwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKVwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiZ3JvdXAucmVmcmVzaEdyaWRcIiwgXCJcIik7XHJcbiAgICAgIGlmIChncmlkT3B0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBncmlkT3B0aW9uTmFtZSA9IGdyaWRPcHRpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtncmlkT3B0aW9uTmFtZV0gYXMgWkdyaWQ7XHJcbiAgICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgICB9XHJcbiAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoUGFnZSgpIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIucm91dGVSZXVzZVN0cmF0ZWd5LnNob3VsZFJldXNlUm91dGUgPSAoKSA9PiBmYWxzZTtcclxuICAgIC8vIHRoaXMucm91dGVyLm9uU2FtZVVybE5hdmlnYXRpb24gPSAncmVsb2FkJztcclxuICAgIC8vIGNvbnNvbGUubG9nKCdQYXRoOiAnLCB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY3JtL2N1c3RvbWVyJ10pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xvbmVOZXdDYWNoZVpNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBjYWNoZVpNb2RlbCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldENhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICBpZiAoY2FjaGVaTW9kZWwpIHtcclxuICAgICAgdGhpcy5jYWNoZVNlcnZpY2UuY2xlYXJDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpO1xyXG4gICAgICBncm91cC56TW9kZWwgPSBjYWNoZVpNb2RlbDtcclxuICAgICAgZ3JvdXAuek1vZGVsLklkID0gMDtcclxuICAgIH1cclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5ld01vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIG9mKFtdKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIG5ldywgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJlZm9yZU5ld01vZGVsKGdyb3VwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJjdXJyZW50IHVybDogXCIsIHRoaXMucm91dGVyLnVybCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZ3JvdXAucGFyZW50UmVmZXJlbmNlSWQgfHwgXCIwXCI7XHJcbiAgICAgICAgLy9jb25zdCBwYXRoU2VnbWVudCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgLy9jb25zdCBsYXN0U2VnbWVudCA9IHBhdGhTZWdtZW50W3BhdGhTZWdtZW50Lmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROYXZpZ2F0aW9uUGFyYW0gPSB0aGlzLmdldE5hdmlnYXRpb25DdXJyZW50UGFyYW0oKTtcclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uU2VnbWVudHMgPSBjdXJyZW50TmF2aWdhdGlvblBhcmFtID8gY3VycmVudE5hdmlnYXRpb25QYXJhbS5zcGxpdCgnLycpIDogbnVsbDtcclxuICAgICAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gZ3JvdXAuaXNDbG9uZU5ldyA/IEFjdGlvblR5cGUuTmV3IDogQWN0aW9uVHlwZS5FZGl0O1xyXG4gICAgICAgIGNvbnN0IGFjdGlvblNlZ21lbnQgPSBncm91cC5pc0Nsb25lTmV3ID8gKG5hdmlnYXRpb25TZWdtZW50cyA/IG5hdmlnYXRpb25TZWdtZW50c1tuYXZpZ2F0aW9uU2VnbWVudHMubGVuZ3RoIC0gMV0gOiBBY3Rpb25UeXBlLk5ldykgOiBkZWZhdWx0QWN0aW9uO1xyXG5cclxuICAgICAgICBpZiAoZ3JvdXAuaXNMaXN0Rm9ybSkge1xyXG4gICAgICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsIEFjdGlvblR5cGUuTmV3LnRvU3RyaW5nKCldKTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgICAgIHJlbGF0aXZlVG86IGdyb3VwLmN0cmxTY29wZS5hY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDE6IEZyb20gTGlzdCBOZXcoYWN0aW9uOiBuZXcpID09PiBDbGVhciBmb3JtXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyAyOiBGcm9tIEZvcm0gTmV3KGFjdGlvbjogbmV3KSA9PT4gQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gMzogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldyksIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNDogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldyksIGlzQ2xvbmVOZXcsIFNhdmUsIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybSAoV2hlbiBDcmVhdGVNb2RlbCwgbmVlZCBjaGFuZ2UgaXNDbG9uZU5ldyA9IGZhbHNlKVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNTogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNjogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIGlzQ2xvbmVOZXcsIFNhdmUsIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybSAoV2hlbiBVcGRhdGVNb2RlbCwgbmVlZCBjaGFuZ2UgaXNDbG9uZU5ldyA9IGZhbHNlKVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNzogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gODogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIENsaWNrIE5ldywgU2F2ZSwgaXNDbG9uZU5ldyA9PT4gRE9OVCBDbGVhciBmb3JtXHJcblxyXG4gICAgICAgICAgaWYgKGFjdGlvblNlZ21lbnQgPT09IEFjdGlvblR5cGUuRWRpdCB8fCBhY3Rpb25TZWdtZW50ID09PSBBY3Rpb25UeXBlLk5ldykge1xyXG4gICAgICAgICAgICBpZiAoIWdyb3VwLmlzQ2xvbmVOZXcpIHtcclxuICAgICAgICAgICAgICBncm91cC56TW9kZWwgPSB7fTtcclxuICAgICAgICAgICAgICBncm91cC5mb3JtLnJlc2V0KCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgd29ya2Zsb3cgYnV0dG9uIGlmIHRoZSBUeXBlQ29kZSBpcyAnRlVOQ1RJT04nXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUeXBlQ29kZUZ1bmN0aW9uKGV2ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cCwgZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb25TZWdtZW50ID09PSBBY3Rpb25UeXBlLkVkaXQpIHtcclxuICAgICAgICAgICAgICAvLyBjbGVhciBjbG9uZU5ld01vZGVsIGNhY2hlKGlmIGhhdmUpXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuY2FjaGVTZXJ2aWNlLmdldENhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8vdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKFtyZWZlcmVuY2VJZCwgJ25ldyddKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRSb3V0ZVBhcmFtKFtyZWZlcmVuY2VJZCwgQWN0aW9uVHlwZS5OZXcudG9TdHJpbmcoKV0pO1xyXG5cclxuICAgICAgICAgICAgICBncm91cC56TW9kZWxbZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGRdID0gcmVmZXJlbmNlSWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyb3VwLmlzTmV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsIEFjdGlvblR5cGUuTmV3LnRvU3RyaW5nKCldKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgICAgICAgcmVsYXRpdmVUbzogZ3JvdXAuY3RybFNjb3BlLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyQ2xvbmVOZXdNb2RlbChncm91cCwgZ3JvdXAuek1vZGVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyTmV3TW9kZWwoZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG4gICBcclxuICBwdWJsaWMgY3JlYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NDcmVhdGVkTWVzc2FnZSB8fCBEZWZhdWx0TWVzc2FnZS5yZWNvcmRDcmVhdGVkO1xyXG4gICAgbGV0IGNyZWF0ZU1vZGVscmVzID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIWZnLmRpcnR5KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihEZWZhdWx0TWVzc2FnZS5ub3REaXJ0eU1lc3NhZ2UpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmcudmFsaWQpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLnNob3dGb3JtR3JvdXBFcnJvck1lc3NhZ2UoZ3JvdXAsIGZnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIG9mKGdyb3VwLnpNb2RlbCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBjcmVhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5ncm91cC5za2lwQ3JlYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICBjb25zdCBuZXdNb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgICAgWkNvbXBvbmVudEhlbHBlci5yZW1vdmVOdWxsRmllbGRzKG5ld01vZGVsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoZ3JvdXAucmVzb3VyY2VVUkwsIG5ld01vZGVsKS5waXBlKFxyXG4gICAgICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIGNyZWF0ZU1vZGVscmVzID0gcmVzcDtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCByZXNNZXNzYWdlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgoem1vZGVsOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIGNyZWF0ZWQsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZHpNb2RlbChmZywgem1vZGVsLCBncm91cCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJDcmVhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgIGlmIChjcmVhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzID09IG51bGwgfHwgY3JlYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cyA9PSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAocmVzcCAmJiBncm91cC56TW9kZWwuSWQgIT09IDApIHtcclxuICAgICAgICAgICAgZ3JvdXAuaXNOZXcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncm91cC5jYW5jZWxCdXR0b25OYW1lID0gXCJDbG9zZVwiO1xyXG4gICAgICAgICAgICAvLyBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcCk7XHJcbiAgICAgICAgICAgIC8vIGZnLnBhdGNoVmFsdWUocmVzcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG5cclxuICAgICAgICAgIGlmICgoZ3JvdXAuaXNDbG9zZUFmdGVyU3VjY2VzcyB8fCBncm91cC5pc0Nsb3NlQWZ0ZXJDcmVhdGVkKSAmJiAhZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBmZy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRvbmUgdXBkYXRlTW9kZWwgdXBkYXRlZCB6TW9kZWw6XCIsIGZnLnZhbHVlKTtcclxuICAgICAgICAvLyB0aGlzLnRvYXN0U2VydmljZS5zaG93KFwiUmVjb3JkIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQsIGdyb3VwKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgZm9ybTogRm9ybUdyb3VwID0gbnVsbCwgdXBkYXRlQVBJT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+ID0gbnVsbCwgaXNTa2lwRGlydHkgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBmZyA9IGZvcm0gfHwgZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXNNZXNzYWdlID0gZ3JvdXAuU3VjY2Vzc1VwZGF0ZWRNZXNzYWdlIHx8IERlZmF1bHRNZXNzYWdlLnJlY29yZFVwZGF0ZWQ7XHJcbiAgICBsZXQgdXBkYXRlTW9kZWxyZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0Zvcm1EaXJ0eUFuZFZhbGlkKGZnLCBncm91cCwgaXNTa2lwRGlydHksIGV2ZW50KSkge1xyXG4gICAgICBpZiAoaXNTa2lwRGlydHkpIHtcclxuICAgICAgICBmZy5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVBUElPYnNlcnZhYmxlID0gdXBkYXRlQVBJT2JzZXJ2YWJsZSB8fCB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFB1dCQoYCR7Z3JvdXAucmVzb3VyY2VVUkx9LyR7Z3JvdXAuek1vZGVsLklkfWAsIGdyb3VwLnpNb2RlbCwgZmFsc2UpLnBpcGUoXHJcbiAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgICAvL3RoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIFwiUmVjb3JkIGlzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKVxyXG4gICAgICApKTtcclxuXHJcbiAgICByZXR1cm4gb2YoZ3JvdXAuek1vZGVsKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIHVwZGF0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFncm91cC5za2lwVXBkYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gdXBkYXRlQVBJT2JzZXJ2YWJsZTtcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgocmVzcDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciB1cGRhdGVkLCByZXNwb25zZTpcIiwgcmVzcCk7XHJcbiAgICAgICAgdXBkYXRlTW9kZWxyZXMgPSByZXNwO1xyXG4gICAgICAgIGdyb3VwLmlzQ2xvbmVOZXcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZHpNb2RlbChmZywgcmVzcCwgZ3JvdXApO1xyXG4gICAgICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJVcGRhdGVNb2RlbChncm91cCwgcmVzcCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICBpZiAodXBkYXRlTW9kZWxyZXMgJiYgdXBkYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cykge1xyXG4gICAgICAgICAgaWYgKGdyb3VwLmlzQ2xvc2VBZnRlclN1Y2Nlc3MgfHwgZ3JvdXAuaXNDbG9zZUFmdGVyVXBkYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvbmVzIGEgbmV3IG1vZGVsIGZvciBhIFpHcm91cCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgWkNvbXBvbmVudE91dHB1dEV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtaQ29tcG9uZW50T3V0cHV0RXZlbnR9IGV2ZW50IC0gVGhlIFpDb21wb25lbnRPdXRwdXRFdmVudCB0cmlnZ2VyaW5nIHRoZSBjbG9uZS5cclxuICAgKiBAcGFyYW0ge1pHcm91cH0gZ3JvdXAgLSBUaGUgWkdyb3VwIHRvIGNsb25lIHRoZSBuZXcgbW9kZWwgZm9yLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2xvbmVOZXdNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICAvLyBTZXQgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIG1vZGVsIGlzIGJlaW5nIGNsb25lZFxyXG4gICAgZ3JvdXAuaXNDbG9uZU5ldyA9IHRydWU7XHJcblxyXG4gICAgLy8gRXh0cmFjdCB0aGUgZnVuY3Rpb24gdmFsdWUgZnJvbSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudFxyXG4gICAgY29uc3QgeyB0YXJnZXQgfSA9IGV2ZW50O1xyXG4gICAgY29uc3QgZnVuY3Rpb25WYWx1ZSA9IHRhcmdldD8ubWF0Y2goL1xcKChbXildKylcXCkvKT8uWzFdO1xyXG5cclxuICAgIC8vIElmIHRoZSBmdW5jdGlvbiB2YWx1ZSBpcyAndHJ1ZScsIHJlc2V0IHRoZSBmb3JtIGFuZCBtb2RlbFxyXG4gICAgaWYgKGZ1bmN0aW9uVmFsdWUgPT09ICd0cnVlJykge1xyXG4gICAgICBncm91cC56TW9kZWwgPSB7fTtcclxuICAgICAgZ3JvdXAuZm9ybS5yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERlZmluZSB0aGUgdmFsdWVzIGZvciB0aGUgV0ZTIG1vZGVsXHJcbiAgICBjb25zdCBuZXdNb2RlbFZhbHVlcyA9IHtcclxuICAgICAgSWQ6IDAsXHJcbiAgICAgIFdGU19Eb2N1bWVudElkOiBudWxsLFxyXG4gICAgICBXRlNfU3RhdHVzQ29kZTogbnVsbCxcclxuICAgICAgV0ZTX1N0YXR1c0lkOiBudWxsLFxyXG4gICAgICBXRlNfU3RhdHVzTmFtZTogbnVsbCxcclxuICAgIH07XHJcblxyXG4gICAgLy8gQXNzaWduIHRoZSBXRlMgbW9kZWwgdmFsdWVzIHRvIHRoZSBmb3JtIHZhbHVlIGFuZCBaTW9kZWxcclxuICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuZm9ybS52YWx1ZSwgbmV3TW9kZWxWYWx1ZXMpO1xyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGdyb3VwLmZvcm0udmFsdWUpO1xyXG5cclxuICAgIC8vIFBhdGNoIHRoZSBmb3JtIHdpdGggdGhlIFpNb2RlbCwgbWFyayBpdCBhcyBkaXJ0eSwgYW5kIGNhY2hlIHRoZSBaTW9kZWxcclxuICAgIGNvbnN0IGZnID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBmZy5wYXRjaFZhbHVlKGdyb3VwLnpNb2RlbCk7XHJcbiAgICBmZy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy5jYWNoZVNlcnZpY2Uuc2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZLCBncm91cC56TW9kZWwpO1xyXG5cclxuICAgIC8vIENhbGwgdGhlIG5ld01vZGVsIGZ1bmN0aW9uIGZvciB0aGUgZ3JvdXBcclxuICAgIHRoaXMubmV3TW9kZWwobnVsbCwgZ3JvdXApO1xyXG5cclxuICAgIC8vIFJlbG9hZCB0aGUgd29ya2Zsb3cgYnV0dG9uIGlmIHRoZSBUeXBlQ29kZSBpcyAnRlVOQ1RJT04nXHJcbiAgICBpZiAodGhpcy5pc1R5cGVDb2RlRnVuY3Rpb24oZXZlbnQpKSB7XHJcbiAgICAgIHRoaXMucmVsb2FkV29ya2Zsb3dCdXR0b24oZ3JvdXAsIGV2ZW50LmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsZWFyIHRoZSB0cmlnZ2VyIGZsYWdcclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlbGV0ZU1vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGZnOiBGb3JtR3JvdXAgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHJlc01lc3NhZ2UgPSBncm91cC5TdWNjZXNzRGVsZXRlZE1lc3NhZ2UgfHwgRGVmYXVsdE1lc3NhZ2UucmVjb3JkRGVsZXRlZDtcclxuXHJcbiAgICBvZihncm91cC56TW9kZWwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBkZWxldGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZURlbGV0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmFsZXJ0U2VydmljZS5zaG93KFwiRGVsZXRlIFJlY29yZFwiLCBEZWZhdWx0TWVzc2FnZS5jb25maXJtYXRpb24sXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICB7IHRleHQ6IFwiTm9cIiwgY3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCIgfSBhcyBBbGVydEJ1dHRvbixcclxuICAgICAgICAgICAgICB7IHRleHQ6IFwiWWVzXCIsIGNzc0NsYXNzOiBcInByaW1hcnlcIiB9IGFzIEFsZXJ0QnV0dG9uXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgocmVwbHk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5ID09PSBcIlllc1wiKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgICAgIGdyb3VwLnpNb2RlbC5EaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBsZXQgdGVtcFJlc3BvbnNlID0ge307XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2VcclxuICAgICAgICAgICAgICAuaHR0cFB1dCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIGdyb3VwLnpNb2RlbC5JZCwgZ3JvdXAuek1vZGVsKVxyXG4gICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGVtcFJlc3BvbnNlID0gT2JqZWN0LmFzc2lnbih7fSwgcmVzKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciBkZWxldGVkLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyRGVsZXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAvL3RoaXMuaGlzdG9yeUJhY2soKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRlbXBSZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wUmVzcG9uc2VbJ1Byb2Nlc3NpbmdTdGF0dXMnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmcucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja05hdmlnYXRpb24obnVsbCwgZ3JvdXAsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBncm91cC56TW9kZWwuRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhdGNoVXBkYXRlZHpNb2RlbChmZzogRm9ybUdyb3VwLCByZXNwOiBhbnksIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmIChyZXNwKSB7XHJcbiAgICAgIGlmIChyZXNwLkRhdGEpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcC5EYXRhKTtcclxuICAgICAgICBjb25zdCByZXN1bHREYXRhID0gWkNvbXBvbmVudEhlbHBlci5yZW1vdmVUZXh0RWRpdG9yVmFsdWVGcm9tRm9ybVBhdGNoaW5nKHJlc3AuRGF0YSwgZ3JvdXApO1xyXG4gICAgICAgIGZnLnBhdGNoVmFsdWUocmVzdWx0RGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocmVzcFtcIklkXCJdKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIHJlc3ApO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdERhdGEgPSBaQ29tcG9uZW50SGVscGVyLnJlbW92ZVRleHRFZGl0b3JWYWx1ZUZyb21Gb3JtUGF0Y2hpbmcocmVzcCwgZ3JvdXApO1xyXG4gICAgICAgIGZnLnBhdGNoVmFsdWUocmVzdWx0RGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJGYWlsZWQgdG8gcGF0Y2hVcGRhdGVkek1vZGVsIHRvIHRoZSBmb3JtZ3JvdXBcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBncm91cC5yZWZlcmVuY2VJZCA9IGdyb3VwLnpNb2RlbC5JZDtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcblxyXG4gICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNUeXBlQ29kZUZ1bmN0aW9uKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpIHtcclxuICAgIHJldHVybiBldmVudD8uZGF0YT8uVHlwZUNvZGUgPT09ICdGVU5DVElPTic7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbG9hZFdvcmtmbG93QnV0dG9uKGdyb3VwOiBaR3JvdXAsIGRhdGE6IGFueSkge1xyXG4gICAgLy8gQ2hhbmdlZCB0byBzaG91bGQgcmVsb2FkIGFsbCB3b3JrZmxvdyBidXR0b24gaWYgaXQgdHJpZ2dlciBuZXcvY2xvbmVuZXcgdmlhIHRoZSBmb3JtIHBhZ2UuXHJcblxyXG4gICAgLy9pZiAoZGF0YS5yZWxvYWRBbGxXb3JrZmxvd0J1dHRvbikge1xyXG4gICAgICBjb25zdCB3b3JrZmxvd0J1dHRvbkxpc3QgPSBPYmplY3Qua2V5cyhncm91cC56Q29tcG9uZW50cylcclxuICAgICAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aCgnendvcmtmbG93YnV0dG9uc18nKSlcclxuICAgICAgICAucmVkdWNlKChvYmosIGtleSkgPT4ge1xyXG4gICAgICAgICAgb2JqW2tleV0gPSBncm91cC56Q29tcG9uZW50c1trZXldO1xyXG4gICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9LCB7fSk7XHJcblxyXG4gICAgICBPYmplY3QudmFsdWVzKHdvcmtmbG93QnV0dG9uTGlzdCkuZm9yRWFjaCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgdmFsdWU/LlsnbG9hZEJ1dHRvbiddPy4oKTtcclxuICAgICAgfSk7XHJcbiAgICAvL31cclxuICAgIC8vZWxzZSB7XHJcbiAgICAvLyAgY29uc3Qgd29ya2Zsb3dCdXR0b25zID0gWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnQoZ3JvdXAsIGB6d29ya2Zsb3didXR0b25zXyR7ZGF0YS56QnV0dG9uTmFtZX1gKTtcclxuICAgIC8vICB3b3JrZmxvd0J1dHRvbnM/LlsnbG9hZEJ1dHRvbiddPy4oKTtcclxuICAgIC8vfVxyXG4gIH0gXHJcblxyXG4gIHB1YmxpYyBpc0Zvcm1EaXJ0eUFuZFZhbGlkKGZnOiBGb3JtR3JvdXAsIGdyb3VwOiBaR3JvdXAsIGlzU2tpcERpcnR5ID0gZmFsc2UsIGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpOiBib29sZWFuIHtcclxuICAgIGlmICghaXNTa2lwRGlydHkgJiYgIWZnLmRpcnR5KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihEZWZhdWx0TWVzc2FnZS5ub3REaXJ0eU1lc3NhZ2UpO1xyXG4gICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQgJiYgZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhW2BGb3JtTm90RGlydHlNZXNzYWdlYF0gPyBldmVudC5kYXRhW2BGb3JtTm90RGlydHlNZXNzYWdlYF0gOiBEZWZhdWx0TWVzc2FnZS5ub3REaXJ0eU1lc3NhZ2U7XHJcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3dPa2F5KERlZmF1bHREaWFsb2dUaXRsZS5ub3RoaW5nVG9VcGRhdGUsIG1lc3NhZ2UsIFtcImNvbC01XCJdKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmcudmFsaWQpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLnNob3dGb3JtR3JvdXBFcnJvck1lc3NhZ2UoZ3JvdXAsIGZnKTtcclxuICAgICAgZmcubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICBmZy5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVVcGRhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVVcGRhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVEZWxldGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZURlbGV0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZURlbGV0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVEZWxldGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZU5ld01vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlTmV3b2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlTmV3TW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVDcmVhdGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZUNyZWF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZUNyZWF0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBiZWZvcmVQYWdlSW5pdGlhbGlzZShncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZShncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC56TW9kZWwuSWQpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiek1vZGVsLklkIGlzIG5vdCBkZWZpbmVkXCIsIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGFmdGVyTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJOZXdNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlck5ld01vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJDcmVhdGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckNyZWF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlclVwZGF0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlclVwZGF0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyVXBkYXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyRGVsZXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckRlbGV0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyRGVsZXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIGFmdGVyQ2xvbmVOZXdNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyQ2xvbmVOZXdNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckNsb25lTmV3TW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJDbG9uZU5ld01vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJQYWdlSW5pdGlhbGlzZShncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJQYWdlSW5pdGlhbGlzZSBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJQYWdlSW5pdGlhbGlzZShncm91cCk7XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIG9uQWN0aW9uKGdyb3VwOiBaR3JvdXApIHtcclxuICAvLyAgIHRoaXMuYWN0aW9uU2hlZXRDdHJsXHJcbiAgLy8gICAgIC5jcmVhdGUoe1xyXG4gIC8vICAgICAgIGhlYWRlcjogXCJDaG9vc2UgYW4gQWN0aW9uXCIsXHJcbiAgLy8gICAgICAgYnV0dG9uczogZ3JvdXAudG9wUmlnaHRBY3Rpb25CdXR0b25cclxuICAvLyAgICAgfSlcclxuICAvLyAgICAgLnRoZW4oYWN0aW9uU2hlZXRFbCA9PiB7XHJcbiAgLy8gICAgICAgYWN0aW9uU2hlZXRFbC5wcmVzZW50KCk7XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0TW9kZWxWYWx1ZShwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgZ3JvdXA6IFpHcm91cCkge1xyXG4gIC8vICAgZ3JvdXAuek1vZGVsW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcclxuICAvLyAgIGlmIChncm91cC5pc0xvYWRpbmcpIHtcclxuICAvLyAgICAgcmV0dXJuO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgY29uc3QgZmcgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAvLyAgIGlmICghZmcpIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgLCBuby1kZWJ1Z2dlclxyXG4gIC8vICAgICBkZWJ1Z2dlcjtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGZjID0gZmcuY29udHJvbHNbcHJvcGVydHlOYW1lXTtcclxuICAvLyAgIGlmICghZmMpIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXJcclxuICAvLyAgICAgZGVidWdnZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBmYy5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgLy8gICBmYy5tYXJrQXNEaXJ0eSgpO1xyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIHNob3d6TW9kYWwobW9kYWxQYWdlUGFyYW1zOiBNb2RhbFBhZ2VQYXJhbXMpOiBPYnNlcnZhYmxlPE1vZGFsUmVzcG9uc2U+IHtcclxuICAgIGlmIChtb2RhbFBhZ2VQYXJhbXMucGFyZW50R3JvdXApIHtcclxuICAgICAgLy8gZGlzYWJsZSBpc1RyaWdnZXJlZCBiZWZvcmUgZGlzcGxheSB0aGUgcG9wdXAuXHJcbiAgICAgIG1vZGFsUGFnZVBhcmFtcy5wYXJlbnRHcm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubW9kYWxTZXJ2aWNlLnNob3cobW9kYWxQYWdlUGFyYW1zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZVBvc3QobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIC8vIGZvciBQb3N0IHRvIENvb2tpZVN0b3JlXHJcbiAgICBjb25zdCBjb29raWVTdG9yZVVSTCA9IHRoaXMub2F1dGhFbnZpcm9ubWVudFVybCArIFwiYXBpL0Nvb2tpZVN0b3Jlc1wiO1xyXG4gICAgY29uc3QgY29va2llU3RvcmVWYWx1ZSA9IHtcclxuICAgICAgJ05hbWUnOiBuYW1lLFxyXG4gICAgICAnVmFsdWUnOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoY29va2llU3RvcmVVUkwsIGNvb2tpZVN0b3JlVmFsdWUpLnBpcGUobWFwKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImdyaWQgY29uZmlnIHNhdmVkKFwiICsgcmVzLnN0YXR1cyArIFwiKTogXCIsIHJlcyk7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvb2tpZVN0b3JlR2V0KG5hbWU6IHN0cmluZywgYWNjZXNzVG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBjb29raWVTdG9yZVVSTCA9IHRoaXMub2F1dGhFbnZpcm9ubWVudFVybCArIFwiYXBpL0Nvb2tpZVN0b3Jlcy8/bmFtZT1cIiArIG5hbWU7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwR2V0JChjb29raWVTdG9yZVVSTCwgeyBoZWFkZXJzOiBhY2Nlc3NUb2tlbiB9KS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvb2tpZVN0b3JlRGVsZXRlTXVsdGlwbGUobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIC8vIGZvciBQb3N0IHRvIENvb2tpZVN0b3JlXHJcbiAgICBjb25zdCBjb29raWVTdG9yZVVSTCA9IHRoaXMub2F1dGhFbnZpcm9ubWVudFVybCArIFwiQWRtaW4vRGVsZXRlTXVsdGlwbGVDb29raWVzXCI7XHJcbiAgICBjb25zdCBjb29raWVTdG9yZVZhbHVlID0ge1xyXG4gICAgICAnY29udGFpbk5hbWUnOiBuYW1lXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKGNvb2tpZVN0b3JlVVJMLCBjb29raWVTdG9yZVZhbHVlKS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvRWxlbWVudEJ5SWQoaWQ6IHN0cmluZywgYmVoYXZpb3I6ICdzbW9vdGgnIHwgJ2F1dG8nID0gJ3Ntb290aCcpIHtcclxuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG4gICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvciB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmFuc2xhdGlvblBhZ2VFbGVtZW50KGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3Qgb2JzTGlzdCA9IG5ldyBBcnJheTxPYnNlcnZhYmxlPGFueT4+KCk7XHJcbiAgICBpZiAoZ3JvdXAuZm9ybUhlYWRlcikge1xyXG4gICAgICBvYnNMaXN0LnB1c2godGhpcy50cmFuc2xhdGlvblNlcnZpY2UuJHRyYW5zbGF0ZVNpbmdsZUl0ZW0oZ3JvdXAsIFwiZm9ybUhlYWRlclwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGdyb3VwLm5hdkl0ZW1zICYmIGdyb3VwLm5hdkl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgb2JzTGlzdC5wdXNoKHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLiR0cmFuc2xhdGVJdGVtTGlzdChncm91cC5uYXZJdGVtcywgXCJ0ZXh0XCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob2JzTGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ya0pvaW4ob2JzTGlzdCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8jcmVnaW9uIHNpZ25hbFIgc2VydmljZVxyXG4gIHB1YmxpYyBqb2luUHJvamVjdFNpZ25hbFIocHJvamVjdENvZGU/OiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLnNpZ25hbHJTZXJ2aWNlLnNpZ25hbFJFbmFibGVkKCkpIHtcclxuICAgICAgaWYgKHByb2plY3RDb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zaWduYWxyU2VydmljZS5qb2luR3JvdXAocHJvamVjdENvZGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFdlIGRlZmF1bHQgZmlyc3QgcHJvamVjdCBjb2RlIGluIGVudmlyb25tZW50IGFzIGdyb3VwXHJcbiAgICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLnpjb3JlU2VydmljZS5nZXRFbnZpcm9ubWVudCgpO1xyXG4gICAgICAgIGNvbnN0IGZpcnN0UHJvamVjdENvZGUgPSBlbnZpcm9ubWVudC5wcm9qZWN0Q29kZXNbMF07XHJcbiAgICAgICAgdGhpcy5zaWduYWxyU2VydmljZS5qb2luR3JvdXAoZmlyc3RQcm9qZWN0Q29kZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVTaWduYWxSTW9kaWZpY2F0aW9uQWxlcnQoZm9ybUlkOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLnNpZ25hbHJTZXJ2aWNlLnNpZ25hbFJFbmFibGVkKCkgJiYgdGhpcy5lbnZpcm9ubWVudC5lbmFibGVGb3JtUGFnZU1vZGlmaWNhdGlvbkFsZXJ0KSB7XHJcbiAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGAke3dpbmRvdy5sb2NhdGlvbi5ocmVmfWAucmVwbGFjZSgvKFteOl1cXC8pXFwvKy9nLCBcIiQxXCIpO1xyXG4gICAgICBpZiAoIXRoaXMuZ3JvdXAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlcikge1xyXG4gICAgICAgIHRoaXMuZ3JvdXAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlciA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JvdXAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlclsnYWxlcnRGb3JtTW9kaWZpZWQnXSA9IHRoaXMuYWxlcnRGb3JtTW9kaWZpZWQuYmluZCh0aGlzLCBmb3JtSWQpO1xyXG5cclxuICAgICAgdGhpcy5zaWduYWxyU2VydmljZS51bnN1YnNjcmliZUZyb21FdmVudChgJHtldmVudE5hbWV9YCk7IC8vIHVuc3Vic2NyaWJlIHRoZSBldmVudCBiZWZvcmUgc3Vic2NyaWJlIHRvIGV2ZW50IGFnYWluLlxyXG4gICAgICB0aGlzLnNpZ25hbHJTZXJ2aWNlLnN1YnNjcmliZVRvRXZlbnQodGhpcy5ncm91cCwgYCR7ZXZlbnROYW1lfWAsIGBncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyLmFsZXJ0Rm9ybU1vZGlmaWVkYCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdlbmFibGVGb3JtUGFnZU1vZGlmaWNhdGlvbkFsZXJ0IG5vdCBlbmFibGVkLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhbGVydEZvcm1Nb2RpZmllZChmb3JtSWQ6IHN0cmluZywgZ3JvdXA6IFpHcm91cCwgcmVzcDogYW55LCBldmVudE5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKCFyZXNwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwUmVzdWx0ID0gSlNPTi5wYXJzZShyZXNwKTtcclxuXHJcbiAgICBpZiAoIXJlc3BSZXN1bHQuVXNlck5hbWUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtSWQgPT09IHJlc3BSZXN1bHQuSWQ/LnRvU3RyaW5nKCkgJiYgZXZlbnROYW1lID09PSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xyXG4gICAgICBpZiAocmVzcFJlc3VsdC5Vc2VyTmFtZSA9PT0gdGhpcy5hdXRoU2VydmljZS5lMVRva2VuLm15UHJvZmlsZS5Vc2VyTmFtZSkge1xyXG4gICAgICAgIGlmIChyZXNwUmVzdWx0LkFjdGlvbiA9PT0gQWN0aW9uVHlwZS5VcGRhdGUpIHtcclxuICAgICAgICAgIHRoaXMud2ViQXBpU2VydmljZS5odHRwR2V0JChgJHt0aGlzLmdyb3VwLnJlc291cmNlVVJMfS8ke2Zvcm1JZH1gLCBudWxsKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVsb2FkRGF0YUFuZFdvcmtmbG93QnV0dG9uKHJlc3ApO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChyZXNwUmVzdWx0LkFjdGlvbiA9PT0gQWN0aW9uVHlwZS5EZWxldGUpIHtcclxuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJSZWNvcmQgRGVsZXRlZCBieSBBbm90aGVyIFVzZXJcIiwgXCJUaGUgY3VycmVudCByZWNvcmQgaGFzIGJlZW4gZGVsZXRlZCBieSBhbm90aGVyIHVzZXIuXCIsIFtcclxuICAgICAgICAgICAgeyB0ZXh0OiBcIk9LXCIsIGNzc0NsYXNzOiBcInByaW1hcnlcIiB9IGFzIEFsZXJ0QnV0dG9uXHJcbiAgICAgICAgICBdLCBbXCJjb2wtNlwiXSwgdW5kZWZpbmVkLCB0cnVlKS5waXBlKHN3aXRjaE1hcCgocmVwbHkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGx5ID09PSBcIk9LXCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwKTtcclxuICAgICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXNwUmVzdWx0LkFjdGlvbiA9PT0gQWN0aW9uVHlwZS5VcGRhdGUpIHtcclxuICAgICAgICAgIHRoaXMud2ViQXBpU2VydmljZS5odHRwR2V0JChgJHt0aGlzLmdyb3VwLnJlc291cmNlVVJMfS8ke2Zvcm1JZH1gLCBudWxsKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwICYmIHJlc3AuUm93VmVyc2lvbikge1xyXG4gICAgICAgICAgICAgIGlmIChyZXNwLlJvd1ZlcnNpb24gIT09IHRoaXMuZ3JvdXAuek1vZGVsPy5Sb3dWZXJzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93KFwiVGhlIGN1cnJlbnQgcGFnZSBoYXMgYmVlbiBtb2RpZmllZCBieSBvdGhlciB1c2Vycy5cIiwgXCJXb3VsZCB5b3UgbGlrZSB0byByZWZyZXNoIHRoZSBwYWdlIGRhdGE/XCIsIFtcclxuICAgICAgICAgICAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgICAgICAgIHsgdGV4dDogXCJZZXNcIiwgY3NzQ2xhc3M6IFwicHJpbWFyeVwiIH0gYXMgQWxlcnRCdXR0b25cclxuICAgICAgICAgICAgICAgIF0sIFtcImNvbC02XCJdLCB1bmRlZmluZWQsIHRydWUpLnBpcGUoc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAocmVwbHkgPT09IFwiWWVzXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZERhdGFBbmRXb3JrZmxvd0J1dHRvbihyZXNwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93UGVybWFuZW50bHkoJ1RoZSBkYXRhIG9uIHRoZSBjdXJyZW50IHBhZ2UgaXMgbm90IHVwIHRvIGRhdGUsIGFzIGl0IGhhcyBiZWVuIHNhdmVkIGFuZCBvdmVyd3JpdHRlbiBieSBhbm90aGVyIHVzZXIuIFBsZWFzZSByZWZyZXNoIHRoZSBwYWdlLicsICd0b3AnLCAnd2FybmluZycpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEFsZXJ0IHJlY2VpdmVkIHJlZ2FyZGluZyBmb3JtIG1vZGlmaWNhdGlvbiwgUm93VmVyc2lvbiByZW1haW5zIHVuYWx0ZXJlZC4gTm8gZnVydGhlciBhY3Rpb24gaGFzIGJlZW4gdGFrZW4uYClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxvYWREYXRhQW5kV29ya2Zsb3dCdXR0b24oek1vZGVsOiBhbnkpIHtcclxuICAgIHRoaXMuZ3JvdXAuek1vZGVsID0gek1vZGVsO1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IHRoaXMuZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBmZy5wYXRjaFZhbHVlKHRoaXMuZ3JvdXAuek1vZGVsKTtcclxuICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcblxyXG4gICAgLy8gQ2FwdHVyZSBhbGwgd29ya2Zsb3cgYnV0dG9uc1xyXG4gICAgY29uc3Qgd29ya2Zsb3dCdXR0b25zID0gT2JqZWN0LmtleXModGhpcy5ncm91cC56Q29tcG9uZW50cylcclxuICAgICAgLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoXCJ6d29ya2Zsb3didXR0b25zX1wiKSlcclxuICAgICAgLm1hcChrZXkgPT4gdGhpcy5ncm91cC56Q29tcG9uZW50c1trZXldKTtcclxuXHJcbiAgICAvLyBSZWxvYWQgd29ya2Zsb3cgYnV0dG9uc1xyXG4gICAgd29ya2Zsb3dCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcclxuICAgICAgYnV0dG9uLmxvYWRCdXR0b24oKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8gI3JlZ2lvbiBERUNcclxuICBwdWJsaWMgYXN5bmMgbG9hZENvbnRhaW5lclZpZXcoZWxlbWVudENvbnRhaW5lcjogYW55LCBjb250YWluZXJQYWdlOiBhbnksIGRhdGE6IFpGaWVsZCwgZ3JvdXA/OiBaR3JvdXApIHtcclxuICAgIGlmICghZWxlbWVudENvbnRhaW5lcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkVsZW1lbnRDb250YWluZXIgaXMgbnVsbC5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbnRhaW5lclBhZ2UpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJDb250YWluZXJQYWdlIGlzIG51bGwuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgdmlld0NvbnRhaW5lclJlZiA9IGVsZW1lbnRDb250YWluZXIudmlld0NvbnRhaW5lclJlZjtcclxuICAgIHZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcclxuXHJcbiAgICBjb25zdCBlbWJlZGRlZGdyb3VwID0gbmV3IFpHcm91cCgpO1xyXG4gICAgdGhpcy5zZXRHcm91cEZvckRlYnVnZ2VyKGVtYmVkZGVkZ3JvdXApO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbnRhaW5lclBhZ2UpO1xyXG5cclxuICAgIGVtYmVkZGVkZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTsgLy8gZW5hYmxlIGJhY2sgdGhlIGJ1dHRvbiBmb3IgdHJpZ2dlcmluZy5cclxuXHJcbiAgICAvLyBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCBncm91cCk7XHJcbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCBlbWJlZGRlZGdyb3VwKTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCB7IHBhcmVudEdyb3VwOiBncm91cCwgaXNFbWJlZGRlZFBhZ2U6IHRydWUsIGVsZW1lbnRDb250YWluZXI6IGVsZW1lbnRDb250YWluZXIsIENvbnRhaW5lckZvcm1BdXRvU2Nyb2xsOiBkYXRhLkNvbnRhaW5lckZvcm1BdXRvU2Nyb2xsIH0pO1xyXG5cclxuICAgIC8vIHRvZG86IGFkZCBpbiBwcm9wXHJcbiAgICBpZiAoZGF0YSAmJiBkYXRhLkNvbnRhaW5lckZvcm1BdXRvU2Nyb2xsKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9FbWJiZWRDb21wb25lbnRQYWdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9FbWJiZWRDb21wb25lbnRQYWdlKG1pbGxpU2Vjb25kczogbnVtYmVyID0gMTUwMCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZW5kT2ZHcmlkRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlbmQtb2YtZ3JpZFwiKTtcclxuICAgIGNvbnN0IGVuZE9mR3JpZFBvc2l0aW9uSW5mbyA9IGVuZE9mR3JpZERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHlDb29yID0gKGVuZE9mR3JpZFBvc2l0aW9uSW5mbz8ueSB8fCA2MzApIC0gMTA7XHJcblxyXG4gICAgY29uc3QgbWFpbklvbkNvbnRlbnQ6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW9uLWNvbnRlbnQtbWFpbi1wYWdlXCIpO1xyXG4gICAgcmV0dXJuIG1haW5Jb25Db250ZW50LnNjcm9sbEJ5UG9pbnQoMCwgeUNvb3IsIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9Ub3BPZlBhZ2UobWlsbGlTZWNvbmRzOiBudW1iZXIgPSAxNTAwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtYWluSW9uQ29udGVudDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpb24tY29udGVudC1tYWluLXBhZ2VcIik7XHJcbiAgICByZXR1cm4gbWFpbklvbkNvbnRlbnQuc2Nyb2xsVG9Qb2ludCgwLCAwLCBtaWxsaVNlY29uZHMpIGFzIFByb21pc2U8dm9pZD47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY2xvc2VDb250YWluZXJWaWV3KGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmIChncm91cFtgcGFyZW50R3JvdXBgXSAmJiBncm91cFtgcGFyZW50R3JvdXBgXVtgZTFDbG9zZUdyaWRDb250YWluZXJgXSAmJiB0eXBlb2YgZ3JvdXBbYHBhcmVudEdyb3VwYF1bYGUxQ2xvc2VHcmlkQ29udGFpbmVyYF0gPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBncm91cFtgcGFyZW50R3JvdXBgXVtgZTFDbG9zZUdyaWRDb250YWluZXJgXShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIHNldEdyb3VwRm9yRGVidWdnZXIoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgaXNEZWJ1Z2dpbmcgPSB0aGlzLnpjb3JlU2VydmljZS5pc0RlYnVnU2Vzc2lvbigpIHx8IGZhbHNlO1xyXG4gICAgaWYgKGlzRGVidWdnaW5nKSB7XHJcbiAgICAgIHRoaXMuZGVidWdTZXJ2aWNlLm9uSW5pdERlYnVnZ2VyKGdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoR3JpZChncm91cDogWkdyb3VwKSB7XHJcbiAgY29uc3QgemdyaWRDb250cm9sID0gZ3JvdXBbXCJncmlkT3B0aW9uc1wiXSBhcyBaR3JpZDtcclxuICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICB6Z3JpZENvbnRyb2wuZ2V0RGF0YSgpO1xyXG4gIH1cclxuICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG59XHJcbiJdfQ==