@eqproject/eqp-dynamic-module 2.6.24 → 2.6.26

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.
@@ -611,7 +611,9 @@ export class AddFormRecordComponent {
611
611
  // Controlla e spara il trigger se necessario
612
612
  checkTriggers(record) {
613
613
  var fireTrigger = true;
614
+ GlobalService.debugLog("checkTriggers - inside checkTriggers()");
614
615
  if (this.form.Triggers != null) {
616
+ GlobalService.debugLog("checkTriggers - have triggers in form");
615
617
  this.form.Triggers.forEach((trigger) => {
616
618
  fireTrigger = true;
617
619
  trigger.conditions.forEach((condition) => {
@@ -624,45 +626,56 @@ export class AddFormRecordComponent {
624
626
  var recordValue = record[conditionKey];
625
627
  if (logicOperator == LogicOperator['='] && conditionValue != recordValue) {
626
628
  fireTrigger = false;
629
+ this.logTrigger(trigger, condition, record);
627
630
  return;
628
631
  }
629
632
  if (logicOperator == LogicOperator['!='] && conditionValue == recordValue) {
630
633
  fireTrigger = false;
634
+ this.logTrigger(trigger, condition, record);
631
635
  return;
632
636
  }
633
637
  if (logicOperator == LogicOperator['<'] && conditionValue <= recordValue) {
634
638
  fireTrigger = false;
639
+ this.logTrigger(trigger, condition, record);
635
640
  return;
636
641
  }
637
642
  if (logicOperator == LogicOperator['<='] && conditionValue < recordValue) {
638
643
  fireTrigger = false;
644
+ this.logTrigger(trigger, condition, record);
639
645
  return;
640
646
  }
641
647
  if (logicOperator == LogicOperator['>'] && conditionValue >= recordValue) {
642
648
  fireTrigger = false;
649
+ this.logTrigger(trigger, condition, record);
643
650
  return;
644
651
  }
645
652
  if (logicOperator == LogicOperator['>='] && conditionValue > recordValue) {
646
653
  fireTrigger = false;
654
+ this.logTrigger(trigger, condition, record);
647
655
  return;
648
656
  }
649
657
  if (logicOperator == LogicOperator['LIKE'] && recordValue.indexOf(conditionValue) == -1) {
650
658
  fireTrigger = false;
659
+ this.logTrigger(trigger, condition, record);
651
660
  return;
652
661
  }
653
662
  if (logicOperator == LogicOperator['NOT LIKE'] && recordValue.indexOf(conditionValue) != -1) {
654
663
  fireTrigger = false;
664
+ this.logTrigger(trigger, condition, record);
655
665
  return;
656
666
  }
657
667
  if (logicOperator == LogicOperator.Si && !recordValue) {
658
668
  fireTrigger = false;
669
+ this.logTrigger(trigger, condition, record);
659
670
  return;
660
671
  }
661
672
  if (logicOperator == LogicOperator.No && recordValue) {
662
673
  fireTrigger = false;
674
+ this.logTrigger(trigger, condition, record);
663
675
  return;
664
676
  }
665
677
  });
678
+ GlobalService.debugLog("checkTriggers - fireTrigger? ", fireTrigger);
666
679
  if (fireTrigger) {
667
680
  // Il trigger va sparato. Valuto le funzioni interne
668
681
  var formulas = JSON.parse(JSON.stringify(trigger.formulas));
@@ -678,11 +691,17 @@ export class AddFormRecordComponent {
678
691
  triggerToFire.trigger = trigger; // Il trigger
679
692
  triggerToFire.formulas = formulas; // Le formule inviate in input al modulo dinamico, valutate nel contesto del trigger e del record
680
693
  triggerToFire.userPatient = this.userID; // UserID
694
+ GlobalService.debugLog("checkTriggers - Trigger Fired ", triggerToFire);
681
695
  this.fireTrigger.emit(triggerToFire);
682
696
  }
683
697
  });
684
698
  }
685
699
  }
700
+ logTrigger(trigger, condition, record) {
701
+ GlobalService.debugLog("checkTriggers - Condition that invalidated the trigger TRIGGER", trigger);
702
+ GlobalService.debugLog("checkTriggers - Condition that invalidated the trigger CONDITION", condition);
703
+ GlobalService.debugLog("checkTriggers - Condition that invalidated the trigger RECORD", record);
704
+ }
686
705
  }
687
706
  AddFormRecordComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AddFormRecordComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.UtilityHelperService }], target: i0.ɵɵFactoryTarget.Component });
688
707
  AddFormRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AddFormRecordComponent, selector: "add-form-record", inputs: { configurations: "configurations", endPointConfiguration: "endPointConfiguration", userID: "userID", orgaID: "orgaID", formID: "formID", form: "form", record: "record", onlyView: "onlyView", isDuplicate: "isDuplicate", inConfig: "inConfig", showAllFields: "showAllFields", QueryEditorComponent: "QueryEditorComponent" }, outputs: { saveRecordEvent: "saveRecordEvent", afterSaveRecordEvent: "afterSaveRecordEvent", out: "out", fireTrigger: "fireTrigger" }, viewQueries: [{ propertyName: "fieldTemplate", predicate: ["fieldTemplate"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"loader\">\r\n\r\n <div class=\"row eqp-dynamic-module-title add-form-record-header\" *ngIf=\"showTitle\">\r\n <div class=\"col-md-12\">\r\n <span>{{form.Name}}</span>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"formForm\" class=\"add-form-record-form\">\r\n\r\n <!-- VISUALIZZAZIONE SEMPLICE -->\r\n <ng-container *ngIf=\"form.FormScalarType == FormScalarTypeEnum.Semplice\" [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: form.Fields }\" class=\"add-form-record-semplice\">\r\n </ng-container>\r\n\r\n <!-- VISUALIZZAZIONE A STEPPER -->\r\n <mat-horizontal-stepper linear *ngIf=\"form.FormScalarType == FormScalarTypeEnum['A step']\"\r\n class=\"add-form-record-stepper\">\r\n <mat-step *ngFor=\"let group of form.FormFieldsGroups; let i = index; let first = first; let last = last\">\r\n <ng-template matStepLabel>\r\n {{group.Name}}\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n\r\n <div class=\"mt-2 d-flex justify-content-end add-form-record-buttons\">\r\n <button *ngIf=\"!first\" class=\"mr-2 previous\" mat-raised-button matStepperPrevious>\r\n Precedente\r\n </button>\r\n <button *ngIf=\"!last\" class=\"button-next\" color=\"primary\" mat-raised-button matStepperNext>\r\n Successivo\r\n </button>\r\n <button *ngIf=\"last && showSaveButton\" (click)=\"saveOrExitForm(false)\" class=\"button-next\"\r\n color=\"primary\" mat-raised-button>\r\n Salva\r\n </button>\r\n </div>\r\n\r\n </mat-step>\r\n </mat-horizontal-stepper>\r\n\r\n <!-- VISUALIZZAZIONE A TAB -->\r\n <mat-tab-group *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In tab']\" class=\"add-form-record-tab\">\r\n <mat-tab *ngFor=\"let group of form.FormFieldsGroups\" [label]=\"group.Name\">\r\n <div class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- VISUALIZZAZIONE AD ACCORDION -->\r\n <mat-accordion multi *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In accordion']\"\r\n class=\"add-form-record-accordion\">\r\n <mat-expansion-panel *ngFor=\"let group of form.FormFieldsGroups\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{group.Name}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </form>\r\n\r\n <div class=\"row mt-2 add-form-record-buttons\"\r\n *ngIf=\"(showBackButton || showSaveButton) && form.FormScalarType != FormScalarTypeEnum['A step']\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"mr-2\" mat-raised-button type=\"button\" *ngIf=\"showBackButton\" (click)=\"saveOrExitForm(true)\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" type=\"button\" *ngIf=\"showSaveButton\"\r\n (click)=\"saveOrExitForm(false)\" [disabled]=\"formForm.invalid || formForm.disabled || isSaving\">\r\n <span *ngIf=\"!isSaving\">Salva</span>\r\n <span *ngIf=\"isSaving\">Salvataggio in Corso...</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</ng-container>\r\n\r\n\r\n\r\n<!-- TEMPLATE PER LA VISUALIZZAZIONE DEI CAMPI DELLA FORM -->\r\n<ng-template #fieldTemplates let-fields='fields'>\r\n <div class=\"row\" *ngIf=\"formloaded\">\r\n <div class=\"mt-2\" *ngFor=\"let field of fields\"\r\n [ngClass]=\"utilityService.getFieldSyleClass(field, showAllFields)\">\r\n <dynamic-module-field-fix #fieldTemplate [field]=\"field\" [QueryEditorComponent]=\"QueryEditorComponent\" [form]=\"form\" [record]=\"record\" [endPointConfiguration]=\"endPointConfiguration\" [userID]=\"userID\" [inConfig]=\"inConfig\"\r\n (recordChange)=\"onRecordChange()\">\r\n </dynamic-module-field-fix>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".visibility_hidden{display:none}.visibility_transparent{visibility:hidden}\n"], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i3.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i3.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["selectedIndex", "disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i3.MatStepperNext, selector: "button[matStepperNext]", inputs: ["type"] }, { kind: "directive", type: i3.MatStepperPrevious, selector: "button[matStepperPrevious]", inputs: ["type"] }, { kind: "component", type: i4.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i5.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i8.DynamicModuleFieldFixComponent, selector: "dynamic-module-field-fix", inputs: ["endPointConfiguration", "field", "form", "record", "inConfig", "userID", "QueryEditorComponent"], outputs: ["recordChange", "out"] }] });
@@ -725,4 +744,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
725
744
  type: ViewChildren,
726
745
  args: ["fieldTemplate"]
727
746
  }] } });
728
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWZvcm0tcmVjb3JkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9mb3JtLXJlY29yZHMvYWRkLWZvcm0tcmVjb3JkL2FkZC1mb3JtLXJlY29yZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZm9ybS1yZWNvcmRzL2FkZC1mb3JtLXJlY29yZC9hZGQtZm9ybS1yZWNvcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNILE9BQU8sRUFBRSxXQUFXLEVBQWEsVUFBVSxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2xKLE9BQU8sRUFBUSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFbkYsT0FBTyxFQUE2QyxhQUFhLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUU1SCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFLcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQVcsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7Ozs7OztBQVF4RSxNQUFNLE9BQU8sc0JBQXNCO0lB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LGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLEdBQUc7c0JBQVosTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQWVQLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IER5bmFtaWNNb2R1bGVDb21waWxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2R5bmFtaWNNb2R1bGVDb21waWxlQ29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgQW5zd2VyU3R5bGUsIEJhc2VGaWVsZCwgRGF0YUdldHRlciwgRGF0YUdldHRlclR5cGVFbnVtLCBGaWVsZEludmlzaWJpbGl0eUVudW0sIEZpZWxkVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvYmFzZUZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybSwgRm9ybVNjYWxhclR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2Zvcm0ubW9kZWwnO1xyXG5pbXBvcnQgeyBEeW5SZWNvcmQsIFJlY29yZCB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9yZWNvcmQubW9kZWwnO1xyXG5pbXBvcnQgeyBVdGlsaXR5SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMnO1xyXG5pbXBvcnQgeyBEeW5hbWljTW9kdWxlRmllbGRGaXhDb21wb25lbnQgfSBmcm9tICcuLi8uLi9keW5hbWljLW1vZHVsZS1maWVsZC1maXgvZHluYW1pYy1tb2R1bGUtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRW5kUG9pbnRDb25maWd1cmF0aW9uLCBFbmRQb2ludERhdGFQYXJhbXMsIFBhcmFtVHlwZUVudW0gfSBmcm9tICcuLy4uLy4uLy4uLy4uL21vZGVscy9lbmRQb2ludENvbmZpZ3VyYXRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBMaXN0VmFsdWVGaWVsZCB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9maWVsZHMvbGlzdFZhbHVlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvZ2xvYmFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOdW1lcmljRmllbGQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZmllbGRzL251bWVyaWNGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IEltYWdlU2VsZWN0b3JGaWVsZCB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9maWVsZHMvaW1hZ2VTZWxlY3RvckZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgRHluQXR0YWNobWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9keW5BdHRhY2htZW50JztcclxuaW1wb3J0IHsgRHluYW1pY0xvYWRlckRpcmVjdGl2ZURhdGEsIGV2ZW50T3V0IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2RpcmVjdGl2ZXMvZHluYW1pYy1sb2FkZXIvZHluYW1pYy1sb2FkZXIuZGlyZWN0aXZlXCI7XHJcbmltcG9ydCB7IExvZ2ljT3BlcmF0b3IgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvbG9naWNPcGVyYXRvci5tb2RlbCc7XHJcbmltcG9ydCB7IEZpcmVUcmlnZ2VyLCBUcmlnZ2VyIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL3RyaWdnZXIubW9kZWwnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFkZC1mb3JtLXJlY29yZFwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vYWRkLWZvcm0tcmVjb3JkLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2FkZC1mb3JtLXJlY29yZC5jb21wb25lbnQuc2Nzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZEZvcm1SZWNvcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBjb25maWd1cmF0aW9uczogRHluYW1pY01vZHVsZUNvbXBpbGVDb25maWc7XHJcbiAgQElucHV0KCkgZW5kUG9pbnRDb25maWd1cmF0aW9uOiBFbmRQb2ludENvbmZpZ3VyYXRpb247XHJcbiAgQElucHV0KCkgdXNlcklEOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgb3JnYUlEOiBzdHJpbmcgPSBudWxsOyAvLyBwcmV2aWV3XHJcbiAgXHJcbiAgQElucHV0KCkgZm9ybUlEOiBzdHJpbmcgPSBudWxsOyAvLyBwcmV2aWV3XHJcbiAgQElucHV0KCkgZm9ybTogRm9ybSA9IG51bGw7IC8vIHByZXZpZXcgY29uZmlnXHJcbiAgQElucHV0KCkgcmVjb3JkOiBSZWNvcmQgfCBzdHJpbmcgPSBudWxsOyAvLyBlZGl0XHJcbiAgQElucHV0KCkgb25seVZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBpc0R1cGxpY2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGluQ29uZmlnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0FsbEZpZWxkczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBRdWVyeUVkaXRvckNvbXBvbmVudDogRHluYW1pY0xvYWRlckRpcmVjdGl2ZURhdGE7IC8vIEwnaW50ZXJvIGNvbXBvbmVudGUgcXVlcnkgRWRpdG9yXHJcblxyXG4gIEBPdXRwdXQoKSBzYXZlUmVjb3JkRXZlbnQ6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcbiAgQE91dHB1dCgpIGFmdGVyU2F2ZVJlY29yZEV2ZW50OiBFdmVudEVtaXR0ZXI8UmVjb3JkPiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPigpO1xyXG4gIEBPdXRwdXQoKSBvdXQ6IEV2ZW50RW1pdHRlcjxldmVudE91dD4gPSBuZXcgRXZlbnRFbWl0dGVyPGV2ZW50T3V0PigpO1xyXG4gIEBPdXRwdXQoKSBmaXJlVHJpZ2dlcjogRXZlbnRFbWl0dGVyPEZpcmVUcmlnZ2VyPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlyZVRyaWdnZXI+KCk7XHJcblxyXG4gIHNob3dUaXRsZSA9IHRydWU7XHJcbiAgc2hvd1NhdmVCdXR0b24gPSB0cnVlO1xyXG4gIHNob3dCYWNrQnV0dG9uID0gdHJ1ZTtcclxuICBsb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1NhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGZvcm1sb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZm9ybUZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgZmllbGRHcm91cHM6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8QmFzZUZpZWxkPiB9ID0ge307XHJcbiAgRm9ybVNjYWxhclR5cGVFbnVtID0gRm9ybVNjYWxhclR5cGVFbnVtO1xyXG4gIEZpZWxkVHlwZUVudW0gPSBGaWVsZFR5cGVFbnVtO1xyXG5cclxuICBAVmlld0NoaWxkcmVuKFwiZmllbGRUZW1wbGF0ZVwiKVxyXG4gIGZpZWxkVGVtcGxhdGU6IFF1ZXJ5TGlzdDxEeW5hbWljTW9kdWxlRmllbGRGaXhDb21wb25lbnQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyB1dGlsaXR5U2VydmljZTogVXRpbGl0eUhlbHBlclNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIGFkZCBwdcOyIGZ1bnppb25hcmUgYW5jaGUgY29tZSBtb2RpZmljYSBlIGNvbWUgcHJldmlld1xyXG4gICAgLy8gaW4gYWRkIGFiYmlhbW8gaW4gaW5wdXQgbCdJRCBkZWwgRm9ybVxyXG4gICAgLy8gaW4gbW9kaWZpY2EgYWJiaWFtbyBpbiBpbnB1dCBsJ0lEIGRlbCBSZWNvcmRcclxuICAgIC8vIGluIHByZXZpZXcgYWJiaWFtbyBpbiBpbnB1dCBpbCBGb3JtKGNhc28gY29uZmlndXJhdG9yKSBvIGwnSUQgZGVsIG1vZHVsbyBvbiBvbmx5VmlldyBpbXBvc3RhdG8gYSB0cnVlXHJcbiAgICB0aGlzLnNob3dUaXRsZSA9IHRoaXMuY29uZmlndXJhdGlvbnMuc2hvd1RpdGxlO1xyXG4gICAgdGhpcy5zaG93U2F2ZUJ1dHRvbiA9IHRoaXMuY29uZmlndXJhdGlvbnMuc2hvd1NhdmVCdXR0b247XHJcbiAgICB0aGlzLnNob3dCYWNrQnV0dG9uID0gdGhpcy5jb25maWd1cmF0aW9ucy5zaG93QmFja0J1dHRvbjtcclxuXHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiQWRkRm9ybVJlY29yZFwiKVxyXG5cclxuICAgIGlmICh0aGlzLnJlY29yZCA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc2hvd1RpdGxlID0gdHJ1ZTtcclxuICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIkFkZEZvcm1SZWNvcmQgLSBuZXdcIilcclxuICAgICAgdGhpcy5wcmV2aWV3T3JOZXdSZXNwb25zZVJlY29yZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zaG93VGl0bGUgPSBmYWxzZTtcclxuICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIkFkZEZvcm1SZWNvcmQgLSBlZGl0XCIsIHRoaXMucmVjb3JkKVxyXG4gICAgICB0aGlzLmVkaXRSZXNwb25zZVJlY29yZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGwnaW5pemlhbGl6emF6aW9uZSB0ZXJtaW5hIGNvbiBpbCByZWN1cGVybyBkZWwgcmVjb3JkIG8gY29uIGwnaW5pemlhbGl6emF6aW9uZSBkZWwgZm9ybSB2dW90b1xyXG5cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coJ29uaW5pdCAtIER5bmFGb3JtJywgdGhpcy5mb3JtKVxyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIG9uUmVjb3JkQ2hhbmdlXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGludm9jYXRvIGFsIGNhbWJpbyBkZWwgdmFsb3JlIGRpIG9nbmkgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gcmVjb3JkLlxyXG4gICAqIFNlcnZlIGFkIGFnZ2lvcm5hcmUgaWwgdmFsb3JlIGRpIHR1dHRpIGkgY2FtcGkgY2hlIGhhbm5vIHVuYSBmb3JtdWxhLlxyXG4gICAqL1xyXG4gIG9uUmVjb3JkQ2hhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuZmllbGRUZW1wbGF0ZSAmJiB0aGlzLmZpZWxkVGVtcGxhdGUubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmZpZWxkVGVtcGxhdGUuZm9yRWFjaCgoZikgPT4gZi51cGRhdGVGaWVsZCgpKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIG9uUmVjb3JkQ2hhbmdlXHJcblxyXG4gIC8vI3JlZ2lvbiBwcmV2aWV3T3JOZXdSZXNwb25zZVJlY29yZFxyXG4gIHByZXZpZXdPck5ld1Jlc3BvbnNlUmVjb3JkKCkge1xyXG4gICAgdGhpcy5yZWNvcmQgPSBuZXcgUmVjb3JkKCk7XHJcbiAgICAvLyBhZ2dpdWduaSBudW92b1xyXG4gICAgaWYgKHRoaXMuZm9ybSAhPSBudWxsKSB7XHJcbiAgICAgIC8vIHByZXZpZXcgcGVyIGlsIGNvbmZpZ3VyYXRvclxyXG4gICAgICB0aGlzLmZpZWxkc0NvbmZpZygpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1JRCAhPSBudWxsKSB7XHJcbiAgICAgIC8vIHByZXZpZXcgcGVyIGFkbWluXHJcbiAgICAgIHRoaXMuZ2V0Rm9ybUJ5SUQoKTsgLy8gZGVudHJvIGNoaWFtYSBmaWVsZHNDb25maWdcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIHByZXZpZXdPck5ld1Jlc3BvbnNlUmVjb3JkXHJcblxyXG4gIC8vI3JlZ2lvbiBlZGl0UmVzcG9uc2VSZWNvcmRcclxuICBlZGl0UmVzcG9uc2VSZWNvcmQoKSB7XHJcbiAgICBcclxuICAgIC8vIG1vZGlpbHTDoCBtb2RpZmljYVxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLnJlY29yZCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAvLyBhbGxvcmEgw6ggdW4gSURcclxuICAgICAgdGhpcy5nZXRSZWNvcmRCeUlEKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBpbCByZWNvcmQgdmllbmUgcGFzc2F0byBjb21lIHRhbGVcclxuICAgICAgLy8gKDxSZWNvcmQ+dGhpcy5yZWNvcmQpLkVudElEID0gXCIzXCI7XHJcbiAgICAgIC8vICg8UmVjb3JkPnRoaXMucmVjb3JkKS5WZXJzaW9uO1xyXG4gICAgICB0aGlzLmdldEZvcm1CeUlEYW5kVmVyc2lvbih0cnVlKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGVkaXRSZXNwb25zZVJlY29yZFxyXG5cclxuICAvLyNyZWdpb24gc2F2ZU9yRXhpdEZvcm1cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHNhbHZhcmUgaSBkYXRpIGluc2VyaXRpIGRhbGwndXRlbnRlIHVuYSB2b2x0YSBjb25jbHVzYSBsYSBjb21waWxhemlvbmUgZGVsbGEgZm9ybS5cclxuICAgKi9cclxuICBzYXZlT3JFeGl0Rm9ybShleGl0OiBib29sZWFuKSB7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdhZGQtZm9ybS1yZWNvcmQgc2F2ZVJlY29yZEV2ZW50JylcclxuICAgIGlmIChleGl0KSB7XHJcbiAgICAgIC8vIHRoaXMuc2F2ZVJlY29yZEV2ZW50LmVtaXQobnVsbCk7XHJcbiAgICAgIHRoaXMub25TYXZlUmVjb3JkKG51bGwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gdGhpcy5zYXZlUmVjb3JkRXZlbnQuZW1pdCh0aGlzLnJlY29yZCk7XHJcbiAgICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLm9uU2F2ZVJlY29yZCgoPFJlY29yZD50aGlzLnJlY29yZCkpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gc2F2ZU9yRXhpdEZvcm1cclxuXHJcbiAgLy8jcmVnaW9uIG9uU2F2ZVJlY29yZFxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgc2FsdmFyZSBpbCByZWNvcmQgYWdnaXVudG8gbyBtb2RpZmljYXRvLlxyXG4gICAqIFNlIMOoIHN0YXRvIGNvbmZpZ3VyYXRvIHVuIGVuZFBvaW50IHBlciBpbCBzYWx2YXRhZ2dpbyB2aWVuZSBlZmZldHR1YXRhIHVuYSBjaGlhbWF0YSBhbCBzZXJ2ZXIgcGFzc2FuZG8gbCdvZ2dldG8gZGEgc2FsdmFyZVxyXG4gICAqIG5lbCBib2R5IGRlbGxhIGNoaWFtYXRhLCBhbHRyaW1lbnRpIHNjYXRlbmEgbCdldmVudG8gXCJzYXZlUmVjb3JkXCIuXHJcbiAgICogQHBhcmFtIGV2ZW50IE9nZ2V0dG8gZGkgdGlwbyBSZWNvcmQgZGEgc2FsdmFyZS5cclxuICAgKi9cclxuICBhc3luYyBvblNhdmVSZWNvcmQoZXZlbnQ6IFJlY29yZCkge1xyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnb25TYXZlUmVjb3JkIC0gZXZlbnQnLCBldmVudClcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coJ29uU2F2ZVJlY29yZCAtIGZvcm0nLCB0aGlzLmZvcm0pXHJcbiAgICBpZiAoXHJcbiAgICAgIGV2ZW50ICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24gIT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzLlNhdmVFbmRQb2ludFxyXG4gICAgKSB7XHJcbiAgICAgIHZhciBkeW5SZWM6IER5blJlY29yZCA9IG5ldyBEeW5SZWNvcmQoKTtcclxuICAgICAgZHluUmVjLklEID0gZXZlbnQuSUQgPz8gbnVsbDtcclxuICAgICAgZHluUmVjLkVudElEID0gdGhpcy5mb3JtLklEO1xyXG4gICAgICBkeW5SZWMuVmVyc2lvbiA9IHRoaXMuZm9ybS5WZXJzaW9uO1xyXG4gICAgICBkeW5SZWMudXNlcklEID0gdGhpcy51c2VySUQ7XHJcbiAgICAgIGR5blJlYy5WYWx1ZXMgPSBldmVudCA/PyBudWxsO1xyXG4gICAgICBkeW5SZWMuSFRNTHJlYWRhYmxlVmFsdWVzID0gYXdhaXQgdGhpcy5jcmVhdGVIVE1McmVhZGFibGVWYWx1ZXMoZXZlbnQpO1xyXG5cclxuICAgICAgaWYgKGV2ZW50LkZLX0luc2VydFVzZXIgPT0gbnVsbCl7XHJcbiAgICAgICAgLy8gTnVvdm8gUmVjb3JkXHJcbiAgICAgICAgZHluUmVjLkZLX0luc2VydFVzZXIgPSB0aGlzLnVzZXJJRDtcclxuICAgICAgICBkeW5SZWMuSW5zZXJ0RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgZHluUmVjLkZLX1VwZGF0ZVVzZXIgPSB0aGlzLnVzZXJJRDtcclxuICAgICAgICBkeW5SZWMuVXBkYXRlRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gTW9kaWZpY2EgZGVsIFJlY29yZFxyXG4gICAgICAgIGR5blJlYy5GS19JbnNlcnRVc2VyID0gZXZlbnQuRktfSW5zZXJ0VXNlclxyXG4gICAgICAgIGR5blJlYy5JbnNlcnREYXRlID0gZXZlbnQuSW5zZXJ0RGF0ZTtcclxuICAgICAgICBkeW5SZWMuRktfVXBkYXRlVXNlciA9IHRoaXMudXNlcklEO1xyXG4gICAgICAgIGR5blJlYy5VcGRhdGVEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmFyIGFkZGl0aW9uYWxQYXJhbXMgPSB0aGlzLmNvbmZpZ3VyYXRpb25zLmFkZGl0aW9uYWxQYXJhbXMgPT0gbnVsbCA/IGV2ZW50LkFkZGl0aW9uYWxQYXJhbXMgOiB0aGlzLmNvbmZpZ3VyYXRpb25zLmFkZGl0aW9uYWxQYXJhbXM7XHJcbiAgICAgIGR5blJlYy5BZGRpdGlvbmFsUGFyYW1zID0gSlNPTi5zdHJpbmdpZnkoYWRkaXRpb25hbFBhcmFtcyk7XHJcblxyXG4gICAgICAvLyB2YXIgYWRkaXRpb25hbEluZm8gPSB0aGlzLmFkZGl0aW9uYWxJbmZvID09IG51bGwgPyBldmVudC5BZGRpdGlvbmFsSW5mbyA6IHRoaXMuYWRkaXRpb25hbEluZm87XHJcbiAgICAgIHZhciBhZGRpdGlvbmFsSW5mbyA9IGV2ZW50LkFkZGl0aW9uYWxJbmZvID09IG51bGwgPyB0aGlzLmNvbmZpZ3VyYXRpb25zLmFkZGl0aW9uYWxJbmZvIDogZXZlbnQuQWRkaXRpb25hbEluZm87XHJcbiAgICAgIGR5blJlYy5BZGRpdGlvbmFsSW5mbyA9IEpTT04uc3RyaW5naWZ5KGFkZGl0aW9uYWxJbmZvKTtcclxuXHJcbiAgICAgIHZhciBkeW5hbWljTW9kdWxlUGFyYW1zID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIFBhcmFtTmFtZTogXCJSZWNvcmRcIixcclxuICAgICAgICAgIFBhcmFtVmFsdWU6IGR5blJlYyxcclxuICAgICAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIkluIEJvZHlcIl0sXHJcbiAgICAgICAgfSxcclxuICAgICAgXTtcclxuXHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdvblNhdmVSZWNvcmQgLSBkeW5hbWljTW9kdWxlUGFyYW1zJywgZHluYW1pY01vZHVsZVBhcmFtcylcclxuICAgICAgdGhpcy51dGlsaXR5U2VydmljZS5SdW5FbmRQb2ludENhbGwoXHJcbiAgICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3Jkcy5TYXZlRW5kUG9pbnQsXHJcbiAgICAgICAgZHluYW1pY01vZHVsZVBhcmFtcyxcclxuICAgICAgICAocmVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNoZWNrVHJpZ2dlcnMoZXZlbnQpO1xyXG4gICAgICAgICAgdGhpcy5hZnRlclNhdmVSZWNvcmRFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNhdmVSZWNvcmRFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIG9uU2F2ZVJlY29yZFxyXG5cclxuICAvLyNyZWdpb24gZ2V0Rm9ybUJ5SURcclxuICBnZXRGb3JtQnlJRChpZDogc3RyaW5nID0gdGhpcy5mb3JtSUQpIHtcclxuICAgIGNvbnN0IGR5bmFtaWNNb2R1bGVQYXJhbXM6IEFycmF5PEVuZFBvaW50RGF0YVBhcmFtcz4gPVxyXG4gICAgICBuZXcgQXJyYXk8RW5kUG9pbnREYXRhUGFyYW1zPigpO1xyXG4gICAgZHluYW1pY01vZHVsZVBhcmFtcy5wdXNoKHtcclxuICAgICAgUGFyYW1OYW1lOiBcImlkXCIsXHJcbiAgICAgIFBhcmFtVmFsdWU6IGlkLFxyXG4gICAgICBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJRdWVyeSBwYXJhbVwiXSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5SdW5FbmRQb2ludENhbGwoXHJcbiAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLkZvcm1zLkdldEJ5SURFbmRQb2ludCxcclxuICAgICAgZHluYW1pY01vZHVsZVBhcmFtcyxcclxuICAgICAgKHJlczogRm9ybSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZm9ybSA9IHJlcztcclxuICAgICAgICB0aGlzLmZvcm0uT3JnYUlEID0gdGhpcy5vcmdhSUQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZvcm0uT2JqZWN0VHJpZ2dlcnMgIT0gbnVsbCAmJiB0aGlzLmZvcm0uT2JqZWN0VHJpZ2dlcnMgIT0gXCJcIil7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uVHJpZ2dlcnMgPSBKU09OLnBhcnNlKHRoaXMuZm9ybS5PYmplY3RUcmlnZ2Vycyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZm9ybS5UcmlnZ2VycyA9IG5ldyBBcnJheTxUcmlnZ2VyPigpO1xyXG4gICAgICAgIH0gICAgICAgIFxyXG5cclxuICAgICAgICB0aGlzLnNldERhdGFHZXR0ZXIodGhpcy5mb3JtKTtcclxuICAgICAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdnZXRGb3JtQnlJRCAtIER5bmFGb3JtJywgdGhpcy5mb3JtKVxyXG4gICAgICAgIHRoaXMuZmllbGRzQ29uZmlnKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnIpID0+IHsgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGdldEZvcm1CeUlEXHJcblxyXG4gIC8vI3JlZ2lvbiBnZXRSZWNvcmRCeUlEXHJcbiAgLy8gY2kgZW50cm8gc29sbyBzZSDDqCBzdGF0byBwYXNzYXRvIGlsIHBhcmFtZXRybyBcInJlY29yZFwiIGNvbWUgc3RyaW5nYVxyXG4gIGdldFJlY29yZEJ5SUQoKSB7XHJcblxyXG4gICAgLy8gcHJlcGFybyBpIGRhdGkgZGVsIHJlY29yZFxyXG4gICAgdmFyIGR5bmFtaWNSZWNvcmRQYXJhbXMgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICBQYXJhbU5hbWU6IFwiaWRcIixcclxuICAgICAgICBQYXJhbVZhbHVlOiB0aGlzLnJlY29yZCxcclxuICAgICAgICBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJRdWVyeSBwYXJhbVwiXSxcclxuICAgICAgfSxcclxuICAgIF07XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLlJ1bkVuZFBvaW50Q2FsbChcclxuICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3Jkcy5HZXRCeUlERW5kUG9pbnQsXHJcbiAgICAgIGR5bmFtaWNSZWNvcmRQYXJhbXMsXHJcbiAgICAgIChyZXM6IER5blJlY29yZCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVjb3JkID0gbmV3IFJlY29yZCgpO1xyXG5cclxuICAgICAgICAoPFJlY29yZD50aGlzLnJlY29yZCkgPSBKU09OLnBhcnNlKHJlcy5TZXJpYWxpemVkVmFsdWVzKTtcclxuICAgICAgICB0aGlzLnJlY29yZC5JRCA9IHRoaXMuaXNEdXBsaWNhdGUgPyBcIlwiIDogcmVzLklEO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLkVudElEID0gcmVzLkVudElEO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLnVzZXJJRCA9IHJlcy51c2VySUQ7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQuVmVyc2lvbiA9IHJlcy5WZXJzaW9uO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLlZhbHVlcyA9IEpTT04ucGFyc2UocmVzLlNlcmlhbGl6ZWRWYWx1ZXMpO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLkZLX0luc2VydFVzZXIgPSByZXMuRktfSW5zZXJ0VXNlcjtcclxuICAgICAgICB0aGlzLnJlY29yZC5GS19VcGRhdGVVc2VyID0gcmVzLkZLX1VwZGF0ZVVzZXI7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQuSW5zZXJ0RGF0ZSA9IHJlcy5JbnNlcnREYXRlO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLlVwZGF0ZURhdGUgPSByZXMuVXBkYXRlRGF0ZTtcclxuICAgICAgICBcclxuICAgICAgICAvLyB0aGlzLnZpZXdNb2RlID0gRHluYW1pY01vZHVsZVZpZXdNb2RlRW51bS5DT01QSUxFO1xyXG4gICAgICAgIC8vIHRoaXMubG9hZGVyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmdldEZvcm1CeUlEYW5kVmVyc2lvbigpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gZ2V0UmVjb3JkQnlJRFxyXG5cclxuICAvLyNyZWdpb24gZ2V0Rm9ybUJ5SURhbmRWZXJzaW9uXHJcbiAgZ2V0Rm9ybUJ5SURhbmRWZXJzaW9uKGdldEF0dGFjaG1lbnRzOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIC8vIHByZXBhcm8gbGEgdmVyc2lvbmUgY29ycmV0dGEgZGVsIGZvcm1cclxuICAgIHZhciBkeW5hbWljTW9kdWxlUGFyYW1zID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgUGFyYW1OYW1lOiBcIkVudElEXCIsXHJcbiAgICAgICAgUGFyYW1WYWx1ZTogKDxSZWNvcmQ+dGhpcy5yZWNvcmQpLkVudElELFxyXG4gICAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgUGFyYW1OYW1lOiBcIlZlcnNpb25cIixcclxuICAgICAgICBQYXJhbVZhbHVlOiAoPFJlY29yZD50aGlzLnJlY29yZCkuVmVyc2lvbixcclxuICAgICAgICBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJRdWVyeSBwYXJhbVwiXSxcclxuICAgICAgfSxcclxuICAgIF07XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiZ2V0Rm9ybUJ5SURhbmRWZXJzaW9uIC0gdGhpcyByZWNvcmRcIiwgPFJlY29yZD50aGlzLnJlY29yZClcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5Gb3Jtcy5HZXRCeUlEQW5kVmVyc2lvbkVuZFBvaW50LFxyXG4gICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLFxyXG4gICAgICAocmVzOiBGb3JtKSA9PiB7XHJcbiAgICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIkFGVEVSIGdldEZvcm1CeUlEYW5kVmVyc2lvbiAtIHRoaXMuZm9ybVwiLCByZXMpXHJcbiAgICAgICAgdGhpcy5mb3JtID0gcmVzO1xyXG4gICAgICAgIHRoaXMuZm9ybS5PcmdhSUQgPSB0aGlzLm9yZ2FJRDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybS5PYmplY3RUcmlnZ2VycyAhPSBudWxsICYmIHRoaXMuZm9ybS5PYmplY3RUcmlnZ2VycyAhPSBcIlwiKXtcclxuICAgICAgICAgIHRoaXMuZm9ybS5UcmlnZ2VycyA9IEpTT04ucGFyc2UodGhpcy5mb3JtLk9iamVjdFRyaWdnZXJzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5mb3JtLlRyaWdnZXJzID0gbmV3IEFycmF5PFRyaWdnZXI+KCk7XHJcbiAgICAgICAgfSAgICAgICAgXHJcblxyXG4gICAgICAgIHRoaXMuc2V0RGF0YUdldHRlcih0aGlzLmZvcm0pO1xyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZVJlY29yZFByb3BlcnRpZXMoKTtcclxuICAgICAgICB0aGlzLnJlb3JkZXJGb3JtRmllbGRzKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtR3JvdXAoKTtcclxuICAgICAgICBpZiAodGhpcy5mb3JtLkZvcm1TY2FsYXJUeXBlICE9IEZvcm1TY2FsYXJUeXBlRW51bS5TZW1wbGljZSkge1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVGaWVsZEdyb3VwcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFnZXRBdHRhY2htZW50cyl7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlciA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmZvcm1sb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmdldEFsbFJlY29yZEF0dGFjaG1lbnRzKCg8UmVjb3JkPnRoaXMucmVjb3JkKS5JRCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gZ2V0Rm9ybUJ5SURhbmRWZXJzaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBnZXRBbGxSZWNvcmRBdHRhY2htZW50c1xyXG4gIGdldEFsbFJlY29yZEF0dGFjaG1lbnRzKHJlY29yZElEOiBzdHJpbmcpe1xyXG5cclxuICAgIHZhciBkeW5hbWljTW9kdWxlUGFyYW1zID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgUGFyYW1OYW1lOiBcImFuc3dlcklkXCIsXHJcbiAgICAgICAgUGFyYW1WYWx1ZTogcmVjb3JkSUQsXHJcbiAgICAgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0sXHJcbiAgICAgIH1cclxuICAgIF07XHJcblxyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5SdW5FbmRQb2ludENhbGwoXHJcbiAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMuR2V0QWxsQXR0YWNobWVudHNFbmRQb2ludCxcclxuICAgICAgZHluYW1pY01vZHVsZVBhcmFtcyxcclxuICAgICAgKHJlczogQXJyYXk8RHluQXR0YWNobWVudD4pID0+IHtcclxuICAgICAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiR2V0QWxsQXR0YWNobWVudHNFbmRQb2ludCgpXCIsIHJlcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybS5GaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGZpZWxkLkZpZWxkVHlwZSA9PSBGaWVsZFR5cGVFbnVtLkltbWFnaW5lIHx8IGZpZWxkLkZpZWxkVHlwZSA9PSBGaWVsZFR5cGVFbnVtWydJbW1hZ2luZSBjb24gbWFya2VycyddKXtcclxuICAgICAgICAgICAgICB2YXIgYXR0YWNoSWQgPSB0aGlzLnJlY29yZFtmaWVsZC5OYW1lXTtcclxuICAgICAgICAgICAgICB0aGlzLnJlY29yZFtmaWVsZC5OYW1lXSA9IHJlcy5maW5kKHggPT4geC5JRCA9PSBhdHRhY2hJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5sb2FkZXIgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZm9ybWxvYWRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gZ2V0QWxsUmVjb3JkQXR0YWNobWVudHNcclxuXHJcbiAgLy8jcmVnaW9uIGZpZWxkc0NvbmZpZ1xyXG4gIGZpZWxkc0NvbmZpZygpIHtcclxuICAgIHRoaXMuY3JlYXRlUmVjb3JkUHJvcGVydGllcygpO1xyXG4gICAgdGhpcy5yZW9yZGVyRm9ybUZpZWxkcygpO1xyXG4gICAgdGhpcy5jcmVhdGVGb3JtR3JvdXAoKTtcclxuICAgIGlmICh0aGlzLmZvcm0uRm9ybVNjYWxhclR5cGUgIT0gRm9ybVNjYWxhclR5cGVFbnVtLlNlbXBsaWNlKSB7XHJcbiAgICAgIHRoaXMuY3JlYXRlRmllbGRHcm91cHMoKTtcclxuICAgIH1cclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJmaWVsZHNDb25maWcgLSBmb3JtXCIsIHRoaXMuZm9ybSk7XHJcbiAgICB0aGlzLmxvYWRlciA9IHRydWU7XHJcbiAgICB0aGlzLmZvcm1sb2FkZWQgPSB0cnVlO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gZmllbGRzQ29uZmlnXHJcblxyXG4gIC8vI3JlZ2lvbiBjcmVhdGVSZWNvcmRQcm9wZXJ0aWVzXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgbmVsbCdvZ2dldHRvIFJlY29yZCBsZSBwcm9wcmlldMOgIG1hbmNhbnRpIHJpc3BldHRvIGFpIGNhbXBpIGNoZSBjb21wb25nb25vIGxhIGZvcm0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZWNvcmRQcm9wZXJ0aWVzKCkge1xyXG4gICAgY29uc3QgcmVjb3JkUHJvcGVydGllczogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5rZXlzKHRoaXMucmVjb3JkKTtcclxuICAgIHRoaXMuZm9ybS5GaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgaWYgKCFyZWNvcmRQcm9wZXJ0aWVzLmZpbmQoKHApID0+IHAgPT09IGZpZWxkLk5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRbZmllbGQuTmFtZV0gPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLmZvcm0uSW5uZXJGb3JtcyAmJiB0aGlzLmZvcm0uSW5uZXJGb3Jtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5Jbm5lckZvcm1zLmZvckVhY2goKGZvcm0pID0+IHtcclxuICAgICAgICBjb25zdCBhcnJheU5hbWU6IHN0cmluZyA9IGZvcm0uTmFtZS5zcGxpdChcIiBcIikuam9pbihcIl9cIik7XHJcbiAgICAgICAgaWYgKCFyZWNvcmRQcm9wZXJ0aWVzLmZpbmQoKHApID0+IHAgPT09IGFycmF5TmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMucmVjb3JkW2FycmF5TmFtZV0gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImNyZWF0ZVJlY29yZFByb3BlcnRpZXMgLSBmb3JtXCIsIHRoaXMuZm9ybSk7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiY3JlYXRlUmVjb3JkUHJvcGVydGllcyAtIHJlY29yZFwiLCB0aGlzLnJlY29yZCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBjcmVhdGVSZWNvcmRQcm9wZXJ0aWVzXHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgcmlvcmRpbmFyZSBpIGNhbXBpIGNoZSBjb21wb25nb25vIGxhIGZvcm0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZW9yZGVyRm9ybUZpZWxkcygpIHtcclxuICAgIGlmICh0aGlzLmZvcm0uRmllbGRzICYmIHRoaXMuZm9ybS5GaWVsZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmZvcm0uRmllbGRzLnNvcnQoKGEsIGIpID0+XHJcbiAgICAgICAgYS5PcmRpbmFsUG9zaXRpb24gPiBiLk9yZGluYWxQb3NpdGlvbiA/IDEgOiBiLk9yZGluYWxQb3NpdGlvbiA+IGEuT3JkaW5hbFBvc2l0aW9uID8gLTEgOiAwKTtcclxuICAgIH1cclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJyZW9yZGVyRm9ybUZpZWxkcyAtIGZvcm1cIiwgdGhpcy5mb3JtKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY3JlYXJlIGlsIEZvcm1Hcm91cCBjaGUgcmFwcHJlc2VudGEgbGEgZm9ybS5cclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZUZvcm1Hcm91cCgpIHtcclxuICAgIHRoaXMuZm9ybUZvcm0gPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLkNyZWF0ZUZvcm1Gb3JtR3JvdXAoXHJcbiAgICAgIHRoaXMuZm9ybS5GaWVsZHMsXHJcbiAgICAgICg8UmVjb3JkPnRoaXMucmVjb3JkKSxcclxuICAgICAgdGhpcy5vbmx5Vmlld1xyXG4gICAgKTtcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJjcmVhdGVGb3JtR3JvdXAgLSBmb3JtXCIsIHRoaXMuZm9ybSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNyZWFyZSBpIGdydXBwaSBpbiBjdWkgcmFnZ3J1cHBhcmUgaSBjYW1waSBkZWxsYSBmb3JtIGluIGJhc2VcclxuICAgKiBhIGNvbWUgw6ggc3RhdGEgY29uZmlndXJhdGEgZGFsbCd1dGVudGUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWVsZEdyb3VwcygpIHtcclxuICAgIHRoaXMuZm9ybS5Gb3JtRmllbGRzR3JvdXBzLnNvcnQoKGEsIGIpID0+IGEuT3JkaW5hbFBvc2l0aW9uID4gYi5PcmRpbmFsUG9zaXRpb24gPyAxIDogYi5PcmRpbmFsUG9zaXRpb24gPiBhLk9yZGluYWxQb3NpdGlvbiA/IC0xIDogMClcclxuICAgICAgLm1hcCgoZykgPT4gZy5OYW1lKVxyXG4gICAgICAuZm9yRWFjaCgoZ3JvdXBOYW1lKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maWVsZEdyb3Vwc1tncm91cE5hbWVdID0gdGhpcy5mb3JtLkZpZWxkcy5maWx0ZXIoXHJcbiAgICAgICAgICAoZikgPT4gZi5GaWVsZEdyb3VwID09IGdyb3VwTmFtZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiY3JlYXRlRmllbGRHcm91cHMgLSBmb3JtXCIsIHRoaXMuZm9ybSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAvLyNyZWdpb24gY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgaWwgRm9ybUdyb3VwIGNoZSByYXBwcmVzZW50YSBsYSBmb3JtLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzKHJlY29yZDogUmVjb3JkKSB7XHJcblxyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImNyZWF0ZUhUTUxyZWFkYWJsZVZhbHVlcyAtIHJlY29yZFwiLCByZWNvcmQpO1xyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImNyZWF0ZUhUTUxyZWFkYWJsZVZhbHVlcyAtIGZvcm1cIiwgdGhpcy5mb3JtKTtcclxuXHJcbiAgICB2YXIgZm9ybW5hbWVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuICAgIHRoaXMuZm9ybS5GaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtmb3JtbmFtZXMucHVzaChmaWVsZC5OYW1lKTt9KTtcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJjcmVhdGVIVE1McmVhZGFibGVWYWx1ZXMgLSBmb3JtIGZpZWxkcyBuYW1lc1wiLCBmb3JtbmFtZXMpO1xyXG5cclxuICAgIC8vIGFsZXJ0KFwiY29udGludWUgZm9yIHZhbHVlcz9cIilcclxuXHJcbiAgICBsZXQgb3V0cHV0VmFsdWVzQXJyYXkgPSBhd2FpdCB0aGlzLmdldFJlc3BvbnNlVmFsdWVzKHJlY29yZCwgdGhpcy5mb3JtKTtcclxuICAgIFxyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImNyZWF0ZUhUTUxyZWFkYWJsZVZhbHVlcyAtIG91dHB1dFZhbHVlc0FycmF5XCIsIG91dHB1dFZhbHVlc0FycmF5KTtcclxuXHJcbiAgICAvLyBhbGVydChcImNvbnRpbnVlIGZvciB0ZW1wbGF0ZXM/XCIpXHJcbiAgICBsZXQgdGVtcGxhdGU6IHN0cmluZyA9IHRoaXMuZ2V0UmVzcG9uc2VUZW1wbGF0ZShyZWNvcmQsIHRoaXMuZm9ybSk7IC8vIG9nZ2V0dG8gbmVsIHF1YWxlIHZpZW5lIGNvc3RydWl0byBpbCB0ZW1wbGF0ZSBvIGNoZSBwcmVuZGUgaWwgdmFsb3JlIGRhIHVuIHRlbXBsYXRlIGVzdGVybm9cclxuICAgIFxyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImNyZWF0ZUhUTUxyZWFkYWJsZVZhbHVlcyAtIHRlbXBsYXRlXCIsIHRlbXBsYXRlKTtcclxuICAgIC8vIGFsZXJ0KFwiY29udGludWUgZm9yIG91dHB1dD9cIilcclxuICAgIGNvbnN0IHJlZ2V4ID0gLyMjKFtcXHddKykjIy9nO1xyXG4gICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5yZXBsYWNlVGVtcGxhdGVQbGFjZWhvbGRlcnNXaXRoVmFsdWVzKHRlbXBsYXRlLCBvdXRwdXRWYWx1ZXNBcnJheSwgcmVnZXgpXHJcblxyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImNyZWF0ZUhUTUxyZWFkYWJsZVZhbHVlcyAtIG91dHB1dFwiLCBvdXRwdXQpO1xyXG4gICAgLy8gYWxlcnQoXCJjb250aW51ZSBmb3IgZW5kaW5nP1wiKVxyXG4gICAgcmV0dXJuIG91dHB1dDsgLy8gb2dnZXR0byBjaGUgY29udGVycsOgIGwnb3V0cHV0IGVsYWJvcmF0byAgICBcclxuXHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBjcmVhdGVIVE1McmVhZGFibGVWYWx1ZXNcclxuXHJcbiAgLy8jcmVnaW9uIGdldFJlc3BvbnNlVmFsdWVzXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRSZXNwb25zZVZhbHVlcyhyZWNvcmQ6IFJlY29yZCwgZm9ybTogRm9ybSkge1xyXG4gICAgbGV0IG91dHB1dFZhbHVlc0FycmF5OiBBcnJheTxhbnk+ID0gW107IC8vIGFycmF5IGNvbiBpIHZhbG9yaSBkZWxsZSByaXNwb3N0ZVxyXG4gICAgLy8oPER5blJlY29yZD50aGlzLnJlY29yZCkuVmFsdWVzIMOoIGxhIGxpc3RhIGRpIG9nZ2V0dGkge2ZpZWxkTmFtZTogdmFsb3JlfVxyXG4gICAgLy8gR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIihyZWNvcmQpLlZhbHVlc1wiLCByZWNvcmQpO1xyXG5cclxuICAgIGZvcm0uRmllbGRzLmZvckVhY2goXHJcbiAgICAgIGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvL0dsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJnZXRSZXNwb25zZVZhbHVlcyBmaWVsZFwiLCBmaWVsZCk7XHJcbiAgICAgICAgICAvLyBsZXQgZm91bmRPYmplY3QgPSByZWNvcmQuZmluZChcclxuICAgICAgICAgIC8vICAgKG9iaikgPT4gb2JqID09PSBmaWVsZC5OYW1lXHJcbiAgICAgICAgICAvLyApO1xyXG4gICAgICAgICAgbGV0IGZvdW5kT2JqZWN0ID0gcmVjb3JkW2ZpZWxkLk5hbWVdO1xyXG5cclxuICAgICAgICAgIC8vIGZhcmUgdW4gZXZhbCBwZXIgcG9wb2xhcmUgaSB2YWx1ZVBhaXJzIHNlIMOoIHByZXNlbnRlIHVuYSBmb3JtdWxhXHJcbiAgICAgICAgICAvLyBwcmVuZGVyZSBsYSBsYWJlbCBjb3JyZXR0YVxyXG4gICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgIC8vIFBSRVBBUk8gSUwgVkFMVUVQQUlSU1xyXG4gICAgICAgICAgc3dpdGNoKGZpZWxkLkZpZWxkVHlwZSl7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkVsZW5jbyBnZW5lcmljb1wiXTp7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICBpZiAoZmllbGQuRm9ybXVsYSAhPSBudWxsICYmIGZpZWxkLkZvcm11bGEpIHtcclxuICAgICAgICAgICAgICAgIC8vIGFnZ2l1bmdvIGEgdmFsdWVwYWlycyBpIHZhbG9yaSBjYWxjb2xhdGlcclxuICAgICAgICAgICAgICAgIC8vICg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnMgPSAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzID8gKDxMaXN0VmFsdWVGaWVsZD5mb3VuZE9iamVjdCkuVmFsdWVQYWlycyA6IHt9O1xyXG4gICAgICAgICAgICAgICAgdmFyIHRlbXAgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYShcclxuICAgICAgICAgICAgICAgICAgZmllbGQuRm9ybXVsYSxcclxuICAgICAgICAgICAgICAgICAgcmVjb3JkLFxyXG4gICAgICAgICAgICAgICAgICBudWxsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5MiBpbiB0ZW1wKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChVdGlsaXR5SGVscGVyU2VydmljZS5pc051bWVyaWModGVtcFtrZXkyXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW051bWJlcihrZXkyKV0gPSB0ZW1wW2tleTJdO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlUGFpcnNba2V5Ml0gPSB0ZW1wW2tleTJdO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZC5OYW1lXSA9ICg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlUGFpcnNbcmVjb3JkW2ZpZWxkLk5hbWVdXTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlUGFpcnMgIT0gbnVsbCAmJiAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIHZhIGJlbmUgY29zw6xcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlU3RyaW5nICE9IG51bGwgJiYgKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVTdHJpbmcgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gdmEgcHJlc2EgbGEgc3RyaWduYSBlIHJpbWFwcGF0YSBuZWwgZGlhcmlvXHJcbiAgICAgICAgICAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzID0gR2xvYmFsU2VydmljZS5zdHJpbmdUb1ZhbHVlUGFpcnMoKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVTdHJpbmcpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IGludmVydGVkID0ge307XHJcbiAgICAgICAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiKDxMaXN0VmFsdWVGaWVsZD5mb3VuZE9iamVjdCkuVmFsdWVQYWlyc1wiLCAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzKTtcclxuICAgICAgICAgICAgICAvLyBWYWx1ZVBhaXJzOiB7U2k6ICdTaScsIE5vOiAnTm8nfVxyXG4gICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzKSB7XHJcbiAgICAgICAgICAgICAgICBpbnZlcnRlZFsoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW2tleV1dID0ga2V5O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzID0gaW52ZXJ0ZWQ7XHJcbiAgICAgICAgICAgICAgaWYocmVjb3JkW2ZpZWxkLk5hbWVdICE9IG51bGwgJiYgKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuSXNNdWx0aUNob2ljaGUpe1xyXG4gICAgICAgICAgICAgICAgLy8gY2FzbyBNVUxUSVNDRUxUQVxyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIHJlY29yZFtmaWVsZC5OYW1lXS5mb3JFYWNoKChlbGVtZW50LCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlICs9ICg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlUGFpcnNbZWxlbWVudF07XHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlICs9IGkgPT0gcmVjb3JkW2ZpZWxkLk5hbWVdLmxlbmd0aCAtMSA/IFwiXCI6IFwiLCBcIlxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZC5OYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZC5OYW1lXSA9ICg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlUGFpcnNbcmVjb3JkW2ZpZWxkLk5hbWVdXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIm91dHB1dFZhbHVlc0FycmF5XCIsIG91dHB1dFZhbHVlc0FycmF5KVxyXG5cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQ2FtcG8gbnVtZXJpY29cIl06e1xyXG4gICAgICAgICAgICAgIGlmKCg8TnVtZXJpY0ZpZWxkPmZpZWxkKS5Jc0ludGVnZXIpe1xyXG4gICAgICAgICAgICAgICAgaWYoKDxOdW1lcmljRmllbGQ+ZmllbGQpLkRlY2ltYWxTZXBhcmF0b3IgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlc0FycmF5W2ZpZWxkLk5hbWVdID0gcmVjb3JkW2ZpZWxkLk5hbWVdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSByZWNvcmRbZmllbGQuTmFtZV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlc0FycmF5W2ZpZWxkLk5hbWVdID0gcmVjb3JkW2ZpZWxkLk5hbWVdO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnSW1tYWdpbmUnXTp7XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgLy8gUmVjdXBlcm8gaWwgQkFTRTY0IGRlbGwnaW1tYWdpbmUgUmVzaXplZCB2aWEgcHJvbWlzZSBjbGllbnRcclxuICAgICAgICAgICAgICB2YXIgcmVzaXplZEJhc2U2NCA9IGF3YWl0IHRoaXMucmVzaXplQmFzZTY0SW1hZ2UoXCJkYXRhOmltYWdlL1wiK3JlY29yZFtmaWVsZC5OYW1lXS5GaWxlRXh0ZW5zaW9uK1wiO2Jhc2U2NCxcIiArIHJlY29yZFtmaWVsZC5OYW1lXS5GaWxlRGF0YUJhc2U2NCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIEFnZ2l1bmdvIGwnSFRNTCBjb24gaWwgbnVvdm8gQkFTRTY0XHJcbiAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSBcIjxpbWcgc3JjPSdcIiArIHJlc2l6ZWRCYXNlNjQrXCInIHN0eWxlPSdoZWlnaHQ6IFwiK3JlY29yZFtmaWVsZC5OYW1lXS5SZXNpemVkSW1hZ2VIZWlnaHRQeCtcInB4Jz5cIjtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnSW1tYWdpbmUgY29uIG1hcmtlcnMnXTp7XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgLy8gUmVjdXBlcm8gaWwgQkFTRTY0IGRlbGwnaW1tYWdpbmUgUmVzaXplZCB2aWEgcHJvbWlzZSBjbGllbnRcclxuICAgICAgICAgICAgICB2YXIgcmVzaXplZEJhc2U2NCA9IGF3YWl0IHRoaXMucmVzaXplQmFzZTY0SW1hZ2UoXCJkYXRhOmltYWdlL1wiK3JlY29yZFtmaWVsZC5OYW1lXS5GaWxlRXh0ZW5zaW9uK1wiO2Jhc2U2NCxcIiArIHJlY29yZFtmaWVsZC5OYW1lXS5GaWxlRGF0YUJhc2U2NCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIEFnZ2l1bmdvIGwnSFRNTCBjb24gaWwgbnVvdm8gQkFTRTY0XHJcbiAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSBcIjxpbWcgc3JjPSdcIiArIHJlc2l6ZWRCYXNlNjQrXCInIHN0eWxlPSdoZWlnaHQ6IFwiK3JlY29yZFtmaWVsZC5OYW1lXS5SZXNpemVkSW1hZ2VIZWlnaHRQeCtcInB4Jz5cIjtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnRWxlbmNvIGltbWFnaW5pJ106e1xyXG4gICAgICAgICAgICAgIG91dHB1dFZhbHVlc0FycmF5W2ZpZWxkLk5hbWVdID0gXCJcIjtcclxuICAgICAgICAgICAgICBpZihyZWNvcmRbZmllbGQuTmFtZV0gIT0gbnVsbCAmJiAoPEltYWdlU2VsZWN0b3JGaWVsZD5maWVsZCkuSXNNdWx0aUNob2ljaGUpe1xyXG4gICAgICAgICAgICAgICAgcmVjb3JkW2ZpZWxkLk5hbWVdLmZvckVhY2goKGltYWdlb2JqOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdmFyIGF0dGFjaG1lbnRJbkZvcm06IER5bkF0dGFjaG1lbnQgPSAoPEltYWdlU2VsZWN0b3JGaWVsZD5maWVsZCkuQXR0YWNobWVudExpc3QuZmluZCh4ID0+IHguSUQgPT0gaW1hZ2VvYmopO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudEluRm9ybSAhPSBudWxsKXtcclxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZC5OYW1lXSArPSBhdHRhY2htZW50SW5Gb3JtLkJ1dHRvbktleSArIFwiLCBcIjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZC5OYW1lXS5zcGxpdChcIiwgXCIpO1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSBwYXJ0cy5zbGljZSgwLCBwYXJ0cy5sZW5ndGggLSAxKS5qb2luKFwiLCBcIik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXR0YWNobWVudEluRm9ybTogRHluQXR0YWNobWVudCA9ICg8SW1hZ2VTZWxlY3RvckZpZWxkPmZpZWxkKS5BdHRhY2htZW50TGlzdC5maW5kKHggPT4geC5JRCA9PSByZWNvcmRbZmllbGQuTmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRJbkZvcm0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlc0FycmF5W2ZpZWxkLk5hbWVdID0gYXR0YWNobWVudEluRm9ybS5CdXR0b25LZXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH07ICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OntcclxuICAgICAgICAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZC5OYW1lXSA9IHJlY29yZFtmaWVsZC5OYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIClcclxuXHJcbiAgICAvLyBGdW56aW9uYSwgbWEgbm9uIMOoIGFmZmlkYWJpbGUgYWwgMTAwJVxyXG4gICAgYXdhaXQgdGhpcy5kZWxheSgzMDAwKTtcclxuXHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwib3V0cHV0VmFsdWVzQXJyYXkgMVwiLCBvdXRwdXRWYWx1ZXNBcnJheSk7XHJcbiAgICAvLyBjYW5jZWxsbyBpIHZhbG9yaSBpbmRlZmluaXRpIG8gbnVsbGlcclxuICAgIGZvciAoY29uc3QgY2hpYXZlIGluIG91dHB1dFZhbHVlc0FycmF5KSB7XHJcbiAgICAgIGlmIChvdXRwdXRWYWx1ZXNBcnJheVtjaGlhdmVdID09IHVuZGVmaW5lZCB8fCBvdXRwdXRWYWx1ZXNBcnJheVtjaGlhdmVdID09IG51bGwpXHJcbiAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbY2hpYXZlXSA9ICcnXHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0cHV0VmFsdWVzQXJyYXk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBnZXRSZXNwb25zZVZhbHVlc1xyXG5cclxuICAvLyNyZWdpb24gZ2V0UmVzcG9uc2VUZW1wbGF0ZVxyXG4gIHByaXZhdGUgZ2V0UmVzcG9uc2VUZW1wbGF0ZShyZWNvcmQ6IFJlY29yZCwgZm9ybTogRm9ybSk6IHN0cmluZyB7XHJcbiAgICAgIGxldCB0ZW1wbGF0ZTogc3RyaW5nID0gJzxkaXYgY2xhc3M9XCJyb3dcIj4nO1xyXG4gICAgLy8gUFJFUEFSTyBPIFBSRU5ETyBMQSBTVFJVVFRVUkEgREEgU1RBTVBBUkVcclxuICAgIGZvcm0uRmllbGRzLmZvckVhY2goKGJhc2VGaWVsZDogQmFzZUZpZWxkKSA9PiB7XHJcbiAgICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coJ2dldFJlc3Bvc25lVGVtcGxhdGUgLSBwcmUgLSBmaWVsZCcsIGJhc2VGaWVsZClcclxuICAgICAgaWYoYmFzZUZpZWxkLkFuc3dlclN0eWxlID09IG51bGwgfHwgYmFzZUZpZWxkLkFuc3dlclN0eWxlID09IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgYmFzZUZpZWxkLkFuc3dlclN0eWxlID0gbmV3IEFuc3dlclN0eWxlKCk7XHJcbiAgICAgICAgYmFzZUZpZWxkLkFuc3dlclN0eWxlLkNvbFNwYW5TaXplcyA9IGJhc2VGaWVsZC5Db2xTcGFuU2l6ZXM7XHJcbiAgICAgICAgYmFzZUZpZWxkLkFuc3dlclN0eWxlLkZpZWxkc3R5bGVDU1MgPSBiYXNlRmllbGQuRmllbGRzdHlsZUNTUztcclxuICAgICAgICBiYXNlRmllbGQuQW5zd2VyU3R5bGUuTGFiZWxzdHlsZUNTUyA9IGJhc2VGaWVsZC5MYWJlbHN0eWxlQ1NTO1xyXG4gICAgICAgIGlmKGJhc2VGaWVsZC5WaXNpYmxlSWYpe1xyXG4gICAgICAgICAgYmFzZUZpZWxkLkFuc3dlclN0eWxlLkluTGlzdFZpZXcgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYShiYXNlRmllbGQuVmlzaWJsZUlmLCByZWNvcmQsIG51bGwpO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgYmFzZUZpZWxkLkFuc3dlclN0eWxlLkluTGlzdFZpZXcgPSBiYXNlRmllbGQuSW5MaXN0VmlldztcclxuICAgICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5WaXNpYmxlSWYgPSBiYXNlRmllbGQuVmlzaWJsZUlmO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBcclxuICAgICAgaWYoYmFzZUZpZWxkLkFuc3dlclN0eWxlLlZpc2libGVJZil7XHJcbiAgICAgICAgY29uc3QgdmlzaWJpbGl0eSA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5WaXNpYmxlSWYsIHJlY29yZCwgbnVsbClcclxuICAgICAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiRXZhbHVhdGVGaWVsZEZvcm11bGEgLSB2aXNpYmlsaXR5XCIsIHZpc2liaWxpdHkpO1xyXG4gICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Jbkxpc3RWaWV3ID0gKHZpc2liaWxpdHkgPT0gdHJ1ZSkgPyB0cnVlIDogZmFsc2UgO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Jbkxpc3RWaWV3KXtcclxuICAgICAgICB0ZW1wbGF0ZSArPSAnPGRpdiBjbGFzcz1cIicrIHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0RmllbGRBbnN3ZXJTdHlsZUNsYXNzKGJhc2VGaWVsZCkgKycgZC1mbGV4IGZsZXgtY29sdW1uIGR5bmFmb3JtLWFuc3dlci1maWVsZFwiPiAnK1xyXG4gICAgICAgICcgPHNwYW4gY2xhc3M9XCJkeW5hZm9ybS1xdWVzdGlvblwiIHN0eWxlPVwiJyArIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5MYWJlbHN0eWxlQ1NTICsgJ1wiPicgKyBiYXNlRmllbGQuRGVzY3JpcHRpb24gKyAnOjwvc3Bhbj4nICsgXHJcbiAgICAgICAgJyA8c3BhbiBjbGFzcz1cImR5bmFmb3JtLXJlc3BvbnNlXCIgc3R5bGU9XCInICsgYmFzZUZpZWxkLkFuc3dlclN0eWxlLkZpZWxkc3R5bGVDU1MgKyAnXCI+ICMjJyArIGJhc2VGaWVsZC5OYW1lICsgJyMjPC9zcGFuPicgKyBcclxuICAgICAgICAnPC9kaXY+IFxcbiAnO1xyXG4gICAgICB9ZWxzZSBpZighYmFzZUZpZWxkLkFuc3dlclN0eWxlLkluTGlzdFZpZXcgJiYgYmFzZUZpZWxkLkFuc3dlclN0eWxlLkludmlzaWJpbGl0eSA9PSBGaWVsZEludmlzaWJpbGl0eUVudW1bJ05BU0NPU1RPIENPTiBBUkVBIFZJU0lCSUxFJ10pe1xyXG4gICAgICAgIHRlbXBsYXRlICs9ICc8ZGl2IGNsYXNzPVwiJysgdGhpcy51dGlsaXR5U2VydmljZS5nZXRGaWVsZEFuc3dlclN0eWxlQ2xhc3MoYmFzZUZpZWxkKSArJyBkLWZsZXggZmxleC1jb2x1bW4gZHluYWZvcm0tYW5zd2VyLWZpZWxkXCI+ICcrXHJcbiAgICAgICAgJzwvZGl2PiBcXG4gJztcclxuICAgICAgfVxyXG5cclxuICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnZ2V0UmVzcG9zbmVUZW1wbGF0ZSAtIHBvc3QgLSBmaWVsZCcsIGJhc2VGaWVsZClcclxuICAgIH0pO1xyXG4gICAgLy8gKGF0dHVhbG1lbnRlIG5vbiBlc2lzdGUgaWwgY29uY2V0dG8gZGkgdGVtcGF0ZSBkaSBvdXRwdXQpXHJcbiAgICAgIHRlbXBsYXRlICs9ICc8L2Rpdj4nO1xyXG4gICAgICByZXR1cm4gdGVtcGxhdGU7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBnZXRSZXNwb25zZVRlbXBsYXRlXHJcblxyXG4gIHByaXZhdGUgcmVwbGFjZVRlbXBsYXRlUGxhY2Vob2xkZXJzV2l0aFZhbHVlcyh0ZW1wbGF0ZTogc3RyaW5nLCBvdXRwdXRWYWx1ZXNBcnJheTogQXJyYXk8YW55PiwgcmVnZXgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UocmVnZXgsIChtYXRjaCwgZ3JvdXApID0+IHtcclxuICAgICAgcmV0dXJuIDxzdHJpbmc+b3V0cHV0VmFsdWVzQXJyYXlbZ3JvdXBdO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWxheShtczogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoIHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcmVzaXplQmFzZTY0SW1hZ2UgKGJhc2U2NEltYWdlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWcuc3JjID0gYmFzZTY0SW1hZ2U7XHJcbiAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBjb25zdCB3aWR0aCA9IGltZy53aWR0aDtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSBpbWcuaGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gd2lkdGggLyBoZWlnaHQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgbmV3SGVpZ2h0ID0gMTI4O1xyXG4gICAgICAgIGNvbnN0IG5ld1dpZHRoID0gbmV3SGVpZ2h0ICogYXNwZWN0UmF0aW87XHJcblxyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IG5ld1dpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBuZXdIZWlnaHQ7XHJcbiAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xyXG4gICAgICAgIGxldCBxdWFsaXR5ID0gMC44O1xyXG4gICAgICAgIGxldCBkYXRhVVJMID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIHF1YWxpdHkpO1xyXG4gICAgICAgIHJlc29sdmUoZGF0YVVSTCk7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9ICBcclxuXHJcbiAgc2V0RGF0YUdldHRlcihmb3JtKXtcclxuICAgIGZvcm0uRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcblxyXG4gICAgICAvLyBUcmFzZm9ybW8gaWwgQmFzZTY0U3RyaW5nIGRlbCBEYXRhZ2V0dGVyIG5lbCBEYXRhZ2V0dGVyIHZlcm8gZSBwcm9wcmlvXHJcbiAgICAgIGlmIChmaWVsZC5EYXRhR2V0dGVyVmFsdWVCYXNlNjRTdHJpbmcgIT0gbnVsbCl7XHJcbiAgICAgICAgZmllbGQuRGF0YUdldHRlciA9IEpTT04ucGFyc2UoYXRvYihmaWVsZC5EYXRhR2V0dGVyVmFsdWVCYXNlNjRTdHJpbmcpKTtcclxuICAgICAgICBmaWVsZC5EYXRhR2V0dGVyLkRhdGFHZXR0ZXJUeXBlID0gZmllbGQuRGF0YUdldHRlci5EYXRhR2V0dGVyVHlwZSA9PSBudWxsID8gRGF0YUdldHRlclR5cGVFbnVtLk1hbnVhbGUgOiBmaWVsZC5EYXRhR2V0dGVyLkRhdGFHZXR0ZXJUeXBlOyAgIFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpZWxkLkRhdGFHZXR0ZXIgPSBuZXcgRGF0YUdldHRlcigpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmaWVsZC5EYXRhR2V0dGVyVmFsdWVCYXNlNjRTdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIH0pOyAgICAgIFxyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIGNoZWNrVHJpZ2dlcnNcclxuICAvLyBDb250cm9sbGEgZSBzcGFyYSBpbCB0cmlnZ2VyIHNlIG5lY2Vzc2FyaW9cclxuICBjaGVja1RyaWdnZXJzKHJlY29yZDogUmVjb3JkKXtcclxuICAgIHZhciBmaXJlVHJpZ2dlciA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuZm9ybS5UcmlnZ2VycyAhPSBudWxsKXtcclxuICAgICAgdGhpcy5mb3JtLlRyaWdnZXJzLmZvckVhY2goKHRyaWdnZXIpID0+IHtcclxuICAgICAgICBmaXJlVHJpZ2dlciA9IHRydWU7XHJcbiAgICAgICAgdHJpZ2dlci5jb25kaXRpb25zLmZvckVhY2goKGNvbmRpdGlvbikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFmaXJlVHJpZ2dlcikgeyByZXR1cm47IH1cclxuICAgICAgICAgIHZhciBsb2dpY09wZXJhdG9yOiBMb2dpY09wZXJhdG9yID0gY29uZGl0aW9uLmxvZ2ljb3BlcmF0b3IgYXMgTG9naWNPcGVyYXRvcjsgXHJcbiAgICAgICAgICB2YXIgY29uZGl0aW9uS2V5ID0gT2JqZWN0LmtleXMoY29uZGl0aW9uLnJlY29yZClbMF07XHJcbiAgICAgICAgICB2YXIgY29uZGl0aW9uVmFsdWUgPSBjb25kaXRpb24ucmVjb3JkW2NvbmRpdGlvbktleV07XHJcbiAgICAgICAgICB2YXIgcmVjb3JkVmFsdWUgPSByZWNvcmRbY29uZGl0aW9uS2V5XTtcclxuXHJcbiAgICAgICAgICBpZiAobG9naWNPcGVyYXRvciA9PSBMb2dpY09wZXJhdG9yWyc9J10gJiYgY29uZGl0aW9uVmFsdWUgIT0gcmVjb3JkVmFsdWUpe1xyXG4gICAgICAgICAgICBmaXJlVHJpZ2dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGxvZ2ljT3BlcmF0b3IgPT0gTG9naWNPcGVyYXRvclsnIT0nXSAmJiBjb25kaXRpb25WYWx1ZSA9PSByZWNvcmRWYWx1ZSl7XHJcbiAgICAgICAgICAgIGZpcmVUcmlnZ2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gICAgICAgIFxyXG5cclxuICAgICAgICAgIGlmIChsb2dpY09wZXJhdG9yID09IExvZ2ljT3BlcmF0b3JbJzwnXSAmJiBjb25kaXRpb25WYWx1ZSA8PSByZWNvcmRWYWx1ZSl7XHJcbiAgICAgICAgICAgIGZpcmVUcmlnZ2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobG9naWNPcGVyYXRvciA9PSBMb2dpY09wZXJhdG9yWyc8PSddICYmIGNvbmRpdGlvblZhbHVlIDwgcmVjb3JkVmFsdWUpe1xyXG4gICAgICAgICAgICBmaXJlVHJpZ2dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGxvZ2ljT3BlcmF0b3IgPT0gTG9naWNPcGVyYXRvclsnPiddICYmIGNvbmRpdGlvblZhbHVlID49IHJlY29yZFZhbHVlKXtcclxuICAgICAgICAgICAgZmlyZVRyaWdnZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChsb2dpY09wZXJhdG9yID09IExvZ2ljT3BlcmF0b3JbJz49J10gJiYgY29uZGl0aW9uVmFsdWUgPiByZWNvcmRWYWx1ZSl7XHJcbiAgICAgICAgICAgIGZpcmVUcmlnZ2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobG9naWNPcGVyYXRvciA9PSBMb2dpY09wZXJhdG9yWydMSUtFJ10gJiYgcmVjb3JkVmFsdWUuaW5kZXhPZihjb25kaXRpb25WYWx1ZSkgPT0gLTEpe1xyXG4gICAgICAgICAgICBmaXJlVHJpZ2dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9ICBcclxuXHJcbiAgICAgICAgICBpZiAobG9naWNPcGVyYXRvciA9PSBMb2dpY09wZXJhdG9yWydOT1QgTElLRSddICYmIHJlY29yZFZhbHVlLmluZGV4T2YoY29uZGl0aW9uVmFsdWUpICE9IC0xKXtcclxuICAgICAgICAgICAgZmlyZVRyaWdnZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSAgICAgICAgICBcclxuXHJcbiAgICAgICAgICBpZiAobG9naWNPcGVyYXRvciA9PSBMb2dpY09wZXJhdG9yLlNpICYmICFyZWNvcmRWYWx1ZSl7XHJcbiAgICAgICAgICAgIGZpcmVUcmlnZ2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gICAgICAgIFxyXG5cclxuICAgICAgICAgIGlmIChsb2dpY09wZXJhdG9yID09IExvZ2ljT3BlcmF0b3IuTm8gJiYgcmVjb3JkVmFsdWUpe1xyXG4gICAgICAgICAgICBmaXJlVHJpZ2dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9ICAgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChmaXJlVHJpZ2dlcil7XHJcblxyXG4gICAgICAgICAgLy8gSWwgdHJpZ2dlciB2YSBzcGFyYXRvLiBWYWx1dG8gbGUgZnVuemlvbmkgaW50ZXJuZVxyXG4gICAgICAgICAgdmFyIGZvcm11bGFzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0cmlnZ2VyLmZvcm11bGFzKSk7XHJcbiAgICAgICAgICBPYmplY3Qua2V5cyhmb3JtdWxhcykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBmb3JtdWxhID0gZm9ybXVsYXNba2V5XTtcclxuICAgICAgICAgICAgdmFyIHRlbXAgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYShcclxuICAgICAgICAgICAgICBmb3JtdWxhLFxyXG4gICAgICAgICAgICAgIHJlY29yZCxcclxuICAgICAgICAgICAgICBudWxsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmb3JtdWxhc1trZXldID0gdGVtcDtcclxuXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAvLyBTcGFybyBpbCB0cmlnZ2VyIGFsbCdlc3Rlcm5vXHJcbiAgICAgICAgICB2YXIgdHJpZ2dlclRvRmlyZTogRmlyZVRyaWdnZXIgPSBuZXcgRmlyZVRyaWdnZXIoKTtcclxuICAgICAgICAgIHRyaWdnZXJUb0ZpcmUuZm9ybSA9IHRoaXMuZm9ybTsgLy8gSWwgZm9ybSBjaGUgaGEgcHJvdm9jYXRvIGlsIHRyaWdnZXJcclxuICAgICAgICAgIHRyaWdnZXJUb0ZpcmUucmVjb3JkID0gcmVjb3JkOyAvLyBJbCByZWNvcmQgY2hlIGhhIHByb3ZvY2F0byBpbCB0cmlnZ2VyXHJcbiAgICAgICAgICB0cmlnZ2VyVG9GaXJlLnRyaWdnZXIgPSB0cmlnZ2VyOyAvLyBJbCB0cmlnZ2VyXHJcbiAgICAgICAgICB0cmlnZ2VyVG9GaXJlLmZvcm11bGFzID0gZm9ybXVsYXM7IC8vIExlIGZvcm11bGUgaW52aWF0ZSBpbiBpbnB1dCBhbCBtb2R1bG8gZGluYW1pY28sIHZhbHV0YXRlIG5lbCBjb250ZXN0byBkZWwgdHJpZ2dlciBlIGRlbCByZWNvcmRcclxuICAgICAgICAgIHRyaWdnZXJUb0ZpcmUudXNlclBhdGllbnQgPSB0aGlzLnVzZXJJRDsgLy8gVXNlcklEXHJcblxyXG4gICAgICAgICAgdGhpcy5maXJlVHJpZ2dlci5lbWl0KHRyaWdnZXJUb0ZpcmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gY2hlY2tUcmlnZ2Vyc1xyXG5cclxufVxyXG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGVyXCI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBlcXAtZHluYW1pYy1tb2R1bGUtdGl0bGUgYWRkLWZvcm0tcmVjb3JkLWhlYWRlclwiICpuZ0lmPVwic2hvd1RpdGxlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57e2Zvcm0uTmFtZX19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtRm9ybVwiIGNsYXNzPVwiYWRkLWZvcm0tcmVjb3JkLWZvcm1cIj5cclxuXHJcbiAgICAgICAgPCEtLSBWSVNVQUxJWlpBWklPTkUgU0VNUExJQ0UgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm0uRm9ybVNjYWxhclR5cGUgPT0gRm9ybVNjYWxhclR5cGVFbnVtLlNlbXBsaWNlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmllbGRUZW1wbGF0ZXNcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZHM6IGZvcm0uRmllbGRzIH1cIiBjbGFzcz1cImFkZC1mb3JtLXJlY29yZC1zZW1wbGljZVwiPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIFZJU1VBTElaWkFaSU9ORSBBIFNURVBQRVIgLS0+XHJcbiAgICAgICAgPG1hdC1ob3Jpem9udGFsLXN0ZXBwZXIgbGluZWFyICpuZ0lmPVwiZm9ybS5Gb3JtU2NhbGFyVHlwZSA9PSBGb3JtU2NhbGFyVHlwZUVudW1bJ0Egc3RlcCddXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJhZGQtZm9ybS1yZWNvcmQtc3RlcHBlclwiPlxyXG4gICAgICAgICAgICA8bWF0LXN0ZXAgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGZvcm0uRm9ybUZpZWxkc0dyb3VwczsgbGV0IGkgPSBpbmRleDsgbGV0IGZpcnN0ID0gZmlyc3Q7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFN0ZXBMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICB7e2dyb3VwLk5hbWV9fVxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpZWxkVGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZHM6IGZpZWxkR3JvdXBzW2dyb3VwLk5hbWVdIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFkZC1mb3JtLXJlY29yZC1idXR0b25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFmaXJzdFwiIGNsYXNzPVwibXItMiBwcmV2aW91c1wiIG1hdC1yYWlzZWQtYnV0dG9uIG1hdFN0ZXBwZXJQcmV2aW91cz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgUHJlY2VkZW50ZVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhbGFzdFwiIGNsYXNzPVwiYnV0dG9uLW5leHRcIiBjb2xvcj1cInByaW1hcnlcIiBtYXQtcmFpc2VkLWJ1dHRvbiBtYXRTdGVwcGVyTmV4dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc2l2b1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJsYXN0ICYmIHNob3dTYXZlQnV0dG9uXCIgKGNsaWNrKT1cInNhdmVPckV4aXRGb3JtKGZhbHNlKVwiIGNsYXNzPVwiYnV0dG9uLW5leHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgU2FsdmFcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPC9tYXQtc3RlcD5cclxuICAgICAgICA8L21hdC1ob3Jpem9udGFsLXN0ZXBwZXI+XHJcblxyXG4gICAgICAgIDwhLS0gVklTVUFMSVpaQVpJT05FIEEgVEFCIC0tPlxyXG4gICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwiZm9ybS5Gb3JtU2NhbGFyVHlwZSA9PSBGb3JtU2NhbGFyVHlwZUVudW1bJ0luIHRhYiddXCIgY2xhc3M9XCJhZGQtZm9ybS1yZWNvcmQtdGFiXCI+XHJcbiAgICAgICAgICAgIDxtYXQtdGFiICpuZ0Zvcj1cImxldCBncm91cCBvZiBmb3JtLkZvcm1GaWVsZHNHcm91cHNcIiBbbGFiZWxdPVwiZ3JvdXAuTmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpZWxkVGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmaWVsZEdyb3Vwc1tncm91cC5OYW1lXSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9tYXQtdGFiPlxyXG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD5cclxuXHJcbiAgICAgICAgPCEtLSBWSVNVQUxJWlpBWklPTkUgQUQgQUNDT1JESU9OIC0tPlxyXG4gICAgICAgIDxtYXQtYWNjb3JkaW9uIG11bHRpICpuZ0lmPVwiZm9ybS5Gb3JtU2NhbGFyVHlwZSA9PSBGb3JtU2NhbGFyVHlwZUVudW1bJ0luIGFjY29yZGlvbiddXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJhZGQtZm9ybS1yZWNvcmQtYWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsICpuZ0Zvcj1cImxldCBncm91cCBvZiBmb3JtLkZvcm1GaWVsZHNHcm91cHNcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2dyb3VwLk5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpZWxkVGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZHM6IGZpZWxkR3JvdXBzW2dyb3VwLk5hbWVdIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxyXG4gICAgPC9mb3JtPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMiBhZGQtZm9ybS1yZWNvcmQtYnV0dG9uc1wiXHJcbiAgICAgICAgKm5nSWY9XCIoc2hvd0JhY2tCdXR0b24gfHwgc2hvd1NhdmVCdXR0b24pICYmIGZvcm0uRm9ybVNjYWxhclR5cGUgIT0gRm9ybVNjYWxhclR5cGVFbnVtWydBIHN0ZXAnXVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTIgdGV4dC1yaWdodFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibXItMlwiIG1hdC1yYWlzZWQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cInNob3dCYWNrQnV0dG9uXCIgKGNsaWNrKT1cInNhdmVPckV4aXRGb3JtKHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICBBbm51bGxhXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibXItMlwiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cInNob3dTYXZlQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlT3JFeGl0Rm9ybShmYWxzZSlcIiBbZGlzYWJsZWRdPVwiZm9ybUZvcm0uaW52YWxpZCB8fCBmb3JtRm9ybS5kaXNhYmxlZCB8fCBpc1NhdmluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNTYXZpbmdcIj5TYWx2YTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNTYXZpbmdcIj5TYWx2YXRhZ2dpbyBpbiBDb3Jzby4uLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG48IS0tIFRFTVBMQVRFIFBFUiBMQSBWSVNVQUxJWlpBWklPTkUgREVJIENBTVBJIERFTExBIEZPUk0gLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZmllbGRUZW1wbGF0ZXMgbGV0LWZpZWxkcz0nZmllbGRzJz5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cImZvcm1sb2FkZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHNcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ1dGlsaXR5U2VydmljZS5nZXRGaWVsZFN5bGVDbGFzcyhmaWVsZCwgc2hvd0FsbEZpZWxkcylcIj5cclxuICAgICAgICAgICAgPGR5bmFtaWMtbW9kdWxlLWZpZWxkLWZpeCAjZmllbGRUZW1wbGF0ZSBbZmllbGRdPVwiZmllbGRcIiBbUXVlcnlFZGl0b3JDb21wb25lbnRdPVwiUXVlcnlFZGl0b3JDb21wb25lbnRcIiBbZm9ybV09XCJmb3JtXCIgW3JlY29yZF09XCJyZWNvcmRcIiBbZW5kUG9pbnRDb25maWd1cmF0aW9uXT1cImVuZFBvaW50Q29uZmlndXJhdGlvblwiIFt1c2VySURdPVwidXNlcklEXCIgW2luQ29uZmlnXT1cImluQ29uZmlnXCJcclxuICAgICAgICAgICAgICAgIChyZWNvcmRDaGFuZ2UpPVwib25SZWNvcmRDaGFuZ2UoKVwiPlxyXG4gICAgICAgICAgICA8L2R5bmFtaWMtbW9kdWxlLWZpZWxkLWZpeD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
747
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWZvcm0tcmVjb3JkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9mb3JtLXJlY29yZHMvYWRkLWZvcm0tcmVjb3JkL2FkZC1mb3JtLXJlY29yZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZm9ybS1yZWNvcmRzL2FkZC1mb3JtLXJlY29yZC9hZGQtZm9ybS1yZWNvcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNILE9BQU8sRUFBRSxXQUFXLEVBQWEsVUFBVSxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2xKLE9BQU8sRUFBUSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFbkYsT0FBTyxFQUE2QyxhQUFhLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUU1SCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFLcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQVcsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7Ozs7OztBQVF4RSxNQUFNLE9BQU8sc0JBQXNCO0lB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SztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxHQUFHO3NCQUFaLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFlUCxhQUFhO3NCQURaLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBEeW5hbWljTW9kdWxlQ29tcGlsZUNvbmZpZyB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9keW5hbWljTW9kdWxlQ29tcGlsZUNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IEFuc3dlclN0eWxlLCBCYXNlRmllbGQsIERhdGFHZXR0ZXIsIERhdGFHZXR0ZXJUeXBlRW51bSwgRmllbGRJbnZpc2liaWxpdHlFbnVtLCBGaWVsZFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2Jhc2VGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm0sIEZvcm1TY2FsYXJUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9mb3JtLm1vZGVsJztcclxuaW1wb3J0IHsgRHluUmVjb3JkLCBSZWNvcmQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvcmVjb3JkLm1vZGVsJztcclxuaW1wb3J0IHsgVXRpbGl0eUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXR5SGVscGVyLnNlcnZpY2VzJztcclxuaW1wb3J0IHsgRHluYW1pY01vZHVsZUZpZWxkRml4Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZHluYW1pYy1tb2R1bGUtZmllbGQtZml4L2R5bmFtaWMtbW9kdWxlLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVuZFBvaW50Q29uZmlndXJhdGlvbiwgRW5kUG9pbnREYXRhUGFyYW1zLCBQYXJhbVR5cGVFbnVtIH0gZnJvbSAnLi8uLi8uLi8uLi8uLi9tb2RlbHMvZW5kUG9pbnRDb25maWd1cmF0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgTGlzdFZhbHVlRmllbGQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZmllbGRzL2xpc3RWYWx1ZUZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgR2xvYmFsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2dsb2JhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTnVtZXJpY0ZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2ZpZWxkcy9udW1lcmljRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBJbWFnZVNlbGVjdG9yRmllbGQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZmllbGRzL2ltYWdlU2VsZWN0b3JGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IER5bkF0dGFjaG1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZHluQXR0YWNobWVudCc7XHJcbmltcG9ydCB7IER5bmFtaWNMb2FkZXJEaXJlY3RpdmVEYXRhLCBldmVudE91dCB9IGZyb20gXCIuLi8uLi8uLi8uLi9kaXJlY3RpdmVzL2R5bmFtaWMtbG9hZGVyL2R5bmFtaWMtbG9hZGVyLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBMb2dpY09wZXJhdG9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2xvZ2ljT3BlcmF0b3IubW9kZWwnO1xyXG5pbXBvcnQgeyBGaXJlVHJpZ2dlciwgVHJpZ2dlciB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy90cmlnZ2VyLm1vZGVsJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhZGQtZm9ybS1yZWNvcmRcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2FkZC1mb3JtLXJlY29yZC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9hZGQtZm9ybS1yZWNvcmQuY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZGRGb3JtUmVjb3JkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgY29uZmlndXJhdGlvbnM6IER5bmFtaWNNb2R1bGVDb21waWxlQ29uZmlnO1xyXG4gIEBJbnB1dCgpIGVuZFBvaW50Q29uZmlndXJhdGlvbjogRW5kUG9pbnRDb25maWd1cmF0aW9uO1xyXG4gIEBJbnB1dCgpIHVzZXJJRDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG9yZ2FJRDogc3RyaW5nID0gbnVsbDsgLy8gcHJldmlld1xyXG4gIFxyXG4gIEBJbnB1dCgpIGZvcm1JRDogc3RyaW5nID0gbnVsbDsgLy8gcHJldmlld1xyXG4gIEBJbnB1dCgpIGZvcm06IEZvcm0gPSBudWxsOyAvLyBwcmV2aWV3IGNvbmZpZ1xyXG4gIEBJbnB1dCgpIHJlY29yZDogUmVjb3JkIHwgc3RyaW5nID0gbnVsbDsgLy8gZWRpdFxyXG4gIEBJbnB1dCgpIG9ubHlWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgaXNEdXBsaWNhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBpbkNvbmZpZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dBbGxGaWVsZHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgUXVlcnlFZGl0b3JDb21wb25lbnQ6IER5bmFtaWNMb2FkZXJEaXJlY3RpdmVEYXRhOyAvLyBMJ2ludGVybyBjb21wb25lbnRlIHF1ZXJ5IEVkaXRvclxyXG5cclxuICBAT3V0cHV0KCkgc2F2ZVJlY29yZEV2ZW50OiBFdmVudEVtaXR0ZXI8UmVjb3JkPiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPigpO1xyXG4gIEBPdXRwdXQoKSBhZnRlclNhdmVSZWNvcmRFdmVudDogRXZlbnRFbWl0dGVyPFJlY29yZD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZD4oKTtcclxuICBAT3V0cHV0KCkgb3V0OiBFdmVudEVtaXR0ZXI8ZXZlbnRPdXQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxldmVudE91dD4oKTtcclxuICBAT3V0cHV0KCkgZmlyZVRyaWdnZXI6IEV2ZW50RW1pdHRlcjxGaXJlVHJpZ2dlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpcmVUcmlnZ2VyPigpO1xyXG5cclxuICBzaG93VGl0bGUgPSB0cnVlO1xyXG4gIHNob3dTYXZlQnV0dG9uID0gdHJ1ZTtcclxuICBzaG93QmFja0J1dHRvbiA9IHRydWU7XHJcbiAgbG9hZGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmb3JtbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGZvcm1Gb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG4gIGZpZWxkR3JvdXBzOiB7IFtrZXk6IHN0cmluZ106IEFycmF5PEJhc2VGaWVsZD4gfSA9IHt9O1xyXG4gIEZvcm1TY2FsYXJUeXBlRW51bSA9IEZvcm1TY2FsYXJUeXBlRW51bTtcclxuICBGaWVsZFR5cGVFbnVtID0gRmllbGRUeXBlRW51bTtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihcImZpZWxkVGVtcGxhdGVcIilcclxuICBmaWVsZFRlbXBsYXRlOiBRdWVyeUxpc3Q8RHluYW1pY01vZHVsZUZpZWxkRml4Q29tcG9uZW50PjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwdWJsaWMgdXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlIZWxwZXJTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyBhZGQgcHXDsiBmdW56aW9uYXJlIGFuY2hlIGNvbWUgbW9kaWZpY2EgZSBjb21lIHByZXZpZXdcclxuICAgIC8vIGluIGFkZCBhYmJpYW1vIGluIGlucHV0IGwnSUQgZGVsIEZvcm1cclxuICAgIC8vIGluIG1vZGlmaWNhIGFiYmlhbW8gaW4gaW5wdXQgbCdJRCBkZWwgUmVjb3JkXHJcbiAgICAvLyBpbiBwcmV2aWV3IGFiYmlhbW8gaW4gaW5wdXQgaWwgRm9ybShjYXNvIGNvbmZpZ3VyYXRvcikgbyBsJ0lEIGRlbCBtb2R1bG8gb24gb25seVZpZXcgaW1wb3N0YXRvIGEgdHJ1ZVxyXG4gICAgdGhpcy5zaG93VGl0bGUgPSB0aGlzLmNvbmZpZ3VyYXRpb25zLnNob3dUaXRsZTtcclxuICAgIHRoaXMuc2hvd1NhdmVCdXR0b24gPSB0aGlzLmNvbmZpZ3VyYXRpb25zLnNob3dTYXZlQnV0dG9uO1xyXG4gICAgdGhpcy5zaG93QmFja0J1dHRvbiA9IHRoaXMuY29uZmlndXJhdGlvbnMuc2hvd0JhY2tCdXR0b247XHJcblxyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIkFkZEZvcm1SZWNvcmRcIilcclxuXHJcbiAgICBpZiAodGhpcy5yZWNvcmQgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNob3dUaXRsZSA9IHRydWU7XHJcbiAgICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJBZGRGb3JtUmVjb3JkIC0gbmV3XCIpXHJcbiAgICAgIHRoaXMucHJldmlld09yTmV3UmVzcG9uc2VSZWNvcmQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2hvd1RpdGxlID0gZmFsc2U7XHJcbiAgICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJBZGRGb3JtUmVjb3JkIC0gZWRpdFwiLCB0aGlzLnJlY29yZClcclxuICAgICAgdGhpcy5lZGl0UmVzcG9uc2VSZWNvcmQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBsJ2luaXppYWxpenphemlvbmUgdGVybWluYSBjb24gaWwgcmVjdXBlcm8gZGVsIHJlY29yZCBvIGNvbiBsJ2luaXppYWxpenphemlvbmUgZGVsIGZvcm0gdnVvdG9cclxuXHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdvbmluaXQgLSBEeW5hRm9ybScsIHRoaXMuZm9ybSlcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBvblJlY29yZENoYW5nZVxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBpbnZvY2F0byBhbCBjYW1iaW8gZGVsIHZhbG9yZSBkaSBvZ25pIHByb3ByaWV0w6AgZGVsbCdvZ2dldHRvIHJlY29yZC5cclxuICAgKiBTZXJ2ZSBhZCBhZ2dpb3JuYXJlIGlsIHZhbG9yZSBkaSB0dXR0aSBpIGNhbXBpIGNoZSBoYW5ubyB1bmEgZm9ybXVsYS5cclxuICAgKi9cclxuICBvblJlY29yZENoYW5nZSgpIHtcclxuICAgIGlmICh0aGlzLmZpZWxkVGVtcGxhdGUgJiYgdGhpcy5maWVsZFRlbXBsYXRlLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5maWVsZFRlbXBsYXRlLmZvckVhY2goKGYpID0+IGYudXBkYXRlRmllbGQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBvblJlY29yZENoYW5nZVxyXG5cclxuICAvLyNyZWdpb24gcHJldmlld09yTmV3UmVzcG9uc2VSZWNvcmRcclxuICBwcmV2aWV3T3JOZXdSZXNwb25zZVJlY29yZCgpIHtcclxuICAgIHRoaXMucmVjb3JkID0gbmV3IFJlY29yZCgpO1xyXG4gICAgLy8gYWdnaXVnbmkgbnVvdm9cclxuICAgIGlmICh0aGlzLmZvcm0gIT0gbnVsbCkge1xyXG4gICAgICAvLyBwcmV2aWV3IHBlciBpbCBjb25maWd1cmF0b3JcclxuICAgICAgdGhpcy5maWVsZHNDb25maWcoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtSUQgIT0gbnVsbCkge1xyXG4gICAgICAvLyBwcmV2aWV3IHBlciBhZG1pblxyXG4gICAgICB0aGlzLmdldEZvcm1CeUlEKCk7IC8vIGRlbnRybyBjaGlhbWEgZmllbGRzQ29uZmlnXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBwcmV2aWV3T3JOZXdSZXNwb25zZVJlY29yZFxyXG5cclxuICAvLyNyZWdpb24gZWRpdFJlc3BvbnNlUmVjb3JkXHJcbiAgZWRpdFJlc3BvbnNlUmVjb3JkKCkge1xyXG4gICAgXHJcbiAgICAvLyBtb2RpaWx0w6AgbW9kaWZpY2FcclxuICAgIGlmICh0eXBlb2YgdGhpcy5yZWNvcmQgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgLy8gYWxsb3JhIMOoIHVuIElEXHJcbiAgICAgIHRoaXMuZ2V0UmVjb3JkQnlJRCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gaWwgcmVjb3JkIHZpZW5lIHBhc3NhdG8gY29tZSB0YWxlXHJcbiAgICAgIC8vICg8UmVjb3JkPnRoaXMucmVjb3JkKS5FbnRJRCA9IFwiM1wiO1xyXG4gICAgICAvLyAoPFJlY29yZD50aGlzLnJlY29yZCkuVmVyc2lvbjtcclxuICAgICAgdGhpcy5nZXRGb3JtQnlJRGFuZFZlcnNpb24odHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBlZGl0UmVzcG9uc2VSZWNvcmRcclxuXHJcbiAgLy8jcmVnaW9uIHNhdmVPckV4aXRGb3JtXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBzYWx2YXJlIGkgZGF0aSBpbnNlcml0aSBkYWxsJ3V0ZW50ZSB1bmEgdm9sdGEgY29uY2x1c2EgbGEgY29tcGlsYXppb25lIGRlbGxhIGZvcm0uXHJcbiAgICovXHJcbiAgc2F2ZU9yRXhpdEZvcm0oZXhpdDogYm9vbGVhbikge1xyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnYWRkLWZvcm0tcmVjb3JkIHNhdmVSZWNvcmRFdmVudCcpXHJcbiAgICBpZiAoZXhpdCkge1xyXG4gICAgICAvLyB0aGlzLnNhdmVSZWNvcmRFdmVudC5lbWl0KG51bGwpO1xyXG4gICAgICB0aGlzLm9uU2F2ZVJlY29yZChudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHRoaXMuc2F2ZVJlY29yZEV2ZW50LmVtaXQodGhpcy5yZWNvcmQpO1xyXG4gICAgICB0aGlzLmlzU2F2aW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5vblNhdmVSZWNvcmQoKDxSZWNvcmQ+dGhpcy5yZWNvcmQpKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIHNhdmVPckV4aXRGb3JtXHJcblxyXG4gIC8vI3JlZ2lvbiBvblNhdmVSZWNvcmRcclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHNhbHZhcmUgaWwgcmVjb3JkIGFnZ2l1bnRvIG8gbW9kaWZpY2F0by5cclxuICAgKiBTZSDDqCBzdGF0byBjb25maWd1cmF0byB1biBlbmRQb2ludCBwZXIgaWwgc2FsdmF0YWdnaW8gdmllbmUgZWZmZXR0dWF0YSB1bmEgY2hpYW1hdGEgYWwgc2VydmVyIHBhc3NhbmRvIGwnb2dnZXRvIGRhIHNhbHZhcmVcclxuICAgKiBuZWwgYm9keSBkZWxsYSBjaGlhbWF0YSwgYWx0cmltZW50aSBzY2F0ZW5hIGwnZXZlbnRvIFwic2F2ZVJlY29yZFwiLlxyXG4gICAqIEBwYXJhbSBldmVudCBPZ2dldHRvIGRpIHRpcG8gUmVjb3JkIGRhIHNhbHZhcmUuXHJcbiAgICovXHJcbiAgYXN5bmMgb25TYXZlUmVjb3JkKGV2ZW50OiBSZWNvcmQpIHtcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coJ29uU2F2ZVJlY29yZCAtIGV2ZW50JywgZXZlbnQpXHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdvblNhdmVSZWNvcmQgLSBmb3JtJywgdGhpcy5mb3JtKVxyXG4gICAgaWYgKFxyXG4gICAgICBldmVudCAhPSBudWxsICYmXHJcbiAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3Jkcy5TYXZlRW5kUG9pbnRcclxuICAgICkge1xyXG4gICAgICB2YXIgZHluUmVjOiBEeW5SZWNvcmQgPSBuZXcgRHluUmVjb3JkKCk7XHJcbiAgICAgIGR5blJlYy5JRCA9IGV2ZW50LklEID8/IG51bGw7XHJcbiAgICAgIGR5blJlYy5FbnRJRCA9IHRoaXMuZm9ybS5JRDtcclxuICAgICAgZHluUmVjLlZlcnNpb24gPSB0aGlzLmZvcm0uVmVyc2lvbjtcclxuICAgICAgZHluUmVjLnVzZXJJRCA9IHRoaXMudXNlcklEO1xyXG4gICAgICBkeW5SZWMuVmFsdWVzID0gZXZlbnQgPz8gbnVsbDtcclxuICAgICAgZHluUmVjLkhUTUxyZWFkYWJsZVZhbHVlcyA9IGF3YWl0IHRoaXMuY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzKGV2ZW50KTtcclxuXHJcbiAgICAgIGlmIChldmVudC5GS19JbnNlcnRVc2VyID09IG51bGwpe1xyXG4gICAgICAgIC8vIE51b3ZvIFJlY29yZFxyXG4gICAgICAgIGR5blJlYy5GS19JbnNlcnRVc2VyID0gdGhpcy51c2VySUQ7XHJcbiAgICAgICAgZHluUmVjLkluc2VydERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGR5blJlYy5GS19VcGRhdGVVc2VyID0gdGhpcy51c2VySUQ7XHJcbiAgICAgICAgZHluUmVjLlVwZGF0ZURhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIE1vZGlmaWNhIGRlbCBSZWNvcmRcclxuICAgICAgICBkeW5SZWMuRktfSW5zZXJ0VXNlciA9IGV2ZW50LkZLX0luc2VydFVzZXJcclxuICAgICAgICBkeW5SZWMuSW5zZXJ0RGF0ZSA9IGV2ZW50Lkluc2VydERhdGU7XHJcbiAgICAgICAgZHluUmVjLkZLX1VwZGF0ZVVzZXIgPSB0aGlzLnVzZXJJRDtcclxuICAgICAgICBkeW5SZWMuVXBkYXRlRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBhZGRpdGlvbmFsUGFyYW1zID0gdGhpcy5jb25maWd1cmF0aW9ucy5hZGRpdGlvbmFsUGFyYW1zID09IG51bGwgPyBldmVudC5BZGRpdGlvbmFsUGFyYW1zIDogdGhpcy5jb25maWd1cmF0aW9ucy5hZGRpdGlvbmFsUGFyYW1zO1xyXG4gICAgICBkeW5SZWMuQWRkaXRpb25hbFBhcmFtcyA9IEpTT04uc3RyaW5naWZ5KGFkZGl0aW9uYWxQYXJhbXMpO1xyXG5cclxuICAgICAgLy8gdmFyIGFkZGl0aW9uYWxJbmZvID0gdGhpcy5hZGRpdGlvbmFsSW5mbyA9PSBudWxsID8gZXZlbnQuQWRkaXRpb25hbEluZm8gOiB0aGlzLmFkZGl0aW9uYWxJbmZvO1xyXG4gICAgICB2YXIgYWRkaXRpb25hbEluZm8gPSBldmVudC5BZGRpdGlvbmFsSW5mbyA9PSBudWxsID8gdGhpcy5jb25maWd1cmF0aW9ucy5hZGRpdGlvbmFsSW5mbyA6IGV2ZW50LkFkZGl0aW9uYWxJbmZvO1xyXG4gICAgICBkeW5SZWMuQWRkaXRpb25hbEluZm8gPSBKU09OLnN0cmluZ2lmeShhZGRpdGlvbmFsSW5mbyk7XHJcblxyXG4gICAgICB2YXIgZHluYW1pY01vZHVsZVBhcmFtcyA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBQYXJhbU5hbWU6IFwiUmVjb3JkXCIsXHJcbiAgICAgICAgICBQYXJhbVZhbHVlOiBkeW5SZWMsXHJcbiAgICAgICAgICBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJJbiBCb2R5XCJdLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF07XHJcblxyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnb25TYXZlUmVjb3JkIC0gZHluYW1pY01vZHVsZVBhcmFtcycsIGR5bmFtaWNNb2R1bGVQYXJhbXMpXHJcbiAgICAgIHRoaXMudXRpbGl0eVNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMuU2F2ZUVuZFBvaW50LFxyXG4gICAgICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMsXHJcbiAgICAgICAgKHJlcykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jaGVja1RyaWdnZXJzKGV2ZW50KTtcclxuICAgICAgICAgIHRoaXMuYWZ0ZXJTYXZlUmVjb3JkRXZlbnQuZW1pdChldmVudCk7XHJcbiAgICAgICAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zYXZlUmVjb3JkRXZlbnQuZW1pdChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBvblNhdmVSZWNvcmRcclxuXHJcbiAgLy8jcmVnaW9uIGdldEZvcm1CeUlEXHJcbiAgZ2V0Rm9ybUJ5SUQoaWQ6IHN0cmluZyA9IHRoaXMuZm9ybUlEKSB7XHJcbiAgICBjb25zdCBkeW5hbWljTW9kdWxlUGFyYW1zOiBBcnJheTxFbmRQb2ludERhdGFQYXJhbXM+ID1cclxuICAgICAgbmV3IEFycmF5PEVuZFBvaW50RGF0YVBhcmFtcz4oKTtcclxuICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMucHVzaCh7XHJcbiAgICAgIFBhcmFtTmFtZTogXCJpZFwiLFxyXG4gICAgICBQYXJhbVZhbHVlOiBpZCxcclxuICAgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5Gb3Jtcy5HZXRCeUlERW5kUG9pbnQsXHJcbiAgICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMsXHJcbiAgICAgIChyZXM6IEZvcm0pID0+IHtcclxuICAgICAgICB0aGlzLmZvcm0gPSByZXM7XHJcbiAgICAgICAgdGhpcy5mb3JtLk9yZ2FJRCA9IHRoaXMub3JnYUlEO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5mb3JtLk9iamVjdFRyaWdnZXJzICE9IG51bGwgJiYgdGhpcy5mb3JtLk9iamVjdFRyaWdnZXJzICE9IFwiXCIpe1xyXG4gICAgICAgICAgdGhpcy5mb3JtLlRyaWdnZXJzID0gSlNPTi5wYXJzZSh0aGlzLmZvcm0uT2JqZWN0VHJpZ2dlcnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uVHJpZ2dlcnMgPSBuZXcgQXJyYXk8VHJpZ2dlcj4oKTtcclxuICAgICAgICB9ICAgICAgICBcclxuXHJcbiAgICAgICAgdGhpcy5zZXREYXRhR2V0dGVyKHRoaXMuZm9ybSk7XHJcbiAgICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnZ2V0Rm9ybUJ5SUQgLSBEeW5hRm9ybScsIHRoaXMuZm9ybSlcclxuICAgICAgICB0aGlzLmZpZWxkc0NvbmZpZygpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyKSA9PiB7IH1cclxuICAgICk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBnZXRGb3JtQnlJRFxyXG5cclxuICAvLyNyZWdpb24gZ2V0UmVjb3JkQnlJRFxyXG4gIC8vIGNpIGVudHJvIHNvbG8gc2Ugw6ggc3RhdG8gcGFzc2F0byBpbCBwYXJhbWV0cm8gXCJyZWNvcmRcIiBjb21lIHN0cmluZ2FcclxuICBnZXRSZWNvcmRCeUlEKCkge1xyXG5cclxuICAgIC8vIHByZXBhcm8gaSBkYXRpIGRlbCByZWNvcmRcclxuICAgIHZhciBkeW5hbWljUmVjb3JkUGFyYW1zID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgUGFyYW1OYW1lOiBcImlkXCIsXHJcbiAgICAgICAgUGFyYW1WYWx1ZTogdGhpcy5yZWNvcmQsXHJcbiAgICAgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0sXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5SdW5FbmRQb2ludENhbGwoXHJcbiAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMuR2V0QnlJREVuZFBvaW50LFxyXG4gICAgICBkeW5hbWljUmVjb3JkUGFyYW1zLFxyXG4gICAgICAocmVzOiBEeW5SZWNvcmQpID0+IHtcclxuICAgICAgICB0aGlzLnJlY29yZCA9IG5ldyBSZWNvcmQoKTtcclxuXHJcbiAgICAgICAgKDxSZWNvcmQ+dGhpcy5yZWNvcmQpID0gSlNPTi5wYXJzZShyZXMuU2VyaWFsaXplZFZhbHVlcyk7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQuSUQgPSB0aGlzLmlzRHVwbGljYXRlID8gXCJcIiA6IHJlcy5JRDtcclxuICAgICAgICB0aGlzLnJlY29yZC5FbnRJRCA9IHJlcy5FbnRJRDtcclxuICAgICAgICB0aGlzLnJlY29yZC51c2VySUQgPSByZXMudXNlcklEO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLlZlcnNpb24gPSByZXMuVmVyc2lvbjtcclxuICAgICAgICB0aGlzLnJlY29yZC5WYWx1ZXMgPSBKU09OLnBhcnNlKHJlcy5TZXJpYWxpemVkVmFsdWVzKTtcclxuICAgICAgICB0aGlzLnJlY29yZC5GS19JbnNlcnRVc2VyID0gcmVzLkZLX0luc2VydFVzZXI7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQuRktfVXBkYXRlVXNlciA9IHJlcy5GS19VcGRhdGVVc2VyO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLkluc2VydERhdGUgPSByZXMuSW5zZXJ0RGF0ZTtcclxuICAgICAgICB0aGlzLnJlY29yZC5VcGRhdGVEYXRlID0gcmVzLlVwZGF0ZURhdGU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gdGhpcy52aWV3TW9kZSA9IER5bmFtaWNNb2R1bGVWaWV3TW9kZUVudW0uQ09NUElMRTtcclxuICAgICAgICAvLyB0aGlzLmxvYWRlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5nZXRGb3JtQnlJRGFuZFZlcnNpb24oKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGdldFJlY29yZEJ5SURcclxuXHJcbiAgLy8jcmVnaW9uIGdldEZvcm1CeUlEYW5kVmVyc2lvblxyXG4gIGdldEZvcm1CeUlEYW5kVmVyc2lvbihnZXRBdHRhY2htZW50czogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAvLyBwcmVwYXJvIGxhIHZlcnNpb25lIGNvcnJldHRhIGRlbCBmb3JtXHJcbiAgICB2YXIgZHluYW1pY01vZHVsZVBhcmFtcyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIFBhcmFtTmFtZTogXCJFbnRJRFwiLFxyXG4gICAgICAgIFBhcmFtVmFsdWU6ICg8UmVjb3JkPnRoaXMucmVjb3JkKS5FbnRJRCxcclxuICAgICAgICBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJRdWVyeSBwYXJhbVwiXSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIFBhcmFtTmFtZTogXCJWZXJzaW9uXCIsXHJcbiAgICAgICAgUGFyYW1WYWx1ZTogKDxSZWNvcmQ+dGhpcy5yZWNvcmQpLlZlcnNpb24sXHJcbiAgICAgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0sXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImdldEZvcm1CeUlEYW5kVmVyc2lvbiAtIHRoaXMgcmVjb3JkXCIsIDxSZWNvcmQ+dGhpcy5yZWNvcmQpXHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLlJ1bkVuZFBvaW50Q2FsbChcclxuICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uRm9ybXMuR2V0QnlJREFuZFZlcnNpb25FbmRQb2ludCxcclxuICAgICAgZHluYW1pY01vZHVsZVBhcmFtcyxcclxuICAgICAgKHJlczogRm9ybSkgPT4ge1xyXG4gICAgICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJBRlRFUiBnZXRGb3JtQnlJRGFuZFZlcnNpb24gLSB0aGlzLmZvcm1cIiwgcmVzKVxyXG4gICAgICAgIHRoaXMuZm9ybSA9IHJlcztcclxuICAgICAgICB0aGlzLmZvcm0uT3JnYUlEID0gdGhpcy5vcmdhSUQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZvcm0uT2JqZWN0VHJpZ2dlcnMgIT0gbnVsbCAmJiB0aGlzLmZvcm0uT2JqZWN0VHJpZ2dlcnMgIT0gXCJcIil7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uVHJpZ2dlcnMgPSBKU09OLnBhcnNlKHRoaXMuZm9ybS5PYmplY3RUcmlnZ2Vycyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZm9ybS5UcmlnZ2VycyA9IG5ldyBBcnJheTxUcmlnZ2VyPigpO1xyXG4gICAgICAgIH0gICAgICAgIFxyXG5cclxuICAgICAgICB0aGlzLnNldERhdGFHZXR0ZXIodGhpcy5mb3JtKTtcclxuXHJcbiAgICAgICAgdGhpcy5jcmVhdGVSZWNvcmRQcm9wZXJ0aWVzKCk7XHJcbiAgICAgICAgdGhpcy5yZW9yZGVyRm9ybUZpZWxkcygpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybUdyb3VwKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybS5Gb3JtU2NhbGFyVHlwZSAhPSBGb3JtU2NhbGFyVHlwZUVudW0uU2VtcGxpY2UpIHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlRmllbGRHcm91cHMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghZ2V0QXR0YWNobWVudHMpe1xyXG4gICAgICAgICAgdGhpcy5sb2FkZXIgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5mb3JtbG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5nZXRBbGxSZWNvcmRBdHRhY2htZW50cygoPFJlY29yZD50aGlzLnJlY29yZCkuSUQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGdldEZvcm1CeUlEYW5kVmVyc2lvblxyXG5cclxuICAvLyNyZWdpb24gZ2V0QWxsUmVjb3JkQXR0YWNobWVudHNcclxuICBnZXRBbGxSZWNvcmRBdHRhY2htZW50cyhyZWNvcmRJRDogc3RyaW5nKXtcclxuXHJcbiAgICB2YXIgZHluYW1pY01vZHVsZVBhcmFtcyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIFBhcmFtTmFtZTogXCJhbnN3ZXJJZFwiLFxyXG4gICAgICAgIFBhcmFtVmFsdWU6IHJlY29yZElELFxyXG4gICAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdLFxyXG4gICAgICB9XHJcbiAgICBdO1xyXG5cclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzLkdldEFsbEF0dGFjaG1lbnRzRW5kUG9pbnQsXHJcbiAgICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMsXHJcbiAgICAgIChyZXM6IEFycmF5PER5bkF0dGFjaG1lbnQ+KSA9PiB7XHJcbiAgICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIkdldEFsbEF0dGFjaG1lbnRzRW5kUG9pbnQoKVwiLCByZXMpO1xyXG5cclxuICAgICAgICB0aGlzLmZvcm0uRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5GaWVsZFR5cGUgPT0gRmllbGRUeXBlRW51bS5JbW1hZ2luZSB8fCBmaWVsZC5GaWVsZFR5cGUgPT0gRmllbGRUeXBlRW51bVsnSW1tYWdpbmUgY29uIG1hcmtlcnMnXSl7XHJcbiAgICAgICAgICAgICAgdmFyIGF0dGFjaElkID0gdGhpcy5yZWNvcmRbZmllbGQuTmFtZV07XHJcbiAgICAgICAgICAgICAgdGhpcy5yZWNvcmRbZmllbGQuTmFtZV0gPSByZXMuZmluZCh4ID0+IHguSUQgPT0gYXR0YWNoSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGVyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmZvcm1sb2FkZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGdldEFsbFJlY29yZEF0dGFjaG1lbnRzXHJcblxyXG4gIC8vI3JlZ2lvbiBmaWVsZHNDb25maWdcclxuICBmaWVsZHNDb25maWcoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZVJlY29yZFByb3BlcnRpZXMoKTtcclxuICAgIHRoaXMucmVvcmRlckZvcm1GaWVsZHMoKTtcclxuICAgIHRoaXMuY3JlYXRlRm9ybUdyb3VwKCk7XHJcbiAgICBpZiAodGhpcy5mb3JtLkZvcm1TY2FsYXJUeXBlICE9IEZvcm1TY2FsYXJUeXBlRW51bS5TZW1wbGljZSkge1xyXG4gICAgICB0aGlzLmNyZWF0ZUZpZWxkR3JvdXBzKCk7XHJcbiAgICB9XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiZmllbGRzQ29uZmlnIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gICAgdGhpcy5sb2FkZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5mb3JtbG9hZGVkID0gdHJ1ZTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGZpZWxkc0NvbmZpZ1xyXG5cclxuICAvLyNyZWdpb24gY3JlYXRlUmVjb3JkUHJvcGVydGllc1xyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY3JlYXJlIG5lbGwnb2dnZXR0byBSZWNvcmQgbGUgcHJvcHJpZXTDoCBtYW5jYW50aSByaXNwZXR0byBhaSBjYW1waSBjaGUgY29tcG9uZ29ubyBsYSBmb3JtLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlUmVjb3JkUHJvcGVydGllcygpIHtcclxuICAgIGNvbnN0IHJlY29yZFByb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBPYmplY3Qua2V5cyh0aGlzLnJlY29yZCk7XHJcbiAgICB0aGlzLmZvcm0uRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgIGlmICghcmVjb3JkUHJvcGVydGllcy5maW5kKChwKSA9PiBwID09PSBmaWVsZC5OYW1lKSkge1xyXG4gICAgICAgIHRoaXMucmVjb3JkW2ZpZWxkLk5hbWVdID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5mb3JtLklubmVyRm9ybXMgJiYgdGhpcy5mb3JtLklubmVyRm9ybXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmZvcm0uSW5uZXJGb3Jtcy5mb3JFYWNoKChmb3JtKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXJyYXlOYW1lOiBzdHJpbmcgPSBmb3JtLk5hbWUuc3BsaXQoXCIgXCIpLmpvaW4oXCJfXCIpO1xyXG4gICAgICAgIGlmICghcmVjb3JkUHJvcGVydGllcy5maW5kKChwKSA9PiBwID09PSBhcnJheU5hbWUpKSB7XHJcbiAgICAgICAgICB0aGlzLnJlY29yZFthcnJheU5hbWVdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJjcmVhdGVSZWNvcmRQcm9wZXJ0aWVzIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImNyZWF0ZVJlY29yZFByb3BlcnRpZXMgLSByZWNvcmRcIiwgdGhpcy5yZWNvcmQpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gY3JlYXRlUmVjb3JkUHJvcGVydGllc1xyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHJpb3JkaW5hcmUgaSBjYW1waSBjaGUgY29tcG9uZ29ubyBsYSBmb3JtLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVvcmRlckZvcm1GaWVsZHMoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtLkZpZWxkcyAmJiB0aGlzLmZvcm0uRmllbGRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5mb3JtLkZpZWxkcy5zb3J0KChhLCBiKSA9PlxyXG4gICAgICAgIGEuT3JkaW5hbFBvc2l0aW9uID4gYi5PcmRpbmFsUG9zaXRpb24gPyAxIDogYi5PcmRpbmFsUG9zaXRpb24gPiBhLk9yZGluYWxQb3NpdGlvbiA/IC0xIDogMCk7XHJcbiAgICB9XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwicmVvcmRlckZvcm1GaWVsZHMgLSBmb3JtXCIsIHRoaXMuZm9ybSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNyZWFyZSBpbCBGb3JtR3JvdXAgY2hlIHJhcHByZXNlbnRhIGxhIGZvcm0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtR3JvdXAoKSB7XHJcbiAgICB0aGlzLmZvcm1Gb3JtID0gdGhpcy51dGlsaXR5U2VydmljZS5DcmVhdGVGb3JtRm9ybUdyb3VwKFxyXG4gICAgICB0aGlzLmZvcm0uRmllbGRzLFxyXG4gICAgICAoPFJlY29yZD50aGlzLnJlY29yZCksXHJcbiAgICAgIHRoaXMub25seVZpZXdcclxuICAgICk7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiY3JlYXRlRm9ybUdyb3VwIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgaSBncnVwcGkgaW4gY3VpIHJhZ2dydXBwYXJlIGkgY2FtcGkgZGVsbGEgZm9ybSBpbiBiYXNlXHJcbiAgICogYSBjb21lIMOoIHN0YXRhIGNvbmZpZ3VyYXRhIGRhbGwndXRlbnRlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlRmllbGRHcm91cHMoKSB7XHJcbiAgICB0aGlzLmZvcm0uRm9ybUZpZWxkc0dyb3Vwcy5zb3J0KChhLCBiKSA9PiBhLk9yZGluYWxQb3NpdGlvbiA+IGIuT3JkaW5hbFBvc2l0aW9uID8gMSA6IGIuT3JkaW5hbFBvc2l0aW9uID4gYS5PcmRpbmFsUG9zaXRpb24gPyAtMSA6IDApXHJcbiAgICAgIC5tYXAoKGcpID0+IGcuTmFtZSlcclxuICAgICAgLmZvckVhY2goKGdyb3VwTmFtZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmllbGRHcm91cHNbZ3JvdXBOYW1lXSA9IHRoaXMuZm9ybS5GaWVsZHMuZmlsdGVyKFxyXG4gICAgICAgICAgKGYpID0+IGYuRmllbGRHcm91cCA9PSBncm91cE5hbWVcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImNyZWF0ZUZpZWxkR3JvdXBzIC0gZm9ybVwiLCB0aGlzLmZvcm0pO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgLy8jcmVnaW9uIGNyZWF0ZUhUTUxyZWFkYWJsZVZhbHVlc1xyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY3JlYXJlIGlsIEZvcm1Hcm91cCBjaGUgcmFwcHJlc2VudGEgbGEgZm9ybS5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUhUTUxyZWFkYWJsZVZhbHVlcyhyZWNvcmQ6IFJlY29yZCkge1xyXG5cclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJjcmVhdGVIVE1McmVhZGFibGVWYWx1ZXMgLSByZWNvcmRcIiwgcmVjb3JkKTtcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJjcmVhdGVIVE1McmVhZGFibGVWYWx1ZXMgLSBmb3JtXCIsIHRoaXMuZm9ybSk7XHJcblxyXG4gICAgdmFyIGZvcm1uYW1lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICB0aGlzLmZvcm0uRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7Zm9ybW5hbWVzLnB1c2goZmllbGQuTmFtZSk7fSk7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzIC0gZm9ybSBmaWVsZHMgbmFtZXNcIiwgZm9ybW5hbWVzKTtcclxuXHJcbiAgICAvLyBhbGVydChcImNvbnRpbnVlIGZvciB2YWx1ZXM/XCIpXHJcblxyXG4gICAgbGV0IG91dHB1dFZhbHVlc0FycmF5ID0gYXdhaXQgdGhpcy5nZXRSZXNwb25zZVZhbHVlcyhyZWNvcmQsIHRoaXMuZm9ybSk7XHJcbiAgICBcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJjcmVhdGVIVE1McmVhZGFibGVWYWx1ZXMgLSBvdXRwdXRWYWx1ZXNBcnJheVwiLCBvdXRwdXRWYWx1ZXNBcnJheSk7XHJcblxyXG4gICAgLy8gYWxlcnQoXCJjb250aW51ZSBmb3IgdGVtcGxhdGVzP1wiKVxyXG4gICAgbGV0IHRlbXBsYXRlOiBzdHJpbmcgPSB0aGlzLmdldFJlc3BvbnNlVGVtcGxhdGUocmVjb3JkLCB0aGlzLmZvcm0pOyAvLyBvZ2dldHRvIG5lbCBxdWFsZSB2aWVuZSBjb3N0cnVpdG8gaWwgdGVtcGxhdGUgbyBjaGUgcHJlbmRlIGlsIHZhbG9yZSBkYSB1biB0ZW1wbGF0ZSBlc3Rlcm5vXHJcbiAgICBcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJjcmVhdGVIVE1McmVhZGFibGVWYWx1ZXMgLSB0ZW1wbGF0ZVwiLCB0ZW1wbGF0ZSk7XHJcbiAgICAvLyBhbGVydChcImNvbnRpbnVlIGZvciBvdXRwdXQ/XCIpXHJcbiAgICBjb25zdCByZWdleCA9IC8jIyhbXFx3XSspIyMvZztcclxuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucmVwbGFjZVRlbXBsYXRlUGxhY2Vob2xkZXJzV2l0aFZhbHVlcyh0ZW1wbGF0ZSwgb3V0cHV0VmFsdWVzQXJyYXksIHJlZ2V4KVxyXG5cclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJjcmVhdGVIVE1McmVhZGFibGVWYWx1ZXMgLSBvdXRwdXRcIiwgb3V0cHV0KTtcclxuICAgIC8vIGFsZXJ0KFwiY29udGludWUgZm9yIGVuZGluZz9cIilcclxuICAgIHJldHVybiBvdXRwdXQ7IC8vIG9nZ2V0dG8gY2hlIGNvbnRlcnLDoCBsJ291dHB1dCBlbGFib3JhdG8gICAgXHJcblxyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gY3JlYXRlSFRNTHJlYWRhYmxlVmFsdWVzXHJcblxyXG4gIC8vI3JlZ2lvbiBnZXRSZXNwb25zZVZhbHVlc1xyXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVzcG9uc2VWYWx1ZXMocmVjb3JkOiBSZWNvcmQsIGZvcm06IEZvcm0pIHtcclxuICAgIGxldCBvdXRwdXRWYWx1ZXNBcnJheTogQXJyYXk8YW55PiA9IFtdOyAvLyBhcnJheSBjb24gaSB2YWxvcmkgZGVsbGUgcmlzcG9zdGVcclxuICAgIC8vKDxEeW5SZWNvcmQ+dGhpcy5yZWNvcmQpLlZhbHVlcyDDqCBsYSBsaXN0YSBkaSBvZ2dldHRpIHtmaWVsZE5hbWU6IHZhbG9yZX1cclxuICAgIC8vIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCIocmVjb3JkKS5WYWx1ZXNcIiwgcmVjb3JkKTtcclxuXHJcbiAgICBmb3JtLkZpZWxkcy5mb3JFYWNoKFxyXG4gICAgICBhc3luYyAoZmllbGQpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiZ2V0UmVzcG9uc2VWYWx1ZXMgZmllbGRcIiwgZmllbGQpO1xyXG4gICAgICAgICAgLy8gbGV0IGZvdW5kT2JqZWN0ID0gcmVjb3JkLmZpbmQoXHJcbiAgICAgICAgICAvLyAgIChvYmopID0+IG9iaiA9PT0gZmllbGQuTmFtZVxyXG4gICAgICAgICAgLy8gKTtcclxuICAgICAgICAgIGxldCBmb3VuZE9iamVjdCA9IHJlY29yZFtmaWVsZC5OYW1lXTtcclxuXHJcbiAgICAgICAgICAvLyBmYXJlIHVuIGV2YWwgcGVyIHBvcG9sYXJlIGkgdmFsdWVQYWlycyBzZSDDqCBwcmVzZW50ZSB1bmEgZm9ybXVsYVxyXG4gICAgICAgICAgLy8gcHJlbmRlcmUgbGEgbGFiZWwgY29ycmV0dGFcclxuICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAvLyBQUkVQQVJPIElMIFZBTFVFUEFJUlNcclxuICAgICAgICAgIHN3aXRjaChmaWVsZC5GaWVsZFR5cGUpe1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJFbGVuY28gZ2VuZXJpY29cIl06eyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLkZvcm11bGEgIT0gbnVsbCAmJiBmaWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhZ2dpdW5nbyBhIHZhbHVlcGFpcnMgaSB2YWxvcmkgY2FsY29sYXRpXHJcbiAgICAgICAgICAgICAgICAvLyAoPExpc3RWYWx1ZUZpZWxkPmZvdW5kT2JqZWN0KS5WYWx1ZVBhaXJzID0gKDxMaXN0VmFsdWVGaWVsZD5mb3VuZE9iamVjdCkuVmFsdWVQYWlycyA/ICg8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnMgOiB7fTtcclxuICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuRXZhbHVhdGVGaWVsZEZvcm11bGEoXHJcbiAgICAgICAgICAgICAgICAgIGZpZWxkLkZvcm11bGEsXHJcbiAgICAgICAgICAgICAgICAgIHJlY29yZCxcclxuICAgICAgICAgICAgICAgICAgbnVsbFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleTIgaW4gdGVtcCkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoVXRpbGl0eUhlbHBlclNlcnZpY2UuaXNOdW1lcmljKHRlbXBba2V5Ml0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlyc1tOdW1iZXIoa2V5MildID0gdGVtcFtrZXkyXTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW2tleTJdID0gdGVtcFtrZXkyXTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW3JlY29yZFtmaWVsZC5OYW1lXV07XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICgoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzICE9IG51bGwgJiYgKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB2YSBiZW5lIGNvc8OsXHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICgoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVN0cmluZyAhPSBudWxsICYmICg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlU3RyaW5nICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIHZhIHByZXNhIGxhIHN0cmlnbmEgZSByaW1hcHBhdGEgbmVsIGRpYXJpb1xyXG4gICAgICAgICAgICAgICAgKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlycyA9IEdsb2JhbFNlcnZpY2Uuc3RyaW5nVG9WYWx1ZVBhaXJzKCg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLlZhbHVlU3RyaW5nKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxldCBpbnZlcnRlZCA9IHt9O1xyXG4gICAgICAgICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIig8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnNcIiwgKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlycyk7XHJcbiAgICAgICAgICAgICAgLy8gVmFsdWVQYWlyczoge1NpOiAnU2knLCBObzogJ05vJ31cclxuICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlycykge1xyXG4gICAgICAgICAgICAgICAgaW52ZXJ0ZWRbKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlyc1trZXldXSA9IGtleTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlycyA9IGludmVydGVkO1xyXG4gICAgICAgICAgICAgIGlmKHJlY29yZFtmaWVsZC5OYW1lXSAhPSBudWxsICYmICg8TGlzdFZhbHVlRmllbGQ+ZmllbGQpLklzTXVsdGlDaG9pY2hlKXtcclxuICAgICAgICAgICAgICAgIC8vIGNhc28gTVVMVElTQ0VMVEFcclxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICByZWNvcmRbZmllbGQuTmFtZV0uZm9yRWFjaCgoZWxlbWVudCwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArPSAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW2VsZW1lbnRdO1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArPSBpID09IHJlY29yZFtmaWVsZC5OYW1lXS5sZW5ndGggLTEgPyBcIlwiOiBcIiwgXCJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzW3JlY29yZFtmaWVsZC5OYW1lXV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJvdXRwdXRWYWx1ZXNBcnJheVwiLCBvdXRwdXRWYWx1ZXNBcnJheSlcclxuXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIG51bWVyaWNvXCJdOntcclxuICAgICAgICAgICAgICBpZigoPE51bWVyaWNGaWVsZD5maWVsZCkuSXNJbnRlZ2VyKXtcclxuICAgICAgICAgICAgICAgIGlmKCg8TnVtZXJpY0ZpZWxkPmZpZWxkKS5EZWNpbWFsU2VwYXJhdG9yID09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZC5OYW1lXSA9IHJlY29yZFtmaWVsZC5OYW1lXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlc0FycmF5W2ZpZWxkLk5hbWVdID0gcmVjb3JkW2ZpZWxkLk5hbWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZC5OYW1lXSA9IHJlY29yZFtmaWVsZC5OYW1lXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0ltbWFnaW5lJ106e1xyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIC8vIFJlY3VwZXJvIGlsIEJBU0U2NCBkZWxsJ2ltbWFnaW5lIFJlc2l6ZWQgdmlhIHByb21pc2UgY2xpZW50XHJcbiAgICAgICAgICAgICAgdmFyIHJlc2l6ZWRCYXNlNjQgPSBhd2FpdCB0aGlzLnJlc2l6ZUJhc2U2NEltYWdlKFwiZGF0YTppbWFnZS9cIityZWNvcmRbZmllbGQuTmFtZV0uRmlsZUV4dGVuc2lvbitcIjtiYXNlNjQsXCIgKyByZWNvcmRbZmllbGQuTmFtZV0uRmlsZURhdGFCYXNlNjQpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBBZ2dpdW5nbyBsJ0hUTUwgY29uIGlsIG51b3ZvIEJBU0U2NFxyXG4gICAgICAgICAgICAgIG91dHB1dFZhbHVlc0FycmF5W2ZpZWxkLk5hbWVdID0gXCI8aW1nIHNyYz0nXCIgKyByZXNpemVkQmFzZTY0K1wiJyBzdHlsZT0naGVpZ2h0OiBcIityZWNvcmRbZmllbGQuTmFtZV0uUmVzaXplZEltYWdlSGVpZ2h0UHgrXCJweCc+XCI7XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0ltbWFnaW5lIGNvbiBtYXJrZXJzJ106e1xyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIC8vIFJlY3VwZXJvIGlsIEJBU0U2NCBkZWxsJ2ltbWFnaW5lIFJlc2l6ZWQgdmlhIHByb21pc2UgY2xpZW50XHJcbiAgICAgICAgICAgICAgdmFyIHJlc2l6ZWRCYXNlNjQgPSBhd2FpdCB0aGlzLnJlc2l6ZUJhc2U2NEltYWdlKFwiZGF0YTppbWFnZS9cIityZWNvcmRbZmllbGQuTmFtZV0uRmlsZUV4dGVuc2lvbitcIjtiYXNlNjQsXCIgKyByZWNvcmRbZmllbGQuTmFtZV0uRmlsZURhdGFCYXNlNjQpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBBZ2dpdW5nbyBsJ0hUTUwgY29uIGlsIG51b3ZvIEJBU0U2NFxyXG4gICAgICAgICAgICAgIG91dHB1dFZhbHVlc0FycmF5W2ZpZWxkLk5hbWVdID0gXCI8aW1nIHNyYz0nXCIgKyByZXNpemVkQmFzZTY0K1wiJyBzdHlsZT0naGVpZ2h0OiBcIityZWNvcmRbZmllbGQuTmFtZV0uUmVzaXplZEltYWdlSGVpZ2h0UHgrXCJweCc+XCI7XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0VsZW5jbyBpbW1hZ2luaSddOntcclxuICAgICAgICAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZC5OYW1lXSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgaWYocmVjb3JkW2ZpZWxkLk5hbWVdICE9IG51bGwgJiYgKDxJbWFnZVNlbGVjdG9yRmllbGQ+ZmllbGQpLklzTXVsdGlDaG9pY2hlKXtcclxuICAgICAgICAgICAgICAgIHJlY29yZFtmaWVsZC5OYW1lXS5mb3JFYWNoKChpbWFnZW9iajogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHZhciBhdHRhY2htZW50SW5Gb3JtOiBEeW5BdHRhY2htZW50ID0gKDxJbWFnZVNlbGVjdG9yRmllbGQ+ZmllbGQpLkF0dGFjaG1lbnRMaXN0LmZpbmQoeCA9PiB4LklEID09IGltYWdlb2JqKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRJbkZvcm0gIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gKz0gYXR0YWNobWVudEluRm9ybS5CdXR0b25LZXkgKyBcIiwgXCI7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0uc3BsaXQoXCIsIFwiKTtcclxuICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlc0FycmF5W2ZpZWxkLk5hbWVdID0gcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSkuam9pbihcIiwgXCIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgdmFyIGF0dGFjaG1lbnRJbkZvcm06IER5bkF0dGFjaG1lbnQgPSAoPEltYWdlU2VsZWN0b3JGaWVsZD5maWVsZCkuQXR0YWNobWVudExpc3QuZmluZCh4ID0+IHguSUQgPT0gcmVjb3JkW2ZpZWxkLk5hbWVdKTtcclxuICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50SW5Gb3JtICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZC5OYW1lXSA9IGF0dGFjaG1lbnRJbkZvcm0uQnV0dG9uS2V5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9OyAgICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDp7XHJcbiAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0gPSByZWNvcmRbZmllbGQuTmFtZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApXHJcblxyXG4gICAgLy8gRnVuemlvbmEsIG1hIG5vbiDDqCBhZmZpZGFiaWxlIGFsIDEwMCVcclxuICAgIGF3YWl0IHRoaXMuZGVsYXkoMzAwMCk7XHJcblxyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIm91dHB1dFZhbHVlc0FycmF5IDFcIiwgb3V0cHV0VmFsdWVzQXJyYXkpO1xyXG4gICAgLy8gY2FuY2VsbG8gaSB2YWxvcmkgaW5kZWZpbml0aSBvIG51bGxpXHJcbiAgICBmb3IgKGNvbnN0IGNoaWF2ZSBpbiBvdXRwdXRWYWx1ZXNBcnJheSkge1xyXG4gICAgICBpZiAob3V0cHV0VmFsdWVzQXJyYXlbY2hpYXZlXSA9PSB1bmRlZmluZWQgfHwgb3V0cHV0VmFsdWVzQXJyYXlbY2hpYXZlXSA9PSBudWxsKVxyXG4gICAgICAgIG91dHB1dFZhbHVlc0FycmF5W2NoaWF2ZV0gPSAnJ1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dHB1dFZhbHVlc0FycmF5O1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gZ2V0UmVzcG9uc2VWYWx1ZXNcclxuXHJcbiAgLy8jcmVnaW9uIGdldFJlc3BvbnNlVGVtcGxhdGVcclxuICBwcml2YXRlIGdldFJlc3BvbnNlVGVtcGxhdGUocmVjb3JkOiBSZWNvcmQsIGZvcm06IEZvcm0pOiBzdHJpbmcge1xyXG4gICAgICBsZXQgdGVtcGxhdGU6IHN0cmluZyA9ICc8ZGl2IGNsYXNzPVwicm93XCI+JztcclxuICAgIC8vIFBSRVBBUk8gTyBQUkVORE8gTEEgU1RSVVRUVVJBIERBIFNUQU1QQVJFXHJcbiAgICBmb3JtLkZpZWxkcy5mb3JFYWNoKChiYXNlRmllbGQ6IEJhc2VGaWVsZCkgPT4ge1xyXG4gICAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdnZXRSZXNwb3NuZVRlbXBsYXRlIC0gcHJlIC0gZmllbGQnLCBiYXNlRmllbGQpXHJcbiAgICAgIGlmKGJhc2VGaWVsZC5BbnN3ZXJTdHlsZSA9PSBudWxsIHx8IGJhc2VGaWVsZC5BbnN3ZXJTdHlsZSA9PSB1bmRlZmluZWQpe1xyXG4gICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZSA9IG5ldyBBbnN3ZXJTdHlsZSgpO1xyXG4gICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Db2xTcGFuU2l6ZXMgPSBiYXNlRmllbGQuQ29sU3BhblNpemVzO1xyXG4gICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5GaWVsZHN0eWxlQ1NTID0gYmFzZUZpZWxkLkZpZWxkc3R5bGVDU1M7XHJcbiAgICAgICAgYmFzZUZpZWxkLkFuc3dlclN0eWxlLkxhYmVsc3R5bGVDU1MgPSBiYXNlRmllbGQuTGFiZWxzdHlsZUNTUztcclxuICAgICAgICBpZihiYXNlRmllbGQuVmlzaWJsZUlmKXtcclxuICAgICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Jbkxpc3RWaWV3ID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuRXZhbHVhdGVGaWVsZEZvcm11bGEoYmFzZUZpZWxkLlZpc2libGVJZiwgcmVjb3JkLCBudWxsKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Jbkxpc3RWaWV3ID0gYmFzZUZpZWxkLkluTGlzdFZpZXc7XHJcbiAgICAgICAgICBiYXNlRmllbGQuQW5zd2VyU3R5bGUuVmlzaWJsZUlmID0gYmFzZUZpZWxkLlZpc2libGVJZjtcclxuICAgICAgICB9XHJcbiAgICAgIH0gXHJcbiAgICAgIGlmKGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5WaXNpYmxlSWYpe1xyXG4gICAgICAgIGNvbnN0IHZpc2liaWxpdHkgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYShiYXNlRmllbGQuQW5zd2VyU3R5bGUuVmlzaWJsZUlmLCByZWNvcmQsIG51bGwpXHJcbiAgICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIkV2YWx1YXRlRmllbGRGb3JtdWxhIC0gdmlzaWJpbGl0eVwiLCB2aXNpYmlsaXR5KTtcclxuICAgICAgICBiYXNlRmllbGQuQW5zd2VyU3R5bGUuSW5MaXN0VmlldyA9ICh2aXNpYmlsaXR5ID09IHRydWUpID8gdHJ1ZSA6IGZhbHNlIDtcclxuICAgICAgfVxyXG4gICAgICBpZihiYXNlRmllbGQuQW5zd2VyU3R5bGUuSW5MaXN0Vmlldyl7XHJcbiAgICAgICAgdGVtcGxhdGUgKz0gJzxkaXYgY2xhc3M9XCInKyB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldEZpZWxkQW5zd2VyU3R5bGVDbGFzcyhiYXNlRmllbGQpICsnIGQtZmxleCBmbGV4LWNvbHVtbiBkeW5hZm9ybS1hbnN3ZXItZmllbGRcIj4gJytcclxuICAgICAgICAnIDxzcGFuIGNsYXNzPVwiZHluYWZvcm0tcXVlc3Rpb25cIiBzdHlsZT1cIicgKyBiYXNlRmllbGQuQW5zd2VyU3R5bGUuTGFiZWxzdHlsZUNTUyArICdcIj4nICsgYmFzZUZpZWxkLkRlc2NyaXB0aW9uICsgJzo8L3NwYW4+JyArIFxyXG4gICAgICAgICcgPHNwYW4gY2xhc3M9XCJkeW5hZm9ybS1yZXNwb25zZVwiIHN0eWxlPVwiJyArIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5GaWVsZHN0eWxlQ1NTICsgJ1wiPiAjIycgKyBiYXNlRmllbGQuTmFtZSArICcjIzwvc3Bhbj4nICsgXHJcbiAgICAgICAgJzwvZGl2PiBcXG4gJztcclxuICAgICAgfWVsc2UgaWYoIWJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5Jbkxpc3RWaWV3ICYmIGJhc2VGaWVsZC5BbnN3ZXJTdHlsZS5JbnZpc2liaWxpdHkgPT0gRmllbGRJbnZpc2liaWxpdHlFbnVtWydOQVNDT1NUTyBDT04gQVJFQSBWSVNJQklMRSddKXtcclxuICAgICAgICB0ZW1wbGF0ZSArPSAnPGRpdiBjbGFzcz1cIicrIHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0RmllbGRBbnN3ZXJTdHlsZUNsYXNzKGJhc2VGaWVsZCkgKycgZC1mbGV4IGZsZXgtY29sdW1uIGR5bmFmb3JtLWFuc3dlci1maWVsZFwiPiAnK1xyXG4gICAgICAgICc8L2Rpdj4gXFxuICc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coJ2dldFJlc3Bvc25lVGVtcGxhdGUgLSBwb3N0IC0gZmllbGQnLCBiYXNlRmllbGQpXHJcbiAgICB9KTtcclxuICAgIC8vIChhdHR1YWxtZW50ZSBub24gZXNpc3RlIGlsIGNvbmNldHRvIGRpIHRlbXBhdGUgZGkgb3V0cHV0KVxyXG4gICAgICB0ZW1wbGF0ZSArPSAnPC9kaXY+JztcclxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gZ2V0UmVzcG9uc2VUZW1wbGF0ZVxyXG5cclxuICBwcml2YXRlIHJlcGxhY2VUZW1wbGF0ZVBsYWNlaG9sZGVyc1dpdGhWYWx1ZXModGVtcGxhdGU6IHN0cmluZywgb3V0cHV0VmFsdWVzQXJyYXk6IEFycmF5PGFueT4sIHJlZ2V4KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKHJlZ2V4LCAobWF0Y2gsIGdyb3VwKSA9PiB7XHJcbiAgICAgIHJldHVybiA8c3RyaW5nPm91dHB1dFZhbHVlc0FycmF5W2dyb3VwXTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsYXkobXM6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKCByZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHJlc2l6ZUJhc2U2NEltYWdlIChiYXNlNjRJbWFnZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1nLnNyYyA9IGJhc2U2NEltYWdlO1xyXG4gICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuICAgICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IHdpZHRoIC8gaGVpZ2h0O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IG5ld0hlaWdodCA9IDEyODtcclxuICAgICAgICBjb25zdCBuZXdXaWR0aCA9IG5ld0hlaWdodCAqIGFzcGVjdFJhdGlvO1xyXG5cclxuICAgICAgICBjYW52YXMud2lkdGggPSBuZXdXaWR0aDtcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gbmV3SGVpZ2h0O1xyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcclxuICAgICAgICBsZXQgcXVhbGl0eSA9IDAuODtcclxuICAgICAgICBsZXQgZGF0YVVSTCA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCBxdWFsaXR5KTtcclxuICAgICAgICByZXNvbHZlKGRhdGFVUkwpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfSAgXHJcblxyXG4gIHNldERhdGFHZXR0ZXIoZm9ybSl7XHJcbiAgICBmb3JtLkZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG5cclxuICAgICAgLy8gVHJhc2Zvcm1vIGlsIEJhc2U2NFN0cmluZyBkZWwgRGF0YWdldHRlciBuZWwgRGF0YWdldHRlciB2ZXJvIGUgcHJvcHJpb1xyXG4gICAgICBpZiAoZmllbGQuRGF0YUdldHRlclZhbHVlQmFzZTY0U3RyaW5nICE9IG51bGwpe1xyXG4gICAgICAgIGZpZWxkLkRhdGFHZXR0ZXIgPSBKU09OLnBhcnNlKGF0b2IoZmllbGQuRGF0YUdldHRlclZhbHVlQmFzZTY0U3RyaW5nKSk7XHJcbiAgICAgICAgZmllbGQuRGF0YUdldHRlci5EYXRhR2V0dGVyVHlwZSA9IGZpZWxkLkRhdGFHZXR0ZXIuRGF0YUdldHRlclR5cGUgPT0gbnVsbCA/IERhdGFHZXR0ZXJUeXBlRW51bS5NYW51YWxlIDogZmllbGQuRGF0YUdldHRlci5EYXRhR2V0dGVyVHlwZTsgICBcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmaWVsZC5EYXRhR2V0dGVyID0gbmV3IERhdGFHZXR0ZXIoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZmllbGQuRGF0YUdldHRlclZhbHVlQmFzZTY0U3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICB9KTsgICAgICBcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBjaGVja1RyaWdnZXJzXHJcbiAgLy8gQ29udHJvbGxhIGUgc3BhcmEgaWwgdHJpZ2dlciBzZSBuZWNlc3NhcmlvXHJcbiAgY2hlY2tUcmlnZ2VycyhyZWNvcmQ6IFJlY29yZCl7XHJcbiAgICB2YXIgZmlyZVRyaWdnZXIgPSB0cnVlO1xyXG5cclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJjaGVja1RyaWdnZXJzIC0gaW5zaWRlIGNoZWNrVHJpZ2dlcnMoKVwiKTtcclxuXHJcbiAgICBpZiAodGhpcy5mb3JtLlRyaWdnZXJzICE9IG51bGwpe1xyXG4gICAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiY2hlY2tUcmlnZ2VycyAtIGhhdmUgdHJpZ2dlcnMgaW4gZm9ybVwiKTtcclxuICAgICAgdGhpcy5mb3JtLlRyaWdnZXJzLmZvckVhY2goKHRyaWdnZXIpID0+IHtcclxuICAgICAgICBmaXJlVHJpZ2dlciA9IHRydWU7XHJcbiAgICAgICAgdHJpZ2dlci5jb25kaXRpb25zLmZvckVhY2goKGNvbmRpdGlvbikgPT4ge1xyXG4gICAgICAgICAgaWYgKCFmaXJlVHJpZ2dlcikgeyByZXR1cm47IH1cclxuICAgICAgICAgIHZhciBsb2dpY09wZXJhdG9yOiBMb2dpY09wZXJhdG9yID0gY29uZGl0aW9uLmxvZ2ljb3BlcmF0b3IgYXMgTG9naWNPcGVyYXRvcjsgXHJcbiAgICAgICAgICB2YXIgY29uZGl0aW9uS2V5ID0gT2JqZWN0LmtleXMoY29uZGl0aW9uLnJlY29yZClbMF07XHJcbiAgICAgICAgICB2YXIgY29uZGl0aW9uVmFsdWUgPSBjb25kaXRpb24ucmVjb3JkW2NvbmRpdGlvbktleV07XHJcbiAgICAgICAgICB2YXIgcmVjb3JkVmFsdWUgPSByZWNvcmRbY29uZGl0aW9uS2V5XTtcclxuXHJcbiAgICAgICAgICBpZiAobG9naWNPcGVyYXRvciA9PSBMb2dpY09wZXJhdG9yWyc9J10gJiYgY29uZGl0aW9uVmFsdWUgIT0gcmVjb3JkVmFsdWUpe1xyXG4gICAgICAgICAgICBmaXJlVHJpZ2dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ1RyaWdnZXIodHJpZ2dlcixjb25kaXRpb24scmVjb3JkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChsb2dpY09wZXJhdG9yID09IExvZ2ljT3BlcmF0b3JbJyE9J10gJiYgY29uZGl0aW9uVmFsdWUgPT0gcmVjb3JkVmFsdWUpe1xyXG4gICAgICAgICAgICBmaXJlVHJpZ2dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ1RyaWdnZXIodHJpZ2dlcixjb25kaXRpb24scmVjb3JkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSAgICAgICAgXHJcblxyXG4gICAgICAgICAgaWYgKGxvZ2ljT3BlcmF0b3IgPT0gTG9naWNPcGVyYXRvclsnPCddICYmIGNvbmRpdGlvblZhbHVlIDw9IHJlY29yZFZhbHVlKXtcclxuICAgICAgICAgICAgZmlyZVRyaWdnZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5sb2dUcmlnZ2VyKHRyaWdnZXIsY29uZGl0aW9uLHJlY29yZCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobG9naWNPcGVyYXRvciA9PSBMb2dpY09wZXJhdG9yWyc8PSddICYmIGNvbmRpdGlvblZhbHVlIDwgcmVjb3JkVmFsdWUpe1xyXG4gICAgICAgICAgICBmaXJlVHJpZ2dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ1RyaWdnZXIodHJpZ2dlcixjb25kaXRpb24scmVjb3JkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChsb2dpY09wZXJhdG9yID09IExvZ2ljT3BlcmF0b3JbJz4nXSAmJiBjb25kaXRpb25WYWx1ZSA+PSByZWNvcmRWYWx1ZSl7XHJcbiAgICAgICAgICAgIGZpcmVUcmlnZ2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubG9nVHJpZ2dlcih0cmlnZ2VyLGNvbmRpdGlvbixyZWNvcmQpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGxvZ2ljT3BlcmF0b3IgPT0gTG9naWNPcGVyYXRvclsnPj0nXSAmJiBjb25kaXRpb25WYWx1ZSA+IHJlY29yZFZhbHVlKXtcclxuICAgICAgICAgICAgZmlyZVRyaWdnZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5sb2dUcmlnZ2VyKHRyaWdnZXIsY29uZGl0aW9uLHJlY29yZCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobG9naWNPcGVyYXRvciA9PSBMb2dpY09wZXJhdG9yWydMSUtFJ10gJiYgcmVjb3JkVmFsdWUuaW5kZXhPZihjb25kaXRpb25WYWx1ZSkgPT0gLTEpe1xyXG4gICAgICAgICAgICBmaXJlVHJpZ2dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ1RyaWdnZXIodHJpZ2dlcixjb25kaXRpb24scmVjb3JkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSAgXHJcblxyXG4gICAgICAgICAgaWYgKGxvZ2ljT3BlcmF0b3IgPT0gTG9naWNPcGVyYXRvclsnTk9UIExJS0UnXSAmJiByZWNvcmRWYWx1ZS5pbmRleE9mKGNvbmRpdGlvblZhbHVlKSAhPSAtMSl7XHJcbiAgICAgICAgICAgIGZpcmVUcmlnZ2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubG9nVHJpZ2dlcih0cmlnZ2VyLGNvbmRpdGlvbixyZWNvcmQpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9ICAgICAgICAgIFxyXG5cclxuICAgICAgICAgIGlmIChsb2dpY09wZXJhdG9yID09IExvZ2ljT3BlcmF0b3IuU2kgJiYgIXJlY29yZFZhbHVlKXtcclxuICAgICAgICAgICAgZmlyZVRyaWdnZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5sb2dUcmlnZ2VyKHRyaWdnZXIsY29uZGl0aW9uLHJlY29yZCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gICAgICAgIFxyXG5cclxuICAgICAgICAgIGlmIChsb2dpY09wZXJhdG9yID09IExvZ2ljT3BlcmF0b3IuTm8gJiYgcmVjb3JkVmFsdWUpe1xyXG4gICAgICAgICAgICBmaXJlVHJpZ2dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ1RyaWdnZXIodHJpZ2dlcixjb25kaXRpb24scmVjb3JkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSAgICAgICAgICAgICAgXHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiY2hlY2tUcmlnZ2VycyAtIGZpcmVUcmlnZ2VyPyBcIiwgZmlyZVRyaWdnZXIpO1xyXG5cclxuICAgICAgICBpZiAoZmlyZVRyaWdnZXIpe1xyXG5cclxuICAgICAgICAgIC8vIElsIHRyaWdnZXIgdmEgc3BhcmF0by4gVmFsdXRvIGxlIGZ1bnppb25pIGludGVybmVcclxuICAgICAgICAgIHZhciBmb3JtdWxhcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodHJpZ2dlci5mb3JtdWxhcykpO1xyXG4gICAgICAgICAgT2JqZWN0LmtleXMoZm9ybXVsYXMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgZm9ybXVsYSA9IGZvcm11bGFzW2tleV07XHJcbiAgICAgICAgICAgIHZhciB0ZW1wID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuRXZhbHVhdGVGaWVsZEZvcm11bGEoXHJcbiAgICAgICAgICAgICAgZm9ybXVsYSxcclxuICAgICAgICAgICAgICByZWNvcmQsXHJcbiAgICAgICAgICAgICAgbnVsbFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZm9ybXVsYXNba2V5XSA9IHRlbXA7XHJcblxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gU3Bhcm8gaWwgdHJpZ2dlciBhbGwnZXN0ZXJub1xyXG4gICAgICAgICAgdmFyIHRyaWdnZXJUb0ZpcmU6IEZpcmVUcmlnZ2VyID0gbmV3IEZpcmVUcmlnZ2VyKCk7XHJcbiAgICAgICAgICB0cmlnZ2VyVG9GaXJlLmZvcm0gPSB0aGlzLmZvcm07IC8vIElsIGZvcm0gY2hlIGhhIHByb3ZvY2F0byBpbCB0cmlnZ2VyXHJcbiAgICAgICAgICB0cmlnZ2VyVG9GaXJlLnJlY29yZCA9IHJlY29yZDsgLy8gSWwgcmVjb3JkIGNoZSBoYSBwcm92b2NhdG8gaWwgdHJpZ2dlclxyXG4gICAgICAgICAgdHJpZ2dlclRvRmlyZS50cmlnZ2VyID0gdHJpZ2dlcjsgLy8gSWwgdHJpZ2dlclxyXG4gICAgICAgICAgdHJpZ2dlclRvRmlyZS5mb3JtdWxhcyA9IGZvcm11bGFzOyAvLyBMZSBmb3JtdWxlIGludmlhdGUgaW4gaW5wdXQgYWwgbW9kdWxvIGRpbmFtaWNvLCB2YWx1dGF0ZSBuZWwgY29udGVzdG8gZGVsIHRyaWdnZXIgZSBkZWwgcmVjb3JkXHJcbiAgICAgICAgICB0cmlnZ2VyVG9GaXJlLnVzZXJQYXRpZW50ID0gdGhpcy51c2VySUQ7IC8vIFVzZXJJRFxyXG5cclxuICAgICAgICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJjaGVja1RyaWdnZXJzIC0gVHJpZ2dlciBGaXJlZCBcIiwgdHJpZ2dlclRvRmlyZSk7XHJcbiAgICAgICAgICB0aGlzLmZpcmVUcmlnZ2VyLmVtaXQodHJpZ2dlclRvRmlyZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2dUcmlnZ2VyKHRyaWdnZXIsY29uZGl0aW9uLHJlY29yZCl7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiY2hlY2tUcmlnZ2VycyAtIENvbmRpdGlvbiB0aGF0IGludmFsaWRhdGVkIHRoZSB0cmlnZ2VyIFRSSUdHRVJcIiwgdHJpZ2dlcik7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiY2hlY2tUcmlnZ2VycyAtIENvbmRpdGlvbiB0aGF0IGludmFsaWRhdGVkIHRoZSB0cmlnZ2VyIENPTkRJVElPTlwiLCBjb25kaXRpb24pO1xyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImNoZWNrVHJpZ2dlcnMgLSBDb25kaXRpb24gdGhhdCBpbnZhbGlkYXRlZCB0aGUgdHJpZ2dlciBSRUNPUkRcIiwgcmVjb3JkKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGNoZWNrVHJpZ2dlcnNcclxuXHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRlclwiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZXFwLWR5bmFtaWMtbW9kdWxlLXRpdGxlIGFkZC1mb3JtLXJlY29yZC1oZWFkZXJcIiAqbmdJZj1cInNob3dUaXRsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPHNwYW4+e3tmb3JtLk5hbWV9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUZvcm1cIiBjbGFzcz1cImFkZC1mb3JtLXJlY29yZC1mb3JtXCI+XHJcblxyXG4gICAgICAgIDwhLS0gVklTVUFMSVpaQVpJT05FIFNFTVBMSUNFIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtLkZvcm1TY2FsYXJUeXBlID09IEZvcm1TY2FsYXJUeXBlRW51bS5TZW1wbGljZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpZWxkVGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmb3JtLkZpZWxkcyB9XCIgY2xhc3M9XCJhZGQtZm9ybS1yZWNvcmQtc2VtcGxpY2VcIj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBWSVNVQUxJWlpBWklPTkUgQSBTVEVQUEVSIC0tPlxyXG4gICAgICAgIDxtYXQtaG9yaXpvbnRhbC1zdGVwcGVyIGxpbmVhciAqbmdJZj1cImZvcm0uRm9ybVNjYWxhclR5cGUgPT0gRm9ybVNjYWxhclR5cGVFbnVtWydBIHN0ZXAnXVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRkLWZvcm0tcmVjb3JkLXN0ZXBwZXJcIj5cclxuICAgICAgICAgICAgPG1hdC1zdGVwICpuZ0Zvcj1cImxldCBncm91cCBvZiBmb3JtLkZvcm1GaWVsZHNHcm91cHM7IGxldCBpID0gaW5kZXg7IGxldCBmaXJzdCA9IGZpcnN0OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRTdGVwTGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAge3tncm91cC5OYW1lfX1cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmaWVsZEdyb3Vwc1tncm91cC5OYW1lXSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhZGQtZm9ybS1yZWNvcmQtYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZmlyc3RcIiBjbGFzcz1cIm1yLTIgcHJldmlvdXNcIiBtYXQtcmFpc2VkLWJ1dHRvbiBtYXRTdGVwcGVyUHJldmlvdXM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFByZWNlZGVudGVcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWxhc3RcIiBjbGFzcz1cImJ1dHRvbi1uZXh0XCIgY29sb3I9XCJwcmltYXJ5XCIgbWF0LXJhaXNlZC1idXR0b24gbWF0U3RlcHBlck5leHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3Npdm9cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwibGFzdCAmJiBzaG93U2F2ZUJ1dHRvblwiIChjbGljayk9XCJzYXZlT3JFeGl0Rm9ybShmYWxzZSlcIiBjbGFzcz1cImJ1dHRvbi1uZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCIgbWF0LXJhaXNlZC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNhbHZhXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvbWF0LXN0ZXA+XHJcbiAgICAgICAgPC9tYXQtaG9yaXpvbnRhbC1zdGVwcGVyPlxyXG5cclxuICAgICAgICA8IS0tIFZJU1VBTElaWkFaSU9ORSBBIFRBQiAtLT5cclxuICAgICAgICA8bWF0LXRhYi1ncm91cCAqbmdJZj1cImZvcm0uRm9ybVNjYWxhclR5cGUgPT0gRm9ybVNjYWxhclR5cGVFbnVtWydJbiB0YWInXVwiIGNsYXNzPVwiYWRkLWZvcm0tcmVjb3JkLXRhYlwiPlxyXG4gICAgICAgICAgICA8bWF0LXRhYiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZm9ybS5Gb3JtRmllbGRzR3JvdXBzXCIgW2xhYmVsXT1cImdyb3VwLk5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkczogZmllbGRHcm91cHNbZ3JvdXAuTmFtZV0gfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbWF0LXRhYj5cclxuICAgICAgICA8L21hdC10YWItZ3JvdXA+XHJcblxyXG4gICAgICAgIDwhLS0gVklTVUFMSVpaQVpJT05FIEFEIEFDQ09SRElPTiAtLT5cclxuICAgICAgICA8bWF0LWFjY29yZGlvbiBtdWx0aSAqbmdJZj1cImZvcm0uRm9ybVNjYWxhclR5cGUgPT0gRm9ybVNjYWxhclR5cGVFbnVtWydJbiBhY2NvcmRpb24nXVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRkLWZvcm0tcmVjb3JkLWFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZm9ybS5Gb3JtRmllbGRzR3JvdXBzXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tncm91cC5OYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmaWVsZEdyb3Vwc1tncm91cC5OYW1lXSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgIDwvbWF0LWFjY29yZGlvbj5cclxuICAgIDwvZm9ybT5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IG10LTIgYWRkLWZvcm0tcmVjb3JkLWJ1dHRvbnNcIlxyXG4gICAgICAgICpuZ0lmPVwiKHNob3dCYWNrQnV0dG9uIHx8IHNob3dTYXZlQnV0dG9uKSAmJiBmb3JtLkZvcm1TY2FsYXJUeXBlICE9IEZvcm1TY2FsYXJUeXBlRW51bVsnQSBzdGVwJ11cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIHRleHQtcmlnaHRcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJzaG93QmFja0J1dHRvblwiIChjbGljayk9XCJzYXZlT3JFeGl0Rm9ybSh0cnVlKVwiPlxyXG4gICAgICAgICAgICAgICAgQW5udWxsYVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJzaG93U2F2ZUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZU9yRXhpdEZvcm0oZmFsc2UpXCIgW2Rpc2FibGVkXT1cImZvcm1Gb3JtLmludmFsaWQgfHwgZm9ybUZvcm0uZGlzYWJsZWQgfHwgaXNTYXZpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzU2F2aW5nXCI+U2FsdmE8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzU2F2aW5nXCI+U2FsdmF0YWdnaW8gaW4gQ29yc28uLi48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG5cclxuPCEtLSBURU1QTEFURSBQRVIgTEEgVklTVUFMSVpaQVpJT05FIERFSSBDQU1QSSBERUxMQSBGT1JNIC0tPlxyXG48bmctdGVtcGxhdGUgI2ZpZWxkVGVtcGxhdGVzIGxldC1maWVsZHM9J2ZpZWxkcyc+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJmb3JtbG9hZGVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwidXRpbGl0eVNlcnZpY2UuZ2V0RmllbGRTeWxlQ2xhc3MoZmllbGQsIHNob3dBbGxGaWVsZHMpXCI+XHJcbiAgICAgICAgICAgIDxkeW5hbWljLW1vZHVsZS1maWVsZC1maXggI2ZpZWxkVGVtcGxhdGUgW2ZpZWxkXT1cImZpZWxkXCIgW1F1ZXJ5RWRpdG9yQ29tcG9uZW50XT1cIlF1ZXJ5RWRpdG9yQ29tcG9uZW50XCIgW2Zvcm1dPVwiZm9ybVwiIFtyZWNvcmRdPVwicmVjb3JkXCIgW2VuZFBvaW50Q29uZmlndXJhdGlvbl09XCJlbmRQb2ludENvbmZpZ3VyYXRpb25cIiBbdXNlcklEXT1cInVzZXJJRFwiIFtpbkNvbmZpZ109XCJpbkNvbmZpZ1wiXHJcbiAgICAgICAgICAgICAgICAocmVjb3JkQ2hhbmdlKT1cIm9uUmVjb3JkQ2hhbmdlKClcIj5cclxuICAgICAgICAgICAgPC9keW5hbWljLW1vZHVsZS1maWVsZC1maXg+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=