@cqa-lib/cqa-ui 1.1.311 → 1.1.312

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.
@@ -2019,10 +2019,10 @@ export class TemplateVariablesFormComponent {
2019
2019
  }
2020
2020
  }
2021
2021
  TemplateVariablesFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TemplateVariablesFormComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
2022
- TemplateVariablesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: { templateVariables: "templateVariables", variablesForm: "variablesForm", metadata: "metadata", description: "description", 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", isEditInDepth: "isEditInDepth", createElementVisible: "createElementVisible" }, outputs: { variableValueChange: "variableValueChange", variableBooleanChange: "variableBooleanChange", metadataChange: "metadataChange", descriptionChange: "descriptionChange", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", cancelElementForm: "cancelElementForm", elementFormVisibilityChange: "elementFormVisibilityChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <!-- Element variables with cascading dropdowns (screen name + element) -->\n <ng-container *ngIf=\"isElementType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Screen Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!isElementType(variable)\">\n <!-- Other dropdown variables (type, scrollTo, label) -->\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with data type dropdown -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Type\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} \n </label>\n <!-- Show custom input for plain-text type -->\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", styles: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"], components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i2.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"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.ElementFormComponent, selector: "cqa-element-form", inputs: ["elementId", "element", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "isElementLoading", "isEditMode", "isCreateMode", "isEditInDepthAvailable"], outputs: ["createElement", "updateElement", "createScreenNameRequest", "searchScreenName", "loadMoreScreenNames", "cancel", "editInDepth"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2022
+ TemplateVariablesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: { templateVariables: "templateVariables", variablesForm: "variablesForm", metadata: "metadata", description: "description", 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", isEditInDepth: "isEditInDepth", createElementVisible: "createElementVisible" }, outputs: { variableValueChange: "variableValueChange", variableBooleanChange: "variableBooleanChange", metadataChange: "metadataChange", descriptionChange: "descriptionChange", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", cancelElementForm: "cancelElementForm", elementFormVisibilityChange: "elementFormVisibilityChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"variable.type === 'dropdown'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean' && variable.type !== 'dropdown'\">\n <!-- Element variables with cascading dropdowns (screen name + element) -->\n <ng-container *ngIf=\"isElementType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Screen Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!isElementType(variable)\">\n <!-- Other dropdown variables (type, scrollTo, label) -->\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with data type dropdown -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Type\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} \n </label>\n <!-- Show custom input for plain-text type -->\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", styles: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"], components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i2.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"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.ElementFormComponent, selector: "cqa-element-form", inputs: ["elementId", "element", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "isElementLoading", "isEditMode", "isCreateMode", "isEditInDepthAvailable"], outputs: ["createElement", "updateElement", "createScreenNameRequest", "searchScreenName", "loadMoreScreenNames", "cancel", "editInDepth"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2023
2023
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TemplateVariablesFormComponent, decorators: [{
2024
2024
  type: Component,
2025
- args: [{ selector: 'cqa-template-variables-form', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <!-- Element variables with cascading dropdowns (screen name + element) -->\n <ng-container *ngIf=\"isElementType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Screen Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!isElementType(variable)\">\n <!-- Other dropdown variables (type, scrollTo, label) -->\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with data type dropdown -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Type\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} \n </label>\n <!-- Show custom input for plain-text type -->\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", styles: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"] }]
2025
+ args: [{ selector: 'cqa-template-variables-form', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<style>\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n</style>\n<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap template-variables-form\" [ngClass]=\"{'cqa-flex-col': isEditInDepth}\" *ngIf=\"!createElementVisible\">\n \n <!-- Metadata - Only show if element is available in form -->\n <div *ngIf=\"selectorVariableAvailable\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadataChange.emit($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"descriptionChange.emit($event)\">\n </cqa-custom-input>\n </div>\n \n <ng-container *ngFor=\"let variable of templateVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle [checked]=\"variablesForm.at(i)?.get('value')?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"variable.type === 'dropdown'\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n\n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean' && variable.type !== 'dropdown'\">\n <!-- Element variables with cascading dropdowns (screen name + element) -->\n <ng-container *ngIf=\"isElementType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Screen Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getScreenNameSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedScreenName(variable); else elementManualInput\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getElementSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-template #elementManualInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!isElementType(variable)\">\n <!-- Other dropdown variables (type, scrollTo, label) -->\n <ng-container *ngIf=\"shouldShowDropdown(variable); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #defaultInput>\n <!-- Test-data, source-value, or target-value with data type dropdown -->\n <ng-container *ngIf=\"needsDataTypeDropdown(variable); else regularInput\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} Type\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataTypeSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <ng-container *ngIf=\"isEnvironmentType(variable)\">\n <div *ngIf=\"isEnvironmentType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Name\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedEnvironment(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Environment Value\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getEnvironmentParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isParameterType(variable)\">\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data Profile\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getTestDataProfileSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedTestDataProfile(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Data Set\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getDataSetSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"hasSelectedDataSet(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"getFormGroupAt(i)!\" [config]=\"getParameterSelectConfig(variable, i)\">\n </cqa-dynamic-select>\n </div> \n </ng-container>\n <div *ngIf=\"isPlainTextType(variable) || isRuntimeType(variable)\" class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }} \n </label>\n <!-- Show custom input for plain-text type -->\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"getRawValue(variable)\" [fullWidth]=\"true\"\n (valueChange)=\"onTestDataValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n <ng-template #regularInput>\n <div class=\"cqa-flex cqa-flex-col\" [style.width]=\"isEditInDepth ? null : 'calc(50% - 12px)'\" [ngClass]=\"{'cqa-w-full': isEditInDepth}\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n</div>\n\n<div *ngIf=\"createElementVisible\">\n <cqa-element-form\n [isCreateMode]=\"true\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [isEditInDepthAvailable]=\"false\"\n (createElement)=\"onCreateElement($event)\"\n (cancel)=\"onCancelElementForm()\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\">\n </cqa-element-form>\n</div>", styles: ["\n .capitalize-first::first-letter {\n text-transform: uppercase;\n }\n"] }]
2026
2026
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { templateVariables: [{
2027
2027
  type: Input
2028
2028
  }], variablesForm: [{
@@ -2098,4 +2098,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
2098
2098
  }], createElementVisible: [{
2099
2099
  type: Input
2100
2100
  }] } });
2101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdJLE9BQU8sRUFBYSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUE2Q25FLE1BQU0sT0FBTyw4QkFBOEI7SUE4RnpDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0ZqQyxzQkFBaUIsR0FBdUIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQWMsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixtQkFBYyxHQUFjLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxvQkFBZSxHQUFZLEtBQUssQ0FBQyxDQUFDLHNDQUFzQztRQUN4RSxzQkFBaUIsR0FBWSxLQUFLLENBQUMsQ0FBQyw2QkFBNkI7UUFDMUUsbUVBQW1FO1FBQzFELHNCQUFpQixHQUF1QixFQUFFLENBQUM7UUFDcEQsa0VBQWtFO1FBQ3pELHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUM3QyxzRUFBc0U7UUFDN0QseUJBQW9CLEdBQVksS0FBSyxDQUFD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O3NCQUF6QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRywyQkFBMkI7c0JBQXBDLE1BQU07Z0JBNENFLG9CQUFvQjtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgRm9ybUFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRWxlbWVudENyZWF0ZVBheWxvYWQsIFNjcmVlbk5hbWVPcHRpb24gfSBmcm9tICcuLi8uLi90ZXN0LWNhc2UtZGV0YWlscy9lbGVtZW50LXBvcHVwL2VsZW1lbnQtcG9wdXAtZm9ybS1kYXRhJztcblxuLy8gSW1wb3J0IEVsZW1lbnQgdHlwZSAtIHVzaW5nIGFueSBmb3Igbm93IHNpbmNlIEVsZW1lbnQgaXMgZnJvbSB0cy1wb3J0YWwtdWlcbi8vIEluIGEgcmVhbCBzY2VuYXJpbywgeW91IG1pZ2h0IHdhbnQgdG8gY3JlYXRlIGEgc2hhcmVkIGludGVyZmFjZSBvciBpbXBvcnQgZnJvbSBhIHNoYXJlZCBwYWNrYWdlXG5pbnRlcmZhY2UgRWxlbWVudCB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxvY2F0b3JWYWx1ZT86IHN0cmluZztcbiAgb3RoZXJMb2NhdG9yPzogc3RyaW5nW107XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgc2NyZWVuTmFtZUlkPzogbnVtYmVyO1xuICBzY3JlZW5OYW1lT2JqPzogYW55OyAvLyBGaXhlZDogdXNlICdhbnknIHNpbmNlICdFbGVtZW50U2NyZWVuTmFtZScgaXMgbm90IGRlZmluZWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZVZhcmlhYmxlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBkYXRhS2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIHR5cGU/OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBzdHJpbmdbXTtcbiAgLy8gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBtYW5hZ2luZyB2YXJpYWJsZSBzdGF0ZVxuICBkYXRhVHlwZT86ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JztcbiAgcmF3VmFsdWU/OiBzdHJpbmc7IC8vIFJhdyB2YWx1ZSB3aXRob3V0IGZvcm1hdHRpbmcgKGZvciBzZWxlY3QgZHJvcGRvd25zKVxuICBzZWxlY3RlZEVudmlyb25tZW50Pzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbnZpcm9ubWVudCBuYW1lIChmb3IgZW52aXJvbm1lbnQgdHlwZSlcbiAgc2VsZWN0ZWRFbnZpcm9ubWVudElkPzogbnVtYmVyOyAvLyBTZWxlY3RlZCBlbnZpcm9ubWVudCBJRCAoZm9yIGVudmlyb25tZW50IHR5cGUpXG4gIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlPzogc3RyaW5nOyAvLyBTZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBuYW1lIChmb3IgcGFyYW1ldGVyIHR5cGUpXG4gIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChmb3IgcGFyYW1ldGVyIHR5cGUpXG4gIHNlbGVjdGVkRGF0YVNldD86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZGF0YSBzZXQgbmFtZSAoZm9yIHBhcmFtZXRlciB0eXBlKVxuICBzZWxlY3RlZFNjcmVlbk5hbWU/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIHNjcmVlbiBuYW1lIChmb3IgZWxlbWVudCB0eXBlKVxuICBzY3JlZW5OYW1lSWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIHNjcmVlbiBuYW1lIElEIChmb3IgZWxlbWVudCB0eXBlKVxuICBlbGVtZW50SWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIGVsZW1lbnQgSUQgKGZvciBlbGVtZW50IHR5cGUpXG4gIGVsZW1lbnRMb2NhdG9yPzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbGVtZW50IGxvY2F0b3IgdmFsdWUgKGZvciBlbGVtZW50IHR5cGUpXG4gIGVsZW1lbnROYW1lPzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbGVtZW50IG5hbWUgKGZvciBlbGVtZW50IHR5cGUpXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdGVtcGxhdGVWYXJpYWJsZXM6IFRlbXBsYXRlVmFyaWFibGVbXSA9IFtdO1xuICBASW5wdXQoKSB2YXJpYWJsZXNGb3JtOiBGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcbiAgQElucHV0KCkgbWV0YWRhdGE6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiBTY3JlZW5OYW1lT3B0aW9uW10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBzY3JlZW4gbmFtZXMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBzY3JlZW4gbmFtZXMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1NjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUZXN0IGRhdGEgcHJvZmlsZXMgZm9yIHBhcmFtZXRlciBkcm9wZG93biAoZnJvbSBBUEkpIC0gcmF3IFRlc3REYXRhIG9iamVjdHMgKi9cbiAgQElucHV0KCkgcGFyYW1ldGVyT3B0aW9uczogYW55W10gPSBbXTsgLy8gVGVzdERhdGFbXSAtIHVzaW5nIGFueSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gIC8qKiBXaGV0aGVyIG1vcmUgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVBhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgcGFyYW1ldGVycyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgb3B0aW9ucyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChmcm9tIEFQSSkgKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRPcHRpb25zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBlbnZpcm9ubWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgZW52aXJvbm1lbnRzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgZnJvbSB0ZXN0IGNhc2UgKGlmIGF2YWlsYWJsZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHdpbGwgYmUgZGlzYWJsZWQpICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHN0YXJ0IGluZGV4IGZyb20gdGVzdCBjYXNlIChkYXRhIHNldCBpbmRleCBpbiB0aGUgcHJvZmlsZSkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgaXNFZGl0SW5EZXB0aDogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgQE91dHB1dCgpIHZhcmlhYmxlVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH0+KCk7XG4gIEBPdXRwdXQoKSB2YXJpYWJsZUJvb2xlYW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYm9vbGVhbiB9PigpO1xuICBAT3V0cHV0KCkgbWV0YWRhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGRlc2NyaXB0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gbG9hZCBtb3JlIGlzIHJlcXVlc3RlZFxuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVsZW1lbnRzXG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzY3JlZW5OYW1lSWQ6IG51bWJlcjsgc2VhcmNoVGVybT86IHN0cmluZyB9PigpOyAvLyBFbWl0IHdoZW4gc2NyZWVuIG5hbWUgaXMgc2VsZWN0ZWQgdG8gZmV0Y2ggZWxlbWVudHMgZmlsdGVyZWQgYnkgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIGNyZWF0ZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPEVsZW1lbnRDcmVhdGVQYXlsb2FkPigpOyAvLyBFbWl0IHdoZW4gZWxlbWVudCBpcyBjcmVhdGVkIHdpdGggcGF5bG9hZFxuICBAT3V0cHV0KCkgc2VhcmNoU2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGxvYWRNb3JlU2NyZWVuTmFtZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciByZXF1ZXN0cyB0byBjcmVhdGUgYSBuZXcgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIHNlYXJjaFBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIGxvYWRNb3JlUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgc2VhcmNoRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBlbnZpcm9ubWVudHNcbiAgQE91dHB1dCgpIGxvYWRNb3JlRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBlbnZpcm9ubWVudHNcbiAgQE91dHB1dCgpIGNhbmNlbEVsZW1lbnRGb3JtID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gZWxlbWVudCBmb3JtIGlzIGNhbmNlbGxlZFxuICBAT3V0cHV0KCkgZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpOyAvLyBFbWl0IHdoZW4gZWxlbWVudCBmb3JtIHZpc2liaWxpdHkgY2hhbmdlc1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNlbGVjdCBjb25maWdzIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwcml2YXRlIHNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGRhdGEgdHlwZSBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIGRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgcGFyYW1ldGVyIHNlbGVjdCBjb25maWdzXG4gIHByaXZhdGUgcGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZW52aXJvbm1lbnQgc2VsZWN0IGNvbmZpZ3NcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGVudmlyb25tZW50IHBhcmFtZXRlciBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIGVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3Igc2NyZWVuIG5hbWUgc2VsZWN0IGNvbmZpZ3MgKGZvciBlbGVtZW50IHZhcmlhYmxlcylcbiAgcHJpdmF0ZSBzY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZWxlbWVudCBzZWxlY3QgY29uZmlncyAoZmlsdGVyZWQgYnkgc2NyZWVuIG5hbWUpXG4gIHByaXZhdGUgZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWdzIChmaXJzdCBkcm9wZG93biBmb3IgcGFyYW1ldGVycylcbiAgcHJpdmF0ZSB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBkYXRhIHNldCBzZWxlY3QgY29uZmlncyAoc2Vjb25kIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzIC0gc2hvd3MgZGF0YSBzZXRzIGZyb20gc2VsZWN0ZWQgcHJvZmlsZSlcbiAgcHJpdmF0ZSBkYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgcGFyYW1ldGVyIHNlbGVjdCBjb25maWdzIGZvciBhIHNwZWNpZmljIGRhdGEgc2V0ICh0aGlyZCBkcm9wZG93biBmb3IgcGFyYW1ldGVycylcbiAgcHJpdmF0ZSBwYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgY29tcHV0ZWQgcHJvcGVydGllc1xuICBwcml2YXRlIG5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzaG91bGRTaG93RHJvcGRvd25DYWNoZTogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBQcmUtY29tcHV0ZWQgZGF0YSB0eXBlIG9wdGlvbnMgKHN0YXRpYywgbm8gbmVlZCB0byByZWNyZWF0ZSlcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhVHlwZU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdwbGFpbi10ZXh0JywgdmFsdWU6ICdwbGFpbi10ZXh0JywgbmFtZTogJ1BsYWluIFRleHQnLCBsYWJlbDogJ1BsYWluIFRleHQnIH0sXG4gICAgeyBpZDogJ3BhcmFtZXRlcicsIHZhbHVlOiAncGFyYW1ldGVyJywgbmFtZTogJ0B8UGFyYW1ldGVyfCcsIGxhYmVsOiAnQHxQYXJhbWV0ZXJ8JyB9LFxuICAgIHsgaWQ6ICdydW50aW1lJywgdmFsdWU6ICdydW50aW1lJywgbmFtZTogJyR8UnVudGltZXwnLCBsYWJlbDogJyR8UnVudGltZXwnIH0sXG4gICAgeyBpZDogJ2Vudmlyb25tZW50JywgdmFsdWU6ICdlbnZpcm9ubWVudCcsIG5hbWU6ICcqfEVudmlyb25tZW50fCcsIGxhYmVsOiAnKnxFbnZpcm9ubWVudHwnIH1cbiAgXTtcblxuICBASW5wdXQoKSBjcmVhdGVFbGVtZW50VmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG9uQ3JlYXRlRWxlbWVudChwYXlsb2FkOiBFbGVtZW50Q3JlYXRlUGF5bG9hZCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlRWxlbWVudC5lbWl0KHBheWxvYWQpO1xuICAgIHRoaXMuZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DYW5jZWxFbGVtZW50Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLmNhbmNlbEVsZW1lbnRGb3JtLmVtaXQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZVZhcmlhYmxlcyddIHx8IGNoYW5nZXNbJ3ZhcmlhYmxlc0Zvcm0nXSB8fCBjaGFuZ2VzWydlbGVtZW50T3B0aW9ucyddIHx8IFxuICAgICAgICBjaGFuZ2VzWydoYXNNb3JlRWxlbWVudHMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdFbGVtZW50cyddIHx8XG4gICAgICAgIGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlUGFyYW1ldGVycyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ1BhcmFtZXRlcnMnXSB8fFxuICAgICAgICBjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRW52aXJvbm1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRW52aXJvbm1lbnRzJ10gfHxcbiAgICAgICAgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkJ10gfHwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCddKSB7XG4gICAgICBcbiAgICAgIC8vIE9ubHkgY2xlYXIgY2FjaGVzIGZvciBjaGFuZ2VkIGlucHV0cywgbm90IGFsbCBjYWNoZXNcbiAgICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZVZhcmlhYmxlcyddIHx8IGNoYW5nZXNbJ3ZhcmlhYmxlc0Zvcm0nXSkge1xuICAgICAgICAvLyBDbGVhciBhbGwgY2FjaGVzIHdoZW4gdGVtcGxhdGUgdmFyaWFibGVzIG9yIGZvcm0gY2hhbmdlc1xuICAgICAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2xlYXIgZWxlbWVudCBhbmQgc2NyZWVuIG5hbWUgY2FjaGVzIG9ubHkgd2hlbiB0aGVpciBvcHRpb25zIGNoYW5nZVxuICAgICAgaWYgKGNoYW5nZXNbJ2VsZW1lbnRPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZUVsZW1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRWxlbWVudHMnXSkge1xuICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY2hhbmdlc1snc2NyZWVuTmFtZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlU2NyZWVuTmFtZXMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdTY3JlZW5OYW1lcyddKSB7XG4gICAgICAgIHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVBhcmFtZXRlcnMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdQYXJhbWV0ZXJzJ10pIHtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRW52aXJvbm1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRW52aXJvbm1lbnRzJ10pIHtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMgYW5kIHJhdyB2YWx1ZXMgZm9yIHRlc3QtZGF0YSB2YXJpYWJsZXNcbiAgICAgIC8vIEFsc28gcmUtaW5pdGlhbGl6ZSBpZiBkZWZhdWx0IHZhbHVlcyBvciBwYXJhbWV0ZXJPcHRpb25zIGNoYW5nZSAodG8gc2V0IGRlZmF1bHQgc2VsZWN0aW9ucylcbiAgICAgIGlmICgoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10gfHwgY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddKSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRlc3REYXRhVmFyaWFibGVzKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIHRlbXBsYXRlVmFyaWFibGVzIGNoYW5nZWQsIGluaXRpYWxpemUgc2NyZWVuIG5hbWUgZm9ybSBjb250cm9scyBmb3IgZWxlbWVudCB2YXJpYWJsZXMgdGhhdCBoYXZlIHNjcmVlbk5hbWVJZFxuICAgICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlVmFyaWFibGVzJ10gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkgJiYgdmFyaWFibGUuc2NyZWVuTmFtZUlkKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgc2NyZWVuIG5hbWUgZm9ybSBjb250cm9sIHdpdGggc2NyZWVuTmFtZUlkIGFzIHN0cmluZyAodG8gbWF0Y2ggb3B0aW9uIGlkIGZvcm1hdCksIG9yICdub25lJyBieSBkZWZhdWx0XG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkID8gU3RyaW5nKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkgOiAnbm9uZSc7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woaW5pdGlhbFZhbHVlKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCB2YWx1ZSBpZiBpdCBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkID8gU3RyaW5nKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkgOiAnbm9uZSc7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZVN0ciAhPT0gZXhwZWN0ZWRWYWx1ZSAmJiBjdXJyZW50VmFsdWUgIT09IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShleHBlY3RlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNjcmVlbk5hbWVJZCBidXQgbm90IHNlbGVjdGVkU2NyZWVuTmFtZSwgZmluZCBpdCBmcm9tIHNjcmVlbk5hbWVPcHRpb25zXG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lICYmIHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nU2NyZWVuTmFtZSA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gdmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBtYXRjaGluZ1NjcmVlbk5hbWUubmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBzY3JlZW5OYW1lT3B0aW9ucyBjaGFuZ2VkLCB1cGRhdGUgc2VsZWN0ZWRTY3JlZW5OYW1lIGZvciB2YXJpYWJsZXMgdGhhdCBoYXZlIHNjcmVlbk5hbWVJZFxuICAgICAgaWYgKGNoYW5nZXNbJ3NjcmVlbk5hbWVPcHRpb25zJ10gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkgJiYgdmFyaWFibGUuc2NyZWVuTmFtZUlkICYmICF2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nU2NyZWVuTmFtZSA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gdmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ1NjcmVlbk5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gbWF0Y2hpbmdTY3JlZW5OYW1lLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgZWxlbWVudE9wdGlvbnMgb3Igc2NyZWVuTmFtZU9wdGlvbnMgY2hhbmdlZCwgcmUtaW5pdGlhbGl6ZSBlbGVtZW50IHZhcmlhYmxlc1xuICAgICAgaWYgKChjaGFuZ2VzWydlbGVtZW50T3B0aW9ucyddIHx8IGNoYW5nZXNbJ3NjcmVlbk5hbWVPcHRpb25zJ10pICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBjb25maWcgY2FjaGUgd2hlbiBlbGVtZW50T3B0aW9ucyBjaGFuZ2VzIHRvIGZvcmNlIHJlY29tcHV0YXRpb25cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2hlbiBlbGVtZW50cyBhcmUgbG9hZGVkIGFmdGVyIHNjcmVlbiBuYW1lIHNlbGVjdGlvbiwgdGhlIGNvbmZpZyBpcyByZWNvbXB1dGVkXG4gICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgICAgLy8gT25seSB0cnkgdG8gZmluZCBhbmQgc2V0IGVsZW1lbnQgaWYgZWxlbWVudElkIGV4aXN0cyBpbiB0ZW1wbGF0ZSBkYXRhXG4gICAgICAgICAgICAgIC8vIElmIG5vIGVsZW1lbnRJZCwgZG9uJ3Qgc2VsZWN0IGFueXRoaW5nIC0gdXNlIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBQcmlvcml0eSAxOiBGaW5kIGJ5IGVsZW1lbnRJZCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmlkID09PSB2YXJpYWJsZS5lbGVtZW50SWQpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFByaW9yaXR5IDI6IEZpbmQgYnkgZWxlbWVudE5hbWUgaWYgZWxlbWVudElkIHNlYXJjaCBkaWRuJ3QgZmluZCBpdCAoZmFsbGJhY2spXG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50ICYmIHZhcmlhYmxlLmVsZW1lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLm5hbWUgPT09IHZhcmlhYmxlLmVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gUHJpb3JpdHkgMzogRmluZCBieSBsb2NhdG9yVmFsdWUgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudFZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmxvY2F0b3JWYWx1ZSA9PT0gZWxlbWVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gbmFtZSBpbmZvIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnNjcmVlbk5hbWVJZCAmJiBlbGVtZW50LnNjcmVlbk5hbWVPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gZWxlbWVudC5zY3JlZW5OYW1lT2JqLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IGVsZW1lbnQuc2NyZWVuTmFtZUlkO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgc2NyZWVuTmFtZUlkIGFzIHN0cmluZyB0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0IChmb3IgY29uc2lzdGVuY3kgd2l0aCBnZXRTY3JlZW5OYW1lU2VsZWN0Q29uZmlnKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JlZW5OYW1lSWRTdHJpbmcgPSBTdHJpbmcoZWxlbWVudC5zY3JlZW5OYW1lSWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRTY3JlZW5OYW1lJywgbmV3IEZvcm1Db250cm9sKHNjcmVlbk5hbWVJZFN0cmluZykpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIGlmIGZvcm0gY29udHJvbCBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIHZhbGlkIHNjcmVlbiBuYW1lIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyByZXNldHRpbmcgdXNlcidzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZVN0ciA9IGN1cnJlbnRWYWx1ZSAhPSBudWxsID8gU3RyaW5nKGN1cnJlbnRWYWx1ZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVTdHIgIT09IHNjcmVlbk5hbWVJZFN0cmluZyAmJiBjdXJyZW50VmFsdWVTdHIgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShzY3JlZW5OYW1lSWRTdHJpbmcsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gU2V0L3VwZGF0ZSBlbGVtZW50IGRldGFpbHMgZnJvbSB0aGUgZm91bmQgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gZWxlbWVudC5pZDtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBlbGVtZW50TmFtZSBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzZXQgKHByZXNlcnZlIGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlLmVsZW1lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gZWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBGb3Igc2VsZWN0b3IsIHVzZSBlbGVtZW50TG9jYXRvciBhcyB2YWx1ZTsgZm9yIG90aGVycywgdXNlIGVsZW1lbnROYW1lXG4gICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUubmFtZSA9PT0gJ3NlbGVjdG9yJykge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGVsZW1lbnQubG9jYXRvclZhbHVlIHx8IGVsZW1lbnQubmFtZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZhcmlhYmxlLnZhbHVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGVsZW1lbnQubmFtZSB8fCBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgSUQgZm9ybSBjb250cm9sIGZvciB0aGUgZHJvcGRvd24gKGtleSBpcyAnaWQnIGluIGNvbmZpZylcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChlbGVtZW50LmlkKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKT8uc2V0VmFsdWUoZWxlbWVudC5pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdmFsdWUgZm9ybSBjb250cm9sXG4gICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgbm90IGZvdW5kIGluIGVsZW1lbnRPcHRpb25zIHlldCAtIG1pZ2h0IG5lZWQgdG8gZmV0Y2hcbiAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZWxlbWVudElkIGFuZCBlbGVtZW50TmFtZSBpZiB0aGV5IGV4aXN0IChmcm9tIHNldFRlbXBsYXRlVmFyaWFibGVzKVxuICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBlbGVtZW50SWQgYnV0IGVsZW1lbnQgaXNuJ3QgZm91bmQsIHdlIG1pZ2h0IG5lZWQgdG8gZmV0Y2ggZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgdGhlIHNjcmVlbiBuYW1lIHlldCwgc28gd2UnbGwgd2FpdCBmb3IgZWxlbWVudE9wdGlvbnMgdG8gYmUgbG9hZGVkXG4gICAgICAgICAgICAgICAgICAvLyBUaGUgaW5pdGlhbGl6YXRpb24gd2lsbCBydW4gYWdhaW4gd2hlbiBlbGVtZW50T3B0aW9ucyBjaGFuZ2VzIHZpYSBuZ09uQ2hhbmdlc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBObyBlbGVtZW50SWQgaW4gdGVtcGxhdGUgZGF0YSAtIGNsZWFyIGFsbCBlbGVtZW50LXJlbGF0ZWQgZmllbGRzIGFuZCBzZXQgZGVmYXVsdHNcbiAgICAgICAgICAgICAgICAvLyBCdXQgZG9uJ3Qgb3ZlcnJpZGUgdXNlcidzIHNjcmVlbiBuYW1lIHNlbGVjdGlvbiBpZiB0aGV5J3ZlIGFscmVhZHkgc2VsZWN0ZWQgb25lXG4gICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIE9ubHkgY2xlYXIgc2NyZWVuTmFtZUlkIGlmIGl0IHdhc24ndCBzZXQgYnkgdXNlciBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBmb3JtIGNvbnRyb2wgaGFzIGEgdmFsaWQgc2NyZWVuIG5hbWUgKG5vdCAnbm9uZScpXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50U2NyZWVuTmFtZVZhbHVlIHx8IGN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgPT09ICdub25lJyB8fCBjdXJyZW50U2NyZWVuTmFtZVZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzIHRvIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAvLyBTY3JlZW4gbmFtZSBzaG91bGQgYmUgJ25vbmUnIChTZWxlY3Qgb3B0aW9uKVxuICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woJ25vbmUnKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKCdub25lJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IElEIHNob3VsZCBiZSBudWxsXG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChudWxsKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUHJlLWNvbXB1dGUgYWxsIGNvbmZpZ3MgdG8gYXZvaWQgY2FsbGluZyBtZXRob2RzIGluIHRlbXBsYXRlXG4gICAgICAvLyBUaGlzIHdpbGwgcmVjb21wdXRlIGVsZW1lbnQgY29uZmlncyB3aXRoIHRoZSBuZXcgZWxlbWVudE9wdGlvbnNcbiAgICAgIC8vIE9ubHkgcHJlY29tcHV0ZSBpZiB0ZW1wbGF0ZVZhcmlhYmxlcyBleGlzdCB0byBhdm9pZCB1bm5lY2Vzc2FyeSB3b3JrXG4gICAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5wcmVjb21wdXRlQ29uZmlncygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3JjZSBjaGFuZ2UgZGV0ZWN0aW9uIGFmdGVyIHJlY29tcHV0aW5nIGNvbmZpZ3MgKG9ubHkgb25jZSBhdCB0aGUgZW5kKVxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBcbiAgICAgIC8vIElmIGVudmlyb25tZW50IG9wdGlvbnMgY2hhbmdlZCBhbmQgd2UgaGF2ZSBzZWxlY3RlZCBlbnZpcm9ubWVudHMsIHJlZnJlc2ggcGFyYW1ldGVyIGNvbmZpZ3NcbiAgICAgIGlmIChjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKSAmJiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAvLyBDbGVhciBhbmQgcmVjb21wdXRlIGVudmlyb25tZW50IHBhcmFtZXRlciBjb25maWdcbiAgICAgICAgICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fZW52UGFyYW1gKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBwYXJhbWV0ZXIgb3B0aW9ucyBjaGFuZ2VkIGFuZCB3ZSBoYXZlIGRlZmF1bHQgdmFsdWVzLCB0cnkgdG8gaW5pdGlhbGl6ZSB0aGVtXG4gICAgICBpZiAoY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsICYmIHRoaXMucGFyYW1ldGVyT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFJlLWluaXRpYWxpemUgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIG5vdyB0aGF0IHBhcmFtZXRlck9wdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgICAgICB0aGlzLmluaXRpYWxpemVUZXN0RGF0YVZhcmlhYmxlcygpO1xuICAgICAgICAvLyBGb3JjZSBjaGFuZ2UgZGV0ZWN0aW9uIGFmdGVyIGluaXRpYWxpemF0aW9uXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBwYXJhbWV0ZXIgb3B0aW9ucyBvciBsb2FkaW5nIHN0YXRlIGNoYW5nZWQsIHJlZnJlc2ggdGVzdCBkYXRhIHByb2ZpbGUgY29uZmlncyAoc28gc2VhcmNoL2xvYWQgbW9yZSBhbmQgb3B0aW9ucyBzdGF5IGluIHN5bmMpXG4gICAgICBpZiAoY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVQYXJhbWV0ZXJzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nUGFyYW1ldGVycyddIHx8XG4gICAgICAgICAgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkJ10gfHwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCddKSB7XG4gICAgICAgIC8vIENsZWFyIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWcgY2FjaGUgc2luY2UgcHJvZmlsZXMgbGlzdCBvciBsb2FkaW5nIHN0YXRlIG1heSBoYXZlIGNoYW5nZWRcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc1BhcmFtZXRlclR5cGUodmFyaWFibGUpKSB7XG4gICAgICAgICAgICAvLyBSZWNvbXB1dGUgdGVzdCBkYXRhIHByb2ZpbGUgY29uZmlnXG4gICAgICAgICAgICB0aGlzLmdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcmVjb21wdXRlIGRhdGEgc2V0IGNvbmZpZ1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSWYgYSBkYXRhIHNldCBpcyBhbHJlYWR5IHNlbGVjdGVkLCByZWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZ1xuICAgICAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgYW5kIHJlY29tcHV0ZSBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUgZm9yIGNhY2hlIGtleVxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZGVudGlmaWVyID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA/IFN0cmluZyh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKSA6IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRfJHtwcm9maWxlSWRlbnRpZmllcn1fJHt2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXR9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGluaXRpYWxpemVUZXN0RGF0YVZhcmlhYmxlcygpOiB2b2lkIHtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlKSkge1xuICAgICAgICBjb25zdCB7IGRhdGFUeXBlLCByYXdWYWx1ZSB9ID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgICAvLyBTZXQgcHJvcGVydGllcyBkaXJlY3RseSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgICAgIHZhcmlhYmxlLmRhdGFUeXBlID0gZGF0YVR5cGU7XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcmF3VmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBmb3IgZGF0YSB0eXBlIGluIHRoZSBGb3JtQXJyYXlcbiAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChkYXRhVHlwZSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKT8uc2V0VmFsdWUoZGF0YVR5cGUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRm9yIHBhcmFtZXRlciB0eXBlLCBwYXJzZSB0aGUgdmFsdWUgdG8gZXh0cmFjdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgcGFyYW1ldGVyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgYXJlIHByb3ZpZGVkIGZyb20gdGVzdCBjYXNlXG4gICAgICAgICAgICAvLyBPbmx5IHByb2NlZWQgaWYgcGFyYW1ldGVyT3B0aW9ucyBhcmUgbG9hZGVkXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgJiYgdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ICE9IG51bGwgJiYgdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSURcbiAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdFByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4gdGVzdERhdGEuaWQgPT09IHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKTtcbiAgICAgICAgICAgICAgaWYgKGRlZmF1bHRQcm9maWxlICYmIGRlZmF1bHRQcm9maWxlLmRhdGEgJiYgZGVmYXVsdFByb2ZpbGUuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0RGF0YVNldCA9IGRlZmF1bHRQcm9maWxlLmRhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGRlZmF1bHRQcm9maWxlLm5hbWUgfHwgZGVmYXVsdFByb2ZpbGUudGVzdERhdGFOYW1lO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXROYW1lID0gZGVmYXVsdERhdGFTZXQubmFtZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgdmFyaWFibGUgcHJvcGVydGllcyAtIHRoaXMgZW5zdXJlcyBoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSgpIGFuZCBoYXNTZWxlY3RlZERhdGFTZXQoKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gcHJvZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IGRlZmF1bHRQcm9maWxlLmlkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzIHdpdGggdGhlIGFjdHVhbCB2YWx1ZXMgc28gZHJvcGRvd25zIGRpc3BsYXkgc2VsZWN0ZWQgb3B0aW9uc1xuICAgICAgICAgICAgICAgIC8vIFVzZSBwcm9maWxlIElEIChzdHJpbmcpIGZvciBzZWxlY3RlZFRlc3REYXRhUHJvZmlsZSBmb3JtIGNvbnRyb2wgdG8gbWF0Y2ggb3B0aW9uLmlkIGZvcm1hdFxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZFN0cmluZyA9IFN0cmluZyhkZWZhdWx0UHJvZmlsZS5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScsIG5ldyBGb3JtQ29udHJvbChwcm9maWxlSWRTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBEb24ndCBzZXQgcGFyYW1ldGVyIHZhbHVlIHlldCAtIHVzZXIgd2lsbCBzZWxlY3QgaXRcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBjYWNoZXMgdG8gZm9yY2UgcmVjb21wdXRhdGlvbiBvZiBjb25maWdzIHdpdGggbmV3IHZhbHVlc1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIGFsbCBjYWNoZSBlbnRyaWVzIGZvciB0aGlzIHZhcmlhYmxlIHRvIGVuc3VyZSBmcmVzaCBjb25maWdzXG4gICAgICAgICAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fdGVzdERhdGFQcm9maWxlYCk7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgZGF0YSBzZXQgY2FjaGUgLSBuZWVkIHRvIGNsZWFyIGFsbCBwb3NzaWJsZSBrZXlzIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGV4YWN0IGZvcm1hdFxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2RhdGFTZXRgKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBwYXJhbWV0ZXIgY2FjaGUgLSBuZWVkIHRvIGNsZWFyIGFsbCBwb3NzaWJsZSBrZXlzXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE5vIGRlZmF1bHQgdmFsdWVzIC0gdXNlIGV4aXN0aW5nIGxvZ2ljIHRvIGZpbmQgZnJvbSBwYXJhbWV0ZXIgdmFsdWVcbiAgICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcmF3VmFsdWU7XG4gICAgICAgICAgICAgIGlmIChwYXJhbU5hbWUpIHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgdGhhdCBjb250YWlucyB0aGlzIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgIC8vIFNlYXJjaCB0aHJvdWdoIGFsbCB0ZXN0IGRhdGEgcHJvZmlsZXMgYW5kIHRoZWlyIGRhdGEgc2V0c1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZFByb2ZpbGU6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kRGF0YVNldDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRlc3REYXRhUHJvZmlsZSBvZiB0aGlzLnBhcmFtZXRlck9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0ZXN0RGF0YVByb2ZpbGUuZGF0YSAmJiB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlYXJjaCB0aHJvdWdoIGFsbCBkYXRhIHNldHMgaW4gdGhpcyBwcm9maWxlXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGF0YVNldCBvZiB0ZXN0RGF0YVByb2ZpbGUuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhU2V0ICYmIGRhdGFTZXQuZGF0YSAmJiBkYXRhU2V0LmRhdGEuaGFzT3duUHJvcGVydHkocGFyYW1OYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRQcm9maWxlID0gdGVzdERhdGFQcm9maWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmREYXRhU2V0ID0gZGF0YVNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRQcm9maWxlKSBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kUHJvZmlsZSAmJiBmb3VuZERhdGFTZXQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gZm91bmRQcm9maWxlLm5hbWUgfHwgZm91bmRQcm9maWxlLnRlc3REYXRhTmFtZTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXROYW1lID0gZm91bmREYXRhU2V0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gcHJvZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gZm91bmRQcm9maWxlLmlkO1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gZGF0YVNldE5hbWU7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZU5hbWUpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZShwcm9maWxlTmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUoZGF0YVNldE5hbWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2wgdG8gcGFyYW0gbmFtZSAoZm9yIGRyb3Bkb3duIGRpc3BsYXkpXG4gICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHBhcmFtTmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHZhcmlhYmxlLnZhbHVlIGlzIGZvcm1hdHRlZCBjb3JyZWN0bHkgYXMgQHxwYXJhbU5hbWV8XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShwYXJhbU5hbWUsICdwYXJhbWV0ZXInKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gSWYgcGFyYW1ldGVyIG5vdCBmb3VuZCwgZm9ybWF0IHRoZSByYXcgdmFsdWUgaWYgaXQncyBhIHBhcmFtZXRlciB0eXBlXG4gICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHJhd1ZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdmFyaWFibGUudmFsdWUgaXMgZm9ybWF0dGVkIGNvcnJlY3RseVxuICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSB0aGlzLmZvcm1hdFRlc3REYXRhVmFsdWUocmF3VmFsdWUsIGRhdGFUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRm9yIGVudmlyb25tZW50IHR5cGUsIHBhcnNlIHRoZSB2YWx1ZSB0byBleHRyYWN0IGVudmlyb25tZW50IGFuZCBwYXJhbWV0ZXJcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgICAgICAgIC8vIEVudmlyb25tZW50IHZhbHVlcyBhcmUgaW4gZm9ybWF0ICp8cGFyYW1ldGVyTmFtZXxcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZmluZCB3aGljaCBlbnZpcm9ubWVudCB0aGlzIHBhcmFtZXRlciBiZWxvbmdzIHRvXG4gICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByYXdWYWx1ZTtcbiAgICAgICAgICAgIGlmIChwYXJhbU5hbWUpIHtcbiAgICAgICAgICAgICAgLy8gRmluZCB0aGUgZW52aXJvbm1lbnQgdGhhdCBjb250YWlucyB0aGlzIHBhcmFtZXRlclxuICAgICAgICAgICAgICBjb25zdCBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYubmFtZSA9PT0gcGFyYW1OYW1lKTtcbiAgICAgICAgICAgICAgaWYgKGVudk9wdGlvbikge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgPSBlbnZPcHRpb24uZW52aXJvbm1lbnQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBhbmQgc3RvcmUgZW52aXJvbm1lbnQgSURcbiAgICAgICAgICAgICAgICBjb25zdCBpZE1hdGNoID0gZW52T3B0aW9uLmlkLm1hdGNoKC9lbnYtKFxcZCspLS8pO1xuICAgICAgICAgICAgICAgIGlmIChpZE1hdGNoICYmIGlkTWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHNcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcsIG5ldyBGb3JtQ29udHJvbChlbnZPcHRpb24uZW52aXJvbm1lbnQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKT8uc2V0VmFsdWUoZW52T3B0aW9uLmVudmlyb25tZW50LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGAqfCR7cGFyYW1OYW1lfXxgLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEZvciBlbGVtZW50IHR5cGUsIHBhcnNlIHRoZSB2YWx1ZSB0byBleHRyYWN0IHNjcmVlbiBuYW1lIGFuZCBlbGVtZW50XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRvIGZpbmQgYW5kIHNldCBlbGVtZW50IGlmIGVsZW1lbnRJZCBleGlzdHMgaW4gdGVtcGxhdGUgZGF0YVxuICAgICAgICAgICAgLy8gSWYgbm8gZWxlbWVudElkLCBkb24ndCBzZWxlY3QgYW55dGhpbmcgLSB1c2UgZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAxOiBGaW5kIGJ5IGVsZW1lbnRJZCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5pZCA9PT0gdmFyaWFibGUuZWxlbWVudElkKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFByaW9yaXR5IDI6IEZpbmQgYnkgZWxlbWVudE5hbWUgaWYgZWxlbWVudElkIHNlYXJjaCBkaWRuJ3QgZmluZCBpdCAoZmFsbGJhY2spXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwubmFtZSA9PT0gdmFyaWFibGUuZWxlbWVudE5hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAzOiBGaW5kIGJ5IGxvY2F0b3JWYWx1ZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwubG9jYXRvclZhbHVlID09PSBlbGVtZW50VmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gbmFtZSBpbmZvIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zY3JlZW5OYW1lSWQgJiYgZWxlbWVudC5zY3JlZW5OYW1lT2JqKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBlbGVtZW50LnNjcmVlbk5hbWVPYmoubmFtZTtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IGVsZW1lbnQuc2NyZWVuTmFtZUlkO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgc2NyZWVuTmFtZUlkIGFzIHN0cmluZyB0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0IChmb3IgY29uc2lzdGVuY3kgd2l0aCBnZXRTY3JlZW5OYW1lU2VsZWN0Q29uZmlnKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyZWVuTmFtZUlkU3RyaW5nID0gU3RyaW5nKGVsZW1lbnQuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRTY3JlZW5OYW1lJywgbmV3IEZvcm1Db250cm9sKHNjcmVlbk5hbWVJZFN0cmluZykpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgZm9ybSBjb250cm9sIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgdmFsaWQgc2NyZWVuIG5hbWUgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyByZXNldHRpbmcgdXNlcidzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVTdHIgIT09IHNjcmVlbk5hbWVJZFN0cmluZyAmJiBjdXJyZW50VmFsdWVTdHIgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoc2NyZWVuTmFtZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0L3VwZGF0ZSBlbGVtZW50IGRldGFpbHMgZnJvbSB0aGUgZm91bmQgZWxlbWVudFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBlbGVtZW50TmFtZSBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzZXQgKHByZXNlcnZlIGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvciBzZWxlY3RvciwgdXNlIGVsZW1lbnRMb2NhdG9yIGFzIHZhbHVlOyBmb3Igb3RoZXJzLCB1c2UgZWxlbWVudE5hbWVcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUubmFtZSA9PT0gJ3NlbGVjdG9yJykge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdmFyaWFibGUudmFsdWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGVsZW1lbnQubmFtZSB8fCBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgSUQgZm9ybSBjb250cm9sIGZvciB0aGUgZHJvcGRvd24gKGtleSBpcyAnaWQnIGluIGNvbmZpZylcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2lkJywgbmV3IEZvcm1Db250cm9sKGVsZW1lbnQuaWQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKGVsZW1lbnQuaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHZhbHVlIGZvcm0gY29udHJvbFxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgbm90IGZvdW5kIGluIGVsZW1lbnRPcHRpb25zIHlldCAtIG1pZ2h0IG5lZWQgdG8gZmV0Y2hcbiAgICAgICAgICAgICAgICAvLyBLZWVwIGVsZW1lbnRJZCBhbmQgZWxlbWVudE5hbWUgaWYgdGhleSBleGlzdCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGVsZW1lbnRJZCBidXQgZWxlbWVudCBpc24ndCBmb3VuZCwgd2UgbWlnaHQgbmVlZCB0byBmZXRjaCBlbGVtZW50c1xuICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgdGhlIHNjcmVlbiBuYW1lIHlldCwgc28gd2UnbGwgd2FpdCBmb3IgZWxlbWVudE9wdGlvbnMgdG8gYmUgbG9hZGVkXG4gICAgICAgICAgICAgICAgLy8gVGhlIGluaXRpYWxpemF0aW9uIHdpbGwgcnVuIGFnYWluIHdoZW4gZWxlbWVudE9wdGlvbnMgY2hhbmdlcyB2aWEgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm8gZWxlbWVudElkIGluIHRlbXBsYXRlIGRhdGEgLSBjbGVhciBhbGwgZWxlbWVudC1yZWxhdGVkIGZpZWxkcyBhbmQgc2V0IGRlZmF1bHRzXG4gICAgICAgICAgICAgIC8vIEJ1dCBkb24ndCBvdmVycmlkZSB1c2VyJ3Mgc2NyZWVuIG5hbWUgc2VsZWN0aW9uIGlmIHRoZXkndmUgYWxyZWFkeSBzZWxlY3RlZCBvbmVcbiAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHNjcmVlbk5hbWVJZCBpZiBpdCB3YXNuJ3Qgc2V0IGJ5IHVzZXIgc2VsZWN0aW9uXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIGZvcm0gY29udHJvbCBoYXMgYSB2YWxpZCBzY3JlZW4gbmFtZSAobm90ICdub25lJylcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgIGlmICghY3VycmVudFNjcmVlbk5hbWVWYWx1ZSB8fCBjdXJyZW50U2NyZWVuTmFtZVZhbHVlID09PSAnbm9uZScgfHwgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHMgdG8gZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAvLyBTY3JlZW4gbmFtZSBzaG91bGQgYmUgJ25vbmUnIChTZWxlY3Qgb3B0aW9uKVxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkU2NyZWVuTmFtZScsIG5ldyBGb3JtQ29udHJvbCgnbm9uZScpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSgnbm9uZScsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIEVsZW1lbnQgSUQgc2hvdWxkIGJlIG51bGxcbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnaWQnLCBuZXcgRm9ybUNvbnRyb2wobnVsbCkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqIEdldCBmb3JtIGdyb3VwIGZvciBhIHZhcmlhYmxlIGJ5IG5hbWUgZnJvbSBGb3JtQXJyYXkgKi9cbiAgZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy52YXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKiBHZXQgZm9ybSBncm91cCBhdCBhIHNwZWNpZmljIGluZGV4IGZyb20gRm9ybUFycmF5IChmb3IgdGVtcGxhdGUgdXNlKSAqL1xuICBnZXRGb3JtR3JvdXBBdChpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHwgbnVsbCB7XG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICBwcml2YXRlIHByZWNvbXB1dGVDb25maWdzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykgcmV0dXJuO1xuICAgIFxuICAgIC8vIFByZS1jb21wdXRlIGFsbCBzZWxlY3QgY29uZmlnc1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICAvLyBQcmUtY29tcHV0ZSByZWd1bGFyIHNlbGVjdCBjb25maWdzXG4gICAgICBpZiAodGhpcy5zaG91bGRTaG93RHJvcGRvd24odmFyaWFibGUpKSB7XG4gICAgICAgIHRoaXMuZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFByZS1jb21wdXRlIGRhdGEgdHlwZSBzZWxlY3QgY29uZmlnc1xuICAgICAgaWYgKHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlKSkge1xuICAgICAgICB0aGlzLmdldERhdGFUeXBlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgIC8vIFByZS1jb21wdXRlIHBhcmFtZXRlciBhbmQgZW52aXJvbm1lbnQgc2VsZWN0IGNvbmZpZ3MgaWYgbmVlZGVkXG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICAgICAgdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAvLyBQcmUtY29tcHV0ZSBkYXRhIHNldCBjb25maWcgaWYgdGVzdCBkYXRhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAgICAgdGhpcy5nZXREYXRhU2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICAvLyBQcmUtY29tcHV0ZSBwYXJhbWV0ZXIgY29uZmlnIGlmIGRhdGEgc2V0IGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgICAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgICAgICB0aGlzLmdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgLy8gUHJlLWNvbXB1dGUgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGNvbmZpZyBpZiBlbnZpcm9ubWVudCBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUHJlLWNvbXB1dGUgZWxlbWVudCB2YXJpYWJsZSBjb25maWdzIChzY3JlZW4gbmFtZSArIGVsZW1lbnQpXG4gICAgICBpZiAodGhpcy5pc0VsZW1lbnRUeXBlKHZhcmlhYmxlKSkge1xuICAgICAgICB0aGlzLmdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgZWxlbWVudCBjb25maWcgaWYgc2NyZWVuIG5hbWUgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgdGhpcy5nZXRFbGVtZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBwYXJzZVRlc3REYXRhVmFsdWUodmFsdWU6IHN0cmluZyk6IHsgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JywgcmF3VmFsdWU6IHN0cmluZyB9IHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAncGxhaW4tdGV4dCcsIHJhd1ZhbHVlOiAnJyB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGFyYW1ldGVyIGZvcm1hdDogQHx2YWx1ZXxcbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnQHwnKSAmJiB2YWx1ZS5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ3BhcmFtZXRlcicsIHJhd1ZhbHVlOiB2YWx1ZS5zbGljZSgyLCAtMSkgfTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZm9yIHJ1bnRpbWUgZm9ybWF0OiAkfHZhbHVlfFxuICAgIGVsc2UgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyR8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdydW50aW1lJywgcmF3VmFsdWU6IHZhbHVlLnNsaWNlKDIsIC0xKSB9O1xuICAgIH1cbiAgICAvLyBDaGVjayBmb3IgZW52aXJvbm1lbnQgZm9ybWF0OiAqfHZhbHVlfFxuICAgIGVsc2UgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdlbnZpcm9ubWVudCcsIHJhd1ZhbHVlOiB2YWx1ZS5zbGljZSgyLCAtMSkgfTtcbiAgICB9XG4gICAgLy8gUGxhaW4gdGV4dCAobm8gZm9ybWF0dGluZylcbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAncGxhaW4tdGV4dCcsIHJhd1ZhbHVlOiB2YWx1ZSB9O1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSBmb3JtYXRUZXN0RGF0YVZhbHVlKHJhd1ZhbHVlOiBzdHJpbmcsIGRhdGFUeXBlOiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcpOiBzdHJpbmcge1xuICAgIGlmICghcmF3VmFsdWUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgXG4gICAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgICAgY2FzZSAncGFyYW1ldGVyJzpcbiAgICAgICAgcmV0dXJuIGBAfCR7cmF3VmFsdWV9fGA7XG4gICAgICBjYXNlICdydW50aW1lJzpcbiAgICAgICAgcmV0dXJuIGAkfCR7cmF3VmFsdWV9fGA7XG4gICAgICBjYXNlICdlbnZpcm9ubWVudCc6XG4gICAgICAgIHJldHVybiBgKnwke3Jhd1ZhbHVlfXxgO1xuICAgICAgY2FzZSAncGxhaW4tdGV4dCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gcmF3VmFsdWU7XG4gICAgfVxuICB9XG4gIFxuICB0cmFja0J5VmFyaWFibGUoaW5kZXg6IG51bWJlciwgdmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBhbnkge1xuICAgIHJldHVybiB2YXJpYWJsZS5uYW1lIHx8IGluZGV4O1xuICB9XG4gIFxuICBnZXRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIFVzZSBjYWNoZSB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgICAvLyBGb3IgZWxlbWVudCB2YXJpYWJsZXMsIGluY2x1ZGUgZWxlbWVudE9wdGlvbnMsIGhhc01vcmVFbGVtZW50cywgYW5kIGlzTG9hZGluZ0VsZW1lbnRzIGluIGNhY2hlIGtleVxuICAgIC8vIE9wdGltaXplIGNhY2hlIGtleSBjb21wdXRhdGlvbiAtIHVzZSBsZW5ndGggaW5zdGVhZCBvZiBmdWxsIGFycmF5IGpvaW4gZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IG9wdGlvbnNLZXkgPSB2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdmFyaWFibGUuZGF0YUtleSA9PT0gJ2xhYmVsJ1xuICAgICAgPyBgJHt0aGlzLmVsZW1lbnRPcHRpb25zLmxlbmd0aH1fJHt0aGlzLmVsZW1lbnRPcHRpb25zLm1hcChlbCA9PiBlbC5pZCB8fCAnJykuam9pbignLCcpfWAgXG4gICAgICA6IGAke3ZhcmlhYmxlLm9wdGlvbnM/Lmxlbmd0aCB8fCAwfV8ke3ZhcmlhYmxlLm9wdGlvbnM/LmpvaW4oJywnKSB8fCAnJ31gO1xuICAgIC8vIEluY2x1ZGUgaGFzTW9yZUVsZW1lbnRzIGFuZCBpc0xvYWRpbmdFbGVtZW50cyBpbiBjYWNoZSBrZXkgZm9yIHNlbGVjdG9yIHZhcmlhYmxlc1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gdmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdsYWJlbCdcbiAgICAgID8gYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fV8ke3RoaXMuaGFzTW9yZUVsZW1lbnRzfV8ke3RoaXMuaXNMb2FkaW5nRWxlbWVudHN9YFxuICAgICAgOiBgJHt2YXJpYWJsZS5uYW1lfV8ke29wdGlvbnNLZXl9YDtcbiAgICBpZiAodGhpcy5zZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBVc2UgZWxlbWVudE9wdGlvbnMgaWYgdmFyaWFibGUgbmFtZSBpcyAnc2VsZWN0b3InLCBvdGhlcndpc2UgdXNlIHZhcmlhYmxlLm9wdGlvbnNcbiAgICAvLyBFeHRyYWN0IGVsZW1lbnQgbmFtZXMgZnJvbSBFbGVtZW50IG9iamVjdHNcbiAgICBsZXQgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAgIGlmICh2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdmFyaWFibGUuZGF0YUtleSA9PT0gJ2xhYmVsJykge1xuICAgICAgLy8gRm9yIGVsZW1lbnQgb3B0aW9ucywgdXNlIGxvY2F0b3JWYWx1ZSBhcyBib3RoIGlkIGFuZCB2YWx1ZSBzbyB0aGUgY29tcG9uZW50IHJldHVybnMgbG9jYXRvclZhbHVlXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIHNlbGVjdGVkIHZhbHVlIGlzIHRoZSBsb2NhdG9yVmFsdWUgKG5vdCB0aGUgZWxlbWVudCBpZClcbiAgICAgIG9wdGlvbnNBcnJheSA9IHRoaXMuZWxlbWVudE9wdGlvbnNcbiAgICAgICAgLm1hcChlbCA9PiB7XG4gICAgICAgICAgY29uc3QgbG9jYXRvclZhbHVlID0gZWwubG9jYXRvclZhbHVlIHx8ICcnO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogbG9jYXRvclZhbHVlLCAvLyBVc2UgbG9jYXRvclZhbHVlIGFzIGlkIHNvIGl0IGdldHMgcmV0dXJuZWQgYXMgdGhlIHZhbHVlXG4gICAgICAgICAgICBlbGVtZW50SWQ6IGVsLmlkPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgdmFsdWU6IGxvY2F0b3JWYWx1ZSwgLy8gQWxzbyBzZXQgdmFsdWUgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICBuYW1lOiBgJHtlbC5uYW1lfSAoJHtlbC5zY3JlZW5OYW1lT2JqPy5uYW1lIHx8ICcnfSlgLFxuICAgICAgICAgICAgbGFiZWw6IGAke2VsLm5hbWV9ICgke2VsLnNjcmVlbk5hbWVPYmo/Lm5hbWUgfHwgJyd9KWAsXG4gICAgICAgICAgICBzY3JlZW5OYW1lSWQ6IGVsLnNjcmVlbk5hbWVJZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHNjcmVlbk5hbWVPYmo6IGVsLnNjcmVlbk5hbWVPYmosXG4gICAgICAgICAgICBvdGhlckxvY2F0b3I6IGVsLm90aGVyTG9jYXRvclxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zQXJyYXkgPSB2YXJpYWJsZS5vcHRpb25zPy5tYXAob3B0ID0+IHtyZXR1cm4ge2lkOiBvcHQsIHZhbHVlOiBvcHQsIG5hbWU6IG9wdCwgbGFiZWw6IG9wdH19KSBhcyBTZWxlY3RPcHRpb25bXSB8fCBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIGxvYWQgbW9yZSBhbmQgc2VhcmNoIHN1cHBvcnQgZm9yIHNlbGVjdG9yIHZhcmlhYmxlc1xuICAgIGlmICh2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdmFyaWFibGUuZGF0YUtleSA9PT0gJ2xhYmVsJykge1xuICAgICAgY29uZmlnLnNlYXJjaGFibGUgPSB0cnVlOyAvLyBFbmFibGUgc2VhcmNoIGZvciBzZWxlY3RvciBkcm9wZG93blxuICAgICAgY29uZmlnLnNlcnZlclNlYXJjaCA9IHRydWU7IC8vIEVuYWJsZSBzZXJ2ZXItc2lkZSBzZWFyY2hcbiAgICAgIGNvbmZpZy5oYXNNb3JlID0gdGhpcy5oYXNNb3JlRWxlbWVudHM7XG4gICAgICBjb25maWcuaXNMb2FkaW5nID0gdGhpcy5pc0xvYWRpbmdFbGVtZW50cztcbiAgICAgIGNvbmZpZy5vbkxvYWRNb3JlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRWxlbWVudHMuZW1pdCgpO1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5vblNlYXJjaCA9IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIEVtaXQgc2VhcmNoIGV2ZW50IHdoZW4gdXNlciB0eXBlcyBpbiB0aGUgc2VhcmNoIGJveFxuICAgICAgICB0aGlzLnNlYXJjaEVsZW1lbnRzLmVtaXQocXVlcnkpO1xuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgb25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKCF2YXJpYWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIElmIHRoaXMgaXMgYSB0ZXN0LWRhdGEgdmFyaWFibGUsIHBhcnNlIGFuZCB1cGRhdGUgcmF3IHZhbHVlIGFuZCBkYXRhIHR5cGVcbiAgICBpZiAodGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odmFyaWFibGUpKSB7XG4gICAgICBjb25zdCB7IGRhdGFUeXBlLCByYXdWYWx1ZSB9ID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodmFsdWUgfHwgJycpO1xuICAgICAgdmFyaWFibGUuZGF0YVR5cGUgPSBkYXRhVHlwZTtcbiAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcmF3VmFsdWU7XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBkYXRhIHR5cGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lKTtcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCdkYXRhVHlwZScpKSB7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdkYXRhVHlwZScpPy5zZXRWYWx1ZShkYXRhVHlwZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICBcbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5ICh1c2UgZW1pdEV2ZW50OiBmYWxzZSB0byBwcmV2ZW50IHRyaWdnZXJpbmcgdmFsdWVDaGFuZ2VzKVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBcbiAgICAvLyBFbWl0IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xuICB9XG4gIFxuICBvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5ICh1c2UgZW1pdEV2ZW50OiBmYWxzZSB0byBwcmV2ZW50IHRyaWdnZXJpbmcgdmFsdWVDaGFuZ2VzKVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICAvLyBOb3RlOiBJZiB2YXJpYWJsZSBkb2Vzbid0IGV4aXN0IGluIEZvcm1BcnJheSwgaXQgc2hvdWxkIGJlIGFkZGVkIGJ5IHBhcmVudCBjb21wb25lbnRcbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBcbiAgICAvLyBFbWl0IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLnZhcmlhYmxlQm9vbGVhbkNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGVOYW1lLCB2YWx1ZTogdmFsdWUgfSk7XG4gIH1cbiAgXG4gIHNob3VsZFNob3dEcm9wZG93bih2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIC8vIFVzZSBjYWNoZSB0byBhdm9pZCByZXBlYXRlZCBjYWxjdWxhdGlvbnNcbiAgICBpZiAodGhpcy5zaG91bGRTaG93RHJvcGRvd25DYWNoZS5oYXModmFyaWFibGUubmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3VsZFNob3dEcm9wZG93bkNhY2hlLmdldCh2YXJpYWJsZS5uYW1lKSE7XG4gICAgfVxuICAgIC8vIEZvciBlbGVtZW50IHZhcmlhYmxlcyAoZGF0YUtleSA9PT0gJ2VsZW1lbnQnKSwgd2UgdXNlIGNhc2NhZGluZyBkcm9wZG93bnMgKHNjcmVlbiBuYW1lICsgZWxlbWVudClcbiAgICAvLyBTbyByZXR1cm4gZmFsc2UgdG8gdXNlIHRoZSBjYXNjYWRpbmcgZHJvcGRvd24gcGF0dGVyblxuICAgIGNvbnN0IHJlc3VsdCA9IHZhcmlhYmxlLm5hbWUgPT09ICd0eXBlJyB8fCB2YXJpYWJsZS5uYW1lID09PSAnc2Nyb2xsVG8nIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdsYWJlbCc7XG4gICAgdGhpcy5zaG91bGRTaG93RHJvcGRvd25DYWNoZS5zZXQodmFyaWFibGUubmFtZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIFxuICBuZWVkc0RhdGFUeXBlRHJvcGRvd24odmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsY3VsYXRpb25zXG4gICAgaWYgKHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGUuaGFzKHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZS5nZXQodmFyaWFibGUubmFtZSkhO1xuICAgIH1cbiAgICBjb25zdCBkYXRhS2V5ID0gdmFyaWFibGUuZGF0YUtleT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICBjb25zdCByZXN1bHQgPSBkYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fCBkYXRhS2V5ID09PSAnc291cmNlX3ZhbHVlJyB8fCBkYXRhS2V5ID09PSAndGFyZ2V0X3ZhbHVlJztcbiAgICB0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLnNldCh2YXJpYWJsZS5uYW1lLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgXG4gIGdldERhdGFUeXBlT3B0aW9ucygpOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBzdGF0aWMgYXJyYXlcbiAgICByZXR1cm4gdGhpcy5kYXRhVHlwZU9wdGlvbnM7XG4gIH1cbiAgXG4gIGdldERhdGFUeXBlU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9kYXRhVHlwZWA7XG4gICAgaWYgKHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhVHlwZVNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBpbiBGb3JtQXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCAmJiAhdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnZGF0YVR5cGUnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudERhdGFUeXBlKSk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAnZGF0YVR5cGUnLCAvLyBVc2UgJ2RhdGFUeXBlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBUeXBlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5kYXRhVHlwZU9wdGlvbnMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFUeXBlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgZ2V0Q3VycmVudERhdGFUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAncnVudGltZScgfCAnZW52aXJvbm1lbnQnIHtcbiAgICByZXR1cm4gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICB9XG4gIFxuICBnZXRSYXdWYWx1ZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLnJhd1ZhbHVlIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHNlbGVjdG9yIHZhcmlhYmxlIGlzIGF2YWlsYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlc1xuICAgKi9cbiAgZ2V0IHNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHYuZGF0YUtleSA9PT0gJ2VsZW1lbnQnIHx8IHYuZGF0YUtleSA9PT0gJ2xhYmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcGFyYW1ldGVyIHZhcmlhYmxlIGlzIGF2YWlsYWJsZSAodGVzdERhdGEgd2l0aCBwYXJhbWV0ZXIgdHlwZSlcbiAgICovXG4gIGdldCBwYXJhbWV0ZXJWYXJpYWJsZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5zb21lKHYgPT4ge1xuICAgICAgY29uc3QgZGF0YUtleSA9IHYuZGF0YUtleT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGlmIChkYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fCBkYXRhS2V5ID09PSAnc291cmNlX3ZhbHVlJyB8fCBkYXRhS2V5ID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IHYuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgICAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGF2YWlsYWJsZSAodGVzdERhdGEgd2l0aCBlbnZpcm9ubWVudCB0eXBlKVxuICAgKi9cbiAgZ2V0IGVudmlyb25tZW50VmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFLZXkgPSB2LmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAoZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB2LmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgcmV0dXJuIGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG4gIFxuICBvbkRhdGFUeXBlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCBkYXRhVHlwZTogJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAncnVudGltZScgfCAnZW52aXJvbm1lbnQnKTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgdmFyaWFibGVcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAoIXZhcmlhYmxlKSByZXR1cm47XG4gICAgXG4gICAgLy8gVXBkYXRlIHN0b3JlZCBkYXRhIHR5cGUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgIHZhcmlhYmxlLmRhdGFUeXBlID0gZGF0YVR5cGU7XG4gICAgXG4gICAgLy8gQ2xlYXIgcGFyYW1ldGVyIGFuZCBlbnZpcm9ubWVudCBzZWxlY3QgY29uZmlnIGNhY2hlcyBzaW5jZSBkYXRhIHR5cGUgY2hhbmdlZFxuICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fdGVzdERhdGFQcm9maWxlYCk7XG4gICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fZGF0YVNldGApO1xuICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3BhcmFtRm9yRGF0YVNldGApO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9lbnZpcm9ubWVudGApO1xuICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9lbnZQYXJhbWApO1xuICAgIFxuICAgIC8vIENsZWFyIHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBpZiBzd2l0Y2hpbmcgYXdheSBmcm9tIHBhcmFtZXRlciB0eXBlXG4gICAgaWYgKGRhdGFUeXBlICE9PSAncGFyYW1ldGVyJykge1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBcbiAgICAvLyBDbGVhciBzZWxlY3RlZCBlbnZpcm9ubWVudCBpZiBzd2l0Y2hpbmcgYXdheSBmcm9tIGVudmlyb25tZW50IHR5cGVcbiAgICBpZiAoZGF0YVR5cGUgIT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEdldCBjdXJyZW50IHJhdyB2YWx1ZVxuICAgIGNvbnN0IHJhd1ZhbHVlID0gdmFyaWFibGUucmF3VmFsdWUgfHwgJyc7XG4gICAgXG4gICAgLy8gRm9ybWF0IHRoZSB2YWx1ZSBiYXNlZCBvbiBuZXcgZGF0YSB0eXBlXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdFRlc3REYXRhVmFsdWUocmF3VmFsdWUsIGRhdGFUeXBlKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWUgKGFsd2F5cyBzdG9yZSBmb3JtYXR0ZWQgdmFsdWUgaW4gdmFyaWFibGUpXG4gICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICBcbiAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAvLyBGb3IgcGFyYW1ldGVyIHR5cGUsIHNldCBmb3JtIGNvbnRyb2wgdG8gcmF3IHZhbHVlIHNvIHNlbGVjdCBjYW4gZGlzcGxheSBpdFxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHJhd1ZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgICAgICAvLyBGb3IgZW52aXJvbm1lbnQgdHlwZSwgY2xlYXIgdmFsdWUgYW5kIHNlbGVjdGVkRW52aXJvbm1lbnRcbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIHNlbGVjdGVkRW52aXJvbm1lbnQgY29udHJvbCBpZiBub3QgZW52aXJvbm1lbnQgdHlwZVxuICAgICAgaWYgKGRhdGFUeXBlICE9PSAnZW52aXJvbm1lbnQnICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgdmFyaWFibGVHcm91cC5yZW1vdmVDb250cm9sKCdzZWxlY3RlZEVudmlyb25tZW50Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIElmIHN3aXRjaGluZyB0byBwYXJhbWV0ZXIgdHlwZSwgY2hlY2sgZm9yIGRlZmF1bHQgdmFsdWVzIGFuZCBpbml0aWFsaXplIHRoZW1cbiAgICBpZiAoZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuaW5kZXhPZih2YXJpYWJsZSk7XG4gICAgICAvLyBDaGVjayBpZiBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBhcmUgcHJvdmlkZWQgZnJvbSB0ZXN0IGNhc2VcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAmJiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCAmJiB0aGlzLnBhcmFtZXRlck9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBieSBJRFxuICAgICAgICBjb25zdCBkZWZhdWx0UHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB0ZXN0RGF0YS5pZCA9PT0gdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQpO1xuICAgICAgICBpZiAoZGVmYXVsdFByb2ZpbGUgJiYgZGVmYXVsdFByb2ZpbGUuZGF0YSAmJiBkZWZhdWx0UHJvZmlsZS5kYXRhLmxlbmd0aCA+IHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHREYXRhU2V0ID0gZGVmYXVsdFByb2ZpbGUuZGF0YVt0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdO1xuICAgICAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gZGVmYXVsdFByb2ZpbGUubmFtZSB8fCBkZWZhdWx0UHJvZmlsZS50ZXN0RGF0YU5hbWU7XG4gICAgICAgICAgY29uc3QgZGF0YVNldE5hbWUgPSBkZWZhdWx0RGF0YVNldC5uYW1lO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFNldCB2YXJpYWJsZSBwcm9wZXJ0aWVzIC0gdGhpcyBlbnN1cmVzIGhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKCkgYW5kIGhhc1NlbGVjdGVkRGF0YVNldCgpIHJldHVybiB0cnVlXG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSBwcm9maWxlTmFtZTtcbiAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gZGVmYXVsdFByb2ZpbGUuaWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gZGF0YVNldE5hbWU7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHMgd2l0aCB0aGUgYWN0dWFsIHZhbHVlcyBzbyBkcm9wZG93bnMgZGlzcGxheSBzZWxlY3RlZCBvcHRpb25zXG4gICAgICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgKHN0cmluZykgZm9yIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlIGZvcm0gY29udHJvbCB0byBtYXRjaCBvcHRpb24uaWQgZm9ybWF0XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZFN0cmluZyA9IFN0cmluZyhkZWZhdWx0UHJvZmlsZS5pZCk7XG4gICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZUlkU3RyaW5nKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDbGVhciBjYWNoZXMgdG8gZm9yY2UgcmVjb21wdXRhdGlvbiBvZiBjb25maWdzIHdpdGggbmV3IHZhbHVlc1xuICAgICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fdGVzdERhdGFQcm9maWxlYCk7XG4gICAgICAgICAgY29uc3QgZGF0YVNldEtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGVOYW1lfV9kYXRhU2V0YCkpIHtcbiAgICAgICAgICAgICAgZGF0YVNldEtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZGF0YVNldEtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlTmFtZX1fcGFyYW1Gb3JEYXRhU2V0YCkpIHtcbiAgICAgICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBQcmUtY29tcHV0ZSB0aGUgbmV3IHNlbGVjdCBjb25maWcgaWYgbmVlZGVkXG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuaW5kZXhPZih2YXJpYWJsZSk7XG4gICAgICBpZiAoZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICAgIC8vIFByZS1jb21wdXRlIHRlc3QgZGF0YSBwcm9maWxlIGNvbmZpZ1xuICAgICAgICB0aGlzLmdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAvLyBJZiBhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcHJlLWNvbXB1dGUgZGF0YSBzZXQgY29uZmlnXG4gICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAgIHRoaXMuZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIC8vIElmIGEgZGF0YSBzZXQgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcHJlLWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZ1xuICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgY29uc29sZS5sb2coJ29uRGF0YVR5cGVDaGFuZ2UnLCB2YXJpYWJsZU5hbWUsIGRhdGFUeXBlLCBmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50IHdpdGggZm9ybWF0dGVkIHZhbHVlXG4gICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZU5hbWUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZSB9KTtcbiAgfVxuICBcbiAgb25FbGVtZW50U2VhcmNoKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAvLyBPbmx5IGhhbmRsZSBzZWFyY2ggZm9yIHNlbGVjdG9yIHZhcmlhYmxlc1xuICAgIC8vIFRoZSBrZXkgd2lsbCBiZSAndmFsdWUnIHNpbmNlIHRoYXQncyB3aGF0IHdlIHNldCBpbiB0aGUgY29uZmlnXG4gICAgLy8gRW1pdCB0aGUgc2VhcmNoIHF1ZXJ5IHRvIHBhcmVudCBjb21wb25lbnRcbiAgICB0aGlzLnNlYXJjaEVsZW1lbnRzLmVtaXQoZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgb25UZXN0RGF0YVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCByYXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgdmFyaWFibGVcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAoIXZhcmlhYmxlKSByZXR1cm47XG4gICAgXG4gICAgLy8gVXBkYXRlIHN0b3JlZCByYXcgdmFsdWUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcmF3VmFsdWU7XG4gICAgXG4gICAgLy8gR2V0IGN1cnJlbnQgZGF0YSB0eXBlXG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgXG4gICAgLy8gRm9ybWF0IHRoZSB2YWx1ZSBiYXNlZCBvbiBkYXRhIHR5cGVcbiAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShyYXdWYWx1ZSwgZGF0YVR5cGUpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSB2YXJpYWJsZSB2YWx1ZVxuICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBpbiBGb3JtQXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoZm9ybWF0dGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZU5hbWUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdW5pcXVlIHRlc3QgZGF0YSBwcm9maWxlcyBmcm9tIHBhcmFtZXRlciBvcHRpb25zIChyYXcgVGVzdERhdGEgb2JqZWN0cylcbiAgICovXG4gIGdldFVuaXF1ZVRlc3REYXRhUHJvZmlsZXMoKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBwcm9maWxlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+KCk7XG4gICAgdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZvckVhY2goKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgIC8vIHRlc3REYXRhLm5hbWUgaXMgdGhlIHRlc3REYXRhTmFtZSAocHJvZmlsZSBuYW1lKVxuICAgICAgY29uc3QgcHJvZmlsZU5hbWUgPSB0ZXN0RGF0YS5uYW1lIHx8IHRlc3REYXRhLnRlc3REYXRhTmFtZTtcbiAgICAgIGlmIChwcm9maWxlTmFtZSAmJiAhcHJvZmlsZU1hcC5oYXMocHJvZmlsZU5hbWUpKSB7XG4gICAgICAgIHByb2ZpbGVNYXAuc2V0KHByb2ZpbGVOYW1lLCB7XG4gICAgICAgICAgaWQ6IFN0cmluZyh0ZXN0RGF0YS5pZCksXG4gICAgICAgICAgbmFtZTogcHJvZmlsZU5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvZmlsZXMgPSBBcnJheS5mcm9tKHByb2ZpbGVNYXAudmFsdWVzKCkpO1xuICAgIHJldHVybiBwcm9maWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGF0YSBzZXRzIGZvciBhIHNwZWNpZmljIHRlc3QgZGF0YSBwcm9maWxlXG4gICAqIFJldHVybnMgYWxsIGRhdGEgc2V0cyBmcm9tIHRoZSBwcm9maWxlJ3MgZGF0YSBhcnJheVxuICAgKi9cbiAgZ2V0RGF0YVNldHNGb3JUZXN0RGF0YVByb2ZpbGUocHJvZmlsZUlkOiBzdHJpbmcpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIGJ5IGlkXG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB0ZXN0RGF0YS5pZCA9PT0gTnVtYmVyKHByb2ZpbGVJZCk7XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCF0ZXN0RGF0YVByb2ZpbGUgfHwgIXRlc3REYXRhUHJvZmlsZS5kYXRhIHx8IHRlc3REYXRhUHJvZmlsZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBSZXR1cm4gYWxsIGRhdGEgc2V0cyBmcm9tIHRoZSBwcm9maWxlXG4gICAgcmV0dXJuIHRlc3REYXRhUHJvZmlsZS5kYXRhLm1hcCgoZGF0YVNldDogYW55KSA9PiAoe1xuICAgICAgaWQ6IGRhdGFTZXQubmFtZSxcbiAgICAgIG5hbWU6IGRhdGFTZXQubmFtZVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFyYW1ldGVycyBmb3IgYSBzcGVjaWZpYyBkYXRhIHNldCBpbiBhIHRlc3QgZGF0YSBwcm9maWxlXG4gICAqIEV4dHJhY3RzIHBhcmFtZXRlciBuYW1lcyBmcm9tIHRoZSBzZWxlY3RlZCBkYXRhIHNldCdzIGRhdGEgb2JqZWN0XG4gICAqL1xuICBnZXRQYXJhbWV0ZXJzRm9yRGF0YVNldChwcm9maWxlSWRPck5hbWU6IHN0cmluZywgZGF0YVNldE5hbWU6IHN0cmluZyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgaWQgb3IgbmFtZVxuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAvLyBUcnkgdG8gbWF0Y2ggYnkgSUQgZmlyc3QgKGlmIHByb2ZpbGVJZE9yTmFtZSBpcyBhIG51bWJlcilcbiAgICAgIGNvbnN0IGlkTWF0Y2ggPSAhaXNOYU4oTnVtYmVyKHByb2ZpbGVJZE9yTmFtZSkpICYmIHRlc3REYXRhLmlkID09PSBOdW1iZXIocHJvZmlsZUlkT3JOYW1lKTtcbiAgICAgIC8vIE90aGVyd2lzZSB0cnkgdG8gbWF0Y2ggYnkgbmFtZVxuICAgICAgY29uc3QgbmFtZU1hdGNoID0gKHRlc3REYXRhLm5hbWUgfHwgdGVzdERhdGEudGVzdERhdGFOYW1lKSA9PT0gcHJvZmlsZUlkT3JOYW1lO1xuICAgICAgcmV0dXJuIGlkTWF0Y2ggfHwgbmFtZU1hdGNoO1xuICAgIH0pO1xuICAgIFxuICAgIGlmICghdGVzdERhdGFQcm9maWxlIHx8ICF0ZXN0RGF0YVByb2ZpbGUuZGF0YSB8fCB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gRmluZCB0aGUgc3BlY2lmaWMgZGF0YSBzZXQgYnkgbmFtZVxuICAgIGNvbnN0IGRhdGFTZXQgPSB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5maW5kKChkczogYW55KSA9PiBkcy5uYW1lID09PSBkYXRhU2V0TmFtZSk7XG4gICAgaWYgKCFkYXRhU2V0IHx8ICFkYXRhU2V0LmRhdGEpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gR2V0IGFsbCBwYXJhbWV0ZXIga2V5cyBmcm9tIHRoZSBkYXRhIHNldCdzIGRhdGEgb2JqZWN0XG4gICAgY29uc3QgcGFyYW1ldGVyTmFtZXMgPSBPYmplY3Qua2V5cyhkYXRhU2V0LmRhdGEpO1xuICAgIHJldHVybiBwYXJhbWV0ZXJOYW1lcy5tYXAocGFyYW1OYW1lID0+ICh7XG4gICAgICBpZDogcGFyYW1OYW1lLFxuICAgICAgbmFtZTogcGFyYW1OYW1lLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgdGVzdCBkYXRhIHByb2ZpbGUgZHJvcGRvd24gKGZpcnN0IGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzKVxuICAgKi9cbiAgZ2V0VGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X3Rlc3REYXRhUHJvZmlsZWA7XG4gICAgXG4gICAgLy8gR2V0IHVuaXF1ZSB0ZXN0IGRhdGEgcHJvZmlsZXNcbiAgICBjb25zdCBwcm9maWxlcyA9IHRoaXMuZ2V0VW5pcXVlVGVzdERhdGFQcm9maWxlcygpO1xuICAgIC8vIENyZWF0ZSBvcHRpb25zIHdpdGggcHJvZmlsZSBuYW1lIGFuZCBJRCAoZGlzcGxheSBuYW1lIHdpdGggSUQpXG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHByb2ZpbGVzLm1hcChwcm9maWxlID0+IHtcbiAgICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIHRvIGdldCB0aGUgSURcbiAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0ZXN0RGF0YS5uYW1lIHx8IHRlc3REYXRhLnRlc3REYXRhTmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWUgPT09IHByb2ZpbGUubmFtZTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvZmlsZUlkID0gdGVzdERhdGFQcm9maWxlPy5pZCB8fCBwcm9maWxlLmlkO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogU3RyaW5nKHByb2ZpbGVJZCksXG4gICAgICAgIHZhbHVlOiBwcm9maWxlLm5hbWUsXG4gICAgICAgIG5hbWU6IGAke3Byb2ZpbGUubmFtZX1gLCAvLyBEaXNwbGF5IG5hbWUgd2l0aCBJRFxuICAgICAgICBsYWJlbDogYCR7cHJvZmlsZS5uYW1lfWBcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBmb3IgdGVzdCBkYXRhIHByb2ZpbGUgc2VsZWN0aW9uIGFuZCB1cGRhdGUgaXRcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvZmlsZSBuYW1lXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgXG4gICAgICAgICAgPyBTdHJpbmcodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCkgXG4gICAgICAgICAgOiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgfHwgJycpO1xuICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnRWYWx1ZSkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBBbHdheXMgdXBkYXRlIGZvcm0gY29udHJvbCB2YWx1ZSBpZiB2YXJpYWJsZSBoYXMgYSBzZWxlY3RlZCBwcm9maWxlXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIHZhbHVlIGlzIHNldCBldmVuIGlmIGNvbmZpZyB3YXMgY2FjaGVkXG4gICAgICAvLyBVc2UgcHJvZmlsZSBJRCAod2hpY2ggbWF0Y2hlcyBvcHQuaWQpIGluc3RlYWQgb2YgcHJvZmlsZSBuYW1lICh3aGljaCBtYXRjaGVzIG9wdC52YWx1ZSlcbiAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJvZmlsZUlkU3RyaW5nID0gU3RyaW5nKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpO1xuICAgICAgICAvLyBWZXJpZnkgdGhlIHByb2ZpbGUgSUQgZXhpc3RzIGluIG9wdGlvbnMgYmVmb3JlIHNldHRpbmdcbiAgICAgICAgY29uc3QgcHJvZmlsZUV4aXN0cyA9IG9wdGlvbnNBcnJheS5zb21lKG9wdCA9PiBvcHQuaWQgPT09IHByb2ZpbGVJZFN0cmluZyk7XG4gICAgICAgIGlmIChwcm9maWxlRXhpc3RzKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudENvbnRyb2xWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudENvbnRyb2xWYWx1ZSAhPT0gcHJvZmlsZUlkU3RyaW5nKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBpZiB3ZSBvbmx5IGhhdmUgdGhlIHByb2ZpbGUgbmFtZSwgZmluZCB0aGUgbWF0Y2hpbmcgb3B0aW9uIGFuZCB1c2UgaXRzIElEXG4gICAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gb3B0aW9uc0FycmF5LmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PT0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUpO1xuICAgICAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q29udHJvbFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50Q29udHJvbFZhbHVlICE9PSBtYXRjaGluZ09wdGlvbi5pZCkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKG1hdGNoaW5nT3B0aW9uLmlkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSB0aGUgdmFyaWFibGUncyBwcm9maWxlIElEIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IE51bWJlcihtYXRjaGluZ09wdGlvbi5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgY2FjaGUgYWZ0ZXIgZW5zdXJpbmcgZm9ybSBjb250cm9sIGlzIHNldFxuICAgIGlmICh0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgLSBpZiBzbywgZGlzYWJsZSB0aGUgZHJvcGRvd25cbiAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5oYXNEZWZhdWx0VGVzdERhdGFTZWxlY3Rpb24oKTtcbiAgICBcbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVQYXJhbWV0ZXJzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ1BhcmFtZXRlcnMsXG4gICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaFBhcmFtZXRlcnMuZW1pdChxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVQYXJhbWV0ZXJzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gVmFsdWUgaXMgdGhlIHByb2ZpbGUgSUQgKHN0cmluZykgZnJvbSB0aGUgbWF0LW9wdGlvblxuICAgICAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBieSBJRCB0byBnZXQgdGhlIG5hbWVcbiAgICAgICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGVzdERhdGEuaWQgPT09IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gU3RvcmUgYm90aCBJRCBhbmQgbmFtZVxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gdGVzdERhdGFQcm9maWxlPy5pZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGU/Lm5hbWUgfHwgdGVzdERhdGFQcm9maWxlPy50ZXN0RGF0YU5hbWUgfHwgJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBkYXRhIHNldCBhbmQgcGFyYW1ldGVyIHNlbGVjdGlvbiB3aGVuIHByb2ZpbGUgY2hhbmdlc1xuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sc1xuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJykpIHtcbiAgICAgICAgICAgIHZhckdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhckdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICAgIHZhckdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIHZhckdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIGNhY2hlcyBmb3IgZGF0YSBzZXQgYW5kIHBhcmFtZXRlciBzZWxlY3QgY29uZmlncyBzaW5jZSBwcm9maWxlIGNoYW5nZWRcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc2V0IGFuZCBwYXJhbWV0ZXIgY29uZmlncyBmb3IgdGhpcyB2YXJpYWJsZVxuICAgICAgICBjb25zdCBkYXRhU2V0S2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHt2YXJpYWJsZS5uYW1lfV9kYXRhU2V0YCkpIHtcbiAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKHZhbHVlOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgc2VsZWN0ZWQgZGF0YSBzZXQgd2hlbiBwcm9maWxlIGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2tcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGRhdGEgc2V0IGRyb3Bkb3duIChzZWNvbmQgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMgLSBzaG93cyBkYXRhIHNldHMgZnJvbSBzZWxlY3RlZCBwcm9maWxlKVxuICAgKi9cbiAgZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gR2V0IHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChwcmVmZXJyZWQpIG9yIG5hbWUgKGZhbGxiYWNrKVxuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZUlkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZDtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICBcbiAgICBpZiAoIXNlbGVjdGVkUHJvZmlsZUlkICYmICFzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgbm8gcHJvZmlsZSBpcyBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAnc2VsZWN0ZWREYXRhU2V0JyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVGVzdCBEYXRhIFByb2ZpbGUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmaW5kIElEIGZyb20gcHJvZmlsZSBuYW1lXG4gICAgbGV0IHByb2ZpbGVJZFRvVXNlOiBzdHJpbmc7XG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZUlkKSB7XG4gICAgICBwcm9maWxlSWRUb1VzZSA9IFN0cmluZyhzZWxlY3RlZFByb2ZpbGVJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmQgdGhlIHByb2ZpbGUgSUQgZnJvbSB0aGUgcHJvZmlsZSBuYW1lXG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBuYW1lID09PSBzZWxlY3RlZFByb2ZpbGU7XG4gICAgICB9KTtcbiAgICAgIHByb2ZpbGVJZFRvVXNlID0gdGVzdERhdGFQcm9maWxlPy5pZCA/IFN0cmluZyh0ZXN0RGF0YVByb2ZpbGUuaWQpIDogJyc7XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgZm9yIGNhY2hlIGtleSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvZmlsZSBuYW1lXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9kYXRhU2V0XyR7cHJvZmlsZUlkVG9Vc2UgfHwgc2VsZWN0ZWRQcm9maWxlIHx8ICcnfWA7XG4gICAgaWYgKHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgZGF0YSBzZXRzIGZvciB0aGUgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgdXNpbmcgSURcbiAgICBjb25zdCBkYXRhU2V0cyA9IHRoaXMuZ2V0RGF0YVNldHNGb3JUZXN0RGF0YVByb2ZpbGUocHJvZmlsZUlkVG9Vc2UpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBkYXRhU2V0cy5tYXAoZGF0YVNldCA9PiAoe1xuICAgICAgaWQ6IGRhdGFTZXQubmFtZSxcbiAgICAgIHZhbHVlOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBuYW1lOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBsYWJlbDogZGF0YVNldC5uYW1lXG4gICAgfSkpO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGRhdGEgc2V0IHNlbGVjdGlvblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YVNldCA9IHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCB8fCAnJztcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudERhdGFTZXQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWUgaWYgdmFyaWFibGUgaGFzIGEgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IC0gaWYgc28sIGRpc2FibGUgdGhlIGRyb3Bkb3duXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk7XG4gICAgXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZERhdGFTZXQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRGF0YSBTZXQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSBzZWxlY3RlZCBkYXRhIHNldFxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSB2YWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBkYXRhIHNldCBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sc1xuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBjYWNoZXMgZm9yIHBhcmFtZXRlciBzZWxlY3QgY29uZmlnIHNpbmNlIGRhdGEgc2V0IGNoYW5nZWRcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKGNvbmZpZ1ZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fcGFyYW1Gb3JEYXRhU2V0X2ApKSB7XG4gICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2tcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBwYXJhbWV0ZXIgZHJvcGRvd24gKHRoaXJkIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzIC0gc2hvd3MgcGFyYW1ldGVycyBmcm9tIHNlbGVjdGVkIGRhdGEgc2V0KVxuICAgKi9cbiAgZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBHZXQgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgKHByZWZlcnJlZCkgb3IgbmFtZSAoZmFsbGJhY2spIGFuZCBkYXRhIHNldFxuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZUlkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZDtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICBjb25zdCBzZWxlY3RlZERhdGFTZXQgPSB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQ7XG4gICAgXG4gICAgaWYgKCghc2VsZWN0ZWRQcm9maWxlSWQgJiYgIXNlbGVjdGVkUHJvZmlsZSkgfHwgIXNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGNvbmZpZyBpZiBwcm9maWxlIG9yIGRhdGEgc2V0IGlzIG5vdCBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogKHNlbGVjdGVkUHJvZmlsZUlkIHx8IHNlbGVjdGVkUHJvZmlsZSkgPyAnU2VsZWN0IERhdGEgU2V0IGZpcnN0JyA6ICdTZWxlY3QgVGVzdCBEYXRhIFByb2ZpbGUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvZmlsZSBuYW1lXG4gICAgY29uc3QgcHJvZmlsZUlkZW50aWZpZXIgPSBzZWxlY3RlZFByb2ZpbGVJZCA/IFN0cmluZyhzZWxlY3RlZFByb2ZpbGVJZCkgOiAoc2VsZWN0ZWRQcm9maWxlIHx8ICcnKTtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldF8ke3Byb2ZpbGVJZGVudGlmaWVyfV8ke3NlbGVjdGVkRGF0YVNldH1gO1xuICAgIGlmICh0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gR2V0IHBhcmFtZXRlcnMgZm9yIHRoZSBzZWxlY3RlZCBkYXRhIHNldCB1c2luZyBwcm9maWxlIElEIG9yIG5hbWVcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5nZXRQYXJhbWV0ZXJzRm9yRGF0YVNldChwcm9maWxlSWRlbnRpZmllciwgc2VsZWN0ZWREYXRhU2V0KTtcbiAgICBjb25zdCBvcHRpb25zQXJyYXk6IFNlbGVjdE9wdGlvbltdID0gcGFyYW1ldGVycy5tYXAocGFyYW0gPT4gKHtcbiAgICAgIGlkOiBgQHwke3BhcmFtLm5hbWV9fGAsIC8vIFVzZSBwYXJhbS5uYW1lIGFzIGlkIChtYXQtb3B0aW9uIHdpbGwgdXNlIHRoaXMpXG4gICAgICB2YWx1ZTogYEB8JHtwYXJhbS5uYW1lfXxgLCAvLyBGb3JtYXR0ZWQgdmFsdWUgZm9yIGRpc3BsYXlcbiAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICBsYWJlbDogcGFyYW0ubmFtZVxuICAgIH0pKTtcblxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGFuZCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBjdXJyZW50IHZhbHVlXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWx1ZSwgZW5zdXJlIGZvcm0gY29udHJvbCBtYXRjaGVzIHRoZSBvcHRpb24gaWQgKGZvcm1hdHRlZCB2YWx1ZSlcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlIHx8ICcnO1xuICAgICAgLy8gQ2hlY2sgaWYgdmFsdWUgaXMgYWxyZWFkeSBmb3JtYXR0ZWQgKGUuZy4sIFwiQHxlbWFpbHxcIilcbiAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoJ0B8JykgJiYgY3VycmVudFZhbHVlLmVuZHNXaXRoKCd8JylcbiAgICAgICAgPyBjdXJyZW50VmFsdWVcbiAgICAgICAgOiAoY3VycmVudFZhbHVlID8gYEB8JHtjdXJyZW50VmFsdWV9fGAgOiAnJyk7XG4gICAgICAvLyBTZXQgZm9ybSBjb250cm9sIHRvIGZvcm1hdHRlZCB2YWx1ZSAobWF0Y2hlcyBvcHQuaWQpIHNvIHNlbGVjdCBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICAgIGlmIChmb3JtYXR0ZWRWYWx1ZSAmJiBwYXJhbWV0ZXJzLnNvbWUocCA9PiBgQHwke3AubmFtZX18YCA9PT0gZm9ybWF0dGVkVmFsdWUpKSB7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAndmFsdWUnLCAvLyBVc2UgJ3ZhbHVlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCAke3ZhcmlhYmxlLmxhYmVsfWAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiBmYWxzZSwgLy8gQ2xpZW50LXNpZGUgc2VhcmNoIHNpbmNlIHdlIGFscmVhZHkgaGF2ZSBhbGwgcGFyYW1ldGVycyBmcm9tIHRoZSBzZWxlY3RlZCBkYXRhIHNldFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogZmFsc2UsIC8vIE5vIHBhZ2luYXRpb24gZm9yIHBhcmFtZXRlcnMgd2l0aGluIGEgZGF0YSBzZXRcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gVmFsdWUgcmVjZWl2ZWQgaXMgdGhlIGZvcm1hdHRlZCB2YWx1ZSAoZS5nLiwgXCJAfGVtYWlsfFwiKSBiZWNhdXNlIG1hdC1vcHRpb24gdXNlcyBvcHQuaWRcbiAgICAgICAgLy8gRXh0cmFjdCBwYXJhbWV0ZXIgbmFtZSBmcm9tIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlOyAvLyBUaGlzIGlzIGFscmVhZHkgZm9ybWF0dGVkIGFzIEB8cGFyYW1OYW1lfFxuICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSBmb3JtYXR0ZWRWYWx1ZS5zdGFydHNXaXRoKCdAfCcpICYmIGZvcm1hdHRlZFZhbHVlLmVuZHNXaXRoKCd8JylcbiAgICAgICAgICA/IGZvcm1hdHRlZFZhbHVlLnNsaWNlKDIsIC0xKVxuICAgICAgICAgIDogZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgcmF3IHZhbHVlIChzdG9yZSBwYXJhbWV0ZXIgbmFtZSB3aXRob3V0IGZvcm1hdHRpbmcpXG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcGFyYW1OYW1lO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlIChzdG9yZSBmb3JtYXR0ZWQgdmFsdWUgZm9yIHRlbXBsYXRlKVxuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBpbiBGb3JtQXJyYXkgLSB1c2UgZm9ybWF0dGVkIHZhbHVlIChtYXRjaGVzIG9wdC5pZCkgc28gc2VsZWN0IGRpc3BsYXlzIGNvcnJlY3RseVxuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCAmJiB2YXJHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAvLyBTZXQgdG8gZm9ybWF0dGVkIHZhbHVlIHNvIHRoZSBzZWxlY3QgY2FuIG1hdGNoIGFuZCBkaXNwbGF5IHRoZSBzZWxlY3RlZCBvcHRpb25cbiAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBlbWl0XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBcbiAgICAgICAgLy8gRW1pdCBmb3JtYXR0ZWQgdmFsdWUgZm9yIHBhcmVudCBjb21wb25lbnQgKHRoaXMgaXMgd2hhdCBnZXRzIHVzZWQgaW4gdGhlIHRlbXBsYXRlKVxuICAgICAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlLm5hbWUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVuaXF1ZSBlbnZpcm9ubWVudHMgZnJvbSBlbnZpcm9ubWVudCBvcHRpb25zXG4gICAqL1xuICBnZXRVbmlxdWVFbnZpcm9ubWVudHMoKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBlbnZNYXAgPSBuZXcgTWFwPHN0cmluZywgeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT4oKTtcbiAgICB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5mb3JFYWNoKGVudiA9PiB7XG4gICAgICBpZiAoIWVudk1hcC5oYXMoZW52LmVudmlyb25tZW50KSkge1xuICAgICAgICBlbnZNYXAuc2V0KGVudi5lbnZpcm9ubWVudCwge1xuICAgICAgICAgIGlkOiBlbnYuZW52aXJvbm1lbnQsXG4gICAgICAgICAgbmFtZTogZW52LmVudmlyb25tZW50XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGVudk1hcC52YWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhcmFtZXRlcnMgZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnRcbiAgICovXG4gIGdldFBhcmFtZXRlcnNGb3JFbnZpcm9ubWVudChlbnZpcm9ubWVudE5hbWU6IHN0cmluZyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRPcHRpb25zXG4gICAgICAuZmlsdGVyKGVudiA9PiBlbnYuZW52aXJvbm1lbnQgPT09IGVudmlyb25tZW50TmFtZSlcbiAgICAgIC5tYXAoZW52ID0+ICh7XG4gICAgICAgIGlkOiBlbnYubmFtZSxcbiAgICAgICAgbmFtZTogZW52Lm5hbWVcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgZW52aXJvbm1lbnQgZHJvcGRvd24gKGZpcnN0IGRyb3Bkb3duIC0gc2VsZWN0IGVudmlyb25tZW50KVxuICAgKi9cbiAgZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZW52aXJvbm1lbnRgO1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgdW5pcXVlIGVudmlyb25tZW50c1xuICAgIGNvbnN0IHVuaXF1ZUVudmlyb25tZW50cyA9IHRoaXMuZ2V0VW5pcXVlRW52aXJvbm1lbnRzKCk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHVuaXF1ZUVudmlyb25tZW50cy5tYXAoZW52ID0+ICh7XG4gICAgICBpZDogZW52LmlkLFxuICAgICAgdmFsdWU6IGVudi5uYW1lLFxuICAgICAgbmFtZTogZW52Lm5hbWUsXG4gICAgICBsYWJlbDogZW52Lm5hbWVcbiAgICB9KSk7XG5cbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBmb3IgZW52aXJvbm1lbnQgc2VsZWN0aW9uXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRFbnYgPSB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50IHx8ICcnO1xuICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZEVudmlyb25tZW50JywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnRFbnYpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkRW52aXJvbm1lbnQnLCAvLyBVc2UgJ3NlbGVjdGVkRW52aXJvbm1lbnQnIGFzIGtleVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgRW52aXJvbm1lbnRgLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcnJheSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZUVudmlyb25tZW50cyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdFbnZpcm9ubWVudHMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgZW52aXJvbm1lbnQgbmFtZSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgPSB2YWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEV4dHJhY3QgYW5kIHN0b3JlIGVudmlyb25tZW50IElEIGZyb20gZW52aXJvbm1lbnRPcHRpb25zXG4gICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGVudmlyb25tZW50IG9wdGlvbiB3aXRoIG1hdGNoaW5nIGVudmlyb25tZW50IG5hbWUgdG8gZ2V0IHRoZSBJRFxuICAgICAgICBjb25zdCBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYuZW52aXJvbm1lbnQgPT09IHZhbHVlKTtcbiAgICAgICAgaWYgKGVudk9wdGlvbikge1xuICAgICAgICAgIC8vIEV4dHJhY3QgbnVtZXJpYyBJRCBmcm9tIGVudk9wdGlvbi5pZCAoZm9ybWF0OiBcImVudi03NC10ZXN0XCIgLT4gNzQpXG4gICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGVudk9wdGlvbi5pZC5tYXRjaCgvZW52LShcXGQrKS0vKTtcbiAgICAgICAgICBpZiAoaWRNYXRjaCAmJiBpZE1hdGNoWzFdKSB7XG4gICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSBwYXJzZUludChpZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciB0aGUgcGFyYW1ldGVyIHNlbGVjdGlvbiB3aGVuIGVudmlyb25tZW50IGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGNhY2hlIHRvIGZvcmNlIHJlZnJlc2hcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWApO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbFxuICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRFbnZpcm9ubWVudCBjb250cm9sXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50Jyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQcmUtY29tcHV0ZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgbmV3IGVudmlyb25tZW50XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kSW5kZXgodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayB0byB1cGRhdGUgVUlcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRW52aXJvbm1lbnRzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hFbnZpcm9ubWVudHMuZW1pdChxdWVyeSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChzZWNvbmQgZHJvcGRvd24gLSBzZWxlY3QgcGFyYW1ldGVyIGZyb20gZW52aXJvbm1lbnQpXG4gICAqL1xuICBnZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWA7XG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIEdldCBzZWxlY3RlZCBlbnZpcm9ubWVudFxuICAgIGNvbnN0IHNlbGVjdGVkRW52aXJvbm1lbnQgPSB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50O1xuICAgIGlmICghc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGNvbmZpZyBpZiBubyBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBFbnZpcm9ubWVudCBmaXJzdCcsXG4gICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgIG9wdGlvbnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEdldCBwYXJhbWV0ZXJzIGZvciB0aGUgc2VsZWN0ZWQgZW52aXJvbm1lbnRcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5nZXRQYXJhbWV0ZXJzRm9yRW52aXJvbm1lbnQoc2VsZWN0ZWRFbnZpcm9ubWVudCk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHBhcmFtZXRlcnMubWFwKHBhcmFtID0+ICh7XG4gICAgICBpZDogYCp8JHtwYXJhbS5uYW1lfXxgLFxuICAgICAgdmFsdWU6IGAqfCR7cGFyYW0ubmFtZX18YCxcbiAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICBsYWJlbDogcGFyYW0ubmFtZVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAndmFsdWUnLCAvLyBVc2UgJ3ZhbHVlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCBQYXJhbWV0ZXJgLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gV2hlbiBwYXJhbWV0ZXIgaXMgc2VsZWN0ZWQsIHVwZGF0ZSByYXcgdmFsdWUgYW5kIGZvcm1hdCBpdFxuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWUgKHN0b3JlIGZvcm1hdHRlZCB2YWx1ZSlcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVudmlyb25tZW50IElEIGlzIGFscmVhZHkgc3RvcmVkIG9uIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZFxuICAgICAgICAvLyAoaXQgd2FzIHNldCB3aGVuIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZClcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5IC0ga2VlcCByYXcgdmFsdWUgc28gc2VsZWN0IGRpc3BsYXlzIGNvcnJlY3RseVxuICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAvLyBTZXQgdG8gcmF3IHZhbHVlIHNvIHRoZSBzZWxlY3QgY2FuIG1hdGNoIGFuZCBkaXNwbGF5IHRoZSBzZWxlY3RlZCBvcHRpb25cbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIC8vIEVtaXQgZm9ybWF0dGVkIHZhbHVlIGZvciBwYXJlbnQgY29tcG9uZW50XG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IGZvcm1hdHRlZFZhbHVlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIGVudmlyb25tZW50IGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBnZXRTZWxlY3RlZEVudmlyb25tZW50KHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZCBmb3IgYSB2YXJpYWJsZVxuICAgKi9cbiAgaGFzU2VsZWN0ZWRFbnZpcm9ubWVudCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIGVudmlyb25tZW50IElEIGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBnZXRTZWxlY3RlZEVudmlyb25tZW50SWQodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbnZpcm9ubWVudCBJRHMgZm9yIHZhcmlhYmxlcyB0aGF0IHVzZSBlbnZpcm9ubWVudCB0eXBlXG4gICAqIFJldHVybnMgYSBtYXAgb2YgdmFyaWFibGUgbmFtZSB0byBlbnZpcm9ubWVudCBJRFxuICAgKi9cbiAgZ2V0RW52aXJvbm1lbnRJZHNGb3JWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gICAgY29uc3QgZW52SWRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGUpICYmIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCkge1xuICAgICAgICBlbnZJZHMuc2V0KHZhcmlhYmxlLm5hbWUsIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGVudklkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBwbGFpbi10ZXh0XG4gICAqL1xuICBpc1BsYWluVGV4dFR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdwbGFpbi10ZXh0JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBwYXJhbWV0ZXJcbiAgICovXG4gIGlzUGFyYW1ldGVyVHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcic7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGVzdCBkYXRhIHByb2ZpbGUgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZGF0YSBzZXQgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkRGF0YVNldCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBhcmUgc2V0IChmcm9tIHRlc3QgY2FzZSlcbiAgICogSWYgdHJ1ZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgKi9cbiAgaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBlbnZpcm9ubWVudFxuICAgKi9cbiAgaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdmFyaWFibGUgaXMgZWxlbWVudCB0eXBlIChkYXRhS2V5ID09PSAnZWxlbWVudCcpXG4gICAqL1xuICBpc0VsZW1lbnRUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzY3JlZW4gbmFtZSBpcyBzZWxlY3RlZCBmb3IgYW4gZWxlbWVudCB2YXJpYWJsZVxuICAgKiBSZXR1cm5zIHRydWUgaWYgZWl0aGVyIHNlbGVjdGVkU2NyZWVuTmFtZSBvciBzY3JlZW5OYW1lSWQgaXMgc2V0IChhbmQgbm90IFwiTm9uZVwiKVxuICAgKi9cbiAgaGFzU2VsZWN0ZWRTY3JlZW5OYW1lKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgc2NyZWVuTmFtZUlkIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBudW1iZXIgKG5vdCBudWxsL3VuZGVmaW5lZClcbiAgICBpZiAodmFyaWFibGUuc2NyZWVuTmFtZUlkICE9IG51bGwgJiYgdHlwZW9mIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogY2hlY2sgc2VsZWN0ZWRTY3JlZW5OYW1lXG4gICAgcmV0dXJuICEhdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBzY3JlZW4gbmFtZSBkcm9wZG93biAoZmlyc3QgZHJvcGRvd24gZm9yIGVsZW1lbnQgdmFyaWFibGVzKVxuICAgKi9cbiAgZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gSW5jbHVkZSBsb2FkaW5nIHN0YXRlIGluIGNhY2hlIGtleSB0byBpbnZhbGlkYXRlIHdoZW4gbG9hZGluZyBjb21wbGV0ZXNcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X3NjcmVlbk5hbWVfJHt0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmxlbmd0aH1fJHt0aGlzLmlzTG9hZGluZ1NjcmVlbk5hbWVzfWA7XG4gICAgaWYgKHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBvcHRpb25zOiBpbmNsdWRlIGEgXCJOb25lXCIgb3B0aW9uIChkaXNwbGF5ZWQgYXMgXCJTZWxlY3RcIikgcGx1cyBzY3JlZW5OYW1lT3B0aW9ucyBmcm9tIEFQSVxuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnbm9uZScsXG4gICAgICAgIHZhbHVlOiAnU2VsZWN0JyxcbiAgICAgICAgbmFtZTogJ05vbmUnLFxuICAgICAgICBsYWJlbDogJ05vbmUnXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5tYXAoc2NyZWVuTmFtZSA9PiAoe1xuICAgICAgICBpZDogc2NyZWVuTmFtZS5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IHNjcmVlbk5hbWUubmFtZSxcbiAgICAgICAgbmFtZTogc2NyZWVuTmFtZS5uYW1lLFxuICAgICAgICBsYWJlbDogc2NyZWVuTmFtZS5uYW1lXG4gICAgICB9KSlcbiAgICBdO1xuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBzY3JlZW4gbmFtZSBzZWxlY3Rpb25cbiAgICAvLyBUaGUgZm9ybSBjb250cm9sIHZhbHVlIHNob3VsZCBtYXRjaCB0aGUgb3B0aW9uIGlkIChzdHJpbmcgZm9yIFwibm9uZVwiLCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVyIGZvciByZWFsIHNjcmVlbiBuYW1lcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHNjcmVlbk5hbWVJZCBhcyBzdHJpbmcgKHRvIG1hdGNoIG9wdGlvbiBpZCBmb3JtYXQpLCBvciAnbm9uZScgYnkgZGVmYXVsdFxuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPyBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKSA6ICdub25lJztcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woaW5pdGlhbFZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIHZhcmlhYmxlIGhhcyBzY3JlZW5OYW1lSWQgYnV0IGZvcm0gY29udHJvbCBkb2Vzbid0IG1hdGNoXG4gICAgICAgIGlmICh2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWUgPSBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAvLyBDb21wYXJlIGFzIHN0cmluZ3MgdG8gaGFuZGxlIGJvdGggbnVtYmVyIGFuZCBzdHJpbmcgdmFsdWVzXG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZVN0ciAhPT0gZXhwZWN0ZWRWYWx1ZSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShleHBlY3RlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vIHNjcmVlbk5hbWVJZCwgZW5zdXJlIGZvcm0gY29udHJvbCBpcyAnbm9uZScgKGZvciBcIk5vbmVcIiBzZWxlY3Rpb24gYnkgZGVmYXVsdClcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09ICdub25lJyAmJiBjdXJyZW50VmFsdWUgIT09IG51bGwgJiYgY3VycmVudFZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSgnbm9uZScsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkU2NyZWVuTmFtZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBTY3JlZW4gTmFtZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlU2NyZWVuTmFtZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nU2NyZWVuTmFtZXMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gSWYgXCJOb25lXCIgaXMgc2VsZWN0ZWQgKHZhbHVlIGlzICdub25lJyBzdHJpbmcgb3IgbnVsbCksIGNsZWFyIHNjcmVlbiBuYW1lIGFuZCBlbGVtZW50IGluZm9cbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICdub25lJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBjb25maWcgY2FjaGUgZm9yIHRoaXMgdmFyaWFibGVcbiAgICAgICAgICBjb25zdCBrZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZWxlbWVudGApKSB7XG4gICAgICAgICAgICAgIGtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAga2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xzIC0gY2xlYXIgYWxsIGVsZW1lbnQtcmVsYXRlZCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgLy8gU2V0IHNlbGVjdGVkU2NyZWVuTmFtZSB0byAnbm9uZScgdG8gc2hvdyBcIk5vbmVcIiBpcyBzZWxlY3RlZFxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoJ25vbmUnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDbGVhciBlbGVtZW50IElEIGZvcm0gY29udHJvbCB0byBlbnN1cmUgZWxlbWVudElkIGlzIGNsZWFyZWRcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKT8uc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBzdG9wIChubyBlbGVtZW50IGZldGNoIHdoZW4gTm9uZSlcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWx1ZSBpcyB0aGUgb3B0aW9uIGlkIChzdHJpbmcgZm9yIFwibm9uZVwiLCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVyIGZvciByZWFsIHNjcmVlbiBuYW1lcylcbiAgICAgICAgLy8gQ29udmVydCB0byBudW1iZXIgZm9yIHNjcmVlbk5hbWVJZCBpZiBpdCdzIGEgdmFsaWQgbnVtYmVyXG4gICAgICAgIGNvbnN0IHNjcmVlbk5hbWVJZE51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICdub25lJyA/IHBhcnNlSW50KHZhbHVlLCAxMCkgOiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogbnVsbCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2NyZWVuTmFtZUlkTnVtICYmICFpc05hTihzY3JlZW5OYW1lSWROdW0pKSB7XG4gICAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgc2NyZWVuIG5hbWUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHNjcmVlbk5hbWVJZE51bTtcblxuICAgICAgICAgIC8vIEZpbmQgYW5kIHN0b3JlIHNjcmVlbiBuYW1lIG5hbWUgZnJvbSBzY3JlZW5OYW1lT3B0aW9uc1xuICAgICAgICAgIGNvbnN0IHNjcmVlbk5hbWVPcHRpb24gPSB0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmZpbmQoc24gPT4gc24uaWQgPT09IHNjcmVlbk5hbWVJZE51bSk7XG4gICAgICAgICAgaWYgKHNjcmVlbk5hbWVPcHRpb24pIHtcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHNjcmVlbk5hbWVPcHRpb24ubmFtZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIG5vdCBmb3VuZCwgc3RpbGwgc2V0IHRoZSBJRCBidXQgY2xlYXIgdGhlIG5hbWVcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDbGVhciB0aGUgZWxlbWVudCBzZWxlY3Rpb24gd2hlbiBzY3JlZW4gbmFtZSBjaGFuZ2VzXG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG5cbiAgICAgICAgICAvLyBDbGVhciBlbGVtZW50IGNvbmZpZyBjYWNoZSB0byBmb3JjZSByZWZyZXNoXG4gICAgICAgICAgLy8gQ2xlYXIgYWxsIGVsZW1lbnQgY29uZmlncyBmb3IgdGhpcyB2YXJpYWJsZSBzaW5jZSBzY3JlZW4gbmFtZSBjaGFuZ2VkXG4gICAgICAgICAgY29uc3Qga2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2VsZW1lbnRgKSkge1xuICAgICAgICAgICAgICBrZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIChhcyBzdHJpbmcgdG8gbWF0Y2ggb3B0aW9uIGlkKVxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKFN0cmluZyhzY3JlZW5OYW1lSWROdW0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1pdCBldmVudCB0byBmZXRjaCBlbGVtZW50cyBmaWx0ZXJlZCBieSBzZWxlY3RlZCBzY3JlZW4gbmFtZVxuICAgICAgICAgIHRoaXMuc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUuZW1pdCh7XG4gICAgICAgICAgICBzY3JlZW5OYW1lSWQ6IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCxcbiAgICAgICAgICAgIHNlYXJjaFRlcm06ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSW52YWxpZCB2YWx1ZSAtIGNsZWFyIGV2ZXJ5dGhpbmdcbiAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayB0byB1cGRhdGUgVUkgZmlyc3RcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgY29uZmlnIHdpbGwgYmUgcmVjb21wdXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gZWxlbWVudE9wdGlvbnMgaW5wdXQgY2hhbmdlc1xuICAgICAgICAvLyB2aWEgbmdPbkNoYW5nZXMsIHdoaWNoIHdpbGwgY2xlYXIgdGhlIGNhY2hlIGFuZCB0cmlnZ2VyIHJlLWNvbXB1dGF0aW9uXG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgnJyk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoU2NyZWVuTmFtZS5lbWl0KHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5zY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVsZW1lbnQgZHJvcGRvd24gKHNlY29uZCBkcm9wZG93biAtIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lKVxuICAgKiBPcHRpbWl6ZWQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGZyb20gY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsbHMgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb25cbiAgICovXG4gIGdldEVsZW1lbnRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIEdldCBzZWxlY3RlZCBzY3JlZW4gbmFtZSBJRFxuICAgIGNvbnN0IHNlbGVjdGVkU2NyZWVuTmFtZUlkID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkO1xuICAgIC8vIEluY2x1ZGUgZWxlbWVudE9wdGlvbnMgbGVuZ3RoIGFuZCBsb2FkaW5nIHN0YXRlIGluIGNhY2hlIGtleSB0byBpbnZhbGlkYXRlIHdoZW4gZWxlbWVudHMgY2hhbmdlXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9lbGVtZW50XyR7c2VsZWN0ZWRTY3JlZW5OYW1lSWQgfHwgJyd9XyR7dGhpcy5lbGVtZW50T3B0aW9ucy5sZW5ndGh9XyR7dGhpcy5pc0xvYWRpbmdFbGVtZW50c31gO1xuICAgIFxuICAgIC8vIEVhcmx5IHJldHVybiBmcm9tIGNhY2hlIC0gdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gcGF0aCBhbmQgc2hvdWxkIGJlIHZlcnkgZmFzdFxuICAgIGlmICh0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG5vIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkLCByZXR1cm4gZW1wdHkgY29uZmlnIGFuZCBjYWNoZSBpdFxuICAgIGlmICghc2VsZWN0ZWRTY3JlZW5OYW1lSWQpIHtcbiAgICAgIGNvbnN0IGVtcHR5Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgU2NyZWVuIE5hbWUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgZW1wdHlDb25maWcpO1xuICAgICAgcmV0dXJuIGVtcHR5Q29uZmlnO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBlbGVtZW50cyBhcmUgc3RpbGwgbG9hZGluZywgcmV0dXJuIGEgbG9hZGluZyBjb25maWcgYW5kIGNhY2hlIGl0XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IGxvYWRpbmdDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ0xvYWRpbmcgZWxlbWVudHMuLi4nLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgaXNMb2FkaW5nOiB0cnVlXG4gICAgICB9O1xuICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBsb2FkaW5nQ29uZmlnKTtcbiAgICAgIHJldHVybiBsb2FkaW5nQ29uZmlnO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaWx0ZXIgZWxlbWVudHMgYnkgc2VsZWN0ZWQgc2NyZWVuIG5hbWVcbiAgICAvLyBDb21wYXJlIGJvdGggYXMgbnVtYmVycyB0byBlbnN1cmUgdHlwZSBtYXRjaGluZ1xuICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbHRlcihlbCA9PiB7XG4gICAgICBjb25zdCBlbFNjcmVlbk5hbWVJZCA9IGVsLnNjcmVlbk5hbWVJZDtcbiAgICAgIC8vIEhhbmRsZSBib3RoIG51bWJlciBhbmQgc3RyaW5nIGNvbXBhcmlzb25zXG4gICAgICByZXR1cm4gZWxTY3JlZW5OYW1lSWQgIT0gbnVsbCAmJiBOdW1iZXIoZWxTY3JlZW5OYW1lSWQpID09PSBOdW1iZXIoc2VsZWN0ZWRTY3JlZW5OYW1lSWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCB0byBTZWxlY3RPcHRpb24gZm9ybWF0XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IGZpbHRlcmVkRWxlbWVudHMubWFwKGVsID0+IHtcbiAgICAgIGNvbnN0IGxvY2F0b3JWYWx1ZSA9IGVsLmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBlbC5pZCxcbiAgICAgICAgZWxlbWVudElkOiBlbC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IGVsLm5hbWUsXG4gICAgICAgIGxvY2F0b3JWYWx1ZTogbG9jYXRvclZhbHVlLFxuICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICBsYWJlbDogZWwubmFtZSxcbiAgICAgICAgc2NyZWVuTmFtZUlkOiBlbC5zY3JlZW5OYW1lSWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIHNjcmVlbk5hbWVPYmo6IGVsLnNjcmVlbk5hbWVPYmosXG4gICAgICAgIG90aGVyTG9jYXRvcjogZWwub3RoZXJMb2NhdG9yXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGVsZW1lbnQgSUQgc2VsZWN0aW9uXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIGVsZW1lbnQgdmFsdWUsIHRyeSB0byBmaW5kIHRoZSBlbGVtZW50IGFuZCBzZXQgdGhlIElEXG4gICAgICBsZXQgaW5pdGlhbEVsZW1lbnRJZDogYW55ID0gbnVsbDtcbiAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgaW5pdGlhbEVsZW1lbnRJZCA9IHZhcmlhYmxlLmVsZW1lbnRJZDtcbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUudmFsdWUpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgZWxlbWVudCBieSBsb2NhdG9yVmFsdWUgb3IgbmFtZVxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IFxuICAgICAgICAgIGVsLmxvY2F0b3JWYWx1ZSA9PT0gdmFyaWFibGUudmFsdWUgfHwgZWwubmFtZSA9PT0gdmFyaWFibGUudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICBpbml0aWFsRWxlbWVudElkID0gZWxlbWVudC5pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChpbml0aWFsRWxlbWVudElkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdpZCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBFbGVtZW50JyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVFbGVtZW50cyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdFbGVtZW50cyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBlbGVtZW50IGZyb20gZWxlbWVudE9wdGlvbnNcbiAgICAgICAgLy8gdmFsdWUgaXMgdGhlIGVsZW1lbnQgSUQgKHNpbmNlIGNvbmZpZyBrZXkgaXMgJ2lkJylcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmlkID09PSB2YWx1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTdG9yZSBlbGVtZW50IGRldGFpbHMgb24gdGhlIHZhcmlhYmxlXG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gc2VsZWN0ZWRFbGVtZW50LmlkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gc2VsZWN0ZWRFbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHNlbGVjdGVkRWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVwZGF0ZSBzY3JlZW4gbmFtZSBmcm9tIHRoZSBzZWxlY3RlZCBlbGVtZW50XG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBzY3JlZW4gbmFtZSBkcm9wZG93biBzaG93cyB0aGUgY29ycmVjdCBzZWxlY3Rpb25cbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRmluZCBhbmQgc3RvcmUgc2NyZWVuIG5hbWUgbmFtZSBmcm9tIHNjcmVlbk5hbWVPcHRpb25zXG4gICAgICAgICAgICBjb25zdCBzY3JlZW5OYW1lT3B0aW9uID0gdGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5maW5kKHNuID0+IHNuLmlkID09PSBzZWxlY3RlZEVsZW1lbnQuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgIGlmIChzY3JlZW5OYW1lT3B0aW9uKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHNjcmVlbk5hbWVPcHRpb24ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRmluZCBhbmQgcGF0Y2ggdGhlIHNlbGVjdG9yIHZhcmlhYmxlIHdpdGggZGF0YUtleSAnbm90X2ZvdW5kJ1xuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yVmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQoXG4gICAgICAgICAgICB2ID0+IHYubmFtZSA9PT0gJ3NlbGVjdG9yJyAmJiB2LmRhdGFLZXkgPT09ICdub3RfZm91bmQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoc2VsZWN0b3JWYXJpYWJsZSAmJiBzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGZvcm0gZ3JvdXAgZm9yIHRoZSBzZWxlY3RvciB2YXJpYWJsZVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3JWYXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cChzZWxlY3RvclZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdG9yVmFyaWFibGVHcm91cCkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdG9yIHZhcmlhYmxlJ3MgdmFsdWUgd2l0aCB0aGUgZWxlbWVudCBsb2NhdG9yXG4gICAgICAgICAgICAgIHNlbGVjdG9yVmFyaWFibGUudmFsdWUgPSBzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gUGF0Y2ggdGhlIGZvcm0gY29udHJvbCB2YWx1ZVxuICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JWYXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yVmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHNlbGVjdGVkRWxlbWVudC5sb2NhdG9yVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjazogaWYgZWxlbWVudCBub3QgZm91bmQsIGp1c3Qgc2V0IHRoZSB2YWx1ZVxuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNldCBlbGVtZW50IElEIGZvcm0gY29udHJvbCBmb3IgdGhlIGRyb3Bkb3duIChrZXkgaXMgJ2lkJyBpbiBjb25maWcpXG4gICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCAmJiB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKHNlbGVjdGVkRWxlbWVudC5pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc2NyZWVuIG5hbWUgZm9ybSBjb250cm9sIGlmIGVsZW1lbnQgaGFzIGEgc2NyZWVuIG5hbWVcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50ICYmIHNlbGVjdGVkRWxlbWVudC5zY3JlZW5OYW1lSWQgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIHNjcmVlbiBuYW1lIElEIGFzIHN0cmluZyB0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKFN0cmluZyhzZWxlY3RlZEVsZW1lbnQuc2NyZWVuTmFtZUlkKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IHZhcmlhYmxlLnZhbHVlIH0pO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZUVsZW1lbnRzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hFbGVtZW50cy5lbWl0KHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FjaGUgdGhlIGNvbmZpZyBiZWZvcmUgcmV0dXJuaW5nXG4gICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBydW50aW1lXG4gICAqL1xuICBpc1J1bnRpbWVUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAncnVudGltZSc7XG4gIH1cbn1cblxuIiwiPHN0eWxlPlxuICAuY2FwaXRhbGl6ZS1maXJzdDo6Zmlyc3QtbGV0dGVyIHtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICB9XG48L3N0eWxlPlxuPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1nYXAteS00IGNxYS1mbGV4LXdyYXAgdGVtcGxhdGUtdmFyaWFibGVzLWZvcm1cIiBbbmdDbGFzc109XCJ7J2NxYS1mbGV4LWNvbCc6IGlzRWRpdEluRGVwdGh9XCIgKm5nSWY9XCIhY3JlYXRlRWxlbWVudFZpc2libGVcIj5cbiAgXG4gIDwhLS0gTWV0YWRhdGEgLSBPbmx5IHNob3cgaWYgZWxlbWVudCBpcyBhdmFpbGFibGUgaW4gZm9ybSAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICBNZXRhZGF0YVxuICAgIDwvbGFiZWw+XG4gICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJtZXRhZGF0YVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwibWV0YWRhdGFDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICA8L2Rpdj5cblxuICA8IS0tIERlc2NyaXB0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgIERlc2NyaXB0aW9uXG4gICAgPC9sYWJlbD5cbiAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cImRlc2NyaXB0aW9uXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJkZXNjcmlwdGlvbkNoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gIDwvZGl2PlxuICBcbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWFibGUgb2YgdGVtcGxhdGVWYXJpYWJsZXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlWYXJpYWJsZVwiPlxuICAgIDwhLS0gQm9vbGVhbiB2YXJpYWJsZXMgd2l0aCBtYXQtc2xpZGUtdG9nZ2xlIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgW2NoZWNrZWRdPVwidmFyaWFibGVzRm9ybS5hdChpKT8uZ2V0KCd2YWx1ZScpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQuY2hlY2tlZClcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIE5vbi1ib29sZWFuLCBub24tY3VzdG9tX2NvZGUgdmFyaWFibGVzIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS5uYW1lICE9PSAnY3VzdG9tX2NvZGUnICYmIHZhcmlhYmxlLnR5cGUgIT09ICdib29sZWFuJ1wiPlxuICAgICAgPCEtLSBFbGVtZW50IHZhcmlhYmxlcyB3aXRoIGNhc2NhZGluZyBkcm9wZG93bnMgKHNjcmVlbiBuYW1lICsgZWxlbWVudCkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFbGVtZW50VHlwZSh2YXJpYWJsZSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19IFNjcmVlbiBOYW1lXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZFNjcmVlbk5hbWUodmFyaWFibGUpOyBlbHNlIGVsZW1lbnRNYW51YWxJbnB1dFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRFbGVtZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbGVtZW50TWFudWFsSW5wdXQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwidmFyaWFibGUudmFsdWVcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0VsZW1lbnRUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgPCEtLSBPdGhlciBkcm9wZG93biB2YXJpYWJsZXMgKHR5cGUsIHNjcm9sbFRvLCBsYWJlbCkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvdWxkU2hvd0Ryb3Bkb3duKHZhcmlhYmxlKTsgZWxzZSBkZWZhdWx0SW5wdXRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXQ+XG4gICAgICAgIDwhLS0gVGVzdC1kYXRhLCBzb3VyY2UtdmFsdWUsIG9yIHRhcmdldC12YWx1ZSB3aXRoIGRhdGEgdHlwZSBkcm9wZG93biAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5lZWRzRGF0YVR5cGVEcm9wZG93bih2YXJpYWJsZSk7IGVsc2UgcmVndWxhcklucHV0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fSBUeXBlXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldERhdGFUeXBlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0Vudmlyb25tZW50VHlwZSh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgRW52aXJvbm1lbnQgTmFtZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRFbnZpcm9ubWVudFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZEVudmlyb25tZW50KHZhcmlhYmxlKVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICBFbnZpcm9ubWVudCBWYWx1ZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1BhcmFtZXRlclR5cGUodmFyaWFibGUpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgVGVzdCBEYXRhIFByb2ZpbGVcbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICAgIERhdGEgU2V0XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXREYXRhU2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1NlbGVjdGVkRGF0YVNldCh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzUGxhaW5UZXh0VHlwZSh2YXJpYWJsZSkgfHwgaXNSdW50aW1lVHlwZSh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX0gXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPCEtLSBTaG93IGN1c3RvbSBpbnB1dCBmb3IgcGxhaW4tdGV4dCB0eXBlIC0tPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJnZXRSYXdWYWx1ZSh2YXJpYWJsZSlcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25UZXN0RGF0YVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudClcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVndWxhcklucHV0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cInZhcmlhYmxlLnZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiY3JlYXRlRWxlbWVudFZpc2libGVcIj5cbiAgPGNxYS1lbGVtZW50LWZvcm1cbiAgICBbaXNDcmVhdGVNb2RlXT1cInRydWVcIlxuICAgIFtzY3JlZW5OYW1lT3B0aW9uc109XCJzY3JlZW5OYW1lT3B0aW9uc1wiXG4gICAgW2hhc01vcmVTY3JlZW5OYW1lc109XCJoYXNNb3JlU2NyZWVuTmFtZXNcIlxuICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgW2lzRWRpdEluRGVwdGhBdmFpbGFibGVdPVwiZmFsc2VcIlxuICAgIChjcmVhdGVFbGVtZW50KT1cIm9uQ3JlYXRlRWxlbWVudCgkZXZlbnQpXCJcbiAgICAoY2FuY2VsKT1cIm9uQ2FuY2VsRWxlbWVudEZvcm0oKVwiXG4gICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgIChsb2FkTW9yZVNjcmVlbk5hbWVzKT1cImxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgkZXZlbnQpXCJcbiAgICAoY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QpPVwiY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QuZW1pdCgkZXZlbnQpXCI+XG4gIDwvY3FhLWVsZW1lbnQtZm9ybT5cbjwvZGl2PiJdfQ==
2101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdJLE9BQU8sRUFBYSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUE2Q25FLE1BQU0sT0FBTyw4QkFBOEI7SUE4RnpDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBN0ZqQyxzQkFBaUIsR0FBdUIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQWMsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixtQkFBYyxHQUFjLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxvQkFBZSxHQUFZLEtBQUssQ0FBQyxDQUFDLHNDQUFzQztRQUN4RSxzQkFBaUIsR0FBWSxLQUFLLENBQUMsQ0FBQyw2QkFBNkI7UUFDMUUsbUVBQW1FO1FBQzFELHNCQUFpQixHQUF1QixFQUFFLENBQUM7UUFDcEQsa0VBQWtFO1FBQ3pELHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUM3QyxzRUFBc0U7UUFDN0QseUJBQW9CLEdBQVksS0FBSyxDQUFD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O3NCQUF6QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRywyQkFBMkI7c0JBQXBDLE1BQU07Z0JBNENFLG9CQUFvQjtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgRm9ybUFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRWxlbWVudENyZWF0ZVBheWxvYWQsIFNjcmVlbk5hbWVPcHRpb24gfSBmcm9tICcuLi8uLi90ZXN0LWNhc2UtZGV0YWlscy9lbGVtZW50LXBvcHVwL2VsZW1lbnQtcG9wdXAtZm9ybS1kYXRhJztcblxuLy8gSW1wb3J0IEVsZW1lbnQgdHlwZSAtIHVzaW5nIGFueSBmb3Igbm93IHNpbmNlIEVsZW1lbnQgaXMgZnJvbSB0cy1wb3J0YWwtdWlcbi8vIEluIGEgcmVhbCBzY2VuYXJpbywgeW91IG1pZ2h0IHdhbnQgdG8gY3JlYXRlIGEgc2hhcmVkIGludGVyZmFjZSBvciBpbXBvcnQgZnJvbSBhIHNoYXJlZCBwYWNrYWdlXG5pbnRlcmZhY2UgRWxlbWVudCB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxvY2F0b3JWYWx1ZT86IHN0cmluZztcbiAgb3RoZXJMb2NhdG9yPzogc3RyaW5nW107XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgc2NyZWVuTmFtZUlkPzogbnVtYmVyO1xuICBzY3JlZW5OYW1lT2JqPzogYW55OyAvLyBGaXhlZDogdXNlICdhbnknIHNpbmNlICdFbGVtZW50U2NyZWVuTmFtZScgaXMgbm90IGRlZmluZWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZVZhcmlhYmxlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBkYXRhS2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIHR5cGU/OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBzdHJpbmdbXTtcbiAgLy8gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBtYW5hZ2luZyB2YXJpYWJsZSBzdGF0ZVxuICBkYXRhVHlwZT86ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JztcbiAgcmF3VmFsdWU/OiBzdHJpbmc7IC8vIFJhdyB2YWx1ZSB3aXRob3V0IGZvcm1hdHRpbmcgKGZvciBzZWxlY3QgZHJvcGRvd25zKVxuICBzZWxlY3RlZEVudmlyb25tZW50Pzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbnZpcm9ubWVudCBuYW1lIChmb3IgZW52aXJvbm1lbnQgdHlwZSlcbiAgc2VsZWN0ZWRFbnZpcm9ubWVudElkPzogbnVtYmVyOyAvLyBTZWxlY3RlZCBlbnZpcm9ubWVudCBJRCAoZm9yIGVudmlyb25tZW50IHR5cGUpXG4gIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlPzogc3RyaW5nOyAvLyBTZWxlY3RlZCB0ZXN0IGRhdGEgcHJvZmlsZSBuYW1lIChmb3IgcGFyYW1ldGVyIHR5cGUpXG4gIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChmb3IgcGFyYW1ldGVyIHR5cGUpXG4gIHNlbGVjdGVkRGF0YVNldD86IHN0cmluZzsgLy8gU2VsZWN0ZWQgZGF0YSBzZXQgbmFtZSAoZm9yIHBhcmFtZXRlciB0eXBlKVxuICBzZWxlY3RlZFNjcmVlbk5hbWU/OiBzdHJpbmc7IC8vIFNlbGVjdGVkIHNjcmVlbiBuYW1lIChmb3IgZWxlbWVudCB0eXBlKVxuICBzY3JlZW5OYW1lSWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIHNjcmVlbiBuYW1lIElEIChmb3IgZWxlbWVudCB0eXBlKVxuICBlbGVtZW50SWQ/OiBudW1iZXI7IC8vIFNlbGVjdGVkIGVsZW1lbnQgSUQgKGZvciBlbGVtZW50IHR5cGUpXG4gIGVsZW1lbnRMb2NhdG9yPzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbGVtZW50IGxvY2F0b3IgdmFsdWUgKGZvciBlbGVtZW50IHR5cGUpXG4gIGVsZW1lbnROYW1lPzogc3RyaW5nOyAvLyBTZWxlY3RlZCBlbGVtZW50IG5hbWUgKGZvciBlbGVtZW50IHR5cGUpXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdGVtcGxhdGVWYXJpYWJsZXM6IFRlbXBsYXRlVmFyaWFibGVbXSA9IFtdO1xuICBASW5wdXQoKSB2YXJpYWJsZXNGb3JtOiBGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcbiAgQElucHV0KCkgbWV0YWRhdGE6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVsZW1lbnRPcHRpb25zOiBFbGVtZW50W10gPSBbXTsgLy8gRWxlbWVudCBvYmplY3RzIGZvciBlbGVtZW50IGRyb3Bkb3duXG4gIEBJbnB1dCgpIGhhc01vcmVFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBXaGV0aGVyIG1vcmUgZWxlbWVudHMgYXJlIGF2YWlsYWJsZVxuICBASW5wdXQoKSBpc0xvYWRpbmdFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlOyAvLyBMb2FkaW5nIHN0YXRlIGZvciBlbGVtZW50c1xuICAvKiogU2NyZWVuIG5hbWUgb3B0aW9ucyBmb3IgZWxlbWVudCBmb3JtIGF1dG9jb21wbGV0ZSAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiBTY3JlZW5OYW1lT3B0aW9uW10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBzY3JlZW4gbmFtZXMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBzY3JlZW4gbmFtZXMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1NjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUZXN0IGRhdGEgcHJvZmlsZXMgZm9yIHBhcmFtZXRlciBkcm9wZG93biAoZnJvbSBBUEkpIC0gcmF3IFRlc3REYXRhIG9iamVjdHMgKi9cbiAgQElucHV0KCkgcGFyYW1ldGVyT3B0aW9uczogYW55W10gPSBbXTsgLy8gVGVzdERhdGFbXSAtIHVzaW5nIGFueSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gIC8qKiBXaGV0aGVyIG1vcmUgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVBhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgcGFyYW1ldGVycyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgb3B0aW9ucyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChmcm9tIEFQSSkgKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRPcHRpb25zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBlbnZpcm9ubWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgZW52aXJvbm1lbnRzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgZnJvbSB0ZXN0IGNhc2UgKGlmIGF2YWlsYWJsZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHdpbGwgYmUgZGlzYWJsZWQpICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHN0YXJ0IGluZGV4IGZyb20gdGVzdCBjYXNlIChkYXRhIHNldCBpbmRleCBpbiB0aGUgcHJvZmlsZSkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcbiAgQElucHV0KCkgaXNFZGl0SW5EZXB0aDogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgQE91dHB1dCgpIHZhcmlhYmxlVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH0+KCk7XG4gIEBPdXRwdXQoKSB2YXJpYWJsZUJvb2xlYW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYm9vbGVhbiB9PigpO1xuICBAT3V0cHV0KCkgbWV0YWRhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGRlc2NyaXB0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gbG9hZCBtb3JlIGlzIHJlcXVlc3RlZFxuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVsZW1lbnRzXG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzY3JlZW5OYW1lSWQ6IG51bWJlcjsgc2VhcmNoVGVybT86IHN0cmluZyB9PigpOyAvLyBFbWl0IHdoZW4gc2NyZWVuIG5hbWUgaXMgc2VsZWN0ZWQgdG8gZmV0Y2ggZWxlbWVudHMgZmlsdGVyZWQgYnkgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIGNyZWF0ZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPEVsZW1lbnRDcmVhdGVQYXlsb2FkPigpOyAvLyBFbWl0IHdoZW4gZWxlbWVudCBpcyBjcmVhdGVkIHdpdGggcGF5bG9hZFxuICBAT3V0cHV0KCkgc2VhcmNoU2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGxvYWRNb3JlU2NyZWVuTmFtZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciByZXF1ZXN0cyB0byBjcmVhdGUgYSBuZXcgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIHNlYXJjaFBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIGxvYWRNb3JlUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgc2VhcmNoRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBlbnZpcm9ubWVudHNcbiAgQE91dHB1dCgpIGxvYWRNb3JlRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBlbnZpcm9ubWVudHNcbiAgQE91dHB1dCgpIGNhbmNlbEVsZW1lbnRGb3JtID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gZWxlbWVudCBmb3JtIGlzIGNhbmNlbGxlZFxuICBAT3V0cHV0KCkgZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpOyAvLyBFbWl0IHdoZW4gZWxlbWVudCBmb3JtIHZpc2liaWxpdHkgY2hhbmdlc1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNlbGVjdCBjb25maWdzIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwcml2YXRlIHNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGRhdGEgdHlwZSBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIGRhdGFUeXBlU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgcGFyYW1ldGVyIHNlbGVjdCBjb25maWdzXG4gIHByaXZhdGUgcGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZW52aXJvbm1lbnQgc2VsZWN0IGNvbmZpZ3NcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIGVudmlyb25tZW50IHBhcmFtZXRlciBzZWxlY3QgY29uZmlnc1xuICBwcml2YXRlIGVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3Igc2NyZWVuIG5hbWUgc2VsZWN0IGNvbmZpZ3MgKGZvciBlbGVtZW50IHZhcmlhYmxlcylcbiAgcHJpdmF0ZSBzY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgZWxlbWVudCBzZWxlY3QgY29uZmlncyAoZmlsdGVyZWQgYnkgc2NyZWVuIG5hbWUpXG4gIHByaXZhdGUgZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWdzIChmaXJzdCBkcm9wZG93biBmb3IgcGFyYW1ldGVycylcbiAgcHJpdmF0ZSB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIENhY2hlIGZvciBkYXRhIHNldCBzZWxlY3QgY29uZmlncyAoc2Vjb25kIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzIC0gc2hvd3MgZGF0YSBzZXRzIGZyb20gc2VsZWN0ZWQgcHJvZmlsZSlcbiAgcHJpdmF0ZSBkYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgcGFyYW1ldGVyIHNlbGVjdCBjb25maWdzIGZvciBhIHNwZWNpZmljIGRhdGEgc2V0ICh0aGlyZCBkcm9wZG93biBmb3IgcGFyYW1ldGVycylcbiAgcHJpdmF0ZSBwYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBDYWNoZSBmb3IgY29tcHV0ZWQgcHJvcGVydGllc1xuICBwcml2YXRlIG5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzaG91bGRTaG93RHJvcGRvd25DYWNoZTogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG4gIFxuICAvLyBQcmUtY29tcHV0ZWQgZGF0YSB0eXBlIG9wdGlvbnMgKHN0YXRpYywgbm8gbmVlZCB0byByZWNyZWF0ZSlcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhVHlwZU9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW1xuICAgIHsgaWQ6ICdwbGFpbi10ZXh0JywgdmFsdWU6ICdwbGFpbi10ZXh0JywgbmFtZTogJ1BsYWluIFRleHQnLCBsYWJlbDogJ1BsYWluIFRleHQnIH0sXG4gICAgeyBpZDogJ3BhcmFtZXRlcicsIHZhbHVlOiAncGFyYW1ldGVyJywgbmFtZTogJ0B8UGFyYW1ldGVyfCcsIGxhYmVsOiAnQHxQYXJhbWV0ZXJ8JyB9LFxuICAgIHsgaWQ6ICdydW50aW1lJywgdmFsdWU6ICdydW50aW1lJywgbmFtZTogJyR8UnVudGltZXwnLCBsYWJlbDogJyR8UnVudGltZXwnIH0sXG4gICAgeyBpZDogJ2Vudmlyb25tZW50JywgdmFsdWU6ICdlbnZpcm9ubWVudCcsIG5hbWU6ICcqfEVudmlyb25tZW50fCcsIGxhYmVsOiAnKnxFbnZpcm9ubWVudHwnIH1cbiAgXTtcblxuICBASW5wdXQoKSBjcmVhdGVFbGVtZW50VmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG9uQ3JlYXRlRWxlbWVudChwYXlsb2FkOiBFbGVtZW50Q3JlYXRlUGF5bG9hZCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlRWxlbWVudC5lbWl0KHBheWxvYWQpO1xuICAgIHRoaXMuZWxlbWVudEZvcm1WaXNpYmlsaXR5Q2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DYW5jZWxFbGVtZW50Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLmNhbmNlbEVsZW1lbnRGb3JtLmVtaXQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZVZhcmlhYmxlcyddIHx8IGNoYW5nZXNbJ3ZhcmlhYmxlc0Zvcm0nXSB8fCBjaGFuZ2VzWydlbGVtZW50T3B0aW9ucyddIHx8IFxuICAgICAgICBjaGFuZ2VzWydoYXNNb3JlRWxlbWVudHMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdFbGVtZW50cyddIHx8XG4gICAgICAgIGNoYW5nZXNbJ3BhcmFtZXRlck9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlUGFyYW1ldGVycyddIHx8IGNoYW5nZXNbJ2lzTG9hZGluZ1BhcmFtZXRlcnMnXSB8fFxuICAgICAgICBjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRW52aXJvbm1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRW52aXJvbm1lbnRzJ10gfHxcbiAgICAgICAgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkJ10gfHwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCddKSB7XG4gICAgICBcbiAgICAgIC8vIE9ubHkgY2xlYXIgY2FjaGVzIGZvciBjaGFuZ2VkIGlucHV0cywgbm90IGFsbCBjYWNoZXNcbiAgICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZVZhcmlhYmxlcyddIHx8IGNoYW5nZXNbJ3ZhcmlhYmxlc0Zvcm0nXSkge1xuICAgICAgICAvLyBDbGVhciBhbGwgY2FjaGVzIHdoZW4gdGVtcGxhdGUgdmFyaWFibGVzIG9yIGZvcm0gY2hhbmdlc1xuICAgICAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2hvdWxkU2hvd0Ryb3Bkb3duQ2FjaGUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2xlYXIgZWxlbWVudCBhbmQgc2NyZWVuIG5hbWUgY2FjaGVzIG9ubHkgd2hlbiB0aGVpciBvcHRpb25zIGNoYW5nZVxuICAgICAgaWYgKGNoYW5nZXNbJ2VsZW1lbnRPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZUVsZW1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRWxlbWVudHMnXSkge1xuICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY2hhbmdlc1snc2NyZWVuTmFtZU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlU2NyZWVuTmFtZXMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdTY3JlZW5OYW1lcyddKSB7XG4gICAgICAgIHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjaGFuZ2VzWydwYXJhbWV0ZXJPcHRpb25zJ10gfHwgY2hhbmdlc1snaGFzTW9yZVBhcmFtZXRlcnMnXSB8fCBjaGFuZ2VzWydpc0xvYWRpbmdQYXJhbWV0ZXJzJ10pIHtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSB8fCBjaGFuZ2VzWydoYXNNb3JlRW52aXJvbm1lbnRzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRW52aXJvbm1lbnRzJ10pIHtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMgYW5kIHJhdyB2YWx1ZXMgZm9yIHRlc3QtZGF0YSB2YXJpYWJsZXNcbiAgICAgIC8vIEFsc28gcmUtaW5pdGlhbGl6ZSBpZiBkZWZhdWx0IHZhbHVlcyBvciBwYXJhbWV0ZXJPcHRpb25zIGNoYW5nZSAodG8gc2V0IGRlZmF1bHQgc2VsZWN0aW9ucylcbiAgICAgIGlmICgoY2hhbmdlc1sndGVtcGxhdGVWYXJpYWJsZXMnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFQcm9maWxlSWQnXSB8fCBjaGFuZ2VzWydkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4J10gfHwgY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddKSAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRlc3REYXRhVmFyaWFibGVzKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIHRlbXBsYXRlVmFyaWFibGVzIGNoYW5nZWQsIGluaXRpYWxpemUgc2NyZWVuIG5hbWUgZm9ybSBjb250cm9scyBmb3IgZWxlbWVudCB2YXJpYWJsZXMgdGhhdCBoYXZlIHNjcmVlbk5hbWVJZFxuICAgICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlVmFyaWFibGVzJ10gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkgJiYgdmFyaWFibGUuc2NyZWVuTmFtZUlkKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgc2NyZWVuIG5hbWUgZm9ybSBjb250cm9sIHdpdGggc2NyZWVuTmFtZUlkIGFzIHN0cmluZyAodG8gbWF0Y2ggb3B0aW9uIGlkIGZvcm1hdCksIG9yICdub25lJyBieSBkZWZhdWx0XG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkID8gU3RyaW5nKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkgOiAnbm9uZSc7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woaW5pdGlhbFZhbHVlKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCB2YWx1ZSBpZiBpdCBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkID8gU3RyaW5nKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkgOiAnbm9uZSc7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZVN0ciAhPT0gZXhwZWN0ZWRWYWx1ZSAmJiBjdXJyZW50VmFsdWUgIT09IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShleHBlY3RlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNjcmVlbk5hbWVJZCBidXQgbm90IHNlbGVjdGVkU2NyZWVuTmFtZSwgZmluZCBpdCBmcm9tIHNjcmVlbk5hbWVPcHRpb25zXG4gICAgICAgICAgICAgIGlmICghdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lICYmIHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nU2NyZWVuTmFtZSA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gdmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBtYXRjaGluZ1NjcmVlbk5hbWUubmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBzY3JlZW5OYW1lT3B0aW9ucyBjaGFuZ2VkLCB1cGRhdGUgc2VsZWN0ZWRTY3JlZW5OYW1lIGZvciB2YXJpYWJsZXMgdGhhdCBoYXZlIHNjcmVlbk5hbWVJZFxuICAgICAgaWYgKGNoYW5nZXNbJ3NjcmVlbk5hbWVPcHRpb25zJ10gJiYgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkgJiYgdmFyaWFibGUuc2NyZWVuTmFtZUlkICYmICF2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nU2NyZWVuTmFtZSA9IHRoaXMuc2NyZWVuTmFtZU9wdGlvbnMuZmluZChzbiA9PiBzbi5pZCA9PT0gdmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ1NjcmVlbk5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gbWF0Y2hpbmdTY3JlZW5OYW1lLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgZWxlbWVudE9wdGlvbnMgb3Igc2NyZWVuTmFtZU9wdGlvbnMgY2hhbmdlZCwgcmUtaW5pdGlhbGl6ZSBlbGVtZW50IHZhcmlhYmxlc1xuICAgICAgaWYgKChjaGFuZ2VzWydlbGVtZW50T3B0aW9ucyddIHx8IGNoYW5nZXNbJ3NjcmVlbk5hbWVPcHRpb25zJ10pICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpIHtcbiAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBjb25maWcgY2FjaGUgd2hlbiBlbGVtZW50T3B0aW9ucyBjaGFuZ2VzIHRvIGZvcmNlIHJlY29tcHV0YXRpb25cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2hlbiBlbGVtZW50cyBhcmUgbG9hZGVkIGFmdGVyIHNjcmVlbiBuYW1lIHNlbGVjdGlvbiwgdGhlIGNvbmZpZyBpcyByZWNvbXB1dGVkXG4gICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgICAgLy8gT25seSB0cnkgdG8gZmluZCBhbmQgc2V0IGVsZW1lbnQgaWYgZWxlbWVudElkIGV4aXN0cyBpbiB0ZW1wbGF0ZSBkYXRhXG4gICAgICAgICAgICAgIC8vIElmIG5vIGVsZW1lbnRJZCwgZG9uJ3Qgc2VsZWN0IGFueXRoaW5nIC0gdXNlIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBQcmlvcml0eSAxOiBGaW5kIGJ5IGVsZW1lbnRJZCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmlkID09PSB2YXJpYWJsZS5lbGVtZW50SWQpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFByaW9yaXR5IDI6IEZpbmQgYnkgZWxlbWVudE5hbWUgaWYgZWxlbWVudElkIHNlYXJjaCBkaWRuJ3QgZmluZCBpdCAoZmFsbGJhY2spXG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50ICYmIHZhcmlhYmxlLmVsZW1lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLm5hbWUgPT09IHZhcmlhYmxlLmVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gUHJpb3JpdHkgMzogRmluZCBieSBsb2NhdG9yVmFsdWUgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudFZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmxvY2F0b3JWYWx1ZSA9PT0gZWxlbWVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gbmFtZSBpbmZvIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnNjcmVlbk5hbWVJZCAmJiBlbGVtZW50LnNjcmVlbk5hbWVPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gZWxlbWVudC5zY3JlZW5OYW1lT2JqLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IGVsZW1lbnQuc2NyZWVuTmFtZUlkO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgc2NyZWVuTmFtZUlkIGFzIHN0cmluZyB0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0IChmb3IgY29uc2lzdGVuY3kgd2l0aCBnZXRTY3JlZW5OYW1lU2VsZWN0Q29uZmlnKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JlZW5OYW1lSWRTdHJpbmcgPSBTdHJpbmcoZWxlbWVudC5zY3JlZW5OYW1lSWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRTY3JlZW5OYW1lJywgbmV3IEZvcm1Db250cm9sKHNjcmVlbk5hbWVJZFN0cmluZykpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIGlmIGZvcm0gY29udHJvbCBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIHZhbGlkIHNjcmVlbiBuYW1lIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyByZXNldHRpbmcgdXNlcidzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZVN0ciA9IGN1cnJlbnRWYWx1ZSAhPSBudWxsID8gU3RyaW5nKGN1cnJlbnRWYWx1ZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVTdHIgIT09IHNjcmVlbk5hbWVJZFN0cmluZyAmJiBjdXJyZW50VmFsdWVTdHIgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShzY3JlZW5OYW1lSWRTdHJpbmcsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gU2V0L3VwZGF0ZSBlbGVtZW50IGRldGFpbHMgZnJvbSB0aGUgZm91bmQgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gZWxlbWVudC5pZDtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gZWxlbWVudC5sb2NhdG9yVmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBlbGVtZW50TmFtZSBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzZXQgKHByZXNlcnZlIGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlLmVsZW1lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gZWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBGb3Igc2VsZWN0b3IsIHVzZSBlbGVtZW50TG9jYXRvciBhcyB2YWx1ZTsgZm9yIG90aGVycywgdXNlIGVsZW1lbnROYW1lXG4gICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUubmFtZSA9PT0gJ3NlbGVjdG9yJykge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGVsZW1lbnQubG9jYXRvclZhbHVlIHx8IGVsZW1lbnQubmFtZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZhcmlhYmxlLnZhbHVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGVsZW1lbnQubmFtZSB8fCBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgSUQgZm9ybSBjb250cm9sIGZvciB0aGUgZHJvcGRvd24gKGtleSBpcyAnaWQnIGluIGNvbmZpZylcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChlbGVtZW50LmlkKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKT8uc2V0VmFsdWUoZWxlbWVudC5pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdmFsdWUgZm9ybSBjb250cm9sXG4gICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgbm90IGZvdW5kIGluIGVsZW1lbnRPcHRpb25zIHlldCAtIG1pZ2h0IG5lZWQgdG8gZmV0Y2hcbiAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZWxlbWVudElkIGFuZCBlbGVtZW50TmFtZSBpZiB0aGV5IGV4aXN0IChmcm9tIHNldFRlbXBsYXRlVmFyaWFibGVzKVxuICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBlbGVtZW50SWQgYnV0IGVsZW1lbnQgaXNuJ3QgZm91bmQsIHdlIG1pZ2h0IG5lZWQgdG8gZmV0Y2ggZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgdGhlIHNjcmVlbiBuYW1lIHlldCwgc28gd2UnbGwgd2FpdCBmb3IgZWxlbWVudE9wdGlvbnMgdG8gYmUgbG9hZGVkXG4gICAgICAgICAgICAgICAgICAvLyBUaGUgaW5pdGlhbGl6YXRpb24gd2lsbCBydW4gYWdhaW4gd2hlbiBlbGVtZW50T3B0aW9ucyBjaGFuZ2VzIHZpYSBuZ09uQ2hhbmdlc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBObyBlbGVtZW50SWQgaW4gdGVtcGxhdGUgZGF0YSAtIGNsZWFyIGFsbCBlbGVtZW50LXJlbGF0ZWQgZmllbGRzIGFuZCBzZXQgZGVmYXVsdHNcbiAgICAgICAgICAgICAgICAvLyBCdXQgZG9uJ3Qgb3ZlcnJpZGUgdXNlcidzIHNjcmVlbiBuYW1lIHNlbGVjdGlvbiBpZiB0aGV5J3ZlIGFscmVhZHkgc2VsZWN0ZWQgb25lXG4gICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIE9ubHkgY2xlYXIgc2NyZWVuTmFtZUlkIGlmIGl0IHdhc24ndCBzZXQgYnkgdXNlciBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBmb3JtIGNvbnRyb2wgaGFzIGEgdmFsaWQgc2NyZWVuIG5hbWUgKG5vdCAnbm9uZScpXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50U2NyZWVuTmFtZVZhbHVlIHx8IGN1cnJlbnRTY3JlZW5OYW1lVmFsdWUgPT09ICdub25lJyB8fCBjdXJyZW50U2NyZWVuTmFtZVZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzIHRvIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAvLyBTY3JlZW4gbmFtZSBzaG91bGQgYmUgJ25vbmUnIChTZWxlY3Qgb3B0aW9uKVxuICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woJ25vbmUnKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKCdub25lJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IElEIHNob3VsZCBiZSBudWxsXG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChudWxsKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUHJlLWNvbXB1dGUgYWxsIGNvbmZpZ3MgdG8gYXZvaWQgY2FsbGluZyBtZXRob2RzIGluIHRlbXBsYXRlXG4gICAgICAvLyBUaGlzIHdpbGwgcmVjb21wdXRlIGVsZW1lbnQgY29uZmlncyB3aXRoIHRoZSBuZXcgZWxlbWVudE9wdGlvbnNcbiAgICAgIC8vIE9ubHkgcHJlY29tcHV0ZSBpZiB0ZW1wbGF0ZVZhcmlhYmxlcyBleGlzdCB0byBhdm9pZCB1bm5lY2Vzc2FyeSB3b3JrXG4gICAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5wcmVjb21wdXRlQ29uZmlncygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3JjZSBjaGFuZ2UgZGV0ZWN0aW9uIGFmdGVyIHJlY29tcHV0aW5nIGNvbmZpZ3MgKG9ubHkgb25jZSBhdCB0aGUgZW5kKVxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBcbiAgICAgIC8vIElmIGVudmlyb25tZW50IG9wdGlvbnMgY2hhbmdlZCBhbmQgd2UgaGF2ZSBzZWxlY3RlZCBlbnZpcm9ubWVudHMsIHJlZnJlc2ggcGFyYW1ldGVyIGNvbmZpZ3NcbiAgICAgIGlmIChjaGFuZ2VzWydlbnZpcm9ubWVudE9wdGlvbnMnXSkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzRW52aXJvbm1lbnRUeXBlKHZhcmlhYmxlKSAmJiB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAvLyBDbGVhciBhbmQgcmVjb21wdXRlIGVudmlyb25tZW50IHBhcmFtZXRlciBjb25maWdcbiAgICAgICAgICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fZW52UGFyYW1gKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBwYXJhbWV0ZXIgb3B0aW9ucyBjaGFuZ2VkIGFuZCB3ZSBoYXZlIGRlZmF1bHQgdmFsdWVzLCB0cnkgdG8gaW5pdGlhbGl6ZSB0aGVtXG4gICAgICBpZiAoY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsICYmIHRoaXMucGFyYW1ldGVyT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFJlLWluaXRpYWxpemUgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIG5vdyB0aGF0IHBhcmFtZXRlck9wdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgICAgICB0aGlzLmluaXRpYWxpemVUZXN0RGF0YVZhcmlhYmxlcygpO1xuICAgICAgICAvLyBGb3JjZSBjaGFuZ2UgZGV0ZWN0aW9uIGFmdGVyIGluaXRpYWxpemF0aW9uXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBwYXJhbWV0ZXIgb3B0aW9ucyBvciBsb2FkaW5nIHN0YXRlIGNoYW5nZWQsIHJlZnJlc2ggdGVzdCBkYXRhIHByb2ZpbGUgY29uZmlncyAoc28gc2VhcmNoL2xvYWQgbW9yZSBhbmQgb3B0aW9ucyBzdGF5IGluIHN5bmMpXG4gICAgICBpZiAoY2hhbmdlc1sncGFyYW1ldGVyT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVQYXJhbWV0ZXJzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nUGFyYW1ldGVycyddIHx8XG4gICAgICAgICAgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkJ10gfHwgY2hhbmdlc1snZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCddKSB7XG4gICAgICAgIC8vIENsZWFyIHRlc3QgZGF0YSBwcm9maWxlIHNlbGVjdCBjb25maWcgY2FjaGUgc2luY2UgcHJvZmlsZXMgbGlzdCBvciBsb2FkaW5nIHN0YXRlIG1heSBoYXZlIGNoYW5nZWRcbiAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc1BhcmFtZXRlclR5cGUodmFyaWFibGUpKSB7XG4gICAgICAgICAgICAvLyBSZWNvbXB1dGUgdGVzdCBkYXRhIHByb2ZpbGUgY29uZmlnXG4gICAgICAgICAgICB0aGlzLmdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcmVjb21wdXRlIGRhdGEgc2V0IGNvbmZpZ1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gSWYgYSBkYXRhIHNldCBpcyBhbHJlYWR5IHNlbGVjdGVkLCByZWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZ1xuICAgICAgICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgYW5kIHJlY29tcHV0ZSBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUgZm9yIGNhY2hlIGtleVxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZGVudGlmaWVyID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA/IFN0cmluZyh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKSA6IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9wYXJhbUZvckRhdGFTZXRfJHtwcm9maWxlSWRlbnRpZmllcn1fJHt2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXR9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIHNpbmNlIHdlJ3JlIHVzaW5nIE9uUHVzaFxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGluaXRpYWxpemVUZXN0RGF0YVZhcmlhYmxlcygpOiB2b2lkIHtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2goKHZhcmlhYmxlLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlKSkge1xuICAgICAgICBjb25zdCB7IGRhdGFUeXBlLCByYXdWYWx1ZSB9ID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgICAvLyBTZXQgcHJvcGVydGllcyBkaXJlY3RseSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgICAgIHZhcmlhYmxlLmRhdGFUeXBlID0gZGF0YVR5cGU7XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcmF3VmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBmb3IgZGF0YSB0eXBlIGluIHRoZSBGb3JtQXJyYXlcbiAgICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChkYXRhVHlwZSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnZGF0YVR5cGUnKT8uc2V0VmFsdWUoZGF0YVR5cGUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRm9yIHBhcmFtZXRlciB0eXBlLCBwYXJzZSB0aGUgdmFsdWUgdG8gZXh0cmFjdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgcGFyYW1ldGVyXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgYXJlIHByb3ZpZGVkIGZyb20gdGVzdCBjYXNlXG4gICAgICAgICAgICAvLyBPbmx5IHByb2NlZWQgaWYgcGFyYW1ldGVyT3B0aW9ucyBhcmUgbG9hZGVkXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQgJiYgdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4ICE9IG51bGwgJiYgdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgSURcbiAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdFByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4gdGVzdERhdGEuaWQgPT09IHRoaXMuZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkKTtcbiAgICAgICAgICAgICAgaWYgKGRlZmF1bHRQcm9maWxlICYmIGRlZmF1bHRQcm9maWxlLmRhdGEgJiYgZGVmYXVsdFByb2ZpbGUuZGF0YS5sZW5ndGggPiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0RGF0YVNldCA9IGRlZmF1bHRQcm9maWxlLmRhdGFbdGhpcy5kZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlTmFtZSA9IGRlZmF1bHRQcm9maWxlLm5hbWUgfHwgZGVmYXVsdFByb2ZpbGUudGVzdERhdGFOYW1lO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXROYW1lID0gZGVmYXVsdERhdGFTZXQubmFtZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBTZXQgdmFyaWFibGUgcHJvcGVydGllcyAtIHRoaXMgZW5zdXJlcyBoYXNTZWxlY3RlZFRlc3REYXRhUHJvZmlsZSgpIGFuZCBoYXNTZWxlY3RlZERhdGFTZXQoKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gcHJvZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IGRlZmF1bHRQcm9maWxlLmlkO1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCA9IGRhdGFTZXROYW1lO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzIHdpdGggdGhlIGFjdHVhbCB2YWx1ZXMgc28gZHJvcGRvd25zIGRpc3BsYXkgc2VsZWN0ZWQgb3B0aW9uc1xuICAgICAgICAgICAgICAgIC8vIFVzZSBwcm9maWxlIElEIChzdHJpbmcpIGZvciBzZWxlY3RlZFRlc3REYXRhUHJvZmlsZSBmb3JtIGNvbnRyb2wgdG8gbWF0Y2ggb3B0aW9uLmlkIGZvcm1hdFxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZFN0cmluZyA9IFN0cmluZyhkZWZhdWx0UHJvZmlsZS5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScsIG5ldyBGb3JtQ29udHJvbChwcm9maWxlSWRTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKHByb2ZpbGVJZFN0cmluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBEb24ndCBzZXQgcGFyYW1ldGVyIHZhbHVlIHlldCAtIHVzZXIgd2lsbCBzZWxlY3QgaXRcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBjYWNoZXMgdG8gZm9yY2UgcmVjb21wdXRhdGlvbiBvZiBjb25maWdzIHdpdGggbmV3IHZhbHVlc1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIGFsbCBjYWNoZSBlbnRyaWVzIGZvciB0aGlzIHZhcmlhYmxlIHRvIGVuc3VyZSBmcmVzaCBjb25maWdzXG4gICAgICAgICAgICAgICAgdGhpcy50ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGUubmFtZX1fdGVzdERhdGFQcm9maWxlYCk7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgZGF0YSBzZXQgY2FjaGUgLSBuZWVkIHRvIGNsZWFyIGFsbCBwb3NzaWJsZSBrZXlzIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGV4YWN0IGZvcm1hdFxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXRLZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2RhdGFTZXRgKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkYXRhU2V0S2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBwYXJhbWV0ZXIgY2FjaGUgLSBuZWVkIHRvIGNsZWFyIGFsbCBwb3NzaWJsZSBrZXlzXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE5vIGRlZmF1bHQgdmFsdWVzIC0gdXNlIGV4aXN0aW5nIGxvZ2ljIHRvIGZpbmQgZnJvbSBwYXJhbWV0ZXIgdmFsdWVcbiAgICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcmF3VmFsdWU7XG4gICAgICAgICAgICAgIGlmIChwYXJhbU5hbWUpIHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBhbmQgZGF0YSBzZXQgdGhhdCBjb250YWlucyB0aGlzIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgIC8vIFNlYXJjaCB0aHJvdWdoIGFsbCB0ZXN0IGRhdGEgcHJvZmlsZXMgYW5kIHRoZWlyIGRhdGEgc2V0c1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZFByb2ZpbGU6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kRGF0YVNldDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRlc3REYXRhUHJvZmlsZSBvZiB0aGlzLnBhcmFtZXRlck9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0ZXN0RGF0YVByb2ZpbGUuZGF0YSAmJiB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlYXJjaCB0aHJvdWdoIGFsbCBkYXRhIHNldHMgaW4gdGhpcyBwcm9maWxlXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGF0YVNldCBvZiB0ZXN0RGF0YVByb2ZpbGUuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhU2V0ICYmIGRhdGFTZXQuZGF0YSAmJiBkYXRhU2V0LmRhdGEuaGFzT3duUHJvcGVydHkocGFyYW1OYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRQcm9maWxlID0gdGVzdERhdGFQcm9maWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmREYXRhU2V0ID0gZGF0YVNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRQcm9maWxlKSBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kUHJvZmlsZSAmJiBmb3VuZERhdGFTZXQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gZm91bmRQcm9maWxlLm5hbWUgfHwgZm91bmRQcm9maWxlLnRlc3REYXRhTmFtZTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXROYW1lID0gZm91bmREYXRhU2V0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlID0gcHJvZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gZm91bmRQcm9maWxlLmlkO1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gZGF0YVNldE5hbWU7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZU5hbWUpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy5zZXRWYWx1ZShwcm9maWxlTmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVNldE5hbWUpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUoZGF0YVNldE5hbWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIFNldCBmb3JtIGNvbnRyb2wgdG8gcGFyYW0gbmFtZSAoZm9yIGRyb3Bkb3duIGRpc3BsYXkpXG4gICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHBhcmFtTmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHZhcmlhYmxlLnZhbHVlIGlzIGZvcm1hdHRlZCBjb3JyZWN0bHkgYXMgQHxwYXJhbU5hbWV8XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShwYXJhbU5hbWUsICdwYXJhbWV0ZXInKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gSWYgcGFyYW1ldGVyIG5vdCBmb3VuZCwgZm9ybWF0IHRoZSByYXcgdmFsdWUgaWYgaXQncyBhIHBhcmFtZXRlciB0eXBlXG4gICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHJhd1ZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdmFyaWFibGUudmFsdWUgaXMgZm9ybWF0dGVkIGNvcnJlY3RseVxuICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSB0aGlzLmZvcm1hdFRlc3REYXRhVmFsdWUocmF3VmFsdWUsIGRhdGFUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRm9yIGVudmlyb25tZW50IHR5cGUsIHBhcnNlIHRoZSB2YWx1ZSB0byBleHRyYWN0IGVudmlyb25tZW50IGFuZCBwYXJhbWV0ZXJcbiAgICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgICAgICAgIC8vIEVudmlyb25tZW50IHZhbHVlcyBhcmUgaW4gZm9ybWF0ICp8cGFyYW1ldGVyTmFtZXxcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZmluZCB3aGljaCBlbnZpcm9ubWVudCB0aGlzIHBhcmFtZXRlciBiZWxvbmdzIHRvXG4gICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByYXdWYWx1ZTtcbiAgICAgICAgICAgIGlmIChwYXJhbU5hbWUpIHtcbiAgICAgICAgICAgICAgLy8gRmluZCB0aGUgZW52aXJvbm1lbnQgdGhhdCBjb250YWlucyB0aGlzIHBhcmFtZXRlclxuICAgICAgICAgICAgICBjb25zdCBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYubmFtZSA9PT0gcGFyYW1OYW1lKTtcbiAgICAgICAgICAgICAgaWYgKGVudk9wdGlvbikge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgPSBlbnZPcHRpb24uZW52aXJvbm1lbnQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBhbmQgc3RvcmUgZW52aXJvbm1lbnQgSURcbiAgICAgICAgICAgICAgICBjb25zdCBpZE1hdGNoID0gZW52T3B0aW9uLmlkLm1hdGNoKC9lbnYtKFxcZCspLS8pO1xuICAgICAgICAgICAgICAgIGlmIChpZE1hdGNoICYmIGlkTWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHNcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRFbnZpcm9ubWVudCcsIG5ldyBGb3JtQ29udHJvbChlbnZPcHRpb24uZW52aXJvbm1lbnQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKT8uc2V0VmFsdWUoZW52T3B0aW9uLmVudmlyb25tZW50LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGAqfCR7cGFyYW1OYW1lfXxgLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEZvciBlbGVtZW50IHR5cGUsIHBhcnNlIHRoZSB2YWx1ZSB0byBleHRyYWN0IHNjcmVlbiBuYW1lIGFuZCBlbGVtZW50XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbGVtZW50VHlwZSh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRvIGZpbmQgYW5kIHNldCBlbGVtZW50IGlmIGVsZW1lbnRJZCBleGlzdHMgaW4gdGVtcGxhdGUgZGF0YVxuICAgICAgICAgICAgLy8gSWYgbm8gZWxlbWVudElkLCBkb24ndCBzZWxlY3QgYW55dGhpbmcgLSB1c2UgZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IGFueSA9IG51bGw7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAxOiBGaW5kIGJ5IGVsZW1lbnRJZCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudE9wdGlvbnMuZmluZChlbCA9PiBlbC5pZCA9PT0gdmFyaWFibGUuZWxlbWVudElkKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIFByaW9yaXR5IDI6IEZpbmQgYnkgZWxlbWVudE5hbWUgaWYgZWxlbWVudElkIHNlYXJjaCBkaWRuJ3QgZmluZCBpdCAoZmFsbGJhY2spXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwubmFtZSA9PT0gdmFyaWFibGUuZWxlbWVudE5hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBQcmlvcml0eSAzOiBGaW5kIGJ5IGxvY2F0b3JWYWx1ZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudCAmJiB2YXJpYWJsZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbmQoZWwgPT4gZWwubG9jYXRvclZhbHVlID09PSBlbGVtZW50VmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gbmFtZSBpbmZvIGZyb20gdGhlIGZvdW5kIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zY3JlZW5OYW1lSWQgJiYgZWxlbWVudC5zY3JlZW5OYW1lT2JqKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSBlbGVtZW50LnNjcmVlbk5hbWVPYmoubmFtZTtcbiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IGVsZW1lbnQuc2NyZWVuTmFtZUlkO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgZm9ybSBjb250cm9sc1xuICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgc2NyZWVuTmFtZUlkIGFzIHN0cmluZyB0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0IChmb3IgY29uc2lzdGVuY3kgd2l0aCBnZXRTY3JlZW5OYW1lU2VsZWN0Q29uZmlnKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyZWVuTmFtZUlkU3RyaW5nID0gU3RyaW5nKGVsZW1lbnQuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRTY3JlZW5OYW1lJywgbmV3IEZvcm1Db250cm9sKHNjcmVlbk5hbWVJZFN0cmluZykpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgZm9ybSBjb250cm9sIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgdmFsaWQgc2NyZWVuIG5hbWUgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyByZXNldHRpbmcgdXNlcidzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnRPcHRpb25zIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVTdHIgIT09IHNjcmVlbk5hbWVJZFN0cmluZyAmJiBjdXJyZW50VmFsdWVTdHIgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoc2NyZWVuTmFtZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0L3VwZGF0ZSBlbGVtZW50IGRldGFpbHMgZnJvbSB0aGUgZm91bmQgZWxlbWVudFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudExvY2F0b3IgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBlbGVtZW50TmFtZSBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzZXQgKHByZXNlcnZlIGZyb20gc2V0VGVtcGxhdGVWYXJpYWJsZXMpXG4gICAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZS5lbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEZvciBzZWxlY3RvciwgdXNlIGVsZW1lbnRMb2NhdG9yIGFzIHZhbHVlOyBmb3Igb3RoZXJzLCB1c2UgZWxlbWVudE5hbWVcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUubmFtZSA9PT0gJ3NlbGVjdG9yJykge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUudmFsdWUgPSBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCBlbGVtZW50Lm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdmFyaWFibGUudmFsdWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGVsZW1lbnQubmFtZSB8fCBlbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgSUQgZm9ybSBjb250cm9sIGZvciB0aGUgZHJvcGRvd24gKGtleSBpcyAnaWQnIGluIGNvbmZpZylcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2lkJywgbmV3IEZvcm1Db250cm9sKGVsZW1lbnQuaWQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKGVsZW1lbnQuaWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHZhbHVlIGZvcm0gY29udHJvbFxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgbm90IGZvdW5kIGluIGVsZW1lbnRPcHRpb25zIHlldCAtIG1pZ2h0IG5lZWQgdG8gZmV0Y2hcbiAgICAgICAgICAgICAgICAvLyBLZWVwIGVsZW1lbnRJZCBhbmQgZWxlbWVudE5hbWUgaWYgdGhleSBleGlzdCAoZnJvbSBzZXRUZW1wbGF0ZVZhcmlhYmxlcylcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGVsZW1lbnRJZCBidXQgZWxlbWVudCBpc24ndCBmb3VuZCwgd2UgbWlnaHQgbmVlZCB0byBmZXRjaCBlbGVtZW50c1xuICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgdGhlIHNjcmVlbiBuYW1lIHlldCwgc28gd2UnbGwgd2FpdCBmb3IgZWxlbWVudE9wdGlvbnMgdG8gYmUgbG9hZGVkXG4gICAgICAgICAgICAgICAgLy8gVGhlIGluaXRpYWxpemF0aW9uIHdpbGwgcnVuIGFnYWluIHdoZW4gZWxlbWVudE9wdGlvbnMgY2hhbmdlcyB2aWEgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm8gZWxlbWVudElkIGluIHRlbXBsYXRlIGRhdGEgLSBjbGVhciBhbGwgZWxlbWVudC1yZWxhdGVkIGZpZWxkcyBhbmQgc2V0IGRlZmF1bHRzXG4gICAgICAgICAgICAgIC8vIEJ1dCBkb24ndCBvdmVycmlkZSB1c2VyJ3Mgc2NyZWVuIG5hbWUgc2VsZWN0aW9uIGlmIHRoZXkndmUgYWxyZWFkeSBzZWxlY3RlZCBvbmVcbiAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdmFyaWFibGUuZWxlbWVudE5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHNjcmVlbk5hbWVJZCBpZiBpdCB3YXNuJ3Qgc2V0IGJ5IHVzZXIgc2VsZWN0aW9uXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIGZvcm0gY29udHJvbCBoYXMgYSB2YWxpZCBzY3JlZW4gbmFtZSAobm90ICdub25lJylcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8udmFsdWU7XG4gICAgICAgICAgICAgIGlmICghY3VycmVudFNjcmVlbk5hbWVWYWx1ZSB8fCBjdXJyZW50U2NyZWVuTmFtZVZhbHVlID09PSAnbm9uZScgfHwgY3VycmVudFNjcmVlbk5hbWVWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFNjcmVlbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHMgdG8gZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAvLyBTY3JlZW4gbmFtZSBzaG91bGQgYmUgJ25vbmUnIChTZWxlY3Qgb3B0aW9uKVxuICAgICAgICAgICAgICAgIGlmICghdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkU2NyZWVuTmFtZScsIG5ldyBGb3JtQ29udHJvbCgnbm9uZScpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSgnbm9uZScsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIEVsZW1lbnQgSUQgc2hvdWxkIGJlIG51bGxcbiAgICAgICAgICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnaWQnLCBuZXcgRm9ybUNvbnRyb2wobnVsbCkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpPy5zZXRWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqIEdldCBmb3JtIGdyb3VwIGZvciBhIHZhcmlhYmxlIGJ5IG5hbWUgZnJvbSBGb3JtQXJyYXkgKi9cbiAgZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy52YXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gKGNvbnRyb2wgYXMgRm9ybUdyb3VwKS5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKiBHZXQgZm9ybSBncm91cCBhdCBhIHNwZWNpZmljIGluZGV4IGZyb20gRm9ybUFycmF5IChmb3IgdGVtcGxhdGUgdXNlKSAqL1xuICBnZXRGb3JtR3JvdXBBdChpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHwgbnVsbCB7XG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNGb3JtLmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICBwcml2YXRlIHByZWNvbXB1dGVDb25maWdzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykgcmV0dXJuO1xuICAgIFxuICAgIC8vIFByZS1jb21wdXRlIGFsbCBzZWxlY3QgY29uZmlnc1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICAvLyBQcmUtY29tcHV0ZSByZWd1bGFyIHNlbGVjdCBjb25maWdzXG4gICAgICBpZiAodGhpcy5zaG91bGRTaG93RHJvcGRvd24odmFyaWFibGUpKSB7XG4gICAgICAgIHRoaXMuZ2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFByZS1jb21wdXRlIGRhdGEgdHlwZSBzZWxlY3QgY29uZmlnc1xuICAgICAgaWYgKHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duKHZhcmlhYmxlKSkge1xuICAgICAgICB0aGlzLmdldERhdGFUeXBlU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgIC8vIFByZS1jb21wdXRlIHBhcmFtZXRlciBhbmQgZW52aXJvbm1lbnQgc2VsZWN0IGNvbmZpZ3MgaWYgbmVlZGVkXG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICAgICAgdGhpcy5nZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAvLyBQcmUtY29tcHV0ZSBkYXRhIHNldCBjb25maWcgaWYgdGVzdCBkYXRhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAgICAgdGhpcy5nZXREYXRhU2V0U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICAvLyBQcmUtY29tcHV0ZSBwYXJhbWV0ZXIgY29uZmlnIGlmIGRhdGEgc2V0IGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgICAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgICAgICB0aGlzLmdldEVudmlyb25tZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgLy8gUHJlLWNvbXB1dGUgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGNvbmZpZyBpZiBlbnZpcm9ubWVudCBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUHJlLWNvbXB1dGUgZWxlbWVudCB2YXJpYWJsZSBjb25maWdzIChzY3JlZW4gbmFtZSArIGVsZW1lbnQpXG4gICAgICBpZiAodGhpcy5pc0VsZW1lbnRUeXBlKHZhcmlhYmxlKSkge1xuICAgICAgICB0aGlzLmdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgICAgLy8gUHJlLWNvbXB1dGUgZWxlbWVudCBjb25maWcgaWYgc2NyZWVuIG5hbWUgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lKSB7XG4gICAgICAgICAgdGhpcy5nZXRFbGVtZW50U2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBwYXJzZVRlc3REYXRhVmFsdWUodmFsdWU6IHN0cmluZyk6IHsgZGF0YVR5cGU6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JywgcmF3VmFsdWU6IHN0cmluZyB9IHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAncGxhaW4tdGV4dCcsIHJhd1ZhbHVlOiAnJyB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGFyYW1ldGVyIGZvcm1hdDogQHx2YWx1ZXxcbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnQHwnKSAmJiB2YWx1ZS5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICByZXR1cm4geyBkYXRhVHlwZTogJ3BhcmFtZXRlcicsIHJhd1ZhbHVlOiB2YWx1ZS5zbGljZSgyLCAtMSkgfTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZm9yIHJ1bnRpbWUgZm9ybWF0OiAkfHZhbHVlfFxuICAgIGVsc2UgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyR8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdydW50aW1lJywgcmF3VmFsdWU6IHZhbHVlLnNsaWNlKDIsIC0xKSB9O1xuICAgIH1cbiAgICAvLyBDaGVjayBmb3IgZW52aXJvbm1lbnQgZm9ybWF0OiAqfHZhbHVlfFxuICAgIGVsc2UgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgcmV0dXJuIHsgZGF0YVR5cGU6ICdlbnZpcm9ubWVudCcsIHJhd1ZhbHVlOiB2YWx1ZS5zbGljZSgyLCAtMSkgfTtcbiAgICB9XG4gICAgLy8gUGxhaW4gdGV4dCAobm8gZm9ybWF0dGluZylcbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB7IGRhdGFUeXBlOiAncGxhaW4tdGV4dCcsIHJhd1ZhbHVlOiB2YWx1ZSB9O1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSBmb3JtYXRUZXN0RGF0YVZhbHVlKHJhd1ZhbHVlOiBzdHJpbmcsIGRhdGFUeXBlOiAncGxhaW4tdGV4dCcgfCAncGFyYW1ldGVyJyB8ICdydW50aW1lJyB8ICdlbnZpcm9ubWVudCcpOiBzdHJpbmcge1xuICAgIGlmICghcmF3VmFsdWUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgXG4gICAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgICAgY2FzZSAncGFyYW1ldGVyJzpcbiAgICAgICAgcmV0dXJuIGBAfCR7cmF3VmFsdWV9fGA7XG4gICAgICBjYXNlICdydW50aW1lJzpcbiAgICAgICAgcmV0dXJuIGAkfCR7cmF3VmFsdWV9fGA7XG4gICAgICBjYXNlICdlbnZpcm9ubWVudCc6XG4gICAgICAgIHJldHVybiBgKnwke3Jhd1ZhbHVlfXxgO1xuICAgICAgY2FzZSAncGxhaW4tdGV4dCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gcmF3VmFsdWU7XG4gICAgfVxuICB9XG4gIFxuICB0cmFja0J5VmFyaWFibGUoaW5kZXg6IG51bWJlciwgdmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBhbnkge1xuICAgIHJldHVybiB2YXJpYWJsZS5uYW1lIHx8IGluZGV4O1xuICB9XG4gIFxuICBnZXRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIFVzZSBjYWNoZSB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgICAvLyBGb3IgZWxlbWVudCB2YXJpYWJsZXMsIGluY2x1ZGUgZWxlbWVudE9wdGlvbnMsIGhhc01vcmVFbGVtZW50cywgYW5kIGlzTG9hZGluZ0VsZW1lbnRzIGluIGNhY2hlIGtleVxuICAgIC8vIE9wdGltaXplIGNhY2hlIGtleSBjb21wdXRhdGlvbiAtIHVzZSBsZW5ndGggaW5zdGVhZCBvZiBmdWxsIGFycmF5IGpvaW4gZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IG9wdGlvbnNLZXkgPSB2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdmFyaWFibGUuZGF0YUtleSA9PT0gJ2xhYmVsJ1xuICAgICAgPyBgJHt0aGlzLmVsZW1lbnRPcHRpb25zLmxlbmd0aH1fJHt0aGlzLmVsZW1lbnRPcHRpb25zLm1hcChlbCA9PiBlbC5pZCB8fCAnJykuam9pbignLCcpfWAgXG4gICAgICA6IGAke3ZhcmlhYmxlLm9wdGlvbnM/Lmxlbmd0aCB8fCAwfV8ke3ZhcmlhYmxlLm9wdGlvbnM/LmpvaW4oJywnKSB8fCAnJ31gO1xuICAgIC8vIEluY2x1ZGUgaGFzTW9yZUVsZW1lbnRzIGFuZCBpc0xvYWRpbmdFbGVtZW50cyBpbiBjYWNoZSBrZXkgZm9yIHNlbGVjdG9yIHZhcmlhYmxlc1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gdmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdsYWJlbCdcbiAgICAgID8gYCR7dmFyaWFibGUubmFtZX1fJHtvcHRpb25zS2V5fV8ke3RoaXMuaGFzTW9yZUVsZW1lbnRzfV8ke3RoaXMuaXNMb2FkaW5nRWxlbWVudHN9YFxuICAgICAgOiBgJHt2YXJpYWJsZS5uYW1lfV8ke29wdGlvbnNLZXl9YDtcbiAgICBpZiAodGhpcy5zZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBVc2UgZWxlbWVudE9wdGlvbnMgaWYgdmFyaWFibGUgbmFtZSBpcyAnc2VsZWN0b3InLCBvdGhlcndpc2UgdXNlIHZhcmlhYmxlLm9wdGlvbnNcbiAgICAvLyBFeHRyYWN0IGVsZW1lbnQgbmFtZXMgZnJvbSBFbGVtZW50IG9iamVjdHNcbiAgICBsZXQgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAgIGlmICh2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdmFyaWFibGUuZGF0YUtleSA9PT0gJ2xhYmVsJykge1xuICAgICAgLy8gRm9yIGVsZW1lbnQgb3B0aW9ucywgdXNlIGxvY2F0b3JWYWx1ZSBhcyBib3RoIGlkIGFuZCB2YWx1ZSBzbyB0aGUgY29tcG9uZW50IHJldHVybnMgbG9jYXRvclZhbHVlXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIHNlbGVjdGVkIHZhbHVlIGlzIHRoZSBsb2NhdG9yVmFsdWUgKG5vdCB0aGUgZWxlbWVudCBpZClcbiAgICAgIG9wdGlvbnNBcnJheSA9IHRoaXMuZWxlbWVudE9wdGlvbnNcbiAgICAgICAgLm1hcChlbCA9PiB7XG4gICAgICAgICAgY29uc3QgbG9jYXRvclZhbHVlID0gZWwubG9jYXRvclZhbHVlIHx8ICcnO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogbG9jYXRvclZhbHVlLCAvLyBVc2UgbG9jYXRvclZhbHVlIGFzIGlkIHNvIGl0IGdldHMgcmV0dXJuZWQgYXMgdGhlIHZhbHVlXG4gICAgICAgICAgICBlbGVtZW50SWQ6IGVsLmlkPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgdmFsdWU6IGxvY2F0b3JWYWx1ZSwgLy8gQWxzbyBzZXQgdmFsdWUgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICBuYW1lOiBgJHtlbC5uYW1lfSAoJHtlbC5zY3JlZW5OYW1lT2JqPy5uYW1lIHx8ICcnfSlgLFxuICAgICAgICAgICAgbGFiZWw6IGAke2VsLm5hbWV9ICgke2VsLnNjcmVlbk5hbWVPYmo/Lm5hbWUgfHwgJyd9KWAsXG4gICAgICAgICAgICBzY3JlZW5OYW1lSWQ6IGVsLnNjcmVlbk5hbWVJZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHNjcmVlbk5hbWVPYmo6IGVsLnNjcmVlbk5hbWVPYmosXG4gICAgICAgICAgICBvdGhlckxvY2F0b3I6IGVsLm90aGVyTG9jYXRvclxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zQXJyYXkgPSB2YXJpYWJsZS5vcHRpb25zPy5tYXAob3B0ID0+IHtyZXR1cm4ge2lkOiBvcHQsIHZhbHVlOiBvcHQsIG5hbWU6IG9wdCwgbGFiZWw6IG9wdH19KSBhcyBTZWxlY3RPcHRpb25bXSB8fCBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3ZhbHVlJywgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIGxvYWQgbW9yZSBhbmQgc2VhcmNoIHN1cHBvcnQgZm9yIHNlbGVjdG9yIHZhcmlhYmxlc1xuICAgIGlmICh2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdmFyaWFibGUuZGF0YUtleSA9PT0gJ2xhYmVsJykge1xuICAgICAgY29uZmlnLnNlYXJjaGFibGUgPSB0cnVlOyAvLyBFbmFibGUgc2VhcmNoIGZvciBzZWxlY3RvciBkcm9wZG93blxuICAgICAgY29uZmlnLnNlcnZlclNlYXJjaCA9IHRydWU7IC8vIEVuYWJsZSBzZXJ2ZXItc2lkZSBzZWFyY2hcbiAgICAgIGNvbmZpZy5oYXNNb3JlID0gdGhpcy5oYXNNb3JlRWxlbWVudHM7XG4gICAgICBjb25maWcuaXNMb2FkaW5nID0gdGhpcy5pc0xvYWRpbmdFbGVtZW50cztcbiAgICAgIGNvbmZpZy5vbkxvYWRNb3JlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRWxlbWVudHMuZW1pdCgpO1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5vblNlYXJjaCA9IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIEVtaXQgc2VhcmNoIGV2ZW50IHdoZW4gdXNlciB0eXBlcyBpbiB0aGUgc2VhcmNoIGJveFxuICAgICAgICB0aGlzLnNlYXJjaEVsZW1lbnRzLmVtaXQocXVlcnkpO1xuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgb25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKCF2YXJpYWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIElmIHRoaXMgaXMgYSB0ZXN0LWRhdGEgdmFyaWFibGUsIHBhcnNlIGFuZCB1cGRhdGUgcmF3IHZhbHVlIGFuZCBkYXRhIHR5cGVcbiAgICBpZiAodGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd24odmFyaWFibGUpKSB7XG4gICAgICBjb25zdCB7IGRhdGFUeXBlLCByYXdWYWx1ZSB9ID0gdGhpcy5wYXJzZVRlc3REYXRhVmFsdWUodmFsdWUgfHwgJycpO1xuICAgICAgdmFyaWFibGUuZGF0YVR5cGUgPSBkYXRhVHlwZTtcbiAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcmF3VmFsdWU7XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBkYXRhIHR5cGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGVOYW1lKTtcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCdkYXRhVHlwZScpKSB7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdkYXRhVHlwZScpPy5zZXRWYWx1ZShkYXRhVHlwZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICBcbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5ICh1c2UgZW1pdEV2ZW50OiBmYWxzZSB0byBwcmV2ZW50IHRyaWdnZXJpbmcgdmFsdWVDaGFuZ2VzKVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBcbiAgICAvLyBFbWl0IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xuICB9XG4gIFxuICBvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5ICh1c2UgZW1pdEV2ZW50OiBmYWxzZSB0byBwcmV2ZW50IHRyaWdnZXJpbmcgdmFsdWVDaGFuZ2VzKVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICAvLyBOb3RlOiBJZiB2YXJpYWJsZSBkb2Vzbid0IGV4aXN0IGluIEZvcm1BcnJheSwgaXQgc2hvdWxkIGJlIGFkZGVkIGJ5IHBhcmVudCBjb21wb25lbnRcbiAgICBcbiAgICAvLyBNYXJrIGZvciBjaGVjayBzaW5jZSB3ZSdyZSB1c2luZyBPblB1c2hcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBcbiAgICAvLyBFbWl0IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLnZhcmlhYmxlQm9vbGVhbkNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGVOYW1lLCB2YWx1ZTogdmFsdWUgfSk7XG4gIH1cbiAgXG4gIHNob3VsZFNob3dEcm9wZG93bih2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIC8vIFVzZSBjYWNoZSB0byBhdm9pZCByZXBlYXRlZCBjYWxjdWxhdGlvbnNcbiAgICBpZiAodGhpcy5zaG91bGRTaG93RHJvcGRvd25DYWNoZS5oYXModmFyaWFibGUubmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3VsZFNob3dEcm9wZG93bkNhY2hlLmdldCh2YXJpYWJsZS5uYW1lKSE7XG4gICAgfVxuICAgIC8vIEZvciBlbGVtZW50IHZhcmlhYmxlcyAoZGF0YUtleSA9PT0gJ2VsZW1lbnQnKSwgd2UgdXNlIGNhc2NhZGluZyBkcm9wZG93bnMgKHNjcmVlbiBuYW1lICsgZWxlbWVudClcbiAgICAvLyBTbyByZXR1cm4gZmFsc2UgdG8gdXNlIHRoZSBjYXNjYWRpbmcgZHJvcGRvd24gcGF0dGVyblxuICAgIGNvbnN0IHJlc3VsdCA9IHZhcmlhYmxlLm5hbWUgPT09ICd0eXBlJyB8fCB2YXJpYWJsZS5uYW1lID09PSAnc2Nyb2xsVG8nIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdsYWJlbCc7XG4gICAgdGhpcy5zaG91bGRTaG93RHJvcGRvd25DYWNoZS5zZXQodmFyaWFibGUubmFtZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIFxuICBuZWVkc0RhdGFUeXBlRHJvcGRvd24odmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsY3VsYXRpb25zXG4gICAgaWYgKHRoaXMubmVlZHNEYXRhVHlwZURyb3Bkb3duQ2FjaGUuaGFzKHZhcmlhYmxlLm5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZWVkc0RhdGFUeXBlRHJvcGRvd25DYWNoZS5nZXQodmFyaWFibGUubmFtZSkhO1xuICAgIH1cbiAgICBjb25zdCBkYXRhS2V5ID0gdmFyaWFibGUuZGF0YUtleT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICBjb25zdCByZXN1bHQgPSBkYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fCBkYXRhS2V5ID09PSAnc291cmNlX3ZhbHVlJyB8fCBkYXRhS2V5ID09PSAndGFyZ2V0X3ZhbHVlJztcbiAgICB0aGlzLm5lZWRzRGF0YVR5cGVEcm9wZG93bkNhY2hlLnNldCh2YXJpYWJsZS5uYW1lLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgXG4gIGdldERhdGFUeXBlT3B0aW9ucygpOiBTZWxlY3RPcHRpb25bXSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBzdGF0aWMgYXJyYXlcbiAgICByZXR1cm4gdGhpcy5kYXRhVHlwZU9wdGlvbnM7XG4gIH1cbiAgXG4gIGdldERhdGFUeXBlU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9kYXRhVHlwZWA7XG4gICAgaWYgKHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhVHlwZVNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBpbiBGb3JtQXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCAmJiAhdmFyaWFibGVHcm91cC5nZXQoJ2RhdGFUeXBlJykpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnZGF0YVR5cGUnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudERhdGFUeXBlKSk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAnZGF0YVR5cGUnLCAvLyBVc2UgJ2RhdGFUeXBlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBUeXBlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGhpcy5kYXRhVHlwZU9wdGlvbnMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFUeXBlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIHRoaXMuZGF0YVR5cGVTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBcbiAgZ2V0Q3VycmVudERhdGFUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAncnVudGltZScgfCAnZW52aXJvbm1lbnQnIHtcbiAgICByZXR1cm4gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICB9XG4gIFxuICBnZXRSYXdWYWx1ZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLnJhd1ZhbHVlIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHNlbGVjdG9yIHZhcmlhYmxlIGlzIGF2YWlsYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlc1xuICAgKi9cbiAgZ2V0IHNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHYuZGF0YUtleSA9PT0gJ2VsZW1lbnQnIHx8IHYuZGF0YUtleSA9PT0gJ2xhYmVsJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcGFyYW1ldGVyIHZhcmlhYmxlIGlzIGF2YWlsYWJsZSAodGVzdERhdGEgd2l0aCBwYXJhbWV0ZXIgdHlwZSlcbiAgICovXG4gIGdldCBwYXJhbWV0ZXJWYXJpYWJsZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5zb21lKHYgPT4ge1xuICAgICAgY29uc3QgZGF0YUtleSA9IHYuZGF0YUtleT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGlmIChkYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fCBkYXRhS2V5ID09PSAnc291cmNlX3ZhbHVlJyB8fCBkYXRhS2V5ID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IHYuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgICAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGF2YWlsYWJsZSAodGVzdERhdGEgd2l0aCBlbnZpcm9ubWVudCB0eXBlKVxuICAgKi9cbiAgZ2V0IGVudmlyb25tZW50VmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFLZXkgPSB2LmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAoZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB2LmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgcmV0dXJuIGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG4gIFxuICBvbkRhdGFUeXBlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCBkYXRhVHlwZTogJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAncnVudGltZScgfCAnZW52aXJvbm1lbnQnKTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgdmFyaWFibGVcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAoIXZhcmlhYmxlKSByZXR1cm47XG4gICAgXG4gICAgLy8gVXBkYXRlIHN0b3JlZCBkYXRhIHR5cGUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgIHZhcmlhYmxlLmRhdGFUeXBlID0gZGF0YVR5cGU7XG4gICAgXG4gICAgLy8gQ2xlYXIgcGFyYW1ldGVyIGFuZCBlbnZpcm9ubWVudCBzZWxlY3QgY29uZmlnIGNhY2hlcyBzaW5jZSBkYXRhIHR5cGUgY2hhbmdlZFxuICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fdGVzdERhdGFQcm9maWxlYCk7XG4gICAgdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fZGF0YVNldGApO1xuICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZU5hbWV9X3BhcmFtRm9yRGF0YVNldGApO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9lbnZpcm9ubWVudGApO1xuICAgIHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoYCR7dmFyaWFibGVOYW1lfV9lbnZQYXJhbWApO1xuICAgIFxuICAgIC8vIENsZWFyIHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBpZiBzd2l0Y2hpbmcgYXdheSBmcm9tIHBhcmFtZXRlciB0eXBlXG4gICAgaWYgKGRhdGFUeXBlICE9PSAncGFyYW1ldGVyJykge1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gdW5kZWZpbmVkO1xuICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBcbiAgICAvLyBDbGVhciBzZWxlY3RlZCBlbnZpcm9ubWVudCBpZiBzd2l0Y2hpbmcgYXdheSBmcm9tIGVudmlyb25tZW50IHR5cGVcbiAgICBpZiAoZGF0YVR5cGUgIT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEdldCBjdXJyZW50IHJhdyB2YWx1ZVxuICAgIGNvbnN0IHJhd1ZhbHVlID0gdmFyaWFibGUucmF3VmFsdWUgfHwgJyc7XG4gICAgXG4gICAgLy8gRm9ybWF0IHRoZSB2YWx1ZSBiYXNlZCBvbiBuZXcgZGF0YSB0eXBlXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdFRlc3REYXRhVmFsdWUocmF3VmFsdWUsIGRhdGFUeXBlKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWUgKGFsd2F5cyBzdG9yZSBmb3JtYXR0ZWQgdmFsdWUgaW4gdmFyaWFibGUpXG4gICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICBcbiAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIGluIEZvcm1BcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAvLyBGb3IgcGFyYW1ldGVyIHR5cGUsIHNldCBmb3JtIGNvbnRyb2wgdG8gcmF3IHZhbHVlIHNvIHNlbGVjdCBjYW4gZGlzcGxheSBpdFxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHJhd1ZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCcpIHtcbiAgICAgICAgICAvLyBGb3IgZW52aXJvbm1lbnQgdHlwZSwgY2xlYXIgdmFsdWUgYW5kIHNlbGVjdGVkRW52aXJvbm1lbnRcbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRW52aXJvbm1lbnQnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIHNlbGVjdGVkRW52aXJvbm1lbnQgY29udHJvbCBpZiBub3QgZW52aXJvbm1lbnQgdHlwZVxuICAgICAgaWYgKGRhdGFUeXBlICE9PSAnZW52aXJvbm1lbnQnICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgdmFyaWFibGVHcm91cC5yZW1vdmVDb250cm9sKCdzZWxlY3RlZEVudmlyb25tZW50Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIElmIHN3aXRjaGluZyB0byBwYXJhbWV0ZXIgdHlwZSwgY2hlY2sgZm9yIGRlZmF1bHQgdmFsdWVzIGFuZCBpbml0aWFsaXplIHRoZW1cbiAgICBpZiAoZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuaW5kZXhPZih2YXJpYWJsZSk7XG4gICAgICAvLyBDaGVjayBpZiBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBhcmUgcHJvdmlkZWQgZnJvbSB0ZXN0IGNhc2VcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAmJiB0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXggIT0gbnVsbCAmJiB0aGlzLnBhcmFtZXRlck9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBieSBJRFxuICAgICAgICBjb25zdCBkZWZhdWx0UHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB0ZXN0RGF0YS5pZCA9PT0gdGhpcy5kZWZhdWx0VGVzdERhdGFQcm9maWxlSWQpO1xuICAgICAgICBpZiAoZGVmYXVsdFByb2ZpbGUgJiYgZGVmYXVsdFByb2ZpbGUuZGF0YSAmJiBkZWZhdWx0UHJvZmlsZS5kYXRhLmxlbmd0aCA+IHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHREYXRhU2V0ID0gZGVmYXVsdFByb2ZpbGUuZGF0YVt0aGlzLmRlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdO1xuICAgICAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gZGVmYXVsdFByb2ZpbGUubmFtZSB8fCBkZWZhdWx0UHJvZmlsZS50ZXN0RGF0YU5hbWU7XG4gICAgICAgICAgY29uc3QgZGF0YVNldE5hbWUgPSBkZWZhdWx0RGF0YVNldC5uYW1lO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFNldCB2YXJpYWJsZSBwcm9wZXJ0aWVzIC0gdGhpcyBlbnN1cmVzIGhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKCkgYW5kIGhhc1NlbGVjdGVkRGF0YVNldCgpIHJldHVybiB0cnVlXG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSBwcm9maWxlTmFtZTtcbiAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gZGVmYXVsdFByb2ZpbGUuaWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gZGF0YVNldE5hbWU7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gU2V0IGZvcm0gY29udHJvbHMgd2l0aCB0aGUgYWN0dWFsIHZhbHVlcyBzbyBkcm9wZG93bnMgZGlzcGxheSBzZWxlY3RlZCBvcHRpb25zXG4gICAgICAgICAgLy8gVXNlIHByb2ZpbGUgSUQgKHN0cmluZykgZm9yIHNlbGVjdGVkVGVzdERhdGFQcm9maWxlIGZvcm0gY29udHJvbCB0byBtYXRjaCBvcHRpb24uaWQgZm9ybWF0XG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVJZFN0cmluZyA9IFN0cmluZyhkZWZhdWx0UHJvZmlsZS5pZCk7XG4gICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnLCBuZXcgRm9ybUNvbnRyb2wocHJvZmlsZUlkU3RyaW5nKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkRGF0YVNldCcsIG5ldyBGb3JtQ29udHJvbChkYXRhU2V0TmFtZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZShkYXRhU2V0TmFtZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDbGVhciBjYWNoZXMgdG8gZm9yY2UgcmVjb21wdXRhdGlvbiBvZiBjb25maWdzIHdpdGggbmV3IHZhbHVlc1xuICAgICAgICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGAke3ZhcmlhYmxlTmFtZX1fdGVzdERhdGFQcm9maWxlYCk7XG4gICAgICAgICAgY29uc3QgZGF0YVNldEtleXNUb0RlbGV0ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGVOYW1lfV9kYXRhU2V0YCkpIHtcbiAgICAgICAgICAgICAgZGF0YVNldEtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZGF0YVNldEtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlTmFtZX1fcGFyYW1Gb3JEYXRhU2V0YCkpIHtcbiAgICAgICAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBhcmFtS2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBQcmUtY29tcHV0ZSB0aGUgbmV3IHNlbGVjdCBjb25maWcgaWYgbmVlZGVkXG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuaW5kZXhPZih2YXJpYWJsZSk7XG4gICAgICBpZiAoZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKSB7XG4gICAgICAgIC8vIFByZS1jb21wdXRlIHRlc3QgZGF0YSBwcm9maWxlIGNvbmZpZ1xuICAgICAgICB0aGlzLmdldFRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAvLyBJZiBhIHByb2ZpbGUgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcHJlLWNvbXB1dGUgZGF0YSBzZXQgY29uZmlnXG4gICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZSkge1xuICAgICAgICAgIHRoaXMuZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICAgIC8vIElmIGEgZGF0YSBzZXQgaXMgYWxyZWFkeSBzZWxlY3RlZCwgcHJlLWNvbXB1dGUgcGFyYW1ldGVyIGNvbmZpZ1xuICAgICAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlLCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgY29uc29sZS5sb2coJ29uRGF0YVR5cGVDaGFuZ2UnLCB2YXJpYWJsZU5hbWUsIGRhdGFUeXBlLCBmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50IHdpdGggZm9ybWF0dGVkIHZhbHVlXG4gICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZU5hbWUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZSB9KTtcbiAgfVxuICBcbiAgb25FbGVtZW50U2VhcmNoKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAvLyBPbmx5IGhhbmRsZSBzZWFyY2ggZm9yIHNlbGVjdG9yIHZhcmlhYmxlc1xuICAgIC8vIFRoZSBrZXkgd2lsbCBiZSAndmFsdWUnIHNpbmNlIHRoYXQncyB3aGF0IHdlIHNldCBpbiB0aGUgY29uZmlnXG4gICAgLy8gRW1pdCB0aGUgc2VhcmNoIHF1ZXJ5IHRvIHBhcmVudCBjb21wb25lbnRcbiAgICB0aGlzLnNlYXJjaEVsZW1lbnRzLmVtaXQoZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgb25UZXN0RGF0YVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCByYXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgdmFyaWFibGVcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAoIXZhcmlhYmxlKSByZXR1cm47XG4gICAgXG4gICAgLy8gVXBkYXRlIHN0b3JlZCByYXcgdmFsdWUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcmF3VmFsdWU7XG4gICAgXG4gICAgLy8gR2V0IGN1cnJlbnQgZGF0YSB0eXBlXG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgXG4gICAgLy8gRm9ybWF0IHRoZSB2YWx1ZSBiYXNlZCBvbiBkYXRhIHR5cGVcbiAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZm9ybWF0VGVzdERhdGFWYWx1ZShyYXdWYWx1ZSwgZGF0YVR5cGUpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSB2YXJpYWJsZSB2YWx1ZVxuICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBpbiBGb3JtQXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwICYmIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoZm9ybWF0dGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayBmb3IgY2hlY2sgc2luY2Ugd2UncmUgdXNpbmcgT25QdXNoXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XG4gICAgdGhpcy52YXJpYWJsZVZhbHVlQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZU5hbWUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdW5pcXVlIHRlc3QgZGF0YSBwcm9maWxlcyBmcm9tIHBhcmFtZXRlciBvcHRpb25zIChyYXcgVGVzdERhdGEgb2JqZWN0cylcbiAgICovXG4gIGdldFVuaXF1ZVRlc3REYXRhUHJvZmlsZXMoKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBwcm9maWxlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+KCk7XG4gICAgdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZvckVhY2goKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgIC8vIHRlc3REYXRhLm5hbWUgaXMgdGhlIHRlc3REYXRhTmFtZSAocHJvZmlsZSBuYW1lKVxuICAgICAgY29uc3QgcHJvZmlsZU5hbWUgPSB0ZXN0RGF0YS5uYW1lIHx8IHRlc3REYXRhLnRlc3REYXRhTmFtZTtcbiAgICAgIGlmIChwcm9maWxlTmFtZSAmJiAhcHJvZmlsZU1hcC5oYXMocHJvZmlsZU5hbWUpKSB7XG4gICAgICAgIHByb2ZpbGVNYXAuc2V0KHByb2ZpbGVOYW1lLCB7XG4gICAgICAgICAgaWQ6IFN0cmluZyh0ZXN0RGF0YS5pZCksXG4gICAgICAgICAgbmFtZTogcHJvZmlsZU5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvZmlsZXMgPSBBcnJheS5mcm9tKHByb2ZpbGVNYXAudmFsdWVzKCkpO1xuICAgIHJldHVybiBwcm9maWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGF0YSBzZXRzIGZvciBhIHNwZWNpZmljIHRlc3QgZGF0YSBwcm9maWxlXG4gICAqIFJldHVybnMgYWxsIGRhdGEgc2V0cyBmcm9tIHRoZSBwcm9maWxlJ3MgZGF0YSBhcnJheVxuICAgKi9cbiAgZ2V0RGF0YVNldHNGb3JUZXN0RGF0YVByb2ZpbGUocHJvZmlsZUlkOiBzdHJpbmcpOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10ge1xuICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIGJ5IGlkXG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB0ZXN0RGF0YS5pZCA9PT0gTnVtYmVyKHByb2ZpbGVJZCk7XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCF0ZXN0RGF0YVByb2ZpbGUgfHwgIXRlc3REYXRhUHJvZmlsZS5kYXRhIHx8IHRlc3REYXRhUHJvZmlsZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBSZXR1cm4gYWxsIGRhdGEgc2V0cyBmcm9tIHRoZSBwcm9maWxlXG4gICAgcmV0dXJuIHRlc3REYXRhUHJvZmlsZS5kYXRhLm1hcCgoZGF0YVNldDogYW55KSA9PiAoe1xuICAgICAgaWQ6IGRhdGFTZXQubmFtZSxcbiAgICAgIG5hbWU6IGRhdGFTZXQubmFtZVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFyYW1ldGVycyBmb3IgYSBzcGVjaWZpYyBkYXRhIHNldCBpbiBhIHRlc3QgZGF0YSBwcm9maWxlXG4gICAqIEV4dHJhY3RzIHBhcmFtZXRlciBuYW1lcyBmcm9tIHRoZSBzZWxlY3RlZCBkYXRhIHNldCdzIGRhdGEgb2JqZWN0XG4gICAqL1xuICBnZXRQYXJhbWV0ZXJzRm9yRGF0YVNldChwcm9maWxlSWRPck5hbWU6IHN0cmluZywgZGF0YVNldE5hbWU6IHN0cmluZyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgLy8gRmluZCB0aGUgdGVzdCBkYXRhIHByb2ZpbGUgYnkgaWQgb3IgbmFtZVxuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAvLyBUcnkgdG8gbWF0Y2ggYnkgSUQgZmlyc3QgKGlmIHByb2ZpbGVJZE9yTmFtZSBpcyBhIG51bWJlcilcbiAgICAgIGNvbnN0IGlkTWF0Y2ggPSAhaXNOYU4oTnVtYmVyKHByb2ZpbGVJZE9yTmFtZSkpICYmIHRlc3REYXRhLmlkID09PSBOdW1iZXIocHJvZmlsZUlkT3JOYW1lKTtcbiAgICAgIC8vIE90aGVyd2lzZSB0cnkgdG8gbWF0Y2ggYnkgbmFtZVxuICAgICAgY29uc3QgbmFtZU1hdGNoID0gKHRlc3REYXRhLm5hbWUgfHwgdGVzdERhdGEudGVzdERhdGFOYW1lKSA9PT0gcHJvZmlsZUlkT3JOYW1lO1xuICAgICAgcmV0dXJuIGlkTWF0Y2ggfHwgbmFtZU1hdGNoO1xuICAgIH0pO1xuICAgIFxuICAgIGlmICghdGVzdERhdGFQcm9maWxlIHx8ICF0ZXN0RGF0YVByb2ZpbGUuZGF0YSB8fCB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gRmluZCB0aGUgc3BlY2lmaWMgZGF0YSBzZXQgYnkgbmFtZVxuICAgIGNvbnN0IGRhdGFTZXQgPSB0ZXN0RGF0YVByb2ZpbGUuZGF0YS5maW5kKChkczogYW55KSA9PiBkcy5uYW1lID09PSBkYXRhU2V0TmFtZSk7XG4gICAgaWYgKCFkYXRhU2V0IHx8ICFkYXRhU2V0LmRhdGEpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gR2V0IGFsbCBwYXJhbWV0ZXIga2V5cyBmcm9tIHRoZSBkYXRhIHNldCdzIGRhdGEgb2JqZWN0XG4gICAgY29uc3QgcGFyYW1ldGVyTmFtZXMgPSBPYmplY3Qua2V5cyhkYXRhU2V0LmRhdGEpO1xuICAgIHJldHVybiBwYXJhbWV0ZXJOYW1lcy5tYXAocGFyYW1OYW1lID0+ICh7XG4gICAgICBpZDogcGFyYW1OYW1lLFxuICAgICAgbmFtZTogcGFyYW1OYW1lLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgdGVzdCBkYXRhIHByb2ZpbGUgZHJvcGRvd24gKGZpcnN0IGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzKVxuICAgKi9cbiAgZ2V0VGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X3Rlc3REYXRhUHJvZmlsZWA7XG4gICAgXG4gICAgLy8gR2V0IHVuaXF1ZSB0ZXN0IGRhdGEgcHJvZmlsZXNcbiAgICBjb25zdCBwcm9maWxlcyA9IHRoaXMuZ2V0VW5pcXVlVGVzdERhdGFQcm9maWxlcygpO1xuICAgIC8vIENyZWF0ZSBvcHRpb25zIHdpdGggcHJvZmlsZSBuYW1lIGFuZCBJRCAoZGlzcGxheSBuYW1lIHdpdGggSUQpXG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHByb2ZpbGVzLm1hcChwcm9maWxlID0+IHtcbiAgICAgIC8vIEZpbmQgdGhlIHRlc3QgZGF0YSBwcm9maWxlIHRvIGdldCB0aGUgSURcbiAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0ZXN0RGF0YS5uYW1lIHx8IHRlc3REYXRhLnRlc3REYXRhTmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWUgPT09IHByb2ZpbGUubmFtZTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvZmlsZUlkID0gdGVzdERhdGFQcm9maWxlPy5pZCB8fCBwcm9maWxlLmlkO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogU3RyaW5nKHByb2ZpbGVJZCksXG4gICAgICAgIHZhbHVlOiBwcm9maWxlLm5hbWUsXG4gICAgICAgIG5hbWU6IGAke3Byb2ZpbGUubmFtZX1gLCAvLyBEaXNwbGF5IG5hbWUgd2l0aCBJRFxuICAgICAgICBsYWJlbDogYCR7cHJvZmlsZS5uYW1lfWBcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBmb3IgdGVzdCBkYXRhIHByb2ZpbGUgc2VsZWN0aW9uIGFuZCB1cGRhdGUgaXRcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKSkge1xuICAgICAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvZmlsZSBuYW1lXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgXG4gICAgICAgICAgPyBTdHJpbmcodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCkgXG4gICAgICAgICAgOiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgfHwgJycpO1xuICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnRWYWx1ZSkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBBbHdheXMgdXBkYXRlIGZvcm0gY29udHJvbCB2YWx1ZSBpZiB2YXJpYWJsZSBoYXMgYSBzZWxlY3RlZCBwcm9maWxlXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIHZhbHVlIGlzIHNldCBldmVuIGlmIGNvbmZpZyB3YXMgY2FjaGVkXG4gICAgICAvLyBVc2UgcHJvZmlsZSBJRCAod2hpY2ggbWF0Y2hlcyBvcHQuaWQpIGluc3RlYWQgb2YgcHJvZmlsZSBuYW1lICh3aGljaCBtYXRjaGVzIG9wdC52YWx1ZSlcbiAgICAgIGlmICh2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJvZmlsZUlkU3RyaW5nID0gU3RyaW5nKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpO1xuICAgICAgICAvLyBWZXJpZnkgdGhlIHByb2ZpbGUgSUQgZXhpc3RzIGluIG9wdGlvbnMgYmVmb3JlIHNldHRpbmdcbiAgICAgICAgY29uc3QgcHJvZmlsZUV4aXN0cyA9IG9wdGlvbnNBcnJheS5zb21lKG9wdCA9PiBvcHQuaWQgPT09IHByb2ZpbGVJZFN0cmluZyk7XG4gICAgICAgIGlmIChwcm9maWxlRXhpc3RzKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudENvbnRyb2xWYWx1ZSA9IHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFRlc3REYXRhUHJvZmlsZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoY3VycmVudENvbnRyb2xWYWx1ZSAhPT0gcHJvZmlsZUlkU3RyaW5nKSB7XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUocHJvZmlsZUlkU3RyaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBpZiB3ZSBvbmx5IGhhdmUgdGhlIHByb2ZpbGUgbmFtZSwgZmluZCB0aGUgbWF0Y2hpbmcgb3B0aW9uIGFuZCB1c2UgaXRzIElEXG4gICAgICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID0gb3B0aW9uc0FycmF5LmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PT0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUpO1xuICAgICAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q29udHJvbFZhbHVlID0gdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50Q29udHJvbFZhbHVlICE9PSBtYXRjaGluZ09wdGlvbi5pZCkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnNldFZhbHVlKG1hdGNoaW5nT3B0aW9uLmlkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSB0aGUgdmFyaWFibGUncyBwcm9maWxlIElEIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IE51bWJlcihtYXRjaGluZ09wdGlvbi5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgY2FjaGUgYWZ0ZXIgZW5zdXJpbmcgZm9ybSBjb250cm9sIGlzIHNldFxuICAgIGlmICh0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgLSBpZiBzbywgZGlzYWJsZSB0aGUgZHJvcGRvd25cbiAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5oYXNEZWZhdWx0VGVzdERhdGFTZWxlY3Rpb24oKTtcbiAgICBcbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0IFRlc3QgRGF0YSBQcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVQYXJhbWV0ZXJzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ1BhcmFtZXRlcnMsXG4gICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaFBhcmFtZXRlcnMuZW1pdChxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVQYXJhbWV0ZXJzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gVmFsdWUgaXMgdGhlIHByb2ZpbGUgSUQgKHN0cmluZykgZnJvbSB0aGUgbWF0LW9wdGlvblxuICAgICAgICAvLyBGaW5kIHRoZSB0ZXN0IGRhdGEgcHJvZmlsZSBieSBJRCB0byBnZXQgdGhlIG5hbWVcbiAgICAgICAgY29uc3QgdGVzdERhdGFQcm9maWxlID0gdGhpcy5wYXJhbWV0ZXJPcHRpb25zLmZpbmQoKHRlc3REYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGVzdERhdGEuaWQgPT09IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gU3RvcmUgYm90aCBJRCBhbmQgbmFtZVxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkID0gdGVzdERhdGFQcm9maWxlPy5pZDtcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUgPSB0ZXN0RGF0YVByb2ZpbGU/Lm5hbWUgfHwgdGVzdERhdGFQcm9maWxlPy50ZXN0RGF0YU5hbWUgfHwgJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBkYXRhIHNldCBhbmQgcGFyYW1ldGVyIHNlbGVjdGlvbiB3aGVuIHByb2ZpbGUgY2hhbmdlc1xuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sc1xuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJykpIHtcbiAgICAgICAgICAgIHZhckdyb3VwLmdldCgnc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhckdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0JykpIHtcbiAgICAgICAgICAgIHZhckdyb3VwLmdldCgnc2VsZWN0ZWREYXRhU2V0Jyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIHZhckdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIGNhY2hlcyBmb3IgZGF0YSBzZXQgYW5kIHBhcmFtZXRlciBzZWxlY3QgY29uZmlncyBzaW5jZSBwcm9maWxlIGNoYW5nZWRcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc2V0IGFuZCBwYXJhbWV0ZXIgY29uZmlncyBmb3IgdGhpcyB2YXJpYWJsZVxuICAgICAgICBjb25zdCBkYXRhU2V0S2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5mb3JFYWNoKCh2YWx1ZTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHt2YXJpYWJsZS5uYW1lfV9kYXRhU2V0YCkpIHtcbiAgICAgICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGFTZXRLZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5kYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKHZhbHVlOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldGApKSB7XG4gICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgc2VsZWN0ZWQgZGF0YSBzZXQgd2hlbiBwcm9maWxlIGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2tcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGRhdGEgc2V0IGRyb3Bkb3duIChzZWNvbmQgZHJvcGRvd24gZm9yIHBhcmFtZXRlcnMgLSBzaG93cyBkYXRhIHNldHMgZnJvbSBzZWxlY3RlZCBwcm9maWxlKVxuICAgKi9cbiAgZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gR2V0IHNlbGVjdGVkIHRlc3QgZGF0YSBwcm9maWxlIElEIChwcmVmZXJyZWQpIG9yIG5hbWUgKGZhbGxiYWNrKVxuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZUlkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZDtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICBcbiAgICBpZiAoIXNlbGVjdGVkUHJvZmlsZUlkICYmICFzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgaWYgbm8gcHJvZmlsZSBpcyBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAnc2VsZWN0ZWREYXRhU2V0JyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgVGVzdCBEYXRhIFByb2ZpbGUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmaW5kIElEIGZyb20gcHJvZmlsZSBuYW1lXG4gICAgbGV0IHByb2ZpbGVJZFRvVXNlOiBzdHJpbmc7XG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZUlkKSB7XG4gICAgICBwcm9maWxlSWRUb1VzZSA9IFN0cmluZyhzZWxlY3RlZFByb2ZpbGVJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbmQgdGhlIHByb2ZpbGUgSUQgZnJvbSB0aGUgcHJvZmlsZSBuYW1lXG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGUgPSB0aGlzLnBhcmFtZXRlck9wdGlvbnMuZmluZCgodGVzdERhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBuYW1lID09PSBzZWxlY3RlZFByb2ZpbGU7XG4gICAgICB9KTtcbiAgICAgIHByb2ZpbGVJZFRvVXNlID0gdGVzdERhdGFQcm9maWxlPy5pZCA/IFN0cmluZyh0ZXN0RGF0YVByb2ZpbGUuaWQpIDogJyc7XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2ZpbGUgSUQgZm9yIGNhY2hlIGtleSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvZmlsZSBuYW1lXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9kYXRhU2V0XyR7cHJvZmlsZUlkVG9Vc2UgfHwgc2VsZWN0ZWRQcm9maWxlIHx8ICcnfWA7XG4gICAgaWYgKHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgZGF0YSBzZXRzIGZvciB0aGUgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgdXNpbmcgSURcbiAgICBjb25zdCBkYXRhU2V0cyA9IHRoaXMuZ2V0RGF0YVNldHNGb3JUZXN0RGF0YVByb2ZpbGUocHJvZmlsZUlkVG9Vc2UpO1xuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBkYXRhU2V0cy5tYXAoZGF0YVNldCA9PiAoe1xuICAgICAgaWQ6IGRhdGFTZXQubmFtZSxcbiAgICAgIHZhbHVlOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBuYW1lOiBkYXRhU2V0Lm5hbWUsXG4gICAgICBsYWJlbDogZGF0YVNldC5uYW1lXG4gICAgfSkpO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGRhdGEgc2V0IHNlbGVjdGlvblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICBpZiAoIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YVNldCA9IHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCB8fCAnJztcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZERhdGFTZXQnLCBuZXcgRm9ybUNvbnRyb2woY3VycmVudERhdGFTZXQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWUgaWYgdmFyaWFibGUgaGFzIGEgc2VsZWN0ZWQgZGF0YSBzZXRcbiAgICAgICAgaWYgKHZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZERhdGFTZXQnKT8uc2V0VmFsdWUodmFyaWFibGUuc2VsZWN0ZWREYXRhU2V0LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IC0gaWYgc28sIGRpc2FibGUgdGhlIGRyb3Bkb3duXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk7XG4gICAgXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RlZERhdGFTZXQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgRGF0YSBTZXQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSBzZWxlY3RlZCBkYXRhIHNldFxuICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQgPSB2YWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFyIHBhcmFtZXRlciBzZWxlY3Rpb24gd2hlbiBkYXRhIHNldCBjaGFuZ2VzXG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gJyc7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sc1xuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3NlbGVjdGVkRGF0YVNldCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyR3JvdXAuZ2V0KCd2YWx1ZScpKSB7XG4gICAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBjYWNoZXMgZm9yIHBhcmFtZXRlciBzZWxlY3QgY29uZmlnIHNpbmNlIGRhdGEgc2V0IGNoYW5nZWRcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMucGFyYW1ldGVyRm9yRGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKGNvbmZpZ1ZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fcGFyYW1Gb3JEYXRhU2V0X2ApKSB7XG4gICAgICAgICAgICBwYXJhbUtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFyYW1LZXlzVG9EZWxldGUuZm9yRWFjaChrZXkgPT4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2tcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZGF0YVNldFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBwYXJhbWV0ZXIgZHJvcGRvd24gKHRoaXJkIGRyb3Bkb3duIGZvciBwYXJhbWV0ZXJzIC0gc2hvd3MgcGFyYW1ldGVycyBmcm9tIHNlbGVjdGVkIGRhdGEgc2V0KVxuICAgKi9cbiAgZ2V0UGFyYW1ldGVyU2VsZWN0Q29uZmlnKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlLCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBHZXQgc2VsZWN0ZWQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgKHByZWZlcnJlZCkgb3IgbmFtZSAoZmFsbGJhY2spIGFuZCBkYXRhIHNldFxuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZUlkID0gdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZDtcbiAgICBjb25zdCBzZWxlY3RlZFByb2ZpbGUgPSB2YXJpYWJsZS5zZWxlY3RlZFRlc3REYXRhUHJvZmlsZTtcbiAgICBjb25zdCBzZWxlY3RlZERhdGFTZXQgPSB2YXJpYWJsZS5zZWxlY3RlZERhdGFTZXQ7XG4gICAgXG4gICAgaWYgKCghc2VsZWN0ZWRQcm9maWxlSWQgJiYgIXNlbGVjdGVkUHJvZmlsZSkgfHwgIXNlbGVjdGVkRGF0YVNldCkge1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGNvbmZpZyBpZiBwcm9maWxlIG9yIGRhdGEgc2V0IGlzIG5vdCBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogKHNlbGVjdGVkUHJvZmlsZUlkIHx8IHNlbGVjdGVkUHJvZmlsZSkgPyAnU2VsZWN0IERhdGEgU2V0IGZpcnN0JyA6ICdTZWxlY3QgVGVzdCBEYXRhIFByb2ZpbGUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcHJvZmlsZSBJRCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvZmlsZSBuYW1lXG4gICAgY29uc3QgcHJvZmlsZUlkZW50aWZpZXIgPSBzZWxlY3RlZFByb2ZpbGVJZCA/IFN0cmluZyhzZWxlY3RlZFByb2ZpbGVJZCkgOiAoc2VsZWN0ZWRQcm9maWxlIHx8ICcnKTtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X3BhcmFtRm9yRGF0YVNldF8ke3Byb2ZpbGVJZGVudGlmaWVyfV8ke3NlbGVjdGVkRGF0YVNldH1gO1xuICAgIGlmICh0aGlzLnBhcmFtZXRlckZvckRhdGFTZXRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuXG4gICAgLy8gR2V0IHBhcmFtZXRlcnMgZm9yIHRoZSBzZWxlY3RlZCBkYXRhIHNldCB1c2luZyBwcm9maWxlIElEIG9yIG5hbWVcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5nZXRQYXJhbWV0ZXJzRm9yRGF0YVNldChwcm9maWxlSWRlbnRpZmllciwgc2VsZWN0ZWREYXRhU2V0KTtcbiAgICBjb25zdCBvcHRpb25zQXJyYXk6IFNlbGVjdE9wdGlvbltdID0gcGFyYW1ldGVycy5tYXAocGFyYW0gPT4gKHtcbiAgICAgIGlkOiBgQHwke3BhcmFtLm5hbWV9fGAsIC8vIFVzZSBwYXJhbS5uYW1lIGFzIGlkIChtYXQtb3B0aW9uIHdpbGwgdXNlIHRoaXMpXG4gICAgICB2YWx1ZTogYEB8JHtwYXJhbS5uYW1lfXxgLCAvLyBGb3JtYXR0ZWQgdmFsdWUgZm9yIGRpc3BsYXlcbiAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICBsYWJlbDogcGFyYW0ubmFtZVxuICAgIH0pKTtcblxuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGFuZCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBjdXJyZW50IHZhbHVlXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWx1ZSwgZW5zdXJlIGZvcm0gY29udHJvbCBtYXRjaGVzIHRoZSBvcHRpb24gaWQgKGZvcm1hdHRlZCB2YWx1ZSlcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlIHx8ICcnO1xuICAgICAgLy8gQ2hlY2sgaWYgdmFsdWUgaXMgYWxyZWFkeSBmb3JtYXR0ZWQgKGUuZy4sIFwiQHxlbWFpbHxcIilcbiAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoJ0B8JykgJiYgY3VycmVudFZhbHVlLmVuZHNXaXRoKCd8JylcbiAgICAgICAgPyBjdXJyZW50VmFsdWVcbiAgICAgICAgOiAoY3VycmVudFZhbHVlID8gYEB8JHtjdXJyZW50VmFsdWV9fGAgOiAnJyk7XG4gICAgICAvLyBTZXQgZm9ybSBjb250cm9sIHRvIGZvcm1hdHRlZCB2YWx1ZSAobWF0Y2hlcyBvcHQuaWQpIHNvIHNlbGVjdCBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICAgIGlmIChmb3JtYXR0ZWRWYWx1ZSAmJiBwYXJhbWV0ZXJzLnNvbWUocCA9PiBgQHwke3AubmFtZX18YCA9PT0gZm9ybWF0dGVkVmFsdWUpKSB7XG4gICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAndmFsdWUnLCAvLyBVc2UgJ3ZhbHVlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCAke3ZhcmlhYmxlLmxhYmVsfWAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiBmYWxzZSwgLy8gQ2xpZW50LXNpZGUgc2VhcmNoIHNpbmNlIHdlIGFscmVhZHkgaGF2ZSBhbGwgcGFyYW1ldGVycyBmcm9tIHRoZSBzZWxlY3RlZCBkYXRhIHNldFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogZmFsc2UsIC8vIE5vIHBhZ2luYXRpb24gZm9yIHBhcmFtZXRlcnMgd2l0aGluIGEgZGF0YSBzZXRcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gVmFsdWUgcmVjZWl2ZWQgaXMgdGhlIGZvcm1hdHRlZCB2YWx1ZSAoZS5nLiwgXCJAfGVtYWlsfFwiKSBiZWNhdXNlIG1hdC1vcHRpb24gdXNlcyBvcHQuaWRcbiAgICAgICAgLy8gRXh0cmFjdCBwYXJhbWV0ZXIgbmFtZSBmcm9tIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlOyAvLyBUaGlzIGlzIGFscmVhZHkgZm9ybWF0dGVkIGFzIEB8cGFyYW1OYW1lfFxuICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSBmb3JtYXR0ZWRWYWx1ZS5zdGFydHNXaXRoKCdAfCcpICYmIGZvcm1hdHRlZFZhbHVlLmVuZHNXaXRoKCd8JylcbiAgICAgICAgICA/IGZvcm1hdHRlZFZhbHVlLnNsaWNlKDIsIC0xKVxuICAgICAgICAgIDogZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgcmF3IHZhbHVlIChzdG9yZSBwYXJhbWV0ZXIgbmFtZSB3aXRob3V0IGZvcm1hdHRpbmcpXG4gICAgICAgIHZhcmlhYmxlLnJhd1ZhbHVlID0gcGFyYW1OYW1lO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHZhcmlhYmxlIHZhbHVlIChzdG9yZSBmb3JtYXR0ZWQgdmFsdWUgZm9yIHRlbXBsYXRlKVxuICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBpbiBGb3JtQXJyYXkgLSB1c2UgZm9ybWF0dGVkIHZhbHVlIChtYXRjaGVzIG9wdC5pZCkgc28gc2VsZWN0IGRpc3BsYXlzIGNvcnJlY3RseVxuICAgICAgICBjb25zdCB2YXJHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgICAgIGlmICh2YXJHcm91cCAmJiB2YXJHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAvLyBTZXQgdG8gZm9ybWF0dGVkIHZhbHVlIHNvIHRoZSBzZWxlY3QgY2FuIG1hdGNoIGFuZCBkaXNwbGF5IHRoZSBzZWxlY3RlZCBvcHRpb25cbiAgICAgICAgICB2YXJHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBlbWl0XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBcbiAgICAgICAgLy8gRW1pdCBmb3JtYXR0ZWQgdmFsdWUgZm9yIHBhcmVudCBjb21wb25lbnQgKHRoaXMgaXMgd2hhdCBnZXRzIHVzZWQgaW4gdGhlIHRlbXBsYXRlKVxuICAgICAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlLm5hbWUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5wYXJhbWV0ZXJGb3JEYXRhU2V0U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVuaXF1ZSBlbnZpcm9ubWVudHMgZnJvbSBlbnZpcm9ubWVudCBvcHRpb25zXG4gICAqL1xuICBnZXRVbmlxdWVFbnZpcm9ubWVudHMoKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBlbnZNYXAgPSBuZXcgTWFwPHN0cmluZywgeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT4oKTtcbiAgICB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5mb3JFYWNoKGVudiA9PiB7XG4gICAgICBpZiAoIWVudk1hcC5oYXMoZW52LmVudmlyb25tZW50KSkge1xuICAgICAgICBlbnZNYXAuc2V0KGVudi5lbnZpcm9ubWVudCwge1xuICAgICAgICAgIGlkOiBlbnYuZW52aXJvbm1lbnQsXG4gICAgICAgICAgbmFtZTogZW52LmVudmlyb25tZW50XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGVudk1hcC52YWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhcmFtZXRlcnMgZm9yIGEgc3BlY2lmaWMgZW52aXJvbm1lbnRcbiAgICovXG4gIGdldFBhcmFtZXRlcnNGb3JFbnZpcm9ubWVudChlbnZpcm9ubWVudE5hbWU6IHN0cmluZyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRPcHRpb25zXG4gICAgICAuZmlsdGVyKGVudiA9PiBlbnYuZW52aXJvbm1lbnQgPT09IGVudmlyb25tZW50TmFtZSlcbiAgICAgIC5tYXAoZW52ID0+ICh7XG4gICAgICAgIGlkOiBlbnYubmFtZSxcbiAgICAgICAgbmFtZTogZW52Lm5hbWVcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgZW52aXJvbm1lbnQgZHJvcGRvd24gKGZpcnN0IGRyb3Bkb3duIC0gc2VsZWN0IGVudmlyb25tZW50KVxuICAgKi9cbiAgZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fZW52aXJvbm1lbnRgO1xuICAgIGlmICh0aGlzLmVudmlyb25tZW50U2VsZWN0Q29uZmlnQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBHZXQgdW5pcXVlIGVudmlyb25tZW50c1xuICAgIGNvbnN0IHVuaXF1ZUVudmlyb25tZW50cyA9IHRoaXMuZ2V0VW5pcXVlRW52aXJvbm1lbnRzKCk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHVuaXF1ZUVudmlyb25tZW50cy5tYXAoZW52ID0+ICh7XG4gICAgICBpZDogZW52LmlkLFxuICAgICAgdmFsdWU6IGVudi5uYW1lLFxuICAgICAgbmFtZTogZW52Lm5hbWUsXG4gICAgICBsYWJlbDogZW52Lm5hbWVcbiAgICB9KSk7XG5cbiAgICAvLyBFbnN1cmUgZm9ybSBjb250cm9sIGV4aXN0cyBmb3IgZW52aXJvbm1lbnQgc2VsZWN0aW9uXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRFbnYgPSB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50IHx8ICcnO1xuICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZEVudmlyb25tZW50JywgbmV3IEZvcm1Db250cm9sKGN1cnJlbnRFbnYpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkRW52aXJvbm1lbnQnLCAvLyBVc2UgJ3NlbGVjdGVkRW52aXJvbm1lbnQnIGFzIGtleVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgRW52aXJvbm1lbnRgLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZlclNlYXJjaDogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNBcnJheSxcbiAgICAgIGhhc01vcmU6IHRoaXMuaGFzTW9yZUVudmlyb25tZW50cyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdFbnZpcm9ubWVudHMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgZW52aXJvbm1lbnQgbmFtZSBvbiB0aGUgdmFyaWFibGUgb2JqZWN0XG4gICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQgPSB2YWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEV4dHJhY3QgYW5kIHN0b3JlIGVudmlyb25tZW50IElEIGZyb20gZW52aXJvbm1lbnRPcHRpb25zXG4gICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGVudmlyb25tZW50IG9wdGlvbiB3aXRoIG1hdGNoaW5nIGVudmlyb25tZW50IG5hbWUgdG8gZ2V0IHRoZSBJRFxuICAgICAgICBjb25zdCBlbnZPcHRpb24gPSB0aGlzLmVudmlyb25tZW50T3B0aW9ucy5maW5kKGVudiA9PiBlbnYuZW52aXJvbm1lbnQgPT09IHZhbHVlKTtcbiAgICAgICAgaWYgKGVudk9wdGlvbikge1xuICAgICAgICAgIC8vIEV4dHJhY3QgbnVtZXJpYyBJRCBmcm9tIGVudk9wdGlvbi5pZCAoZm9ybWF0OiBcImVudi03NC10ZXN0XCIgLT4gNzQpXG4gICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGVudk9wdGlvbi5pZC5tYXRjaCgvZW52LShcXGQrKS0vKTtcbiAgICAgICAgICBpZiAoaWRNYXRjaCAmJiBpZE1hdGNoWzFdKSB7XG4gICAgICAgICAgICB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50SWQgPSBwYXJzZUludChpZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciB0aGUgcGFyYW1ldGVyIHNlbGVjdGlvbiB3aGVuIGVudmlyb25tZW50IGNoYW5nZXNcbiAgICAgICAgdmFyaWFibGUucmF3VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGNhY2hlIHRvIGZvcmNlIHJlZnJlc2hcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWApO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbFxuICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRFbnZpcm9ubWVudCBjb250cm9sXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50JykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZEVudmlyb25tZW50Jyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQcmUtY29tcHV0ZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgbmV3IGVudmlyb25tZW50XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kSW5kZXgodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5nZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayB0byB1cGRhdGUgVUlcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRW52aXJvbm1lbnRzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hFbnZpcm9ubWVudHMuZW1pdChxdWVyeSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZW52aXJvbm1lbnRTZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0IGNvbmZpZyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChzZWNvbmQgZHJvcGRvd24gLSBzZWxlY3QgcGFyYW1ldGVyIGZyb20gZW52aXJvbm1lbnQpXG4gICAqL1xuICBnZXRFbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9lbnZQYXJhbWA7XG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudFBhcmFtZXRlclNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIC8vIEdldCBzZWxlY3RlZCBlbnZpcm9ubWVudFxuICAgIGNvbnN0IHNlbGVjdGVkRW52aXJvbm1lbnQgPSB2YXJpYWJsZS5zZWxlY3RlZEVudmlyb25tZW50O1xuICAgIGlmICghc2VsZWN0ZWRFbnZpcm9ubWVudCkge1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGNvbmZpZyBpZiBubyBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBFbnZpcm9ubWVudCBmaXJzdCcsXG4gICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICAgIG9wdGlvbnM6IFtdXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEdldCBwYXJhbWV0ZXJzIGZvciB0aGUgc2VsZWN0ZWQgZW52aXJvbm1lbnRcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5nZXRQYXJhbWV0ZXJzRm9yRW52aXJvbm1lbnQoc2VsZWN0ZWRFbnZpcm9ubWVudCk7XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IHBhcmFtZXRlcnMubWFwKHBhcmFtID0+ICh7XG4gICAgICBpZDogYCp8JHtwYXJhbS5uYW1lfXxgLFxuICAgICAgdmFsdWU6IGAqfCR7cGFyYW0ubmFtZX18YCxcbiAgICAgIG5hbWU6IHBhcmFtLm5hbWUsXG4gICAgICBsYWJlbDogcGFyYW0ubmFtZVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAga2V5OiAndmFsdWUnLCAvLyBVc2UgJ3ZhbHVlJyBhcyBrZXkgc2luY2Ugd2UncmUgYWNjZXNzaW5nIGZyb20gRm9ybUFycmF5XG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCBQYXJhbWV0ZXJgLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gV2hlbiBwYXJhbWV0ZXIgaXMgc2VsZWN0ZWQsIHVwZGF0ZSByYXcgdmFsdWUgYW5kIGZvcm1hdCBpdFxuICAgICAgICB2YXJpYWJsZS5yYXdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgdmFyaWFibGUgdmFsdWUgKHN0b3JlIGZvcm1hdHRlZCB2YWx1ZSlcbiAgICAgICAgdmFyaWFibGUudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVudmlyb25tZW50IElEIGlzIGFscmVhZHkgc3RvcmVkIG9uIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZFxuICAgICAgICAvLyAoaXQgd2FzIHNldCB3aGVuIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZClcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5IC0ga2VlcCByYXcgdmFsdWUgc28gc2VsZWN0IGRpc3BsYXlzIGNvcnJlY3RseVxuICAgICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAvLyBTZXQgdG8gcmF3IHZhbHVlIHNvIHRoZSBzZWxlY3QgY2FuIG1hdGNoIGFuZCBkaXNwbGF5IHRoZSBzZWxlY3RlZCBvcHRpb25cbiAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIC8vIEVtaXQgZm9ybWF0dGVkIHZhbHVlIGZvciBwYXJlbnQgY29tcG9uZW50XG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IGZvcm1hdHRlZFZhbHVlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmVudmlyb25tZW50UGFyYW1ldGVyU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIGVudmlyb25tZW50IGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBnZXRTZWxlY3RlZEVudmlyb25tZW50KHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnZpcm9ubWVudCBpcyBzZWxlY3RlZCBmb3IgYSB2YXJpYWJsZVxuICAgKi9cbiAgaGFzU2VsZWN0ZWRFbnZpcm9ubWVudCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIGVudmlyb25tZW50IElEIGZvciBhIHZhcmlhYmxlXG4gICAqL1xuICBnZXRTZWxlY3RlZEVudmlyb25tZW50SWQodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdmFyaWFibGUuc2VsZWN0ZWRFbnZpcm9ubWVudElkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbnZpcm9ubWVudCBJRHMgZm9yIHZhcmlhYmxlcyB0aGF0IHVzZSBlbnZpcm9ubWVudCB0eXBlXG4gICAqIFJldHVybnMgYSBtYXAgb2YgdmFyaWFibGUgbmFtZSB0byBlbnZpcm9ubWVudCBJRFxuICAgKi9cbiAgZ2V0RW52aXJvbm1lbnRJZHNGb3JWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gICAgY29uc3QgZW52SWRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGUpICYmIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCkge1xuICAgICAgICBlbnZJZHMuc2V0KHZhcmlhYmxlLm5hbWUsIHZhcmlhYmxlLnNlbGVjdGVkRW52aXJvbm1lbnRJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGVudklkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBwbGFpbi10ZXh0XG4gICAqL1xuICBpc1BsYWluVGV4dFR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdwbGFpbi10ZXh0JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBwYXJhbWV0ZXJcbiAgICovXG4gIGlzUGFyYW1ldGVyVHlwZSh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhdGFUeXBlID0gdmFyaWFibGUuZGF0YVR5cGUgfHwgJ3BsYWluLXRleHQnO1xuICAgIHJldHVybiBkYXRhVHlwZSA9PT0gJ3BhcmFtZXRlcic7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGVzdCBkYXRhIHByb2ZpbGUgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkVGVzdERhdGFQcm9maWxlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZGF0YSBzZXQgaXMgc2VsZWN0ZWQgZm9yIGEgdmFyaWFibGVcbiAgICovXG4gIGhhc1NlbGVjdGVkRGF0YVNldCh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXZhcmlhYmxlLnNlbGVjdGVkRGF0YVNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBkZWZhdWx0IHRlc3QgZGF0YSBwcm9maWxlIGFuZCBkYXRhIHNldCBhcmUgc2V0IChmcm9tIHRlc3QgY2FzZSlcbiAgICogSWYgdHJ1ZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgKi9cbiAgaGFzRGVmYXVsdFRlc3REYXRhU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmIHRoaXMuZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleCAhPSBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBlbnZpcm9ubWVudFxuICAgKi9cbiAgaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlLmRhdGFUeXBlIHx8ICdwbGFpbi10ZXh0JztcbiAgICByZXR1cm4gZGF0YVR5cGUgPT09ICdlbnZpcm9ubWVudCc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdmFyaWFibGUgaXMgZWxlbWVudCB0eXBlIChkYXRhS2V5ID09PSAnZWxlbWVudCcpXG4gICAqL1xuICBpc0VsZW1lbnRUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzY3JlZW4gbmFtZSBpcyBzZWxlY3RlZCBmb3IgYW4gZWxlbWVudCB2YXJpYWJsZVxuICAgKiBSZXR1cm5zIHRydWUgaWYgZWl0aGVyIHNlbGVjdGVkU2NyZWVuTmFtZSBvciBzY3JlZW5OYW1lSWQgaXMgc2V0IChhbmQgbm90IFwiTm9uZVwiKVxuICAgKi9cbiAgaGFzU2VsZWN0ZWRTY3JlZW5OYW1lKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgc2NyZWVuTmFtZUlkIGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBudW1iZXIgKG5vdCBudWxsL3VuZGVmaW5lZClcbiAgICBpZiAodmFyaWFibGUuc2NyZWVuTmFtZUlkICE9IG51bGwgJiYgdHlwZW9mIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhcmlhYmxlLnNjcmVlbk5hbWVJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogY2hlY2sgc2VsZWN0ZWRTY3JlZW5OYW1lXG4gICAgcmV0dXJuICEhdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3QgY29uZmlnIGZvciBzY3JlZW4gbmFtZSBkcm9wZG93biAoZmlyc3QgZHJvcGRvd24gZm9yIGVsZW1lbnQgdmFyaWFibGVzKVxuICAgKi9cbiAgZ2V0U2NyZWVuTmFtZVNlbGVjdENvbmZpZyh2YXJpYWJsZTogVGVtcGxhdGVWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gSW5jbHVkZSBsb2FkaW5nIHN0YXRlIGluIGNhY2hlIGtleSB0byBpbnZhbGlkYXRlIHdoZW4gbG9hZGluZyBjb21wbGV0ZXNcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3ZhcmlhYmxlLm5hbWV9X3NjcmVlbk5hbWVfJHt0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmxlbmd0aH1fJHt0aGlzLmlzTG9hZGluZ1NjcmVlbk5hbWVzfWA7XG4gICAgaWYgKHRoaXMuc2NyZWVuTmFtZVNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjcmVlbk5hbWVTZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBvcHRpb25zOiBpbmNsdWRlIGEgXCJOb25lXCIgb3B0aW9uIChkaXNwbGF5ZWQgYXMgXCJTZWxlY3RcIikgcGx1cyBzY3JlZW5OYW1lT3B0aW9ucyBmcm9tIEFQSVxuICAgIGNvbnN0IG9wdGlvbnNBcnJheTogU2VsZWN0T3B0aW9uW10gPSBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnbm9uZScsXG4gICAgICAgIHZhbHVlOiAnU2VsZWN0JyxcbiAgICAgICAgbmFtZTogJ05vbmUnLFxuICAgICAgICBsYWJlbDogJ05vbmUnXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5tYXAoc2NyZWVuTmFtZSA9PiAoe1xuICAgICAgICBpZDogc2NyZWVuTmFtZS5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IHNjcmVlbk5hbWUubmFtZSxcbiAgICAgICAgbmFtZTogc2NyZWVuTmFtZS5uYW1lLFxuICAgICAgICBsYWJlbDogc2NyZWVuTmFtZS5uYW1lXG4gICAgICB9KSlcbiAgICBdO1xuICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgZXhpc3RzIGZvciBzY3JlZW4gbmFtZSBzZWxlY3Rpb25cbiAgICAvLyBUaGUgZm9ybSBjb250cm9sIHZhbHVlIHNob3VsZCBtYXRjaCB0aGUgb3B0aW9uIGlkIChzdHJpbmcgZm9yIFwibm9uZVwiLCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVyIGZvciByZWFsIHNjcmVlbiBuYW1lcylcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZS5uYW1lKTtcbiAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgaWYgKCF2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJykpIHtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHNjcmVlbk5hbWVJZCBhcyBzdHJpbmcgKHRvIG1hdGNoIG9wdGlvbiBpZCBmb3JtYXQpLCBvciAnbm9uZScgYnkgZGVmYXVsdFxuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPyBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKSA6ICdub25lJztcbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdzZWxlY3RlZFNjcmVlbk5hbWUnLCBuZXcgRm9ybUNvbnRyb2woaW5pdGlhbFZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHZhbHVlIGlmIHZhcmlhYmxlIGhhcyBzY3JlZW5OYW1lSWQgYnV0IGZvcm0gY29udHJvbCBkb2Vzbid0IG1hdGNoXG4gICAgICAgIGlmICh2YXJpYWJsZS5zY3JlZW5OYW1lSWQpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWUgPSBTdHJpbmcodmFyaWFibGUuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAvLyBDb21wYXJlIGFzIHN0cmluZ3MgdG8gaGFuZGxlIGJvdGggbnVtYmVyIGFuZCBzdHJpbmcgdmFsdWVzXG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlU3RyID0gY3VycmVudFZhbHVlICE9IG51bGwgPyBTdHJpbmcoY3VycmVudFZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZVN0ciAhPT0gZXhwZWN0ZWRWYWx1ZSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZShleHBlY3RlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vIHNjcmVlbk5hbWVJZCwgZW5zdXJlIGZvcm0gY29udHJvbCBpcyAnbm9uZScgKGZvciBcIk5vbmVcIiBzZWxlY3Rpb24gYnkgZGVmYXVsdClcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09ICdub25lJyAmJiBjdXJyZW50VmFsdWUgIT09IG51bGwgJiYgY3VycmVudFZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpPy5zZXRWYWx1ZSgnbm9uZScsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ3NlbGVjdGVkU2NyZWVuTmFtZScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBTY3JlZW4gTmFtZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgb3B0aW9uczogb3B0aW9uc0FycmF5LFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlU2NyZWVuTmFtZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nU2NyZWVuTmFtZXMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gSWYgXCJOb25lXCIgaXMgc2VsZWN0ZWQgKHZhbHVlIGlzICdub25lJyBzdHJpbmcgb3IgbnVsbCksIGNsZWFyIHNjcmVlbiBuYW1lIGFuZCBlbGVtZW50IGluZm9cbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICdub25lJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9ICcnO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgZWxlbWVudCBjb25maWcgY2FjaGUgZm9yIHRoaXMgdmFyaWFibGVcbiAgICAgICAgICBjb25zdCBrZXlzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYCR7dmFyaWFibGUubmFtZX1fZWxlbWVudGApKSB7XG4gICAgICAgICAgICAgIGtleXNUb0RlbGV0ZS5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAga2V5c1RvRGVsZXRlLmZvckVhY2goa2V5ID0+IHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmRlbGV0ZShrZXkpKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xzIC0gY2xlYXIgYWxsIGVsZW1lbnQtcmVsYXRlZCBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgLy8gU2V0IHNlbGVjdGVkU2NyZWVuTmFtZSB0byAnbm9uZScgdG8gc2hvdyBcIk5vbmVcIiBpcyBzZWxlY3RlZFxuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwKSB7XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKT8uc2V0VmFsdWUoJ25vbmUnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDbGVhciBlbGVtZW50IElEIGZvcm0gY29udHJvbCB0byBlbnN1cmUgZWxlbWVudElkIGlzIGNsZWFyZWRcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKT8uc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hcmsgZm9yIGNoZWNrIGFuZCBzdG9wIChubyBlbGVtZW50IGZldGNoIHdoZW4gTm9uZSlcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWx1ZSBpcyB0aGUgb3B0aW9uIGlkIChzdHJpbmcgZm9yIFwibm9uZVwiLCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVyIGZvciByZWFsIHNjcmVlbiBuYW1lcylcbiAgICAgICAgLy8gQ29udmVydCB0byBudW1iZXIgZm9yIHNjcmVlbk5hbWVJZCBpZiBpdCdzIGEgdmFsaWQgbnVtYmVyXG4gICAgICAgIGNvbnN0IHNjcmVlbk5hbWVJZE51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICdub25lJyA/IHBhcnNlSW50KHZhbHVlLCAxMCkgOiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogbnVsbCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2NyZWVuTmFtZUlkTnVtICYmICFpc05hTihzY3JlZW5OYW1lSWROdW0pKSB7XG4gICAgICAgICAgLy8gU3RvcmUgc2VsZWN0ZWQgc2NyZWVuIG5hbWUgb24gdGhlIHZhcmlhYmxlIG9iamVjdFxuICAgICAgICAgIHZhcmlhYmxlLnNjcmVlbk5hbWVJZCA9IHNjcmVlbk5hbWVJZE51bTtcblxuICAgICAgICAgIC8vIEZpbmQgYW5kIHN0b3JlIHNjcmVlbiBuYW1lIG5hbWUgZnJvbSBzY3JlZW5OYW1lT3B0aW9uc1xuICAgICAgICAgIGNvbnN0IHNjcmVlbk5hbWVPcHRpb24gPSB0aGlzLnNjcmVlbk5hbWVPcHRpb25zLmZpbmQoc24gPT4gc24uaWQgPT09IHNjcmVlbk5hbWVJZE51bSk7XG4gICAgICAgICAgaWYgKHNjcmVlbk5hbWVPcHRpb24pIHtcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHNjcmVlbk5hbWVPcHRpb24ubmFtZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGlmIG5vdCBmb3VuZCwgc3RpbGwgc2V0IHRoZSBJRCBidXQgY2xlYXIgdGhlIG5hbWVcbiAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDbGVhciB0aGUgZWxlbWVudCBzZWxlY3Rpb24gd2hlbiBzY3JlZW4gbmFtZSBjaGFuZ2VzXG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnROYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG5cbiAgICAgICAgICAvLyBDbGVhciBlbGVtZW50IGNvbmZpZyBjYWNoZSB0byBmb3JjZSByZWZyZXNoXG4gICAgICAgICAgLy8gQ2xlYXIgYWxsIGVsZW1lbnQgY29uZmlncyBmb3IgdGhpcyB2YXJpYWJsZSBzaW5jZSBzY3JlZW4gbmFtZSBjaGFuZ2VkXG4gICAgICAgICAgY29uc3Qga2V5c1RvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLmZvckVhY2goKF8sIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGAke3ZhcmlhYmxlLm5hbWV9X2VsZW1lbnRgKSkge1xuICAgICAgICAgICAgICBrZXlzVG9EZWxldGUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGtleXNUb0RlbGV0ZS5mb3JFYWNoKGtleSA9PiB0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5kZWxldGUoa2V5KSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sXG4gICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXApIHtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVuc3VyZSBmb3JtIGNvbnRyb2wgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIChhcyBzdHJpbmcgdG8gbWF0Y2ggb3B0aW9uIGlkKVxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlR3JvdXAuZ2V0KCdzZWxlY3RlZFNjcmVlbk5hbWUnKSkge1xuICAgICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKFN0cmluZyhzY3JlZW5OYW1lSWROdW0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1pdCBldmVudCB0byBmZXRjaCBlbGVtZW50cyBmaWx0ZXJlZCBieSBzZWxlY3RlZCBzY3JlZW4gbmFtZVxuICAgICAgICAgIHRoaXMuc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUuZW1pdCh7XG4gICAgICAgICAgICBzY3JlZW5OYW1lSWQ6IHZhcmlhYmxlLnNjcmVlbk5hbWVJZCxcbiAgICAgICAgICAgIHNlYXJjaFRlcm06ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSW52YWxpZCB2YWx1ZSAtIGNsZWFyIGV2ZXJ5dGhpbmdcbiAgICAgICAgICB2YXJpYWJsZS5zY3JlZW5OYW1lSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdmFyaWFibGUuc2VsZWN0ZWRTY3JlZW5OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIGZvciBjaGVjayB0byB1cGRhdGUgVUkgZmlyc3RcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgLy8gVGhlIGVsZW1lbnQgY29uZmlnIHdpbGwgYmUgcmVjb21wdXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gZWxlbWVudE9wdGlvbnMgaW5wdXQgY2hhbmdlc1xuICAgICAgICAvLyB2aWEgbmdPbkNoYW5nZXMsIHdoaWNoIHdpbGwgY2xlYXIgdGhlIGNhY2hlIGFuZCB0cmlnZ2VyIHJlLWNvbXB1dGF0aW9uXG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRNb3JlU2NyZWVuTmFtZXMuZW1pdCgnJyk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoU2NyZWVuTmFtZS5lbWl0KHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5zY3JlZW5OYW1lU2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdCBjb25maWcgZm9yIGVsZW1lbnQgZHJvcGRvd24gKHNlY29uZCBkcm9wZG93biAtIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lKVxuICAgKiBPcHRpbWl6ZWQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGZyb20gY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsbHMgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb25cbiAgICovXG4gIGdldEVsZW1lbnRTZWxlY3RDb25maWcodmFyaWFibGU6IFRlbXBsYXRlVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIC8vIEdldCBzZWxlY3RlZCBzY3JlZW4gbmFtZSBJRFxuICAgIGNvbnN0IHNlbGVjdGVkU2NyZWVuTmFtZUlkID0gdmFyaWFibGUuc2NyZWVuTmFtZUlkO1xuICAgIC8vIEluY2x1ZGUgZWxlbWVudE9wdGlvbnMgbGVuZ3RoIGFuZCBsb2FkaW5nIHN0YXRlIGluIGNhY2hlIGtleSB0byBpbnZhbGlkYXRlIHdoZW4gZWxlbWVudHMgY2hhbmdlXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV9lbGVtZW50XyR7c2VsZWN0ZWRTY3JlZW5OYW1lSWQgfHwgJyd9XyR7dGhpcy5lbGVtZW50T3B0aW9ucy5sZW5ndGh9XyR7dGhpcy5pc0xvYWRpbmdFbGVtZW50c31gO1xuICAgIFxuICAgIC8vIEVhcmx5IHJldHVybiBmcm9tIGNhY2hlIC0gdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gcGF0aCBhbmQgc2hvdWxkIGJlIHZlcnkgZmFzdFxuICAgIGlmICh0aGlzLmVsZW1lbnRTZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuZ2V0KGNhY2hlS2V5KSE7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG5vIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkLCByZXR1cm4gZW1wdHkgY29uZmlnIGFuZCBjYWNoZSBpdFxuICAgIGlmICghc2VsZWN0ZWRTY3JlZW5OYW1lSWQpIHtcbiAgICAgIGNvbnN0IGVtcHR5Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgU2NyZWVuIE5hbWUgZmlyc3QnLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXVxuICAgICAgfTtcbiAgICAgIHRoaXMuZWxlbWVudFNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgZW1wdHlDb25maWcpO1xuICAgICAgcmV0dXJuIGVtcHR5Q29uZmlnO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBlbGVtZW50cyBhcmUgc3RpbGwgbG9hZGluZywgcmV0dXJuIGEgbG9hZGluZyBjb25maWcgYW5kIGNhY2hlIGl0XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IGxvYWRpbmdDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgICBwbGFjZWhvbGRlcjogJ0xvYWRpbmcgZWxlbWVudHMuLi4nLFxuICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgaXNMb2FkaW5nOiB0cnVlXG4gICAgICB9O1xuICAgICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBsb2FkaW5nQ29uZmlnKTtcbiAgICAgIHJldHVybiBsb2FkaW5nQ29uZmlnO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaWx0ZXIgZWxlbWVudHMgYnkgc2VsZWN0ZWQgc2NyZWVuIG5hbWVcbiAgICAvLyBDb21wYXJlIGJvdGggYXMgbnVtYmVycyB0byBlbnN1cmUgdHlwZSBtYXRjaGluZ1xuICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSB0aGlzLmVsZW1lbnRPcHRpb25zLmZpbHRlcihlbCA9PiB7XG4gICAgICBjb25zdCBlbFNjcmVlbk5hbWVJZCA9IGVsLnNjcmVlbk5hbWVJZDtcbiAgICAgIC8vIEhhbmRsZSBib3RoIG51bWJlciBhbmQgc3RyaW5nIGNvbXBhcmlzb25zXG4gICAgICByZXR1cm4gZWxTY3JlZW5OYW1lSWQgIT0gbnVsbCAmJiBOdW1iZXIoZWxTY3JlZW5OYW1lSWQpID09PSBOdW1iZXIoc2VsZWN0ZWRTY3JlZW5OYW1lSWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCB0byBTZWxlY3RPcHRpb24gZm9ybWF0XG4gICAgY29uc3Qgb3B0aW9uc0FycmF5OiBTZWxlY3RPcHRpb25bXSA9IGZpbHRlcmVkRWxlbWVudHMubWFwKGVsID0+IHtcbiAgICAgIGNvbnN0IGxvY2F0b3JWYWx1ZSA9IGVsLmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBlbC5pZCxcbiAgICAgICAgZWxlbWVudElkOiBlbC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IGVsLm5hbWUsXG4gICAgICAgIGxvY2F0b3JWYWx1ZTogbG9jYXRvclZhbHVlLFxuICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICBsYWJlbDogZWwubmFtZSxcbiAgICAgICAgc2NyZWVuTmFtZUlkOiBlbC5zY3JlZW5OYW1lSWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIHNjcmVlbk5hbWVPYmo6IGVsLnNjcmVlbk5hbWVPYmosXG4gICAgICAgIG90aGVyTG9jYXRvcjogZWwub3RoZXJMb2NhdG9yXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGZvcm0gY29udHJvbCBleGlzdHMgZm9yIGVsZW1lbnQgSUQgc2VsZWN0aW9uXG4gICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlR3JvdXAgJiYgIXZhcmlhYmxlR3JvdXAuZ2V0KCdpZCcpKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIGVsZW1lbnQgdmFsdWUsIHRyeSB0byBmaW5kIHRoZSBlbGVtZW50IGFuZCBzZXQgdGhlIElEXG4gICAgICBsZXQgaW5pdGlhbEVsZW1lbnRJZDogYW55ID0gbnVsbDtcbiAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50SWQpIHtcbiAgICAgICAgaW5pdGlhbEVsZW1lbnRJZCA9IHZhcmlhYmxlLmVsZW1lbnRJZDtcbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUudmFsdWUpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgZWxlbWVudCBieSBsb2NhdG9yVmFsdWUgb3IgbmFtZVxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IFxuICAgICAgICAgIGVsLmxvY2F0b3JWYWx1ZSA9PT0gdmFyaWFibGUudmFsdWUgfHwgZWwubmFtZSA9PT0gdmFyaWFibGUudmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICBpbml0aWFsRWxlbWVudElkID0gZWxlbWVudC5pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdpZCcsIG5ldyBGb3JtQ29udHJvbChpbml0aWFsRWxlbWVudElkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6ICdpZCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBFbGVtZW50JyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zQXJyYXksXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVFbGVtZW50cyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdFbGVtZW50cyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCBlbGVtZW50IGZyb20gZWxlbWVudE9wdGlvbnNcbiAgICAgICAgLy8gdmFsdWUgaXMgdGhlIGVsZW1lbnQgSUQgKHNpbmNlIGNvbmZpZyBrZXkgaXMgJ2lkJylcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5lbGVtZW50T3B0aW9ucy5maW5kKGVsID0+IGVsLmlkID09PSB2YWx1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTdG9yZSBlbGVtZW50IGRldGFpbHMgb24gdGhlIHZhcmlhYmxlXG4gICAgICAgICAgdmFyaWFibGUuZWxlbWVudElkID0gc2VsZWN0ZWRFbGVtZW50LmlkO1xuICAgICAgICAgIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yID0gc2VsZWN0ZWRFbGVtZW50LmxvY2F0b3JWYWx1ZSB8fCAnJztcbiAgICAgICAgICB2YXJpYWJsZS5lbGVtZW50TmFtZSA9IHNlbGVjdGVkRWxlbWVudC5uYW1lIHx8ICcnO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVwZGF0ZSBzY3JlZW4gbmFtZSBmcm9tIHRoZSBzZWxlY3RlZCBlbGVtZW50XG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBzY3JlZW4gbmFtZSBkcm9wZG93biBzaG93cyB0aGUgY29ycmVjdCBzZWxlY3Rpb25cbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZCkge1xuICAgICAgICAgICAgdmFyaWFibGUuc2NyZWVuTmFtZUlkID0gc2VsZWN0ZWRFbGVtZW50LnNjcmVlbk5hbWVJZDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRmluZCBhbmQgc3RvcmUgc2NyZWVuIG5hbWUgbmFtZSBmcm9tIHNjcmVlbk5hbWVPcHRpb25zXG4gICAgICAgICAgICBjb25zdCBzY3JlZW5OYW1lT3B0aW9uID0gdGhpcy5zY3JlZW5OYW1lT3B0aW9ucy5maW5kKHNuID0+IHNuLmlkID09PSBzZWxlY3RlZEVsZW1lbnQuc2NyZWVuTmFtZUlkKTtcbiAgICAgICAgICAgIGlmIChzY3JlZW5OYW1lT3B0aW9uKSB7XG4gICAgICAgICAgICAgIHZhcmlhYmxlLnNlbGVjdGVkU2NyZWVuTmFtZSA9IHNjcmVlbk5hbWVPcHRpb24ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRmluZCBhbmQgcGF0Y2ggdGhlIHNlbGVjdG9yIHZhcmlhYmxlIHdpdGggZGF0YUtleSAnbm90X2ZvdW5kJ1xuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yVmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQoXG4gICAgICAgICAgICB2ID0+IHYubmFtZSA9PT0gJ3NlbGVjdG9yJyAmJiB2LmRhdGFLZXkgPT09ICdub3RfZm91bmQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoc2VsZWN0b3JWYXJpYWJsZSAmJiBzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGZvcm0gZ3JvdXAgZm9yIHRoZSBzZWxlY3RvciB2YXJpYWJsZVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3JWYXJpYWJsZUdyb3VwID0gdGhpcy5nZXRWYXJpYWJsZUZvcm1Hcm91cChzZWxlY3RvclZhcmlhYmxlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdG9yVmFyaWFibGVHcm91cCkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdG9yIHZhcmlhYmxlJ3MgdmFsdWUgd2l0aCB0aGUgZWxlbWVudCBsb2NhdG9yXG4gICAgICAgICAgICAgIHNlbGVjdG9yVmFyaWFibGUudmFsdWUgPSBzZWxlY3RlZEVsZW1lbnQubG9jYXRvclZhbHVlO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gUGF0Y2ggdGhlIGZvcm0gY29udHJvbCB2YWx1ZVxuICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JWYXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yVmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHNlbGVjdGVkRWxlbWVudC5sb2NhdG9yVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjazogaWYgZWxlbWVudCBub3QgZm91bmQsIGp1c3Qgc2V0IHRoZSB2YWx1ZVxuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaW4gRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlLm5hbWUpO1xuICAgICAgICBpZiAodmFyaWFibGVHcm91cCkge1xuICAgICAgICAgIGlmICh2YXJpYWJsZUdyb3VwLmdldCgndmFsdWUnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhcmlhYmxlLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNldCBlbGVtZW50IElEIGZvcm0gY29udHJvbCBmb3IgdGhlIGRyb3Bkb3duIChrZXkgaXMgJ2lkJyBpbiBjb25maWcpXG4gICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCAmJiB2YXJpYWJsZUdyb3VwLmdldCgnaWQnKSkge1xuICAgICAgICAgICAgdmFyaWFibGVHcm91cC5nZXQoJ2lkJyk/LnNldFZhbHVlKHNlbGVjdGVkRWxlbWVudC5pZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc2NyZWVuIG5hbWUgZm9ybSBjb250cm9sIGlmIGVsZW1lbnQgaGFzIGEgc2NyZWVuIG5hbWVcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50ICYmIHNlbGVjdGVkRWxlbWVudC5zY3JlZW5OYW1lSWQgJiYgdmFyaWFibGVHcm91cC5nZXQoJ3NlbGVjdGVkU2NyZWVuTmFtZScpKSB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIHNjcmVlbiBuYW1lIElEIGFzIHN0cmluZyB0byBtYXRjaCBvcHRpb24gaWQgZm9ybWF0XG4gICAgICAgICAgICB2YXJpYWJsZUdyb3VwLmdldCgnc2VsZWN0ZWRTY3JlZW5OYW1lJyk/LnNldFZhbHVlKFN0cmluZyhzZWxlY3RlZEVsZW1lbnQuc2NyZWVuTmFtZUlkKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgYW5kIGVtaXRcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMudmFyaWFibGVWYWx1ZUNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGUubmFtZSwgdmFsdWU6IHZhcmlhYmxlLnZhbHVlIH0pO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZE1vcmU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZUVsZW1lbnRzLmVtaXQoKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hFbGVtZW50cy5lbWl0KHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FjaGUgdGhlIGNvbmZpZyBiZWZvcmUgcmV0dXJuaW5nXG4gICAgdGhpcy5lbGVtZW50U2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IGRhdGEgdHlwZSBpcyBydW50aW1lXG4gICAqL1xuICBpc1J1bnRpbWVUeXBlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSB2YXJpYWJsZS5kYXRhVHlwZSB8fCAncGxhaW4tdGV4dCc7XG4gICAgcmV0dXJuIGRhdGFUeXBlID09PSAncnVudGltZSc7XG4gIH1cbn1cblxuIiwiPHN0eWxlPlxuICAuY2FwaXRhbGl6ZS1maXJzdDo6Zmlyc3QtbGV0dGVyIHtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICB9XG48L3N0eWxlPlxuPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAteC02IGNxYS1nYXAteS00IGNxYS1mbGV4LXdyYXAgdGVtcGxhdGUtdmFyaWFibGVzLWZvcm1cIiBbbmdDbGFzc109XCJ7J2NxYS1mbGV4LWNvbCc6IGlzRWRpdEluRGVwdGh9XCIgKm5nSWY9XCIhY3JlYXRlRWxlbWVudFZpc2libGVcIj5cbiAgXG4gIDwhLS0gTWV0YWRhdGEgLSBPbmx5IHNob3cgaWYgZWxlbWVudCBpcyBhdmFpbGFibGUgaW4gZm9ybSAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICBNZXRhZGF0YVxuICAgIDwvbGFiZWw+XG4gICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJtZXRhZGF0YVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwibWV0YWRhdGFDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICA8L2Rpdj5cblxuICA8IS0tIERlc2NyaXB0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgIERlc2NyaXB0aW9uXG4gICAgPC9sYWJlbD5cbiAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cImRlc2NyaXB0aW9uXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJkZXNjcmlwdGlvbkNoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gIDwvZGl2PlxuICBcbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWFibGUgb2YgdGVtcGxhdGVWYXJpYWJsZXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlWYXJpYWJsZVwiPlxuICAgIDwhLS0gQm9vbGVhbiB2YXJpYWJsZXMgd2l0aCBtYXQtc2xpZGUtdG9nZ2xlIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgW2NoZWNrZWRdPVwidmFyaWFibGVzRm9ybS5hdChpKT8uZ2V0KCd2YWx1ZScpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQuY2hlY2tlZClcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Ryb3Bkb3duJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gTm9uLWJvb2xlYW4sIG5vbi1jdXN0b21fY29kZSB2YXJpYWJsZXMgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhcmlhYmxlLm5hbWUgIT09ICdjdXN0b21fY29kZScgJiYgdmFyaWFibGUudHlwZSAhPT0gJ2Jvb2xlYW4nICYmIHZhcmlhYmxlLnR5cGUgIT09ICdkcm9wZG93bidcIj5cbiAgICAgIDwhLS0gRWxlbWVudCB2YXJpYWJsZXMgd2l0aCBjYXNjYWRpbmcgZHJvcGRvd25zIChzY3JlZW4gbmFtZSArIGVsZW1lbnQpIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRWxlbWVudFR5cGUodmFyaWFibGUpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fSBTY3JlZW4gTmFtZVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFNjcmVlbk5hbWVTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWRTY3JlZW5OYW1lKHZhcmlhYmxlKTsgZWxzZSBlbGVtZW50TWFudWFsSW5wdXRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RWxlbWVudFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxlbWVudE1hbnVhbElucHV0PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cInZhcmlhYmxlLnZhbHVlXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFbGVtZW50VHlwZSh2YXJpYWJsZSlcIj5cbiAgICAgIDwhLS0gT3RoZXIgZHJvcGRvd24gdmFyaWFibGVzICh0eXBlLCBzY3JvbGxUbywgbGFiZWwpIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3VsZFNob3dEcm9wZG93bih2YXJpYWJsZSk7IGVsc2UgZGVmYXVsdElucHV0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJnZXRGb3JtR3JvdXBBdChpKSFcIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0PlxuICAgICAgICA8IS0tIFRlc3QtZGF0YSwgc291cmNlLXZhbHVlLCBvciB0YXJnZXQtdmFsdWUgd2l0aCBkYXRhIHR5cGUgZHJvcGRvd24gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJuZWVkc0RhdGFUeXBlRHJvcGRvd24odmFyaWFibGUpOyBlbHNlIHJlZ3VsYXJJbnB1dFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xIGNhcGl0YWxpemUtZmlyc3RcIj5cbiAgICAgICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX0gVHlwZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXREYXRhVHlwZVNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0Vudmlyb25tZW50VHlwZSh2YXJpYWJsZSlcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNFbnZpcm9ubWVudFR5cGUodmFyaWFibGUpXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgIEVudmlyb25tZW50IE5hbWVcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RW52aXJvbm1lbnRTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWRFbnZpcm9ubWVudCh2YXJpYWJsZSlcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgRW52aXJvbm1lbnQgVmFsdWVcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RW52aXJvbm1lbnRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNQYXJhbWV0ZXJUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtzdHlsZS53aWR0aF09XCJpc0VkaXRJbkRlcHRoID8gbnVsbCA6ICdjYWxjKDUwJSAtIDEycHgpJ1wiIFtuZ0NsYXNzXT1cInsnY3FhLXctZnVsbCc6IGlzRWRpdEluRGVwdGh9XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICAgIFRlc3QgRGF0YSBQcm9maWxlXG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRUZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzU2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGUodmFyaWFibGUpXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgICBEYXRhIFNldFxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImdldEZvcm1Hcm91cEF0KGkpIVwiIFtjb25maWddPVwiZ2V0RGF0YVNldFNlbGVjdENvbmZpZyh2YXJpYWJsZSwgaSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNTZWxlY3RlZERhdGFTZXQodmFyaWFibGUpXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZ2V0Rm9ybUdyb3VwQXQoaSkhXCIgW2NvbmZpZ109XCJnZXRQYXJhbWV0ZXJTZWxlY3RDb25maWcodmFyaWFibGUsIGkpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+IFxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1BsYWluVGV4dFR5cGUodmFyaWFibGUpIHx8IGlzUnVudGltZVR5cGUodmFyaWFibGUpXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbc3R5bGUud2lkdGhdPVwiaXNFZGl0SW5EZXB0aCA/IG51bGwgOiAnY2FsYyg1MCUgLSAxMnB4KSdcIiBbbmdDbGFzc109XCJ7J2NxYS13LWZ1bGwnOiBpc0VkaXRJbkRlcHRofVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xICBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19IFxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwhLS0gU2hvdyBjdXN0b20gaW5wdXQgZm9yIHBsYWluLXRleHQgdHlwZSAtLT5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwiZ2V0UmF3VmFsdWUodmFyaWFibGUpXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVGVzdERhdGFWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3JlZ3VsYXJJbnB1dD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW3N0eWxlLndpZHRoXT1cImlzRWRpdEluRGVwdGggPyBudWxsIDogJ2NhbGMoNTAlIC0gMTJweCknXCIgW25nQ2xhc3NdPVwieydjcWEtdy1mdWxsJzogaXNFZGl0SW5EZXB0aH1cIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJ2YXJpYWJsZS52YWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImNyZWF0ZUVsZW1lbnRWaXNpYmxlXCI+XG4gIDxjcWEtZWxlbWVudC1mb3JtXG4gICAgW2lzQ3JlYXRlTW9kZV09XCJ0cnVlXCJcbiAgICBbc2NyZWVuTmFtZU9wdGlvbnNdPVwic2NyZWVuTmFtZU9wdGlvbnNcIlxuICAgIFtoYXNNb3JlU2NyZWVuTmFtZXNdPVwiaGFzTW9yZVNjcmVlbk5hbWVzXCJcbiAgICBbaXNMb2FkaW5nU2NyZWVuTmFtZXNdPVwiaXNMb2FkaW5nU2NyZWVuTmFtZXNcIlxuICAgIFtpc0VkaXRJbkRlcHRoQXZhaWxhYmxlXT1cImZhbHNlXCJcbiAgICAoY3JlYXRlRWxlbWVudCk9XCJvbkNyZWF0ZUVsZW1lbnQoJGV2ZW50KVwiXG4gICAgKGNhbmNlbCk9XCJvbkNhbmNlbEVsZW1lbnRGb3JtKClcIlxuICAgIChzZWFyY2hTY3JlZW5OYW1lKT1cInNlYXJjaFNjcmVlbk5hbWUuZW1pdCgkZXZlbnQpXCJcbiAgICAobG9hZE1vcmVTY3JlZW5OYW1lcyk9XCJsb2FkTW9yZVNjcmVlbk5hbWVzLmVtaXQoJGV2ZW50KVwiXG4gICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiPlxuICA8L2NxYS1lbGVtZW50LWZvcm0+XG48L2Rpdj4iXX0=