@cqa-lib/cqa-ui 1.1.247 → 1.1.248

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.
@@ -47,6 +47,7 @@ export class StepBuilderConditionComponent {
47
47
  this.cancelled = new EventEmitter();
48
48
  this.loadMoreElements = new EventEmitter(); // Emit when load more is requested
49
49
  this.searchElements = new EventEmitter(); // Emit when user searches for elements
50
+ this.searchElementsByScreenName = new EventEmitter(); // Emit when screen name is selected to fetch elements filtered by screen name
50
51
  this.createElement = new EventEmitter(); // Emit when element is created
51
52
  this.searchScreenName = new EventEmitter(); // Emit when user searches screen names
52
53
  this.loadMoreScreenNames = new EventEmitter(); // Emit when user scrolls to load more screen names
@@ -542,10 +543,10 @@ export class StepBuilderConditionComponent {
542
543
  }
543
544
  }
544
545
  StepBuilderConditionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderConditionComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
545
- StepBuilderConditionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderConditionComponent, selector: "cqa-step-builder-condition", inputs: { operatorOptions: "operatorOptions", conditionTemplates: "conditionTemplates", setConditionTemplateVariables: "setConditionTemplateVariables", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex" }, outputs: { createStep: "createStep", cancelled: "cancelled", loadMoreElements: "loadMoreElements", searchElements: "searchElements", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Condition Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Condition Builder Section -->\n <div class=\"cqa-mb-6\">\n <div class=\"cqa-mb-3\">\n <h3 class=\"cqa-text-sm cqa-text-[12px] cqa-font-semibold cqa-text-gray-900\">\n Condition Builder\n </h3>\n </div>\n\n <!-- Condition Rows -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-mb-3\">\n <ng-container *ngFor=\"let condition of conditionsFormArray.controls; let i = index; trackBy: trackByConditionIndex\">\n <div\n *ngIf=\"isConditionIf(i) || isConditionElseIf(i)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <!-- Condition Row -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Condition Label -->\n <div class=\"cqa-text-[12px] cqa-font-semibold\">\n {{ getConditionLabel(i) }}\n </div>\n\n <!-- Operator Dropdown -->\n <!-- <div class=\"cqa-flex-1 cqa-max-w-[100px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getOperatorConfig(i)\">\n </cqa-dynamic-select>\n </div> -->\n\n <!-- Value Template Dropdown -->\n <div class=\"cqa-flex-1 cqa-min-w-[150px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getValueConfig(i)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Remove Button -->\n <cqa-button\n *ngIf=\"i >= 1\"\n variant=\"text\"\n icon=\"close\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n (click)=\"removeCondition(i)\"\n [attr.aria-label]=\"'Remove condition'\">\n </cqa-button>\n <!-- <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-gray-500 hover:cqa-text-gray-700 hover:cqa-bg-gray-100 cqa-transition-colors\"\n (click)=\"removeCondition(i)\" *ngIf=\"i >= 1\"\n [attr.aria-label]=\"'Remove condition'\">\n <mat-icon class=\"cqa-text-lg cqa-text-[24px]\">close</mat-icon>\n </button> -->\n </div>\n\n <!-- Template Variables Section (shown when template is selected) -->\n <div *ngIf=\"getSelectedTemplate(i)\" class=\"cqa-mt-2\">\n <!-- Template Grammar Display -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"getSelectedTemplate(i)?.htmlGrammar || getSelectedTemplate(i)?.naturalText || ''\">\n </div>\n \n </div>\n \n <!-- Template Variables Form Component (includes Description and Metadata) -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"getConditionTemplateVariables(i)\"\n [variablesForm]=\"getConditionVariablesForm(i)\"\n [metadata]=\"getConditionFormGroup(i).get('metadata')?.value || ''\"\n [description]=\"getConditionFormGroup(i).get('description')?.value || ''\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n (variableValueChange)=\"onConditionVariableValueChange(i, $event.name, $event.value)\"\n (variableBooleanChange)=\"onConditionVariableBooleanChange(i, $event.name, $event.value)\"\n (metadataChange)=\"getConditionFormGroup(i).get('metadata')?.setValue($event)\"\n (descriptionChange)=\"getConditionFormGroup(i).get('description')?.setValue($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\">\n </cqa-template-variables-form>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Add Condition Button -->\n <div class=\"cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-rounded-lg cqa-p-1 cqa-mt-3\">\n <cqa-button\n variant=\"text\"\n icon=\"add\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n [text]=\"'Add Condition'\"\n (clicked)=\"addCondition('CONDITION_ELSE_IF')\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Include ELSE Branch Section -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-6 cqa-p-3 cqa-bg-gray-50 cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-flex-col\">\n <h3 class=\"cqa-text-[14px] cqa-font-semibold cqa-text-gray-900 cqa-mb-1\">\n Include ELSE branch\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-gray-600\">\n Execute alternative steps when condition is not met.\n </p>\n </div>\n <mat-slide-toggle [checked]=\"includeElse\" (change)=\"onIncludeElseChange($event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </div>\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!conditionForm.valid\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>", components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "isEditInDepth", "createElementVisible"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchEnvironments", "loadMoreEnvironments", "cancelElementForm", "elementFormVisibilityChange"] }, { type: i5.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }], directives: [{ type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
546
+ StepBuilderConditionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderConditionComponent, selector: "cqa-step-builder-condition", inputs: { operatorOptions: "operatorOptions", conditionTemplates: "conditionTemplates", setConditionTemplateVariables: "setConditionTemplateVariables", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex" }, outputs: { createStep: "createStep", cancelled: "cancelled", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Condition Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Condition Builder Section -->\n <div class=\"cqa-mb-6\">\n <div class=\"cqa-mb-3\">\n <h3 class=\"cqa-text-sm cqa-text-[12px] cqa-font-semibold cqa-text-gray-900\">\n Condition Builder\n </h3>\n </div>\n\n <!-- Condition Rows -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-mb-3\">\n <ng-container *ngFor=\"let condition of conditionsFormArray.controls; let i = index; trackBy: trackByConditionIndex\">\n <div\n *ngIf=\"isConditionIf(i) || isConditionElseIf(i)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <!-- Condition Row -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Condition Label -->\n <div class=\"cqa-text-[12px] cqa-font-semibold\">\n {{ getConditionLabel(i) }}\n </div>\n\n <!-- Operator Dropdown -->\n <!-- <div class=\"cqa-flex-1 cqa-max-w-[100px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getOperatorConfig(i)\">\n </cqa-dynamic-select>\n </div> -->\n\n <!-- Value Template Dropdown -->\n <div class=\"cqa-flex-1 cqa-min-w-[150px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getValueConfig(i)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Remove Button -->\n <cqa-button\n *ngIf=\"i >= 1\"\n variant=\"text\"\n icon=\"close\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n (click)=\"removeCondition(i)\"\n [attr.aria-label]=\"'Remove condition'\">\n </cqa-button>\n <!-- <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-gray-500 hover:cqa-text-gray-700 hover:cqa-bg-gray-100 cqa-transition-colors\"\n (click)=\"removeCondition(i)\" *ngIf=\"i >= 1\"\n [attr.aria-label]=\"'Remove condition'\">\n <mat-icon class=\"cqa-text-lg cqa-text-[24px]\">close</mat-icon>\n </button> -->\n </div>\n\n <!-- Template Variables Section (shown when template is selected) -->\n <div *ngIf=\"getSelectedTemplate(i)\" class=\"cqa-mt-2\">\n <!-- Template Grammar Display -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"getSelectedTemplate(i)?.htmlGrammar || getSelectedTemplate(i)?.naturalText || ''\">\n </div>\n \n </div>\n \n <!-- Template Variables Form Component (includes Description and Metadata) -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"getConditionTemplateVariables(i)\"\n [variablesForm]=\"getConditionVariablesForm(i)\"\n [metadata]=\"getConditionFormGroup(i).get('metadata')?.value || ''\"\n [description]=\"getConditionFormGroup(i).get('description')?.value || ''\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n (variableValueChange)=\"onConditionVariableValueChange(i, $event.name, $event.value)\"\n (variableBooleanChange)=\"onConditionVariableBooleanChange(i, $event.name, $event.value)\"\n (metadataChange)=\"getConditionFormGroup(i).get('metadata')?.setValue($event)\"\n (descriptionChange)=\"getConditionFormGroup(i).get('description')?.setValue($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\">\n </cqa-template-variables-form>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Add Condition Button -->\n <div class=\"cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-rounded-lg cqa-p-1 cqa-mt-3\">\n <cqa-button\n variant=\"text\"\n icon=\"add\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n [text]=\"'Add Condition'\"\n (clicked)=\"addCondition('CONDITION_ELSE_IF')\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Include ELSE Branch Section -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-6 cqa-p-3 cqa-bg-gray-50 cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-flex-col\">\n <h3 class=\"cqa-text-[14px] cqa-font-semibold cqa-text-gray-900 cqa-mb-1\">\n Include ELSE branch\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-gray-600\">\n Execute alternative steps when condition is not met.\n </p>\n </div>\n <mat-slide-toggle [checked]=\"includeElse\" (change)=\"onIncludeElseChange($event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </div>\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!conditionForm.valid\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>", components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i4.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "isEditInDepth", "createElementVisible"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchEnvironments", "loadMoreEnvironments", "cancelElementForm", "elementFormVisibilityChange"] }, { type: i5.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }], directives: [{ type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
546
547
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderConditionComponent, decorators: [{
547
548
  type: Component,
548
- args: [{ selector: 'cqa-step-builder-condition', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Condition Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Condition Builder Section -->\n <div class=\"cqa-mb-6\">\n <div class=\"cqa-mb-3\">\n <h3 class=\"cqa-text-sm cqa-text-[12px] cqa-font-semibold cqa-text-gray-900\">\n Condition Builder\n </h3>\n </div>\n\n <!-- Condition Rows -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-mb-3\">\n <ng-container *ngFor=\"let condition of conditionsFormArray.controls; let i = index; trackBy: trackByConditionIndex\">\n <div\n *ngIf=\"isConditionIf(i) || isConditionElseIf(i)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <!-- Condition Row -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Condition Label -->\n <div class=\"cqa-text-[12px] cqa-font-semibold\">\n {{ getConditionLabel(i) }}\n </div>\n\n <!-- Operator Dropdown -->\n <!-- <div class=\"cqa-flex-1 cqa-max-w-[100px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getOperatorConfig(i)\">\n </cqa-dynamic-select>\n </div> -->\n\n <!-- Value Template Dropdown -->\n <div class=\"cqa-flex-1 cqa-min-w-[150px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getValueConfig(i)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Remove Button -->\n <cqa-button\n *ngIf=\"i >= 1\"\n variant=\"text\"\n icon=\"close\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n (click)=\"removeCondition(i)\"\n [attr.aria-label]=\"'Remove condition'\">\n </cqa-button>\n <!-- <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-gray-500 hover:cqa-text-gray-700 hover:cqa-bg-gray-100 cqa-transition-colors\"\n (click)=\"removeCondition(i)\" *ngIf=\"i >= 1\"\n [attr.aria-label]=\"'Remove condition'\">\n <mat-icon class=\"cqa-text-lg cqa-text-[24px]\">close</mat-icon>\n </button> -->\n </div>\n\n <!-- Template Variables Section (shown when template is selected) -->\n <div *ngIf=\"getSelectedTemplate(i)\" class=\"cqa-mt-2\">\n <!-- Template Grammar Display -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"getSelectedTemplate(i)?.htmlGrammar || getSelectedTemplate(i)?.naturalText || ''\">\n </div>\n \n </div>\n \n <!-- Template Variables Form Component (includes Description and Metadata) -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"getConditionTemplateVariables(i)\"\n [variablesForm]=\"getConditionVariablesForm(i)\"\n [metadata]=\"getConditionFormGroup(i).get('metadata')?.value || ''\"\n [description]=\"getConditionFormGroup(i).get('description')?.value || ''\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n (variableValueChange)=\"onConditionVariableValueChange(i, $event.name, $event.value)\"\n (variableBooleanChange)=\"onConditionVariableBooleanChange(i, $event.name, $event.value)\"\n (metadataChange)=\"getConditionFormGroup(i).get('metadata')?.setValue($event)\"\n (descriptionChange)=\"getConditionFormGroup(i).get('description')?.setValue($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\">\n </cqa-template-variables-form>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Add Condition Button -->\n <div class=\"cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-rounded-lg cqa-p-1 cqa-mt-3\">\n <cqa-button\n variant=\"text\"\n icon=\"add\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n [text]=\"'Add Condition'\"\n (clicked)=\"addCondition('CONDITION_ELSE_IF')\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Include ELSE Branch Section -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-6 cqa-p-3 cqa-bg-gray-50 cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-flex-col\">\n <h3 class=\"cqa-text-[14px] cqa-font-semibold cqa-text-gray-900 cqa-mb-1\">\n Include ELSE branch\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-gray-600\">\n Execute alternative steps when condition is not met.\n </p>\n </div>\n <mat-slide-toggle [checked]=\"includeElse\" (change)=\"onIncludeElseChange($event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </div>\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!conditionForm.valid\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>", styles: [] }]
549
+ args: [{ selector: 'cqa-step-builder-condition', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Condition Step\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Condition Builder Section -->\n <div class=\"cqa-mb-6\">\n <div class=\"cqa-mb-3\">\n <h3 class=\"cqa-text-sm cqa-text-[12px] cqa-font-semibold cqa-text-gray-900\">\n Condition Builder\n </h3>\n </div>\n\n <!-- Condition Rows -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-mb-3\">\n <ng-container *ngFor=\"let condition of conditionsFormArray.controls; let i = index; trackBy: trackByConditionIndex\">\n <div\n *ngIf=\"isConditionIf(i) || isConditionElseIf(i)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <!-- Condition Row -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Condition Label -->\n <div class=\"cqa-text-[12px] cqa-font-semibold\">\n {{ getConditionLabel(i) }}\n </div>\n\n <!-- Operator Dropdown -->\n <!-- <div class=\"cqa-flex-1 cqa-max-w-[100px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getOperatorConfig(i)\">\n </cqa-dynamic-select>\n </div> -->\n\n <!-- Value Template Dropdown -->\n <div class=\"cqa-flex-1 cqa-min-w-[150px] cqa-text-[10px]\">\n <cqa-dynamic-select [form]=\"getConditionFormGroup(i)\" [config]=\"getValueConfig(i)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Remove Button -->\n <cqa-button\n *ngIf=\"i >= 1\"\n variant=\"text\"\n icon=\"close\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n (click)=\"removeCondition(i)\"\n [attr.aria-label]=\"'Remove condition'\">\n </cqa-button>\n <!-- <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-gray-500 hover:cqa-text-gray-700 hover:cqa-bg-gray-100 cqa-transition-colors\"\n (click)=\"removeCondition(i)\" *ngIf=\"i >= 1\"\n [attr.aria-label]=\"'Remove condition'\">\n <mat-icon class=\"cqa-text-lg cqa-text-[24px]\">close</mat-icon>\n </button> -->\n </div>\n\n <!-- Template Variables Section (shown when template is selected) -->\n <div *ngIf=\"getSelectedTemplate(i)\" class=\"cqa-mt-2\">\n <!-- Template Grammar Display -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"getSelectedTemplate(i)?.htmlGrammar || getSelectedTemplate(i)?.naturalText || ''\">\n </div>\n \n </div>\n \n <!-- Template Variables Form Component (includes Description and Metadata) -->\n <cqa-template-variables-form\n style=\"width: 100%;\"\n [templateVariables]=\"getConditionTemplateVariables(i)\"\n [variablesForm]=\"getConditionVariablesForm(i)\"\n [metadata]=\"getConditionFormGroup(i).get('metadata')?.value || ''\"\n [description]=\"getConditionFormGroup(i).get('description')?.value || ''\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n (variableValueChange)=\"onConditionVariableValueChange(i, $event.name, $event.value)\"\n (variableBooleanChange)=\"onConditionVariableBooleanChange(i, $event.name, $event.value)\"\n (metadataChange)=\"getConditionFormGroup(i).get('metadata')?.setValue($event)\"\n (descriptionChange)=\"getConditionFormGroup(i).get('description')?.setValue($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\">\n </cqa-template-variables-form>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Add Condition Button -->\n <div class=\"cqa-border-2 cqa-border-dashed cqa-border-gray-300 cqa-rounded-lg cqa-p-1 cqa-mt-3\">\n <cqa-button\n variant=\"text\"\n icon=\"add\"\n iconPosition=\"start\"\n [customClass]=\"'cqa-w-full cqa-flex cqa-items-center cqa-justify-center'\"\n [text]=\"'Add Condition'\"\n (clicked)=\"addCondition('CONDITION_ELSE_IF')\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Include ELSE Branch Section -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-6 cqa-p-3 cqa-bg-gray-50 cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-flex-col\">\n <h3 class=\"cqa-text-[14px] cqa-font-semibold cqa-text-gray-900 cqa-mb-1\">\n Include ELSE branch\n </h3>\n <p class=\"cqa-text-[12px] cqa-text-gray-600\">\n Execute alternative steps when condition is not met.\n </p>\n </div>\n <mat-slide-toggle [checked]=\"includeElse\" (change)=\"onIncludeElseChange($event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </div>\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!conditionForm.valid\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>", styles: [] }]
549
550
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { operatorOptions: [{
550
551
  type: Input
551
552
  }], conditionTemplates: [{
@@ -588,6 +589,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
588
589
  type: Output
589
590
  }], searchElements: [{
590
591
  type: Output
592
+ }], searchElementsByScreenName: [{
593
+ type: Output
591
594
  }], createElement: [{
592
595
  type: Output
593
596
  }], searchScreenName: [{
@@ -609,4 +612,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
609
612
  }], redirectToEnvironment: [{
610
613
  type: Output
611
614
  }] } });
612
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWNvbmRpdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItY29uZGl0aW9uL3N0ZXAtYnVpbGRlci1jb25kaXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWNvbmRpdGlvbi9zdGVwLWJ1aWxkZXItY29uZGl0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLHVCQUF1QixFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNySixPQUFPLEVBQXFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7QUFrQzVGLE1BQU0sT0FBTyw2QkFBNkI7SUE4RXhDLFlBQW9CLEVBQWUsRUFBVSxHQUFzQjtRQUEvQyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE3RW5FLG9DQUFvQztRQUMzQixvQkFBZSxHQUFtQjtZQUN6QyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDbEUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO1lBQ2xGLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtZQUMxRSxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUU7WUFDMUYsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO1lBQzFGLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRTtTQUMvRSxDQUFDO1FBRUYsNERBQTREO1FBQ25ELHVCQUFrQixHQUFxQixFQUFFLENBQUM7UUFDbkQsbUdBQW1HO1FBQzFGLGtDQUE2QixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQSxDQUFBLENBQUMsQ0FBQztRQUN2RixtQkFBYyxHQUFjLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxvQkFBZSxHQUFZLEtBQUssQ0FBQyxDQUFDLHNDQUFzQztRQUN4RSxzQkFBaUIsR0FBWSxLQUFLLENBQUMsQ0FBQyw2QkFBNkI7UUFDMUUsbUVBQW1FO1FBQzFELHNCQUFpQixHQUFvQyxFQUFFLENBQUM7UUFDakUsa0VBQWtFO1FBQ3pELHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUM3QyxzRUFBc0U7UUFDN0QseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBRS9DLG9DQUFvQztRQUMzQixxQkFBZ0IsR0FBVSxFQUFFLENBQUMsQ0FBQyxzQ0FBc0M7UUFDcEUsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLHdCQUFtQixHQUFZLEtBQUssQ0FBQztRQUU5QyxzQ0FBc0M7UUFDN0IsdUJBQWtCLEdBQXVFLEVBQUUsQ0FBQztRQUM1Rix3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFDckMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBTWhELGdDQUFnQztRQUN0QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFFN0QsMEJBQTBCO1FBQ2hCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3JDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUMsQ0FBQyxtQ0FBbUM7UUFDaEYsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDLENBQUMsdUNBQXVDO1FBQ3BGLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQyxDQUFDLCtCQUErQjtRQUN4RSxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDLENBQUMsdUNBQXVDO1FBQ3RGLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUMsQ0FBQyxtREFBbUQ7UUFDckcsNEJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQyxDQUFDLHNEQUFzRDtRQUM1RyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDLENBQUMseUNBQXlDO1FBQ3hGLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUMsQ0FBQyxpREFBaUQ7UUFDaEcsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQyxDQUFDLDJDQUEyQztRQUM1Rix5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDLENBQUMsbURBQW1EO1FBQ3BHLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDL0MsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUczRCxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUU3Qix3RUFBd0U7UUFDaEUscUJBQWdCLEdBQW9DLElBQUksQ0FBQztRQUVqRSwyREFBMkQ7UUFDbkQsd0JBQW1CLEdBQW9DLElBQUksQ0FBQztRQUVwRSwyREFBMkQ7UUFDbkQsNkJBQXdCLEdBQTBDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFcEYsc0VBQXNFO1FBQzlELHNCQUFpQixHQUFnQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzNELCtCQUEwQixHQUF1QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzNELDRCQUF1QixHQUEyQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzVELGdDQUEyQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMscUNBQXFDO1FBRTNHLDREQUE0RDtRQUNwRCw0QkFBdUIsR0FBMkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUdsRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRO1FBQ04sNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEMsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsZ0VBQWdFO1FBQ2hFLElBQUksT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDL0UsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDOUIsOERBQThEO1lBQzlELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN2QztRQUNELDBDQUEwQztRQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyx5QkFBeUI7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHO1lBQ3pCLEdBQUcsRUFBRSxVQUFVO1lBQ2YsV0FBVyxFQUFFLGlCQUFpQjtZQUM5QixRQUFRLEVBQUUsS0FBSztZQUNmLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZTtTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFjLENBQUM7SUFDM0QsQ0FBQztJQUVELFlBQVksQ0FBQyxhQUFxQjtRQUNoQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQyxLQUFLLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUMzQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUN6QyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNsQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakIsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztRQUM5QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTlDLDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTNELHVCQUF1QjtRQUN2QixJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztRQUV4RCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLDJCQUEyQjtZQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFNUMsK0JBQStCO1lBQy9CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVqQywwQ0FBMEM7WUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxZQUFvQjtRQUMvQyxzQ0FBc0M7UUFDdEMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQztRQUMvRCxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO1FBQ3RELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7UUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztRQUN2RCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBb0MsQ0FBQztRQUNwRSxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBRXhELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDcEQsSUFBSSxRQUFRLEdBQUcsWUFBWSxFQUFFO2dCQUMzQixvQkFBb0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQzlDO2lCQUFNLElBQUksUUFBUSxHQUFHLFlBQVksRUFBRTtnQkFDbEMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDbEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDOUQsSUFBSSxRQUFRLEdBQUcsWUFBWSxFQUFFO2dCQUMzQixvQkFBb0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQy9DO2lCQUFNLElBQUksUUFBUSxHQUFHLFlBQVksRUFBRTtnQkFDbEMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDbkQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDdEQsSUFBSSxRQUFRLEdBQUcsWUFBWSxFQUFFO2dCQUMzQixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3ZDO2lCQUFNLElBQUksUUFBUSxHQUFHLFlBQVksRUFBRTtnQkFDbEMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDM0M7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDM0QsSUFBSSxRQUFRLEdBQUcsWUFBWSxFQUFFO2dCQUMzQixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzVDO2lCQUFNLElBQUksUUFBUSxHQUFHLFlBQVksRUFBRTtnQkFDbEMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDaEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDekQsSUFBSSxRQUFRLEdBQUcsWUFBWSxFQUFFO2dCQUMzQixlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN2QztpQkFBTSxJQUFJLFFBQVEsR0FBRyxZQUFZLEVBQUU7Z0JBQ2xDLHNEQUFzRDtnQkFDdEQsTUFBTSxTQUFTLEdBQUc7b0JBQ2hCLEdBQUcsTUFBTTtvQkFDVCxRQUFRLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTt3QkFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ2xELENBQUM7aUJBQ0YsQ0FBQztnQkFDRixlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDOUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDN0QsSUFBSSxRQUFRLEdBQUcsWUFBWSxFQUFFO2dCQUMzQixxQkFBcUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzlDO2lCQUFNLElBQUksUUFBUSxHQUFHLFlBQVksRUFBRTtnQkFDbEMscUJBQXFCLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDbEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsb0JBQW9CLENBQUM7UUFDdkQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLGlCQUFpQixDQUFDO1FBQ2pELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxpQkFBaUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsZUFBZSxDQUFDO1FBQ2hELElBQUksQ0FBQywyQkFBMkIsR0FBRyxxQkFBcUIsQ0FBQztJQUMzRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBYTtRQUM3Qix5REFBeUQ7UUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM3QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztTQUNsQztRQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsNkNBQTZDO1FBQzdDLE1BQU0sZUFBZSxHQUFtQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRTtZQUN6RCxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUU7WUFDNUQsSUFBSSxFQUFFLFFBQVEsQ0FBQyxXQUFXLElBQUksUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFO1lBQ3hELEtBQUssRUFBRSxRQUFRLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRTtTQUMxRCxDQUFDLENBQUMsQ0FBQztRQUVKLElBQUksQ0FBQyxnQkFBZ0IsR0FBRztZQUN0QixHQUFHLEVBQUUsT0FBTztZQUNaLFdBQVcsRUFBRSxrQkFBa0I7WUFDL0IsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVLEVBQUUsSUFBSTtZQUNoQix1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLE9BQU8sRUFBRSxlQUFlO1NBQ3pCLENBQUM7SUFDSixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWE7UUFDMUIsa0ZBQWtGO1FBQ2xGLElBQUksSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFFLENBQUM7U0FDbEQ7UUFFRCxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUMvQjtRQUVELHdFQUF3RTtRQUN4RSxNQUFNLE1BQU0sR0FBNkI7WUFDdkMsR0FBRyxJQUFJLENBQUMsZ0JBQWlCO1lBQ3pCLFFBQVEsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUN2QixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzNDLENBQUM7U0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQWEsRUFBRSxVQUFlO1FBQ2xELDZCQUE2QjtRQUM3QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQ25ELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxVQUFVLENBQUMsQ0FDekUsQ0FBQztRQUVGLElBQUksZ0JBQWdCLElBQUksSUFBSSxDQUFDLDZCQUE2QixFQUFFO1lBQzFELDBCQUEwQjtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBRXBELHFEQUFxRDtZQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN0RCxvQ0FBb0M7WUFDcEMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNuRCxrQ0FBa0M7WUFDbEMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO2FBQU07WUFDTCx1REFBdUQ7WUFDdkQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRCxJQUFJLFNBQVMsRUFBRTtnQkFDYixPQUFPLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUM3QixTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2QjthQUNGO1NBQ0Y7UUFFRCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sMkJBQTJCLENBQUMsS0FBYSxFQUFFLFNBQWdCO1FBQ2pFLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNkLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNwRDtRQUVELHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsT0FBTztTQUNSO1FBRUQsaUVBQWlFO1FBQ2pFLDJFQUEyRTtRQUMzRSxNQUFNLFlBQVksR0FBYyxTQUFTLENBQUM7UUFFMUMsNEJBQTRCO1FBQzVCLE9BQU8sWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQjtRQUVELG9DQUFvQztRQUNwQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzNCLGtFQUFrRTtZQUNsRSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVM7Z0JBQzlDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssTUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO2dCQUNoRixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRTNCLDJEQUEyRDtZQUMzRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDckIsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDO2dCQUNyQixJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQztnQkFDakMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO2FBQ2xDLENBQUMsQ0FBQztZQUVILHlEQUF5RDtZQUN6RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNsRCxJQUFJLEtBQUssS0FBSyxXQUFXLElBQUksS0FBSyxLQUFLLGNBQWMsSUFBSSxLQUFLLEtBQUssY0FBYztnQkFDN0UsS0FBSyxLQUFLLGNBQWMsSUFBSSxLQUFLLEtBQUssY0FBYyxFQUFFO2dCQUN4RCx5Q0FBeUM7Z0JBQ3pDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzVDLElBQUksUUFBUSxHQUFHLFlBQVksQ0FBQztnQkFDNUIsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3ZELFFBQVEsR0FBRyxXQUFXLENBQUM7aUJBQ3hCO3FCQUFNLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUM5RCxRQUFRLEdBQUcsU0FBUyxDQUFDO2lCQUN0QjtxQkFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDOUQsUUFBUSxHQUFHLGFBQWEsQ0FBQztpQkFDMUI7Z0JBQ0QsYUFBYSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzthQUNqRTtZQUVELFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxLQUFhO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUVELHlCQUF5QixDQUFDLEtBQWE7UUFDckMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELHVCQUF1QixDQUFDLEtBQWEsRUFBRSxhQUFxQjtRQUMxRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsT0FBTyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBYyxDQUFDO0lBQ2xELENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxLQUFhO1FBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztJQUMzRyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBYTtRQUMvQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ25ELENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxLQUFhLEVBQUUsUUFBYTtRQUNyRCxNQUFNLE9BQU8sR0FBbUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3RSxFQUFFLEVBQUUsR0FBRztZQUNQLEtBQUssRUFBRSxHQUFHO1lBQ1YsSUFBSSxFQUFFLEdBQUc7WUFDVCxLQUFLLEVBQUUsR0FBRztTQUNYLENBQUMsQ0FBQyxDQUFDO1FBRUosT0FBTztZQUNMLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNsQixXQUFXLEVBQUUsVUFBVSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ3ZDLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLEtBQUs7WUFDakIsT0FBTyxFQUFFLE9BQU87WUFDaEIsUUFBUSxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNuRSxDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxjQUFzQixFQUFFLFlBQW9CLEVBQUUsS0FBVTtRQUNyRixpREFBaUQ7UUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLENBQUM7UUFDOUQsSUFBSSxRQUFRLEVBQUU7WUFDWixRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUN4QjtRQUNELHlCQUF5QjtRQUN6QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25FLElBQUksU0FBUyxFQUFFO1lBQ2IsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQ2hELE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEtBQUssWUFBWSxDQUN2RCxDQUFDO1lBQ0YsSUFBSSxhQUFhLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3hCLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUNqRjtTQUNGO1FBRUQseUNBQXlDO1FBQ3pDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVoRCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsOEJBQThCLENBQUMsY0FBc0IsRUFBRSxZQUFvQixFQUFFLEtBQVU7UUFDckYsaURBQWlEO1FBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxDQUFDO1FBQzlELElBQUksUUFBUSxFQUFFO1lBQ1osUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7U0FDeEI7UUFDRCwyQkFBMkI7UUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5RCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQUVELGdDQUFnQyxDQUFDLGNBQXNCLEVBQUUsWUFBb0IsRUFBRSxLQUFjO1FBQzNGLGlEQUFpRDtRQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1RSxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQztRQUM5RCxJQUFJLFFBQVEsRUFBRTtZQUNaLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO1FBQ0QseUJBQXlCO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNkLE9BQU87U0FDUjtRQUVELE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUNoRCxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxLQUFLLFlBQVksQ0FDdkQsQ0FBQztRQUNGLElBQUksYUFBYSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3hCLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNqRjthQUFNO1lBQ0wsNENBQTRDO1lBQzVDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNsQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLENBQUM7Z0JBQ3BCLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDZCxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ2pCLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUM5QixPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQzthQUNuQyxDQUFDLENBQUM7WUFDSCwyRUFBMkU7WUFDM0UsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMvQjtRQUVELHlDQUF5QztRQUN6QyxJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFaEQsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYSxDQUFDLFVBQWtCO1FBQ3RDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDM0IsK0NBQStDO1FBQy9DLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7UUFDM0IsT0FBTyxHQUFHLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNLLDBCQUEwQixDQUFDLGNBQXNCO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUU7WUFDdEMsT0FBTztTQUNSO1FBRUQsSUFBSSxjQUFjLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUU1RSwwQ0FBMEM7UUFDMUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzQixNQUFNLFdBQVcsR0FBRyxJQUFJLE1BQU0sQ0FBQyw2QkFBNkIsUUFBUSxDQUFDLElBQUksbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEcsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkMsc0NBQXNDO1lBQ3RDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN0RyxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQscUJBQXFCLENBQUMsS0FBYTtRQUNqQyxzQ0FBc0M7UUFDdEMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzNDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUUsQ0FBQztTQUNqRDtRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFjLENBQUM7UUFDbEUsSUFBSSxTQUFTLEVBQUU7WUFDYixJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxLQUFhO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxPQUFPLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWE7UUFDekIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEtBQUssY0FBYyxDQUFDO0lBQy9ELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFhO1FBQzdCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxLQUFLLG1CQUFtQixDQUFDO0lBQ3BFLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFhO1FBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLFVBQVUsS0FBSyxjQUFjO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDL0MsSUFBSSxVQUFVLEtBQUssbUJBQW1CO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDekQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQWE7UUFDakMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsbUJBQW1CLENBQUMsT0FBZ0I7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUV4RCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFO1lBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQzNDLE1BQU0sUUFBUSxHQUFzQjtnQkFDbEMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEtBQWEsRUFBRSxFQUFFO29CQUNoRSwwREFBMEQ7b0JBQzFELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDbkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLFVBQVUsQ0FBQyxDQUN6RSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRXZDLDRDQUE0QztvQkFDNUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFFM0UsT0FBTzt3QkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7d0JBQ2pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTt3QkFDdkIsS0FBSyxFQUFFLGdCQUFnQixJQUFJLElBQUk7d0JBQy9CLGlCQUFpQixFQUFFLGlCQUFpQjt3QkFDcEMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRTt3QkFDbkMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRTtxQkFDOUIsQ0FBQztnQkFDSixDQUFDLENBQUM7Z0JBQ0YsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXLElBQUksS0FBSzthQUM1QyxDQUFDO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDOzswSEFybUJVLDZCQUE2Qjs4R0FBN0IsNkJBQTZCLHU2Q0NuQzFDLCs1T0FrSk07MkZEL0dPLDZCQUE2QjtrQkFQekMsU0FBUzsrQkFDRSw0QkFBNEIsUUFHaEMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLG1CQUNiLHVCQUF1QixDQUFDLE1BQU07a0lBSXRDLGVBQWU7c0JBQXZCLEtBQUs7Z0JBVUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBR0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFHRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEFjdGlvblRlbXBsYXRlIH0gZnJvbSAnLi4vc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudCc7XG5cbi8vIEltcG9ydCBFbGVtZW50IHR5cGUgLSB1c2luZyBhbnkgZm9yIG5vdyBzaW5jZSBFbGVtZW50IGlzIGZyb20gdHMtcG9ydGFsLXVpXG5pbnRlcmZhY2UgRWxlbWVudCB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxvY2F0b3JWYWx1ZT86IHN0cmluZztcbiAgb3RoZXJMb2NhdG9yPzogc3RyaW5nW107XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25Sb3cge1xuICBmaWVsZDogc3RyaW5nO1xuICBvcGVyYXRvcjogc3RyaW5nO1xuICB2YWx1ZTogQWN0aW9uVGVtcGxhdGU7XG4gIHRlbXBsYXRlVmFyaWFibGVzPzogYW55W107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBtZXRhZGF0YT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25Gb3JtRGF0YSB7XG4gIGNvbmRpdGlvbnM6IENvbmRpdGlvblJvd1tdO1xuICBpbmNsdWRlRWxzZTogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtYnVpbGRlci1jb25kaXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWNvbmRpdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJDb25kaXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKiBPcHRpb25zIGZvciBvcGVyYXRvciBkcm9wZG93biAqL1xuICBASW5wdXQoKSBvcGVyYXRvck9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdlcXVhbHMnLCB2YWx1ZTogJ2VxdWFscycsIG5hbWU6ICdlcXVhbHMnLCBsYWJlbDogJ2VxdWFscycgfSxcbiAgICB7IGlkOiAnbm90X2VxdWFscycsIHZhbHVlOiAnbm90X2VxdWFscycsIG5hbWU6ICdub3QgZXF1YWxzJywgbGFiZWw6ICdub3QgZXF1YWxzJyB9LFxuICAgIHsgaWQ6ICdjb250YWlucycsIHZhbHVlOiAnY29udGFpbnMnLCBuYW1lOiAnY29udGFpbnMnLCBsYWJlbDogJ2NvbnRhaW5zJyB9LFxuICAgIHsgaWQ6ICdub3RfY29udGFpbnMnLCB2YWx1ZTogJ25vdF9jb250YWlucycsIG5hbWU6ICdub3QgY29udGFpbnMnLCBsYWJlbDogJ25vdCBjb250YWlucycgfSxcbiAgICB7IGlkOiAnZ3JlYXRlcl90aGFuJywgdmFsdWU6ICdncmVhdGVyX3RoYW4nLCBuYW1lOiAnZ3JlYXRlciB0aGFuJywgbGFiZWw6ICdncmVhdGVyIHRoYW4nIH0sXG4gICAgeyBpZDogJ2xlc3NfdGhhbicsIHZhbHVlOiAnbGVzc190aGFuJywgbmFtZTogJ2xlc3MgdGhhbicsIGxhYmVsOiAnbGVzcyB0aGFuJyB9XG4gIF07XG5cbiAgLyoqIExpc3Qgb2YgYWN0aW9uIHRlbXBsYXRlcyB0byBkaXNwbGF5IGluIHZhbHVlIGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIGNvbmRpdGlvblRlbXBsYXRlczogQWN0aW9uVGVtcGxhdGVbXSA9IFtdO1xuICAvKiogRnVuY3Rpb24gdG8gaGFuZGxlIHZhcmlhYmxlIHByb2Nlc3Npbmcgb3IgY3VzdG9tIGxvZ2ljLiBDYW4gYmUgcGFzc2VkIGZyb20gcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgc2V0Q29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXM6ICh2YXJpYWJsZXM6IEFjdGlvblRlbXBsYXRlKSA9PiBhbnkgPSAoKSA9PiB7IHJldHVybiBbXX07XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiB7IGlkPzogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgc2NyZWVuIG5hbWVzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgc2NyZWVuIG5hbWVzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLyoqIFBhcmFtZXRlciBmZXRjaGluZyBwcm9wZXJ0aWVzICovXG4gIEBJbnB1dCgpIHBhcmFtZXRlck9wdGlvbnM6IGFueVtdID0gW107IC8vIFRlc3REYXRhW10gLSByYXcgdGVzdCBkYXRhIHByb2ZpbGVzXG4gIEBJbnB1dCgpIGhhc01vcmVQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ1BhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8qKiBFbnZpcm9ubWVudCBmZXRjaGluZyBwcm9wZXJ0aWVzICovXG4gIEBJbnB1dCgpIGVudmlyb25tZW50T3B0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGVudmlyb25tZW50OiBzdHJpbmcgfVtdID0gW107XG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKiogRGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBwcm9wZXJ0aWVzICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcblxuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgY3JlYXRlZCAqL1xuICBAT3V0cHV0KCkgY3JlYXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29uZGl0aW9uRm9ybURhdGE+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBjYW5jZWxsZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGxvYWRNb3JlRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBsb2FkIG1vcmUgaXMgcmVxdWVzdGVkXG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgZWxlbWVudHNcbiAgQE91dHB1dCgpIGNyZWF0ZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgaXMgY3JlYXRlZFxuICBAT3V0cHV0KCkgc2VhcmNoU2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGxvYWRNb3JlU2NyZWVuTmFtZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciByZXF1ZXN0cyB0byBjcmVhdGUgYSBuZXcgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIHNlYXJjaFBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIGxvYWRNb3JlUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgc2VhcmNoRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBlbnZpcm9ubWVudHNcbiAgQE91dHB1dCgpIGxvYWRNb3JlRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBlbnZpcm9ubWVudHNcbiAgQE91dHB1dCgpIHJlZGlyZWN0VG9QYXJhbWV0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWRpcmVjdFRvRW52aXJvbm1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgY29uZGl0aW9uRm9ybTogRm9ybUdyb3VwO1xuICBpbmNsdWRlRWxzZTogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHZhbHVlIGNvbmZpZ3MgdG8gYXZvaWQgcmVjcmVhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gIHByaXZhdGUgdmFsdWVDb25maWdDYWNoZTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvLyBDYWNoZSBmb3Igb3BlcmF0b3IgY29uZmlncyAoc3RhdGljLCBubyBuZWVkIHRvIHJlY3JlYXRlKVxuICBwcml2YXRlIG9wZXJhdG9yQ29uZmlnQ2FjaGU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHZhbHVlIGNvbmZpZ3Mgd2l0aCBvbkNoYW5nZSBoYW5kbGVycyBwZXIgaW5kZXhcbiAgcHJpdmF0ZSB2YWx1ZUNvbmZpZ3NXaXRoSGFuZGxlcnM6IE1hcDxudW1iZXIsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBUcmFjayBzZWxlY3RlZCB0ZW1wbGF0ZXMgYW5kIHRoZWlyIHZhcmlhYmxlcyBmb3IgZWFjaCBjb25kaXRpb24gcm93XG4gIHByaXZhdGUgc2VsZWN0ZWRUZW1wbGF0ZXM6IE1hcDxudW1iZXIsIEFjdGlvblRlbXBsYXRlPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlczogTWFwPG51bWJlciwgYW55W10+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zOiBNYXA8bnVtYmVyLCBGb3JtQXJyYXk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hcjogTWFwPG51bWJlciwgc3RyaW5nPiA9IG5ldyBNYXAoKTsgLy8gVXBkYXRlZCBIVE1MIGdyYW1tYXIgcGVyIGNvbmRpdGlvblxuICBcbiAgLy8gQ2FjaGUgZm9yIGNvbmRpdGlvbiBmb3JtIGdyb3VwcyB0byBhdm9pZCByZXBlYXRlZCBsb29rdXBzXG4gIHByaXZhdGUgY29uZGl0aW9uRm9ybUdyb3VwQ2FjaGU6IE1hcDxudW1iZXIsIEZvcm1Hcm91cD4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHRoaXMuY29uZGl0aW9uRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgY29uZGl0aW9uczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgICBpbmNsdWRlRWxzZTogW2ZhbHNlXVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQWRkIGluaXRpYWwgY29uZGl0aW9uIHJvd1xuICAgIHRoaXMuYWRkQ29uZGl0aW9uKFwiQ09ORElUSU9OX0lGXCIpO1xuICAgIC8vIEluaXRpYWxpemUgY29uZmlnIGNhY2hlc1xuICAgIHRoaXMudXBkYXRlVmFsdWVDb25maWdDYWNoZSgpO1xuICAgIHRoaXMudXBkYXRlT3BlcmF0b3JDb25maWdDYWNoZSgpO1xuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIFJlZ2VuZXJhdGUgdmFsdWUgY29uZmlnIGNhY2hlIHdoZW4gY29uZGl0aW9uVGVtcGxhdGVzIGNoYW5nZXNcbiAgICBpZiAoY2hhbmdlc1snY29uZGl0aW9uVGVtcGxhdGVzJ10gJiYgIWNoYW5nZXNbJ2NvbmRpdGlvblRlbXBsYXRlcyddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlQ29uZmlnQ2FjaGUoKTtcbiAgICAgIC8vIENsZWFyIHZhbHVlIGNvbmZpZ3Mgd2l0aCBoYW5kbGVycyBzaW5jZSBiYXNlIGNvbmZpZyBjaGFuZ2VkXG4gICAgICB0aGlzLnZhbHVlQ29uZmlnc1dpdGhIYW5kbGVycy5jbGVhcigpO1xuICAgIH1cbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSB1cGRhdGVPcGVyYXRvckNvbmZpZ0NhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMub3BlcmF0b3JDb25maWdDYWNoZSA9IHtcbiAgICAgIGtleTogJ29wZXJhdG9yJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IG9wZXJhdG9yJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5vcGVyYXRvck9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgZ2V0IGNvbmRpdGlvbnNGb3JtQXJyYXkoKTogRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25Gb3JtLmdldCgnY29uZGl0aW9ucycpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIGFkZENvbmRpdGlvbihjb25kaXRpb25UeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb25kaXRpb25Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZmllbGQ6IFtjb25kaXRpb25UeXBlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIG9wZXJhdG9yOiBbJ2VxdWFscycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgdmFsdWU6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSwgLy8gV2lsbCBzdG9yZSB0ZW1wbGF0ZSBJRCwgdGhlbiBtYXAgdG8gQWN0aW9uVGVtcGxhdGVcbiAgICAgIGRlc2NyaXB0aW9uOiBbJyddLFxuICAgICAgbWV0YWRhdGE6IFsnJ10sXG4gICAgfSk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmNvbmRpdGlvbnNGb3JtQXJyYXkubGVuZ3RoO1xuICAgIHRoaXMuY29uZGl0aW9uc0Zvcm1BcnJheS5wdXNoKGNvbmRpdGlvbkdyb3VwKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3JtIGZvciB0aGlzIGNvbmRpdGlvbiAoRm9ybUFycmF5KVxuICAgIHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuc2V0KGluZGV4LCB0aGlzLmZiLmFycmF5KFtdKSk7XG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIGZvcm0gZ3JvdXBcbiAgICB0aGlzLmNvbmRpdGlvbkZvcm1Hcm91cENhY2hlLnNldChpbmRleCwgY29uZGl0aW9uR3JvdXApO1xuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVtb3ZlQ29uZGl0aW9uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25kaXRpb25zRm9ybUFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uc0Zvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gICAgICAvLyBDbGVhbiB1cCBhc3NvY2lhdGVkIGRhdGFcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZXMuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY29uZGl0aW9uRm9ybUdyb3VwQ2FjaGUuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMudmFsdWVDb25maWdzV2l0aEhhbmRsZXJzLmRlbGV0ZShpbmRleCk7XG4gICAgICBcbiAgICAgIC8vIFJlaW5kZXggcmVtYWluaW5nIGNvbmRpdGlvbnNcbiAgICAgIHRoaXMucmVpbmRleENvbmRpdGlvbkRhdGEoaW5kZXgpO1xuICAgICAgXG4gICAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSByZWluZGV4Q29uZGl0aW9uRGF0YShyZW1vdmVkSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBuZXcgbWFwcyB3aXRoIHJlaW5kZXhlZCBkYXRhXG4gICAgY29uc3QgbmV3U2VsZWN0ZWRUZW1wbGF0ZXMgPSBuZXcgTWFwPG51bWJlciwgQWN0aW9uVGVtcGxhdGU+KCk7XG4gICAgY29uc3QgbmV3VGVtcGxhdGVWYXJpYWJsZXMgPSBuZXcgTWFwPG51bWJlciwgYW55W10+KCk7XG4gICAgY29uc3QgbmV3VmFyaWFibGVzRm9ybXMgPSBuZXcgTWFwPG51bWJlciwgRm9ybUFycmF5PigpO1xuICAgIGNvbnN0IG5ld0Zvcm1Hcm91cENhY2hlID0gbmV3IE1hcDxudW1iZXIsIEZvcm1Hcm91cD4oKTtcbiAgICBjb25zdCBuZXdWYWx1ZUNvbmZpZ3MgPSBuZXcgTWFwPG51bWJlciwgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPigpO1xuICAgIGNvbnN0IG5ld1VwZGF0ZWRIdG1sR3JhbW1hciA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgXG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5mb3JFYWNoKCh0ZW1wbGF0ZSwgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdTZWxlY3RlZFRlbXBsYXRlcy5zZXQob2xkSW5kZXgsIHRlbXBsYXRlKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3U2VsZWN0ZWRUZW1wbGF0ZXMuc2V0KG9sZEluZGV4IC0gMSwgdGVtcGxhdGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGVzLCBvbGRJbmRleCkgPT4ge1xuICAgICAgaWYgKG9sZEluZGV4IDwgcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld1RlbXBsYXRlVmFyaWFibGVzLnNldChvbGRJbmRleCwgdmFyaWFibGVzKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3VGVtcGxhdGVWYXJpYWJsZXMuc2V0KG9sZEluZGV4IC0gMSwgdmFyaWFibGVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLmZvckVhY2goKGZvcm0sIG9sZEluZGV4KSA9PiB7XG4gICAgICBpZiAob2xkSW5kZXggPCByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3VmFyaWFibGVzRm9ybXMuc2V0KG9sZEluZGV4LCBmb3JtKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3VmFyaWFibGVzRm9ybXMuc2V0KG9sZEluZGV4IC0gMSwgZm9ybSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5mb3JFYWNoKChmb3JtR3JvdXAsIG9sZEluZGV4KSA9PiB7XG4gICAgICBpZiAob2xkSW5kZXggPCByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3Rm9ybUdyb3VwQ2FjaGUuc2V0KG9sZEluZGV4LCBmb3JtR3JvdXApO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdGb3JtR3JvdXBDYWNoZS5zZXQob2xkSW5kZXggLSAxLCBmb3JtR3JvdXApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMudmFsdWVDb25maWdzV2l0aEhhbmRsZXJzLmZvckVhY2goKGNvbmZpZywgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdWYWx1ZUNvbmZpZ3Muc2V0KG9sZEluZGV4LCBjb25maWcpO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICAvLyBSZWNyZWF0ZSBjb25maWcgd2l0aCBuZXcgaW5kZXggZm9yIG9uQ2hhbmdlIGhhbmRsZXJcbiAgICAgICAgY29uc3QgbmV3Q29uZmlnID0ge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25UZW1wbGF0ZVZhbHVlQ2hhbmdlKG9sZEluZGV4IC0gMSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbmV3VmFsdWVDb25maWdzLnNldChvbGRJbmRleCAtIDEsIG5ld0NvbmZpZyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5jb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXIuZm9yRWFjaCgoZ3JhbW1hciwgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdVcGRhdGVkSHRtbEdyYW1tYXIuc2V0KG9sZEluZGV4LCBncmFtbWFyKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3VXBkYXRlZEh0bWxHcmFtbWFyLnNldChvbGRJbmRleCAtIDEsIGdyYW1tYXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZXMgPSBuZXdTZWxlY3RlZFRlbXBsYXRlcztcbiAgICB0aGlzLmNvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzID0gbmV3VGVtcGxhdGVWYXJpYWJsZXM7XG4gICAgdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3JtcyA9IG5ld1ZhcmlhYmxlc0Zvcm1zO1xuICAgIHRoaXMuY29uZGl0aW9uRm9ybUdyb3VwQ2FjaGUgPSBuZXdGb3JtR3JvdXBDYWNoZTtcbiAgICB0aGlzLnZhbHVlQ29uZmlnc1dpdGhIYW5kbGVycyA9IG5ld1ZhbHVlQ29uZmlncztcbiAgICB0aGlzLmNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hciA9IG5ld1VwZGF0ZWRIdG1sR3JhbW1hcjtcbiAgfVxuXG4gIGdldE9wZXJhdG9yQ29uZmlnKGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIFJldHVybiBjYWNoZWQgY29uZmlnIChzdGF0aWMsIHNhbWUgZm9yIGFsbCBjb25kaXRpb25zKVxuICAgIGlmICghdGhpcy5vcGVyYXRvckNvbmZpZ0NhY2hlKSB7XG4gICAgICB0aGlzLnVwZGF0ZU9wZXJhdG9yQ29uZmlnQ2FjaGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3BlcmF0b3JDb25maWdDYWNoZSE7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZhbHVlQ29uZmlnQ2FjaGUoKTogdm9pZCB7XG4gICAgLy8gQ29udmVydCBBY3Rpb25UZW1wbGF0ZVtdIHRvIFNlbGVjdE9wdGlvbltdXG4gICAgY29uc3QgdGVtcGxhdGVPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9ICh0aGlzLmNvbmRpdGlvblRlbXBsYXRlcyB8fCBbXSkubWFwKHRlbXBsYXRlID0+ICh7XG4gICAgICBpZDogdGVtcGxhdGUuaWQ/LnRvU3RyaW5nKCkgfHwgdGVtcGxhdGUuZGlzcGxheU5hbWUgfHwgJycsXG4gICAgICB2YWx1ZTogdGVtcGxhdGUuaWQ/LnRvU3RyaW5nKCkgfHwgdGVtcGxhdGUuZGlzcGxheU5hbWUgfHwgJycsXG4gICAgICBuYW1lOiB0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJyxcbiAgICAgIGxhYmVsOiB0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJ1xuICAgIH0pKTtcblxuICAgIHRoaXMudmFsdWVDb25maWdDYWNoZSA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlbXBsYXRlKicsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZGlzcGxheUxhYmVsQXNJbm5lckh0bWw6IHRydWUsXG4gICAgICBvcHRpb25zOiB0ZW1wbGF0ZU9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgZ2V0VmFsdWVDb25maWcoaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBjb25maWcgd2l0aCBoYW5kbGVyIHRvIGF2b2lkIHJlY3JlYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIGlmICh0aGlzLnZhbHVlQ29uZmlnc1dpdGhIYW5kbGVycy5oYXMoaW5kZXgpKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZUNvbmZpZ3NXaXRoSGFuZGxlcnMuZ2V0KGluZGV4KSE7XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBiYXNlIGNvbmZpZyBjYWNoZSBleGlzdHNcbiAgICBpZiAoIXRoaXMudmFsdWVDb25maWdDYWNoZSkge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZUNvbmZpZ0NhY2hlKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSBhbmQgY2FjaGUgY29uZmlnIHdpdGggb25DaGFuZ2UgaGFuZGxlciBmb3IgdGhpcyBzcGVjaWZpYyBpbmRleFxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy52YWx1ZUNvbmZpZ0NhY2hlISxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uVGVtcGxhdGVWYWx1ZUNoYW5nZShpbmRleCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgdGhpcy52YWx1ZUNvbmZpZ3NXaXRoSGFuZGxlcnMuc2V0KGluZGV4LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgXG4gIG9uVGVtcGxhdGVWYWx1ZUNoYW5nZShpbmRleDogbnVtYmVyLCB0ZW1wbGF0ZUlkOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCB0ZW1wbGF0ZVxuICAgIGNvbnN0IHNlbGVjdGVkVGVtcGxhdGUgPSB0aGlzLmNvbmRpdGlvblRlbXBsYXRlcy5maW5kKFxuICAgICAgdCA9PiAodC5pZD8udG9TdHJpbmcoKSA9PT0gdGVtcGxhdGVJZCkgfHwgKHQuZGlzcGxheU5hbWUgPT09IHRlbXBsYXRlSWQpXG4gICAgKTtcbiAgICBcbiAgICBpZiAoc2VsZWN0ZWRUZW1wbGF0ZSAmJiB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKSB7XG4gICAgICAvLyBTdG9yZSBzZWxlY3RlZCB0ZW1wbGF0ZVxuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5zZXQoaW5kZXgsIHNlbGVjdGVkVGVtcGxhdGUpO1xuICAgICAgXG4gICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhzZWxlY3RlZFRlbXBsYXRlKTtcbiAgICAgIHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuc2V0KGluZGV4LCB2YXJpYWJsZXMpO1xuICAgICAgLy8gQnVpbGQgZm9ybSBmb3IgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgICB0aGlzLmJ1aWxkQ29uZGl0aW9uVmFyaWFibGVzRm9ybShpbmRleCwgdmFyaWFibGVzKTtcbiAgICAgIC8vIEluaXRpYWxpemUgdXBkYXRlZCBIVE1MIGdyYW1tYXJcbiAgICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uSHRtbEdyYW1tYXIoaW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDbGVhciB0ZW1wbGF0ZSBhbmQgdmFyaWFibGVzIGlmIG5vIHRlbXBsYXRlIHNlbGVjdGVkXG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVzLmRlbGV0ZShpbmRleCk7XG4gICAgICB0aGlzLmNvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzLmRlbGV0ZShpbmRleCk7XG4gICAgICB0aGlzLmNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hci5kZWxldGUoaW5kZXgpO1xuICAgICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgICAgaWYgKGZvcm1BcnJheSkge1xuICAgICAgICB3aGlsZSAoZm9ybUFycmF5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIGZvcm1BcnJheS5yZW1vdmVBdCgwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBidWlsZENvbmRpdGlvblZhcmlhYmxlc0Zvcm0oaW5kZXg6IG51bWJlciwgdmFyaWFibGVzOiBhbnlbXSk6IHZvaWQge1xuICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLmdldChpbmRleCk7XG4gICAgaWYgKCFmb3JtQXJyYXkpIHtcbiAgICAgIGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10pO1xuICAgICAgdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5zZXQoaW5kZXgsIGZvcm1BcnJheSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBmb3JtQXJyYXkgaXMgbm90IHVuZGVmaW5lZCAoVHlwZVNjcmlwdCBndWFyZClcbiAgICBpZiAoIWZvcm1BcnJheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBTdG9yZSByZWZlcmVuY2UgdG8gYXZvaWQgVHlwZVNjcmlwdCBpc3N1ZXMgaW4gZm9yRWFjaCBjYWxsYmFja1xuICAgIC8vIFR5cGVTY3JpcHQga25vd3MgZm9ybUFycmF5IGlzIGRlZmluZWQgaGVyZSBkdWUgdG8gdGhlIGVhcmx5IHJldHVybiBhYm92ZVxuICAgIGNvbnN0IGZvcm1BcnJheVJlZjogRm9ybUFycmF5ID0gZm9ybUFycmF5O1xuICAgIFxuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAoZm9ybUFycmF5UmVmLmxlbmd0aCAhPT0gMCkge1xuICAgICAgZm9ybUFycmF5UmVmLnJlbW92ZUF0KDApO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgZm9ybSBncm91cHMgZm9yIGVhY2ggdmFyaWFibGVcbiAgICB2YXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiB2YXJpYWJsZXMgLSB1c2UgYm9vbGVhbiB2YWx1ZSwgb3RoZXJzIHVzZSBzdHJpbmdcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYSBGb3JtR3JvdXAgZm9yIGVhY2ggdmFyaWFibGUgd2l0aCBuYW1lIGFuZCB2YWx1ZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbZGVmYXVsdFZhbHVlXSxcbiAgICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXSxcbiAgICAgICAgb3B0aW9uczogW3ZhcmlhYmxlLm9wdGlvbnMgfHwgW11dXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gQWRkIGRhdGFUeXBlIGNvbnRyb2wgZm9yIHRlc3QtZGF0YSB2YXJpYWJsZXMgaWYgbmVlZGVkXG4gICAgICBjb25zdCBsYWJlbCA9IHZhcmlhYmxlLmxhYmVsPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGxhYmVsID09PSAndGVzdC1kYXRhJyB8fCBsYWJlbCA9PT0gJ3NvdXJjZS12YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXQtdmFsdWUnIHx8IFxuICAgICAgICAgIGxhYmVsID09PSAnc291cmNlX3ZhbHVlJyB8fCBsYWJlbCA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgLy8gUGFyc2UgdGhlIHZhbHVlIHRvIGRldGVybWluZSBkYXRhIHR5cGVcbiAgICAgICAgY29uc3QgdmFsdWVTdHIgPSBTdHJpbmcoZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICAgICAgbGV0IGRhdGFUeXBlID0gJ3BsYWluLXRleHQnO1xuICAgICAgICBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnQHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgICAgZGF0YVR5cGUgPSAncGFyYW1ldGVyJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdydW50aW1lJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCcqfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdlbnZpcm9ubWVudCc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChkYXRhVHlwZSkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBmb3JtQXJyYXlSZWYucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHVwZGF0ZWQgSFRNTCBncmFtbWFyIGZvciB0aGlzIGNvbmRpdGlvblxuICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uSHRtbEdyYW1tYXIoaW5kZXgpO1xuICB9XG4gIFxuICBnZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhpbmRleDogbnVtYmVyKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzLmdldChpbmRleCkgfHwgW107XG4gIH1cbiAgXG4gIGdldENvbmRpdGlvblZhcmlhYmxlc0Zvcm0oaW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XG4gICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZ2V0KGluZGV4KTtcbiAgICBpZiAoIWZvcm1BcnJheSkge1xuICAgICAgZm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShbXSk7XG4gICAgICB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLnNldChpbmRleCwgZm9ybUFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1BcnJheTtcbiAgfVxuICBcbiAgZ2V0Q29uZGl0aW9uRm9ybUdyb3VwQXQoaW5kZXg6IG51bWJlciwgdmFyaWFibGVJbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmdldENvbmRpdGlvblZhcmlhYmxlc0Zvcm0oaW5kZXgpO1xuICAgIHJldHVybiBmb3JtQXJyYXkuYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICB9XG4gIFxuICBnZXRDb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXIoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnNlbGVjdGVkVGVtcGxhdGVzLmdldChpbmRleCk7XG4gICAgaWYgKCF0ZW1wbGF0ZSkgcmV0dXJuICcnO1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hci5nZXQoaW5kZXgpIHx8IHRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnO1xuICB9XG4gIFxuICBnZXRTZWxlY3RlZFRlbXBsYXRlKGluZGV4OiBudW1iZXIpOiBBY3Rpb25UZW1wbGF0ZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGVtcGxhdGVzLmdldChpbmRleCkgfHwgbnVsbDtcbiAgfVxuICBcbiAgZ2V0U2VsZWN0Q29uZmlnRm9yVmFyaWFibGUoaW5kZXg6IG51bWJlciwgdmFyaWFibGU6IGFueSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAodmFyaWFibGUub3B0aW9ucyB8fCBbXSkubWFwKChvcHQ6IHN0cmluZykgPT4gKHtcbiAgICAgIGlkOiBvcHQsXG4gICAgICB2YWx1ZTogb3B0LFxuICAgICAgbmFtZTogb3B0LFxuICAgICAgbGFiZWw6IG9wdFxuICAgIH0pKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IHZhcmlhYmxlLm5hbWUsXG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCAke3ZhcmlhYmxlLmxhYmVsfWAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkNvbmRpdGlvblZhcmlhYmxlVmFsdWVDaGFuZ2UoaW5kZXgsIHZhcmlhYmxlLm5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIFxuICBvbkNvbmRpdGlvblZhcmlhYmxlVmFsdWVDaGFuZ2UoY29uZGl0aW9uSW5kZXg6IG51bWJlciwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5nZXQoY29uZGl0aW9uSW5kZXgpIHx8IFtdO1xuICAgIGNvbnN0IHZhcmlhYmxlID0gdmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGFycmF5XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5nZXQoY29uZGl0aW9uSW5kZXgpO1xuICAgIGlmIChmb3JtQXJyYXkpIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSBmb3JtQXJyYXkuY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZm9ybUFycmF5LmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIEhUTUwgZ3JhbW1hciBmb3IgdGhpcyBjb25kaXRpb25cbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvbkh0bWxHcmFtbWFyKGNvbmRpdGlvbkluZGV4KTtcbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgb25Db25kaXRpb25WYXJpYWJsZUlucHV0Q2hhbmdlKGNvbmRpdGlvbkluZGV4OiBudW1iZXIsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZ2V0KGNvbmRpdGlvbkluZGV4KSB8fCBbXTtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZ2V0KGNvbmRpdGlvbkluZGV4KTtcbiAgICBpZiAoZm9ybSAmJiBmb3JtLmdldCh2YXJpYWJsZU5hbWUpKSB7XG4gICAgICBmb3JtLmdldCh2YXJpYWJsZU5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25Db25kaXRpb25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UoY29uZGl0aW9uSW5kZXg6IG51bWJlciwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZ2V0KGNvbmRpdGlvbkluZGV4KSB8fCBbXTtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheVxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZ2V0KGNvbmRpdGlvbkluZGV4KTtcbiAgICBpZiAoIWZvcm1BcnJheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gZm9ybUFycmF5LmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICBmb3JtQXJyYXkuYXQodmFyaWFibGVJbmRleCkuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IGZvcm0gZ3JvdXAgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGVOYW1lXSxcbiAgICAgICAgdmFsdWU6IFt2YWx1ZV0sXG4gICAgICAgIHR5cGU6IFsnYm9vbGVhbiddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlPy5sYWJlbCB8fCAnJ10sXG4gICAgICAgIG9wdGlvbnM6IFt2YXJpYWJsZT8ub3B0aW9ucyB8fCBbXV1cbiAgICAgIH0pO1xuICAgICAgLy8gZm9ybUFycmF5IGlzIGd1YXJhbnRlZWQgdG8gYmUgZGVmaW5lZCBoZXJlIGR1ZSB0byB0aGUgZWFybHkgcmV0dXJuIGFib3ZlXG4gICAgICBmb3JtQXJyYXkucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIEhUTUwgZ3JhbW1hciBmb3IgdGhpcyBjb25kaXRpb25cbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvbkh0bWxHcmFtbWFyKGNvbmRpdGlvbkluZGV4KTtcbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFN0cmlwIEhUTUwgdGFncyBmcm9tIGEgc3RyaW5nIGZvciBzZWFyY2ggZnVuY3Rpb25hbGl0eVxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpcEh0bWxUYWdzKGh0bWxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFodG1sU3RyaW5nKSByZXR1cm4gJyc7XG4gICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpdiBlbGVtZW50IHRvIHBhcnNlIEhUTUxcbiAgICBjb25zdCB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICB0bXAuaW5uZXJIVE1MID0gaHRtbFN0cmluZztcbiAgICByZXR1cm4gdG1wLnRleHRDb250ZW50IHx8IHRtcC5pbm5lclRleHQgfHwgJyc7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgSFRNTCBncmFtbWFyIGZvciBhIHNwZWNpZmljIGNvbmRpdGlvbiB3aXRoIGFjdHVhbCB2YXJpYWJsZSB2YWx1ZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29uZGl0aW9uSHRtbEdyYW1tYXIoY29uZGl0aW9uSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5nZXQoY29uZGl0aW9uSW5kZXgpO1xuICAgIGlmICghdGVtcGxhdGUgfHwgIXRlbXBsYXRlLmh0bWxHcmFtbWFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGxldCB1cGRhdGVkR3JhbW1hciA9IHRlbXBsYXRlLmh0bWxHcmFtbWFyO1xuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZ2V0KGNvbmRpdGlvbkluZGV4KSB8fCBbXTtcbiAgICBcbiAgICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIGFjdHVhbCB2YWx1ZXNcbiAgICB2YXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlciA9IG5ldyBSZWdFeHAoYDxzcGFuW14+XSpkYXRhLWV2ZW50LWtleT1cIiR7dmFyaWFibGUubmFtZX1cIltePl0qPi4qPzwvc3Bhbj5gLCAnZ2knKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICAvLyBFc2NhcGUgSFRNTCBpbiB2YWx1ZSB0byBwcmV2ZW50IFhTU1xuICAgICAgY29uc3QgZXNjYXBlZFZhbHVlID0gU3RyaW5nKHZhbHVlKS5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG4gICAgICB1cGRhdGVkR3JhbW1hciA9IHVwZGF0ZWRHcmFtbWFyLnJlcGxhY2UocGxhY2Vob2xkZXIsIGVzY2FwZWRWYWx1ZSk7XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5jb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXIuc2V0KGNvbmRpdGlvbkluZGV4LCB1cGRhdGVkR3JhbW1hcik7XG4gIH1cblxuICBnZXRDb25kaXRpb25Gb3JtR3JvdXAoaW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlcGVhdGVkIGxvb2t1cHNcbiAgICBpZiAodGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5oYXMoaW5kZXgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5nZXQoaW5kZXgpITtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5jb25kaXRpb25zRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgaWYgKGZvcm1Hcm91cCkge1xuICAgICAgdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5zZXQoaW5kZXgsIGZvcm1Hcm91cCk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtR3JvdXA7XG4gIH1cbiAgXG4gIGdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZXRDb25kaXRpb25Gb3JtR3JvdXAoaW5kZXgpO1xuICAgIHJldHVybiBmb3JtR3JvdXA/LmdldCgnZmllbGQnKT8udmFsdWUgfHwgJyc7XG4gIH1cbiAgXG4gIGlzQ29uZGl0aW9uSWYoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXgpID09PSAnQ09ORElUSU9OX0lGJztcbiAgfVxuICBcbiAgaXNDb25kaXRpb25FbHNlSWYoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXgpID09PSAnQ09ORElUSU9OX0VMU0VfSUYnO1xuICB9XG4gIFxuICBnZXRDb25kaXRpb25MYWJlbChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5nZXRDb25kaXRpb25GaWVsZFZhbHVlKGluZGV4KTtcbiAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJ0NPTkRJVElPTl9JRicpIHJldHVybiAnSUYnO1xuICAgIGlmIChmaWVsZFZhbHVlID09PSAnQ09ORElUSU9OX0VMU0VfSUYnKSByZXR1cm4gJ0VMU0UgSUYnO1xuICAgIHJldHVybiAnRUxTRSc7XG4gIH1cbiAgXG4gIHRyYWNrQnlDb25kaXRpb25JbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBvbkluY2x1ZGVFbHNlQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmluY2x1ZGVFbHNlID0gY2hlY2tlZDtcbiAgICB0aGlzLmNvbmRpdGlvbkZvcm0ucGF0Y2hWYWx1ZSh7IGluY2x1ZGVFbHNlOiBjaGVja2VkIH0pO1xuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgb25DcmVhdGVTdGVwKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmRpdGlvbkZvcm0udmFsaWQpIHtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuY29uZGl0aW9uRm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IHN0ZXBEYXRhOiBDb25kaXRpb25Gb3JtRGF0YSA9IHtcbiAgICAgICAgY29uZGl0aW9uczogZm9ybVZhbHVlLmNvbmRpdGlvbnMubWFwKChjb25kOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAvLyBGaW5kIHRoZSBBY3Rpb25UZW1wbGF0ZSBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIElEL3ZhbHVlXG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVJZCA9IGNvbmQudmFsdWU7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVzLmZpbmQoXG4gICAgICAgICAgICB0ID0+ICh0LmlkPy50b1N0cmluZygpID09PSB0ZW1wbGF0ZUlkKSB8fCAodC5kaXNwbGF5TmFtZSA9PT0gdGVtcGxhdGVJZClcbiAgICAgICAgICApIHx8IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZXMuZ2V0KGluZGV4KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIGZvciB0aGlzIGNvbmRpdGlvblxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5nZXQoaW5kZXgpIHx8IFtdO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWVsZDogY29uZC5maWVsZCxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBjb25kLm9wZXJhdG9yLFxuICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkVGVtcGxhdGUgfHwgbnVsbCxcbiAgICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGVzOiB0ZW1wbGF0ZVZhcmlhYmxlcyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb25kLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGNvbmQubWV0YWRhdGEgfHwgJydcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICAgaW5jbHVkZUVsc2U6IGZvcm1WYWx1ZS5pbmNsdWRlRWxzZSB8fCBmYWxzZVxuICAgICAgfTtcbiAgICAgIGNvbnNvbGUubG9nKCdzdGVwRGF0YScsIHN0ZXBEYXRhKTtcbiAgICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktMlwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbWItNFwiPlxuICAgIENyZWF0ZSBDb25kaXRpb24gU3RlcFxuICA8L2gyPlxuXG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgPCEtLSBDb25kaXRpb24gQnVpbGRlciBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItNlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1tYi0zXCI+XG4gICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgQ29uZGl0aW9uIEJ1aWxkZXJcbiAgICAgIDwvaDM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDb25kaXRpb24gUm93cyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1tYi0zXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zRm9ybUFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Q29uZGl0aW9uSW5kZXhcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImlzQ29uZGl0aW9uSWYoaSkgfHwgaXNDb25kaXRpb25FbHNlSWYoaSlcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8IS0tIENvbmRpdGlvbiBSb3cgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPCEtLSBDb25kaXRpb24gTGFiZWwgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgICAgICB7eyBnZXRDb25kaXRpb25MYWJlbChpKSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIE9wZXJhdG9yIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1tYXgtdy1bMTAwcHhdIGNxYS10ZXh0LVsxMHB4XVwiPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Q29uZGl0aW9uRm9ybUdyb3VwKGkpXCIgW2NvbmZpZ109XCJnZXRPcGVyYXRvckNvbmZpZyhpKVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgPCEtLSBWYWx1ZSBUZW1wbGF0ZSBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LVsxNTBweF0gY3FhLXRleHQtWzEwcHhdXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRDb25kaXRpb25Gb3JtR3JvdXAoaSlcIiBbY29uZmlnXT1cImdldFZhbHVlQ29uZmlnKGkpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gUmVtb3ZlIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImkgPj0gMVwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInRleHRcIlxuICAgICAgICAgICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgICAgICAgICAgaWNvblBvc2l0aW9uPVwic3RhcnRcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb25kaXRpb24oaSlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZSBjb25kaXRpb24nXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctOCBjcWEtaC04IGNxYS1yb3VuZGVkIGNxYS10ZXh0LWdyYXktNTAwIGhvdmVyOmNxYS10ZXh0LWdyYXktNzAwIGhvdmVyOmNxYS1iZy1ncmF5LTEwMCBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb25kaXRpb24oaSlcIiAqbmdJZj1cImkgPj0gMVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlIGNvbmRpdGlvbidcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1sZyBjcWEtdGV4dC1bMjRweF1cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFRlbXBsYXRlIFZhcmlhYmxlcyBTZWN0aW9uIChzaG93biB3aGVuIHRlbXBsYXRlIGlzIHNlbGVjdGVkKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnZXRTZWxlY3RlZFRlbXBsYXRlKGkpXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICAgICAgICA8IS0tIFRlbXBsYXRlIEdyYW1tYXIgRGlzcGxheSAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tYi00IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTEgY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS03MDBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFjdGlvbi1mb3JtYXQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyM3B4XSBjcWEtdGV4dC1ibGFjay0xMDBcIlxuICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJnZXRTZWxlY3RlZFRlbXBsYXRlKGkpPy5odG1sR3JhbW1hciB8fCBnZXRTZWxlY3RlZFRlbXBsYXRlKGkpPy5uYXR1cmFsVGV4dCB8fCAnJ1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDwhLS0gVGVtcGxhdGUgVmFyaWFibGVzIEZvcm0gQ29tcG9uZW50IChpbmNsdWRlcyBEZXNjcmlwdGlvbiBhbmQgTWV0YWRhdGEpIC0tPlxuICAgICAgICAgICAgICA8Y3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIlxuICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZVZhcmlhYmxlc109XCJnZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhpKVwiXG4gICAgICAgICAgICAgICAgW3ZhcmlhYmxlc0Zvcm1dPVwiZ2V0Q29uZGl0aW9uVmFyaWFibGVzRm9ybShpKVwiXG4gICAgICAgICAgICAgICAgW21ldGFkYXRhXT1cImdldENvbmRpdGlvbkZvcm1Hcm91cChpKS5nZXQoJ21ldGFkYXRhJyk/LnZhbHVlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZ2V0Q29uZGl0aW9uRm9ybUdyb3VwKGkpLmdldCgnZGVzY3JpcHRpb24nKT8udmFsdWUgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtlbGVtZW50T3B0aW9uc109XCJlbGVtZW50T3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW2hhc01vcmVFbGVtZW50c109XCJoYXNNb3JlRWxlbWVudHNcIlxuICAgICAgICAgICAgICAgIFtpc0xvYWRpbmdFbGVtZW50c109XCJpc0xvYWRpbmdFbGVtZW50c1wiXG4gICAgICAgICAgICAgICAgW3NjcmVlbk5hbWVPcHRpb25zXT1cInNjcmVlbk5hbWVPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBbaGFzTW9yZVNjcmVlbk5hbWVzXT1cImhhc01vcmVTY3JlZW5OYW1lc1wiXG4gICAgICAgICAgICAgICAgW2lzTG9hZGluZ1NjcmVlbk5hbWVzXT1cImlzTG9hZGluZ1NjcmVlbk5hbWVzXCJcbiAgICAgICAgICAgICAgICBbcGFyYW1ldGVyT3B0aW9uc109XCJwYXJhbWV0ZXJPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBbaGFzTW9yZVBhcmFtZXRlcnNdPVwiaGFzTW9yZVBhcmFtZXRlcnNcIlxuICAgICAgICAgICAgICAgIFtpc0xvYWRpbmdQYXJhbWV0ZXJzXT1cImlzTG9hZGluZ1BhcmFtZXRlcnNcIlxuICAgICAgICAgICAgICAgIFtlbnZpcm9ubWVudE9wdGlvbnNdPVwiZW52aXJvbm1lbnRPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBbaGFzTW9yZUVudmlyb25tZW50c109XCJoYXNNb3JlRW52aXJvbm1lbnRzXCJcbiAgICAgICAgICAgICAgICBbaXNMb2FkaW5nRW52aXJvbm1lbnRzXT1cImlzTG9hZGluZ0Vudmlyb25tZW50c1wiXG4gICAgICAgICAgICAgICAgW2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZF09XCJkZWZhdWx0VGVzdERhdGFQcm9maWxlSWRcIlxuICAgICAgICAgICAgICAgIFtkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XT1cImRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhcIlxuICAgICAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQ29uZGl0aW9uVmFyaWFibGVWYWx1ZUNoYW5nZShpLCAkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgKHZhcmlhYmxlQm9vbGVhbkNoYW5nZSk9XCJvbkNvbmRpdGlvblZhcmlhYmxlQm9vbGVhbkNoYW5nZShpLCAkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgKG1ldGFkYXRhQ2hhbmdlKT1cImdldENvbmRpdGlvbkZvcm1Hcm91cChpKS5nZXQoJ21ldGFkYXRhJyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCJnZXRDb25kaXRpb25Gb3JtR3JvdXAoaSkuZ2V0KCdkZXNjcmlwdGlvbicpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobG9hZE1vcmVFbGVtZW50cyk9XCJsb2FkTW9yZUVsZW1lbnRzLmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaEVsZW1lbnRzKT1cInNlYXJjaEVsZW1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNyZWF0ZUVsZW1lbnQpPVwiY3JlYXRlRWxlbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hTY3JlZW5OYW1lKT1cInNlYXJjaFNjcmVlbk5hbWUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobG9hZE1vcmVTY3JlZW5OYW1lcyk9XCJsb2FkTW9yZVNjcmVlbk5hbWVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaFBhcmFtZXRlcnMpPVwic2VhcmNoUGFyYW1ldGVycy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChsb2FkTW9yZVBhcmFtZXRlcnMpPVwibG9hZE1vcmVQYXJhbWV0ZXJzLmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaEVudmlyb25tZW50cyk9XCJzZWFyY2hFbnZpcm9ubWVudHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobG9hZE1vcmVFbnZpcm9ubWVudHMpPVwibG9hZE1vcmVFbnZpcm9ubWVudHMuZW1pdCgpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQWRkIENvbmRpdGlvbiBCdXR0b24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItZ3JheS0zMDAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtbXQtM1wiPlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICBpY29uUG9zaXRpb249XCJzdGFydFwiXG4gICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW3RleHRdPVwiJ0FkZCBDb25kaXRpb24nXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJhZGRDb25kaXRpb24oJ0NPTkRJVElPTl9FTFNFX0lGJylcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEluY2x1ZGUgRUxTRSBCcmFuY2ggU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1tYi02IGNxYS1wLTMgY3FhLWJnLWdyYXktNTAgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWdyYXktOTAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgSW5jbHVkZSBFTFNFIGJyYW5jaFxuICAgICAgICA8L2gzPlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICAgIEV4ZWN1dGUgYWx0ZXJuYXRpdmUgc3RlcHMgd2hlbiBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbY2hlY2tlZF09XCJpbmNsdWRlRWxzZVwiIChjaGFuZ2UpPVwib25JbmNsdWRlRWxzZUNoYW5nZSgkZXZlbnQuY2hlY2tlZClcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtbXQtYXV0byBjcWEtcHQtNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgdGV4dD1cIkNhbmNlbFwiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yXCIgdmFyaWFudD1cImZpbGxlZFwiIHRleHQ9XCJDcmVhdGUgU3RlcFwiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICBbZGlzYWJsZWRdPVwiIWNvbmRpdGlvbkZvcm0udmFsaWRcIlxuICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+Il19
615
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWNvbmRpdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItY29uZGl0aW9uL3N0ZXAtYnVpbGRlci1jb25kaXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWNvbmRpdGlvbi9zdGVwLWJ1aWxkZXItY29uZGl0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLHVCQUF1QixFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNySixPQUFPLEVBQXFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7QUFrQzVGLE1BQU0sT0FBTyw2QkFBNkI7SUErRXhDLFlBQW9CLEVBQWUsRUFBVSxHQUFzQjtRQUEvQyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE5RW5FLG9DQUFvQztRQUMzQixvQkFBZSxHQUFtQjtZQUN6QyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDbEUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO1lBQ2xGLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtZQUMxRSxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsS0FB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c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBR0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFHRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLDBCQUEwQjtzQkFBbkMsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBY3Rpb25UZW1wbGF0ZSB9IGZyb20gJy4uL3N0ZXAtYnVpbGRlci1hY3Rpb24vc3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQnO1xuXG4vLyBJbXBvcnQgRWxlbWVudCB0eXBlIC0gdXNpbmcgYW55IGZvciBub3cgc2luY2UgRWxlbWVudCBpcyBmcm9tIHRzLXBvcnRhbC11aVxuaW50ZXJmYWNlIEVsZW1lbnQge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBsb2NhdG9yVmFsdWU/OiBzdHJpbmc7XG4gIG90aGVyTG9jYXRvcj86IHN0cmluZ1tdO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uUm93IHtcbiAgZmllbGQ6IHN0cmluZztcbiAgb3BlcmF0b3I6IHN0cmluZztcbiAgdmFsdWU6IEFjdGlvblRlbXBsYXRlO1xuICB0ZW1wbGF0ZVZhcmlhYmxlcz86IGFueVtdO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uRm9ybURhdGEge1xuICBjb25kaXRpb25zOiBDb25kaXRpb25Sb3dbXTtcbiAgaW5jbHVkZUVsc2U6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWJ1aWxkZXItY29uZGl0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtYnVpbGRlci1jb25kaXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBCdWlsZGVyQ29uZGl0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogT3B0aW9ucyBmb3Igb3BlcmF0b3IgZHJvcGRvd24gKi9cbiAgQElucHV0KCkgb3BlcmF0b3JPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnZXF1YWxzJywgdmFsdWU6ICdlcXVhbHMnLCBuYW1lOiAnZXF1YWxzJywgbGFiZWw6ICdlcXVhbHMnIH0sXG4gICAgeyBpZDogJ25vdF9lcXVhbHMnLCB2YWx1ZTogJ25vdF9lcXVhbHMnLCBuYW1lOiAnbm90IGVxdWFscycsIGxhYmVsOiAnbm90IGVxdWFscycgfSxcbiAgICB7IGlkOiAnY29udGFpbnMnLCB2YWx1ZTogJ2NvbnRhaW5zJywgbmFtZTogJ2NvbnRhaW5zJywgbGFiZWw6ICdjb250YWlucycgfSxcbiAgICB7IGlkOiAnbm90X2NvbnRhaW5zJywgdmFsdWU6ICdub3RfY29udGFpbnMnLCBuYW1lOiAnbm90IGNvbnRhaW5zJywgbGFiZWw6ICdub3QgY29udGFpbnMnIH0sXG4gICAgeyBpZDogJ2dyZWF0ZXJfdGhhbicsIHZhbHVlOiAnZ3JlYXRlcl90aGFuJywgbmFtZTogJ2dyZWF0ZXIgdGhhbicsIGxhYmVsOiAnZ3JlYXRlciB0aGFuJyB9LFxuICAgIHsgaWQ6ICdsZXNzX3RoYW4nLCB2YWx1ZTogJ2xlc3NfdGhhbicsIG5hbWU6ICdsZXNzIHRoYW4nLCBsYWJlbDogJ2xlc3MgdGhhbicgfVxuICBdO1xuXG4gIC8qKiBMaXN0IG9mIGFjdGlvbiB0ZW1wbGF0ZXMgdG8gZGlzcGxheSBpbiB2YWx1ZSBkcm9wZG93biAqL1xuICBASW5wdXQoKSBjb25kaXRpb25UZW1wbGF0ZXM6IEFjdGlvblRlbXBsYXRlW10gPSBbXTtcbiAgLyoqIEZ1bmN0aW9uIHRvIGhhbmRsZSB2YXJpYWJsZSBwcm9jZXNzaW5nIG9yIGN1c3RvbSBsb2dpYy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzOiAodmFyaWFibGVzOiBBY3Rpb25UZW1wbGF0ZSkgPT4gYW55ID0gKCkgPT4geyByZXR1cm4gW119O1xuICBASW5wdXQoKSBlbGVtZW50T3B0aW9uczogRWxlbWVudFtdID0gW107IC8vIEVsZW1lbnQgb2JqZWN0cyBmb3IgZWxlbWVudCBkcm9wZG93blxuICBASW5wdXQoKSBoYXNNb3JlRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gV2hldGhlciBtb3JlIGVsZW1lbnRzIGFyZSBhdmFpbGFibGVcbiAgQElucHV0KCkgaXNMb2FkaW5nRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gTG9hZGluZyBzdGF0ZSBmb3IgZWxlbWVudHNcbiAgLyoqIFNjcmVlbiBuYW1lIG9wdGlvbnMgZm9yIGVsZW1lbnQgZm9ybSBhdXRvY29tcGxldGUgKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSBzY3JlZW5OYW1lT3B0aW9uczogeyBpZD86IG51bWJlcjsgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogV2hldGhlciBtb3JlIHNjcmVlbiBuYW1lcyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVNjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHNjcmVlbiBuYW1lcyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8qKiBQYXJhbWV0ZXIgZmV0Y2hpbmcgcHJvcGVydGllcyAqL1xuICBASW5wdXQoKSBwYXJhbWV0ZXJPcHRpb25zOiBhbnlbXSA9IFtdOyAvLyBUZXN0RGF0YVtdIC0gcmF3IHRlc3QgZGF0YSBwcm9maWxlc1xuICBASW5wdXQoKSBoYXNNb3JlUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0xvYWRpbmdQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKiogRW52aXJvbm1lbnQgZmV0Y2hpbmcgcHJvcGVydGllcyAqL1xuICBASW5wdXQoKSBlbnZpcm9ubWVudE9wdGlvbnM6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBlbnZpcm9ubWVudDogc3RyaW5nIH1bXSA9IFtdO1xuICBASW5wdXQoKSBoYXNNb3JlRW52aXJvbm1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ0Vudmlyb25tZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgcHJvcGVydGllcyAqL1xuICBASW5wdXQoKSBkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQ/OiBudW1iZXI7XG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXg/OiBudW1iZXI7XG5cbiAgLyoqIEVtaXQgd2hlbiBzdGVwIGlzIGNyZWF0ZWQgKi9cbiAgQE91dHB1dCgpIGNyZWF0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPENvbmRpdGlvbkZvcm1EYXRhPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gbG9hZCBtb3JlIGlzIHJlcXVlc3RlZFxuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVsZW1lbnRzXG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzY3JlZW5OYW1lSWQ6IG51bWJlcjsgc2VhcmNoVGVybT86IHN0cmluZyB9PigpOyAvLyBFbWl0IHdoZW4gc2NyZWVuIG5hbWUgaXMgc2VsZWN0ZWQgdG8gZmV0Y2ggZWxlbWVudHMgZmlsdGVyZWQgYnkgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIGNyZWF0ZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgaXMgY3JlYXRlZFxuICBAT3V0cHV0KCkgc2VhcmNoU2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGxvYWRNb3JlU2NyZWVuTmFtZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciByZXF1ZXN0cyB0byBjcmVhdGUgYSBuZXcgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIHNlYXJjaFBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIGxvYWRNb3JlUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgc2VhcmNoRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBlbnZpcm9ubWVudHNcbiAgQE91dHB1dCgpIGxvYWRNb3JlRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBlbnZpcm9ubWVudHNcbiAgQE91dHB1dCgpIHJlZGlyZWN0VG9QYXJhbWV0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWRpcmVjdFRvRW52aXJvbm1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgY29uZGl0aW9uRm9ybTogRm9ybUdyb3VwO1xuICBpbmNsdWRlRWxzZTogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHZhbHVlIGNvbmZpZ3MgdG8gYXZvaWQgcmVjcmVhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gIHByaXZhdGUgdmFsdWVDb25maWdDYWNoZTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvLyBDYWNoZSBmb3Igb3BlcmF0b3IgY29uZmlncyAoc3RhdGljLCBubyBuZWVkIHRvIHJlY3JlYXRlKVxuICBwcml2YXRlIG9wZXJhdG9yQ29uZmlnQ2FjaGU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHZhbHVlIGNvbmZpZ3Mgd2l0aCBvbkNoYW5nZSBoYW5kbGVycyBwZXIgaW5kZXhcbiAgcHJpdmF0ZSB2YWx1ZUNvbmZpZ3NXaXRoSGFuZGxlcnM6IE1hcDxudW1iZXIsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBUcmFjayBzZWxlY3RlZCB0ZW1wbGF0ZXMgYW5kIHRoZWlyIHZhcmlhYmxlcyBmb3IgZWFjaCBjb25kaXRpb24gcm93XG4gIHByaXZhdGUgc2VsZWN0ZWRUZW1wbGF0ZXM6IE1hcDxudW1iZXIsIEFjdGlvblRlbXBsYXRlPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlczogTWFwPG51bWJlciwgYW55W10+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zOiBNYXA8bnVtYmVyLCBGb3JtQXJyYXk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hcjogTWFwPG51bWJlciwgc3RyaW5nPiA9IG5ldyBNYXAoKTsgLy8gVXBkYXRlZCBIVE1MIGdyYW1tYXIgcGVyIGNvbmRpdGlvblxuICBcbiAgLy8gQ2FjaGUgZm9yIGNvbmRpdGlvbiBmb3JtIGdyb3VwcyB0byBhdm9pZCByZXBlYXRlZCBsb29rdXBzXG4gIHByaXZhdGUgY29uZGl0aW9uRm9ybUdyb3VwQ2FjaGU6IE1hcDxudW1iZXIsIEZvcm1Hcm91cD4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHRoaXMuY29uZGl0aW9uRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgY29uZGl0aW9uczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgICBpbmNsdWRlRWxzZTogW2ZhbHNlXVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQWRkIGluaXRpYWwgY29uZGl0aW9uIHJvd1xuICAgIHRoaXMuYWRkQ29uZGl0aW9uKFwiQ09ORElUSU9OX0lGXCIpO1xuICAgIC8vIEluaXRpYWxpemUgY29uZmlnIGNhY2hlc1xuICAgIHRoaXMudXBkYXRlVmFsdWVDb25maWdDYWNoZSgpO1xuICAgIHRoaXMudXBkYXRlT3BlcmF0b3JDb25maWdDYWNoZSgpO1xuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIFJlZ2VuZXJhdGUgdmFsdWUgY29uZmlnIGNhY2hlIHdoZW4gY29uZGl0aW9uVGVtcGxhdGVzIGNoYW5nZXNcbiAgICBpZiAoY2hhbmdlc1snY29uZGl0aW9uVGVtcGxhdGVzJ10gJiYgIWNoYW5nZXNbJ2NvbmRpdGlvblRlbXBsYXRlcyddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlQ29uZmlnQ2FjaGUoKTtcbiAgICAgIC8vIENsZWFyIHZhbHVlIGNvbmZpZ3Mgd2l0aCBoYW5kbGVycyBzaW5jZSBiYXNlIGNvbmZpZyBjaGFuZ2VkXG4gICAgICB0aGlzLnZhbHVlQ29uZmlnc1dpdGhIYW5kbGVycy5jbGVhcigpO1xuICAgIH1cbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSB1cGRhdGVPcGVyYXRvckNvbmZpZ0NhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMub3BlcmF0b3JDb25maWdDYWNoZSA9IHtcbiAgICAgIGtleTogJ29wZXJhdG9yJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IG9wZXJhdG9yJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5vcGVyYXRvck9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgZ2V0IGNvbmRpdGlvbnNGb3JtQXJyYXkoKTogRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25Gb3JtLmdldCgnY29uZGl0aW9ucycpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIGFkZENvbmRpdGlvbihjb25kaXRpb25UeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb25kaXRpb25Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZmllbGQ6IFtjb25kaXRpb25UeXBlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIG9wZXJhdG9yOiBbJ2VxdWFscycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgdmFsdWU6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSwgLy8gV2lsbCBzdG9yZSB0ZW1wbGF0ZSBJRCwgdGhlbiBtYXAgdG8gQWN0aW9uVGVtcGxhdGVcbiAgICAgIGRlc2NyaXB0aW9uOiBbJyddLFxuICAgICAgbWV0YWRhdGE6IFsnJ10sXG4gICAgfSk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmNvbmRpdGlvbnNGb3JtQXJyYXkubGVuZ3RoO1xuICAgIHRoaXMuY29uZGl0aW9uc0Zvcm1BcnJheS5wdXNoKGNvbmRpdGlvbkdyb3VwKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3JtIGZvciB0aGlzIGNvbmRpdGlvbiAoRm9ybUFycmF5KVxuICAgIHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuc2V0KGluZGV4LCB0aGlzLmZiLmFycmF5KFtdKSk7XG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIGZvcm0gZ3JvdXBcbiAgICB0aGlzLmNvbmRpdGlvbkZvcm1Hcm91cENhY2hlLnNldChpbmRleCwgY29uZGl0aW9uR3JvdXApO1xuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVtb3ZlQ29uZGl0aW9uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25kaXRpb25zRm9ybUFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uc0Zvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gICAgICAvLyBDbGVhbiB1cCBhc3NvY2lhdGVkIGRhdGFcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZXMuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY29uZGl0aW9uRm9ybUdyb3VwQ2FjaGUuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMudmFsdWVDb25maWdzV2l0aEhhbmRsZXJzLmRlbGV0ZShpbmRleCk7XG4gICAgICBcbiAgICAgIC8vIFJlaW5kZXggcmVtYWluaW5nIGNvbmRpdGlvbnNcbiAgICAgIHRoaXMucmVpbmRleENvbmRpdGlvbkRhdGEoaW5kZXgpO1xuICAgICAgXG4gICAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSByZWluZGV4Q29uZGl0aW9uRGF0YShyZW1vdmVkSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBuZXcgbWFwcyB3aXRoIHJlaW5kZXhlZCBkYXRhXG4gICAgY29uc3QgbmV3U2VsZWN0ZWRUZW1wbGF0ZXMgPSBuZXcgTWFwPG51bWJlciwgQWN0aW9uVGVtcGxhdGU+KCk7XG4gICAgY29uc3QgbmV3VGVtcGxhdGVWYXJpYWJsZXMgPSBuZXcgTWFwPG51bWJlciwgYW55W10+KCk7XG4gICAgY29uc3QgbmV3VmFyaWFibGVzRm9ybXMgPSBuZXcgTWFwPG51bWJlciwgRm9ybUFycmF5PigpO1xuICAgIGNvbnN0IG5ld0Zvcm1Hcm91cENhY2hlID0gbmV3IE1hcDxudW1iZXIsIEZvcm1Hcm91cD4oKTtcbiAgICBjb25zdCBuZXdWYWx1ZUNvbmZpZ3MgPSBuZXcgTWFwPG51bWJlciwgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPigpO1xuICAgIGNvbnN0IG5ld1VwZGF0ZWRIdG1sR3JhbW1hciA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgXG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5mb3JFYWNoKCh0ZW1wbGF0ZSwgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdTZWxlY3RlZFRlbXBsYXRlcy5zZXQob2xkSW5kZXgsIHRlbXBsYXRlKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3U2VsZWN0ZWRUZW1wbGF0ZXMuc2V0KG9sZEluZGV4IC0gMSwgdGVtcGxhdGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGVzLCBvbGRJbmRleCkgPT4ge1xuICAgICAgaWYgKG9sZEluZGV4IDwgcmVtb3ZlZEluZGV4KSB7XG4gICAgICAgIG5ld1RlbXBsYXRlVmFyaWFibGVzLnNldChvbGRJbmRleCwgdmFyaWFibGVzKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3VGVtcGxhdGVWYXJpYWJsZXMuc2V0KG9sZEluZGV4IC0gMSwgdmFyaWFibGVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLmZvckVhY2goKGZvcm0sIG9sZEluZGV4KSA9PiB7XG4gICAgICBpZiAob2xkSW5kZXggPCByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3VmFyaWFibGVzRm9ybXMuc2V0KG9sZEluZGV4LCBmb3JtKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3VmFyaWFibGVzRm9ybXMuc2V0KG9sZEluZGV4IC0gMSwgZm9ybSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5mb3JFYWNoKChmb3JtR3JvdXAsIG9sZEluZGV4KSA9PiB7XG4gICAgICBpZiAob2xkSW5kZXggPCByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3Rm9ybUdyb3VwQ2FjaGUuc2V0KG9sZEluZGV4LCBmb3JtR3JvdXApO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdGb3JtR3JvdXBDYWNoZS5zZXQob2xkSW5kZXggLSAxLCBmb3JtR3JvdXApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMudmFsdWVDb25maWdzV2l0aEhhbmRsZXJzLmZvckVhY2goKGNvbmZpZywgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdWYWx1ZUNvbmZpZ3Muc2V0KG9sZEluZGV4LCBjb25maWcpO1xuICAgICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IHJlbW92ZWRJbmRleCkge1xuICAgICAgICAvLyBSZWNyZWF0ZSBjb25maWcgd2l0aCBuZXcgaW5kZXggZm9yIG9uQ2hhbmdlIGhhbmRsZXJcbiAgICAgICAgY29uc3QgbmV3Q29uZmlnID0ge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25UZW1wbGF0ZVZhbHVlQ2hhbmdlKG9sZEluZGV4IC0gMSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbmV3VmFsdWVDb25maWdzLnNldChvbGRJbmRleCAtIDEsIG5ld0NvbmZpZyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5jb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXIuZm9yRWFjaCgoZ3JhbW1hciwgb2xkSW5kZXgpID0+IHtcbiAgICAgIGlmIChvbGRJbmRleCA8IHJlbW92ZWRJbmRleCkge1xuICAgICAgICBuZXdVcGRhdGVkSHRtbEdyYW1tYXIuc2V0KG9sZEluZGV4LCBncmFtbWFyKTtcbiAgICAgIH0gZWxzZSBpZiAob2xkSW5kZXggPiByZW1vdmVkSW5kZXgpIHtcbiAgICAgICAgbmV3VXBkYXRlZEh0bWxHcmFtbWFyLnNldChvbGRJbmRleCAtIDEsIGdyYW1tYXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZXMgPSBuZXdTZWxlY3RlZFRlbXBsYXRlcztcbiAgICB0aGlzLmNvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzID0gbmV3VGVtcGxhdGVWYXJpYWJsZXM7XG4gICAgdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3JtcyA9IG5ld1ZhcmlhYmxlc0Zvcm1zO1xuICAgIHRoaXMuY29uZGl0aW9uRm9ybUdyb3VwQ2FjaGUgPSBuZXdGb3JtR3JvdXBDYWNoZTtcbiAgICB0aGlzLnZhbHVlQ29uZmlnc1dpdGhIYW5kbGVycyA9IG5ld1ZhbHVlQ29uZmlncztcbiAgICB0aGlzLmNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hciA9IG5ld1VwZGF0ZWRIdG1sR3JhbW1hcjtcbiAgfVxuXG4gIGdldE9wZXJhdG9yQ29uZmlnKGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIFJldHVybiBjYWNoZWQgY29uZmlnIChzdGF0aWMsIHNhbWUgZm9yIGFsbCBjb25kaXRpb25zKVxuICAgIGlmICghdGhpcy5vcGVyYXRvckNvbmZpZ0NhY2hlKSB7XG4gICAgICB0aGlzLnVwZGF0ZU9wZXJhdG9yQ29uZmlnQ2FjaGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3BlcmF0b3JDb25maWdDYWNoZSE7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZhbHVlQ29uZmlnQ2FjaGUoKTogdm9pZCB7XG4gICAgLy8gQ29udmVydCBBY3Rpb25UZW1wbGF0ZVtdIHRvIFNlbGVjdE9wdGlvbltdXG4gICAgY29uc3QgdGVtcGxhdGVPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9ICh0aGlzLmNvbmRpdGlvblRlbXBsYXRlcyB8fCBbXSkubWFwKHRlbXBsYXRlID0+ICh7XG4gICAgICBpZDogdGVtcGxhdGUuaWQ/LnRvU3RyaW5nKCkgfHwgdGVtcGxhdGUuZGlzcGxheU5hbWUgfHwgJycsXG4gICAgICB2YWx1ZTogdGVtcGxhdGUuaWQ/LnRvU3RyaW5nKCkgfHwgdGVtcGxhdGUuZGlzcGxheU5hbWUgfHwgJycsXG4gICAgICBuYW1lOiB0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJyxcbiAgICAgIGxhYmVsOiB0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJ1xuICAgIH0pKTtcblxuICAgIHRoaXMudmFsdWVDb25maWdDYWNoZSA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlbXBsYXRlKicsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZGlzcGxheUxhYmVsQXNJbm5lckh0bWw6IHRydWUsXG4gICAgICBvcHRpb25zOiB0ZW1wbGF0ZU9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgZ2V0VmFsdWVDb25maWcoaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBjb25maWcgd2l0aCBoYW5kbGVyIHRvIGF2b2lkIHJlY3JlYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIGlmICh0aGlzLnZhbHVlQ29uZmlnc1dpdGhIYW5kbGVycy5oYXMoaW5kZXgpKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZUNvbmZpZ3NXaXRoSGFuZGxlcnMuZ2V0KGluZGV4KSE7XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBiYXNlIGNvbmZpZyBjYWNoZSBleGlzdHNcbiAgICBpZiAoIXRoaXMudmFsdWVDb25maWdDYWNoZSkge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZUNvbmZpZ0NhY2hlKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSBhbmQgY2FjaGUgY29uZmlnIHdpdGggb25DaGFuZ2UgaGFuZGxlciBmb3IgdGhpcyBzcGVjaWZpYyBpbmRleFxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy52YWx1ZUNvbmZpZ0NhY2hlISxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uVGVtcGxhdGVWYWx1ZUNoYW5nZShpbmRleCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgdGhpcy52YWx1ZUNvbmZpZ3NXaXRoSGFuZGxlcnMuc2V0KGluZGV4LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgXG4gIG9uVGVtcGxhdGVWYWx1ZUNoYW5nZShpbmRleDogbnVtYmVyLCB0ZW1wbGF0ZUlkOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCB0ZW1wbGF0ZVxuICAgIGNvbnN0IHNlbGVjdGVkVGVtcGxhdGUgPSB0aGlzLmNvbmRpdGlvblRlbXBsYXRlcy5maW5kKFxuICAgICAgdCA9PiAodC5pZD8udG9TdHJpbmcoKSA9PT0gdGVtcGxhdGVJZCkgfHwgKHQuZGlzcGxheU5hbWUgPT09IHRlbXBsYXRlSWQpXG4gICAgKTtcbiAgICBcbiAgICBpZiAoc2VsZWN0ZWRUZW1wbGF0ZSAmJiB0aGlzLnNldENvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzKSB7XG4gICAgICAvLyBTdG9yZSBzZWxlY3RlZCB0ZW1wbGF0ZVxuICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5zZXQoaW5kZXgsIHNlbGVjdGVkVGVtcGxhdGUpO1xuICAgICAgXG4gICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5zZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhzZWxlY3RlZFRlbXBsYXRlKTtcbiAgICAgIHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuc2V0KGluZGV4LCB2YXJpYWJsZXMpO1xuICAgICAgLy8gQnVpbGQgZm9ybSBmb3IgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgICB0aGlzLmJ1aWxkQ29uZGl0aW9uVmFyaWFibGVzRm9ybShpbmRleCwgdmFyaWFibGVzKTtcbiAgICAgIC8vIEluaXRpYWxpemUgdXBkYXRlZCBIVE1MIGdyYW1tYXJcbiAgICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uSHRtbEdyYW1tYXIoaW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDbGVhciB0ZW1wbGF0ZSBhbmQgdmFyaWFibGVzIGlmIG5vIHRlbXBsYXRlIHNlbGVjdGVkXG4gICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVzLmRlbGV0ZShpbmRleCk7XG4gICAgICB0aGlzLmNvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzLmRlbGV0ZShpbmRleCk7XG4gICAgICB0aGlzLmNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hci5kZWxldGUoaW5kZXgpO1xuICAgICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5nZXQoaW5kZXgpO1xuICAgICAgaWYgKGZvcm1BcnJheSkge1xuICAgICAgICB3aGlsZSAoZm9ybUFycmF5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIGZvcm1BcnJheS5yZW1vdmVBdCgwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBidWlsZENvbmRpdGlvblZhcmlhYmxlc0Zvcm0oaW5kZXg6IG51bWJlciwgdmFyaWFibGVzOiBhbnlbXSk6IHZvaWQge1xuICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLmdldChpbmRleCk7XG4gICAgaWYgKCFmb3JtQXJyYXkpIHtcbiAgICAgIGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoW10pO1xuICAgICAgdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5zZXQoaW5kZXgsIGZvcm1BcnJheSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBmb3JtQXJyYXkgaXMgbm90IHVuZGVmaW5lZCAoVHlwZVNjcmlwdCBndWFyZClcbiAgICBpZiAoIWZvcm1BcnJheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBTdG9yZSByZWZlcmVuY2UgdG8gYXZvaWQgVHlwZVNjcmlwdCBpc3N1ZXMgaW4gZm9yRWFjaCBjYWxsYmFja1xuICAgIC8vIFR5cGVTY3JpcHQga25vd3MgZm9ybUFycmF5IGlzIGRlZmluZWQgaGVyZSBkdWUgdG8gdGhlIGVhcmx5IHJldHVybiBhYm92ZVxuICAgIGNvbnN0IGZvcm1BcnJheVJlZjogRm9ybUFycmF5ID0gZm9ybUFycmF5O1xuICAgIFxuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAoZm9ybUFycmF5UmVmLmxlbmd0aCAhPT0gMCkge1xuICAgICAgZm9ybUFycmF5UmVmLnJlbW92ZUF0KDApO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgZm9ybSBncm91cHMgZm9yIGVhY2ggdmFyaWFibGVcbiAgICB2YXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiB2YXJpYWJsZXMgLSB1c2UgYm9vbGVhbiB2YWx1ZSwgb3RoZXJzIHVzZSBzdHJpbmdcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYSBGb3JtR3JvdXAgZm9yIGVhY2ggdmFyaWFibGUgd2l0aCBuYW1lIGFuZCB2YWx1ZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbZGVmYXVsdFZhbHVlXSxcbiAgICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXSxcbiAgICAgICAgb3B0aW9uczogW3ZhcmlhYmxlLm9wdGlvbnMgfHwgW11dXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gQWRkIGRhdGFUeXBlIGNvbnRyb2wgZm9yIHRlc3QtZGF0YSB2YXJpYWJsZXMgaWYgbmVlZGVkXG4gICAgICBjb25zdCBsYWJlbCA9IHZhcmlhYmxlLmxhYmVsPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGxhYmVsID09PSAndGVzdC1kYXRhJyB8fCBsYWJlbCA9PT0gJ3NvdXJjZS12YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXQtdmFsdWUnIHx8IFxuICAgICAgICAgIGxhYmVsID09PSAnc291cmNlX3ZhbHVlJyB8fCBsYWJlbCA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgLy8gUGFyc2UgdGhlIHZhbHVlIHRvIGRldGVybWluZSBkYXRhIHR5cGVcbiAgICAgICAgY29uc3QgdmFsdWVTdHIgPSBTdHJpbmcoZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICAgICAgbGV0IGRhdGFUeXBlID0gJ3BsYWluLXRleHQnO1xuICAgICAgICBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnQHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgICAgZGF0YVR5cGUgPSAncGFyYW1ldGVyJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdydW50aW1lJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCcqfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdlbnZpcm9ubWVudCc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChkYXRhVHlwZSkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBmb3JtQXJyYXlSZWYucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHVwZGF0ZWQgSFRNTCBncmFtbWFyIGZvciB0aGlzIGNvbmRpdGlvblxuICAgIHRoaXMudXBkYXRlQ29uZGl0aW9uSHRtbEdyYW1tYXIoaW5kZXgpO1xuICB9XG4gIFxuICBnZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhpbmRleDogbnVtYmVyKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblRlbXBsYXRlVmFyaWFibGVzLmdldChpbmRleCkgfHwgW107XG4gIH1cbiAgXG4gIGdldENvbmRpdGlvblZhcmlhYmxlc0Zvcm0oaW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XG4gICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZ2V0KGluZGV4KTtcbiAgICBpZiAoIWZvcm1BcnJheSkge1xuICAgICAgZm9ybUFycmF5ID0gdGhpcy5mYi5hcnJheShbXSk7XG4gICAgICB0aGlzLmNvbmRpdGlvblZhcmlhYmxlc0Zvcm1zLnNldChpbmRleCwgZm9ybUFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1BcnJheTtcbiAgfVxuICBcbiAgZ2V0Q29uZGl0aW9uRm9ybUdyb3VwQXQoaW5kZXg6IG51bWJlciwgdmFyaWFibGVJbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmdldENvbmRpdGlvblZhcmlhYmxlc0Zvcm0oaW5kZXgpO1xuICAgIHJldHVybiBmb3JtQXJyYXkuYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICB9XG4gIFxuICBnZXRDb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXIoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnNlbGVjdGVkVGVtcGxhdGVzLmdldChpbmRleCk7XG4gICAgaWYgKCF0ZW1wbGF0ZSkgcmV0dXJuICcnO1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblVwZGF0ZWRIdG1sR3JhbW1hci5nZXQoaW5kZXgpIHx8IHRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnO1xuICB9XG4gIFxuICBnZXRTZWxlY3RlZFRlbXBsYXRlKGluZGV4OiBudW1iZXIpOiBBY3Rpb25UZW1wbGF0ZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGVtcGxhdGVzLmdldChpbmRleCkgfHwgbnVsbDtcbiAgfVxuICBcbiAgZ2V0U2VsZWN0Q29uZmlnRm9yVmFyaWFibGUoaW5kZXg6IG51bWJlciwgdmFyaWFibGU6IGFueSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAodmFyaWFibGUub3B0aW9ucyB8fCBbXSkubWFwKChvcHQ6IHN0cmluZykgPT4gKHtcbiAgICAgIGlkOiBvcHQsXG4gICAgICB2YWx1ZTogb3B0LFxuICAgICAgbmFtZTogb3B0LFxuICAgICAgbGFiZWw6IG9wdFxuICAgIH0pKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IHZhcmlhYmxlLm5hbWUsXG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCAke3ZhcmlhYmxlLmxhYmVsfWAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkNvbmRpdGlvblZhcmlhYmxlVmFsdWVDaGFuZ2UoaW5kZXgsIHZhcmlhYmxlLm5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIFxuICBvbkNvbmRpdGlvblZhcmlhYmxlVmFsdWVDaGFuZ2UoY29uZGl0aW9uSW5kZXg6IG51bWJlciwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5nZXQoY29uZGl0aW9uSW5kZXgpIHx8IFtdO1xuICAgIGNvbnN0IHZhcmlhYmxlID0gdmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGFycmF5XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5jb25kaXRpb25WYXJpYWJsZXNGb3Jtcy5nZXQoY29uZGl0aW9uSW5kZXgpO1xuICAgIGlmIChmb3JtQXJyYXkpIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSBmb3JtQXJyYXkuY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZm9ybUFycmF5LmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIEhUTUwgZ3JhbW1hciBmb3IgdGhpcyBjb25kaXRpb25cbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvbkh0bWxHcmFtbWFyKGNvbmRpdGlvbkluZGV4KTtcbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgb25Db25kaXRpb25WYXJpYWJsZUlucHV0Q2hhbmdlKGNvbmRpdGlvbkluZGV4OiBudW1iZXIsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZ2V0KGNvbmRpdGlvbkluZGV4KSB8fCBbXTtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZ2V0KGNvbmRpdGlvbkluZGV4KTtcbiAgICBpZiAoZm9ybSAmJiBmb3JtLmdldCh2YXJpYWJsZU5hbWUpKSB7XG4gICAgICBmb3JtLmdldCh2YXJpYWJsZU5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25Db25kaXRpb25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UoY29uZGl0aW9uSW5kZXg6IG51bWJlciwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZ2V0KGNvbmRpdGlvbkluZGV4KSB8fCBbXTtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheVxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuY29uZGl0aW9uVmFyaWFibGVzRm9ybXMuZ2V0KGNvbmRpdGlvbkluZGV4KTtcbiAgICBpZiAoIWZvcm1BcnJheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gZm9ybUFycmF5LmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICBmb3JtQXJyYXkuYXQodmFyaWFibGVJbmRleCkuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IGZvcm0gZ3JvdXAgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGVOYW1lXSxcbiAgICAgICAgdmFsdWU6IFt2YWx1ZV0sXG4gICAgICAgIHR5cGU6IFsnYm9vbGVhbiddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlPy5sYWJlbCB8fCAnJ10sXG4gICAgICAgIG9wdGlvbnM6IFt2YXJpYWJsZT8ub3B0aW9ucyB8fCBbXV1cbiAgICAgIH0pO1xuICAgICAgLy8gZm9ybUFycmF5IGlzIGd1YXJhbnRlZWQgdG8gYmUgZGVmaW5lZCBoZXJlIGR1ZSB0byB0aGUgZWFybHkgcmV0dXJuIGFib3ZlXG4gICAgICBmb3JtQXJyYXkucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIEhUTUwgZ3JhbW1hciBmb3IgdGhpcyBjb25kaXRpb25cbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvbkh0bWxHcmFtbWFyKGNvbmRpdGlvbkluZGV4KTtcbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFN0cmlwIEhUTUwgdGFncyBmcm9tIGEgc3RyaW5nIGZvciBzZWFyY2ggZnVuY3Rpb25hbGl0eVxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpcEh0bWxUYWdzKGh0bWxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFodG1sU3RyaW5nKSByZXR1cm4gJyc7XG4gICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpdiBlbGVtZW50IHRvIHBhcnNlIEhUTUxcbiAgICBjb25zdCB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICB0bXAuaW5uZXJIVE1MID0gaHRtbFN0cmluZztcbiAgICByZXR1cm4gdG1wLnRleHRDb250ZW50IHx8IHRtcC5pbm5lclRleHQgfHwgJyc7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgSFRNTCBncmFtbWFyIGZvciBhIHNwZWNpZmljIGNvbmRpdGlvbiB3aXRoIGFjdHVhbCB2YXJpYWJsZSB2YWx1ZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29uZGl0aW9uSHRtbEdyYW1tYXIoY29uZGl0aW9uSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlcy5nZXQoY29uZGl0aW9uSW5kZXgpO1xuICAgIGlmICghdGVtcGxhdGUgfHwgIXRlbXBsYXRlLmh0bWxHcmFtbWFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGxldCB1cGRhdGVkR3JhbW1hciA9IHRlbXBsYXRlLmh0bWxHcmFtbWFyO1xuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVWYXJpYWJsZXMuZ2V0KGNvbmRpdGlvbkluZGV4KSB8fCBbXTtcbiAgICBcbiAgICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIGFjdHVhbCB2YWx1ZXNcbiAgICB2YXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlciA9IG5ldyBSZWdFeHAoYDxzcGFuW14+XSpkYXRhLWV2ZW50LWtleT1cIiR7dmFyaWFibGUubmFtZX1cIltePl0qPi4qPzwvc3Bhbj5gLCAnZ2knKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICAvLyBFc2NhcGUgSFRNTCBpbiB2YWx1ZSB0byBwcmV2ZW50IFhTU1xuICAgICAgY29uc3QgZXNjYXBlZFZhbHVlID0gU3RyaW5nKHZhbHVlKS5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG4gICAgICB1cGRhdGVkR3JhbW1hciA9IHVwZGF0ZWRHcmFtbWFyLnJlcGxhY2UocGxhY2Vob2xkZXIsIGVzY2FwZWRWYWx1ZSk7XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5jb25kaXRpb25VcGRhdGVkSHRtbEdyYW1tYXIuc2V0KGNvbmRpdGlvbkluZGV4LCB1cGRhdGVkR3JhbW1hcik7XG4gIH1cblxuICBnZXRDb25kaXRpb25Gb3JtR3JvdXAoaW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlcGVhdGVkIGxvb2t1cHNcbiAgICBpZiAodGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5oYXMoaW5kZXgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5nZXQoaW5kZXgpITtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5jb25kaXRpb25zRm9ybUFycmF5LmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgaWYgKGZvcm1Hcm91cCkge1xuICAgICAgdGhpcy5jb25kaXRpb25Gb3JtR3JvdXBDYWNoZS5zZXQoaW5kZXgsIGZvcm1Hcm91cCk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtR3JvdXA7XG4gIH1cbiAgXG4gIGdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZXRDb25kaXRpb25Gb3JtR3JvdXAoaW5kZXgpO1xuICAgIHJldHVybiBmb3JtR3JvdXA/LmdldCgnZmllbGQnKT8udmFsdWUgfHwgJyc7XG4gIH1cbiAgXG4gIGlzQ29uZGl0aW9uSWYoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXgpID09PSAnQ09ORElUSU9OX0lGJztcbiAgfVxuICBcbiAgaXNDb25kaXRpb25FbHNlSWYoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbkZpZWxkVmFsdWUoaW5kZXgpID09PSAnQ09ORElUSU9OX0VMU0VfSUYnO1xuICB9XG4gIFxuICBnZXRDb25kaXRpb25MYWJlbChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5nZXRDb25kaXRpb25GaWVsZFZhbHVlKGluZGV4KTtcbiAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJ0NPTkRJVElPTl9JRicpIHJldHVybiAnSUYnO1xuICAgIGlmIChmaWVsZFZhbHVlID09PSAnQ09ORElUSU9OX0VMU0VfSUYnKSByZXR1cm4gJ0VMU0UgSUYnO1xuICAgIHJldHVybiAnRUxTRSc7XG4gIH1cbiAgXG4gIHRyYWNrQnlDb25kaXRpb25JbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBvbkluY2x1ZGVFbHNlQ2hhbmdlKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmluY2x1ZGVFbHNlID0gY2hlY2tlZDtcbiAgICB0aGlzLmNvbmRpdGlvbkZvcm0ucGF0Y2hWYWx1ZSh7IGluY2x1ZGVFbHNlOiBjaGVja2VkIH0pO1xuICAgIFxuICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgb25DcmVhdGVTdGVwKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmRpdGlvbkZvcm0udmFsaWQpIHtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuY29uZGl0aW9uRm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IHN0ZXBEYXRhOiBDb25kaXRpb25Gb3JtRGF0YSA9IHtcbiAgICAgICAgY29uZGl0aW9uczogZm9ybVZhbHVlLmNvbmRpdGlvbnMubWFwKChjb25kOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAvLyBGaW5kIHRoZSBBY3Rpb25UZW1wbGF0ZSBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIElEL3ZhbHVlXG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVJZCA9IGNvbmQudmFsdWU7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuY29uZGl0aW9uVGVtcGxhdGVzLmZpbmQoXG4gICAgICAgICAgICB0ID0+ICh0LmlkPy50b1N0cmluZygpID09PSB0ZW1wbGF0ZUlkKSB8fCAodC5kaXNwbGF5TmFtZSA9PT0gdGVtcGxhdGVJZClcbiAgICAgICAgICApIHx8IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZXMuZ2V0KGluZGV4KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBHZXQgdGVtcGxhdGUgdmFyaWFibGVzIGZvciB0aGlzIGNvbmRpdGlvblxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5jb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcy5nZXQoaW5kZXgpIHx8IFtdO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWVsZDogY29uZC5maWVsZCxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBjb25kLm9wZXJhdG9yLFxuICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkVGVtcGxhdGUgfHwgbnVsbCxcbiAgICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGVzOiB0ZW1wbGF0ZVZhcmlhYmxlcyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb25kLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGNvbmQubWV0YWRhdGEgfHwgJydcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICAgaW5jbHVkZUVsc2U6IGZvcm1WYWx1ZS5pbmNsdWRlRWxzZSB8fCBmYWxzZVxuICAgICAgfTtcbiAgICAgIGNvbnNvbGUubG9nKCdzdGVwRGF0YScsIHN0ZXBEYXRhKTtcbiAgICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktMlwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbWItNFwiPlxuICAgIENyZWF0ZSBDb25kaXRpb24gU3RlcFxuICA8L2gyPlxuXG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgPCEtLSBDb25kaXRpb24gQnVpbGRlciBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItNlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1tYi0zXCI+XG4gICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgQ29uZGl0aW9uIEJ1aWxkZXJcbiAgICAgIDwvaDM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDb25kaXRpb24gUm93cyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1tYi0zXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zRm9ybUFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Q29uZGl0aW9uSW5kZXhcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImlzQ29uZGl0aW9uSWYoaSkgfHwgaXNDb25kaXRpb25FbHNlSWYoaSlcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8IS0tIENvbmRpdGlvbiBSb3cgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPCEtLSBDb25kaXRpb24gTGFiZWwgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgICAgICB7eyBnZXRDb25kaXRpb25MYWJlbChpKSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIE9wZXJhdG9yIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1tYXgtdy1bMTAwcHhdIGNxYS10ZXh0LVsxMHB4XVwiPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Q29uZGl0aW9uRm9ybUdyb3VwKGkpXCIgW2NvbmZpZ109XCJnZXRPcGVyYXRvckNvbmZpZyhpKVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgPCEtLSBWYWx1ZSBUZW1wbGF0ZSBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LVsxNTBweF0gY3FhLXRleHQtWzEwcHhdXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRDb25kaXRpb25Gb3JtR3JvdXAoaSlcIiBbY29uZmlnXT1cImdldFZhbHVlQ29uZmlnKGkpXCI+XG4gICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gUmVtb3ZlIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImkgPj0gMVwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInRleHRcIlxuICAgICAgICAgICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgICAgICAgICAgaWNvblBvc2l0aW9uPVwic3RhcnRcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb25kaXRpb24oaSlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZSBjb25kaXRpb24nXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctOCBjcWEtaC04IGNxYS1yb3VuZGVkIGNxYS10ZXh0LWdyYXktNTAwIGhvdmVyOmNxYS10ZXh0LWdyYXktNzAwIGhvdmVyOmNxYS1iZy1ncmF5LTEwMCBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb25kaXRpb24oaSlcIiAqbmdJZj1cImkgPj0gMVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlIGNvbmRpdGlvbidcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1sZyBjcWEtdGV4dC1bMjRweF1cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFRlbXBsYXRlIFZhcmlhYmxlcyBTZWN0aW9uIChzaG93biB3aGVuIHRlbXBsYXRlIGlzIHNlbGVjdGVkKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnZXRTZWxlY3RlZFRlbXBsYXRlKGkpXCIgY2xhc3M9XCJjcWEtbXQtMlwiPlxuICAgICAgICAgICAgICA8IS0tIFRlbXBsYXRlIEdyYW1tYXIgRGlzcGxheSAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tYi00IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTEgY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS03MDBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFjdGlvbi1mb3JtYXQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyM3B4XSBjcWEtdGV4dC1ibGFjay0xMDBcIlxuICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJnZXRTZWxlY3RlZFRlbXBsYXRlKGkpPy5odG1sR3JhbW1hciB8fCBnZXRTZWxlY3RlZFRlbXBsYXRlKGkpPy5uYXR1cmFsVGV4dCB8fCAnJ1wiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDwhLS0gVGVtcGxhdGUgVmFyaWFibGVzIEZvcm0gQ29tcG9uZW50IChpbmNsdWRlcyBEZXNjcmlwdGlvbiBhbmQgTWV0YWRhdGEpIC0tPlxuICAgICAgICAgICAgICA8Y3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIlxuICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZVZhcmlhYmxlc109XCJnZXRDb25kaXRpb25UZW1wbGF0ZVZhcmlhYmxlcyhpKVwiXG4gICAgICAgICAgICAgICAgW3ZhcmlhYmxlc0Zvcm1dPVwiZ2V0Q29uZGl0aW9uVmFyaWFibGVzRm9ybShpKVwiXG4gICAgICAgICAgICAgICAgW21ldGFkYXRhXT1cImdldENvbmRpdGlvbkZvcm1Hcm91cChpKS5nZXQoJ21ldGFkYXRhJyk/LnZhbHVlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZ2V0Q29uZGl0aW9uRm9ybUdyb3VwKGkpLmdldCgnZGVzY3JpcHRpb24nKT8udmFsdWUgfHwgJydcIlxuICAgICAgICAgICAgICAgIFtlbGVtZW50T3B0aW9uc109XCJlbGVtZW50T3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW2hhc01vcmVFbGVtZW50c109XCJoYXNNb3JlRWxlbWVudHNcIlxuICAgICAgICAgICAgICAgIFtpc0xvYWRpbmdFbGVtZW50c109XCJpc0xvYWRpbmdFbGVtZW50c1wiXG4gICAgICAgICAgICAgICAgW3NjcmVlbk5hbWVPcHRpb25zXT1cInNjcmVlbk5hbWVPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBbaGFzTW9yZVNjcmVlbk5hbWVzXT1cImhhc01vcmVTY3JlZW5OYW1lc1wiXG4gICAgICAgICAgICAgICAgW2lzTG9hZGluZ1NjcmVlbk5hbWVzXT1cImlzTG9hZGluZ1NjcmVlbk5hbWVzXCJcbiAgICAgICAgICAgICAgICBbcGFyYW1ldGVyT3B0aW9uc109XCJwYXJhbWV0ZXJPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBbaGFzTW9yZVBhcmFtZXRlcnNdPVwiaGFzTW9yZVBhcmFtZXRlcnNcIlxuICAgICAgICAgICAgICAgIFtpc0xvYWRpbmdQYXJhbWV0ZXJzXT1cImlzTG9hZGluZ1BhcmFtZXRlcnNcIlxuICAgICAgICAgICAgICAgIFtlbnZpcm9ubWVudE9wdGlvbnNdPVwiZW52aXJvbm1lbnRPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBbaGFzTW9yZUVudmlyb25tZW50c109XCJoYXNNb3JlRW52aXJvbm1lbnRzXCJcbiAgICAgICAgICAgICAgICBbaXNMb2FkaW5nRW52aXJvbm1lbnRzXT1cImlzTG9hZGluZ0Vudmlyb25tZW50c1wiXG4gICAgICAgICAgICAgICAgW2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZF09XCJkZWZhdWx0VGVzdERhdGFQcm9maWxlSWRcIlxuICAgICAgICAgICAgICAgIFtkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XT1cImRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhcIlxuICAgICAgICAgICAgICAgICh2YXJpYWJsZVZhbHVlQ2hhbmdlKT1cIm9uQ29uZGl0aW9uVmFyaWFibGVWYWx1ZUNoYW5nZShpLCAkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgKHZhcmlhYmxlQm9vbGVhbkNoYW5nZSk9XCJvbkNvbmRpdGlvblZhcmlhYmxlQm9vbGVhbkNoYW5nZShpLCAkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgKG1ldGFkYXRhQ2hhbmdlKT1cImdldENvbmRpdGlvbkZvcm1Hcm91cChpKS5nZXQoJ21ldGFkYXRhJyk/LnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCJnZXRDb25kaXRpb25Gb3JtR3JvdXAoaSkuZ2V0KCdkZXNjcmlwdGlvbicpPy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobG9hZE1vcmVFbGVtZW50cyk9XCJsb2FkTW9yZUVsZW1lbnRzLmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaEVsZW1lbnRzKT1cInNlYXJjaEVsZW1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lKT1cInNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNyZWF0ZUVsZW1lbnQpPVwiY3JlYXRlRWxlbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hTY3JlZW5OYW1lKT1cInNlYXJjaFNjcmVlbk5hbWUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobG9hZE1vcmVTY3JlZW5OYW1lcyk9XCJsb2FkTW9yZVNjcmVlbk5hbWVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaFBhcmFtZXRlcnMpPVwic2VhcmNoUGFyYW1ldGVycy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChsb2FkTW9yZVBhcmFtZXRlcnMpPVwibG9hZE1vcmVQYXJhbWV0ZXJzLmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaEVudmlyb25tZW50cyk9XCJzZWFyY2hFbnZpcm9ubWVudHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobG9hZE1vcmVFbnZpcm9ubWVudHMpPVwibG9hZE1vcmVFbnZpcm9ubWVudHMuZW1pdCgpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQWRkIENvbmRpdGlvbiBCdXR0b24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItZ3JheS0zMDAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtbXQtM1wiPlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICBpY29uUG9zaXRpb249XCJzdGFydFwiXG4gICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW3RleHRdPVwiJ0FkZCBDb25kaXRpb24nXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJhZGRDb25kaXRpb24oJ0NPTkRJVElPTl9FTFNFX0lGJylcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEluY2x1ZGUgRUxTRSBCcmFuY2ggU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1tYi02IGNxYS1wLTMgY3FhLWJnLWdyYXktNTAgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWdyYXktOTAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgSW5jbHVkZSBFTFNFIGJyYW5jaFxuICAgICAgICA8L2gzPlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICAgIEV4ZWN1dGUgYWx0ZXJuYXRpdmUgc3RlcHMgd2hlbiBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbY2hlY2tlZF09XCJpbmNsdWRlRWxzZVwiIChjaGFuZ2UpPVwib25JbmNsdWRlRWxzZUNoYW5nZSgkZXZlbnQuY2hlY2tlZClcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtbXQtYXV0byBjcWEtcHQtNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yXCIgdmFyaWFudD1cIm91dGxpbmVkXCIgdGV4dD1cIkNhbmNlbFwiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yXCIgdmFyaWFudD1cImZpbGxlZFwiIHRleHQ9XCJDcmVhdGUgU3RlcFwiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICBbZGlzYWJsZWRdPVwiIWNvbmRpdGlvbkZvcm0udmFsaWRcIlxuICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+Il19