@cqa-lib/cqa-ui 1.1.374 → 1.1.376
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.
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +18 -3
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +19 -5
- package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +53 -11
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +5 -3
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +69 -22
- package/fesm2015/cqa-lib-cqa-ui.mjs +165 -44
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +159 -39
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +5 -2
- package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +5 -2
- package/lib/step-builder/step-builder-database/step-builder-database.component.d.ts +12 -1
- package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +3 -1
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -530,6 +530,14 @@ export class StepBuilderActionComponent {
|
|
|
530
530
|
const value = variable.value;
|
|
531
531
|
return value !== null && value !== undefined && value !== '';
|
|
532
532
|
}
|
|
533
|
+
if (variable.dataType === 'parameter') {
|
|
534
|
+
const value = variable.value;
|
|
535
|
+
return value !== null && value !== undefined && value !== '';
|
|
536
|
+
}
|
|
537
|
+
if (variable.dataType === 'environment') {
|
|
538
|
+
const value = variable.value;
|
|
539
|
+
return value !== null && value !== undefined && value !== '';
|
|
540
|
+
}
|
|
533
541
|
}
|
|
534
542
|
return true;
|
|
535
543
|
});
|
|
@@ -682,9 +690,14 @@ export class StepBuilderActionComponent {
|
|
|
682
690
|
console.log(key, value);
|
|
683
691
|
}
|
|
684
692
|
/**
|
|
685
|
-
* Update HTML grammar by replacing placeholder spans with actual variable values
|
|
693
|
+
* Update HTML grammar by replacing placeholder spans with actual variable values.
|
|
694
|
+
* Delegates to computeHtmlGrammarFn when provided by the host app (centralised logic in StepBuilderService).
|
|
686
695
|
*/
|
|
687
696
|
updateHtmlGrammar() {
|
|
697
|
+
if (this.computeHtmlGrammarFn) {
|
|
698
|
+
this.updatedHtmlGrammar = this.computeHtmlGrammarFn(this.selectedTemplate, this.templateVariables);
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
688
701
|
if (!this.selectedTemplate) {
|
|
689
702
|
this.updatedHtmlGrammar = '';
|
|
690
703
|
return;
|
|
@@ -812,7 +825,7 @@ export class StepBuilderActionComponent {
|
|
|
812
825
|
}
|
|
813
826
|
}
|
|
814
827
|
StepBuilderActionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderActionComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
815
|
-
StepBuilderActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: { showHeader: "showHeader", changeTemplateSignal: "changeTemplateSignal", cancelChangeTemplateSignal: "cancelChangeTemplateSignal", templates: "templates", initialTemplate: "initialTemplate", initialDescription: "initialDescription", initialMetadata: "initialMetadata", isDebug: "isDebug", editMode: "editMode", searchPlaceholder: "searchPlaceholder", setTemplateVariables: "setTemplateVariables", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", preventSelectTemplate: "preventSelectTemplate", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", uploadOptions: "uploadOptions", hasMoreUploads: "hasMoreUploads", isLoadingUploads: "isLoadingUploads", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", isCreatingStep: "isCreatingStep" }, outputs: { templateChanged: "templateChanged", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchUploads: "searchUploads", loadMoreUploads: "loadMoreUploads", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", createStep: "createStep", cancelled: "cancelled", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, host: { styleAttribute: "display: block;height: 100%;width: 100%;", classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "templateVariablesForm", first: true, predicate: TemplateVariablesFormComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-p-[16px]\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n \n <div *ngIf=\"showHeader\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit an action step' : 'Create an action step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && !selectedTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onCancelTemplateSelection()\">\n </cqa-button>\n </div>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-2 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700 cqa-py-2\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n \n <div class=\"cqa-flex cqa-justify-end cqa-pt-2 cqa-gap-2\" *ngIf=\"!createElementVisible\">\n <cqa-button \n *ngIf=\"selectorVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Element\"\n (clicked)=\"onShowElementForm()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"parameterVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Parameter\"\n (clicked)=\"redirectToParameter.emit()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"environmentVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Environment\"\n (clicked)=\"redirectToEnvironment.emit()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n #templateVariablesForm\n style=\"width: 100%;\"\n [isDebug]=\"isDebug\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [uploadOptions]=\"uploadOptions\"\n [hasMoreUploads]=\"hasMoreUploads\"\n [isLoadingUploads]=\"isLoadingUploads\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [createElementVisible]=\"createElementVisible\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $event\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchUploads)=\"searchUploads.emit($event)\"\n (loadMoreUploads)=\"loadMoreUploads.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div> \n <div>\n \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!createElementVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"isEditMode ? 'Update Step' : 'Create Step'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <!-- Loader slot: same size as Create Step button (lg: 38px height, full width, rounded-[8px]) -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge\n label=\"Creating\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i4.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "uploadOptions", "hasMoreUploads", "isLoadingUploads", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "isEditInDepth", "isDebug", "createElementVisible"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchUploads", "loadMoreUploads", "searchEnvironments", "loadMoreEnvironments", "cancelElementForm", "elementFormVisibilityChange"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }, { type: i7.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }], directives: [{ type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
828
|
+
StepBuilderActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: { showHeader: "showHeader", changeTemplateSignal: "changeTemplateSignal", cancelChangeTemplateSignal: "cancelChangeTemplateSignal", templates: "templates", initialTemplate: "initialTemplate", initialDescription: "initialDescription", initialMetadata: "initialMetadata", isDebug: "isDebug", editMode: "editMode", searchPlaceholder: "searchPlaceholder", setTemplateVariables: "setTemplateVariables", setAdvancedSettingsVariables: "setAdvancedSettingsVariables", computeHtmlGrammarFn: "computeHtmlGrammarFn", preventSelectTemplate: "preventSelectTemplate", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames", parameterOptions: "parameterOptions", hasMoreParameters: "hasMoreParameters", isLoadingParameters: "isLoadingParameters", uploadOptions: "uploadOptions", hasMoreUploads: "hasMoreUploads", isLoadingUploads: "isLoadingUploads", environmentOptions: "environmentOptions", hasMoreEnvironments: "hasMoreEnvironments", isLoadingEnvironments: "isLoadingEnvironments", defaultTestDataProfileId: "defaultTestDataProfileId", defaultTestDataStartIndex: "defaultTestDataStartIndex", isCreatingStep: "isCreatingStep" }, outputs: { templateChanged: "templateChanged", loadMoreElements: "loadMoreElements", searchElements: "searchElements", searchElementsByScreenName: "searchElementsByScreenName", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", searchParameters: "searchParameters", loadMoreParameters: "loadMoreParameters", searchUploads: "searchUploads", loadMoreUploads: "loadMoreUploads", searchEnvironments: "searchEnvironments", loadMoreEnvironments: "loadMoreEnvironments", createStep: "createStep", cancelled: "cancelled", redirectToParameter: "redirectToParameter", redirectToEnvironment: "redirectToEnvironment" }, host: { styleAttribute: "display: block;height: 100%;width: 100%;", classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "templateVariablesForm", first: true, predicate: TemplateVariablesFormComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-p-[16px]\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n \n <div *ngIf=\"showHeader\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit an action step' : 'Create an action step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && !selectedTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onCancelTemplateSelection()\">\n </cqa-button>\n </div>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-2 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700 cqa-py-2\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n \n <div class=\"cqa-flex cqa-justify-end cqa-pt-2 cqa-gap-2\" *ngIf=\"!createElementVisible\">\n <cqa-button \n *ngIf=\"selectorVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Element\"\n (clicked)=\"onShowElementForm()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"parameterVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Parameter\"\n (clicked)=\"redirectToParameter.emit()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"environmentVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Environment\"\n (clicked)=\"redirectToEnvironment.emit()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n #templateVariablesForm\n style=\"width: 100%;\"\n [isDebug]=\"isDebug\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [uploadOptions]=\"uploadOptions\"\n [hasMoreUploads]=\"hasMoreUploads\"\n [isLoadingUploads]=\"isLoadingUploads\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [createElementVisible]=\"createElementVisible\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $event\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchUploads)=\"searchUploads.emit($event)\"\n (loadMoreUploads)=\"loadMoreUploads.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div> \n <div>\n \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!createElementVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"isEditMode ? 'Update Step' : 'Create Step'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <!-- Loader slot: same size as Create Step button (lg: 38px height, full width, rounded-[8px]) -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge\n label=\"Creating\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>", components: [{ type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i4.TemplateVariablesFormComponent, selector: "cqa-template-variables-form", inputs: ["templateVariables", "variablesForm", "metadata", "description", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames", "parameterOptions", "hasMoreParameters", "isLoadingParameters", "uploadOptions", "hasMoreUploads", "isLoadingUploads", "environmentOptions", "hasMoreEnvironments", "isLoadingEnvironments", "defaultTestDataProfileId", "defaultTestDataStartIndex", "isEditInDepth", "isDebug", "createElementVisible"], outputs: ["variableValueChange", "variableBooleanChange", "metadataChange", "descriptionChange", "loadMoreElements", "searchElements", "searchElementsByScreenName", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "searchParameters", "loadMoreParameters", "searchUploads", "loadMoreUploads", "searchEnvironments", "loadMoreEnvironments", "cancelElementForm", "elementFormVisibilityChange"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: ["advancedVariables", "advancedVariableForm"], outputs: ["variableBooleanChange", "variableValueChange"] }, { type: i7.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }], directives: [{ type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
816
829
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderActionComponent, decorators: [{
|
|
817
830
|
type: Component,
|
|
818
831
|
args: [{ selector: 'cqa-step-builder-action', host: { class: 'cqa-ui-root', style: 'display: block;height: 100%;width: 100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-p-[16px]\" [ngClass]=\"{'cqa-px-4': showHeader, 'cqa-py-2': showHeader && !selectedTemplate}\">\n <!-- Header -->\n \n <div *ngIf=\"showHeader\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-m-0\">\n {{ isEditMode ? 'Edit an action step' : 'Create an action step' }}\n </h2>\n <cqa-button\n *ngIf=\"isEditMode && selectedTemplate\"\n variant=\"outlined\"\n btnSize=\"sm\"\n icon=\"swap_horiz\"\n text=\"Change Template\"\n (clicked)=\"onChangeTemplate()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isEditMode && !selectedTemplate\"\n variant=\"text\"\n btnSize=\"sm\"\n text=\"Cancel\"\n (clicked)=\"onCancelTemplateSelection()\">\n </cqa-button>\n </div>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-action-format cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-6\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-overflow-y-auto\" style=\"flex: 1 1 0 !important;\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-2 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700 cqa-py-2\">\n <div class=\"cqa-action-format cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"updatedHtmlGrammar || selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n \n <div class=\"cqa-flex cqa-justify-end cqa-pt-2 cqa-gap-2\" *ngIf=\"!createElementVisible\">\n <cqa-button \n *ngIf=\"selectorVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Element\"\n (clicked)=\"onShowElementForm()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"parameterVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Parameter\"\n (clicked)=\"redirectToParameter.emit()\">\n </cqa-button>\n <cqa-button \n *ngIf=\"environmentVariableAvailable\"\n variant=\"outlined\" \n btnSize=\"sm\"\n icon=\"add\"\n text=\"Create Environment\"\n (clicked)=\"redirectToEnvironment.emit()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto cqa-flex-1 cqa-pb-2\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap cqa-pb-4\">\n <!-- Template Variables Form Component -->\n <cqa-template-variables-form\n #templateVariablesForm\n style=\"width: 100%;\"\n [isDebug]=\"isDebug\"\n [templateVariables]=\"templateVariables\"\n [variablesForm]=\"variablesForm\"\n [metadata]=\"metadata\"\n [description]=\"description\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n [parameterOptions]=\"parameterOptions\"\n [hasMoreParameters]=\"hasMoreParameters\"\n [isLoadingParameters]=\"isLoadingParameters\"\n [uploadOptions]=\"uploadOptions\"\n [hasMoreUploads]=\"hasMoreUploads\"\n [isLoadingUploads]=\"isLoadingUploads\"\n [environmentOptions]=\"environmentOptions\"\n [hasMoreEnvironments]=\"hasMoreEnvironments\"\n [isLoadingEnvironments]=\"isLoadingEnvironments\"\n [defaultTestDataProfileId]=\"defaultTestDataProfileId\"\n [defaultTestDataStartIndex]=\"defaultTestDataStartIndex\"\n [createElementVisible]=\"createElementVisible\"\n (variableValueChange)=\"onVariableValueChange($event.name, $event.value)\"\n (variableBooleanChange)=\"onVariableBooleanChange($event.name, $event.value)\"\n (metadataChange)=\"metadata = $event\"\n (descriptionChange)=\"description = $event\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (searchElementsByScreenName)=\"searchElementsByScreenName.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (searchParameters)=\"searchParameters.emit($event)\"\n (loadMoreParameters)=\"loadMoreParameters.emit()\"\n (searchUploads)=\"searchUploads.emit($event)\"\n (loadMoreUploads)=\"loadMoreUploads.emit()\"\n (searchEnvironments)=\"searchEnvironments.emit($event)\"\n (loadMoreEnvironments)=\"loadMoreEnvironments.emit()\"\n (elementFormVisibilityChange)=\"onElementFormVisibilityChange($event)\">\n </cqa-template-variables-form>\n </div>\n\n <!-- Advanced (Expandable) -->\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <cqa-advanced-variables-form \n [advancedVariables]=\"advancedSettingsVariables\"\n [advancedVariableForm]=\"advancedVariablesForm\"\n (variableBooleanChange)=\"onAdvancedVariableBooleanChange($event.name, $event.value)\"\n (variableValueChange)=\"onAdvancedVariableValueChange($event.name, $event.value)\">\n </cqa-advanced-variables-form>\n </div>\n </div> \n <div>\n \n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div *ngIf=\"!createElementVisible\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200 cqa-pb-2\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button *ngIf=\"!isCreatingStep\" class=\"cqa-w-1/2\" variant=\"filled\" [text]=\"isEditMode ? 'Update Step' : 'Create Step'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n <!-- Loader slot: same size as Create Step button (lg: 38px height, full width, rounded-[8px]) -->\n <div *ngIf=\"isCreatingStep\" class=\"cqa-w-1/2 cqa-flex-1 cqa-min-h-[38px] cqa-rounded-[8px]\">\n <cqa-badge\n label=\"Creating\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n [inlineStyles]=\"'min-height: 38px; height: 38px; box-sizing: border-box; display: flex; align-items: center; justify-content: center;'\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>", styles: [] }]
|
|
@@ -840,6 +853,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
840
853
|
type: Input
|
|
841
854
|
}], setAdvancedSettingsVariables: [{
|
|
842
855
|
type: Input
|
|
856
|
+
}], computeHtmlGrammarFn: [{
|
|
857
|
+
type: Input
|
|
843
858
|
}], preventSelectTemplate: [{
|
|
844
859
|
type: Input
|
|
845
860
|
}], elementOptions: [{
|
|
@@ -918,4 +933,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
918
933
|
type: ViewChild,
|
|
919
934
|
args: [TemplateVariablesFormComponent, { static: false }]
|
|
920
935
|
}] } });
|
|
921
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvSCxPQUFPLEVBQTBCLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdoRixPQUFPLEVBQW9CLDhCQUE4QixFQUFFLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7Ozs7QUF5RGhJLE1BQU0sT0FBTywwQkFBMEI7SUFpSHJDLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBaEgxQixlQUFVLEdBQVksSUFBSSxDQUFDO1FBQ3BDLG1GQUFtRjtRQUMxRSx5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDMUMsNkZBQTZGO1FBQ3BGLCtCQUEwQixHQUFXLENBQUMsQ0FBQztRQUNoRCwwQ0FBMEM7UUFDakMsY0FBUyxHQUFxQixFQUFFLENBQUM7UUFPMUMsZ0hBQWdIO1FBQ3ZHLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFTbEMsd0NBQXdDO1FBQy9CLHNCQUFpQixHQUFXLGdCQUFnQixDQUFDO1FBRXRELG1HQUFtRztRQUMxRix5QkFBb0IsR0FBdUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUEsQ0FBQSxDQUFDLENBQUM7UUFFdkYsMkZBQTJGO1FBQ2xGLGlDQUE0QixHQUF3RCxHQUFHLEVB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QkFBd0I7c0JBQWhDLEtBQUs7Z0JBRUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRywwQkFBMEI7c0JBQW5DLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQWlCdUQscUJBQXFCO3NCQUFsRixTQUFTO3VCQUFDLDhCQUE4QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRlbXBsYXRlVmFyaWFibGUsIFRlbXBsYXRlVmFyaWFibGVzRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL3RlbXBsYXRlLXZhcmlhYmxlcy1mb3JtL3RlbXBsYXRlLXZhcmlhYmxlcy1mb3JtLmNvbXBvbmVudCc7XG5cbi8vIEltcG9ydCBFbGVtZW50IHR5cGUgLSB1c2luZyBhbnkgZm9yIG5vdyBzaW5jZSBFbGVtZW50IGlzIGZyb20gdHMtcG9ydGFsLXVpXG4vLyBJbiBhIHJlYWwgc2NlbmFyaW8sIHlvdSBtaWdodCB3YW50IHRvIGNyZWF0ZSBhIHNoYXJlZCBpbnRlcmZhY2Ugb3IgaW1wb3J0IGZyb20gYSBzaGFyZWQgcGFja2FnZVxuaW50ZXJmYWNlIEVsZW1lbnQge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBsb2NhdG9yVmFsdWU/OiBzdHJpbmc7XG4gIG90aGVyTG9jYXRvcj86IHN0cmluZ1tdO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVEZWZpbml0aW9uIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkZWZhdWx0OiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgbnVsbDtcbiAgbXV0YWJsZTogYm9vbGVhbjtcbiAgdHlwZT86IHN0cmluZztcbiAgb3B0aW9ucz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvblRlbXBsYXRlIHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hdHVyYWxUZXh0Pzogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgaHRtbEdyYW1tYXI/OiBzdHJpbmc7XG4gIHNlYXJjaGFibGVHcmFtbWFyPzogc3RyaW5nO1xuICB3b3Jrc3BhY2VUeXBlPzogc3RyaW5nO1xuICBhY3Rpb24/OiBzdHJpbmc7XG4gIGlzQWRkb24/OiBib29sZWFuO1xuICB2YXJpYWJsZXM/OiBSZWNvcmQ8c3RyaW5nLCBWYXJpYWJsZURlZmluaXRpb24+O1xuICBhbGxvd2VkVmFsdWVzPzogYW55O1xuICBkYXRhPzogYW55O1xuICBzdGVwQWN0aW9uVHlwZT86IGFueTtcbiAgc3RlcFR5cGU/OiBhbnk7XG4gIGRpc3BsYXlPcmRlcj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RmllbGQge1xuICBrZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgdHlwZTogJ2VsZW1lbnQnIHwgJ3Rlc3QtZGF0YScgfCAnYXR0cmlidXRlJztcbn1cblxudHlwZSBTdGVwVGVzdERhdGFMaXN0SXRlbSA9IHtcbiAgdGVzdERhdGE6IHN0cmluZztcbiAgdGVzdERhdGFLZXk/OiBzdHJpbmc7XG4gIHRlc3REYXRhVHlwZTogc3RyaW5nO1xuICB0ZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWJ1aWxkZXItYWN0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnLCBzdHlsZTogJ2Rpc3BsYXk6IGJsb2NrO2hlaWdodDogMTAwJTt3aWR0aDogMTAwJTsnIH1cbn0pXG5leHBvcnQgY2xhc3MgU3RlcEJ1aWxkZXJBY3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQElucHV0KCkgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIC8qKiBJbmNyZW1lbnQgdGhpcyBjb3VudGVyIHRvIHRyaWdnZXIgXCJDaGFuZ2UgVGVtcGxhdGVcIiBmcm9tIGEgcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgY2hhbmdlVGVtcGxhdGVTaWduYWw6IG51bWJlciA9IDA7XG4gIC8qKiBJbmNyZW1lbnQgdGhpcyBjb3VudGVyIHRvIHRyaWdnZXIgXCJDYW5jZWwgdGVtcGxhdGUgc2VsZWN0aW9uXCIgZnJvbSBhIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIGNhbmNlbENoYW5nZVRlbXBsYXRlU2lnbmFsOiBudW1iZXIgPSAwO1xuICAvKiogTGlzdCBvZiBhY3Rpb24gdGVtcGxhdGVzIHRvIGRpc3BsYXkgKi9cbiAgQElucHV0KCkgdGVtcGxhdGVzOiBBY3Rpb25UZW1wbGF0ZVtdID0gW107XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBhdXRvbWF0aWNhbGx5IHNlbGVjdHMgdGhpcyB0ZW1wbGF0ZSBvbiBpbml0IChlZGl0IG1vZGUpLiAqL1xuICBASW5wdXQoKSBpbml0aWFsVGVtcGxhdGU/OiBBY3Rpb25UZW1wbGF0ZTtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHByZS1wb3B1bGF0ZXMgdGhlIGRlc2NyaXB0aW9uIGZpZWxkIGluIGVkaXQgbW9kZS4gKi9cbiAgQElucHV0KCkgaW5pdGlhbERlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogV2hlbiBwcm92aWRlZCwgcHJlLXBvcHVsYXRlcyB0aGUgbWV0YWRhdGEgZmllbGQgaW4gZWRpdCBtb2RlLiAqL1xuICBASW5wdXQoKSBpbml0aWFsTWV0YWRhdGE/OiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRydWUsIGVuYWJsZXMgZGVidWctbW9kZSBiZWhhdmlvdXI6IGF1dG8tc2VsZWN0cyBpbml0aWFsVGVtcGxhdGUgYW5kIHByZS1maWxscyBkZXNjcmlwdGlvbi9tZXRhZGF0YS4gKi9cbiAgQElucHV0KCkgaXNEZWJ1ZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogV2hlbiBwcm92aWRlZCwgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGlzRWRpdE1vZGUgbG9naWMgKHVzZWZ1bCB3aGVuIHBhcmVudCBrbm93cyBlZGl0IHN0YXRlIGluZGVwZW5kZW50bHkgb2YgaW5pdGlhbFRlbXBsYXRlKS4gKi9cbiAgQElucHV0KCkgZWRpdE1vZGU/OiBib29sZWFuO1xuXG4gIGdldCBpc0VkaXRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmVkaXRNb2RlICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmVkaXRNb2RlO1xuICAgIHJldHVybiB0aGlzLmlzRGVidWcgJiYgISF0aGlzLmluaXRpYWxUZW1wbGF0ZTtcbiAgfVxuXG4gIC8qKiBQbGFjZWhvbGRlciB0ZXh0IGZvciBzZWFyY2ggaW5wdXQgKi9cbiAgQElucHV0KCkgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWFyY2ggbGlicmFyeSc7XG5cbiAgLyoqIEZ1bmN0aW9uIHRvIGhhbmRsZSB2YXJpYWJsZSBwcm9jZXNzaW5nIG9yIGN1c3RvbSBsb2dpYy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldFRlbXBsYXRlVmFyaWFibGVzOiAodmFyaWFibGVzOiBBY3Rpb25UZW1wbGF0ZSkgPT4gYW55ID0gKCkgPT4geyByZXR1cm4gW119O1xuICBcbiAgLyoqIEZ1bmN0aW9uIHRvIGhhbmRsZSBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzOiAodGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlLCB0ZXN0U3RlcD86IGFueSkgPT4gYW55W10gPSAoKSA9PiB7IHJldHVybiBbXX07XG5cbiAgQElucHV0KCkgcHJldmVudFNlbGVjdFRlbXBsYXRlOiBzdHJpbmdbXSA9IFsnZGF0YWJhc2V2ZXJpZmljYXRpb24nXTtcbiAgQElucHV0KCkgZWxlbWVudE9wdGlvbnM6IEVsZW1lbnRbXSA9IFtdOyAvLyBFbGVtZW50IG9iamVjdHMgZm9yIGVsZW1lbnQgZHJvcGRvd25cbiAgQElucHV0KCkgaGFzTW9yZUVsZW1lbnRzOiBib29sZWFuID0gZmFsc2U7IC8vIFdoZXRoZXIgbW9yZSBlbGVtZW50cyBhcmUgYXZhaWxhYmxlXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0VsZW1lbnRzOiBib29sZWFuID0gZmFsc2U7IC8vIExvYWRpbmcgc3RhdGUgZm9yIGVsZW1lbnRzXG4gIC8qKiBTY3JlZW4gbmFtZSBvcHRpb25zIGZvciBlbGVtZW50IGZvcm0gYXV0b2NvbXBsZXRlIChmcm9tIEFQSSkgKi9cbiAgQElucHV0KCkgc2NyZWVuTmFtZU9wdGlvbnM6IHsgaWQ/OiBudW1iZXI7IG5hbWU6IHN0cmluZyB9W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBzY3JlZW4gbmFtZXMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBzY3JlZW4gbmFtZXMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ1NjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBQYXJhbWV0ZXIgb3B0aW9ucyBmb3IgdGVzdCBkYXRhIHBhcmFtZXRlciBkcm9wZG93biAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHBhcmFtZXRlck9wdGlvbnM6IGFueVtdID0gW107IC8vIFRlc3REYXRhW10gLSByYXcgdGVzdCBkYXRhIHByb2ZpbGVzXG4gIC8qKiBXaGV0aGVyIG1vcmUgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVBhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgcGFyYW1ldGVycyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVXBsb2FkIG9wdGlvbnMgZm9yIHVwbG9hZCBkcm9wZG93biAoZnJvbSBBUEkpICovXG4gIEBJbnB1dCgpIHVwbG9hZE9wdGlvbnM6IGFueVtdID0gW107XG4gIC8qKiBXaGV0aGVyIG1vcmUgdXBsb2FkcyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVVwbG9hZHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgdXBsb2FkcyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nVXBsb2FkczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRW52aXJvbm1lbnQgb3B0aW9ucyBmb3IgZW52aXJvbm1lbnQgcGFyYW1ldGVyIGRyb3Bkb3duIChmcm9tIEFQSSkgKi9cbiAgQElucHV0KCkgZW52aXJvbm1lbnRPcHRpb25zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgZW52aXJvbm1lbnQ6IHN0cmluZyB9W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSBlbnZpcm9ubWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsICovXG4gIEBJbnB1dCgpIGhhc01vcmVFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGxvYWRpbmcgZW52aXJvbm1lbnRzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdFbnZpcm9ubWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHByb2ZpbGUgSUQgZnJvbSB0ZXN0IGNhc2UgKGlmIGF2YWlsYWJsZSwgcHJvZmlsZSBhbmQgZGF0YSBzZXQgZHJvcGRvd25zIHdpbGwgYmUgZGlzYWJsZWQpICovXG4gIEBJbnB1dCgpIGRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdGVzdCBkYXRhIHN0YXJ0IGluZGV4IGZyb20gdGVzdCBjYXNlIChkYXRhIHNldCBpbmRleCBpbiB0aGUgcHJvZmlsZSkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleD86IG51bWJlcjtcbiAgLyoqIFRydWUgd2hpbGUgcGFyZW50IGlzIGNyZWF0aW5nIHRoZSBzdGVwIChBUEkgaW4gcHJvZ3Jlc3MpOyBzaG93IGxvYWRlciBvbiBDcmVhdGUvVXBkYXRlIFN0ZXAgYnV0dG9uICovXG4gIEBJbnB1dCgpIGlzQ3JlYXRpbmdTdGVwOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSB0ZW1wbGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEFjdGlvblRlbXBsYXRlPigpO1xuICBAT3V0cHV0KCkgbG9hZE1vcmVFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIGxvYWQgbW9yZSBpcyByZXF1ZXN0ZWRcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBlbGVtZW50c1xuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHNCeVNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc2NyZWVuTmFtZUlkOiBudW1iZXI7IHNlYXJjaFRlcm0/OiBzdHJpbmcgfT4oKTsgLy8gRW1pdCB3aGVuIHNjcmVlbiBuYW1lIGlzIHNlbGVjdGVkIHRvIGZldGNoIGVsZW1lbnRzIGZpbHRlcmVkIGJ5IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBjcmVhdGVFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7IC8vIEVtaXQgd2hlbiBlbGVtZW50IGlzIGNyZWF0ZWRcbiAgQE91dHB1dCgpIHNlYXJjaFNjcmVlbk5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVNjcmVlbk5hbWVzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHNjcmVlbiBuYW1lc1xuICBAT3V0cHV0KCkgY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgcmVxdWVzdHMgdG8gY3JlYXRlIGEgbmV3IHNjcmVlbiBuYW1lXG4gIEBPdXRwdXQoKSBzZWFyY2hQYXJhbWV0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBwYXJhbWV0ZXJzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIHNlYXJjaFVwbG9hZHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIHVwbG9hZHNcbiAgQE91dHB1dCgpIGxvYWRNb3JlVXBsb2FkcyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgdXBsb2Fkc1xuICBAT3V0cHV0KCkgc2VhcmNoRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNlYXJjaGVzIGZvciBlbnZpcm9ubWVudHNcbiAgQE91dHB1dCgpIGxvYWRNb3JlRW52aXJvbm1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSBlbnZpcm9ubWVudHNcbiAgLyoqIEVtaXQgd2hlbiBzdGVwIGlzIGNyZWF0ZWQgKi9cbiAgQE91dHB1dCgpIGNyZWF0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKiogRW1pdCB3aGVuIGNhbmNlbGxlZCAqL1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVkaXJlY3RUb1BhcmFtZXRlciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlZGlyZWN0VG9FbnZpcm9ubWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBmaWx0ZXJlZFRlbXBsYXRlczogQWN0aW9uVGVtcGxhdGVbXSA9IFtdO1xuICBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHNlbGVjdGVkVGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJldmlvdXNUZW1wbGF0ZUZvckVkaXQ6IEFjdGlvblRlbXBsYXRlIHwgbnVsbCA9IG51bGw7XG4gIG1ldGFkYXRhOiBzdHJpbmcgPSAnJztcbiAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuICBhZHZhbmNlZEV4cGFuZGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgdGVtcGxhdGVWYXJpYWJsZXM6IFRlbXBsYXRlVmFyaWFibGVbXSA9IFtdO1xuICB2YXJpYWJsZXNGb3JtOiBGb3JtQXJyYXk7XG4gIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIGFkdmFuY2VkVmFyaWFibGVzRm9ybTogRm9ybUFycmF5O1xuICB1cGRhdGVkSHRtbEdyYW1tYXI6IHN0cmluZyA9ICcnOyAvLyBVcGRhdGVkIEhUTUwgZ3JhbW1hciB3aXRoIHZhcmlhYmxlIHZhbHVlc1xuICBjcmVhdGVFbGVtZW50VmlzaWJsZSA9IGZhbHNlO1xuICAvLyBUcmFjayBlbGVtZW50IGZvcm0gdmlzaWJpbGl0eVxuICBcbiAgQFZpZXdDaGlsZChUZW1wbGF0ZVZhcmlhYmxlc0Zvcm1Db21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSB0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm0/OiBUZW1wbGF0ZVZhcmlhYmxlc0Zvcm1Db21wb25lbnQ7XG4gIFxuICAvLyBDYWNoZSBmb3Igc2VsZWN0IGNvbmZpZ3MgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gIHByaXZhdGUgc2VsZWN0Q29uZmlnQ2FjaGU6IE1hcDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgZm9ybVZhbGlkQ2FjaGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBsYXN0Rm9ybVZhbGlkYXRpb25UaW1lOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IEZPUk1fVkFMSURBVElPTl9DQUNIRV9NUyA9IDEwMDsgLy8gQ2FjaGUgZm9yIDEwMG1zXG4gIHByaXZhdGUgZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICAgIHRoaXMudmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuYXJyYXkoW10pO1xuICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtID0gdGhpcy5mYi5hcnJheShbXSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGVsZW1lbnQgZm9ybSB2aXNpYmlsaXR5IGNoYW5nZVxuICAgKi9cbiAgb25FbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlRWxlbWVudFZpc2libGUgPSB2aXNpYmxlO1xuICB9XG5cbiAgb25TaG93RWxlbWVudEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVFbGVtZW50VmlzaWJsZSA9IHRydWU7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gWy4uLnRoaXMudGVtcGxhdGVzXTtcbiAgICBpZiAodGhpcy5pc0RlYnVnKSB7XG4gICAgICBpZiAodGhpcy5pbml0aWFsRGVzY3JpcHRpb24pIHRoaXMuZGVzY3JpcHRpb24gPSB0aGlzLmluaXRpYWxEZXNjcmlwdGlvbjtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxNZXRhZGF0YSkgdGhpcy5tZXRhZGF0YSA9IHRoaXMuaW5pdGlhbE1ldGFkYXRhO1xuICAgICAgaWYgKHRoaXMuaW5pdGlhbFRlbXBsYXRlKSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0VGVtcGxhdGUodGhpcy5pbml0aWFsVGVtcGxhdGUhKSwgMCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZXMnXSkge1xuICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICAgIH1cbiAgICAvLyBXaGVuIGluaXRpYWxUZW1wbGF0ZSBpcyBzZXQgYWZ0ZXIgaW5pdCAoYXN5bmMgcHJlLWZpbGwpLCBhdXRvLXNlbGVjdCBpdFxuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsVGVtcGxhdGUnXSAmJiB0aGlzLmlzRGVidWcgJiYgdGhpcy5pbml0aWFsVGVtcGxhdGUgJiYgIXRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbGVjdFRlbXBsYXRlKHRoaXMuaW5pdGlhbFRlbXBsYXRlISksIDApO1xuICAgIH1cbiAgICAvLyBQYXJlbnQgY2FuIHRyaWdnZXIgXCJDaGFuZ2UgVGVtcGxhdGVcIiBieSBpbmNyZW1lbnRpbmcgY2hhbmdlVGVtcGxhdGVTaWduYWxcbiAgICBpZiAoY2hhbmdlc1snY2hhbmdlVGVtcGxhdGVTaWduYWwnXSAmJiAhY2hhbmdlc1snY2hhbmdlVGVtcGxhdGVTaWduYWwnXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5vbkNoYW5nZVRlbXBsYXRlKCk7XG4gICAgfVxuICAgIC8vIFBhcmVudCBjYW4gdHJpZ2dlciBcIkNhbmNlbCB0ZW1wbGF0ZSBzZWxlY3Rpb25cIiBieSBpbmNyZW1lbnRpbmcgY2FuY2VsQ2hhbmdlVGVtcGxhdGVTaWduYWxcbiAgICBpZiAoY2hhbmdlc1snY2FuY2VsQ2hhbmdlVGVtcGxhdGVTaWduYWwnXSAmJiAhY2hhbmdlc1snY2FuY2VsQ2hhbmdlVGVtcGxhdGVTaWduYWwnXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5vbkNhbmNlbFRlbXBsYXRlU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgb25TZWFyY2hDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBvblNlYXJjaFN1Ym1pdCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIG9uU2VhcmNoQ2xlYXJlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlYXJjaFZhbHVlIHx8IHRoaXMuc2VhcmNoVmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgdGhpcy5maWx0ZXJlZFRlbXBsYXRlcyA9IFsuLi50aGlzLnRlbXBsYXRlc107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoVGVybSA9IHRoaXMuc2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgdGhpcy5maWx0ZXJlZFRlbXBsYXRlcyA9IHRoaXMudGVtcGxhdGVzLmZpbHRlcih0ZW1wbGF0ZSA9PiB7XG4gICAgICBjb25zdCBuYXR1cmFsVGV4dCA9IHRlbXBsYXRlLm5hdHVyYWxUZXh0Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgLy8gU3RyaXAgSFRNTCB0YWdzIGZyb20gaHRtbEdyYW1tYXIgZm9yIHNlYXJjaGluZyAob25seSBzZWFyY2ggdGV4dCBjb250ZW50LCBub3QgSFRNTCBtYXJrdXApXG4gICAgICBjb25zdCBodG1sR3JhbW1hclRleHQgPSB0aGlzLnN0cmlwSHRtbFRhZ3ModGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBzZWFyY2hhYmxlR3JhbW1hciA9IHRlbXBsYXRlLnNlYXJjaGFibGVHcmFtbWFyPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgXG4gICAgICByZXR1cm4gbmF0dXJhbFRleHQuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHwgXG4gICAgICAgICAgICAgIGh0bWxHcmFtbWFyVGV4dC5pbmNsdWRlcyhzZWFyY2hUZXJtKSB8fCBcbiAgICAgICAgICAgICBzZWFyY2hhYmxlR3JhbW1hci5pbmNsdWRlcyhzZWFyY2hUZXJtKTtcbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyhcImZpbHRlcmVkVGVtcGxhdGVzXCIsIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmlwIEhUTUwgdGFncyBmcm9tIGEgc3RyaW5nLCByZXR1cm5pbmcgb25seSB0aGUgdGV4dCBjb250ZW50XG4gICAqIEBwYXJhbSBodG1sU3RyaW5nIC0gSFRNTCBzdHJpbmcgdG8gc3RyaXAgdGFncyBmcm9tXG4gICAqIEByZXR1cm5zIFBsYWluIHRleHQgd2l0aG91dCBIVE1MIHRhZ3NcbiAgICovXG4gIHByaXZhdGUgc3RyaXBIdG1sVGFncyhodG1sU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaHRtbFN0cmluZykgcmV0dXJuICcnO1xuICAgIFxuICAgIC8vIFVzZSBicm93c2VyJ3MgRE9NUGFyc2VyIGlmIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBodG1sU3RyaW5nO1xuICAgICAgICByZXR1cm4gdGVtcERpdi50ZXh0Q29udGVudCB8fCB0ZW1wRGl2LmlubmVyVGV4dCB8fCAnJztcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIHJlZ2V4IGlmIERPTSBwYXJzaW5nIGZhaWxzXG4gICAgICAgIHJldHVybiBodG1sU3RyaW5nLnJlcGxhY2UoLzxbXj5dKj4vZywgJycpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBGYWxsYmFjazogcmVnZXgtYmFzZWQgdGFnIHJlbW92YWwgZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgIHJldHVybiBodG1sU3RyaW5nLnJlcGxhY2UoLzxbXj5dKj4vZywgJycpO1xuICB9XG5cbiAgc2VsZWN0VGVtcGxhdGUodGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlKTogdm9pZCB7XG4gICAgaWYodGhpcy5wcmV2ZW50U2VsZWN0VGVtcGxhdGUuaW5jbHVkZXModGVtcGxhdGUuZGlzcGxheU5hbWUgfHwgJycpKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlQ2hhbmdlZC5lbWl0KHRlbXBsYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50ZW1wbGF0ZUNoYW5nZWQuZW1pdCh0ZW1wbGF0ZSk7XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgXG4gICAgLy8gQ2xlYXIgY2FjaGUgd2hlbiB0ZW1wbGF0ZSBjaGFuZ2VzXG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgICBcbiAgICBpZih0aGlzLnNldFRlbXBsYXRlVmFyaWFibGVzICYmIHRlbXBsYXRlLnZhcmlhYmxlcykge1xuICAgICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZGVmZXIgaGVhdnkgb3BlcmF0aW9ucyBhbmQgcHJldmVudCBVSSBmcmVlemluZ1xuICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIFVJIHRvIHVwZGF0ZSBmaXJzdCwgdGhlbiBwcm9jZXNzIHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZXNcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldFRlbXBsYXRlVmFyaWFibGVzKHRlbXBsYXRlKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRlbXBsYXRlVmFyaWFibGVzXCIsIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpO1xuICAgICAgICAgIFxuICAgICAgICAgIHRoaXMuYnVpbGRWYXJpYWJsZXNGb3JtKCk7XG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSB1cGRhdGVkIEhUTUwgZ3JhbW1hclxuICAgICAgICAgIHRoaXMudXBkYXRlSHRtbEdyYW1tYXIoKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBJbml0aWFsaXplIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlc1xuICAgICAgICAgIGlmICh0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyA9IHRoaXMuc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyh0ZW1wbGF0ZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXNcIiwgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyB0ZW1wbGF0ZSB2YXJpYWJsZXM6JywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIHRlbXBsYXRlJ3MgSFRNTCBncmFtbWFyIGlmIG5vIHZhcmlhYmxlc1xuICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSB0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJztcbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSBhZHZhbmNlZCBzZXR0aW5ncyB2YXJpYWJsZXMgZXZlbiBpZiBubyB0ZW1wbGF0ZSB2YXJpYWJsZXNcbiAgICAgIGlmICh0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMpIHtcbiAgICAgICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gdGhpcy5zZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKHRlbXBsYXRlKTtcbiAgICAgICAgdGhpcy5idWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAodGhpcy52YXJpYWJsZXNGb3JtLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGNhY2hlIHdoZW4gZm9ybSBpcyByZWJ1aWx0XG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcblxuICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXMgc3Vic2NyaXB0aW9uIGlmIGl0IGV4aXN0c1xuICAgIGlmICh0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCB2YXJpYWJsZVxuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiB2YXJpYWJsZXMgLSB1c2UgYm9vbGVhbiB2YWx1ZSwgb3RoZXJzIHVzZSBzdHJpbmdcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyBcbiAgICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYSBGb3JtR3JvdXAgZm9yIGVhY2ggdmFyaWFibGUgd2l0aCBuYW1lIGFuZCB2YWx1ZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiBbZGVmYXVsdFZhbHVlXSxcbiAgICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXSxcbiAgICAgICAgb3B0aW9uczogW3ZhcmlhYmxlLm9wdGlvbnMgfHwgW11dXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gQWRkIGRhdGFUeXBlIGNvbnRyb2wgZm9yIHRlc3QtZGF0YSB2YXJpYWJsZXMgaWYgbmVlZGVkXG4gICAgICBjb25zdCBsYWJlbCA9IHZhcmlhYmxlLmxhYmVsPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGxhYmVsID09PSAndGVzdF9kYXRhJyB8fCBsYWJlbCA9PT0gJ3NvdXJjZS12YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXQtdmFsdWUnIHx8IFxuICAgICAgICAgIGxhYmVsID09PSAnc291cmNlX3ZhbHVlJyB8fCBsYWJlbCA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgLy8gUGFyc2UgdGhlIHZhbHVlIHRvIGRldGVybWluZSBkYXRhIHR5cGVcbiAgICAgICAgY29uc3QgdmFsdWVTdHIgPSBTdHJpbmcoZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICAgICAgbGV0IGRhdGFUeXBlID0gJ3BsYWluLXRleHQnO1xuICAgICAgICBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnQHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgICAgZGF0YVR5cGUgPSAncGFyYW1ldGVyJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdydW50aW1lJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCcqfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdlbnZpcm9ubWVudCc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyaWFibGVHcm91cC5hZGRDb250cm9sKCdkYXRhVHlwZScsIG5ldyBGb3JtQ29udHJvbChkYXRhVHlwZSkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucHVzaCh2YXJpYWJsZUdyb3VwKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gZm9ybSB2YWx1ZSBjaGFuZ2VzIHRvIGludmFsaWRhdGUgY2FjaGUgKG9ubHkgd2hlbiB1c2VyIGFjdHVhbGx5IGNoYW5nZXMgdmFsdWVzKVxuICAgIC8vIE5vdGU6IFdlIHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHdoZW4gcHJvZ3JhbW1hdGljYWxseSBzZXR0aW5nIHZhbHVlcywgc28gdGhpcyB3b24ndCBmaXJlIHVubmVjZXNzYXJpbHlcbiAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLnZhcmlhYmxlc0Zvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gYXJyYXlcbiAgICB3aGlsZSAodGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZm9ybSBncm91cHMgZm9yIGVhY2ggYWR2YW5jZWQgdmFyaWFibGVcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHR5cGVzXG4gICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0Jykge1xuICAgICAgICAvLyBGb3Igc3RyX2xpc3QsIGNyZWF0ZSBhIEZvcm1BcnJheVxuICAgICAgICBjb25zdCB2YWx1ZUFycmF5ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZS52YWx1ZSkgPyB2YXJpYWJsZS52YWx1ZSA6IFtdO1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZiLmFycmF5KFxuICAgICAgICAgIHZhbHVlQXJyYXkubGVuZ3RoID4gMCBcbiAgICAgICAgICAgID8gdmFsdWVBcnJheS5tYXAoKGl0ZW06IHN0cmluZykgPT4gdGhpcy5mYi5jb250cm9sKGl0ZW0pKVxuICAgICAgICAgICAgOiBbdGhpcy5mYi5jb250cm9sKCcnKV0gLy8gU3RhcnQgd2l0aCBvbmUgZW1wdHkgY29udHJvbFxuICAgICAgICApO1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBmb3JtQXJyYXk7XG4gICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFyaWFibGUudmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudmFsdWUgfHwgJyc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBhIEZvcm1Hcm91cCBmb3IgZWFjaCB2YXJpYWJsZVxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICAgIHZhbHVlOiB2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnID8gZGVmYXVsdFZhbHVlIDogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZS5sYWJlbCB8fCAnJ11cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbiB1cCBzdWJzY3JpcHRpb24gdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICBpZiAodGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXRTZWxlY3RDb25maWcodmFyaWFibGU6IGFueSwgaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fJHt2YXJpYWJsZS5vcHRpb25zPy5qb2luKCcsJykgfHwgJyd9YDtcbiAgICBpZiAodGhpcy5zZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9ICh2YXJpYWJsZS5vcHRpb25zIHx8IFtdKS5tYXAoKG9wdDogc3RyaW5nKSA9PiAoe1xuICAgICAgaWQ6IG9wdCxcbiAgICAgIHZhbHVlOiBvcHQsXG4gICAgICBuYW1lOiBvcHQsXG4gICAgICBsYWJlbDogb3B0XG4gICAgfSkpO1xuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6IGB2YWx1ZWAsIC8vIFVzZSAndmFsdWUnIGFzIGtleSBzaW5jZSB3ZSdyZSBhY2Nlc3NpbmcgZnJvbSBGb3JtQXJyYXlcbiAgICAgIHBsYWNlaG9sZGVyOiBgU2VsZWN0ICR7dmFyaWFibGUubGFiZWx9YCxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLnNldChjYWNoZUtleSwgY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIFxuICAvKiogR2V0IGZvcm0gZ3JvdXAgZm9yIGEgdmFyaWFibGUgYnkgbmFtZSAqL1xuICBnZXRWYXJpYWJsZUZvcm1Hcm91cCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IEZvcm1Hcm91cCB8IG51bGwge1xuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqIEFkZCBhIG5ldyB2YXJpYWJsZSB0byB0aGUgZm9ybSBhcnJheSBkeW5hbWljYWxseSAqL1xuICBhZGRWYXJpYWJsZSh2YXJpYWJsZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgPyAodmFyaWFibGUudmFsdWUgPT09IHRydWUgfHwgdmFyaWFibGUudmFsdWUgPT09ICd0cnVlJyB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gMSlcbiAgICAgIDogKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICBcbiAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbdmFyaWFibGUubmFtZV0sXG4gICAgICB2YWx1ZTogW2RlZmF1bHRWYWx1ZV0sXG4gICAgICB0eXBlOiBbdmFyaWFibGUudHlwZSB8fCAnc3RyaW5nJ10sXG4gICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXSxcbiAgICAgIG9wdGlvbnM6IFt2YXJpYWJsZS5vcHRpb25zIHx8IFtdXVxuICAgIH0pO1xuICAgIFxuICAgIC8vIEFkZCBkYXRhVHlwZSBjb250cm9sIGZvciB0ZXN0LWRhdGEgdmFyaWFibGVzIGlmIG5lZWRlZFxuICAgIGNvbnN0IGxhYmVsID0gdmFyaWFibGUubGFiZWw/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgaWYgKGxhYmVsID09PSAndGVzdF9kYXRhJyB8fCBsYWJlbCA9PT0gJ3NvdXJjZS12YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXQtdmFsdWUnIHx8IFxuICAgICAgICBsYWJlbCA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgbGFiZWwgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICBjb25zdCB2YWx1ZVN0ciA9IFN0cmluZyhkZWZhdWx0VmFsdWUgfHwgJycpO1xuICAgICAgbGV0IGRhdGFUeXBlID0gJ3BsYWluLXRleHQnO1xuICAgICAgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICBkYXRhVHlwZSA9ICdwYXJhbWV0ZXInO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgZGF0YVR5cGUgPSAncnVudGltZSc7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICBkYXRhVHlwZSA9ICdlbnZpcm9ubWVudCc7XG4gICAgICB9XG4gICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGRhdGFUeXBlKSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgfVxuXG4gIG9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwib25WYXJpYWJsZVZhbHVlQ2hhbmdlXCIsIHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXkgKHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHRvIHByZXZlbnQgdHJpZ2dlcmluZyB2YWx1ZUNoYW5nZXMpXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgLy8gSW52YWxpZGF0ZSBmb3JtIHZhbGlkYXRpb24gY2FjaGVcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgLy8gVXBkYXRlIEhUTUwgZ3JhbW1hciB3aXRoIG5ldyB2YWx1ZVxuICAgIHRoaXMudXBkYXRlSHRtbEdyYW1tYXIoKTtcbiAgfVxuXG4gIG9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXkgKHVzZSBlbWl0RXZlbnQ6IGZhbHNlIHRvIHByZXZlbnQgdHJpZ2dlcmluZyB2YWx1ZUNoYW5nZXMpXG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBmb3JtIGdyb3VwIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW3ZhcmlhYmxlTmFtZV0sXG4gICAgICAgIHZhbHVlOiBbdmFsdWVdLFxuICAgICAgICB0eXBlOiBbJ2Jvb2xlYW4nXSxcbiAgICAgICAgbGFiZWw6IFt2YXJpYWJsZT8ubGFiZWwgfHwgJyddLFxuICAgICAgICBvcHRpb25zOiBbdmFyaWFibGU/Lm9wdGlvbnMgfHwgW11dXG4gICAgICB9KTtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkYXRlIGZvcm0gdmFsaWRhdGlvbiBjYWNoZVxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgICAvLyBVcGRhdGUgSFRNTCBncmFtbWFyIHdpdGggbmV3IHZhbHVlXG4gICAgdGhpcy51cGRhdGVIdG1sR3JhbW1hcigpO1xuICB9XG5cbiAgb25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uQWR2YW5jZWRWYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiBhZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpPy52YWx1ZSA9PT0gdmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICBpZiAodmFyaWFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmF0KHZhcmlhYmxlSW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIC8vIEZvciBzdHJfbGlzdCwgdGhlIEZvcm1BcnJheSBpcyBhbHJlYWR5IG1hbmFnZWQgaW5zaWRlIEFkdmFuY2VkVmFyaWFibGVzRm9ybUNvbXBvbmVudCxcbiAgICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVidWlsZCBvciB1cGRhdGUgaXQgaGVyZSB0byBhdm9pZCBmb2N1cyBsb3NzLlxuICAgICAgaWYgKHZhcmlhYmxlPy50eXBlICE9PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2VUZW1wbGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5wcmV2aW91c1RlbXBsYXRlRm9yRWRpdCA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gbnVsbDtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gW107XG4gICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSAnJztcbiAgICB0aGlzLmFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgICAvLyBDbGVhciBmb3JtIGFycmF5c1xuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25DYW5jZWxUZW1wbGF0ZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMucHJldmlvdXNUZW1wbGF0ZUZvckVkaXQpIHtcbiAgICAgIHRoaXMuc2VsZWN0VGVtcGxhdGUodGhpcy5wcmV2aW91c1RlbXBsYXRlRm9yRWRpdCk7XG4gICAgfVxuICB9XG5cbiAgb25CYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IG51bGw7XG4gICAgdGhpcy5tZXRhZGF0YSA9ICcnO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSAnJztcbiAgICB0aGlzLmFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gW107XG4gICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSAnJztcbiAgICAvLyBDbGVhciBmb3JtIGFycmF5c1xuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cbiAgICAvLyBSZWFwcGx5IGZpbHRlciB0byBtYWludGFpbiBzZWFyY2ggc3RhdGVcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSkgdGhpcy5vbkJhY2soKTtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBVc2UgY2FjaGVkIHJlc3VsdCBpZiBhdmFpbGFibGUgYW5kIHJlY2VudFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuZm9ybVZhbGlkQ2FjaGUgJiYgKG5vdyAtIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSkgPCB0aGlzLkZPUk1fVkFMSURBVElPTl9DQUNIRV9NUykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybVZhbGlkQ2FjaGU7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGlmIGFsbCByZXF1aXJlZCB2YXJpYWJsZXMgYXJlIGZpbGxlZDpcbiAgICAvLyBGb3IgYW55IHRlbXBsYXRlIHZhcmlhYmxlIHdpdGggZGF0YUtleSAndGVzdF9kYXRhJyB8ICdzb3VyY2VfdmFsdWUnIHwgJ3RhcmdldF92YWx1ZSdcbiAgICAvLyBBTkQgZGF0YVR5cGUgJ3BsYWluLXRleHQnIG9yICdydW50aW1lJywgdGhlIHVuZGVybHlpbmcgdmFsdWUgbXVzdCBiZSBub24tZW1wdHkuXG4gICAgbGV0IGN1c3RvbVZhcmlhYmxlc1ZhbGlkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGN1c3RvbVZhcmlhYmxlc1ZhbGlkID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5ldmVyeSh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5kYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAnc291cmNlX3ZhbHVlJyB8fCB2YXJpYWJsZS5kYXRhS2V5ID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICAgIGlmICh2YXJpYWJsZS5kYXRhVHlwZSA9PT0gJ3BsYWluLXRleHQnIHx8IHZhcmlhYmxlLmRhdGFUeXBlID09PSAncnVudGltZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29tYmluZSByZWFjdGl2ZSBmb3JtIHZhbGlkaXR5IHdpdGggY3VzdG9tIHZhcmlhYmxlIHZhbGlkYXRpb25cbiAgICBjb25zdCByZWFjdGl2ZVZhbGlkID0gdGhpcy52YXJpYWJsZXNGb3JtLnZhbGlkICYmIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnZhbGlkO1xuICAgIGNvbnN0IGZpbmFsVmFsaWQgPSByZWFjdGl2ZVZhbGlkICYmIGN1c3RvbVZhcmlhYmxlc1ZhbGlkO1xuXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmaW5hbFZhbGlkO1xuICAgIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSA9IG5vdztcbiAgICByZXR1cm4gZmluYWxWYWxpZDtcbiAgfVxuICBcbiAgdHJhY2tCeVRlbXBsYXRlKGluZGV4OiBudW1iZXIsIHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSk6IGFueSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmlkIHx8IHRlbXBsYXRlLmRpc3BsYXlOYW1lIHx8IGluZGV4O1xuICB9XG4gIFxuICB0cmFja0J5VmFyaWFibGUoaW5kZXg6IG51bWJlciwgdmFyaWFibGU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLm5hbWUgfHwgaW5kZXg7XG4gIH1cblxuICBvbkNyZWF0ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gR2V0IGVudmlyb25tZW50IElEcyBmcm9tIHRlbXBsYXRlIHZhcmlhYmxlcyAoaWYgYW55IGVudmlyb25tZW50IHR5cGUgdmFyaWFibGVzIGFyZSBzZWxlY3RlZClcbiAgICBjb25zdCBlbnZpcm9ubWVudElkcyA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtPy5nZXRFbnZpcm9ubWVudElkc0ZvclZhcmlhYmxlcygpIHx8IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgY29uc3QgY3VycmVudFRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5nZXRDdXJyZW50VGVtcGxhdGVWYXJpYWJsZXMoKTtcbiAgICBcbiAgICAvLyBTeW5jIGFkdmFuY2VkIHZhcmlhYmxlcyBmcm9tIGZvcm0gdG8gYXJyYXlcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKGZvcm1Hcm91cCkge1xuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSBmb3JtR3JvdXAuZ2V0KCd2YWx1ZScpPy52YWx1ZTtcbiAgICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdzdHJfbGlzdCcgJiYgZm9ybVZhbHVlIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCB2YWx1ZXMgZnJvbSBGb3JtQXJyYXlcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZS5jb250cm9scy5tYXAoY29udHJvbCA9PiBjb250cm9sLnZhbHVlKS5maWx0ZXIoKHZhbDogc3RyaW5nKSA9PiB2YWwgJiYgdmFsLnRyaW0oKSAhPT0gJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybVZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgY29uc3Qgc3RlcERhdGEgPSB7XG4gICAgICB0ZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFRlbXBsYXRlLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRlbXBsYXRlVmFyaWFibGVzOiBjdXJyZW50VGVtcGxhdGVWYXJpYWJsZXMsXG4gICAgICAvLyB0ZXN0RGF0YUxpc3Q6IHRoaXMuYnVpbGRUZXN0RGF0YUxpc3QoY3VycmVudFRlbXBsYXRlVmFyaWFibGVzKSxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyxcbiAgICAgIGVudmlyb25tZW50SWRzOiBlbnZpcm9ubWVudElkcyAvLyBNYXAgb2YgdmFyaWFibGUgbmFtZSB0byBlbnZpcm9ubWVudCBJRFxuICAgIH07XG4gICAgY29uc29sZS5sb2coXCJzdGVwRGF0YVwiLCBzdGVwRGF0YSk7XG4gICAgY29uc29sZS5sb2coXCJ2YXJpYWJsZXNGb3JtXCIsIHRoaXMudmFyaWFibGVzRm9ybS52YWx1ZSk7XG4gICAgY29uc29sZS5sb2coXCJhZHZhbmNlZFZhcmlhYmxlc0Zvcm1cIiwgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0udmFsdWUpO1xuICAgIGNvbnNvbGUubG9nKFwiZW52aXJvbm1lbnRJZHNcIiwgZW52aXJvbm1lbnRJZHMpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFRlbXBsYXRlVmFyaWFibGVzKCk6IFRlbXBsYXRlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgY2hpbGRWYXJpYWJsZXMgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybT8udGVtcGxhdGVWYXJpYWJsZXM7XG4gICAgaWYgKGNoaWxkVmFyaWFibGVzICYmIGNoaWxkVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBjaGlsZFZhcmlhYmxlcztcbiAgICAgIHJldHVybiBjaGlsZFZhcmlhYmxlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgfHwgW107XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVGVzdERhdGFMaXN0KHZhcmlhYmxlczogVGVtcGxhdGVWYXJpYWJsZVtdKTogU3RlcFRlc3REYXRhTGlzdEl0ZW1bXSB7XG4gICAgY29uc3QgdGVzdERhdGFMaXN0OiBTdGVwVGVzdERhdGFMaXN0SXRlbVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcyB8fCBbXSkge1xuICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB2YXJpYWJsZT8udmFsdWU7XG4gICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBmb3JtYXR0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBmb3JtYXR0ZWRWYWx1ZSA9PT0gJycpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5yZXNvbHZlVmFyaWFibGVUZXN0RGF0YVZhbHVlKHZhcmlhYmxlKTtcbiAgICAgIGlmICghaXRlbS50ZXN0RGF0YSkgY29udGludWU7XG4gICAgICB0ZXN0RGF0YUxpc3QucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVzdERhdGFMaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlVmFyaWFibGVUZXN0RGF0YVZhbHVlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogU3RlcFRlc3REYXRhTGlzdEl0ZW0ge1xuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdmFyaWFibGU/LnZhbHVlICE9IG51bGwgPyBTdHJpbmcodmFyaWFibGUudmFsdWUpIDogJyc7XG4gICAgY29uc3QgcmF3VmFsdWUgPSB2YXJpYWJsZT8ucmF3VmFsdWUgIT0gbnVsbCAmJiBTdHJpbmcodmFyaWFibGUucmF3VmFsdWUpICE9PSAnJyA/IFN0cmluZyh2YXJpYWJsZS5yYXdWYWx1ZSkgOiBmb3JtYXR0ZWRWYWx1ZTtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlPy5kYXRhVHlwZSB8fCB0aGlzLnBhcnNlVmFyaWFibGVEYXRhVHlwZShmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHRoaXMucmVzb2x2ZVNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQodmFyaWFibGUpO1xuXG4gICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YVR5cGU6ICdwYXJhbWV0ZXInLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgLi4uKHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJiB7IHRlc3REYXRhUHJvZmlsZUlkOiBzZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkIH0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YVR5cGUgPT09ICdydW50aW1lJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgdGVzdERhdGFUeXBlOiAncnVudGltZScsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgdGVzdERhdGFUeXBlOiAnZW52aXJvbm1lbnQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVzdERhdGE6IGZvcm1hdHRlZFZhbHVlLFxuICAgICAgdGVzdERhdGFLZXk6IHZhcmlhYmxlLm5hbWUsXG4gICAgICB0ZXN0RGF0YVR5cGU6ICdyYXcnLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmICFpc05hTihOdW1iZXIodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCkpKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybT8uZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlVmFsdWUgPSB2YXJpYWJsZUdyb3VwPy5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuXG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZVZhbHVlICE9IG51bGwgJiYgc2VsZWN0ZWRQcm9maWxlVmFsdWUgIT09ICcnICYmICFpc05hTihOdW1iZXIoc2VsZWN0ZWRQcm9maWxlVmFsdWUpKSkge1xuICAgICAgcmV0dXJuIE51bWJlcihzZWxlY3RlZFByb2ZpbGVWYWx1ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlTmFtZSA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8IHNlbGVjdGVkUHJvZmlsZVZhbHVlO1xuICAgIGlmIChzZWxlY3RlZFByb2ZpbGVOYW1lICE9IG51bGwgJiYgc2VsZWN0ZWRQcm9maWxlTmFtZSAhPT0gJycpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBwcm9maWxlTmFtZSA9PT0gc2VsZWN0ZWRQcm9maWxlTmFtZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKG1hdGNoaW5nUHJvZmlsZT8uaWQgIT0gbnVsbCAmJiAhaXNOYU4oTnVtYmVyKG1hdGNoaW5nUHJvZmlsZS5pZCkpKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hpbmdQcm9maWxlLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVZhcmlhYmxlRGF0YVR5cGUodmFsdWU6IHN0cmluZyk6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JyB7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkgcmV0dXJuICdwYXJhbWV0ZXInO1xuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlLmVuZHNXaXRoKCd8JykpIHJldHVybiAncnVudGltZSc7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkgcmV0dXJuICdlbnZpcm9ubWVudCc7XG4gICAgcmV0dXJuICdwbGFpbi10ZXh0JztcbiAgfVxuXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuXG4gIG9uRWxlbWVudENsaWNrKGVsZW1lbnRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZvY3VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGZpZWxkXG4gICAgLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgdG8gc2Nyb2xsIHRvIG9yIGhpZ2hsaWdodCB0aGUgZmllbGRcbiAgfVxuXG4gIG9uRWxlbWVudFZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBvblRlc3REYXRhVmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgSFRNTCBncmFtbWFyIGJ5IHJlcGxhY2luZyBwbGFjZWhvbGRlciBzcGFucyB3aXRoIGFjdHVhbCB2YXJpYWJsZSB2YWx1ZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlSHRtbEdyYW1tYXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVGVtcGxhdGUpIHtcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaHRtbEdyYW1tYXIgPSB0aGlzLnNlbGVjdGVkVGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgdGhpcy5zZWxlY3RlZFRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnO1xuICAgIGlmICghaHRtbEdyYW1tYXIpIHtcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbWFwIG9mIHZhcmlhYmxlIHZhbHVlcyBieSBuYW1lIGZvciBxdWljayBsb29rdXBcbiAgICBjb25zdCB2YWx1ZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnRlbXBsYXRlVmFyaWFibGVzKSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5uYW1lICYmIHZhcmlhYmxlLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFyaWFibGUudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IHZhbHVlIHRvIHN0cmluZywgaGFuZGxpbmcgYm9vbGVhbiB2YWx1ZXNcbiAgICAgICAgICBsZXQgdmFsdWVTdHIgPSAnJztcbiAgICAgICAgICBpZiAodHlwZW9mIHZhcmlhYmxlLnZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHZhbHVlU3RyID0gdmFyaWFibGUudmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnICYmIHZhcmlhYmxlLm5hbWUgIT09ICdzZWxlY3RvcicpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdXNlIGVsZW1lbnROYW1lIGlmIGl0J3MgZGVmaW5lZCBhbmQgbm90IGVtcHR5XG4gICAgICAgICAgICBpZiAodmFyaWFibGUuZWxlbWVudE5hbWUgIT09IHVuZGVmaW5lZCAmJiB2YXJpYWJsZS5lbGVtZW50TmFtZSAhPT0gbnVsbCAmJiB2YXJpYWJsZS5lbGVtZW50TmFtZSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgdmFsdWVTdHIgPSBTdHJpbmcodmFyaWFibGUuZWxlbWVudE5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHZhcmlhYmxlIC0gZG9uJ3QgYWRkIHRvIG1hcCBpZiBlbGVtZW50IGlzIG5vdCBzZWxlY3RlZFxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh2YXJpYWJsZS5kYXRhS2V5ID09PSAnZWxlbWVudCcgJiYgdmFyaWFibGUubmFtZSA9PT0gJ3NlbGVjdG9yJykge1xuICAgICAgICAgICAgLy8gT25seSB1c2UgZWxlbWVudExvY2F0b3IgaWYgaXQncyBkZWZpbmVkIGFuZCBub3QgZW1wdHlcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5lbGVtZW50TG9jYXRvciAhPT0gdW5kZWZpbmVkICYmIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yICE9PSBudWxsICYmIHZhcmlhYmxlLmVsZW1lbnRMb2NhdG9yICE9PSAnJykge1xuICAgICAgICAgICAgICB2YWx1ZVN0ciA9IFN0cmluZyh2YXJpYWJsZS5lbGVtZW50TG9jYXRvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgdmFyaWFibGUgLSBkb24ndCBhZGQgdG8gbWFwIGlmIGVsZW1lbnQgbG9jYXRvciBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVTdHIgPSBTdHJpbmcodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBPbmx5IGFkZCB0byBtYXAgaWYgdmFsdWVTdHIgaXMgbm90IGVtcHR5IGFuZCBub3QgXCJ1bmRlZmluZWRcIlxuICAgICAgICAgIGlmICh2YWx1ZVN0ciAmJiB2YWx1ZVN0ciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWVTdHIudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgdmFsdWVNYXAuc2V0KHZhcmlhYmxlLm5hbWUsIHZhbHVlU3RyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFVzZSBicm93c2VyJ3MgRE9NUGFyc2VyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxiYWNrIHRvIHN0cmluZyByZXBsYWNlbWVudFxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuXG4gICAgICAgIC8vIEZpbmQgYWxsIHNwYW5zIHdpdGggZGF0YS1ldmVudC1rZXkgYXR0cmlidXRlXG4gICAgICAgIGNvbnN0IHNwYW5zID0gdGVtcERpdi5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50Pignc3BhbltkYXRhLWV2ZW50LWtleV0nKTtcbiAgICAgICAgc3BhbnMuZm9yRWFjaCgoc3BhbjogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBldmVudEtleSA9IHNwYW4uZ2V0QXR0cmlidXRlKCdkYXRhLWV2ZW50LWtleScpO1xuICAgICAgICAgIGlmIChldmVudEtleSAmJiB2YWx1ZU1hcC5oYXMoZXZlbnRLZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlTWFwLmdldChldmVudEtleSk7XG4gICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBpZiB2YWx1ZSBpcyB2YWxpZCAobm90IHVuZGVmaW5lZCwgbm90IGVtcHR5KVxuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBzcGFuIHN0cnVjdHVyZSBidXQgdXBkYXRlIHRoZSBjb250ZW50XG4gICAgICAgICAgICAgIHNwYW4uaW5uZXJIVE1MID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB2YWx1ZSBpcyBpbnZhbGlkLCBsZWF2ZSB0aGUgc3BhbiBjb250ZW50IGFzIGlzIChkb24ndCByZXBsYWNlIHdpdGggdW5kZWZpbmVkKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSB0ZW1wRGl2LmlubmVySFRNTDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHVwZGF0aW5nIEhUTUwgZ3JhbW1hcjonLCBlcnJvcik7XG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIG9yaWdpbmFsIEhUTUwgZ3JhbW1hclxuICAgICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9IFN0cmluZyhodG1sR3JhbW1hcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrOiBzaW1wbGUgc3RyaW5nIHJlcGxhY2VtZW50IGZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICAgIGxldCB1cGRhdGVkSHRtbCA9IFN0cmluZyhodG1sR3JhbW1hcik7XG4gICAgICB2YWx1ZU1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIC8vIE9ubHkgcmVwbGFjZSBpZiB2YWx1ZSBpcyB2YWxpZCAobm90IHVuZGVmaW5lZCwgbm90IGVtcHR5KVxuICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAvLyBSZXBsYWNlIHNwYW5zIHdpdGggZGF0YS1ldmVudC1rZXkgbWF0Y2hpbmcgdGhlIHZhcmlhYmxlIG5hbWVcbiAgICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYDxzcGFuW14+XSpkYXRhLWV2ZW50LWtleT1cIiR7a2V5fVwiW14+XSo+Lio/PC9zcGFuPmAsICdnaScpO1xuICAgICAgICAgIHVwZGF0ZWRIdG1sID0gdXBkYXRlZEh0bWwucmVwbGFjZShyZWdleCwgKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBjb250ZW50IGluc2lkZSB0aGUgc3BhblxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoLnJlcGxhY2UoLz4uKj88LywgYD4ke3ZhbHVlfTxgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9IHVwZGF0ZWRIdG1sO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzZWxlY3RvciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXNcbiAgICovXG4gIGdldCBzZWxlY3RvclZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB2LmRhdGFLZXkgPT09ICdlbGVtZW50JyB8fCB2LmRhdGFLZXkgPT09ICdsYWJlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHBhcmFtZXRlciB2YXJpYWJsZSBpcyBhdmFpbGFibGUgKHRlc3REYXRhIHdpdGggcGFyYW1ldGVyIHR5cGUpXG4gICAqL1xuICBnZXQgcGFyYW1ldGVyVmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFLZXkgPSB2LmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAoZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgLy8gY29uc3QgZGF0YVR5cGUgPSB0aGlzLnZhcmlhYmxlRGF0YVR5cGVzLmdldCh2Lm5hbWUpIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgYXZhaWxhYmxlICh0ZXN0RGF0YSB3aXRoIGVudmlyb25tZW50IHR5cGUpXG4gICAqL1xuICBnZXQgZW52aXJvbm1lbnRWYXJpYWJsZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5zb21lKHYgPT4ge1xuICAgICAgY29uc3QgZGF0YUtleSA9IHYuZGF0YUtleT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGlmIChkYXRhS2V5ID09PSAndGVzdF9kYXRhJyB8fCBkYXRhS2V5ID09PSAnc291cmNlX3ZhbHVlJyB8fCBkYXRhS2V5ID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICAvLyBjb25zdCBkYXRhVHlwZSA9IHRoaXMudmFyaWFibGVEYXRhVHlwZXMuZ2V0KHYubmFtZSkgfHwgJ3BsYWluLXRleHQnO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWJnLXdoaXRlIGNxYS1wLVsxNnB4XVwiIFtuZ0NsYXNzXT1cInsnY3FhLXB4LTQnOiBzaG93SGVhZGVyLCAnY3FhLXB5LTInOiBzaG93SGVhZGVyICYmICFzZWxlY3RlZFRlbXBsYXRlfVwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgXG4gIDxkaXYgKm5nSWY9XCJzaG93SGVhZGVyXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTJcIj5cbiAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtYmxhY2stMTAwIGNxYS1tLTBcIj5cbiAgICAgIHt7IGlzRWRpdE1vZGUgPyAnRWRpdCBhbiBhY3Rpb24gc3RlcCcgOiAnQ3JlYXRlIGFuIGFjdGlvbiBzdGVwJyB9fVxuICAgIDwvaDI+XG4gICAgPGNxYS1idXR0b25cbiAgICAgICpuZ0lmPVwiaXNFZGl0TW9kZSAmJiBzZWxlY3RlZFRlbXBsYXRlXCJcbiAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICBidG5TaXplPVwic21cIlxuICAgICAgaWNvbj1cInN3YXBfaG9yaXpcIlxuICAgICAgdGV4dD1cIkNoYW5nZSBUZW1wbGF0ZVwiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNoYW5nZVRlbXBsYXRlKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gICAgPGNxYS1idXR0b25cbiAgICAgICpuZ0lmPVwiaXNFZGl0TW9kZSAmJiAhc2VsZWN0ZWRUZW1wbGF0ZVwiXG4gICAgICB2YXJpYW50PVwidGV4dFwiXG4gICAgICBidG5TaXplPVwic21cIlxuICAgICAgdGV4dD1cIkNhbmNlbFwiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbFRlbXBsYXRlU2VsZWN0aW9uKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiIXNlbGVjdGVkVGVtcGxhdGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1mbGV4LTFcIlxuICAgIFtuZ0NsYXNzXT1cInsnY3FhLXB4LTMnOiBzaG93SGVhZGVyfVwiPlxuXG4gICAgPCEtLSBTZWFyY2ggQmFyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtcGItMVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wYi0xXCIgKm5nSWY9XCJzaG93SGVhZGVyXCI+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgVGVtcGxhdGUgbGlicmFyeVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjcWEtc2VhcmNoLWJhciBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIiBbZnVsbFdpZHRoXT1cInRydWVcIiBbdmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TZWFyY2hDaGFuZ2UoJGV2ZW50KVwiIChzZWFyY2gpPVwib25TZWFyY2hTdWJtaXQoJGV2ZW50KVwiIChjbGVhcmVkKT1cIm9uU2VhcmNoQ2xlYXJlZCgpXCI+XG4gICAgICA8L2NxYS1zZWFyY2gtYmFyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUZW1wbGF0ZSBMaXN0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLXB4LTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcHktMlwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB0ZW1wbGF0ZSBvZiBmaWx0ZXJlZFRlbXBsYXRlczsgdHJhY2tCeTogdHJhY2tCeVRlbXBsYXRlXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1hY3Rpb24tZm9ybWF0IGNxYS1iZy13aGl0ZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tYWxsIGhvdmVyOmNxYS1ib3JkZXItYmx1ZS01MDAgaG92ZXI6Y3FhLXNoYWRvdy1zbSBtYi02XCJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGVtcGxhdGUodGVtcGxhdGUpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjNweF0gY3FhLXRleHQtYmxhY2stMTAwXCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwidGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgdGVtcGxhdGUubmF0dXJhbFRleHQgfHwgJydcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcmVkVGVtcGxhdGVzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS1weS04IGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LVsxMnB4XVwiPlxuICAgICAgICAgIE5vIHRlbXBsYXRlcyBmb3VuZFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRUZW1wbGF0ZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1vdmVyZmxvdy15LWF1dG9cIiBzdHlsZT1cImZsZXg6IDEgMSAwICFpbXBvcnRhbnQ7XCI+XG4gICAgPCEtLSBJbnN0cnVjdGlvbiBUZXh0IHdpdGggRWxlbWVudCBCdXR0b25zIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItMiBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0xIGNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1weS0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFjdGlvbi1mb3JtYXQgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyM3B4XSBjcWEtdGV4dC1ibGFjay0xMDBcIlxuICAgICAgICBbaW5uZXJIVE1MXT1cInVwZGF0ZWRIdG1sR3JhbW1hciB8fCBzZWxlY3RlZFRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHNlbGVjdGVkVGVtcGxhdGUubmF0dXJhbFRleHQgfHwgJydcIj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWp1c3RpZnktZW5kIGNxYS1wdC0yIGNxYS1nYXAtMlwiICpuZ0lmPVwiIWNyZWF0ZUVsZW1lbnRWaXNpYmxlXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIFxuICAgICAgICAgICpuZ0lmPVwic2VsZWN0b3JWYXJpYWJsZUF2YWlsYWJsZVwiXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCIgXG4gICAgICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICB0ZXh0PVwiQ3JlYXRlIEVsZW1lbnRcIlxuICAgICAgICAgIChjbGlja2VkKT1cIm9uU2hvd0VsZW1lbnRGb3JtKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cInBhcmFtZXRlclZhcmlhYmxlQXZhaWxhYmxlXCJcbiAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIiBcbiAgICAgICAgICBidG5TaXplPVwic21cIlxuICAgICAgICAgIGljb249XCJhZGRcIlxuICAgICAgICAgIHRleHQ9XCJDcmVhdGUgUGFyYW1ldGVyXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJyZWRpcmVjdFRvUGFyYW1ldGVyLmVtaXQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtYnV0dG9uIFxuICAgICAgICAgICpuZ0lmPVwiZW52aXJvbm1lbnRWYXJpYWJsZUF2YWlsYWJsZVwiXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCIgXG4gICAgICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICB0ZXh0PVwiQ3JlYXRlIEVudmlyb25tZW50XCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJyZWRpcmVjdFRvRW52aXJvbm1lbnQuZW1pdCgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGb3JtIEZpZWxkcyBpbiBUd28gQ29sdW1ucyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLW92ZXJmbG93LXktYXV0byBjcWEtZmxleC0xIGNxYS1wYi0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLXgtNiBjcWEtZmxleC13cmFwIGNxYS1wYi00XCI+XG4gICAgICAgICAgPCEtLSBUZW1wbGF0ZSBWYXJpYWJsZXMgRm9ybSBDb21wb25lbnQgLS0+XG4gICAgICAgICAgPGNxYS10ZW1wbGF0ZS12YXJpYWJsZXMtZm9ybVxuICAgICAgICAgICAgI3RlbXBsYXRlVmFyaWFibGVzRm9ybVxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIlxuICAgICAgICAgICAgW2lzRGVidWddPVwiaXNEZWJ1Z1wiXG4gICAgICAgICAgICBbdGVtcGxhdGVWYXJpYWJsZXNdPVwidGVtcGxhdGVWYXJpYWJsZXNcIlxuICAgICAgICAgICAgW3ZhcmlhYmxlc0Zvcm1dPVwidmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICBbbWV0YWRhdGFdPVwibWV0YWRhdGFcIlxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgIFtlbGVtZW50T3B0aW9uc109XCJlbGVtZW50T3B0aW9uc1wiXG4gICAgICAgICAgICBbaGFzTW9yZUVsZW1lbnRzXT1cImhhc01vcmVFbGVtZW50c1wiXG4gICAgICAgICAgICBbaXNMb2FkaW5nRWxlbWVudHNdPVwiaXNMb2FkaW5nRWxlbWVudHNcIlxuICAgICAgICAgICAgW3NjcmVlbk5hbWVPcHRpb25zXT1cInNjcmVlbk5hbWVPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlU2NyZWVuTmFtZXNdPVwiaGFzTW9yZVNjcmVlbk5hbWVzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdTY3JlZW5OYW1lc109XCJpc0xvYWRpbmdTY3JlZW5OYW1lc1wiXG4gICAgICAgICAgICBbcGFyYW1ldGVyT3B0aW9uc109XCJwYXJhbWV0ZXJPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlUGFyYW1ldGVyc109XCJoYXNNb3JlUGFyYW1ldGVyc1wiXG4gICAgICAgICAgICBbaXNMb2FkaW5nUGFyYW1ldGVyc109XCJpc0xvYWRpbmdQYXJhbWV0ZXJzXCJcbiAgICAgICAgICAgIFt1cGxvYWRPcHRpb25zXT1cInVwbG9hZE9wdGlvbnNcIlxuICAgICAgICAgICAgW2hhc01vcmVVcGxvYWRzXT1cImhhc01vcmVVcGxvYWRzXCJcbiAgICAgICAgICAgIFtpc0xvYWRpbmdVcGxvYWRzXT1cImlzTG9hZGluZ1VwbG9hZHNcIlxuICAgICAgICAgICAgW2Vudmlyb25tZW50T3B0aW9uc109XCJlbnZpcm9ubWVudE9wdGlvbnNcIlxuICAgICAgICAgICAgW2hhc01vcmVFbnZpcm9ubWVudHNdPVwiaGFzTW9yZUVudmlyb25tZW50c1wiXG4gICAgICAgICAgICBbaXNMb2FkaW5nRW52aXJvbm1lbnRzXT1cImlzTG9hZGluZ0Vudmlyb25tZW50c1wiXG4gICAgICAgICAgICBbZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkXT1cImRlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZFwiXG4gICAgICAgICAgICBbZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleF09XCJkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4XCJcbiAgICAgICAgICAgIFtjcmVhdGVFbGVtZW50VmlzaWJsZV09XCJjcmVhdGVFbGVtZW50VmlzaWJsZVwiXG4gICAgICAgICAgICAodmFyaWFibGVWYWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKHZhcmlhYmxlQm9vbGVhbkNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAobWV0YWRhdGFDaGFuZ2UpPVwibWV0YWRhdGEgPSAkZXZlbnRcIlxuICAgICAgICAgICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cImRlc2NyaXB0aW9uID0gJGV2ZW50XCJcbiAgICAgICAgICAgIChsb2FkTW9yZUVsZW1lbnRzKT1cImxvYWRNb3JlRWxlbWVudHMuZW1pdCgpXCJcbiAgICAgICAgICAgIChzZWFyY2hFbGVtZW50cyk9XCJzZWFyY2hFbGVtZW50cy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lKT1cInNlYXJjaEVsZW1lbnRzQnlTY3JlZW5OYW1lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY3JlYXRlRWxlbWVudCk9XCJjcmVhdGVFbGVtZW50LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VhcmNoU2NyZWVuTmFtZSk9XCJzZWFyY2hTY3JlZW5OYW1lLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmVTY3JlZW5OYW1lcyk9XCJsb2FkTW9yZVNjcmVlbk5hbWVzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QpPVwiY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWFyY2hQYXJhbWV0ZXJzKT1cInNlYXJjaFBhcmFtZXRlcnMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZVBhcmFtZXRlcnMpPVwibG9hZE1vcmVQYXJhbWV0ZXJzLmVtaXQoKVwiXG4gICAgICAgICAgICAoc2VhcmNoVXBsb2Fkcyk9XCJzZWFyY2hVcGxvYWRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmVVcGxvYWRzKT1cImxvYWRNb3JlVXBsb2Fkcy5lbWl0KClcIlxuICAgICAgICAgICAgKHNlYXJjaEVudmlyb25tZW50cyk9XCJzZWFyY2hFbnZpcm9ubWVudHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZUVudmlyb25tZW50cyk9XCJsb2FkTW9yZUVudmlyb25tZW50cy5lbWl0KClcIlxuICAgICAgICAgICAgKGVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZSk9XCJvbkVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQWR2YW5jZWQgKEV4cGFuZGFibGUpIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiAgY3FhLWdhcC0yIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcC0wIGNxYS1tYi0xLjVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQWR2YW5jZWQoKVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XVwiPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1iYXNlXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImFkdmFuY2VkRXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgICBleHBhbmRfbW9yZVxuICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWR2YW5jZWRFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLW10LTJcIj5cbiAgICAgICAgICAgICAgPGNxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybSBcbiAgICAgICAgICAgICAgICBbYWR2YW5jZWRWYXJpYWJsZXNdPVwiYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1wiXG4gICAgICAgICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVGb3JtXT1cImFkdmFuY2VkVmFyaWFibGVzRm9ybVwiXG4gICAgICAgICAgICAgICAgKHZhcmlhYmxlQm9vbGVhbkNoYW5nZSk9XCJvbkFkdmFuY2VkVmFyaWFibGVCb29sZWFuQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAodmFyaWFibGVWYWx1ZUNoYW5nZSk9XCJvbkFkdmFuY2VkVmFyaWFibGVWYWx1ZUNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiPlxuICAgICAgICAgICAgICA8L2NxYS1hZHZhbmNlZC12YXJpYWJsZXMtZm9ybT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PiBcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICBcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuXG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhY3JlYXRlRWxlbWVudFZpc2libGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS13LWZ1bGwgY3FhLWdhcC0yIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWdyYXktMjAwIGNxYS1wYi0yXCI+XG4gICAgICA8Y3FhLWJ1dHRvbiBjbGFzcz1cImNxYS13LTEvMlwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHRleHQ9XCJDYW5jZWxcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8Y3FhLWJ1dHRvbiAqbmdJZj1cIiFpc0NyZWF0aW5nU3RlcFwiIGNsYXNzPVwiY3FhLXctMS8yXCIgdmFyaWFudD1cImZpbGxlZFwiIFt0ZXh0XT1cImlzRWRpdE1vZGUgPyAnVXBkYXRlIFN0ZXAnIDogJ0NyZWF0ZSBTdGVwJ1wiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhaXNGb3JtVmFsaWQoKVwiXG4gICAgICAgIChjbGlja2VkKT1cIm9uQ3JlYXRlU3RlcCgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8IS0tIExvYWRlciBzbG90OiBzYW1lIHNpemUgYXMgQ3JlYXRlIFN0ZXAgYnV0dG9uIChsZzogMzhweCBoZWlnaHQsIGZ1bGwgd2lkdGgsIHJvdW5kZWQtWzhweF0pIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImlzQ3JlYXRpbmdTdGVwXCIgY2xhc3M9XCJjcWEtdy0xLzIgY3FhLWZsZXgtMSBjcWEtbWluLWgtWzM4cHhdIGNxYS1yb3VuZGVkLVs4cHhdXCI+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICBsYWJlbD1cIkNyZWF0aW5n4oCmXCJcbiAgICAgICAgICBpY29uPVwiYXV0b3JlbmV3XCJcbiAgICAgICAgICBbaXNMb2FkaW5nXT1cInRydWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgW2NlbnRlckNvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgW2lubGluZVN0eWxlc109XCInbWluLWhlaWdodDogMzhweDsgaGVpZ2h0OiAzOHB4OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsnXCJcbiAgICAgICAgICB2YXJpYW50PVwiaW5mb1wiXG4gICAgICAgICAgc2l6ZT1cIm1lZGl1bVwiPlxuICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
936
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvSCxPQUFPLEVBQTBCLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdoRixPQUFPLEVBQW9CLDhCQUE4QixFQUFFLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7Ozs7QUF5RGhJLE1BQU0sT0FBTywwQkFBMEI7SUFvSHJDLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBbkgxQixlQUFVLEdBQVksSUFBSSxDQUFDO1FBQ3BDLG1GQUFtRjtRQUMxRSx5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDMUMsNkZBQTZGO1FBQ3BGLCtCQUEwQixHQUFXLENBQUMsQ0FBQztRQUNoRCwwQ0FBMEM7UUFDakMsY0FBUyxHQUFxQixFQUFFLENBQUM7UUFPMUMsZ0hBQWdIO1FBQ3ZHLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFTbEMsd0NBQXdDO1FBQy9CLHNCQUFpQixHQUFXLGdCQUFnQixDQUFDO1FBRXRELG1HQUFtRztRQUMxRix5QkFBb0IsR0FBdUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUEsQ0FBQSxDQUFDLENBQUM7UUFFdkYsMkZBQTJGO1FBQ2xGLGlDQUE0QixHQUF3RCxHQUFHLEVB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QU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFHRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBaUJ1RCxxQkFBcUI7c0JBQWxGLFNBQVM7dUJBQUMsOEJBQThCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIEZvcm1BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGVtcGxhdGVWYXJpYWJsZSwgVGVtcGxhdGVWYXJpYWJsZXNGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0vdGVtcGxhdGUtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50JztcblxuLy8gSW1wb3J0IEVsZW1lbnQgdHlwZSAtIHVzaW5nIGFueSBmb3Igbm93IHNpbmNlIEVsZW1lbnQgaXMgZnJvbSB0cy1wb3J0YWwtdWlcbi8vIEluIGEgcmVhbCBzY2VuYXJpbywgeW91IG1pZ2h0IHdhbnQgdG8gY3JlYXRlIGEgc2hhcmVkIGludGVyZmFjZSBvciBpbXBvcnQgZnJvbSBhIHNoYXJlZCBwYWNrYWdlXG5pbnRlcmZhY2UgRWxlbWVudCB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxvY2F0b3JWYWx1ZT86IHN0cmluZztcbiAgb3RoZXJMb2NhdG9yPzogc3RyaW5nW107XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZURlZmluaXRpb24ge1xuICBwYXRoOiBzdHJpbmc7XG4gIGRlZmF1bHQ6IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBudWxsO1xuICBtdXRhYmxlOiBib29sZWFuO1xuICB0eXBlPzogc3RyaW5nO1xuICBvcHRpb25zPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uVGVtcGxhdGUge1xuICBpZD86IG51bWJlcjtcbiAgbmF0dXJhbFRleHQ/OiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICBodG1sR3JhbW1hcj86IHN0cmluZztcbiAgc2VhcmNoYWJsZUdyYW1tYXI/OiBzdHJpbmc7XG4gIHdvcmtzcGFjZVR5cGU/OiBzdHJpbmc7XG4gIGFjdGlvbj86IHN0cmluZztcbiAgaXNBZGRvbj86IGJvb2xlYW47XG4gIHZhcmlhYmxlcz86IFJlY29yZDxzdHJpbmcsIFZhcmlhYmxlRGVmaW5pdGlvbj47XG4gIGFsbG93ZWRWYWx1ZXM/OiBhbnk7XG4gIGRhdGE/OiBhbnk7XG4gIHN0ZXBBY3Rpb25UeXBlPzogYW55O1xuICBzdGVwVHlwZT86IGFueTtcbiAgZGlzcGxheU9yZGVyPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRGaWVsZCB7XG4gIGtleTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICB0eXBlOiAnZWxlbWVudCcgfCAndGVzdC1kYXRhJyB8ICdhdHRyaWJ1dGUnO1xufVxuXG50eXBlIFN0ZXBUZXN0RGF0YUxpc3RJdGVtID0ge1xuICB0ZXN0RGF0YTogc3RyaW5nO1xuICB0ZXN0RGF0YUtleT86IHN0cmluZztcbiAgdGVzdERhdGFUeXBlOiBzdHJpbmc7XG4gIHRlc3REYXRhUHJvZmlsZUlkPzogbnVtYmVyO1xufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtYnVpbGRlci1hY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcsIHN0eWxlOiAnZGlzcGxheTogYmxvY2s7aGVpZ2h0OiAxMDAlO3dpZHRoOiAxMDAlOycgfVxufSlcbmV4cG9ydCBjbGFzcyBTdGVwQnVpbGRlckFjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBzaG93SGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIEluY3JlbWVudCB0aGlzIGNvdW50ZXIgdG8gdHJpZ2dlciBcIkNoYW5nZSBUZW1wbGF0ZVwiIGZyb20gYSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBjaGFuZ2VUZW1wbGF0ZVNpZ25hbDogbnVtYmVyID0gMDtcbiAgLyoqIEluY3JlbWVudCB0aGlzIGNvdW50ZXIgdG8gdHJpZ2dlciBcIkNhbmNlbCB0ZW1wbGF0ZSBzZWxlY3Rpb25cIiBmcm9tIGEgcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgY2FuY2VsQ2hhbmdlVGVtcGxhdGVTaWduYWw6IG51bWJlciA9IDA7XG4gIC8qKiBMaXN0IG9mIGFjdGlvbiB0ZW1wbGF0ZXMgdG8gZGlzcGxheSAqL1xuICBASW5wdXQoKSB0ZW1wbGF0ZXM6IEFjdGlvblRlbXBsYXRlW10gPSBbXTtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIGF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGlzIHRlbXBsYXRlIG9uIGluaXQgKGVkaXQgbW9kZSkuICovXG4gIEBJbnB1dCgpIGluaXRpYWxUZW1wbGF0ZT86IEFjdGlvblRlbXBsYXRlO1xuICAvKiogV2hlbiBwcm92aWRlZCwgcHJlLXBvcHVsYXRlcyB0aGUgZGVzY3JpcHRpb24gZmllbGQgaW4gZWRpdCBtb2RlLiAqL1xuICBASW5wdXQoKSBpbml0aWFsRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBwcmUtcG9wdWxhdGVzIHRoZSBtZXRhZGF0YSBmaWVsZCBpbiBlZGl0IG1vZGUuICovXG4gIEBJbnB1dCgpIGluaXRpYWxNZXRhZGF0YT86IHN0cmluZztcbiAgLyoqIFdoZW4gdHJ1ZSwgZW5hYmxlcyBkZWJ1Zy1tb2RlIGJlaGF2aW91cjogYXV0by1zZWxlY3RzIGluaXRpYWxUZW1wbGF0ZSBhbmQgcHJlLWZpbGxzIGRlc2NyaXB0aW9uL21ldGFkYXRhLiAqL1xuICBASW5wdXQoKSBpc0RlYnVnOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaXNFZGl0TW9kZSBsb2dpYyAodXNlZnVsIHdoZW4gcGFyZW50IGtub3dzIGVkaXQgc3RhdGUgaW5kZXBlbmRlbnRseSBvZiBpbml0aWFsVGVtcGxhdGUpLiAqL1xuICBASW5wdXQoKSBlZGl0TW9kZT86IGJvb2xlYW47XG5cbiAgZ2V0IGlzRWRpdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZWRpdE1vZGUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuZWRpdE1vZGU7XG4gICAgcmV0dXJuIHRoaXMuaXNEZWJ1ZyAmJiAhIXRoaXMuaW5pdGlhbFRlbXBsYXRlO1xuICB9XG5cbiAgLyoqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHNlYXJjaCBpbnB1dCAqL1xuICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCBsaWJyYXJ5JztcblxuICAvKiogRnVuY3Rpb24gdG8gaGFuZGxlIHZhcmlhYmxlIHByb2Nlc3Npbmcgb3IgY3VzdG9tIGxvZ2ljLiBDYW4gYmUgcGFzc2VkIGZyb20gcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgc2V0VGVtcGxhdGVWYXJpYWJsZXM6ICh2YXJpYWJsZXM6IEFjdGlvblRlbXBsYXRlKSA9PiBhbnkgPSAoKSA9PiB7IHJldHVybiBbXX07XG4gIFxuICAvKiogRnVuY3Rpb24gdG8gaGFuZGxlIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6ICh0ZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUsIHRlc3RTdGVwPzogYW55KSA9PiBhbnlbXSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcblxuICAvKiogQ2VudHJhbGlzZWQgSFRNTCBncmFtbWFyIGNvbXB1dGF0aW9uIGZ1bmN0aW9uLiBQYXNzIFN0ZXBCdWlsZGVyU2VydmljZS5jb21wdXRlSHRtbEdyYW1tYXIgZnJvbSB0aGUgaG9zdCBhcHAuICovXG4gIEBJbnB1dCgpIGNvbXB1dGVIdG1sR3JhbW1hckZuPzogKHRlbXBsYXRlOiBhbnksIHZhcmlhYmxlczogYW55W10pID0+IHN0cmluZztcblxuICBASW5wdXQoKSBwcmV2ZW50U2VsZWN0VGVtcGxhdGU6IHN0cmluZ1tdID0gWydkYXRhYmFzZXZlcmlmaWNhdGlvbiddO1xuICBASW5wdXQoKSBlbGVtZW50T3B0aW9uczogRWxlbWVudFtdID0gW107IC8vIEVsZW1lbnQgb2JqZWN0cyBmb3IgZWxlbWVudCBkcm9wZG93blxuICBASW5wdXQoKSBoYXNNb3JlRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gV2hldGhlciBtb3JlIGVsZW1lbnRzIGFyZSBhdmFpbGFibGVcbiAgQElucHV0KCkgaXNMb2FkaW5nRWxlbWVudHM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gTG9hZGluZyBzdGF0ZSBmb3IgZWxlbWVudHNcbiAgLyoqIFNjcmVlbiBuYW1lIG9wdGlvbnMgZm9yIGVsZW1lbnQgZm9ybSBhdXRvY29tcGxldGUgKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSBzY3JlZW5OYW1lT3B0aW9uczogeyBpZD86IG51bWJlcjsgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogV2hldGhlciBtb3JlIHNjcmVlbiBuYW1lcyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZVNjcmVlbk5hbWVzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHBhcmVudCBpcyBsb2FkaW5nIHNjcmVlbiBuYW1lcyAoc2VhcmNoIG9yIGxvYWQgbW9yZSkgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nU2NyZWVuTmFtZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFBhcmFtZXRlciBvcHRpb25zIGZvciB0ZXN0IGRhdGEgcGFyYW1ldGVyIGRyb3Bkb3duIChmcm9tIEFQSSkgKi9cbiAgQElucHV0KCkgcGFyYW1ldGVyT3B0aW9uczogYW55W10gPSBbXTsgLy8gVGVzdERhdGFbXSAtIHJhdyB0ZXN0IGRhdGEgcHJvZmlsZXNcbiAgLyoqIFdoZXRoZXIgbW9yZSBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBwYXJhbWV0ZXJzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdQYXJhbWV0ZXJzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBVcGxvYWQgb3B0aW9ucyBmb3IgdXBsb2FkIGRyb3Bkb3duIChmcm9tIEFQSSkgKi9cbiAgQElucHV0KCkgdXBsb2FkT3B0aW9uczogYW55W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgbW9yZSB1cGxvYWRzIGFyZSBhdmFpbGFibGUgZm9yIGluZmluaXRlIHNjcm9sbCAqL1xuICBASW5wdXQoKSBoYXNNb3JlVXBsb2FkczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyB1cGxvYWRzIChzZWFyY2ggb3IgbG9hZCBtb3JlKSAqL1xuICBASW5wdXQoKSBpc0xvYWRpbmdVcGxvYWRzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBFbnZpcm9ubWVudCBvcHRpb25zIGZvciBlbnZpcm9ubWVudCBwYXJhbWV0ZXIgZHJvcGRvd24gKGZyb20gQVBJKSAqL1xuICBASW5wdXQoKSBlbnZpcm9ubWVudE9wdGlvbnM6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBlbnZpcm9ubWVudDogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogV2hldGhlciBtb3JlIGVudmlyb25tZW50cyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwgKi9cbiAgQElucHV0KCkgaGFzTW9yZUVudmlyb25tZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgbG9hZGluZyBlbnZpcm9ubWVudHMgKHNlYXJjaCBvciBsb2FkIG1vcmUpICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0Vudmlyb25tZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRGVmYXVsdCB0ZXN0IGRhdGEgcHJvZmlsZSBJRCBmcm9tIHRlc3QgY2FzZSAoaWYgYXZhaWxhYmxlLCBwcm9maWxlIGFuZCBkYXRhIHNldCBkcm9wZG93bnMgd2lsbCBiZSBkaXNhYmxlZCkgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRlc3REYXRhUHJvZmlsZUlkPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCB0ZXN0IGRhdGEgc3RhcnQgaW5kZXggZnJvbSB0ZXN0IGNhc2UgKGRhdGEgc2V0IGluZGV4IGluIHRoZSBwcm9maWxlKSAqL1xuICBASW5wdXQoKSBkZWZhdWx0VGVzdERhdGFTdGFydEluZGV4PzogbnVtYmVyO1xuICAvKiogVHJ1ZSB3aGlsZSBwYXJlbnQgaXMgY3JlYXRpbmcgdGhlIHN0ZXAgKEFQSSBpbiBwcm9ncmVzcyk7IHNob3cgbG9hZGVyIG9uIENyZWF0ZS9VcGRhdGUgU3RlcCBidXR0b24gKi9cbiAgQElucHV0KCkgaXNDcmVhdGluZ1N0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHRlbXBsYXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QWN0aW9uVGVtcGxhdGU+KCk7XG4gIEBPdXRwdXQoKSBsb2FkTW9yZUVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gbG9hZCBtb3JlIGlzIHJlcXVlc3RlZFxuICBAT3V0cHV0KCkgc2VhcmNoRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVsZW1lbnRzXG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzY3JlZW5OYW1lSWQ6IG51bWJlcjsgc2VhcmNoVGVybT86IHN0cmluZyB9PigpOyAvLyBFbWl0IHdoZW4gc2NyZWVuIG5hbWUgaXMgc2VsZWN0ZWQgdG8gZmV0Y2ggZWxlbWVudHMgZmlsdGVyZWQgYnkgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIGNyZWF0ZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTsgLy8gRW1pdCB3aGVuIGVsZW1lbnQgaXMgY3JlYXRlZFxuICBAT3V0cHV0KCkgc2VhcmNoU2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBzY3JlZW4gbmFtZXNcbiAgQE91dHB1dCgpIGxvYWRNb3JlU2NyZWVuTmFtZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgc2NyZWVuIG5hbWVzXG4gIEBPdXRwdXQoKSBjcmVhdGVTY3JlZW5OYW1lUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciByZXF1ZXN0cyB0byBjcmVhdGUgYSBuZXcgc2NyZWVuIG5hbWVcbiAgQE91dHB1dCgpIHNlYXJjaFBhcmFtZXRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIHBhcmFtZXRlcnNcbiAgQE91dHB1dCgpIGxvYWRNb3JlUGFyYW1ldGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgcGFyYW1ldGVyc1xuICBAT3V0cHV0KCkgc2VhcmNoVXBsb2FkcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzZWFyY2hlcyBmb3IgdXBsb2Fkc1xuICBAT3V0cHV0KCkgbG9hZE1vcmVVcGxvYWRzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZSB1cGxvYWRzXG4gIEBPdXRwdXQoKSBzZWFyY2hFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTsgLy8gRW1pdCB3aGVuIHVzZXIgc2VhcmNoZXMgZm9yIGVudmlyb25tZW50c1xuICBAT3V0cHV0KCkgbG9hZE1vcmVFbnZpcm9ubWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlIGVudmlyb25tZW50c1xuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgY3JlYXRlZCAqL1xuICBAT3V0cHV0KCkgY3JlYXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWRpcmVjdFRvUGFyYW1ldGVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVkaXJlY3RUb0Vudmlyb25tZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGZpbHRlcmVkVGVtcGxhdGVzOiBBY3Rpb25UZW1wbGF0ZVtdID0gW107XG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRUZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmV2aW91c1RlbXBsYXRlRm9yRWRpdDogQWN0aW9uVGVtcGxhdGUgfCBudWxsID0gbnVsbDtcbiAgbWV0YWRhdGE6IHN0cmluZyA9ICcnO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIGFkdmFuY2VkRXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICB0ZW1wbGF0ZVZhcmlhYmxlczogVGVtcGxhdGVWYXJpYWJsZVtdID0gW107XG4gIHZhcmlhYmxlc0Zvcm06IEZvcm1BcnJheTtcbiAgYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgYWR2YW5jZWRWYXJpYWJsZXNGb3JtOiBGb3JtQXJyYXk7XG4gIHVwZGF0ZWRIdG1sR3JhbW1hcjogc3RyaW5nID0gJyc7IC8vIFVwZGF0ZWQgSFRNTCBncmFtbWFyIHdpdGggdmFyaWFibGUgdmFsdWVzXG4gIGNyZWF0ZUVsZW1lbnRWaXNpYmxlID0gZmFsc2U7XG4gIC8vIFRyYWNrIGVsZW1lbnQgZm9ybSB2aXNpYmlsaXR5XG4gIFxuICBAVmlld0NoaWxkKFRlbXBsYXRlVmFyaWFibGVzRm9ybUNvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pIHRlbXBsYXRlVmFyaWFibGVzRm9ybT86IFRlbXBsYXRlVmFyaWFibGVzRm9ybUNvbXBvbmVudDtcbiAgXG4gIC8vIENhY2hlIGZvciBzZWxlY3QgY29uZmlncyB0byBhdm9pZCByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb25cbiAgcHJpdmF0ZSBzZWxlY3RDb25maWdDYWNoZTogTWFwPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBmb3JtVmFsaWRDYWNoZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RGb3JtVmFsaWRhdGlvblRpbWU6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgRk9STV9WQUxJREFUSU9OX0NBQ0hFX01TID0gMTAwOyAvLyBDYWNoZSBmb3IgMTAwbXNcbiAgcHJpdmF0ZSBmb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy52YXJpYWJsZXNGb3JtID0gdGhpcy5mYi5hcnJheShbXSk7XG4gICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmFycmF5KFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZWxlbWVudCBmb3JtIHZpc2liaWxpdHkgY2hhbmdlXG4gICAqL1xuICBvbkVsZW1lbnRGb3JtVmlzaWJpbGl0eUNoYW5nZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVFbGVtZW50VmlzaWJsZSA9IHZpc2libGU7XG4gIH1cblxuICBvblNob3dFbGVtZW50Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZUVsZW1lbnRWaXNpYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMgPSBbLi4udGhpcy50ZW1wbGF0ZXNdO1xuICAgIGlmICh0aGlzLmlzRGVidWcpIHtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxEZXNjcmlwdGlvbikgdGhpcy5kZXNjcmlwdGlvbiA9IHRoaXMuaW5pdGlhbERlc2NyaXB0aW9uO1xuICAgICAgaWYgKHRoaXMuaW5pdGlhbE1ldGFkYXRhKSB0aGlzLm1ldGFkYXRhID0gdGhpcy5pbml0aWFsTWV0YWRhdGE7XG4gICAgICBpZiAodGhpcy5pbml0aWFsVGVtcGxhdGUpIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZWxlY3RUZW1wbGF0ZSh0aGlzLmluaXRpYWxUZW1wbGF0ZSEpLCAwKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlcyddKSB7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gICAgfVxuICAgIC8vIFdoZW4gaW5pdGlhbFRlbXBsYXRlIGlzIHNldCBhZnRlciBpbml0IChhc3luYyBwcmUtZmlsbCksIGF1dG8tc2VsZWN0IGl0XG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxUZW1wbGF0ZSddICYmIHRoaXMuaXNEZWJ1ZyAmJiB0aGlzLmluaXRpYWxUZW1wbGF0ZSAmJiAhdGhpcy5zZWxlY3RlZFRlbXBsYXRlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0VGVtcGxhdGUodGhpcy5pbml0aWFsVGVtcGxhdGUhKSwgMCk7XG4gICAgfVxuICAgIC8vIFBhcmVudCBjYW4gdHJpZ2dlciBcIkNoYW5nZSBUZW1wbGF0ZVwiIGJ5IGluY3JlbWVudGluZyBjaGFuZ2VUZW1wbGF0ZVNpZ25hbFxuICAgIGlmIChjaGFuZ2VzWydjaGFuZ2VUZW1wbGF0ZVNpZ25hbCddICYmICFjaGFuZ2VzWydjaGFuZ2VUZW1wbGF0ZVNpZ25hbCddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlVGVtcGxhdGUoKTtcbiAgICB9XG4gICAgLy8gUGFyZW50IGNhbiB0cmlnZ2VyIFwiQ2FuY2VsIHRlbXBsYXRlIHNlbGVjdGlvblwiIGJ5IGluY3JlbWVudGluZyBjYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbFxuICAgIGlmIChjaGFuZ2VzWydjYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbCddICYmICFjaGFuZ2VzWydjYW5jZWxDaGFuZ2VUZW1wbGF0ZVNpZ25hbCddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLm9uQ2FuY2VsVGVtcGxhdGVTZWxlY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIG9uU2VhcmNoU3VibWl0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25TZWFyY2hDbGVhcmVkKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBhcHBseUZpbHRlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoVmFsdWUgfHwgdGhpcy5zZWFyY2hWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gWy4uLnRoaXMudGVtcGxhdGVzXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5zZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzID0gdGhpcy50ZW1wbGF0ZXMuZmlsdGVyKHRlbXBsYXRlID0+IHtcbiAgICAgIGNvbnN0IG5hdHVyYWxUZXh0ID0gdGVtcGxhdGUubmF0dXJhbFRleHQ/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICAvLyBTdHJpcCBIVE1MIHRhZ3MgZnJvbSBodG1sR3JhbW1hciBmb3Igc2VhcmNoaW5nIChvbmx5IHNlYXJjaCB0ZXh0IGNvbnRlbnQsIG5vdCBIVE1MIG1hcmt1cClcbiAgICAgIGNvbnN0IGh0bWxHcmFtbWFyVGV4dCA9IHRoaXMuc3RyaXBIdG1sVGFncyh0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHNlYXJjaGFibGVHcmFtbWFyID0gdGVtcGxhdGUuc2VhcmNoYWJsZUdyYW1tYXI/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBcbiAgICAgIHJldHVybiBuYXR1cmFsVGV4dC5pbmNsdWRlcyhzZWFyY2hUZXJtKSB8fCBcbiAgICAgICAgICAgICAgaHRtbEdyYW1tYXJUZXh0LmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IFxuICAgICAgICAgICAgIHNlYXJjaGFibGVHcmFtbWFyLmluY2x1ZGVzKHNlYXJjaFRlcm0pO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKFwiZmlsdGVyZWRUZW1wbGF0ZXNcIiwgdGhpcy5maWx0ZXJlZFRlbXBsYXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RyaXAgSFRNTCB0YWdzIGZyb20gYSBzdHJpbmcsIHJldHVybmluZyBvbmx5IHRoZSB0ZXh0IGNvbnRlbnRcbiAgICogQHBhcmFtIGh0bWxTdHJpbmcgLSBIVE1MIHN0cmluZyB0byBzdHJpcCB0YWdzIGZyb21cbiAgICogQHJldHVybnMgUGxhaW4gdGV4dCB3aXRob3V0IEhUTUwgdGFnc1xuICAgKi9cbiAgcHJpdmF0ZSBzdHJpcEh0bWxUYWdzKGh0bWxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFodG1sU3RyaW5nKSByZXR1cm4gJyc7XG4gICAgXG4gICAgLy8gVXNlIGJyb3dzZXIncyBET01QYXJzZXIgaWYgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0ZW1wRGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmc7XG4gICAgICAgIHJldHVybiB0ZW1wRGl2LnRleHRDb250ZW50IHx8IHRlbXBEaXYuaW5uZXJUZXh0IHx8ICcnO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gcmVnZXggaWYgRE9NIHBhcnNpbmcgZmFpbHNcbiAgICAgICAgcmV0dXJuIGh0bWxTdHJpbmcucmVwbGFjZSgvPFtePl0qPi9nLCAnJyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEZhbGxiYWNrOiByZWdleC1iYXNlZCB0YWcgcmVtb3ZhbCBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAgcmV0dXJuIGh0bWxTdHJpbmcucmVwbGFjZSgvPFtePl0qPi9nLCAnJyk7XG4gIH1cblxuICBzZWxlY3RUZW1wbGF0ZSh0ZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUpOiB2b2lkIHtcbiAgICBpZih0aGlzLnByZXZlbnRTZWxlY3RUZW1wbGF0ZS5pbmNsdWRlcyh0ZW1wbGF0ZS5kaXNwbGF5TmFtZSB8fCAnJykpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVDaGFuZ2VkLmVtaXQodGVtcGxhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRlbXBsYXRlQ2hhbmdlZC5lbWl0KHRlbXBsYXRlKTtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBcbiAgICAvLyBDbGVhciBjYWNoZSB3aGVuIHRlbXBsYXRlIGNoYW5nZXNcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuICAgIFxuICAgIGlmKHRoaXMuc2V0VGVtcGxhdGVWYXJpYWJsZXMgJiYgdGVtcGxhdGUudmFyaWFibGVzKSB7XG4gICAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBkZWZlciBoZWF2eSBvcGVyYXRpb25zIGFuZCBwcmV2ZW50IFVJIGZyZWV6aW5nXG4gICAgICAvLyBUaGlzIGFsbG93cyB0aGUgVUkgdG8gdXBkYXRlIGZpcnN0LCB0aGVuIHByb2Nlc3MgdGhlIHRlbXBsYXRlIHZhcmlhYmxlc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IHRoaXMuc2V0VGVtcGxhdGVWYXJpYWJsZXModGVtcGxhdGUpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidGVtcGxhdGVWYXJpYWJsZXNcIiwgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyk7XG4gICAgICAgICAgXG4gICAgICAgICAgdGhpcy5idWlsZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgICAvLyBJbml0aWFsaXplIHVwZGF0ZWQgSFRNTCBncmFtbWFyXG4gICAgICAgICAgdGhpcy51cGRhdGVIdG1sR3JhbW1hcigpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIEluaXRpYWxpemUgYWR2YW5jZWQgc2V0dGluZ3MgdmFyaWFibGVzXG4gICAgICAgICAgaWYgKHRoaXMuc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcykge1xuICAgICAgICAgICAgdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzID0gdGhpcy5zZXRBZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzKHRlbXBsYXRlKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlc1wiLCB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMpO1xuICAgICAgICAgICAgdGhpcy5idWlsZEFkdmFuY2VkVmFyaWFibGVzRm9ybSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIHRlbXBsYXRlIHZhcmlhYmxlczonLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggdGVtcGxhdGUncyBIVE1MIGdyYW1tYXIgaWYgbm8gdmFyaWFibGVzXG4gICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9IHRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnO1xuICAgICAgXG4gICAgICAvLyBJbml0aWFsaXplIGFkdmFuY2VkIHNldHRpbmdzIHZhcmlhYmxlcyBldmVuIGlmIG5vIHRlbXBsYXRlIHZhcmlhYmxlc1xuICAgICAgaWYgKHRoaXMuc2V0QWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcykge1xuICAgICAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgPSB0aGlzLnNldEFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXModGVtcGxhdGUpO1xuICAgICAgICB0aGlzLmJ1aWxkQWR2YW5jZWRWYXJpYWJsZXNGb3JtKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFZhcmlhYmxlc0Zvcm0oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBhcnJheVxuICAgIHdoaWxlICh0aGlzLnZhcmlhYmxlc0Zvcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgY2FjaGUgd2hlbiBmb3JtIGlzIHJlYnVpbHRcbiAgICB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuXG4gICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBwcmV2aW91cyBzdWJzY3JpcHRpb24gaWYgaXQgZXhpc3RzXG4gICAgaWYgKHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGZvcm0gZ3JvdXBzIGZvciBlYWNoIHZhcmlhYmxlXG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIHZhcmlhYmxlcyAtIHVzZSBib29sZWFuIHZhbHVlLCBvdGhlcnMgdXNlIHN0cmluZ1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICA6ICh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBhIEZvcm1Hcm91cCBmb3IgZWFjaCB2YXJpYWJsZSB3aXRoIG5hbWUgYW5kIHZhbHVlXG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFt2YXJpYWJsZS5uYW1lXSxcbiAgICAgICAgdmFsdWU6IFtkZWZhdWx0VmFsdWVdLFxuICAgICAgICB0eXBlOiBbdmFyaWFibGUudHlwZSB8fCAnc3RyaW5nJ10sXG4gICAgICAgIGxhYmVsOiBbdmFyaWFibGUubGFiZWwgfHwgJyddLFxuICAgICAgICBvcHRpb25zOiBbdmFyaWFibGUub3B0aW9ucyB8fCBbXV1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBBZGQgZGF0YVR5cGUgY29udHJvbCBmb3IgdGVzdC1kYXRhIHZhcmlhYmxlcyBpZiBuZWVkZWRcbiAgICAgIGNvbnN0IGxhYmVsID0gdmFyaWFibGUubGFiZWw/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAobGFiZWwgPT09ICd0ZXN0X2RhdGEnIHx8IGxhYmVsID09PSAnc291cmNlLXZhbHVlJyB8fCBsYWJlbCA9PT0gJ3RhcmdldC12YWx1ZScgfHwgXG4gICAgICAgICAgbGFiZWwgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGxhYmVsID09PSAndGFyZ2V0X3ZhbHVlJykge1xuICAgICAgICAvLyBQYXJzZSB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGRhdGEgdHlwZVxuICAgICAgICBjb25zdCB2YWx1ZVN0ciA9IFN0cmluZyhkZWZhdWx0VmFsdWUgfHwgJycpO1xuICAgICAgICBsZXQgZGF0YVR5cGUgPSAncGxhaW4tdGV4dCc7XG4gICAgICAgIGlmICh2YWx1ZVN0ci5zdGFydHNXaXRoKCdAfCcpICYmIHZhbHVlU3RyLmVuZHNXaXRoKCd8JykpIHtcbiAgICAgICAgICBkYXRhVHlwZSA9ICdwYXJhbWV0ZXInO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJyR8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICAgIGRhdGFUeXBlID0gJ3J1bnRpbWUnO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICAgIGRhdGFUeXBlID0gJ2Vudmlyb25tZW50JztcbiAgICAgICAgfVxuICAgICAgICB2YXJpYWJsZUdyb3VwLmFkZENvbnRyb2woJ2RhdGFUeXBlJywgbmV3IEZvcm1Db250cm9sKGRhdGFUeXBlKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5wdXNoKHZhcmlhYmxlR3JvdXApO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIFN1YnNjcmliZSB0byBmb3JtIHZhbHVlIGNoYW5nZXMgdG8gaW52YWxpZGF0ZSBjYWNoZSAob25seSB3aGVuIHVzZXIgYWN0dWFsbHkgY2hhbmdlcyB2YWx1ZXMpXG4gICAgLy8gTm90ZTogV2UgdXNlIGVtaXRFdmVudDogZmFsc2Ugd2hlbiBwcm9ncmFtbWF0aWNhbGx5IHNldHRpbmcgdmFsdWVzLCBzbyB0aGlzIHdvbid0IGZpcmUgdW5uZWNlc3NhcmlseVxuICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMudmFyaWFibGVzRm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRBZHZhbmNlZFZhcmlhYmxlc0Zvcm0oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBhcnJheVxuICAgIHdoaWxlICh0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGdyb3VwcyBmb3IgZWFjaCBhZHZhbmNlZCB2YXJpYWJsZVxuICAgIHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgdHlwZXNcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcbiAgICAgIGlmICh2YXJpYWJsZS50eXBlID09PSAnc3RyX2xpc3QnKSB7XG4gICAgICAgIC8vIEZvciBzdHJfbGlzdCwgY3JlYXRlIGEgRm9ybUFycmF5XG4gICAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlLnZhbHVlKSA/IHZhcmlhYmxlLnZhbHVlIDogW107XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZmIuYXJyYXkoXG4gICAgICAgICAgdmFsdWVBcnJheS5sZW5ndGggPiAwIFxuICAgICAgICAgICAgPyB2YWx1ZUFycmF5Lm1hcCgoaXRlbTogc3RyaW5nKSA9PiB0aGlzLmZiLmNvbnRyb2woaXRlbSkpXG4gICAgICAgICAgICA6IFt0aGlzLmZiLmNvbnRyb2woJycpXSAvLyBTdGFydCB3aXRoIG9uZSBlbXB0eSBjb250cm9sXG4gICAgICAgICk7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGZvcm1BcnJheTtcbiAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YXJpYWJsZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHZhcmlhYmxlLnZhbHVlID09PSB0cnVlIHx8IHZhcmlhYmxlLnZhbHVlID09PSAndHJ1ZScgfHwgdmFyaWFibGUudmFsdWUgPT09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS52YWx1ZSB8fCAnJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGEgRm9ybUdyb3VwIGZvciBlYWNoIHZhcmlhYmxlXG4gICAgICBjb25zdCB2YXJpYWJsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFt2YXJpYWJsZS5uYW1lXSxcbiAgICAgICAgdmFsdWU6IHZhcmlhYmxlLnR5cGUgPT09ICdzdHJfbGlzdCcgPyBkZWZhdWx0VmFsdWUgOiBbZGVmYXVsdFZhbHVlXSxcbiAgICAgICAgdHlwZTogW3ZhcmlhYmxlLnR5cGUgfHwgJ3N0cmluZyddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlLmxhYmVsIHx8ICcnXVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIENsZWFuIHVwIHN1YnNjcmlwdGlvbiB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgIGlmICh0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdENvbmZpZyh2YXJpYWJsZTogYW55LCBpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBVc2UgY2FjaGUgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHt2YXJpYWJsZS5uYW1lfV8ke3ZhcmlhYmxlLm9wdGlvbnM/LmpvaW4oJywnKSB8fCAnJ31gO1xuICAgIGlmICh0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdENvbmZpZ0NhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gKHZhcmlhYmxlLm9wdGlvbnMgfHwgW10pLm1hcCgob3B0OiBzdHJpbmcpID0+ICh7XG4gICAgICBpZDogb3B0LFxuICAgICAgdmFsdWU6IG9wdCxcbiAgICAgIG5hbWU6IG9wdCxcbiAgICAgIGxhYmVsOiBvcHRcbiAgICB9KSk7XG5cbiAgICBjb25zdCBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogYHZhbHVlYCwgLy8gVXNlICd2YWx1ZScgYXMga2V5IHNpbmNlIHdlJ3JlIGFjY2Vzc2luZyBmcm9tIEZvcm1BcnJheVxuICAgICAgcGxhY2Vob2xkZXI6IGBTZWxlY3QgJHt2YXJpYWJsZS5sYWJlbH1gLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlLm5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuc2V0KGNhY2hlS2V5LCBjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgXG4gIC8qKiBHZXQgZm9ybSBncm91cCBmb3IgYSB2YXJpYWJsZSBieSBuYW1lICovXG4gIGdldFZhcmlhYmxlRm9ybUdyb3VwKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogRm9ybUdyb3VwIHwgbnVsbCB7XG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIHRoaXMudmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKiogQWRkIGEgbmV3IHZhcmlhYmxlIHRvIHRoZSBmb3JtIGFycmF5IGR5bmFtaWNhbGx5ICovXG4gIGFkZFZhcmlhYmxlKHZhcmlhYmxlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB2YXJpYWJsZS50eXBlID09PSAnYm9vbGVhbicgXG4gICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgOiAodmFyaWFibGUudmFsdWUgfHwgJycpO1xuICAgIFxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFt2YXJpYWJsZS5uYW1lXSxcbiAgICAgIHZhbHVlOiBbZGVmYXVsdFZhbHVlXSxcbiAgICAgIHR5cGU6IFt2YXJpYWJsZS50eXBlIHx8ICdzdHJpbmcnXSxcbiAgICAgIGxhYmVsOiBbdmFyaWFibGUubGFiZWwgfHwgJyddLFxuICAgICAgb3B0aW9uczogW3ZhcmlhYmxlLm9wdGlvbnMgfHwgW11dXG4gICAgfSk7XG4gICAgXG4gICAgLy8gQWRkIGRhdGFUeXBlIGNvbnRyb2wgZm9yIHRlc3QtZGF0YSB2YXJpYWJsZXMgaWYgbmVlZGVkXG4gICAgY29uc3QgbGFiZWwgPSB2YXJpYWJsZS5sYWJlbD8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICBpZiAobGFiZWwgPT09ICd0ZXN0X2RhdGEnIHx8IGxhYmVsID09PSAnc291cmNlLXZhbHVlJyB8fCBsYWJlbCA9PT0gJ3RhcmdldC12YWx1ZScgfHwgXG4gICAgICAgIGxhYmVsID09PSAnc291cmNlX3ZhbHVlJyB8fCBsYWJlbCA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgIGNvbnN0IHZhbHVlU3RyID0gU3RyaW5nKGRlZmF1bHRWYWx1ZSB8fCAnJyk7XG4gICAgICBsZXQgZGF0YVR5cGUgPSAncGxhaW4tdGV4dCc7XG4gICAgICBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnQHwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgIGRhdGFUeXBlID0gJ3BhcmFtZXRlcic7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlU3RyLnN0YXJ0c1dpdGgoJyR8JykgJiYgdmFsdWVTdHIuZW5kc1dpdGgoJ3wnKSkge1xuICAgICAgICBkYXRhVHlwZSA9ICdydW50aW1lJztcbiAgICAgIH0gZWxzZSBpZiAodmFsdWVTdHIuc3RhcnRzV2l0aCgnKnwnKSAmJiB2YWx1ZVN0ci5lbmRzV2l0aCgnfCcpKSB7XG4gICAgICAgIGRhdGFUeXBlID0gJ2Vudmlyb25tZW50JztcbiAgICAgIH1cbiAgICAgIHZhcmlhYmxlR3JvdXAuYWRkQ29udHJvbCgnZGF0YVR5cGUnLCBuZXcgRm9ybUNvbnRyb2woZGF0YVR5cGUpKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy52YXJpYWJsZXNGb3JtLnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuICB9XG5cbiAgb25WYXJpYWJsZVZhbHVlQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coXCJvblZhcmlhYmxlVmFsdWVDaGFuZ2VcIiwgdmFyaWFibGVOYW1lLCB2YWx1ZSk7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy52YXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkYXRlIGZvcm0gdmFsaWRhdGlvbiBjYWNoZVxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgICAvLyBVcGRhdGUgSFRNTCBncmFtbWFyIHdpdGggbmV3IHZhbHVlXG4gICAgdGhpcy51cGRhdGVIdG1sR3JhbW1hcigpO1xuICB9XG5cbiAgb25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheSAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBjb25zdCB2YXJpYWJsZUluZGV4ID0gdGhpcy52YXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IGZvcm0gZ3JvdXAgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgY29uc3QgdmFyaWFibGVHcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbdmFyaWFibGVOYW1lXSxcbiAgICAgICAgdmFsdWU6IFt2YWx1ZV0sXG4gICAgICAgIHR5cGU6IFsnYm9vbGVhbiddLFxuICAgICAgICBsYWJlbDogW3ZhcmlhYmxlPy5sYWJlbCB8fCAnJ10sXG4gICAgICAgIG9wdGlvbnM6IFt2YXJpYWJsZT8ub3B0aW9ucyB8fCBbXV1cbiAgICAgIH0pO1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLnB1c2godmFyaWFibGVHcm91cCk7XG4gICAgfVxuICAgIC8vIEludmFsaWRhdGUgZm9ybSB2YWxpZGF0aW9uIGNhY2hlXG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuICAgIC8vIFVwZGF0ZSBIVE1MIGdyYW1tYXIgd2l0aCBuZXcgdmFsdWVcbiAgICB0aGlzLnVwZGF0ZUh0bWxHcmFtbWFyKCk7XG4gIH1cblxuICBvbkFkdmFuY2VkVmFyaWFibGVCb29sZWFuQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy5hZHZhbmNlZFNldHRpbmdzVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGVJbmRleCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmNvbnRyb2xzLmZpbmRJbmRleChcbiAgICAgIGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKT8udmFsdWUgPT09IHZhcmlhYmxlTmFtZVxuICAgICk7XG4gICAgaWYgKHZhcmlhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdCh2YXJpYWJsZUluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgb25BZHZhbmNlZFZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlSW5kZXggPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5jb250cm9scy5maW5kSW5kZXgoXG4gICAgICBjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJyk/LnZhbHVlID09PSB2YXJpYWJsZU5hbWVcbiAgICApO1xuICAgIGlmICh2YXJpYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0uYXQodmFyaWFibGVJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgLy8gRm9yIHN0cl9saXN0LCB0aGUgRm9ybUFycmF5IGlzIGFscmVhZHkgbWFuYWdlZCBpbnNpZGUgQWR2YW5jZWRWYXJpYWJsZXNGb3JtQ29tcG9uZW50LFxuICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byByZWJ1aWxkIG9yIHVwZGF0ZSBpdCBoZXJlIHRvIGF2b2lkIGZvY3VzIGxvc3MuXG4gICAgICBpZiAodmFyaWFibGU/LnR5cGUgIT09ICdzdHJfbGlzdCcpIHtcbiAgICAgICAgZm9ybUdyb3VwLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZVRlbXBsYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy5zZWxlY3RlZFRlbXBsYXRlKSB7XG4gICAgICB0aGlzLnByZXZpb3VzVGVtcGxhdGVGb3JFZGl0ID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBudWxsO1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBbXTtcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgPSBbXTtcbiAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9ICcnO1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9IGZhbHNlO1xuICAgIC8vIENsZWFyIGZvcm0gYXJyYXlzXG4gICAgd2hpbGUgKHRoaXMudmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG4gICAgd2hpbGUgKHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBvbkNhbmNlbFRlbXBsYXRlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy5wcmV2aW91c1RlbXBsYXRlRm9yRWRpdCkge1xuICAgICAgdGhpcy5zZWxlY3RUZW1wbGF0ZSh0aGlzLnByZXZpb3VzVGVtcGxhdGVGb3JFZGl0KTtcbiAgICB9XG4gIH1cblxuICBvbkJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gbnVsbDtcbiAgICB0aGlzLm1ldGFkYXRhID0gJyc7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9ICcnO1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBbXTtcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMgPSBbXTtcbiAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9ICcnO1xuICAgIC8vIENsZWFyIGZvcm0gYXJyYXlzXG4gICAgd2hpbGUgKHRoaXMudmFyaWFibGVzRm9ybS5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5yZW1vdmVBdCgwKTtcbiAgICB9XG4gICAgd2hpbGUgKHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0ucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIC8vIFJlYXBwbHkgZmlsdGVyIHRvIG1haW50YWluIHNlYXJjaCBzdGF0ZVxuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB0aGlzLm9uQmFjaygpO1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxuXG4gIGlzRm9ybVZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFRlbXBsYXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBjYWNoZWQgcmVzdWx0IGlmIGF2YWlsYWJsZSBhbmQgcmVjZW50XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5mb3JtVmFsaWRDYWNoZSAmJiAobm93IC0gdGhpcy5sYXN0Rm9ybVZhbGlkYXRpb25UaW1lKSA8IHRoaXMuRk9STV9WQUxJREFUSU9OX0NBQ0hFX01TKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRDYWNoZTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgYWxsIHJlcXVpcmVkIHZhcmlhYmxlcyBhcmUgZmlsbGVkOlxuICAgIC8vIEZvciBhbnkgdGVtcGxhdGUgdmFyaWFibGUgd2l0aCBkYXRhS2V5ICd0ZXN0X2RhdGEnIHwgJ3NvdXJjZV92YWx1ZScgfCAndGFyZ2V0X3ZhbHVlJ1xuICAgIC8vIEFORCBkYXRhVHlwZSAncGxhaW4tdGV4dCcgb3IgJ3J1bnRpbWUnLCB0aGUgdW5kZXJseWluZyB2YWx1ZSBtdXN0IGJlIG5vbi1lbXB0eS5cbiAgICBsZXQgY3VzdG9tVmFyaWFibGVzVmFsaWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzICYmIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY3VzdG9tVmFyaWFibGVzVmFsaWQgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmV2ZXJ5KHZhcmlhYmxlID0+IHtcbiAgICAgICAgaWYgKHZhcmlhYmxlLmRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IHZhcmlhYmxlLmRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgICAgaWYgKHZhcmlhYmxlLmRhdGFUeXBlID09PSAncGxhaW4tdGV4dCcgfHwgdmFyaWFibGUuZGF0YVR5cGUgPT09ICdydW50aW1lJykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYodmFyaWFibGUuZGF0YVR5cGUgPT09ICdwYXJhbWV0ZXInKXtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHZhcmlhYmxlLmRhdGFUeXBlID09PSAnZW52aXJvbm1lbnQnKXtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29tYmluZSByZWFjdGl2ZSBmb3JtIHZhbGlkaXR5IHdpdGggY3VzdG9tIHZhcmlhYmxlIHZhbGlkYXRpb25cbiAgICBjb25zdCByZWFjdGl2ZVZhbGlkID0gdGhpcy52YXJpYWJsZXNGb3JtLnZhbGlkICYmIHRoaXMuYWR2YW5jZWRWYXJpYWJsZXNGb3JtLnZhbGlkO1xuICAgIGNvbnN0IGZpbmFsVmFsaWQgPSByZWFjdGl2ZVZhbGlkICYmIGN1c3RvbVZhcmlhYmxlc1ZhbGlkO1xuXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmaW5hbFZhbGlkO1xuICAgIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSA9IG5vdztcbiAgICByZXR1cm4gZmluYWxWYWxpZDtcbiAgfVxuICBcbiAgdHJhY2tCeVRlbXBsYXRlKGluZGV4OiBudW1iZXIsIHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSk6IGFueSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmlkIHx8IHRlbXBsYXRlLmRpc3BsYXlOYW1lIHx8IGluZGV4O1xuICB9XG4gIFxuICB0cmFja0J5VmFyaWFibGUoaW5kZXg6IG51bWJlciwgdmFyaWFibGU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLm5hbWUgfHwgaW5kZXg7XG4gIH1cblxuICBvbkNyZWF0ZVN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRm9ybVZhbGlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gR2V0IGVudmlyb25tZW50IElEcyBmcm9tIHRlbXBsYXRlIHZhcmlhYmxlcyAoaWYgYW55IGVudmlyb25tZW50IHR5cGUgdmFyaWFibGVzIGFyZSBzZWxlY3RlZClcbiAgICBjb25zdCBlbnZpcm9ubWVudElkcyA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNGb3JtPy5nZXRFbnZpcm9ubWVudElkc0ZvclZhcmlhYmxlcygpIHx8IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgY29uc3QgY3VycmVudFRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5nZXRDdXJyZW50VGVtcGxhdGVWYXJpYWJsZXMoKTtcbiAgICBcbiAgICAvLyBTeW5jIGFkdmFuY2VkIHZhcmlhYmxlcyBmcm9tIGZvcm0gdG8gYXJyYXlcbiAgICB0aGlzLmFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVzRm9ybS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKGZvcm1Hcm91cCkge1xuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSBmb3JtR3JvdXAuZ2V0KCd2YWx1ZScpPy52YWx1ZTtcbiAgICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdzdHJfbGlzdCcgJiYgZm9ybVZhbHVlIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCB2YWx1ZXMgZnJvbSBGb3JtQXJyYXlcbiAgICAgICAgICB2YXJpYWJsZS52YWx1ZSA9IGZvcm1WYWx1ZS5jb250cm9scy5tYXAoY29udHJvbCA9PiBjb250cm9sLnZhbHVlKS5maWx0ZXIoKHZhbDogc3RyaW5nKSA9PiB2YWwgJiYgdmFsLnRyaW0oKSAhPT0gJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhcmlhYmxlLnZhbHVlID0gZm9ybVZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgY29uc3Qgc3RlcERhdGEgPSB7XG4gICAgICB0ZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFRlbXBsYXRlLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRlbXBsYXRlVmFyaWFibGVzOiBjdXJyZW50VGVtcGxhdGVWYXJpYWJsZXMsXG4gICAgICAvLyB0ZXN0RGF0YUxpc3Q6IHRoaXMuYnVpbGRUZXN0RGF0YUxpc3QoY3VycmVudFRlbXBsYXRlVmFyaWFibGVzKSxcbiAgICAgIGFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXM6IHRoaXMuYWR2YW5jZWRTZXR0aW5nc1ZhcmlhYmxlcyxcbiAgICAgIGVudmlyb25tZW50SWRzOiBlbnZpcm9ubWVudElkcyAvLyBNYXAgb2YgdmFyaWFibGUgbmFtZSB0byBlbnZpcm9ubWVudCBJRFxuICAgIH07XG4gICAgY29uc29sZS5sb2coXCJzdGVwRGF0YVwiLCBzdGVwRGF0YSk7XG4gICAgY29uc29sZS5sb2coXCJ2YXJpYWJsZXNGb3JtXCIsIHRoaXMudmFyaWFibGVzRm9ybS52YWx1ZSk7XG4gICAgY29uc29sZS5sb2coXCJhZHZhbmNlZFZhcmlhYmxlc0Zvcm1cIiwgdGhpcy5hZHZhbmNlZFZhcmlhYmxlc0Zvcm0udmFsdWUpO1xuICAgIGNvbnNvbGUubG9nKFwiZW52aXJvbm1lbnRJZHNcIiwgZW52aXJvbm1lbnRJZHMpO1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFRlbXBsYXRlVmFyaWFibGVzKCk6IFRlbXBsYXRlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgY2hpbGRWYXJpYWJsZXMgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybT8udGVtcGxhdGVWYXJpYWJsZXM7XG4gICAgaWYgKGNoaWxkVmFyaWFibGVzICYmIGNoaWxkVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBjaGlsZFZhcmlhYmxlcztcbiAgICAgIHJldHVybiBjaGlsZFZhcmlhYmxlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgfHwgW107XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVGVzdERhdGFMaXN0KHZhcmlhYmxlczogVGVtcGxhdGVWYXJpYWJsZVtdKTogU3RlcFRlc3REYXRhTGlzdEl0ZW1bXSB7XG4gICAgY29uc3QgdGVzdERhdGFMaXN0OiBTdGVwVGVzdERhdGFMaXN0SXRlbVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcyB8fCBbXSkge1xuICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB2YXJpYWJsZT8udmFsdWU7XG4gICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBmb3JtYXR0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBmb3JtYXR0ZWRWYWx1ZSA9PT0gJycpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5yZXNvbHZlVmFyaWFibGVUZXN0RGF0YVZhbHVlKHZhcmlhYmxlKTtcbiAgICAgIGlmICghaXRlbS50ZXN0RGF0YSkgY29udGludWU7XG4gICAgICB0ZXN0RGF0YUxpc3QucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVzdERhdGFMaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlVmFyaWFibGVUZXN0RGF0YVZhbHVlKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogU3RlcFRlc3REYXRhTGlzdEl0ZW0ge1xuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdmFyaWFibGU/LnZhbHVlICE9IG51bGwgPyBTdHJpbmcodmFyaWFibGUudmFsdWUpIDogJyc7XG4gICAgY29uc3QgcmF3VmFsdWUgPSB2YXJpYWJsZT8ucmF3VmFsdWUgIT0gbnVsbCAmJiBTdHJpbmcodmFyaWFibGUucmF3VmFsdWUpICE9PSAnJyA/IFN0cmluZyh2YXJpYWJsZS5yYXdWYWx1ZSkgOiBmb3JtYXR0ZWRWYWx1ZTtcbiAgICBjb25zdCBkYXRhVHlwZSA9IHZhcmlhYmxlPy5kYXRhVHlwZSB8fCB0aGlzLnBhcnNlVmFyaWFibGVEYXRhVHlwZShmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCA9IHRoaXMucmVzb2x2ZVNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQodmFyaWFibGUpO1xuXG4gICAgaWYgKGRhdGFUeXBlID09PSAncGFyYW1ldGVyJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YVR5cGU6ICdwYXJhbWV0ZXInLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgLi4uKHNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQgIT0gbnVsbCAmJiB7IHRlc3REYXRhUHJvZmlsZUlkOiBzZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkIH0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YVR5cGUgPT09ICdydW50aW1lJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgdGVzdERhdGFUeXBlOiAncnVudGltZScsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChkYXRhVHlwZSA9PT0gJ2Vudmlyb25tZW50Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdERhdGE6IHJhd1ZhbHVlLFxuICAgICAgICB0ZXN0RGF0YUtleTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgdGVzdERhdGFUeXBlOiAnZW52aXJvbm1lbnQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVzdERhdGE6IGZvcm1hdHRlZFZhbHVlLFxuICAgICAgdGVzdERhdGFLZXk6IHZhcmlhYmxlLm5hbWUsXG4gICAgICB0ZXN0RGF0YVR5cGU6ICdyYXcnLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVTZWxlY3RlZFRlc3REYXRhUHJvZmlsZUlkKHZhcmlhYmxlOiBUZW1wbGF0ZVZhcmlhYmxlKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCAhPSBudWxsICYmICFpc05hTihOdW1iZXIodmFyaWFibGUuc2VsZWN0ZWRUZXN0RGF0YVByb2ZpbGVJZCkpKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlSWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlR3JvdXAgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzRm9ybT8uZ2V0VmFyaWFibGVGb3JtR3JvdXAodmFyaWFibGUubmFtZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlVmFsdWUgPSB2YXJpYWJsZUdyb3VwPy5nZXQoJ3NlbGVjdGVkVGVzdERhdGFQcm9maWxlJyk/LnZhbHVlO1xuXG4gICAgaWYgKHNlbGVjdGVkUHJvZmlsZVZhbHVlICE9IG51bGwgJiYgc2VsZWN0ZWRQcm9maWxlVmFsdWUgIT09ICcnICYmICFpc05hTihOdW1iZXIoc2VsZWN0ZWRQcm9maWxlVmFsdWUpKSkge1xuICAgICAgcmV0dXJuIE51bWJlcihzZWxlY3RlZFByb2ZpbGVWYWx1ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9maWxlTmFtZSA9IHZhcmlhYmxlLnNlbGVjdGVkVGVzdERhdGFQcm9maWxlIHx8IHNlbGVjdGVkUHJvZmlsZVZhbHVlO1xuICAgIGlmIChzZWxlY3RlZFByb2ZpbGVOYW1lICE9IG51bGwgJiYgc2VsZWN0ZWRQcm9maWxlTmFtZSAhPT0gJycpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nUHJvZmlsZSA9IHRoaXMucGFyYW1ldGVyT3B0aW9ucy5maW5kKCh0ZXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGVOYW1lID0gdGVzdERhdGEubmFtZSB8fCB0ZXN0RGF0YS50ZXN0RGF0YU5hbWU7XG4gICAgICAgIHJldHVybiBwcm9maWxlTmFtZSA9PT0gc2VsZWN0ZWRQcm9maWxlTmFtZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKG1hdGNoaW5nUHJvZmlsZT8uaWQgIT0gbnVsbCAmJiAhaXNOYU4oTnVtYmVyKG1hdGNoaW5nUHJvZmlsZS5pZCkpKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hpbmdQcm9maWxlLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVZhcmlhYmxlRGF0YVR5cGUodmFsdWU6IHN0cmluZyk6ICdwbGFpbi10ZXh0JyB8ICdwYXJhbWV0ZXInIHwgJ3J1bnRpbWUnIHwgJ2Vudmlyb25tZW50JyB7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ0B8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkgcmV0dXJuICdwYXJhbWV0ZXInO1xuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCckfCcpICYmIHZhbHVlLmVuZHNXaXRoKCd8JykpIHJldHVybiAncnVudGltZSc7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyp8JykgJiYgdmFsdWUuZW5kc1dpdGgoJ3wnKSkgcmV0dXJuICdlbnZpcm9ubWVudCc7XG4gICAgcmV0dXJuICdwbGFpbi10ZXh0JztcbiAgfVxuXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuXG4gIG9uRWxlbWVudENsaWNrKGVsZW1lbnRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZvY3VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGZpZWxkXG4gICAgLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgdG8gc2Nyb2xsIHRvIG9yIGhpZ2hsaWdodCB0aGUgZmllbGRcbiAgfVxuXG4gIG9uRWxlbWVudFZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBvblRlc3REYXRhVmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgSFRNTCBncmFtbWFyIGJ5IHJlcGxhY2luZyBwbGFjZWhvbGRlciBzcGFucyB3aXRoIGFjdHVhbCB2YXJpYWJsZSB2YWx1ZXMuXG4gICAqIERlbGVnYXRlcyB0byBjb21wdXRlSHRtbEdyYW1tYXJGbiB3aGVuIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcCAoY2VudHJhbGlzZWQgbG9naWMgaW4gU3RlcEJ1aWxkZXJTZXJ2aWNlKS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlSHRtbEdyYW1tYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcHV0ZUh0bWxHcmFtbWFyRm4pIHtcbiAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdGhpcy5jb21wdXRlSHRtbEdyYW1tYXJGbih0aGlzLnNlbGVjdGVkVGVtcGxhdGUsIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3RlZFRlbXBsYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGh0bWxHcmFtbWFyID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJztcbiAgICBpZiAoIWh0bWxHcmFtbWFyKSB7XG4gICAgICB0aGlzLnVwZGF0ZWRIdG1sR3JhbW1hciA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG1hcCBvZiB2YXJpYWJsZSB2YWx1ZXMgYnkgbmFtZSBmb3IgcXVpY2sgbG9va3VwXG4gICAgY29uc3QgdmFsdWVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGlmICh0aGlzLnRlbXBsYXRlVmFyaWFibGVzICYmIEFycmF5LmlzQXJyYXkodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcykpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZm9yRWFjaCgodmFyaWFibGU6IGFueSkgPT4ge1xuICAgICAgICBpZiAodmFyaWFibGUubmFtZSAmJiB2YXJpYWJsZS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhcmlhYmxlLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB2YWx1ZSB0byBzdHJpbmcsIGhhbmRsaW5nIGJvb2xlYW4gdmFsdWVzXG4gICAgICAgICAgbGV0IHZhbHVlU3RyID0gJyc7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YXJpYWJsZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB2YWx1ZVN0ciA9IHZhcmlhYmxlLnZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLmRhdGFLZXkgPT09ICdlbGVtZW50JyAmJiB2YXJpYWJsZS5uYW1lICE9PSAnc2VsZWN0b3InKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHVzZSBlbGVtZW50TmFtZSBpZiBpdCdzIGRlZmluZWQgYW5kIG5vdCBlbXB0eVxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmVsZW1lbnROYW1lICE9PSB1bmRlZmluZWQgJiYgdmFyaWFibGUuZWxlbWVudE5hbWUgIT09IG51bGwgJiYgdmFyaWFibGUuZWxlbWVudE5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgIHZhbHVlU3RyID0gU3RyaW5nKHZhcmlhYmxlLmVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgdGhpcyB2YXJpYWJsZSAtIGRvbid0IGFkZCB0byBtYXAgaWYgZWxlbWVudCBpcyBub3Qgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUuZGF0YUtleSA9PT0gJ2VsZW1lbnQnICYmIHZhcmlhYmxlLm5hbWUgPT09ICdzZWxlY3RvcicpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdXNlIGVsZW1lbnRMb2NhdG9yIGlmIGl0J3MgZGVmaW5lZCBhbmQgbm90IGVtcHR5XG4gICAgICAgICAgICBpZiAodmFyaWFibGUuZWxlbWVudExvY2F0b3IgIT09IHVuZGVmaW5lZCAmJiB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciAhPT0gbnVsbCAmJiB2YXJpYWJsZS5lbGVtZW50TG9jYXRvciAhPT0gJycpIHtcbiAgICAgICAgICAgICAgdmFsdWVTdHIgPSBTdHJpbmcodmFyaWFibGUuZWxlbWVudExvY2F0b3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHZhcmlhYmxlIC0gZG9uJ3QgYWRkIHRvIG1hcCBpZiBlbGVtZW50IGxvY2F0b3IgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlU3RyID0gU3RyaW5nKHZhcmlhYmxlLnZhbHVlIHx8ICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gT25seSBhZGQgdG8gbWFwIGlmIHZhbHVlU3RyIGlzIG5vdCBlbXB0eSBhbmQgbm90IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICBpZiAodmFsdWVTdHIgJiYgdmFsdWVTdHIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlU3RyLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgICAgIHZhbHVlTWFwLnNldCh2YXJpYWJsZS5uYW1lLCB2YWx1ZVN0cik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBVc2UgYnJvd3NlcidzIERPTVBhcnNlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsYmFjayB0byBzdHJpbmcgcmVwbGFjZW1lbnRcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gU3RyaW5nKGh0bWxHcmFtbWFyKTtcblxuICAgICAgICAvLyBGaW5kIGFsbCBzcGFucyB3aXRoIGRhdGEtZXZlbnQta2V5IGF0dHJpYnV0ZVxuICAgICAgICBjb25zdCBzcGFucyA9IHRlbXBEaXYucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3NwYW5bZGF0YS1ldmVudC1rZXldJyk7XG4gICAgICAgIHNwYW5zLmZvckVhY2goKHNwYW46IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgZXZlbnRLZXkgPSBzcGFuLmdldEF0dHJpYnV0ZSgnZGF0YS1ldmVudC1rZXknKTtcbiAgICAgICAgICBpZiAoZXZlbnRLZXkgJiYgdmFsdWVNYXAuaGFzKGV2ZW50S2V5KSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZU1hcC5nZXQoZXZlbnRLZXkpO1xuICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgdmFsdWUgaXMgdmFsaWQgKG5vdCB1bmRlZmluZWQsIG5vdCBlbXB0eSlcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgc3BhbiBzdHJ1Y3R1cmUgYnV0IHVwZGF0ZSB0aGUgY29udGVudFxuICAgICAgICAgICAgICBzcGFuLmlubmVySFRNTCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdmFsdWUgaXMgaW52YWxpZCwgbGVhdmUgdGhlIHNwYW4gY29udGVudCBhcyBpcyAoZG9uJ3QgcmVwbGFjZSB3aXRoIHVuZGVmaW5lZClcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlZEh0bWxHcmFtbWFyID0gdGVtcERpdi5pbm5lckhUTUw7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB1cGRhdGluZyBIVE1MIGdyYW1tYXI6JywgZXJyb3IpO1xuICAgICAgICAvLyBGYWxsYmFjayB0byBvcmlnaW5hbCBIVE1MIGdyYW1tYXJcbiAgICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjazogc2ltcGxlIHN0cmluZyByZXBsYWNlbWVudCBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAgICBsZXQgdXBkYXRlZEh0bWwgPSBTdHJpbmcoaHRtbEdyYW1tYXIpO1xuICAgICAgdmFsdWVNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAvLyBPbmx5IHJlcGxhY2UgaWYgdmFsdWUgaXMgdmFsaWQgKG5vdCB1bmRlZmluZWQsIG5vdCBlbXB0eSlcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgLy8gUmVwbGFjZSBzcGFucyB3aXRoIGRhdGEtZXZlbnQta2V5IG1hdGNoaW5nIHRoZSB2YXJpYWJsZSBuYW1lXG4gICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGA8c3BhbltePl0qZGF0YS1ldmVudC1rZXk9XCIke2tleX1cIltePl0qPi4qPzwvc3Bhbj5gLCAnZ2knKTtcbiAgICAgICAgICB1cGRhdGVkSHRtbCA9IHVwZGF0ZWRIdG1sLnJlcGxhY2UocmVnZXgsIChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgY29udGVudCBpbnNpZGUgdGhlIHNwYW5cbiAgICAgICAgICAgIHJldHVybiBtYXRjaC5yZXBsYWNlKC8+Lio/PC8sIGA+JHt2YWx1ZX08YCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVkSHRtbEdyYW1tYXIgPSB1cGRhdGVkSHRtbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgc2VsZWN0b3IgdmFyaWFibGUgaXMgYXZhaWxhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzXG4gICAqL1xuICBnZXQgc2VsZWN0b3JWYXJpYWJsZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5zb21lKHYgPT4gdi5kYXRhS2V5ID09PSAnZWxlbWVudCcgfHwgdi5kYXRhS2V5ID09PSAnbGFiZWwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwYXJhbWV0ZXIgdmFyaWFibGUgaXMgYXZhaWxhYmxlICh0ZXN0RGF0YSB3aXRoIHBhcmFtZXRlciB0eXBlKVxuICAgKi9cbiAgZ2V0IHBhcmFtZXRlclZhcmlhYmxlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLnNvbWUodiA9PiB7XG4gICAgICBjb25zdCBkYXRhS2V5ID0gdi5kYXRhS2V5Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgaWYgKGRhdGFLZXkgPT09ICd0ZXN0X2RhdGEnIHx8IGRhdGFLZXkgPT09ICdzb3VyY2VfdmFsdWUnIHx8IGRhdGFLZXkgPT09ICd0YXJnZXRfdmFsdWUnKSB7XG4gICAgICAgIC8vIGNvbnN0IGRhdGFUeXBlID0gdGhpcy52YXJpYWJsZURhdGFUeXBlcy5nZXQodi5uYW1lKSB8fCAncGxhaW4tdGV4dCc7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGF2YWlsYWJsZSAodGVzdERhdGEgd2l0aCBlbnZpcm9ubWVudCB0eXBlKVxuICAgKi9cbiAgZ2V0IGVudmlyb25tZW50VmFyaWFibGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuc29tZSh2ID0+IHtcbiAgICAgIGNvbnN0IGRhdGFLZXkgPSB2LmRhdGFLZXk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBpZiAoZGF0YUtleSA9PT0gJ3Rlc3RfZGF0YScgfHwgZGF0YUtleSA9PT0gJ3NvdXJjZV92YWx1ZScgfHwgZGF0YUtleSA9PT0gJ3RhcmdldF92YWx1ZScpIHtcbiAgICAgICAgLy8gY29uc3QgZGF0YVR5cGUgPSB0aGlzLnZhcmlhYmxlRGF0YVR5cGVzLmdldCh2Lm5hbWUpIHx8ICdwbGFpbi10ZXh0JztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtcC1bMTZweF1cIiBbbmdDbGFzc109XCJ7J2NxYS1weC00Jzogc2hvd0hlYWRlciwgJ2NxYS1weS0yJzogc2hvd0hlYWRlciAmJiAhc2VsZWN0ZWRUZW1wbGF0ZX1cIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIFxuICA8ZGl2ICpuZ0lmPVwic2hvd0hlYWRlclwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1tYi0yXCI+XG4gICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbS0wXCI+XG4gICAgICB7eyBpc0VkaXRNb2RlID8gJ0VkaXQgYW4gYWN0aW9uIHN0ZXAnIDogJ0NyZWF0ZSBhbiBhY3Rpb24gc3RlcCcgfX1cbiAgICA8L2gyPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgc2VsZWN0ZWRUZW1wbGF0ZVwiXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgIGljb249XCJzd2FwX2hvcml6XCJcbiAgICAgIHRleHQ9XCJDaGFuZ2UgVGVtcGxhdGVcIlxuICAgICAgKGNsaWNrZWQpPVwib25DaGFuZ2VUZW1wbGF0ZSgpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICAqbmdJZj1cImlzRWRpdE1vZGUgJiYgIXNlbGVjdGVkVGVtcGxhdGVcIlxuICAgICAgdmFyaWFudD1cInRleHRcIlxuICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgIHRleHQ9XCJDYW5jZWxcIlxuICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWxUZW1wbGF0ZVNlbGVjdGlvbigpXCI+XG4gICAgPC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIiFzZWxlY3RlZFRlbXBsYXRlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtZmxleC0xXCJcbiAgICBbbmdDbGFzc109XCJ7J2NxYS1weC0zJzogc2hvd0hlYWRlcn1cIj5cblxuICAgIDwhLS0gU2VhcmNoIEJhciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXBiLTFcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcGItMVwiICpuZ0lmPVwic2hvd0hlYWRlclwiPlxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgIFRlbXBsYXRlIGxpYnJhcnlcbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8Y3FhLXNlYXJjaC1iYXIgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIiAoc2VhcmNoKT1cIm9uU2VhcmNoU3VibWl0KCRldmVudClcIiAoY2xlYXJlZCk9XCJvblNlYXJjaENsZWFyZWQoKVwiPlxuICAgICAgPC9jcWEtc2VhcmNoLWJhcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGVtcGxhdGUgTGlzdCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1weC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXB5LTJcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGVtcGxhdGUgb2YgZmlsdGVyZWRUZW1wbGF0ZXM7IHRyYWNrQnk6IHRyYWNrQnlUZW1wbGF0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtYWN0aW9uLWZvcm1hdCBjcWEtYmctd2hpdGUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBob3ZlcjpjcWEtYm9yZGVyLWJsdWUtNTAwIGhvdmVyOmNxYS1zaGFkb3ctc20gbWItNlwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRlbXBsYXRlKHRlbXBsYXRlKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIzcHhdIGNxYS10ZXh0LWJsYWNrLTEwMFwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZFRlbXBsYXRlcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtcHktOCBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICBObyB0ZW1wbGF0ZXMgZm91bmRcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtb3ZlcmZsb3cteS1hdXRvXCIgc3R5bGU9XCJmbGV4OiAxIDEgMCAhaW1wb3J0YW50O1wiPlxuICAgIDwhLS0gSW5zdHJ1Y3Rpb24gVGV4dCB3aXRoIEVsZW1lbnQgQnV0dG9ucyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZmxleC13cmFwIGNxYS1nYXAtMSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtcHktMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1hY3Rpb24tZm9ybWF0IGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjNweF0gY3FhLXRleHQtYmxhY2stMTAwXCJcbiAgICAgICAgW2lubmVySFRNTF09XCJ1cGRhdGVkSHRtbEdyYW1tYXIgfHwgc2VsZWN0ZWRUZW1wbGF0ZS5odG1sR3JhbW1hciB8fCBzZWxlY3RlZFRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnXCI+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCBjcWEtcHQtMiBjcWEtZ2FwLTJcIiAqbmdJZj1cIiFjcmVhdGVFbGVtZW50VmlzaWJsZVwiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cInNlbGVjdG9yVmFyaWFibGVBdmFpbGFibGVcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIFxuICAgICAgICAgIGJ0blNpemU9XCJzbVwiXG4gICAgICAgICAgaWNvbj1cImFkZFwiXG4gICAgICAgICAgdGV4dD1cIkNyZWF0ZSBFbGVtZW50XCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJvblNob3dFbGVtZW50Rm9ybSgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPGNxYS1idXR0b24gXG4gICAgICAgICAgKm5nSWY9XCJwYXJhbWV0ZXJWYXJpYWJsZUF2YWlsYWJsZVwiXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCIgXG4gICAgICAgICAgYnRuU2l6ZT1cInNtXCJcbiAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICB0ZXh0PVwiQ3JlYXRlIFBhcmFtZXRlclwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwicmVkaXJlY3RUb1BhcmFtZXRlci5lbWl0KClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiBcbiAgICAgICAgICAqbmdJZj1cImVudmlyb25tZW50VmFyaWFibGVBdmFpbGFibGVcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIFxuICAgICAgICAgIGJ0blNpemU9XCJzbVwiXG4gICAgICAgICAgaWNvbj1cImFkZFwiXG4gICAgICAgICAgdGV4dD1cIkNyZWF0ZSBFbnZpcm9ubWVudFwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwicmVkaXJlY3RUb0Vudmlyb25tZW50LmVtaXQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9ybSBGaWVsZHMgaW4gVHdvIENvbHVtbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLWZsZXgtMSBjcWEtcGItMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC14LTYgY3FhLWZsZXgtd3JhcCBjcWEtcGItNFwiPlxuICAgICAgICAgIDwhLS0gVGVtcGxhdGUgVmFyaWFibGVzIEZvcm0gQ29tcG9uZW50IC0tPlxuICAgICAgICAgIDxjcWEtdGVtcGxhdGUtdmFyaWFibGVzLWZvcm1cbiAgICAgICAgICAgICN0ZW1wbGF0ZVZhcmlhYmxlc0Zvcm1cbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCJcbiAgICAgICAgICAgIFtpc0RlYnVnXT1cImlzRGVidWdcIlxuICAgICAgICAgICAgW3RlbXBsYXRlVmFyaWFibGVzXT1cInRlbXBsYXRlVmFyaWFibGVzXCJcbiAgICAgICAgICAgIFt2YXJpYWJsZXNGb3JtXT1cInZhcmlhYmxlc0Zvcm1cIlxuICAgICAgICAgICAgW21ldGFkYXRhXT1cIm1ldGFkYXRhXCJcbiAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICBbZWxlbWVudE9wdGlvbnNdPVwiZWxlbWVudE9wdGlvbnNcIlxuICAgICAgICAgICAgW2hhc01vcmVFbGVtZW50c109XCJoYXNNb3JlRWxlbWVudHNcIlxuICAgICAgICAgICAgW2lzTG9hZGluZ0VsZW1lbnRzXT1cImlzTG9hZGluZ0VsZW1lbnRzXCJcbiAgICAgICAgICAgIFtzY3JlZW5OYW1lT3B0aW9uc109XCJzY3JlZW5OYW1lT3B0aW9uc1wiXG4gICAgICAgICAgICBbaGFzTW9yZVNjcmVlbk5hbWVzXT1cImhhc01vcmVTY3JlZW5OYW1lc1wiXG4gICAgICAgICAgICBbaXNMb2FkaW5nU2NyZWVuTmFtZXNdPVwiaXNMb2FkaW5nU2NyZWVuTmFtZXNcIlxuICAgICAgICAgICAgW3BhcmFtZXRlck9wdGlvbnNdPVwicGFyYW1ldGVyT3B0aW9uc1wiXG4gICAgICAgICAgICBbaGFzTW9yZVBhcmFtZXRlcnNdPVwiaGFzTW9yZVBhcmFtZXRlcnNcIlxuICAgICAgICAgICAgW2lzTG9hZGluZ1BhcmFtZXRlcnNdPVwiaXNMb2FkaW5nUGFyYW1ldGVyc1wiXG4gICAgICAgICAgICBbdXBsb2FkT3B0aW9uc109XCJ1cGxvYWRPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlVXBsb2Fkc109XCJoYXNNb3JlVXBsb2Fkc1wiXG4gICAgICAgICAgICBbaXNMb2FkaW5nVXBsb2Fkc109XCJpc0xvYWRpbmdVcGxvYWRzXCJcbiAgICAgICAgICAgIFtlbnZpcm9ubWVudE9wdGlvbnNdPVwiZW52aXJvbm1lbnRPcHRpb25zXCJcbiAgICAgICAgICAgIFtoYXNNb3JlRW52aXJvbm1lbnRzXT1cImhhc01vcmVFbnZpcm9ubWVudHNcIlxuICAgICAgICAgICAgW2lzTG9hZGluZ0Vudmlyb25tZW50c109XCJpc0xvYWRpbmdFbnZpcm9ubWVudHNcIlxuICAgICAgICAgICAgW2RlZmF1bHRUZXN0RGF0YVByb2ZpbGVJZF09XCJkZWZhdWx0VGVzdERhdGFQcm9maWxlSWRcIlxuICAgICAgICAgICAgW2RlZmF1bHRUZXN0RGF0YVN0YXJ0SW5kZXhdPVwiZGVmYXVsdFRlc3REYXRhU3RhcnRJbmRleFwiXG4gICAgICAgICAgICBbY3JlYXRlRWxlbWVudFZpc2libGVdPVwiY3JlYXRlRWxlbWVudFZpc2libGVcIlxuICAgICAgICAgICAgKHZhcmlhYmxlVmFsdWVDaGFuZ2UpPVwib25WYXJpYWJsZVZhbHVlQ2hhbmdlKCRldmVudC5uYW1lLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKG1ldGFkYXRhQ2hhbmdlKT1cIm1ldGFkYXRhID0gJGV2ZW50XCJcbiAgICAgICAgICAgIChkZXNjcmlwdGlvbkNoYW5nZSk9XCJkZXNjcmlwdGlvbiA9ICRldmVudFwiXG4gICAgICAgICAgICAobG9hZE1vcmVFbGVtZW50cyk9XCJsb2FkTW9yZUVsZW1lbnRzLmVtaXQoKVwiXG4gICAgICAgICAgICAoc2VhcmNoRWxlbWVudHMpPVwic2VhcmNoRWxlbWVudHMuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZSk9XCJzZWFyY2hFbGVtZW50c0J5U2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZUVsZW1lbnQpPVwiY3JlYXRlRWxlbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlU2NyZWVuTmFtZXMpPVwibG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VhcmNoUGFyYW1ldGVycyk9XCJzZWFyY2hQYXJhbWV0ZXJzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmVQYXJhbWV0ZXJzKT1cImxvYWRNb3JlUGFyYW1ldGVycy5lbWl0KClcIlxuICAgICAgICAgICAgKHNlYXJjaFVwbG9hZHMpPVwic2VhcmNoVXBsb2Fkcy5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlVXBsb2Fkcyk9XCJsb2FkTW9yZVVwbG9hZHMuZW1pdCgpXCJcbiAgICAgICAgICAgIChzZWFyY2hFbnZpcm9ubWVudHMpPVwic2VhcmNoRW52aXJvbm1lbnRzLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmVFbnZpcm9ubWVudHMpPVwibG9hZE1vcmVFbnZpcm9ubWVudHMuZW1pdCgpXCJcbiAgICAgICAgICAgIChlbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UpPVwib25FbGVtZW50Rm9ybVZpc2liaWxpdHlDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLXRlbXBsYXRlLXZhcmlhYmxlcy1mb3JtPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEFkdmFuY2VkIChFeHBhbmRhYmxlKSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gIGNxYS1nYXAtMiBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXAtMCBjcWEtbWItMS41XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFkdmFuY2VkKClcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTBweF1cIj5BZHZhbmNlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtYmFzZVwiIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgICAgZXhwYW5kX21vcmVcbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1tdC0yXCI+XG4gICAgICAgICAgICAgIDxjcWEtYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0gXG4gICAgICAgICAgICAgICAgW2FkdmFuY2VkVmFyaWFibGVzXT1cImFkdmFuY2VkU2V0dGluZ3NWYXJpYWJsZXNcIlxuICAgICAgICAgICAgICAgIFthZHZhbmNlZFZhcmlhYmxlRm9ybV09XCJhZHZhbmNlZFZhcmlhYmxlc0Zvcm1cIlxuICAgICAgICAgICAgICAgICh2YXJpYWJsZUJvb2xlYW5DaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlQm9vbGVhbkNoYW5nZSgkZXZlbnQubmFtZSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgKHZhcmlhYmxlVmFsdWVDaGFuZ2UpPVwib25BZHZhbmNlZFZhcmlhYmxlVmFsdWVDaGFuZ2UoJGV2ZW50Lm5hbWUsICRldmVudC52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgPC9jcWEtYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj4gXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cblxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWNyZWF0ZUVsZW1lbnRWaXNpYmxlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMCBjcWEtcGItMlwiPlxuICAgICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwib3V0bGluZWRcIiB0ZXh0PVwiQ2FuY2VsXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gKm5nSWY9XCIhaXNDcmVhdGluZ1N0ZXBcIiBjbGFzcz1cImNxYS13LTEvMlwiIHZhcmlhbnQ9XCJmaWxsZWRcIiBbdGV4dF09XCJpc0VkaXRNb2RlID8gJ1VwZGF0ZSBTdGVwJyA6ICdDcmVhdGUgU3RlcCdcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRm9ybVZhbGlkKClcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkNyZWF0ZVN0ZXAoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPCEtLSBMb2FkZXIgc2xvdDogc2FtZSBzaXplIGFzIENyZWF0ZSBTdGVwIGJ1dHRvbiAobGc6IDM4cHggaGVpZ2h0LCBmdWxsIHdpZHRoLCByb3VuZGVkLVs4cHhdKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJpc0NyZWF0aW5nU3RlcFwiIGNsYXNzPVwiY3FhLXctMS8yIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVszOHB4XSBjcWEtcm91bmRlZC1bOHB4XVwiPlxuICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgbGFiZWw9XCJDcmVhdGluZ+KAplwiXG4gICAgICAgICAgaWNvbj1cImF1dG9yZW5ld1wiXG4gICAgICAgICAgW2lzTG9hZGluZ109XCJ0cnVlXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgIFtpbmxpbmVTdHlsZXNdPVwiJ21pbi1oZWlnaHQ6IDM4cHg7IGhlaWdodDogMzhweDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7J1wiXG4gICAgICAgICAgdmFyaWFudD1cImluZm9cIlxuICAgICAgICAgIHNpemU9XCJtZWRpdW1cIj5cbiAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|