@libs-ui/components-table 0.2.357-14 → 0.2.357-16
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.
|
@@ -98,7 +98,7 @@ export class LibsUiComponentsTableTemplatesComponent {
|
|
|
98
98
|
this.functionControls.clear();
|
|
99
99
|
}
|
|
100
100
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsTableTemplatesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
101
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsTableTemplatesComponent, isStandalone: true, selector: "libs_ui-components-table-templates", inputs: { isHover: { classPropertyName: "isHover", publicName: "isHover", isSignal: true, isRequired: false, transformFunction: null }, configs: { classPropertyName: "configs", publicName: "configs", isSignal: true, isRequired: false, transformFunction: null }, templateCssWrapper: { classPropertyName: "templateCssWrapper", publicName: "templateCssWrapper", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if (configs(); as configs) {\n @if (item(); as item) {\n <div class=\"libs-ui-table-template {{ templateCssWrapperComputed() }}\">\n @for (config of configs; track config) {\n @if (config.fieldsConfig) {\n <div [class]=\"config.cssWrapper\">\n @for (fieldConfig of config.fieldsConfig; track fieldConfig; let index = $index) {\n @let constHtmlNgStyle = fieldConfig.getNgStyle ? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getNgStyle : item() | async) : fieldConfig.ngStyle || {};\n @let constHtmlNgClass = fieldConfig.getNgClass ? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getNgClass : item() | async) : fieldConfig.ngClass || {};\n @if (!fieldConfig.rows && !fieldConfig.getComponentOutlet) {\n @switch (fieldConfig.instance) {\n @case ('tooltip') {\n @if (fieldConfig.tooltip || {}; as tooltip) {\n <span\n LibsUiComponentsPopoverDirective\n [type]=\"tooltip.type || 'text'\"\n [mode]=\"tooltip.mode || 'hover'\"\n [isAddContentToParentDocument]=\"tooltip.isAddContentToParentDocument || false\"\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [classInclude]=\"tooltip.classInclude || ' '\"\n [ignoreShowPopover]=\"tooltip.ignoreShowPopover || false\"\n [config]=\"\n (fieldConfig.getTooltipConfig\n ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getTooltipConfig : item() | async)\n : (tooltip.config | LibsUiPipesCloneObjectPipe)\n ) | translate\n \"\n [innerHTML]=\"\n (fieldConfig.field ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true) : tooltip.dataView)\n | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item()\n | async\n | translate\n | LibsUiPipesSecurityTrustPipe: 'html' : false\n | async\n \"\n (outEvent)=\"handlerItemClick($event, fieldConfig)\"></span>\n }\n }\n @case ('image') {\n @if (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getImageSrc : item() : isImageError() | async; as linkImage) {\n @if (linkImage !== ' ') {\n <img\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [src]=\"linkImage\"\n alt=\"\"\n (error)=\"handlerImageError($event)\"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\" />\n }\n }\n }\n\n @case ('avatar') {\n @let constHtmlAvatarConfig =\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getAvatarConfig : item() : undefined : { valueIsEmpty: undefined } | async;\n @if (constHtmlAvatarConfig) {\n <libs_ui-components-avatar\n [typeShape]=\"constHtmlAvatarConfig.typeShape || 'circle'\"\n [classInclude]=\"constHtmlAvatarConfig.classInclude\"\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [size]=\"constHtmlAvatarConfig.size || 32\"\n [linkAvatar]=\"constHtmlAvatarConfig.linkAvatar\"\n [linkAvatarError]=\"constHtmlAvatarConfig.linkAvatarError\"\n [idGenColor]=\"constHtmlAvatarConfig.idGenColor\"\n [getLastTextAfterSpace]=\"constHtmlAvatarConfig.getLastTextAfterSpace\"\n [textAvatar]=\"constHtmlAvatarConfig.textAvatar\" />\n }\n }\n\n @case ('buttons') {\n @if ((fieldConfig.buttons && fieldConfig.buttons.length) || fieldConfig.getButtonsByItem) {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [class.invisible]=\"!isHover() && fieldConfig.showButtonHoverMode\">\n @for (button of fieldConfig.buttons || (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getButtonsByItem : item() | async); track button) {\n <libs_ui-components-buttons-button\n [type]=\"button().type || 'button-primary'\"\n [sizeButton]=\"button().sizeButton || 'smaller'\"\n [disable]=\"\n (button().disable ?? fieldConfig.getDisable) ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDisable : item() | async) : false\n \"\n [label]=\"button().label || ' '\"\n [classIconLeft]=\"button().classIconLeft || ''\"\n [classIconRight]=\"button().classIconRight || ''\"\n [popover]=\"button().popover || {}\"\n [classInclude]=\"button().classInclude || ''\"\n [ignorePointerEvent]=\"button().ignorePointerEvent\"\n [iconOnlyType]=\"button().iconOnlyType\"\n (outClick)=\"clickButtonAction(button())\" />\n }\n </div>\n }\n }\n\n @case ('button-status') {\n <libs_ui-components-buttons-status\n [config]=\"item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async\"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\" />\n }\n\n @case ('switch') {\n <libs_ui-components-switch\n [active]=\"item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getActiveValueSwitch : item() | async\"\n [disable]=\"fieldConfig.getDisableValueSwitch ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDisableValueSwitch : item() | async) : false\"\n (outSwitch)=\"handlerSwitch($event, fieldConfig)\" />\n }\n\n @case (fieldConfig.instance === 'other-action-show-popup' || fieldConfig.instance === 'badge' || fieldConfig.instance === 'button-action-show-popup' ? fieldConfig.instance : '') {\n @if ((item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async) !== ' ') {\n @let constHtmlDisableDropdown =\n (fieldConfig.dropdownConfig?.disable ?? fieldConfig.getDisable)\n ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDisable : item() | async)\n : false;\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [class.ml-[8px]]=\"!fieldConfig.ignoreClassMarginLeft\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent: false,\n ignoreArrow: fieldConfig.dropdownConfig?.ignoreArrow || false,\n maxHeight: fieldConfig.dropdownConfig?.maxHeight || 2048,\n paddingLeftItem: fieldConfig.dropdownConfig?.paddingLeftItem ?? true,\n classInclude: fieldConfig.dropdownConfig?.classIncludePopup || 'w-[250px]',\n position: fieldConfig.dropdownConfig?.position || {\n mode: 'center',\n distance: 0,\n },\n }\"\n [zIndex]=\"fieldConfig.dropdownConfig?.zIndex\"\n [listConfig]=\"\n fieldConfig.dropdownConfig?.getListConfig\n ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.dropdownConfig?.getListConfig : item() | async)\n : fieldConfig.dropdownConfig?.listConfig\n \"\n [listBackgroundCustom]=\"fieldConfig.dropdownConfig?.listBackgroundListCustom\"\n [listMaxItemShow]=\"fieldConfig.dropdownConfig?.listMaxItemShow || 5\"\n [listKeysDisable]=\"fieldConfig.dropdownConfig?.listKeysDisableItem\"\n [listHiddenInputSearch]=\"fieldConfig.dropdownConfig?.listHiddenInputSearch\"\n [disable]=\"constHtmlDisableDropdown\"\n (outFunctionsControl)=\"handlerFunctionControl($event, index)\"\n (outSelectKey)=\"handlerSelectItemDropdown(fieldConfig, index, $event)\"\n (outSelectMultiKey)=\"handlerSelectItemsDropdown(fieldConfig, index, $event)\">\n @if (fieldConfig.instance === 'other-action-show-popup') {\n <div\n [innerHTML]=\"\n item()\n | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true\n | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item()\n | async\n | translate\n | LibsUiPipesSecurityTrustPipe: 'html' : false\n | async\n \"></div>\n }\n @if (fieldConfig.instance === 'badge') {\n @let constHtmlDataBadge = item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async;\n @if (constHtmlDataBadge > 0) {\n <libs_ui-components-badge\n [active]=\"true\"\n [ignoreMarginDefault]=\"true\"\n mode=\"+x\"\n [count]=\"constHtmlDataBadge\"\n [maxCount]=\"99\" />\n }\n }\n @if (fieldConfig.instance === 'button-action-show-popup') {\n <libs_ui-components-buttons-button\n [type]=\"fieldConfig?.dropdownConfig?.button()?.type || 'button-primary'\"\n [sizeButton]=\"fieldConfig?.dropdownConfig?.button()?.sizeButton || 'smaller'\"\n [disable]=\"fieldConfig?.dropdownConfig?.button()?.disable ?? constHtmlDisableDropdown\"\n [label]=\"fieldConfig?.dropdownConfig?.button()?.label || ' '\"\n [classIconLeft]=\"fieldConfig?.dropdownConfig?.button()?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [classIconRight]=\"fieldConfig?.dropdownConfig?.button()?.classIconRight || ''\"\n [popover]=\"fieldConfig?.dropdownConfig?.button()?.popover || {}\"\n [classInclude]=\"fieldConfig?.dropdownConfig?.button()?.classInclude || ''\"\n [ignoreStopPropagationEvent]=\"true\" />\n }\n </libs_ui-components-dropdown>\n </div>\n }\n }\n\n @case ('line-clamp') {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\">\n @if (fieldConfig.lineClampConfig; as lineClampConfig) {\n <libs_ui-components-line_clamp\n [ignoreShowButtonCollapseExpand]=\"lineClampConfig.ignoreShowButtonCollapseExpand ?? true\"\n [showTooltip]=\"lineClampConfig.showTooltip ?? true\"\n [maxHeight]=\"lineClampConfig.maxHeight || 36\"\n [maxWidthTooltip]=\"lineClampConfig.maxWidthTooltip || 200\"\n [maxHeightTooltip]=\"lineClampConfig.maxHeightTooltip || 100\"\n [ngClassObject]=\"lineClampConfig.ngClassObject ?? { 'libs-ui-line-clamp-content libs-ui-font-h5r': true }\"\n [isInnerText]=\"lineClampConfig.isInnerText || false\"\n [ignoreStopPropagationTooltipEvent]=\"true\"\n [content]=\"item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async\"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\" />\n }\n </div>\n }\n\n @case ('shape-style') {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [innerHTML]=\"\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async | translate | LibsUiPipesSecurityTrustPipe: 'html' : false | async\n \"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\"></div>\n }\n @default {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [innerHTML]=\"\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async | translate | LibsUiPipesSecurityTrustPipe: 'html' : true | async\n \"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\"></div>\n }\n }\n } @else {\n @if (fieldConfig.rows) {\n <div\n class=\"w-full flex relative {{ fieldConfig.rowsTemplateCssWrapper }}\"\n [style.height.px]=\"rowRef.clientHeight\">\n <div\n #rowRef\n class=\"w-full flex absolute {{ fieldConfig.rowsTemplateCssWrapper }}\">\n <libs_ui-components-table-templates\n class=\"flex w-full\"\n [item]=\"item\"\n [configs]=\"fieldConfig.rows\" />\n </div>\n </div>\n } @else {\n <ng-container\n *ngComponentOutlet=\"\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getComponentOutlet : item() | async;\n inputs: undefined | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDataComponentOutlet : item() : fieldConfig.field : { valueIsEmpty: { item: item() } } | async\n \" />\n }\n }\n }\n </div>\n }\n }\n </div>\n }\n}\n", styles: [":host{width:100%;height:100%}:host .libs-ui-table-template{color:#071631;font-size:12px;font-weight:400;width:100%;height:inherit}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "pipe", type: LibsUiPipesGetValueOfObjectPipe, name: "LibsUiPipesGetValueOfObjectPipe" }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "classImageInclude", "zIndexPreviewImage", "clickPreviewImage", "idGenColor", "getLastTextAfterSpace", "textAvatar", "textAvatarClassInclude", "containerTextAvatarClassInclude"], outputs: ["outAvatarError", "outEventPreviewImage"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesSecurityTrustPipe, name: "LibsUiPipesSecurityTrustPipe" }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsStatusComponent, selector: "libs_ui-components-buttons-status", inputs: ["config"] }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { kind: "pipe", type: LibsUiPipesCloneObjectPipe, name: "LibsUiPipesCloneObjectPipe" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsLineClampComponent, selector: "libs_ui-components-line_clamp", inputs: ["content", "lengthLimitDisplay", "maxHeight", "ignoreShowButtonCollapseExpand", "ignoreShowButtonCollapse", "showTooltip", "timeHidePopoverOnMouseout", "maxWidthTooltip", "maxHeightTooltip", "zIndexPopover", "isInnerText", "classClassLabelButtonCollapseExpand", "classClassIncludeButtonCollapseExpand", "ignoreStopPropagationTooltipEvent", "ngClassObject", "hasBackgroundGradient", "labelButtonViewMore", "labelButtonCollapse", "directionTooltip", "useXssFilter", "defaultIsCollapse"], outputs: ["outDisplayLineClamp", "outAction", "outClick", "outFunctionControl"] }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsBadgeComponent, selector: "libs_ui-components-badge", inputs: ["popoverConfig", "active", "count", "mode", "maxCount", "ignoreMarginDefault", "classCircle", "ignoreStopPropagationEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
101
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsTableTemplatesComponent, isStandalone: true, selector: "libs_ui-components-table-templates", inputs: { isHover: { classPropertyName: "isHover", publicName: "isHover", isSignal: true, isRequired: false, transformFunction: null }, configs: { classPropertyName: "configs", publicName: "configs", isSignal: true, isRequired: false, transformFunction: null }, templateCssWrapper: { classPropertyName: "templateCssWrapper", publicName: "templateCssWrapper", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if (configs(); as configs) {\n @if (item(); as item) {\n <div class=\"libs-ui-table-template {{ templateCssWrapperComputed() }}\">\n @for (config of configs; track config) {\n @if (config.fieldsConfig) {\n <div [class]=\"config.cssWrapper\">\n @for (fieldConfig of config.fieldsConfig; track fieldConfig; let index = $index) {\n @let constHtmlNgStyle = fieldConfig.getNgStyle ? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getNgStyle : item() | async) : fieldConfig.ngStyle || {};\n @let constHtmlNgClass = fieldConfig.getNgClass ? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getNgClass : item() | async) : fieldConfig.ngClass || {};\n @if (!fieldConfig.rows && !fieldConfig.getComponentOutlet) {\n @switch (fieldConfig.instance) {\n @case ('tooltip') {\n @if (fieldConfig.tooltip || {}; as tooltip) {\n <span\n LibsUiComponentsPopoverDirective\n [type]=\"tooltip.type || 'text'\"\n [mode]=\"tooltip.mode || 'hover'\"\n [isAddContentToParentDocument]=\"tooltip.isAddContentToParentDocument || false\"\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [classInclude]=\"tooltip.classInclude || ' '\"\n [ignoreShowPopover]=\"tooltip.ignoreShowPopover || false\"\n [config]=\"\n (fieldConfig.getTooltipConfig\n ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getTooltipConfig : item() | async)\n : (tooltip.config | LibsUiPipesCloneObjectPipe)\n ) | translate\n \"\n [innerHTML]=\"\n (fieldConfig.field ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true) : tooltip.dataView)\n | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item()\n | async\n | translate\n | LibsUiPipesSecurityTrustPipe: 'html' : false\n | async\n \"\n (outEvent)=\"handlerItemClick($event, fieldConfig)\"></span>\n }\n }\n @case ('image') {\n @if (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getImageSrc : item() : isImageError() | async; as linkImage) {\n @if (linkImage !== ' ') {\n <img\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [src]=\"linkImage\"\n alt=\"\"\n (error)=\"handlerImageError($event)\"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\" />\n }\n }\n }\n\n @case ('avatar') {\n @let constHtmlAvatarConfig =\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getAvatarConfig : item() : undefined : { valueIsEmpty: undefined } | async;\n @if (constHtmlAvatarConfig) {\n <libs_ui-components-avatar\n [typeShape]=\"constHtmlAvatarConfig.typeShape || 'circle'\"\n [classInclude]=\"constHtmlAvatarConfig.classInclude\"\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [size]=\"constHtmlAvatarConfig.size || 32\"\n [linkAvatar]=\"constHtmlAvatarConfig.linkAvatar\"\n [linkAvatarError]=\"constHtmlAvatarConfig.linkAvatarError\"\n [idGenColor]=\"constHtmlAvatarConfig.idGenColor\"\n [getLastTextAfterSpace]=\"constHtmlAvatarConfig.getLastTextAfterSpace\"\n [textAvatar]=\"constHtmlAvatarConfig.textAvatar\" />\n }\n }\n\n @case ('buttons') {\n @if ((fieldConfig.buttons && fieldConfig.buttons.length) || fieldConfig.getButtonsByItem) {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [class.invisible]=\"!isHover() && fieldConfig.showButtonHoverMode\">\n @for (button of fieldConfig.buttons || (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getButtonsByItem : item() | async); track button) {\n <libs_ui-components-buttons-button\n [type]=\"button().type || 'button-primary'\"\n [sizeButton]=\"button().sizeButton || 'smaller'\"\n [disable]=\"\n (button().disable ?? fieldConfig.getDisable) ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDisable : item() | async) : false\n \"\n [label]=\"button().label || ' '\"\n [classIconLeft]=\"button().classIconLeft || ''\"\n [classIconRight]=\"button().classIconRight || ''\"\n [popover]=\"button().popover || {}\"\n [classInclude]=\"button().classInclude || ''\"\n [ignorePointerEvent]=\"button().ignorePointerEvent\"\n [iconOnlyType]=\"button().iconOnlyType\"\n (outClick)=\"clickButtonAction(button())\" />\n }\n </div>\n }\n }\n\n @case ('button-status') {\n <libs_ui-components-buttons-status\n [config]=\"item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async\"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\" />\n }\n\n @case ('switch') {\n <libs_ui-components-switch\n [active]=\"item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getActiveValueSwitch : item() | async\"\n [disable]=\"fieldConfig.getDisableValueSwitch ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDisableValueSwitch : item() | async) : false\"\n (outSwitch)=\"handlerSwitch($event, fieldConfig)\" />\n }\n\n @case (fieldConfig.instance === 'other-action-show-popup' || fieldConfig.instance === 'badge' || fieldConfig.instance === 'button-action-show-popup' ? fieldConfig.instance : '') {\n @if ((item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async) !== ' ') {\n @let constHtmlDisableDropdown =\n (fieldConfig.dropdownConfig?.disable ?? fieldConfig.getDisable)\n ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDisable : item() | async)\n : false;\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [class.ml-[8px]]=\"!fieldConfig.ignoreClassMarginLeft\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent: false,\n ignoreArrow: fieldConfig.dropdownConfig?.ignoreArrow || false,\n maxHeight: fieldConfig.dropdownConfig?.maxHeight || 2048,\n paddingLeftItem: fieldConfig.dropdownConfig?.paddingLeftItem ?? true,\n classInclude: fieldConfig.dropdownConfig?.classIncludePopup || 'w-[250px]',\n position: fieldConfig.dropdownConfig?.position || {\n mode: 'center',\n distance: 0,\n },\n }\"\n [zIndex]=\"fieldConfig.dropdownConfig?.zIndex\"\n [listConfig]=\"\n fieldConfig.dropdownConfig?.getListConfig\n ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.dropdownConfig?.getListConfig : item() | async)\n : fieldConfig.dropdownConfig?.listConfig\n \"\n [listBackgroundCustom]=\"fieldConfig.dropdownConfig?.listBackgroundListCustom\"\n [listMaxItemShow]=\"fieldConfig.dropdownConfig?.listMaxItemShow || 5\"\n [listKeysDisable]=\"fieldConfig.dropdownConfig?.listKeysDisableItem\"\n [listHiddenInputSearch]=\"fieldConfig.dropdownConfig?.listHiddenInputSearch\"\n [disable]=\"constHtmlDisableDropdown\"\n (outFunctionsControl)=\"handlerFunctionControl($event, index)\"\n (outSelectKey)=\"handlerSelectItemDropdown(fieldConfig, index, $event)\"\n (outSelectMultiKey)=\"handlerSelectItemsDropdown(fieldConfig, index, $event)\">\n @if (fieldConfig.instance === 'other-action-show-popup') {\n <div\n [innerHTML]=\"\n item()\n | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true\n | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item()\n | async\n | translate\n | LibsUiPipesSecurityTrustPipe: 'html' : false\n | async\n \"></div>\n }\n @if (fieldConfig.instance === 'badge') {\n @let constHtmlDataBadge = item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async;\n @if (constHtmlDataBadge > 0) {\n <libs_ui-components-badge\n [active]=\"true\"\n [ignoreMarginDefault]=\"true\"\n mode=\"+x\"\n [count]=\"constHtmlDataBadge\"\n [maxCount]=\"99\" />\n }\n }\n @if (fieldConfig.instance === 'button-action-show-popup') {\n <libs_ui-components-buttons-button\n [type]=\"fieldConfig?.dropdownConfig?.button()?.type || 'button-primary'\"\n [sizeButton]=\"fieldConfig?.dropdownConfig?.button()?.sizeButton || 'smaller'\"\n [disable]=\"fieldConfig?.dropdownConfig?.button()?.disable ?? constHtmlDisableDropdown\"\n [label]=\"fieldConfig?.dropdownConfig?.button()?.label || ' '\"\n [classIconLeft]=\"fieldConfig?.dropdownConfig?.button()?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [classIconRight]=\"fieldConfig?.dropdownConfig?.button()?.classIconRight || ''\"\n [popover]=\"fieldConfig?.dropdownConfig?.button()?.popover || {}\"\n [classInclude]=\"fieldConfig?.dropdownConfig?.button()?.classInclude || ''\"\n [ignoreStopPropagationEvent]=\"true\" />\n }\n </libs_ui-components-dropdown>\n </div>\n }\n }\n\n @case ('line-clamp') {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\">\n @if (fieldConfig.lineClampConfig; as lineClampConfig) {\n <libs_ui-components-line_clamp\n [ignoreShowButtonCollapseExpand]=\"lineClampConfig.ignoreShowButtonCollapseExpand ?? true\"\n [showTooltip]=\"lineClampConfig.showTooltip ?? true\"\n [maxHeight]=\"lineClampConfig.maxHeight || 36\"\n [maxWidthTooltip]=\"lineClampConfig.maxWidthTooltip || 200\"\n [maxHeightTooltip]=\"lineClampConfig.maxHeightTooltip || 100\"\n [ngClassObject]=\"lineClampConfig.ngClassObject ?? { 'libs-ui-line-clamp-content libs-ui-font-h5r': true }\"\n [isInnerText]=\"lineClampConfig.isInnerText || false\"\n [ignoreStopPropagationTooltipEvent]=\"true\"\n [content]=\"item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async\"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\" />\n }\n </div>\n }\n\n @case ('shape-style') {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [innerHTML]=\"\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async | translate | LibsUiPipesSecurityTrustPipe: 'html' : false | async\n \"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\"></div>\n }\n @default {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [innerHTML]=\"\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async | translate | LibsUiPipesSecurityTrustPipe: 'html' : true | async\n \"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\"></div>\n }\n }\n } @else {\n @if (fieldConfig.rows) {\n <div\n class=\"w-full flex relative {{ fieldConfig.rowsTemplateCssWrapper }}\"\n [style.height.px]=\"rowRef.clientHeight\">\n <div\n #rowRef\n class=\"w-full flex absolute {{ fieldConfig.rowsTemplateCssWrapper }}\">\n <libs_ui-components-table-templates\n class=\"flex w-full\"\n [item]=\"item\"\n [configs]=\"fieldConfig.rows\" />\n </div>\n </div>\n } @else {\n <ng-container\n *ngComponentOutlet=\"\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getComponentOutlet : item() | async;\n inputs: undefined | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDataComponentOutlet : item() : fieldConfig.field : { valueIsEmpty: { item: item() } } | async\n \" />\n }\n }\n }\n </div>\n }\n }\n </div>\n }\n}\n", styles: [":host{width:100%;height:100%}:host .libs-ui-table-template{color:#071631;font-size:12px;font-weight:400;width:100%;height:inherit}\n"], dependencies: [{ kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "pipe", type: LibsUiPipesGetValueOfObjectPipe, name: "LibsUiPipesGetValueOfObjectPipe" }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "classImageInclude", "zIndexPreviewImage", "clickPreviewImage", "idGenColor", "getLastTextAfterSpace", "textAvatar", "textAvatarClassInclude", "containerTextAvatarClassInclude"], outputs: ["outAvatarError", "outEventPreviewImage"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesSecurityTrustPipe, name: "LibsUiPipesSecurityTrustPipe" }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsStatusComponent, selector: "libs_ui-components-buttons-status", inputs: ["config"] }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { kind: "pipe", type: LibsUiPipesCloneObjectPipe, name: "LibsUiPipesCloneObjectPipe" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsLineClampComponent, selector: "libs_ui-components-line_clamp", inputs: ["content", "lengthLimitDisplay", "maxHeight", "ignoreShowButtonCollapseExpand", "ignoreShowButtonCollapse", "showTooltip", "timeHidePopoverOnMouseout", "maxWidthTooltip", "maxHeightTooltip", "zIndexPopover", "isInnerText", "classClassLabelButtonCollapseExpand", "classClassIncludeButtonCollapseExpand", "ignoreStopPropagationTooltipEvent", "ngClassObject", "hasBackgroundGradient", "labelButtonViewMore", "labelButtonCollapse", "directionTooltip", "useXssFilter", "defaultIsCollapse"], outputs: ["outDisplayLineClamp", "outAction", "outClick", "outFunctionControl"] }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "onlyEmitMultiKeyWhenManualClick", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsBadgeComponent, selector: "libs_ui-components-badge", inputs: ["popoverConfig", "active", "count", "mode", "maxCount", "ignoreMarginDefault", "classCircle", "ignoreStopPropagationEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
102
102
|
}
|
|
103
103
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsTableTemplatesComponent, decorators: [{
|
|
104
104
|
type: Component,
|
|
@@ -122,4 +122,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
122
122
|
LibsUiComponentsBadgeComponent,
|
|
123
123
|
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (configs(); as configs) {\n @if (item(); as item) {\n <div class=\"libs-ui-table-template {{ templateCssWrapperComputed() }}\">\n @for (config of configs; track config) {\n @if (config.fieldsConfig) {\n <div [class]=\"config.cssWrapper\">\n @for (fieldConfig of config.fieldsConfig; track fieldConfig; let index = $index) {\n @let constHtmlNgStyle = fieldConfig.getNgStyle ? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getNgStyle : item() | async) : fieldConfig.ngStyle || {};\n @let constHtmlNgClass = fieldConfig.getNgClass ? (item()[fieldConfig.field] | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getNgClass : item() | async) : fieldConfig.ngClass || {};\n @if (!fieldConfig.rows && !fieldConfig.getComponentOutlet) {\n @switch (fieldConfig.instance) {\n @case ('tooltip') {\n @if (fieldConfig.tooltip || {}; as tooltip) {\n <span\n LibsUiComponentsPopoverDirective\n [type]=\"tooltip.type || 'text'\"\n [mode]=\"tooltip.mode || 'hover'\"\n [isAddContentToParentDocument]=\"tooltip.isAddContentToParentDocument || false\"\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [classInclude]=\"tooltip.classInclude || ' '\"\n [ignoreShowPopover]=\"tooltip.ignoreShowPopover || false\"\n [config]=\"\n (fieldConfig.getTooltipConfig\n ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getTooltipConfig : item() | async)\n : (tooltip.config | LibsUiPipesCloneObjectPipe)\n ) | translate\n \"\n [innerHTML]=\"\n (fieldConfig.field ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true) : tooltip.dataView)\n | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item()\n | async\n | translate\n | LibsUiPipesSecurityTrustPipe: 'html' : false\n | async\n \"\n (outEvent)=\"handlerItemClick($event, fieldConfig)\"></span>\n }\n }\n @case ('image') {\n @if (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getImageSrc : item() : isImageError() | async; as linkImage) {\n @if (linkImage !== ' ') {\n <img\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [src]=\"linkImage\"\n alt=\"\"\n (error)=\"handlerImageError($event)\"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\" />\n }\n }\n }\n\n @case ('avatar') {\n @let constHtmlAvatarConfig =\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getAvatarConfig : item() : undefined : { valueIsEmpty: undefined } | async;\n @if (constHtmlAvatarConfig) {\n <libs_ui-components-avatar\n [typeShape]=\"constHtmlAvatarConfig.typeShape || 'circle'\"\n [classInclude]=\"constHtmlAvatarConfig.classInclude\"\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [size]=\"constHtmlAvatarConfig.size || 32\"\n [linkAvatar]=\"constHtmlAvatarConfig.linkAvatar\"\n [linkAvatarError]=\"constHtmlAvatarConfig.linkAvatarError\"\n [idGenColor]=\"constHtmlAvatarConfig.idGenColor\"\n [getLastTextAfterSpace]=\"constHtmlAvatarConfig.getLastTextAfterSpace\"\n [textAvatar]=\"constHtmlAvatarConfig.textAvatar\" />\n }\n }\n\n @case ('buttons') {\n @if ((fieldConfig.buttons && fieldConfig.buttons.length) || fieldConfig.getButtonsByItem) {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [class.invisible]=\"!isHover() && fieldConfig.showButtonHoverMode\">\n @for (button of fieldConfig.buttons || (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getButtonsByItem : item() | async); track button) {\n <libs_ui-components-buttons-button\n [type]=\"button().type || 'button-primary'\"\n [sizeButton]=\"button().sizeButton || 'smaller'\"\n [disable]=\"\n (button().disable ?? fieldConfig.getDisable) ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDisable : item() | async) : false\n \"\n [label]=\"button().label || ' '\"\n [classIconLeft]=\"button().classIconLeft || ''\"\n [classIconRight]=\"button().classIconRight || ''\"\n [popover]=\"button().popover || {}\"\n [classInclude]=\"button().classInclude || ''\"\n [ignorePointerEvent]=\"button().ignorePointerEvent\"\n [iconOnlyType]=\"button().iconOnlyType\"\n (outClick)=\"clickButtonAction(button())\" />\n }\n </div>\n }\n }\n\n @case ('button-status') {\n <libs_ui-components-buttons-status\n [config]=\"item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async\"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\" />\n }\n\n @case ('switch') {\n <libs_ui-components-switch\n [active]=\"item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getActiveValueSwitch : item() | async\"\n [disable]=\"fieldConfig.getDisableValueSwitch ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDisableValueSwitch : item() | async) : false\"\n (outSwitch)=\"handlerSwitch($event, fieldConfig)\" />\n }\n\n @case (fieldConfig.instance === 'other-action-show-popup' || fieldConfig.instance === 'badge' || fieldConfig.instance === 'button-action-show-popup' ? fieldConfig.instance : '') {\n @if ((item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async) !== ' ') {\n @let constHtmlDisableDropdown =\n (fieldConfig.dropdownConfig?.disable ?? fieldConfig.getDisable)\n ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDisable : item() | async)\n : false;\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [class.ml-[8px]]=\"!fieldConfig.ignoreClassMarginLeft\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent: false,\n ignoreArrow: fieldConfig.dropdownConfig?.ignoreArrow || false,\n maxHeight: fieldConfig.dropdownConfig?.maxHeight || 2048,\n paddingLeftItem: fieldConfig.dropdownConfig?.paddingLeftItem ?? true,\n classInclude: fieldConfig.dropdownConfig?.classIncludePopup || 'w-[250px]',\n position: fieldConfig.dropdownConfig?.position || {\n mode: 'center',\n distance: 0,\n },\n }\"\n [zIndex]=\"fieldConfig.dropdownConfig?.zIndex\"\n [listConfig]=\"\n fieldConfig.dropdownConfig?.getListConfig\n ? (item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.dropdownConfig?.getListConfig : item() | async)\n : fieldConfig.dropdownConfig?.listConfig\n \"\n [listBackgroundCustom]=\"fieldConfig.dropdownConfig?.listBackgroundListCustom\"\n [listMaxItemShow]=\"fieldConfig.dropdownConfig?.listMaxItemShow || 5\"\n [listKeysDisable]=\"fieldConfig.dropdownConfig?.listKeysDisableItem\"\n [listHiddenInputSearch]=\"fieldConfig.dropdownConfig?.listHiddenInputSearch\"\n [disable]=\"constHtmlDisableDropdown\"\n (outFunctionsControl)=\"handlerFunctionControl($event, index)\"\n (outSelectKey)=\"handlerSelectItemDropdown(fieldConfig, index, $event)\"\n (outSelectMultiKey)=\"handlerSelectItemsDropdown(fieldConfig, index, $event)\">\n @if (fieldConfig.instance === 'other-action-show-popup') {\n <div\n [innerHTML]=\"\n item()\n | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true\n | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item()\n | async\n | translate\n | LibsUiPipesSecurityTrustPipe: 'html' : false\n | async\n \"></div>\n }\n @if (fieldConfig.instance === 'badge') {\n @let constHtmlDataBadge = item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async;\n @if (constHtmlDataBadge > 0) {\n <libs_ui-components-badge\n [active]=\"true\"\n [ignoreMarginDefault]=\"true\"\n mode=\"+x\"\n [count]=\"constHtmlDataBadge\"\n [maxCount]=\"99\" />\n }\n }\n @if (fieldConfig.instance === 'button-action-show-popup') {\n <libs_ui-components-buttons-button\n [type]=\"fieldConfig?.dropdownConfig?.button()?.type || 'button-primary'\"\n [sizeButton]=\"fieldConfig?.dropdownConfig?.button()?.sizeButton || 'smaller'\"\n [disable]=\"fieldConfig?.dropdownConfig?.button()?.disable ?? constHtmlDisableDropdown\"\n [label]=\"fieldConfig?.dropdownConfig?.button()?.label || ' '\"\n [classIconLeft]=\"fieldConfig?.dropdownConfig?.button()?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [classIconRight]=\"fieldConfig?.dropdownConfig?.button()?.classIconRight || ''\"\n [popover]=\"fieldConfig?.dropdownConfig?.button()?.popover || {}\"\n [classInclude]=\"fieldConfig?.dropdownConfig?.button()?.classInclude || ''\"\n [ignoreStopPropagationEvent]=\"true\" />\n }\n </libs_ui-components-dropdown>\n </div>\n }\n }\n\n @case ('line-clamp') {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\">\n @if (fieldConfig.lineClampConfig; as lineClampConfig) {\n <libs_ui-components-line_clamp\n [ignoreShowButtonCollapseExpand]=\"lineClampConfig.ignoreShowButtonCollapseExpand ?? true\"\n [showTooltip]=\"lineClampConfig.showTooltip ?? true\"\n [maxHeight]=\"lineClampConfig.maxHeight || 36\"\n [maxWidthTooltip]=\"lineClampConfig.maxWidthTooltip || 200\"\n [maxHeightTooltip]=\"lineClampConfig.maxHeightTooltip || 100\"\n [ngClassObject]=\"lineClampConfig.ngClassObject ?? { 'libs-ui-line-clamp-content libs-ui-font-h5r': true }\"\n [isInnerText]=\"lineClampConfig.isInnerText || false\"\n [ignoreStopPropagationTooltipEvent]=\"true\"\n [content]=\"item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async\"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\" />\n }\n </div>\n }\n\n @case ('shape-style') {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [innerHTML]=\"\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async | translate | LibsUiPipesSecurityTrustPipe: 'html' : false | async\n \"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\"></div>\n }\n @default {\n <div\n [ngStyle]=\"constHtmlNgStyle\"\n [ngClass]=\"constHtmlNgClass\"\n [innerHTML]=\"\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.parseValue : item() | async | translate | LibsUiPipesSecurityTrustPipe: 'html' : true | async\n \"\n (click)=\"handlerItemClick($event, fieldConfig)\"\n (keydown.enter)=\"handlerItemClick($event, fieldConfig)\"></div>\n }\n }\n } @else {\n @if (fieldConfig.rows) {\n <div\n class=\"w-full flex relative {{ fieldConfig.rowsTemplateCssWrapper }}\"\n [style.height.px]=\"rowRef.clientHeight\">\n <div\n #rowRef\n class=\"w-full flex absolute {{ fieldConfig.rowsTemplateCssWrapper }}\">\n <libs_ui-components-table-templates\n class=\"flex w-full\"\n [item]=\"item\"\n [configs]=\"fieldConfig.rows\" />\n </div>\n </div>\n } @else {\n <ng-container\n *ngComponentOutlet=\"\n item() | LibsUiPipesGetValueOfObjectPipe: fieldConfig.field : undefined : true | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getComponentOutlet : item() | async;\n inputs: undefined | LibsUiPipesCallFunctionInTemplatePipe: fieldConfig.getDataComponentOutlet : item() : fieldConfig.field : { valueIsEmpty: { item: item() } } | async\n \" />\n }\n }\n }\n </div>\n }\n }\n </div>\n }\n}\n", styles: [":host{width:100%;height:100%}:host .libs-ui-table-template{color:#071631;font-size:12px;font-weight:400;width:100%;height:inherit}\n"] }]
|
|
124
124
|
}] });
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy90YWJsZS9zcmMvdGVtcGxhdGVzL3RlbXBsYXRlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RlbXBsYXRlcy90ZW1wbGF0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0UsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0UsT0FBTyxFQUFXLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckcsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFnRSxpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9JLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRyxPQUFPLEVBQWdCLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0YsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekUsT0FBTyxFQUFF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QVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULFlBQVksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEMsQ0FBQzt3R0F2RlUsdUNBQXVDOzRGQUF2Qyx1Q0FBdUMseW5CQzlDcEQsd3dpQkFvUUEsOExEdE5hLHVDQUF1Qyw2SUFwQmhELE9BQU8sMkVBQ1AsT0FBTyxtRkFDUCxlQUFlLHVGQUNmLFNBQVMsOENBQ1QsaUJBQWlCLCtPQUNqQiwrQkFBK0Isd0VBQy9CLCtCQUErQix3WEFDL0IscUNBQXFDLHlFQUNyQyw0QkFBNEIscUVBQzVCLGdDQUFnQyxvZ0JBQ2hDLHNDQUFzQyxrR0FDdEMsK0JBQStCLGdKQUMvQiwwQkFBMEIsbUVBQzFCLHNDQUFzQyxzakJBQ3RDLGtDQUFrQywwb0JBQ2xDLGlDQUFpQyx1M0RBQ2pDLDhCQUE4Qjs7NEZBSXJCLHVDQUF1QztrQkEzQm5ELFNBQVM7K0JBRUUsb0NBQW9DLGNBR2xDLElBQUksV0FDUDt3QkFDUCxPQUFPO3dCQUNQLE9BQU87d0JBQ1AsZUFBZTt3QkFDZixTQUFTO3dCQUNULGlCQUFpQjt3QkFDakIsK0JBQStCO3dCQUMvQiwrQkFBK0I7d0JBQy9CLHFDQUFxQzt3QkFDckMsNEJBQTRCO3dCQUM1QixnQ0FBZ0M7d0JBQ2hDLHNDQUFzQzt3QkFDdEMsK0JBQStCO3dCQUMvQiwwQkFBMEI7d0JBQzFCLHNDQUFzQzt3QkFDdEMsa0NBQWtDO3dCQUNsQyxpQ0FBaUM7d0JBQ2pDLDhCQUE4QjtxQkFDL0IsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nQ29tcG9uZW50T3V0bGV0LCBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCwgT25EZXN0cm95LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNBdmF0YXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWF2YXRhcic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQmFkZ2VDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJhZGdlJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1N0YXR1c0NvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1zdGF0dXMnO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0TXVsdGlLZXksIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaW5lQ2xhbXBDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxpbmUtY2xhbXAnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBJU3dpdGNoRXZlbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0Nsb25lT2JqZWN0UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNsb25lLW9iamVjdCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZ2V0LXZhbHVlLW9mLW9iamVjdCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtc2VjdXJpdHktdHJ1c3QnO1xuaW1wb3J0IHsgY29udmVydE9iamVjdFRvU2lnbmFsLCBnZXQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRZUEVfSVRFTV9EQVRBX1RBQkxFIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJVGFibGVGaWVsZFRlbXBsYXRlQ29uZmlnLCBJVGFibGVUZW1wbGF0ZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvdGVtcGxhdGUtY29uZmlnLmludGVyZmFjZSc7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RlbXBsYXRlcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RlbXBsYXRlcy5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdTdHlsZSxcbiAgICBOZ0NsYXNzLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgTmdDb21wb25lbnRPdXRsZXQsXG4gICAgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LFxuICAgIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsXG4gICAgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1N0YXR1c0NvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU3dpdGNoQ29tcG9uZW50LFxuICAgIExpYnNVaVBpcGVzQ2xvbmVPYmplY3RQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNMaW5lQ2xhbXBDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCYWRnZUNvbXBvbmVudCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNUYWJsZVRlbXBsYXRlc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgbG9ja0NsaWNrITogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsb2NrQ2xpY2tUaW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGZ1bmN0aW9uQ29udHJvbHMgPSBuZXcgTWFwPG51bWJlciwgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHByb3RlY3RlZCBpc0ltYWdlRXJyb3IgPSBzaWduYWw8Ym9vbGVhbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICByZWFkb25seSBpc0hvdmVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY29uZmlncyA9IGlucHV0PEFycmF5PElUYWJsZVRlbXBsYXRlQ29uZmlnPj4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVDc3NXcmFwcGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpdGVtID0gaW5wdXQucmVxdWlyZWQ8VFlQRV9JVEVNX0RBVEFfVEFCTEU+KCk7XG5cbiAgcHJvdGVjdGVkIHRlbXBsYXRlQ3NzV3JhcHBlckNvbXB1dGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50ZW1wbGF0ZUNzc1dyYXBwZXIoKSB8fCAnJyk7XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJJdGVtQ2xpY2soZXZlbnQ6IEV2ZW50IHwgVFlQRV9QT1BPVkVSX0VWRU5UIHwgdW5kZWZpbmVkLCBjb25maWc6IElUYWJsZUZpZWxkVGVtcGxhdGVDb25maWcpIHtcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJyAmJiBldmVudCAhPT0gJ2NsaWNrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmhhbmRsZUxvY2tDbGljayhhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoY29uZmlnPy5hY3Rpb24pIHtcbiAgICAgICAgY29uZmlnLmFjdGlvbihnZXQodGhpcy5pdGVtKCksIGNvbmZpZy5maWVsZCBhcyBhbnkpLCB0aGlzLml0ZW0oKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2xpY2tCdXR0b25BY3Rpb24oYnV0dG9uOiBJQnV0dG9uKSB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVMb2NrQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgYnV0dG9uLmFjdGlvbj8uKHsgaXRlbTogdGhpcy5pdGVtKCkgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclN3aXRjaChzd2l0Y2hJdGVtOiBJU3dpdGNoRXZlbnQsIGNvbmZpZzogSVRhYmxlRmllbGRUZW1wbGF0ZUNvbmZpZykge1xuICAgIGF3YWl0IHRoaXMuaGFuZGxlTG9ja0NsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbmZpZz8uc3dpdGNoQWN0aW9uPy4oc3dpdGNoSXRlbSwgdGhpcy5pdGVtKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWxlY3RJdGVtRHJvcGRvd24oZmllbGRDb25maWc6IElUYWJsZUZpZWxkVGVtcGxhdGVDb25maWcsIGluZGV4OiBudW1iZXIsIGRhdGE/OiBJRW1pdFNlbGVjdEtleSkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmhhbmRsZUxvY2tDbGljayhhc3luYyAoKSA9PiB7XG4gICAgICBmaWVsZENvbmZpZz8uYWN0aW9uPy4oZGF0YS5rZXksIGRhdGEuaXRlbSwgdGhpcy5pdGVtKCkpO1xuICAgICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xzPy5nZXQoaW5kZXgpPy5yZXNldCgpO1xuICAgICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xzPy5nZXQoaW5kZXgpPy5yZW1vdmVMaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdEl0ZW1zRHJvcGRvd24oZmllbGRDb25maWc6IElUYWJsZUZpZWxkVGVtcGxhdGVDb25maWcsIGluZGV4OiBudW1iZXIsIGRhdGE/OiBJRW1pdE11bHRpS2V5KSB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuaGFuZGxlTG9ja0NsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgIGZpZWxkQ29uZmlnPy5hY3Rpb24/LihkYXRhLmtleXMsIGNvbnZlcnRPYmplY3RUb1NpZ25hbChkYXRhLm1hcEtleXMsIGZhbHNlKSwgdGhpcy5pdGVtKCkpO1xuICAgICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xzPy5nZXQoaW5kZXgpPy5yZXNldCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJJbWFnZUVycm9yKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNJbWFnZUVycm9yLnNldCh0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRnVuY3Rpb25Db250cm9sKGV2ZW50OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9scy5zZXQoaW5kZXgsIGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlTG9ja0NsaWNrKGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgaWYgKHRoaXMubG9ja0NsaWNrKSByZXR1cm47XG4gICAgdGhpcy5sb2NrQ2xpY2sgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYWxsYmFjaygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2NrQ2xpY2tUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2NrQ2xpY2sgPSBmYWxzZTtcbiAgICAgIH0sIDI1MCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubG9ja0NsaWNrVGltZW91dElkKTtcbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbHMuY2xlYXIoKTtcbiAgfVxufVxuIiwiQGlmIChjb25maWdzKCk7IGFzIGNvbmZpZ3MpIHtcbiAgQGlmIChpdGVtKCk7IGFzIGl0ZW0pIHtcbiAgICA8ZGl2IGNsYXNzPVwibGlicy11aS10YWJsZS10ZW1wbGF0ZSB7eyB0ZW1wbGF0ZUNzc1dyYXBwZXJDb21wdXRlZCgpIH19XCI+XG4gICAgICBAZm9yIChjb25maWcgb2YgY29uZmlnczsgdHJhY2sgY29uZmlnKSB7XG4gICAgICAgIEBpZiAoY29uZmlnLmZpZWxkc0NvbmZpZykge1xuICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZy5jc3NXcmFwcGVyXCI+XG4gICAgICAgICAgICBAZm9yIChmaWVsZENvbmZpZyBvZiBjb25maWcuZmllbGRzQ29uZmlnOyB0cmFjayBmaWVsZENvbmZpZzsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sTmdTdHlsZSA9IGZpZWxkQ29uZmlnLmdldE5nU3R5bGUgPyAoaXRlbSgpW2ZpZWxkQ29uZmlnLmZpZWxkXSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmdldE5nU3R5bGUgOiBpdGVtKCkgfCBhc3luYykgOiBmaWVsZENvbmZpZy5uZ1N0eWxlIHx8IHt9O1xuICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbE5nQ2xhc3MgPSBmaWVsZENvbmZpZy5nZXROZ0NsYXNzID8gKGl0ZW0oKVtmaWVsZENvbmZpZy5maWVsZF0gfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5nZXROZ0NsYXNzIDogaXRlbSgpIHwgYXN5bmMpIDogZmllbGRDb25maWcubmdDbGFzcyB8fCB7fTtcbiAgICAgICAgICAgICAgQGlmICghZmllbGRDb25maWcucm93cyAmJiAhZmllbGRDb25maWcuZ2V0Q29tcG9uZW50T3V0bGV0KSB7XG4gICAgICAgICAgICAgICAgQHN3aXRjaCAoZmllbGRDb25maWcuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgIEBjYXNlICgndG9vbHRpcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChmaWVsZENvbmZpZy50b29sdGlwIHx8IHt9OyBhcyB0b29sdGlwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJ0b29sdGlwLnR5cGUgfHwgJ3RleHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlXT1cInRvb2x0aXAubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0FkZENvbnRlbnRUb1BhcmVudERvY3VtZW50XT1cInRvb2x0aXAuaXNBZGRDb250ZW50VG9QYXJlbnREb2N1bWVudCB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb25zdEh0bWxOZ1N0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbnN0SHRtbE5nQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJ0b29sdGlwLmNsYXNzSW5jbHVkZSB8fCAnICdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cInRvb2x0aXAuaWdub3JlU2hvd1BvcG92ZXIgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpZWxkQ29uZmlnLmdldFRvb2x0aXBDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5nZXRUb29sdGlwQ29uZmlnIDogaXRlbSgpIHwgYXN5bmMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodG9vbHRpcC5jb25maWcgfCBMaWJzVWlQaXBlc0Nsb25lT2JqZWN0UGlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZENvbmZpZy5maWVsZCA/IChpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUpIDogdG9vbHRpcC5kYXRhVmlldylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLnBhcnNlVmFsdWUgOiBpdGVtKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGU6ICdodG1sJyA6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRFdmVudCk9XCJoYW5kbGVySXRlbUNsaWNrKCRldmVudCwgZmllbGRDb25maWcpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0oKSB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmdldEltYWdlU3JjIDogaXRlbSgpIDogaXNJbWFnZUVycm9yKCkgfCBhc3luYzsgYXMgbGlua0ltYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChsaW5rSW1hZ2UgIT09ICcgJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb25zdEh0bWxOZ1N0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uc3RIdG1sTmdDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwibGlua0ltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKT1cImhhbmRsZXJJbWFnZUVycm9yKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsIGZpZWxkQ29uZmlnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LCBmaWVsZENvbmZpZylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ2F2YXRhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgQGxldCBjb25zdEh0bWxBdmF0YXJDb25maWcgPVxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0oKSB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmdldEF2YXRhckNvbmZpZyA6IGl0ZW0oKSA6IHVuZGVmaW5lZCA6IHsgdmFsdWVJc0VtcHR5OiB1bmRlZmluZWQgfSB8IGFzeW5jO1xuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbnN0SHRtbEF2YXRhckNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYXZhdGFyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHlwZVNoYXBlXT1cImNvbnN0SHRtbEF2YXRhckNvbmZpZy50eXBlU2hhcGUgfHwgJ2NpcmNsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb25zdEh0bWxBdmF0YXJDb25maWcuY2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbnN0SHRtbE5nU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uc3RIdG1sTmdDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCJjb25zdEh0bWxBdmF0YXJDb25maWcuc2l6ZSB8fCAzMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGlua0F2YXRhcl09XCJjb25zdEh0bWxBdmF0YXJDb25maWcubGlua0F2YXRhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGlua0F2YXRhckVycm9yXT1cImNvbnN0SHRtbEF2YXRhckNvbmZpZy5saW5rQXZhdGFyRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkR2VuQ29sb3JdPVwiY29uc3RIdG1sQXZhdGFyQ29uZmlnLmlkR2VuQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dldExhc3RUZXh0QWZ0ZXJTcGFjZV09XCJjb25zdEh0bWxBdmF0YXJDb25maWcuZ2V0TGFzdFRleHRBZnRlclNwYWNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0QXZhdGFyXT1cImNvbnN0SHRtbEF2YXRhckNvbmZpZy50ZXh0QXZhdGFyXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ2J1dHRvbnMnKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoKGZpZWxkQ29uZmlnLmJ1dHRvbnMgJiYgZmllbGRDb25maWcuYnV0dG9ucy5sZW5ndGgpIHx8IGZpZWxkQ29uZmlnLmdldEJ1dHRvbnNCeUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb25zdEh0bWxOZ1N0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbnN0SHRtbE5nQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCIhaXNIb3ZlcigpICYmIGZpZWxkQ29uZmlnLnNob3dCdXR0b25Ib3Zlck1vZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBmaWVsZENvbmZpZy5idXR0b25zIHx8IChpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5nZXRCdXR0b25zQnlJdGVtIDogaXRlbSgpIHwgYXN5bmMpOyB0cmFjayBidXR0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImJ1dHRvbigpLnR5cGUgfHwgJ2J1dHRvbi1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVCdXR0b25dPVwiYnV0dG9uKCkuc2l6ZUJ1dHRvbiB8fCAnc21hbGxlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbigpLmRpc2FibGUgPz8gZmllbGRDb25maWcuZ2V0RGlzYWJsZSkgPyAoaXRlbSgpIHwgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTogZmllbGRDb25maWcuZmllbGQgOiB1bmRlZmluZWQgOiB0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcuZ2V0RGlzYWJsZSA6IGl0ZW0oKSB8IGFzeW5jKSA6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uKCkubGFiZWwgfHwgJyAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24oKS5jbGFzc0ljb25MZWZ0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiYnV0dG9uKCkuY2xhc3NJY29uUmlnaHQgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cImJ1dHRvbigpLnBvcG92ZXIgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uKCkuY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWdub3JlUG9pbnRlckV2ZW50XT1cImJ1dHRvbigpLmlnbm9yZVBvaW50ZXJFdmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJidXR0b24oKS5pY29uT25seVR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJjbGlja0J1dHRvbkFjdGlvbihidXR0b24oKSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnYnV0dG9uLXN0YXR1cycpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiaXRlbSgpIHwgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTogZmllbGRDb25maWcuZmllbGQgOiB1bmRlZmluZWQgOiB0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcucGFyc2VWYWx1ZSA6IGl0ZW0oKSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsIGZpZWxkQ29uZmlnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsIGZpZWxkQ29uZmlnKVwiIC8+XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnc3dpdGNoJykge1xuICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiaXRlbSgpIHwgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTogZmllbGRDb25maWcuZmllbGQgOiB1bmRlZmluZWQgOiB0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcuZ2V0QWN0aXZlVmFsdWVTd2l0Y2ggOiBpdGVtKCkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZmllbGRDb25maWcuZ2V0RGlzYWJsZVZhbHVlU3dpdGNoID8gKGl0ZW0oKSB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmdldERpc2FibGVWYWx1ZVN3aXRjaCA6IGl0ZW0oKSB8IGFzeW5jKSA6IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0U3dpdGNoKT1cImhhbmRsZXJTd2l0Y2goJGV2ZW50LCBmaWVsZENvbmZpZylcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdvdGhlci1hY3Rpb24tc2hvdy1wb3B1cCcgfHwgZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdiYWRnZScgfHwgZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdidXR0b24tYWN0aW9uLXNob3ctcG9wdXAnID8gZmllbGRDb25maWcuaW5zdGFuY2UgOiAnJykge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKChpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5wYXJzZVZhbHVlIDogaXRlbSgpIHwgYXN5bmMpICE9PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbERpc2FibGVEcm9wZG93biA9XG4gICAgICAgICAgICAgICAgICAgICAgICAoZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LmRpc2FibGUgPz8gZmllbGRDb25maWcuZ2V0RGlzYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoaXRlbSgpIHwgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTogZmllbGRDb25maWcuZmllbGQgOiB1bmRlZmluZWQgOiB0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcuZ2V0RGlzYWJsZSA6IGl0ZW0oKSB8IGFzeW5jKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbnN0SHRtbE5nU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uc3RIdG1sTmdDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWwtWzhweF1dPVwiIWZpZWxkQ29uZmlnLmlnbm9yZUNsYXNzTWFyZ2luTGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aEJ5UGFyZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVBcnJvdzogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/Lmlnbm9yZUFycm93IHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/Lm1heEhlaWdodCB8fCAyMDQ4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0SXRlbTogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LnBhZGRpbmdMZWZ0SXRlbSA/PyB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZTogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LmNsYXNzSW5jbHVkZVBvcHVwIHx8ICd3LVsyNTBweF0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8ucG9zaXRpb24gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8uekluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LmdldExpc3RDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGl0ZW0oKSB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5nZXRMaXN0Q29uZmlnIDogaXRlbSgpIHwgYXN5bmMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0Q29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0QmFja2dyb3VuZEN1c3RvbV09XCJmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8ubGlzdEJhY2tncm91bmRMaXN0Q3VzdG9tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCJmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8ubGlzdE1heEl0ZW1TaG93IHx8IDVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleXNEaXNhYmxlXT1cImZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0S2V5c0Rpc2FibGVJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8ubGlzdEhpZGRlbklucHV0U2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uc3RIdG1sRGlzYWJsZURyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdEl0ZW1Ecm9wZG93bihmaWVsZENvbmZpZywgaW5kZXgsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2VsZWN0TXVsdGlLZXkpPVwiaGFuZGxlclNlbGVjdEl0ZW1zRHJvcGRvd24oZmllbGRDb25maWcsIGluZGV4LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdvdGhlci1hY3Rpb24tc2hvdy1wb3B1cCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcucGFyc2VWYWx1ZSA6IGl0ZW0oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZTogJ2h0bWwnIDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZpZWxkQ29uZmlnLmluc3RhbmNlID09PSAnYmFkZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGxldCBjb25zdEh0bWxEYXRhQmFkZ2UgPSBpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5wYXJzZVZhbHVlIDogaXRlbSgpIHwgYXN5bmM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb25zdEh0bWxEYXRhQmFkZ2UgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJhZGdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVNYXJnaW5EZWZhdWx0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPVwiK3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY291bnRdPVwiY29uc3RIdG1sRGF0YUJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heENvdW50XT1cIjk5XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChmaWVsZENvbmZpZy5pbnN0YW5jZSA9PT0gJ2J1dHRvbi1hY3Rpb24tc2hvdy1wb3B1cCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJmaWVsZENvbmZpZz8uZHJvcGRvd25Db25maWc/LmJ1dHRvbigpPy50eXBlIHx8ICdidXR0b24tcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVCdXR0b25dPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8uc2l6ZUJ1dHRvbiB8fCAnc21hbGxlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8uZGlzYWJsZSA/PyBjb25zdEh0bWxEaXNhYmxlRHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkQ29uZmlnPy5kcm9wZG93bkNvbmZpZz8uYnV0dG9uKCk/LmxhYmVsIHx8ICcgJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJmaWVsZENvbmZpZz8uZHJvcGRvd25Db25maWc/LmJ1dHRvbigpPy5jbGFzc0ljb25MZWZ0IHx8ICdsaWJzLXVpLWljb24tbW9yZS12ZXJ0aWNhbCByb3RhdGUtWzkwZGVnXSBtci0wJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8uY2xhc3NJY29uUmlnaHQgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8ucG9wb3ZlciB8fCB7fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImZpZWxkQ29uZmlnPy5kcm9wZG93bkNvbmZpZz8uYnV0dG9uKCk/LmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnbGluZS1jbGFtcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbnN0SHRtbE5nU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbnN0SHRtbE5nQ2xhc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZpZWxkQ29uZmlnLmxpbmVDbGFtcENvbmZpZzsgYXMgbGluZUNsYW1wQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxpbmVfY2xhbXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZVNob3dCdXR0b25Db2xsYXBzZUV4cGFuZF09XCJsaW5lQ2xhbXBDb25maWcuaWdub3JlU2hvd0J1dHRvbkNvbGxhcHNlRXhwYW5kID8/IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1Rvb2x0aXBdPVwibGluZUNsYW1wQ29uZmlnLnNob3dUb29sdGlwID8/IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4SGVpZ2h0XT1cImxpbmVDbGFtcENvbmZpZy5tYXhIZWlnaHQgfHwgMzZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4V2lkdGhUb29sdGlwXT1cImxpbmVDbGFtcENvbmZpZy5tYXhXaWR0aFRvb2x0aXAgfHwgMjAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW21heEhlaWdodFRvb2x0aXBdPVwibGluZUNsYW1wQ29uZmlnLm1heEhlaWdodFRvb2x0aXAgfHwgMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NPYmplY3RdPVwibGluZUNsYW1wQ29uZmlnLm5nQ2xhc3NPYmplY3QgPz8geyAnbGlicy11aS1saW5lLWNsYW1wLWNvbnRlbnQgbGlicy11aS1mb250LWg1cic6IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpc0lubmVyVGV4dF09XCJsaW5lQ2xhbXBDb25maWcuaXNJbm5lclRleHQgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uVG9vbHRpcEV2ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudF09XCJpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5wYXJzZVZhbHVlIDogaXRlbSgpIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsIGZpZWxkQ29uZmlnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LCBmaWVsZENvbmZpZylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnc2hhcGUtc3R5bGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb25zdEh0bWxOZ1N0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb25zdEh0bWxOZ0NsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSgpIHwgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTogZmllbGRDb25maWcuZmllbGQgOiB1bmRlZmluZWQgOiB0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcucGFyc2VWYWx1ZSA6IGl0ZW0oKSB8IGFzeW5jIHwgdHJhbnNsYXRlIHwgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZTogJ2h0bWwnIDogZmFsc2UgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LCBmaWVsZENvbmZpZylcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LCBmaWVsZENvbmZpZylcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbnN0SHRtbE5nU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbnN0SHRtbE5nQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5wYXJzZVZhbHVlIDogaXRlbSgpIHwgYXN5bmMgfCB0cmFuc2xhdGUgfCBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlOiAnaHRtbCcgOiB0cnVlIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVySXRlbUNsaWNrKCRldmVudCwgZmllbGRDb25maWcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVySXRlbUNsaWNrKCRldmVudCwgZmllbGRDb25maWcpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkQ29uZmlnLnJvd3MpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgZmxleCByZWxhdGl2ZSB7eyBmaWVsZENvbmZpZy5yb3dzVGVtcGxhdGVDc3NXcmFwcGVyIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJyb3dSZWYuY2xpZW50SGVpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAjcm93UmVmXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgZmxleCBhYnNvbHV0ZSAge3sgZmllbGRDb25maWcucm93c1RlbXBsYXRlQ3NzV3JhcHBlciB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggdy1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZmllbGRDb25maWcucm93c1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0NvbXBvbmVudE91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0oKSB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmdldENvbXBvbmVudE91dGxldCA6IGl0ZW0oKSB8IGFzeW5jO1xuICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogdW5kZWZpbmVkIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcuZ2V0RGF0YUNvbXBvbmVudE91dGxldCA6IGl0ZW0oKSA6IGZpZWxkQ29uZmlnLmZpZWxkIDogeyB2YWx1ZUlzRW1wdHk6IHsgaXRlbTogaXRlbSgpIH0gfSB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgIFwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxufVxuIl19
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy90YWJsZS9zcmMvdGVtcGxhdGVzL3RlbXBsYXRlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RlbXBsYXRlcy90ZW1wbGF0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0UsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0UsT0FBTyxFQUFXLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckcsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFnRSxpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9JLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRyxPQUFPLEVBQWdCLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0YsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekUsT0FBTyxFQUFF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QVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULFlBQVksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEMsQ0FBQzt3R0F2RlUsdUNBQXVDOzRGQUF2Qyx1Q0FBdUMseW5CQzlDcEQsd3dpQkFvUUEsOExEdE5hLHVDQUF1Qyw2SUFwQmhELE9BQU8sMkVBQ1AsT0FBTyxtRkFDUCxlQUFlLHVGQUNmLFNBQVMsOENBQ1QsaUJBQWlCLCtPQUNqQiwrQkFBK0Isd0VBQy9CLCtCQUErQix3WEFDL0IscUNBQXFDLHlFQUNyQyw0QkFBNEIscUVBQzVCLGdDQUFnQyxvZ0JBQ2hDLHNDQUFzQyxrR0FDdEMsK0JBQStCLGdKQUMvQiwwQkFBMEIsbUVBQzFCLHNDQUFzQyxzakJBQ3RDLGtDQUFrQywwb0JBQ2xDLGlDQUFpQywwNURBQ2pDLDhCQUE4Qjs7NEZBSXJCLHVDQUF1QztrQkEzQm5ELFNBQVM7K0JBRUUsb0NBQW9DLGNBR2xDLElBQUksV0FDUDt3QkFDUCxPQUFPO3dCQUNQLE9BQU87d0JBQ1AsZUFBZTt3QkFDZixTQUFTO3dCQUNULGlCQUFpQjt3QkFDakIsK0JBQStCO3dCQUMvQiwrQkFBK0I7d0JBQy9CLHFDQUFxQzt3QkFDckMsNEJBQTRCO3dCQUM1QixnQ0FBZ0M7d0JBQ2hDLHNDQUFzQzt3QkFDdEMsK0JBQStCO3dCQUMvQiwwQkFBMEI7d0JBQzFCLHNDQUFzQzt3QkFDdEMsa0NBQWtDO3dCQUNsQyxpQ0FBaUM7d0JBQ2pDLDhCQUE4QjtxQkFDL0IsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nQ29tcG9uZW50T3V0bGV0LCBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCwgT25EZXN0cm95LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNBdmF0YXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWF2YXRhcic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQmFkZ2VDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJhZGdlJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1N0YXR1c0NvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1zdGF0dXMnO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0TXVsdGlLZXksIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaW5lQ2xhbXBDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxpbmUtY2xhbXAnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBJU3dpdGNoRXZlbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0Nsb25lT2JqZWN0UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNsb25lLW9iamVjdCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZ2V0LXZhbHVlLW9mLW9iamVjdCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtc2VjdXJpdHktdHJ1c3QnO1xuaW1wb3J0IHsgY29udmVydE9iamVjdFRvU2lnbmFsLCBnZXQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRZUEVfSVRFTV9EQVRBX1RBQkxFIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJVGFibGVGaWVsZFRlbXBsYXRlQ29uZmlnLCBJVGFibGVUZW1wbGF0ZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvdGVtcGxhdGUtY29uZmlnLmludGVyZmFjZSc7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RlbXBsYXRlcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RlbXBsYXRlcy5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdTdHlsZSxcbiAgICBOZ0NsYXNzLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgTmdDb21wb25lbnRPdXRsZXQsXG4gICAgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LFxuICAgIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsXG4gICAgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1N0YXR1c0NvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU3dpdGNoQ29tcG9uZW50LFxuICAgIExpYnNVaVBpcGVzQ2xvbmVPYmplY3RQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNMaW5lQ2xhbXBDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCYWRnZUNvbXBvbmVudCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNUYWJsZVRlbXBsYXRlc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgbG9ja0NsaWNrITogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsb2NrQ2xpY2tUaW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGZ1bmN0aW9uQ29udHJvbHMgPSBuZXcgTWFwPG51bWJlciwgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHByb3RlY3RlZCBpc0ltYWdlRXJyb3IgPSBzaWduYWw8Ym9vbGVhbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICByZWFkb25seSBpc0hvdmVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY29uZmlncyA9IGlucHV0PEFycmF5PElUYWJsZVRlbXBsYXRlQ29uZmlnPj4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVDc3NXcmFwcGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpdGVtID0gaW5wdXQucmVxdWlyZWQ8VFlQRV9JVEVNX0RBVEFfVEFCTEU+KCk7XG5cbiAgcHJvdGVjdGVkIHRlbXBsYXRlQ3NzV3JhcHBlckNvbXB1dGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50ZW1wbGF0ZUNzc1dyYXBwZXIoKSB8fCAnJyk7XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJJdGVtQ2xpY2soZXZlbnQ6IEV2ZW50IHwgVFlQRV9QT1BPVkVSX0VWRU5UIHwgdW5kZWZpbmVkLCBjb25maWc6IElUYWJsZUZpZWxkVGVtcGxhdGVDb25maWcpIHtcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJyAmJiBldmVudCAhPT0gJ2NsaWNrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmhhbmRsZUxvY2tDbGljayhhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoY29uZmlnPy5hY3Rpb24pIHtcbiAgICAgICAgY29uZmlnLmFjdGlvbihnZXQodGhpcy5pdGVtKCksIGNvbmZpZy5maWVsZCBhcyBhbnkpLCB0aGlzLml0ZW0oKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2xpY2tCdXR0b25BY3Rpb24oYnV0dG9uOiBJQnV0dG9uKSB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVMb2NrQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgYnV0dG9uLmFjdGlvbj8uKHsgaXRlbTogdGhpcy5pdGVtKCkgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclN3aXRjaChzd2l0Y2hJdGVtOiBJU3dpdGNoRXZlbnQsIGNvbmZpZzogSVRhYmxlRmllbGRUZW1wbGF0ZUNvbmZpZykge1xuICAgIGF3YWl0IHRoaXMuaGFuZGxlTG9ja0NsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbmZpZz8uc3dpdGNoQWN0aW9uPy4oc3dpdGNoSXRlbSwgdGhpcy5pdGVtKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWxlY3RJdGVtRHJvcGRvd24oZmllbGRDb25maWc6IElUYWJsZUZpZWxkVGVtcGxhdGVDb25maWcsIGluZGV4OiBudW1iZXIsIGRhdGE/OiBJRW1pdFNlbGVjdEtleSkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmhhbmRsZUxvY2tDbGljayhhc3luYyAoKSA9PiB7XG4gICAgICBmaWVsZENvbmZpZz8uYWN0aW9uPy4oZGF0YS5rZXksIGRhdGEuaXRlbSwgdGhpcy5pdGVtKCkpO1xuICAgICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xzPy5nZXQoaW5kZXgpPy5yZXNldCgpO1xuICAgICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xzPy5nZXQoaW5kZXgpPy5yZW1vdmVMaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdEl0ZW1zRHJvcGRvd24oZmllbGRDb25maWc6IElUYWJsZUZpZWxkVGVtcGxhdGVDb25maWcsIGluZGV4OiBudW1iZXIsIGRhdGE/OiBJRW1pdE11bHRpS2V5KSB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuaGFuZGxlTG9ja0NsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgIGZpZWxkQ29uZmlnPy5hY3Rpb24/LihkYXRhLmtleXMsIGNvbnZlcnRPYmplY3RUb1NpZ25hbChkYXRhLm1hcEtleXMsIGZhbHNlKSwgdGhpcy5pdGVtKCkpO1xuICAgICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xzPy5nZXQoaW5kZXgpPy5yZXNldCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJJbWFnZUVycm9yKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNJbWFnZUVycm9yLnNldCh0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRnVuY3Rpb25Db250cm9sKGV2ZW50OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9scy5zZXQoaW5kZXgsIGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlTG9ja0NsaWNrKGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgaWYgKHRoaXMubG9ja0NsaWNrKSByZXR1cm47XG4gICAgdGhpcy5sb2NrQ2xpY2sgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYWxsYmFjaygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2NrQ2xpY2tUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2NrQ2xpY2sgPSBmYWxzZTtcbiAgICAgIH0sIDI1MCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubG9ja0NsaWNrVGltZW91dElkKTtcbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbHMuY2xlYXIoKTtcbiAgfVxufVxuIiwiQGlmIChjb25maWdzKCk7IGFzIGNvbmZpZ3MpIHtcbiAgQGlmIChpdGVtKCk7IGFzIGl0ZW0pIHtcbiAgICA8ZGl2IGNsYXNzPVwibGlicy11aS10YWJsZS10ZW1wbGF0ZSB7eyB0ZW1wbGF0ZUNzc1dyYXBwZXJDb21wdXRlZCgpIH19XCI+XG4gICAgICBAZm9yIChjb25maWcgb2YgY29uZmlnczsgdHJhY2sgY29uZmlnKSB7XG4gICAgICAgIEBpZiAoY29uZmlnLmZpZWxkc0NvbmZpZykge1xuICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZy5jc3NXcmFwcGVyXCI+XG4gICAgICAgICAgICBAZm9yIChmaWVsZENvbmZpZyBvZiBjb25maWcuZmllbGRzQ29uZmlnOyB0cmFjayBmaWVsZENvbmZpZzsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sTmdTdHlsZSA9IGZpZWxkQ29uZmlnLmdldE5nU3R5bGUgPyAoaXRlbSgpW2ZpZWxkQ29uZmlnLmZpZWxkXSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmdldE5nU3R5bGUgOiBpdGVtKCkgfCBhc3luYykgOiBmaWVsZENvbmZpZy5uZ1N0eWxlIHx8IHt9O1xuICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbE5nQ2xhc3MgPSBmaWVsZENvbmZpZy5nZXROZ0NsYXNzID8gKGl0ZW0oKVtmaWVsZENvbmZpZy5maWVsZF0gfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5nZXROZ0NsYXNzIDogaXRlbSgpIHwgYXN5bmMpIDogZmllbGRDb25maWcubmdDbGFzcyB8fCB7fTtcbiAgICAgICAgICAgICAgQGlmICghZmllbGRDb25maWcucm93cyAmJiAhZmllbGRDb25maWcuZ2V0Q29tcG9uZW50T3V0bGV0KSB7XG4gICAgICAgICAgICAgICAgQHN3aXRjaCAoZmllbGRDb25maWcuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgIEBjYXNlICgndG9vbHRpcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChmaWVsZENvbmZpZy50b29sdGlwIHx8IHt9OyBhcyB0b29sdGlwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJ0b29sdGlwLnR5cGUgfHwgJ3RleHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlXT1cInRvb2x0aXAubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0FkZENvbnRlbnRUb1BhcmVudERvY3VtZW50XT1cInRvb2x0aXAuaXNBZGRDb250ZW50VG9QYXJlbnREb2N1bWVudCB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb25zdEh0bWxOZ1N0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbnN0SHRtbE5nQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJ0b29sdGlwLmNsYXNzSW5jbHVkZSB8fCAnICdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cInRvb2x0aXAuaWdub3JlU2hvd1BvcG92ZXIgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpZWxkQ29uZmlnLmdldFRvb2x0aXBDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5nZXRUb29sdGlwQ29uZmlnIDogaXRlbSgpIHwgYXN5bmMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodG9vbHRpcC5jb25maWcgfCBMaWJzVWlQaXBlc0Nsb25lT2JqZWN0UGlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZENvbmZpZy5maWVsZCA/IChpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUpIDogdG9vbHRpcC5kYXRhVmlldylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLnBhcnNlVmFsdWUgOiBpdGVtKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGU6ICdodG1sJyA6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRFdmVudCk9XCJoYW5kbGVySXRlbUNsaWNrKCRldmVudCwgZmllbGRDb25maWcpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0oKSB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmdldEltYWdlU3JjIDogaXRlbSgpIDogaXNJbWFnZUVycm9yKCkgfCBhc3luYzsgYXMgbGlua0ltYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChsaW5rSW1hZ2UgIT09ICcgJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb25zdEh0bWxOZ1N0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uc3RIdG1sTmdDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwibGlua0ltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKT1cImhhbmRsZXJJbWFnZUVycm9yKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsIGZpZWxkQ29uZmlnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LCBmaWVsZENvbmZpZylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ2F2YXRhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgQGxldCBjb25zdEh0bWxBdmF0YXJDb25maWcgPVxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0oKSB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmdldEF2YXRhckNvbmZpZyA6IGl0ZW0oKSA6IHVuZGVmaW5lZCA6IHsgdmFsdWVJc0VtcHR5OiB1bmRlZmluZWQgfSB8IGFzeW5jO1xuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbnN0SHRtbEF2YXRhckNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYXZhdGFyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHlwZVNoYXBlXT1cImNvbnN0SHRtbEF2YXRhckNvbmZpZy50eXBlU2hhcGUgfHwgJ2NpcmNsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb25zdEh0bWxBdmF0YXJDb25maWcuY2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbnN0SHRtbE5nU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uc3RIdG1sTmdDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCJjb25zdEh0bWxBdmF0YXJDb25maWcuc2l6ZSB8fCAzMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGlua0F2YXRhcl09XCJjb25zdEh0bWxBdmF0YXJDb25maWcubGlua0F2YXRhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGlua0F2YXRhckVycm9yXT1cImNvbnN0SHRtbEF2YXRhckNvbmZpZy5saW5rQXZhdGFyRXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkR2VuQ29sb3JdPVwiY29uc3RIdG1sQXZhdGFyQ29uZmlnLmlkR2VuQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dldExhc3RUZXh0QWZ0ZXJTcGFjZV09XCJjb25zdEh0bWxBdmF0YXJDb25maWcuZ2V0TGFzdFRleHRBZnRlclNwYWNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0QXZhdGFyXT1cImNvbnN0SHRtbEF2YXRhckNvbmZpZy50ZXh0QXZhdGFyXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ2J1dHRvbnMnKSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoKGZpZWxkQ29uZmlnLmJ1dHRvbnMgJiYgZmllbGRDb25maWcuYnV0dG9ucy5sZW5ndGgpIHx8IGZpZWxkQ29uZmlnLmdldEJ1dHRvbnNCeUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb25zdEh0bWxOZ1N0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbnN0SHRtbE5nQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCIhaXNIb3ZlcigpICYmIGZpZWxkQ29uZmlnLnNob3dCdXR0b25Ib3Zlck1vZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBmaWVsZENvbmZpZy5idXR0b25zIHx8IChpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5nZXRCdXR0b25zQnlJdGVtIDogaXRlbSgpIHwgYXN5bmMpOyB0cmFjayBidXR0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImJ1dHRvbigpLnR5cGUgfHwgJ2J1dHRvbi1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVCdXR0b25dPVwiYnV0dG9uKCkuc2l6ZUJ1dHRvbiB8fCAnc21hbGxlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbigpLmRpc2FibGUgPz8gZmllbGRDb25maWcuZ2V0RGlzYWJsZSkgPyAoaXRlbSgpIHwgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTogZmllbGRDb25maWcuZmllbGQgOiB1bmRlZmluZWQgOiB0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcuZ2V0RGlzYWJsZSA6IGl0ZW0oKSB8IGFzeW5jKSA6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uKCkubGFiZWwgfHwgJyAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24oKS5jbGFzc0ljb25MZWZ0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiYnV0dG9uKCkuY2xhc3NJY29uUmlnaHQgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cImJ1dHRvbigpLnBvcG92ZXIgfHwge31cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uKCkuY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWdub3JlUG9pbnRlckV2ZW50XT1cImJ1dHRvbigpLmlnbm9yZVBvaW50ZXJFdmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJidXR0b24oKS5pY29uT25seVR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJjbGlja0J1dHRvbkFjdGlvbihidXR0b24oKSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnYnV0dG9uLXN0YXR1cycpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiaXRlbSgpIHwgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTogZmllbGRDb25maWcuZmllbGQgOiB1bmRlZmluZWQgOiB0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcucGFyc2VWYWx1ZSA6IGl0ZW0oKSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsIGZpZWxkQ29uZmlnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsIGZpZWxkQ29uZmlnKVwiIC8+XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnc3dpdGNoJykge1xuICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiaXRlbSgpIHwgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTogZmllbGRDb25maWcuZmllbGQgOiB1bmRlZmluZWQgOiB0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcuZ2V0QWN0aXZlVmFsdWVTd2l0Y2ggOiBpdGVtKCkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZmllbGRDb25maWcuZ2V0RGlzYWJsZVZhbHVlU3dpdGNoID8gKGl0ZW0oKSB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmdldERpc2FibGVWYWx1ZVN3aXRjaCA6IGl0ZW0oKSB8IGFzeW5jKSA6IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0U3dpdGNoKT1cImhhbmRsZXJTd2l0Y2goJGV2ZW50LCBmaWVsZENvbmZpZylcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAY2FzZSAoZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdvdGhlci1hY3Rpb24tc2hvdy1wb3B1cCcgfHwgZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdiYWRnZScgfHwgZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdidXR0b24tYWN0aW9uLXNob3ctcG9wdXAnID8gZmllbGRDb25maWcuaW5zdGFuY2UgOiAnJykge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKChpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5wYXJzZVZhbHVlIDogaXRlbSgpIHwgYXN5bmMpICE9PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbERpc2FibGVEcm9wZG93biA9XG4gICAgICAgICAgICAgICAgICAgICAgICAoZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LmRpc2FibGUgPz8gZmllbGRDb25maWcuZ2V0RGlzYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoaXRlbSgpIHwgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTogZmllbGRDb25maWcuZmllbGQgOiB1bmRlZmluZWQgOiB0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcuZ2V0RGlzYWJsZSA6IGl0ZW0oKSB8IGFzeW5jKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbnN0SHRtbE5nU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uc3RIdG1sTmdDbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWwtWzhweF1dPVwiIWZpZWxkQ29uZmlnLmlnbm9yZUNsYXNzTWFyZ2luTGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aEJ5UGFyZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVBcnJvdzogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/Lmlnbm9yZUFycm93IHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/Lm1heEhlaWdodCB8fCAyMDQ4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0SXRlbTogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LnBhZGRpbmdMZWZ0SXRlbSA/PyB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZTogZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LmNsYXNzSW5jbHVkZVBvcHVwIHx8ICd3LVsyNTBweF0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8ucG9zaXRpb24gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8uekluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb25maWcuZHJvcGRvd25Db25maWc/LmdldExpc3RDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGl0ZW0oKSB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5nZXRMaXN0Q29uZmlnIDogaXRlbSgpIHwgYXN5bmMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0Q29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0QmFja2dyb3VuZEN1c3RvbV09XCJmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8ubGlzdEJhY2tncm91bmRMaXN0Q3VzdG9tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCJmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8ubGlzdE1heEl0ZW1TaG93IHx8IDVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleXNEaXNhYmxlXT1cImZpZWxkQ29uZmlnLmRyb3Bkb3duQ29uZmlnPy5saXN0S2V5c0Rpc2FibGVJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJmaWVsZENvbmZpZy5kcm9wZG93bkNvbmZpZz8ubGlzdEhpZGRlbklucHV0U2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uc3RIdG1sRGlzYWJsZURyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdEl0ZW1Ecm9wZG93bihmaWVsZENvbmZpZywgaW5kZXgsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2VsZWN0TXVsdGlLZXkpPVwiaGFuZGxlclNlbGVjdEl0ZW1zRHJvcGRvd24oZmllbGRDb25maWcsIGluZGV4LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmllbGRDb25maWcuaW5zdGFuY2UgPT09ICdvdGhlci1hY3Rpb24tc2hvdy1wb3B1cCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcucGFyc2VWYWx1ZSA6IGl0ZW0oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZTogJ2h0bWwnIDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZpZWxkQ29uZmlnLmluc3RhbmNlID09PSAnYmFkZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGxldCBjb25zdEh0bWxEYXRhQmFkZ2UgPSBpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5wYXJzZVZhbHVlIDogaXRlbSgpIHwgYXN5bmM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb25zdEh0bWxEYXRhQmFkZ2UgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJhZGdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVNYXJnaW5EZWZhdWx0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPVwiK3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY291bnRdPVwiY29uc3RIdG1sRGF0YUJhZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heENvdW50XT1cIjk5XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChmaWVsZENvbmZpZy5pbnN0YW5jZSA9PT0gJ2J1dHRvbi1hY3Rpb24tc2hvdy1wb3B1cCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJmaWVsZENvbmZpZz8uZHJvcGRvd25Db25maWc/LmJ1dHRvbigpPy50eXBlIHx8ICdidXR0b24tcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVCdXR0b25dPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8uc2l6ZUJ1dHRvbiB8fCAnc21hbGxlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8uZGlzYWJsZSA/PyBjb25zdEh0bWxEaXNhYmxlRHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkQ29uZmlnPy5kcm9wZG93bkNvbmZpZz8uYnV0dG9uKCk/LmxhYmVsIHx8ICcgJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJmaWVsZENvbmZpZz8uZHJvcGRvd25Db25maWc/LmJ1dHRvbigpPy5jbGFzc0ljb25MZWZ0IHx8ICdsaWJzLXVpLWljb24tbW9yZS12ZXJ0aWNhbCByb3RhdGUtWzkwZGVnXSBtci0wJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8uY2xhc3NJY29uUmlnaHQgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiZmllbGRDb25maWc/LmRyb3Bkb3duQ29uZmlnPy5idXR0b24oKT8ucG9wb3ZlciB8fCB7fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImZpZWxkQ29uZmlnPy5kcm9wZG93bkNvbmZpZz8uYnV0dG9uKCk/LmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnbGluZS1jbGFtcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbnN0SHRtbE5nU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbnN0SHRtbE5nQ2xhc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZpZWxkQ29uZmlnLmxpbmVDbGFtcENvbmZpZzsgYXMgbGluZUNsYW1wQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxpbmVfY2xhbXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZVNob3dCdXR0b25Db2xsYXBzZUV4cGFuZF09XCJsaW5lQ2xhbXBDb25maWcuaWdub3JlU2hvd0J1dHRvbkNvbGxhcHNlRXhwYW5kID8/IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1Rvb2x0aXBdPVwibGluZUNsYW1wQ29uZmlnLnNob3dUb29sdGlwID8/IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4SGVpZ2h0XT1cImxpbmVDbGFtcENvbmZpZy5tYXhIZWlnaHQgfHwgMzZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4V2lkdGhUb29sdGlwXT1cImxpbmVDbGFtcENvbmZpZy5tYXhXaWR0aFRvb2x0aXAgfHwgMjAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW21heEhlaWdodFRvb2x0aXBdPVwibGluZUNsYW1wQ29uZmlnLm1heEhlaWdodFRvb2x0aXAgfHwgMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NPYmplY3RdPVwibGluZUNsYW1wQ29uZmlnLm5nQ2xhc3NPYmplY3QgPz8geyAnbGlicy11aS1saW5lLWNsYW1wLWNvbnRlbnQgbGlicy11aS1mb250LWg1cic6IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpc0lubmVyVGV4dF09XCJsaW5lQ2xhbXBDb25maWcuaXNJbm5lclRleHQgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uVG9vbHRpcEV2ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudF09XCJpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5wYXJzZVZhbHVlIDogaXRlbSgpIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckl0ZW1DbGljaygkZXZlbnQsIGZpZWxkQ29uZmlnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LCBmaWVsZENvbmZpZylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnc2hhcGUtc3R5bGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb25zdEh0bWxOZ1N0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb25zdEh0bWxOZ0NsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSgpIHwgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZTogZmllbGRDb25maWcuZmllbGQgOiB1bmRlZmluZWQgOiB0cnVlIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcucGFyc2VWYWx1ZSA6IGl0ZW0oKSB8IGFzeW5jIHwgdHJhbnNsYXRlIHwgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZTogJ2h0bWwnIDogZmFsc2UgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LCBmaWVsZENvbmZpZylcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImhhbmRsZXJJdGVtQ2xpY2soJGV2ZW50LCBmaWVsZENvbmZpZylcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbnN0SHRtbE5nU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbnN0SHRtbE5nQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtKCkgfCBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOiBmaWVsZENvbmZpZy5maWVsZCA6IHVuZGVmaW5lZCA6IHRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBmaWVsZENvbmZpZy5wYXJzZVZhbHVlIDogaXRlbSgpIHwgYXN5bmMgfCB0cmFuc2xhdGUgfCBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlOiAnaHRtbCcgOiB0cnVlIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVySXRlbUNsaWNrKCRldmVudCwgZmllbGRDb25maWcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVySXRlbUNsaWNrKCRldmVudCwgZmllbGRDb25maWcpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAaWYgKGZpZWxkQ29uZmlnLnJvd3MpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgZmxleCByZWxhdGl2ZSB7eyBmaWVsZENvbmZpZy5yb3dzVGVtcGxhdGVDc3NXcmFwcGVyIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJyb3dSZWYuY2xpZW50SGVpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAjcm93UmVmXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgZmxleCBhYnNvbHV0ZSAge3sgZmllbGRDb25maWcucm93c1RlbXBsYXRlQ3NzV3JhcHBlciB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggdy1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZmllbGRDb25maWcucm93c1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0NvbXBvbmVudE91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0oKSB8IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6IGZpZWxkQ29uZmlnLmZpZWxkIDogdW5kZWZpbmVkIDogdHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGZpZWxkQ29uZmlnLmdldENvbXBvbmVudE91dGxldCA6IGl0ZW0oKSB8IGFzeW5jO1xuICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogdW5kZWZpbmVkIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogZmllbGRDb25maWcuZ2V0RGF0YUNvbXBvbmVudE91dGxldCA6IGl0ZW0oKSA6IGZpZWxkQ29uZmlnLmZpZWxkIDogeyB2YWx1ZUlzRW1wdHk6IHsgaXRlbTogaXRlbSgpIH0gfSB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgIFwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxufVxuIl19
|