@libs-ui/components-pages-template-detail 0.2.356-9 → 0.2.357-0

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.
@@ -42,6 +42,7 @@ export class LibsUiComponentsPagesTemplateDetailV2Component {
42
42
  // #endregion
43
43
  // #region --- INTERNAL STATE ---
44
44
  dropdownFunctionControl;
45
+ pipeEmptyConfig = { valueIsEmpty: null };
45
46
  // #endregion
46
47
  // #region --- COMPUTED ---
47
48
  configTitleComputed = computed(() => {
@@ -80,12 +81,12 @@ export class LibsUiComponentsPagesTemplateDetailV2Component {
80
81
  // #endregion
81
82
  // #region --- EVENT HANDLERS ---
82
83
  handlerClickAction(event) {
83
- if (event && event.action) {
84
+ if (event?.action) {
84
85
  event.action();
85
86
  }
86
87
  }
87
88
  async handlerSwitch(event, swicthEvent) {
88
- if (event && event.action) {
89
+ if (event?.action) {
89
90
  await event.action(swicthEvent);
90
91
  }
91
92
  }
@@ -127,7 +128,7 @@ export class LibsUiComponentsPagesTemplateDetailV2Component {
127
128
  this.outStateDisable.emit(this.disable());
128
129
  }
129
130
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPagesTemplateDetailV2Component, deps: [], target: i0.ɵɵFactoryTarget.Component });
130
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPagesTemplateDetailV2Component, isStandalone: true, selector: "libs_ui-components-pages_template-detail_v2", inputs: { zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, configRight: { classPropertyName: "configRight", publicName: "configRight", isSignal: true, isRequired: false, transformFunction: null }, configTitle: { classPropertyName: "configTitle", publicName: "configTitle", isSignal: true, isRequired: false, transformFunction: null }, configCenter: { classPropertyName: "configCenter", publicName: "configCenter", isSignal: true, isRequired: false, transformFunction: null }, classIncludeHeader: { classPropertyName: "classIncludeHeader", publicName: "classIncludeHeader", isSignal: true, isRequired: false, transformFunction: null }, isSplitHeaderRatio: { classPropertyName: "isSplitHeaderRatio", publicName: "isSplitHeaderRatio", isSignal: true, isRequired: false, transformFunction: null }, bodyConfig: { classPropertyName: "bodyConfig", publicName: "bodyConfig", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disable: "disableChange", outScroll: "outScroll", outClose: "outClose", outSelectedMenuDropdown: "outSelectedMenuDropdown", outSelectedButtonDropdown: "outSelectedButtonDropdown", outFunctionControl: "outFunctionControl", outSelectedRadio: "outSelectedRadio", outStateDisable: "outStateDisable", outTooltipButtonFunctionControl: "outTooltipButtonFunctionControl" }, ngImport: i0, template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <!-- ===================== HEADER ===================== -->\n <!-- Gi\u1EEF nguy\u00EAn ho\u00E0n to\u00E0n t\u1EEB V1 -->\n @if (configTitle()?.header?.content; as headerContent) {\n <div class=\"libs-ui-font-h3s py-[10px] pl-[24px] libs-ui-border-bottom-general bg-white {{ configTitle()?.header?.classInclude || '' }}\">{{ headerContent | translate }}</div>\n }\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '&mdash;'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ===================== BODY ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode: Hi\u1EC3n th\u1ECB skeleton khi \u0111ang load, sau \u0111\u00F3 render component -->\n <div\n class=\"libs-ui-components-page_detail-body {{ bodyConfig().classInclude || '' }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @if (constHtmlCompBody) {\n @defer {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @loading {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n } @else {\n <!-- Skeleton hi\u1EC3n th\u1ECB khi Observable ch\u01B0a emit (\u0111ang ch\u1EDD delay/http) -->\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;display:flex;flex-direction:column}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;min-height:0;min-width:0}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { 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: 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: LibsUiComponentsRadioGroupComponent, selector: "libs_ui-components-radio-group", inputs: ["fieldKey", "keyActive", "keysDisable", "groups", "disable", "clickExactly", "horizontal", "labelConfig", "validRequired", "ignoreClassMarginLastItem", "typeRadio", "classInclude", "classLabelInclude", "classItemInclude", "alwaysShowSubText", "horizontalClassInclude"], outputs: ["groupsChange", "outClickButton", "outChange", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { 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: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "component", type: LibsUiComponentsButtonsDropdownComponent, selector: "libs_ui-components-buttons-dropdown", inputs: ["label", "fieldClass", "fieldClassIconLeft", "items", "fieldDisplay", "keyField", "keySelected", "applyNow", "showBorderBottom", "disable", "sizeButton", "classLabel", "iconOnlyType", "classIconRight", "classIconLeft", "typeButton", "popupConfig", "ignoreHiddenPopoverContentWhenMouseLeave", "classInclude", "modePopover", "classIncludeContainer"], outputs: ["keySelectedChange", "outSelectItem", "outHover", "outApply", "outPopoverEvent", "outFunctionsControl", "outIconEvent"] }, { kind: "component", type: LibsUiComponentsSkeletonComponent, selector: "libs_ui-components-skeleton", inputs: ["config"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [NgComponentOutlet]] });
131
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPagesTemplateDetailV2Component, isStandalone: true, selector: "libs_ui-components-pages_template-detail_v2", inputs: { zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, configRight: { classPropertyName: "configRight", publicName: "configRight", isSignal: true, isRequired: false, transformFunction: null }, configTitle: { classPropertyName: "configTitle", publicName: "configTitle", isSignal: true, isRequired: false, transformFunction: null }, configCenter: { classPropertyName: "configCenter", publicName: "configCenter", isSignal: true, isRequired: false, transformFunction: null }, classIncludeHeader: { classPropertyName: "classIncludeHeader", publicName: "classIncludeHeader", isSignal: true, isRequired: false, transformFunction: null }, isSplitHeaderRatio: { classPropertyName: "isSplitHeaderRatio", publicName: "isSplitHeaderRatio", isSignal: true, isRequired: false, transformFunction: null }, bodyConfig: { classPropertyName: "bodyConfig", publicName: "bodyConfig", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disable: "disableChange", outScroll: "outScroll", outClose: "outClose", outSelectedMenuDropdown: "outSelectedMenuDropdown", outSelectedButtonDropdown: "outSelectedButtonDropdown", outFunctionControl: "outFunctionControl", outSelectedRadio: "outSelectedRadio", outStateDisable: "outStateDisable", outTooltipButtonFunctionControl: "outTooltipButtonFunctionControl" }, ngImport: i0, template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <!-- ===================== HEADER ===================== -->\n <!-- Gi\u1EEF nguy\u00EAn ho\u00E0n to\u00E0n t\u1EEB V1 -->\n @if (configTitle()?.header?.content; as headerContent) {\n <div class=\"libs-ui-font-h3s py-[10px] pl-[24px] libs-ui-border-bottom-general bg-white {{ configTitle()?.header?.classInclude || '' }}\">{{ headerContent | translate }}</div>\n }\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"\n (keydown.enter)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '&mdash;'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ===================== BODY ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode: Hi\u1EC3n th\u1ECB skeleton khi \u0111ang load, sau \u0111\u00F3 render component -->\n <div\n class=\"libs-ui-components-page_detail-body {{ bodyConfig().classInclude || '' }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : pipeEmptyConfig | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : pipeEmptyConfig | async;\n @if (constHtmlCompBody) {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @else {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;display:flex;flex-direction:column}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;min-height:0;min-width:0}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { 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: 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: LibsUiComponentsRadioGroupComponent, selector: "libs_ui-components-radio-group", inputs: ["fieldKey", "keyActive", "keysDisable", "groups", "disable", "clickExactly", "horizontal", "labelConfig", "validRequired", "ignoreClassMarginLastItem", "typeRadio", "classInclude", "classLabelInclude", "classItemInclude", "alwaysShowSubText", "horizontalClassInclude"], outputs: ["groupsChange", "outClickButton", "outChange", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { 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: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "component", type: LibsUiComponentsButtonsDropdownComponent, selector: "libs_ui-components-buttons-dropdown", inputs: ["label", "fieldClass", "fieldClassIconLeft", "items", "fieldDisplay", "keyField", "keySelected", "applyNow", "showBorderBottom", "disable", "sizeButton", "classLabel", "iconOnlyType", "classIconRight", "classIconLeft", "typeButton", "popupConfig", "ignoreHiddenPopoverContentWhenMouseLeave", "classInclude", "modePopover", "classIncludeContainer"], outputs: ["keySelectedChange", "outSelectItem", "outHover", "outApply", "outPopoverEvent", "outFunctionsControl", "outIconEvent"] }, { kind: "component", type: LibsUiComponentsSkeletonComponent, selector: "libs_ui-components-skeleton", inputs: ["config"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
131
132
  }
132
133
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPagesTemplateDetailV2Component, decorators: [{
133
134
  type: Component,
@@ -146,6 +147,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
146
147
  LibsUiComponentsSkeletonComponent,
147
148
  LibsUiPipesCallFunctionInTemplatePipe,
148
149
  LibsUiPipesEscapeHtmlPipe,
149
- ], template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <!-- ===================== HEADER ===================== -->\n <!-- Gi\u1EEF nguy\u00EAn ho\u00E0n to\u00E0n t\u1EEB V1 -->\n @if (configTitle()?.header?.content; as headerContent) {\n <div class=\"libs-ui-font-h3s py-[10px] pl-[24px] libs-ui-border-bottom-general bg-white {{ configTitle()?.header?.classInclude || '' }}\">{{ headerContent | translate }}</div>\n }\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '&mdash;'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ===================== BODY ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode: Hi\u1EC3n th\u1ECB skeleton khi \u0111ang load, sau \u0111\u00F3 render component -->\n <div\n class=\"libs-ui-components-page_detail-body {{ bodyConfig().classInclude || '' }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : { valueIsEmpty: null } | async;\n @if (constHtmlCompBody) {\n @defer {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @loading {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n } @else {\n <!-- Skeleton hi\u1EC3n th\u1ECB khi Observable ch\u01B0a emit (\u0111ang ch\u1EDD delay/http) -->\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;display:flex;flex-direction:column}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;min-height:0;min-width:0}\n"] }]
150
+ ], template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <!-- ===================== HEADER ===================== -->\n <!-- Gi\u1EEF nguy\u00EAn ho\u00E0n to\u00E0n t\u1EEB V1 -->\n @if (configTitle()?.header?.content; as headerContent) {\n <div class=\"libs-ui-font-h3s py-[10px] pl-[24px] libs-ui-border-bottom-general bg-white {{ configTitle()?.header?.classInclude || '' }}\">{{ headerContent | translate }}</div>\n }\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"\n (keydown.enter)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '&mdash;'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ===================== BODY ===================== -->\n @if (bodyConfig().getComponentOutlet; as getBodyComponentOutlet) {\n <!-- Lazy load mode: Hi\u1EC3n th\u1ECB skeleton khi \u0111ang load, sau \u0111\u00F3 render component -->\n <div\n class=\"libs-ui-components-page_detail-body {{ bodyConfig().classInclude || '' }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n @let constHtmlCompBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: getBodyComponentOutlet : sectionData() : null : pipeEmptyConfig | async;\n @let constHtmlInputsBody = undefined | LibsUiPipesCallFunctionInTemplatePipe: bodyConfig().getDataComponentOutlet : sectionData() : null : pipeEmptyConfig | async;\n @if (constHtmlCompBody) {\n <ng-container *ngComponentOutlet=\"constHtmlCompBody; inputs: constHtmlInputsBody\" />\n } @else {\n <libs_ui-components-skeleton [config]=\"resolvedSkeletonBody()\" />\n }\n </div>\n }\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;display:flex;flex-direction:column}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;min-height:0;min-width:0}\n"] }]
150
151
  }] });
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLXYyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9wYWdlcy10ZW1wbGF0ZS9kZXRhaWwvc3JjL2RldGFpbC12Mi9kZXRhaWwtdjIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3BhZ2VzLXRlbXBsYXRlL2RldGFpbC9zcmMvZGV0YWlsLXYyL2RldGFpbC12Mi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBa0IsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2hHLE9BQU8sRUFBaUQsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoSSxPQUFPLEVBQWdDLGdDQUFnQyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQ2pJLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXRGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBbUIsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRyxPQUFPLEVBQXlCLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEcsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1B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QUFNLFdBQ3RDO3dCQUNQLFNBQVM7d0JBQ1QsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLGVBQWU7d0JBQ2Ysc0NBQXNDO3dCQUN0QyxnQ0FBZ0M7d0JBQ2hDLG1DQUFtQzt3QkFDbkMsK0JBQStCO3dCQUMvQixpQ0FBaUM7d0JBQ2pDLHNDQUFzQzt3QkFDdEMsd0NBQXdDO3dCQUN4QyxpQ0FBaUM7d0JBQ2pDLHFDQUFxQzt3QkFDckMseUJBQXlCO3FCQUMxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSwgTmdDb21wb25lbnRPdXRsZXQsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgT25Jbml0LCBTaWduYWwsIGNvbXB1dGVkLCBpbnB1dCwgbW9kZWwsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUJ1dHRvbiwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBUWVBFX1BPUE9WRVJfRVZFTlQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1JhZGlvR3JvdXBDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXJhZGlvLWdyb3VwJztcbmltcG9ydCB7IElSYWRpb0V2ZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1yYWRpby1zaW5nbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IElTa2VsZXRvbkNvbmZpZywgTGlic1VpQ29tcG9uZW50c1NrZWxldG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1za2VsZXRvbic7XG5pbXBvcnQgeyBJU3dpdGNoLCBJU3dpdGNoRXZlbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgZXNjYXBlSHRtbCwgZ2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ0NlbnRlciwgSVBhZ2VzVGVtcGxhdGVEZXRhaWxDb25maWdSaWdodCwgSVBhZ2VzVGVtcGxhdGVEZXRhaWxDb25maWdUaXRsZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJUGFnZURldGFpbEZ1bmN0aW9uQ29udHJvbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVBhZ2VEZXRhaWxWMkJvZHlDb25maWcsIElQYWdlRGV0YWlsVjJTZWN0aW9uRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcy9kZXRhaWwtdjIuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXBhZ2VzX3RlbXBsYXRlLWRldGFpbF92MicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwtdjIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtdjIuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBBc3luY1BpcGUsXG4gICAgTmdDb21wb25lbnRPdXRsZXQsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1JhZGlvR3JvdXBDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1N3aXRjaENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2tlbGV0b25Db21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSxcbiAgICBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUGFnZXNUZW1wbGF0ZURldGFpbFYyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gI3JlZ2lvbiAtLS0gSU5QVVRTIChr4bq/IHRo4burYSB04burIFYxKSAtLS1cbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAwMCB9KTtcbiAgcmVhZG9ubHkgY29uZmlnUmlnaHQgPSBpbnB1dDxBcnJheTxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ1JpZ2h0Pj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVGl0bGUgPSBpbnB1dDxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ1RpdGxlPigpO1xuICByZWFkb25seSBjb25maWdDZW50ZXIgPSBpbnB1dDxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ0NlbnRlcj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlSGVhZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpc1NwbGl0SGVhZGVyUmF0aW8gPSBpbnB1dDxib29sZWFuPigpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gSU5QVVRTICht4bubaSB0cm9uZyBWMikgLS0tXG4gIC8qKiBDb25maWcgxJHhu4MgbGF6eSBsb2FkIGNvbXBvbmVudCB2w6BvIHbDuW5nIGJvZHkgKi9cbiAgcmVhZG9ubHkgYm9keUNvbmZpZyA9IGlucHV0PElQYWdlRGV0YWlsVjJCb2R5Q29uZmlnLCBJUGFnZURldGFpbFYyQm9keUNvbmZpZyB8IHVuZGVmaW5lZD4oe30sIHsgdHJhbnNmb3JtOiAodikgPT4gdiB8fCB7fSB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIE1PREVMUyAtLS1cbiAgcmVhZG9ubHkgZGlzYWJsZSA9IG1vZGVsPGJvb2xlYW4+KGZhbHNlKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIE9VVFBVVFMgLS0tXG4gIHJlYWRvbmx5IG91dFNjcm9sbCA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xvc2UgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0U2VsZWN0ZWRNZW51RHJvcGRvd24gPSBvdXRwdXQ8SUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IG91dFNlbGVjdGVkQnV0dG9uRHJvcGRvd24gPSBvdXRwdXQ8SUVtaXRTZWxlY3RLZXk+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uQ29udHJvbCA9IG91dHB1dDxJUGFnZURldGFpbEZ1bmN0aW9uQ29udHJvbD4oKTtcbiAgcmVhZG9ubHkgb3V0U2VsZWN0ZWRSYWRpbyA9IG91dHB1dDxJUmFkaW9FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U3RhdGVEaXNhYmxlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dFRvb2x0aXBCdXR0b25GdW5jdGlvbkNvbnRyb2wgPSBvdXRwdXQ8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIElOVEVSTkFMIFNUQVRFIC0tLVxuICBwcml2YXRlIGRyb3Bkb3duRnVuY3Rpb25Db250cm9sITogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQ7XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIC0tLSBDT01QVVRFRCAtLS1cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ1RpdGxlQ29tcHV0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdUaXRsZSgpPy5jb25maWc7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6ICdpMThuX2JhY2tfdG9fbGlzdCcgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuY29udGVudCkge1xuICAgICAgY29uZmlnLmNvbnRlbnQgPSAnaTE4bl9iYWNrX3RvX2xpc3QnO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uY29uZmlnLCBjb250ZW50OiBlc2NhcGVIdG1sKGNvbmZpZy5jb250ZW50KSB9O1xuICB9KTtcblxuICAvKiogROG7ryBsaeG7h3Ugc3RhdGUgdHJ1eeG7gW4gdsOgbyBDb21wb25lbnQgT3V0bGV0IGJvZHkgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlY3Rpb25EYXRhID0gY29tcHV0ZWQ8SVBhZ2VEZXRhaWxWMlNlY3Rpb25EYXRhPigoKSA9PiAoe1xuICAgIGRpc2FibGU6IHRoaXMuZGlzYWJsZSgpLFxuICB9KSk7XG5cbiAgLyoqIFNrZWxldG9uIGNvbmZpZyBjaG8gQm9keSAoRMO5bmcgY29tcHV0ZWQgxJHhu4MgcmVzb2x2ZSBkZWZhdWx0IGxvZ2ljKSAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRTa2VsZXRvbkJvZHk6IFNpZ25hbDxJU2tlbGV0b25Db25maWc+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBnZXQodGhpcy5ib2R5Q29uZmlnLCAnc2tlbGV0b25Db25maWcnKSA/PyB7XG4gICAgICAgIHJlcGVhdDogMyxcbiAgICAgICAgc3R5bGVNYXJnaW5Cb3R0b206IDE2LFxuICAgICAgICByb3dzOiBbeyBpdGVtOiB7IGNsYXNzSW5jbHVkZTogJ3ctZnVsbCBoLVsxMDBweF0gcm91bmRlZC1bOHB4XScgfSB9XSxcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3V0RnVuY3Rpb25Db250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgfVxuXG4gIC8vICNyZWdpb24gLS0tIFBVQkxJQyBNRVRIT0RTIC0tLVxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVBhZ2VEZXRhaWxGdW5jdGlvbkNvbnRyb2wge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRTdGF0ZURpc2FibGU6IHRoaXMuc2V0U3RhdGVEaXNhYmxlLmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gRVZFTlQgSEFORExFUlMgLS0tXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tBY3Rpb24oZXZlbnQ6IElCdXR0b24pIHtcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuYWN0aW9uKSB7XG4gICAgICBldmVudC5hY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclN3aXRjaChldmVudDogSVN3aXRjaCwgc3dpY3RoRXZlbnQ6IElTd2l0Y2hFdmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC5hY3Rpb24pIHtcbiAgICAgIGF3YWl0IGV2ZW50LmFjdGlvbihzd2ljdGhFdmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbG9zZShlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5vdXRDbG9zZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJQb3BvdmVyRXZlbnQoZXZlbnQ6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIGlmIChldmVudCAhPT0gJ2NsaWNrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dENsb3NlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkS2V5KGV2ZW50PzogSUVtaXRTZWxlY3RLZXkpIHtcbiAgICB0aGlzLm91dFNlbGVjdGVkTWVudURyb3Bkb3duLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMuZHJvcGRvd25GdW5jdGlvbkNvbnRyb2w/LnJlc2V0KCk7XG4gICAgdGhpcy5kcm9wZG93bkZ1bmN0aW9uQ29udHJvbD8ucmVtb3ZlTGlzdCgpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZEJ1dHRvbkRyb3Bkb3duSXRlbShldmVudDogYW55KSB7XG4gICAgdGhpcy5vdXRTZWxlY3RlZEJ1dHRvbkRyb3Bkb3duLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEcm9wZG93bkZ1bmN0aW9uQ29udHJvbChldmVudDogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmRyb3Bkb3duRnVuY3Rpb25Db250cm9sID0gZXZlbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVJhZGlvKGV2ZW50OiBJUmFkaW9FdmVudCkge1xuICAgIHRoaXMub3V0U2VsZWN0ZWRSYWRpby5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sVG9vbHRpcEJ1dHRvbihldmVudDogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMub3V0VG9vbHRpcEJ1dHRvbkZ1bmN0aW9uQ29udHJvbC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMub3V0U2Nyb2xsLmVtaXQoZXZlbnQpO1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIC0tLSBQUklWQVRFIExPR0lDIC0tLVxuICBwcml2YXRlIGFzeW5jIHNldFN0YXRlRGlzYWJsZShzdGF0ZURpc2FibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGUuc2V0KHN0YXRlRGlzYWJsZSk7XG4gICAgdGhpcy5vdXRTdGF0ZURpc2FibGUuZW1pdCh0aGlzLmRpc2FibGUoKSk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxufVxuIiwiPGRpdlxuICBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1wYWdlX2RldGFpbFwiXG4gIFtzdHlsZS56SW5kZXhdPVwiekluZGV4KClcIj5cbiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSEVBREVSID09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgPCEtLSBHaeG7ryBuZ3V5w6puIGhvw6BuIHRvw6BuIHThu6sgVjEgLS0+XG4gIEBpZiAoY29uZmlnVGl0bGUoKT8uaGVhZGVyPy5jb250ZW50OyBhcyBoZWFkZXJDb250ZW50KSB7XG4gICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oM3MgcHktWzEwcHhdIHBsLVsyNHB4XSBsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCBiZy13aGl0ZSB7eyBjb25maWdUaXRsZSgpPy5oZWFkZXI/LmNsYXNzSW5jbHVkZSB8fCAnJyB9fVwiPnt7IGhlYWRlckNvbnRlbnQgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgfVxuICA8ZGl2XG4gICAgW2NsYXNzLnJvd109XCIhaXNTcGxpdEhlYWRlclJhdGlvKClcIlxuICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzE2cHhdIHB5LVs4cHhdIGp1c3RpZnktYmV0d2VlbiBiZy13aGl0ZSBsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCB7eyBjbGFzc0luY2x1ZGVIZWFkZXIoKSB8fCAnJyB9fVwiPlxuICAgIDxkaXZcbiAgICAgIFtjbGFzcy5jb2x1bW5zLThdPVwiIWlzU3BsaXRIZWFkZXJSYXRpbygpXCJcbiAgICAgIFtjbGFzcy53LVsyNCVdXT1cImlzU3BsaXRIZWFkZXJSYXRpbygpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgQGlmICghY29uZmlnVGl0bGUoKT8uaWdub3JlQnV0dG9uQmFjaykge1xuICAgICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHJvdGF0ZS1bMTgwZGVnXSBiZWZvcmU6dGV4dC1bMTZweF0gbXItWzhweF0gY3Vyc29yLXBvaW50ZXIgdGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kZWZhdWx0KV1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJDbG9zZSgkZXZlbnQpXCI+PC9pPlxuICAgICAgICB9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICBAaWYgKGNvbmZpZ1RpdGxlKCk/LmlzU2hvd0JhY2tUb0xpc3RMYWJlbCkge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICBbbGFiZWxdPVwiJ2kxOG5fYmFja190b19saXN0J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWItdWktZm9udC1oNm0nXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCdcIlxuICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsb3NlKCRldmVudClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbmZpZ1RpdGxlKCk/LmNvbmZpZzsgYXMgY29uZmlnKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdUaXRsZUNvbXB1dGVkKClcIlxuICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbbW9kZV09XCInaG92ZXInXCJcbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInY3Vyc29yLXBvaW50ZXIgJyArIChjb25maWcuY2xhc3NJbmNsdWRlIHx8ICd0ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRlZmF1bHQpXSBsaWJzLXVpLWZvbnQtaDZtJylcIlxuICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cImNvbmZpZy5jb250ZW50ID8gKCFjb25maWdUaXRsZSgpPy5pZ25vcmVFc2NhcGVIdG1sID8gKGNvbmZpZy5jb250ZW50IHwgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSB8IHRyYW5zbGF0ZSkgOiAoY29uZmlnLmNvbnRlbnQgfCB0cmFuc2xhdGUpKSA6ICcmbWRhc2g7J1wiXG4gICAgICAgICAgICAgIChvdXRFdmVudCk9XCJoYW5kbGVyUG9wb3ZlckV2ZW50KCRldmVudClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbmZpZ1RpdGxlKCk/LmNvbmZpZ0Rlc2NyaXB0aW9uOyBhcyBjb25maWdEZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICAgIFtjb25maWddPVwiY29uZmlnRGVzY3JpcHRpb24uY29uZmlnXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgW21vZGVdPVwiJ2hvdmVyJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnRGVzY3JpcHRpb24uY29uZmlnLmNsYXNzSW5jbHVkZSB8fCAnbGlicy11aS1mb250LWg2ciB0ZXh0LVsjNmE3MzgzXSdcIlxuICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cImNvbmZpZ0Rlc2NyaXB0aW9uLmlubmVyVmlldyB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUgfCB0cmFuc2xhdGVcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGlzU3BsaXRIZWFkZXJSYXRpbygpICYmIGNvbmZpZ0NlbnRlcigpOyBhcyBjb25maWdDZW50ZXIpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ3LVs1MiVdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LVs0OHB4XVwiPlxuICAgICAgICBAaWYgKCFjb25maWdDZW50ZXIudGVtcGxhdGUpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtjb25maWddPVwie1xuICAgICAgICAgICAgICBtYXhXaWR0aDogMjUwLFxuICAgICAgICAgICAgICB6SW5kZXg6IHpJbmRleCgpICsgMSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb25maWdDZW50ZXIuY2xhc3NJbmNsdWRlVGl0bGUgPz8gJ3VwcGVyY2FzZSBsaWJzLXVpLWZvbnQtaDRzJ1wiXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cImNvbmZpZ0NlbnRlci50aXRsZSA/IChjb25maWdDZW50ZXIudGl0bGUgfCB0cmFuc2xhdGUgfCBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlKSA6ICcmbWRhc2gnXCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbmZpZ0NlbnRlci50ZW1wbGF0ZVwiIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyXCJcbiAgICAgIFtjbGFzcy5jb2x1bW5zLTRdPVwiIWlzU3BsaXRIZWFkZXJSYXRpbygpXCJcbiAgICAgIFtjbGFzcy53LVsyNCVdXT1cImlzU3BsaXRIZWFkZXJSYXRpbygpXCI+XG4gICAgICBAZm9yIChpdGVtIG9mIGNvbmZpZ1JpZ2h0KCk7IHRyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xuICAgICAgICA8ZGl2IFtjbGFzcy5tci1bMTJweF1dPVwiIWxhc3RcIj5cbiAgICAgICAgICBAaWYgKGl0ZW0ua2V5ID09PSAnYnV0dG9uJyAmJiBpdGVtLmNvbmZpZ0J1dHRvbjsgYXMgY29uZmlnQnV0dG9uKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWdCdXR0b24ubGFiZWwgfHwgJydcIlxuICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJjb25maWdCdXR0b24uY2xhc3NMYWJlbCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFt0eXBlXT1cImNvbmZpZ0J1dHRvbi50eXBlIHx8ICdidXR0b24tcHJpbWFyeSdcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNvbmZpZ0J1dHRvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJjb25maWdCdXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwiY29uZmlnQnV0dG9uLmljb25Pbmx5VHlwZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJjb25maWdCdXR0b24uY2xhc3NJY29uUmlnaHQgfHwgJydcIlxuICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJjb25maWdCdXR0b24ucG9wb3ZlciB8fCB7fVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlXT1cImNvbmZpZ0J1dHRvbi5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIFtpc1BlbmRpbmddPVwiY29uZmlnQnV0dG9uLmlzUGVuZGluZyB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tBY3Rpb24oY29uZmlnQnV0dG9uKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICdzd2ljdGgnICYmICFpdGVtLmlnbm9yZVNob3dCdXR0b24gJiYgaXRlbS5jb25maWdTd2ljdGg7IGFzIGNvbmZpZ1N3aWN0aCkge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zd2l0Y2hcbiAgICAgICAgICAgICAgW2FjdGl2ZV09XCJjb25maWdTd2ljdGguYWN0aXZlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uZmlnU3dpY3RoLmRpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgKG91dFN3aXRjaCk9XCJoYW5kbGVyU3dpdGNoKGNvbmZpZ1N3aWN0aCwgJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICdtZW51LWRyb3Bkb3duJyAmJiBpdGVtLmNvbmZpZ0Ryb3Bkb3duOyBhcyBjb25maWdEcm9wZG93bikge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFt6SW5kZXhdPVwiMjAwNFwiXG4gICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImNvbmZpZ0Ryb3Bkb3duLmxpc3RDb25maWdcIlxuICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJjb25maWdEcm9wZG93bi5wb3BvdmVyQ3VzdG9tQ29uZmlnXCJcbiAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWRLZXkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJEcm9wZG93bkZ1bmN0aW9uQ29udHJvbCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tbW9yZS12ZXJ0aWNhbCB0ZXh0LVsjMzMzMzMzXSB0ZXh0LVsxMnB4XSB7eyBjb25maWdEcm9wZG93bi5jbGFzc0luY2x1ZGUgfX0nXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidwLVs3cHhdIGxpYnMtdWktYm9yZGVyLWdlbmVyYWwnXCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICdidXR0b24tZHJvcGRvd24nICYmIGl0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd247IGFzIGNvbmZpZ0Ryb3Bkb3duKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtZHJvcGRvd25cbiAgICAgICAgICAgICAgW2FwcGx5Tm93XT1cInRydWVcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5jb25maWdCdXR0b25Ecm9wZG93bi5sYWJlbCB8fCAnICdcIlxuICAgICAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiaXRlbS5jb25maWdCdXR0b25Ecm9wZG93bi5jbGFzc0ljb25SaWdodCB8fCAnICdcIlxuICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLmNsYXNzSWNvbkxlZnQgfHwgJyAnXCJcbiAgICAgICAgICAgICAgW3R5cGVCdXR0b25dPVwiaXRlbS5jb25maWdCdXR0b25Ecm9wZG93bi50eXBlIHx8ICdidXR0b24tc2Vjb25kYXJ5J1wiXG4gICAgICAgICAgICAgIFtpdGVtc109XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLml0ZW1zIHx8IFtdXCJcbiAgICAgICAgICAgICAgW2ZpZWxkRGlzcGxheV09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLmZpZWxkRGlzcGxheVwiXG4gICAgICAgICAgICAgIFtwb3B1cENvbmZpZ109XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLnBvcHVwQ29uZmlnIHx8IHsgd2lkdGg6IDIwNSwgbWF4V2lkdGg6IDQwOCwgbWF4SGVpZ2h0OiA0OCwgekluZGV4OiAxMDAsIGRpcmVjdGlvbjogJ2JvdHRvbScgfVwiXG4gICAgICAgICAgICAgIChvdXRTZWxlY3RJdGVtKT1cImhhbmRsZXJTZWxlY3RlZEJ1dHRvbkRyb3Bkb3duSXRlbSgkZXZlbnQpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ3JhZGlvLWdyb3VwJyAmJiBpdGVtLmNvbmZpZ1JhZGlvR3JvdXA7IGFzIGNvbmZpZ1JhZGlvR3JvdXApIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcmFkaW8tZ3JvdXBcbiAgICAgICAgICAgICAgW2dyb3Vwc109XCJjb25maWdSYWRpb0dyb3VwXCJcbiAgICAgICAgICAgICAgW2hvcml6b250YWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFt0eXBlUmFkaW9dPVwiJ21lZGl1bSdcIlxuICAgICAgICAgICAgICBbaWdub3JlQ2xhc3NNYXJnaW5MYXN0SXRlbV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlUmFkaW8oJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICd0b29sdGlwLWJ1dHRvbicgJiYgaXRlbS5jb25maWdUb29sdGlwQnV0dG9uOyBhcyBjb25maWdUb29sdGlwQnV0dG9uKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdUb29sdGlwPy50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnVG9vbHRpcD8uY29uZmlnXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbdHlwZV09XCJjb25maWdUb29sdGlwQnV0dG9uLmNvbmZpZ0J1dHRvbj8udHlwZSB8fCAnYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmNsYXNzSWNvbkxlZnQgfHwgJ2xpYnMtdWktaWNvbi1tb3JlLXZlcnRpY2FsIHJvdGF0ZS1bOTBkZWddIG1yLTAnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmxhYmVsIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnQnV0dG9uPy5pY29uT25seVR5cGUgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnQnV0dG9uPy5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sVG9vbHRpcEJ1dHRvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmRpc2FibGUgPz8gZmFsc2VcIiAvPlxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBCT0RZID09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgQGlmIChib2R5Q29uZmlnKCkuZ2V0Q29tcG9uZW50T3V0bGV0OyBhcyBnZXRCb2R5Q29tcG9uZW50T3V0bGV0KSB7XG4gICAgPCEtLSBMYXp5IGxvYWQgbW9kZTogSGnhu4NuIHRo4buLIHNrZWxldG9uIGtoaSDEkWFuZyBsb2FkLCBzYXUgxJHDsyByZW5kZXIgY29tcG9uZW50IC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibGlicy11aS1jb21wb25lbnRzLXBhZ2VfZGV0YWlsLWJvZHkge3sgYm9keUNvbmZpZygpLmNsYXNzSW5jbHVkZSB8fCAnJyB9fVwiXG4gICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsKCRldmVudClcIj5cbiAgICAgIEBsZXQgY29uc3RIdG1sQ29tcEJvZHkgPSB1bmRlZmluZWQgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBnZXRCb2R5Q29tcG9uZW50T3V0bGV0IDogc2VjdGlvbkRhdGEoKSA6IG51bGwgOiB7IHZhbHVlSXNFbXB0eTogbnVsbCB9IHwgYXN5bmM7XG4gICAgICBAbGV0IGNvbnN0SHRtbElucHV0c0JvZHkgPSB1bmRlZmluZWQgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBib2R5Q29uZmlnKCkuZ2V0RGF0YUNvbXBvbmVudE91dGxldCA6IHNlY3Rpb25EYXRhKCkgOiBudWxsIDogeyB2YWx1ZUlzRW1wdHk6IG51bGwgfSB8IGFzeW5jO1xuICAgICAgQGlmIChjb25zdEh0bWxDb21wQm9keSkge1xuICAgICAgICBAZGVmZXIge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiY29uc3RIdG1sQ29tcEJvZHk7IGlucHV0czogY29uc3RIdG1sSW5wdXRzQm9keVwiIC8+XG4gICAgICAgIH0gQGxvYWRpbmcge1xuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc2tlbGV0b24gW2NvbmZpZ109XCJyZXNvbHZlZFNrZWxldG9uQm9keSgpXCIgLz5cbiAgICAgICAgfVxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDwhLS0gU2tlbGV0b24gaGnhu4NuIHRo4buLIGtoaSBPYnNlcnZhYmxlIGNoxrBhIGVtaXQgKMSRYW5nIGNo4budIGRlbGF5L2h0dHApIC0tPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXNrZWxldG9uIFtjb25maWddPVwicmVzb2x2ZWRTa2VsZXRvbkJvZHkoKVwiIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLXYyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9wYWdlcy10ZW1wbGF0ZS9kZXRhaWwvc3JjL2RldGFpbC12Mi9kZXRhaWwtdjIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3BhZ2VzLXRlbXBsYXRlL2RldGFpbC9zcmMvZGV0YWlsLXYyL2RldGFpbC12Mi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBa0IsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2hHLE9BQU8sRUFBaUQsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoSSxPQUFPLEVBQWdDLGdDQUFnQyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQ2pJLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXRGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBbUIsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRyxPQUFPLEVBQXlCLCtCQUErQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEcsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1B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M0MsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLFNBQVM7d0JBQ1QsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLGVBQWU7d0JBQ2Ysc0NBQXNDO3dCQUN0QyxnQ0FBZ0M7d0JBQ2hDLG1DQUFtQzt3QkFDbkMsK0JBQStCO3dCQUMvQixpQ0FBaUM7d0JBQ2pDLHNDQUFzQzt3QkFDdEMsd0NBQXdDO3dCQUN4QyxpQ0FBaUM7d0JBQ2pDLHFDQUFxQzt3QkFDckMseUJBQXlCO3FCQUMxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSwgTmdDb21wb25lbnRPdXRsZXQsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgT25Jbml0LCBTaWduYWwsIGNvbXB1dGVkLCBpbnB1dCwgbW9kZWwsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUJ1dHRvbiwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBUWVBFX1BPUE9WRVJfRVZFTlQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1JhZGlvR3JvdXBDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXJhZGlvLWdyb3VwJztcbmltcG9ydCB7IElSYWRpb0V2ZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1yYWRpby1zaW5nbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IElTa2VsZXRvbkNvbmZpZywgTGlic1VpQ29tcG9uZW50c1NrZWxldG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1za2VsZXRvbic7XG5pbXBvcnQgeyBJU3dpdGNoLCBJU3dpdGNoRXZlbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgZXNjYXBlSHRtbCwgZ2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ0NlbnRlciwgSVBhZ2VzVGVtcGxhdGVEZXRhaWxDb25maWdSaWdodCwgSVBhZ2VzVGVtcGxhdGVEZXRhaWxDb25maWdUaXRsZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJUGFnZURldGFpbEZ1bmN0aW9uQ29udHJvbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVBhZ2VEZXRhaWxWMkJvZHlDb25maWcsIElQYWdlRGV0YWlsVjJTZWN0aW9uRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcy9kZXRhaWwtdjIuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXBhZ2VzX3RlbXBsYXRlLWRldGFpbF92MicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwtdjIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtdjIuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBBc3luY1BpcGUsXG4gICAgTmdDb21wb25lbnRPdXRsZXQsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1JhZGlvR3JvdXBDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1N3aXRjaENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2tlbGV0b25Db21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSxcbiAgICBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUGFnZXNUZW1wbGF0ZURldGFpbFYyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gI3JlZ2lvbiAtLS0gSU5QVVRTIChr4bq/IHRo4burYSB04burIFYxKSAtLS1cbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAwMCB9KTtcbiAgcmVhZG9ubHkgY29uZmlnUmlnaHQgPSBpbnB1dDxBcnJheTxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ1JpZ2h0Pj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVGl0bGUgPSBpbnB1dDxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ1RpdGxlPigpO1xuICByZWFkb25seSBjb25maWdDZW50ZXIgPSBpbnB1dDxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ0NlbnRlcj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlSGVhZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpc1NwbGl0SGVhZGVyUmF0aW8gPSBpbnB1dDxib29sZWFuPigpO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gSU5QVVRTICht4bubaSB0cm9uZyBWMikgLS0tXG4gIC8qKiBDb25maWcgxJHhu4MgbGF6eSBsb2FkIGNvbXBvbmVudCB2w6BvIHbDuW5nIGJvZHkgKi9cbiAgcmVhZG9ubHkgYm9keUNvbmZpZyA9IGlucHV0PElQYWdlRGV0YWlsVjJCb2R5Q29uZmlnLCBJUGFnZURldGFpbFYyQm9keUNvbmZpZyB8IHVuZGVmaW5lZD4oe30sIHsgdHJhbnNmb3JtOiAodikgPT4gdiB8fCB7fSB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIE1PREVMUyAtLS1cbiAgcmVhZG9ubHkgZGlzYWJsZSA9IG1vZGVsPGJvb2xlYW4+KGZhbHNlKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIE9VVFBVVFMgLS0tXG4gIHJlYWRvbmx5IG91dFNjcm9sbCA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xvc2UgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0U2VsZWN0ZWRNZW51RHJvcGRvd24gPSBvdXRwdXQ8SUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IG91dFNlbGVjdGVkQnV0dG9uRHJvcGRvd24gPSBvdXRwdXQ8SUVtaXRTZWxlY3RLZXk+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uQ29udHJvbCA9IG91dHB1dDxJUGFnZURldGFpbEZ1bmN0aW9uQ29udHJvbD4oKTtcbiAgcmVhZG9ubHkgb3V0U2VsZWN0ZWRSYWRpbyA9IG91dHB1dDxJUmFkaW9FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U3RhdGVEaXNhYmxlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dFRvb2x0aXBCdXR0b25GdW5jdGlvbkNvbnRyb2wgPSBvdXRwdXQ8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIElOVEVSTkFMIFNUQVRFIC0tLVxuICBwcml2YXRlIGRyb3Bkb3duRnVuY3Rpb25Db250cm9sITogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBwaXBlRW1wdHlDb25maWcgPSB7IHZhbHVlSXNFbXB0eTogbnVsbCB9IGFzIGNvbnN0O1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiAtLS0gQ09NUFVURUQgLS0tXG4gIHByb3RlY3RlZCByZWFkb25seSBjb25maWdUaXRsZUNvbXB1dGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnVGl0bGUoKT8uY29uZmlnO1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50OiAnaTE4bl9iYWNrX3RvX2xpc3QnIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmNvbnRlbnQpIHtcbiAgICAgIGNvbmZpZy5jb250ZW50ID0gJ2kxOG5fYmFja190b19saXN0JztcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIHJldHVybiB7IC4uLmNvbmZpZywgY29udGVudDogZXNjYXBlSHRtbChjb25maWcuY29udGVudCkgfTtcbiAgfSk7XG5cbiAgLyoqIEThu68gbGnhu4d1IHN0YXRlIHRydXnhu4FuIHbDoG8gQ29tcG9uZW50IE91dGxldCBib2R5ICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZWN0aW9uRGF0YSA9IGNvbXB1dGVkPElQYWdlRGV0YWlsVjJTZWN0aW9uRGF0YT4oKCkgPT4gKHtcbiAgICBkaXNhYmxlOiB0aGlzLmRpc2FibGUoKSxcbiAgfSkpO1xuXG4gIC8qKiBTa2VsZXRvbiBjb25maWcgY2hvIEJvZHkgKETDuW5nIGNvbXB1dGVkIMSR4buDIHJlc29sdmUgZGVmYXVsdCBsb2dpYykgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVkU2tlbGV0b25Cb2R5OiBTaWduYWw8SVNrZWxldG9uQ29uZmlnPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgZ2V0KHRoaXMuYm9keUNvbmZpZywgJ3NrZWxldG9uQ29uZmlnJykgPz8ge1xuICAgICAgICByZXBlYXQ6IDMsXG4gICAgICAgIHN0eWxlTWFyZ2luQm90dG9tOiAxNixcbiAgICAgICAgcm93czogW3sgaXRlbTogeyBjbGFzc0luY2x1ZGU6ICd3LWZ1bGwgaC1bMTAwcHhdIHJvdW5kZWQtWzhweF0nIH0gfV0sXG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG4gIC8vICNlbmRyZWdpb25cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG4gIH1cblxuICAvLyAjcmVnaW9uIC0tLSBQVUJMSUMgTUVUSE9EUyAtLS1cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElQYWdlRGV0YWlsRnVuY3Rpb25Db250cm9sIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3RhdGVEaXNhYmxlOiB0aGlzLnNldFN0YXRlRGlzYWJsZS5iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gLS0tIEVWRU5UIEhBTkRMRVJTIC0tLVxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrQWN0aW9uKGV2ZW50OiBJQnV0dG9uKSB7XG4gICAgaWYgKGV2ZW50Py5hY3Rpb24pIHtcbiAgICAgIGV2ZW50LmFjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU3dpdGNoKGV2ZW50OiBJU3dpdGNoLCBzd2ljdGhFdmVudDogSVN3aXRjaEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50Py5hY3Rpb24pIHtcbiAgICAgIGF3YWl0IGV2ZW50LmFjdGlvbihzd2ljdGhFdmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbG9zZShlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5vdXRDbG9zZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJQb3BvdmVyRXZlbnQoZXZlbnQ6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIGlmIChldmVudCAhPT0gJ2NsaWNrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dENsb3NlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkS2V5KGV2ZW50PzogSUVtaXRTZWxlY3RLZXkpIHtcbiAgICB0aGlzLm91dFNlbGVjdGVkTWVudURyb3Bkb3duLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMuZHJvcGRvd25GdW5jdGlvbkNvbnRyb2w/LnJlc2V0KCk7XG4gICAgdGhpcy5kcm9wZG93bkZ1bmN0aW9uQ29udHJvbD8ucmVtb3ZlTGlzdCgpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZEJ1dHRvbkRyb3Bkb3duSXRlbShldmVudDogYW55KSB7XG4gICAgdGhpcy5vdXRTZWxlY3RlZEJ1dHRvbkRyb3Bkb3duLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEcm9wZG93bkZ1bmN0aW9uQ29udHJvbChldmVudDogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmRyb3Bkb3duRnVuY3Rpb25Db250cm9sID0gZXZlbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVJhZGlvKGV2ZW50OiBJUmFkaW9FdmVudCkge1xuICAgIHRoaXMub3V0U2VsZWN0ZWRSYWRpby5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sVG9vbHRpcEJ1dHRvbihldmVudDogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMub3V0VG9vbHRpcEJ1dHRvbkZ1bmN0aW9uQ29udHJvbC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMub3V0U2Nyb2xsLmVtaXQoZXZlbnQpO1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIC0tLSBQUklWQVRFIExPR0lDIC0tLVxuICBwcml2YXRlIGFzeW5jIHNldFN0YXRlRGlzYWJsZShzdGF0ZURpc2FibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGUuc2V0KHN0YXRlRGlzYWJsZSk7XG4gICAgdGhpcy5vdXRTdGF0ZURpc2FibGUuZW1pdCh0aGlzLmRpc2FibGUoKSk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxufVxuIiwiPGRpdlxuICBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50cy1wYWdlX2RldGFpbFwiXG4gIFtzdHlsZS56SW5kZXhdPVwiekluZGV4KClcIj5cbiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSEVBREVSID09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgPCEtLSBHaeG7ryBuZ3V5w6puIGhvw6BuIHRvw6BuIHThu6sgVjEgLS0+XG4gIEBpZiAoY29uZmlnVGl0bGUoKT8uaGVhZGVyPy5jb250ZW50OyBhcyBoZWFkZXJDb250ZW50KSB7XG4gICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oM3MgcHktWzEwcHhdIHBsLVsyNHB4XSBsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCBiZy13aGl0ZSB7eyBjb25maWdUaXRsZSgpPy5oZWFkZXI/LmNsYXNzSW5jbHVkZSB8fCAnJyB9fVwiPnt7IGhlYWRlckNvbnRlbnQgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgfVxuICA8ZGl2XG4gICAgW2NsYXNzLnJvd109XCIhaXNTcGxpdEhlYWRlclJhdGlvKClcIlxuICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzE2cHhdIHB5LVs4cHhdIGp1c3RpZnktYmV0d2VlbiBiZy13aGl0ZSBsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCB7eyBjbGFzc0luY2x1ZGVIZWFkZXIoKSB8fCAnJyB9fVwiPlxuICAgIDxkaXZcbiAgICAgIFtjbGFzcy5jb2x1bW5zLThdPVwiIWlzU3BsaXRIZWFkZXJSYXRpbygpXCJcbiAgICAgIFtjbGFzcy53LVsyNCVdXT1cImlzU3BsaXRIZWFkZXJSYXRpbygpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgQGlmICghY29uZmlnVGl0bGUoKT8uaWdub3JlQnV0dG9uQmFjaykge1xuICAgICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHJvdGF0ZS1bMTgwZGVnXSBiZWZvcmU6dGV4dC1bMTZweF0gbXItWzhweF0gY3Vyc29yLXBvaW50ZXIgdGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kZWZhdWx0KV1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJDbG9zZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImhhbmRsZXJDbG9zZSgkZXZlbnQpXCI+PC9pPlxuICAgICAgICB9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICBAaWYgKGNvbmZpZ1RpdGxlKCk/LmlzU2hvd0JhY2tUb0xpc3RMYWJlbCkge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICBbbGFiZWxdPVwiJ2kxOG5fYmFja190b19saXN0J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWItdWktZm9udC1oNm0nXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCdcIlxuICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsb3NlKCRldmVudClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbmZpZ1RpdGxlKCk/LmNvbmZpZzsgYXMgY29uZmlnKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdUaXRsZUNvbXB1dGVkKClcIlxuICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbbW9kZV09XCInaG92ZXInXCJcbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInY3Vyc29yLXBvaW50ZXIgJyArIChjb25maWcuY2xhc3NJbmNsdWRlIHx8ICd0ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRlZmF1bHQpXSBsaWJzLXVpLWZvbnQtaDZtJylcIlxuICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cImNvbmZpZy5jb250ZW50ID8gKCFjb25maWdUaXRsZSgpPy5pZ25vcmVFc2NhcGVIdG1sID8gKGNvbmZpZy5jb250ZW50IHwgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSB8IHRyYW5zbGF0ZSkgOiAoY29uZmlnLmNvbnRlbnQgfCB0cmFuc2xhdGUpKSA6ICcmbWRhc2g7J1wiXG4gICAgICAgICAgICAgIChvdXRFdmVudCk9XCJoYW5kbGVyUG9wb3ZlckV2ZW50KCRldmVudClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbmZpZ1RpdGxlKCk/LmNvbmZpZ0Rlc2NyaXB0aW9uOyBhcyBjb25maWdEZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICAgIFtjb25maWddPVwiY29uZmlnRGVzY3JpcHRpb24uY29uZmlnXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgW21vZGVdPVwiJ2hvdmVyJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnRGVzY3JpcHRpb24uY29uZmlnLmNsYXNzSW5jbHVkZSB8fCAnbGlicy11aS1mb250LWg2ciB0ZXh0LVsjNmE3MzgzXSdcIlxuICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cImNvbmZpZ0Rlc2NyaXB0aW9uLmlubmVyVmlldyB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUgfCB0cmFuc2xhdGVcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGlzU3BsaXRIZWFkZXJSYXRpbygpICYmIGNvbmZpZ0NlbnRlcigpOyBhcyBjb25maWdDZW50ZXIpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ3LVs1MiVdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LVs0OHB4XVwiPlxuICAgICAgICBAaWYgKCFjb25maWdDZW50ZXIudGVtcGxhdGUpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtjb25maWddPVwie1xuICAgICAgICAgICAgICBtYXhXaWR0aDogMjUwLFxuICAgICAgICAgICAgICB6SW5kZXg6IHpJbmRleCgpICsgMSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb25maWdDZW50ZXIuY2xhc3NJbmNsdWRlVGl0bGUgPz8gJ3VwcGVyY2FzZSBsaWJzLXVpLWZvbnQtaDRzJ1wiXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cImNvbmZpZ0NlbnRlci50aXRsZSA/IChjb25maWdDZW50ZXIudGl0bGUgfCB0cmFuc2xhdGUgfCBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlKSA6ICcmbWRhc2gnXCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbmZpZ0NlbnRlci50ZW1wbGF0ZVwiIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyXCJcbiAgICAgIFtjbGFzcy5jb2x1bW5zLTRdPVwiIWlzU3BsaXRIZWFkZXJSYXRpbygpXCJcbiAgICAgIFtjbGFzcy53LVsyNCVdXT1cImlzU3BsaXRIZWFkZXJSYXRpbygpXCI+XG4gICAgICBAZm9yIChpdGVtIG9mIGNvbmZpZ1JpZ2h0KCk7IHRyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xuICAgICAgICA8ZGl2IFtjbGFzcy5tci1bMTJweF1dPVwiIWxhc3RcIj5cbiAgICAgICAgICBAaWYgKGl0ZW0ua2V5ID09PSAnYnV0dG9uJyAmJiBpdGVtLmNvbmZpZ0J1dHRvbjsgYXMgY29uZmlnQnV0dG9uKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWdCdXR0b24ubGFiZWwgfHwgJydcIlxuICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJjb25maWdCdXR0b24uY2xhc3NMYWJlbCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFt0eXBlXT1cImNvbmZpZ0J1dHRvbi50eXBlIHx8ICdidXR0b24tcHJpbWFyeSdcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNvbmZpZ0J1dHRvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJjb25maWdCdXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwiY29uZmlnQnV0dG9uLmljb25Pbmx5VHlwZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJjb25maWdCdXR0b24uY2xhc3NJY29uUmlnaHQgfHwgJydcIlxuICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJjb25maWdCdXR0b24ucG9wb3ZlciB8fCB7fVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlXT1cImNvbmZpZ0J1dHRvbi5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIFtpc1BlbmRpbmddPVwiY29uZmlnQnV0dG9uLmlzUGVuZGluZyB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tBY3Rpb24oY29uZmlnQnV0dG9uKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICdzd2ljdGgnICYmICFpdGVtLmlnbm9yZVNob3dCdXR0b24gJiYgaXRlbS5jb25maWdTd2ljdGg7IGFzIGNvbmZpZ1N3aWN0aCkge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zd2l0Y2hcbiAgICAgICAgICAgICAgW2FjdGl2ZV09XCJjb25maWdTd2ljdGguYWN0aXZlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uZmlnU3dpY3RoLmRpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgKG91dFN3aXRjaCk9XCJoYW5kbGVyU3dpdGNoKGNvbmZpZ1N3aWN0aCwgJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICdtZW51LWRyb3Bkb3duJyAmJiBpdGVtLmNvbmZpZ0Ryb3Bkb3duOyBhcyBjb25maWdEcm9wZG93bikge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFt6SW5kZXhdPVwiMjAwNFwiXG4gICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImNvbmZpZ0Ryb3Bkb3duLmxpc3RDb25maWdcIlxuICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJjb25maWdEcm9wZG93bi5wb3BvdmVyQ3VzdG9tQ29uZmlnXCJcbiAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWRLZXkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJEcm9wZG93bkZ1bmN0aW9uQ29udHJvbCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tbW9yZS12ZXJ0aWNhbCB0ZXh0LVsjMzMzMzMzXSB0ZXh0LVsxMnB4XSB7eyBjb25maWdEcm9wZG93bi5jbGFzc0luY2x1ZGUgfX0nXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidwLVs3cHhdIGxpYnMtdWktYm9yZGVyLWdlbmVyYWwnXCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICdidXR0b24tZHJvcGRvd24nICYmIGl0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd247IGFzIGNvbmZpZ0Ryb3Bkb3duKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtZHJvcGRvd25cbiAgICAgICAgICAgICAgW2FwcGx5Tm93XT1cInRydWVcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5jb25maWdCdXR0b25Ecm9wZG93bi5sYWJlbCB8fCAnICdcIlxuICAgICAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiaXRlbS5jb25maWdCdXR0b25Ecm9wZG93bi5jbGFzc0ljb25SaWdodCB8fCAnICdcIlxuICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLmNsYXNzSWNvbkxlZnQgfHwgJyAnXCJcbiAgICAgICAgICAgICAgW3R5cGVCdXR0b25dPVwiaXRlbS5jb25maWdCdXR0b25Ecm9wZG93bi50eXBlIHx8ICdidXR0b24tc2Vjb25kYXJ5J1wiXG4gICAgICAgICAgICAgIFtpdGVtc109XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLml0ZW1zIHx8IFtdXCJcbiAgICAgICAgICAgICAgW2ZpZWxkRGlzcGxheV09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLmZpZWxkRGlzcGxheVwiXG4gICAgICAgICAgICAgIFtwb3B1cENvbmZpZ109XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLnBvcHVwQ29uZmlnIHx8IHsgd2lkdGg6IDIwNSwgbWF4V2lkdGg6IDQwOCwgbWF4SGVpZ2h0OiA0OCwgekluZGV4OiAxMDAsIGRpcmVjdGlvbjogJ2JvdHRvbScgfVwiXG4gICAgICAgICAgICAgIChvdXRTZWxlY3RJdGVtKT1cImhhbmRsZXJTZWxlY3RlZEJ1dHRvbkRyb3Bkb3duSXRlbSgkZXZlbnQpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ3JhZGlvLWdyb3VwJyAmJiBpdGVtLmNvbmZpZ1JhZGlvR3JvdXA7IGFzIGNvbmZpZ1JhZGlvR3JvdXApIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcmFkaW8tZ3JvdXBcbiAgICAgICAgICAgICAgW2dyb3Vwc109XCJjb25maWdSYWRpb0dyb3VwXCJcbiAgICAgICAgICAgICAgW2hvcml6b250YWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFt0eXBlUmFkaW9dPVwiJ21lZGl1bSdcIlxuICAgICAgICAgICAgICBbaWdub3JlQ2xhc3NNYXJnaW5MYXN0SXRlbV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlUmFkaW8oJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICd0b29sdGlwLWJ1dHRvbicgJiYgaXRlbS5jb25maWdUb29sdGlwQnV0dG9uOyBhcyBjb25maWdUb29sdGlwQnV0dG9uKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdUb29sdGlwPy50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnVG9vbHRpcD8uY29uZmlnXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbdHlwZV09XCJjb25maWdUb29sdGlwQnV0dG9uLmNvbmZpZ0J1dHRvbj8udHlwZSB8fCAnYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmNsYXNzSWNvbkxlZnQgfHwgJ2xpYnMtdWktaWNvbi1tb3JlLXZlcnRpY2FsIHJvdGF0ZS1bOTBkZWddIG1yLTAnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmxhYmVsIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnQnV0dG9uPy5pY29uT25seVR5cGUgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnQnV0dG9uPy5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sVG9vbHRpcEJ1dHRvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmRpc2FibGUgPz8gZmFsc2VcIiAvPlxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBCT0RZID09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgQGlmIChib2R5Q29uZmlnKCkuZ2V0Q29tcG9uZW50T3V0bGV0OyBhcyBnZXRCb2R5Q29tcG9uZW50T3V0bGV0KSB7XG4gICAgPCEtLSBMYXp5IGxvYWQgbW9kZTogSGnhu4NuIHRo4buLIHNrZWxldG9uIGtoaSDEkWFuZyBsb2FkLCBzYXUgxJHDsyByZW5kZXIgY29tcG9uZW50IC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibGlicy11aS1jb21wb25lbnRzLXBhZ2VfZGV0YWlsLWJvZHkge3sgYm9keUNvbmZpZygpLmNsYXNzSW5jbHVkZSB8fCAnJyB9fVwiXG4gICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsKCRldmVudClcIj5cbiAgICAgIEBsZXQgY29uc3RIdG1sQ29tcEJvZHkgPSB1bmRlZmluZWQgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBnZXRCb2R5Q29tcG9uZW50T3V0bGV0IDogc2VjdGlvbkRhdGEoKSA6IG51bGwgOiBwaXBlRW1wdHlDb25maWcgfCBhc3luYztcbiAgICAgIEBsZXQgY29uc3RIdG1sSW5wdXRzQm9keSA9IHVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGJvZHlDb25maWcoKS5nZXREYXRhQ29tcG9uZW50T3V0bGV0IDogc2VjdGlvbkRhdGEoKSA6IG51bGwgOiBwaXBlRW1wdHlDb25maWcgfCBhc3luYztcbiAgICAgIEBpZiAoY29uc3RIdG1sQ29tcEJvZHkpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCJjb25zdEh0bWxDb21wQm9keTsgaW5wdXRzOiBjb25zdEh0bWxJbnB1dHNCb2R5XCIgLz5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXNrZWxldG9uIFtjb25maWddPVwicmVzb2x2ZWRTa2VsZXRvbkJvZHkoKVwiIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19
@@ -12,6 +12,9 @@ import { escapeHtml } from '@libs-ui/utils';
12
12
  import { TranslateModule } from '@ngx-translate/core';
13
13
  import * as i0 from "@angular/core";
14
14
  import * as i1 from "@ngx-translate/core";
15
+ /**
16
+ * @deprecated Use {@link LibsUiComponentsPagesTemplateDetailV2Component} instead.
17
+ */
15
18
  export class LibsUiComponentsPagesTemplateDetailComponent {
16
19
  dropdownFunctionControl;
17
20
  configTitleComputed = computed(() => {
@@ -50,12 +53,12 @@ export class LibsUiComponentsPagesTemplateDetailComponent {
50
53
  };
51
54
  }
52
55
  handlerClickAction(event) {
53
- if (event && event.action) {
56
+ if (event?.action) {
54
57
  event.action();
55
58
  }
56
59
  }
57
60
  async handlerSwitch(event, swicthEvent) {
58
- if (event && event.action) {
61
+ if (event?.action) {
59
62
  await event.action(swicthEvent);
60
63
  }
61
64
  }
@@ -95,7 +98,7 @@ export class LibsUiComponentsPagesTemplateDetailComponent {
95
98
  this.outScroll.emit(event);
96
99
  }
97
100
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPagesTemplateDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
98
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPagesTemplateDetailComponent, isStandalone: true, selector: "libs_ui-components-pages_template-detail", inputs: { zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, configRight: { classPropertyName: "configRight", publicName: "configRight", isSignal: true, isRequired: false, transformFunction: null }, configTitle: { classPropertyName: "configTitle", publicName: "configTitle", isSignal: true, isRequired: false, transformFunction: null }, configCenter: { classPropertyName: "configCenter", publicName: "configCenter", isSignal: true, isRequired: false, transformFunction: null }, classIncludeHeader: { classPropertyName: "classIncludeHeader", publicName: "classIncludeHeader", isSignal: true, isRequired: false, transformFunction: null }, classIncludeBody: { classPropertyName: "classIncludeBody", publicName: "classIncludeBody", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, isSplitHeaderRatio: { classPropertyName: "isSplitHeaderRatio", publicName: "isSplitHeaderRatio", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disable: "disableChange", outScroll: "outScroll", outClose: "outClose", outSelectedMenuDropdown: "outSelectedMenuDropdown", outSelectedButtonDropdown: "outSelectedButtonDropdown", outFunctionControl: "outFunctionControl", outSelectedRadio: "outSelectedRadio", outStateDisable: "outStateDisable", outTooltipButtonFunctionControl: "outTooltipButtonFunctionControl" }, ngImport: i0, template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '&mdash;'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"libs-ui-components-page_detail-body {{ classIncludeBody() }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;margin-top:40px}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;overflow-y:auto}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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: 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: LibsUiComponentsRadioGroupComponent, selector: "libs_ui-components-radio-group", inputs: ["fieldKey", "keyActive", "keysDisable", "groups", "disable", "clickExactly", "horizontal", "labelConfig", "validRequired", "ignoreClassMarginLastItem", "typeRadio", "classInclude", "classLabelInclude", "classItemInclude", "alwaysShowSubText", "horizontalClassInclude"], outputs: ["groupsChange", "outClickButton", "outChange", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { 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: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "component", type: LibsUiComponentsButtonsDropdownComponent, selector: "libs_ui-components-buttons-dropdown", inputs: ["label", "fieldClass", "fieldClassIconLeft", "items", "fieldDisplay", "keyField", "keySelected", "applyNow", "showBorderBottom", "disable", "sizeButton", "classLabel", "iconOnlyType", "classIconRight", "classIconLeft", "typeButton", "popupConfig", "ignoreHiddenPopoverContentWhenMouseLeave", "classInclude", "modePopover", "classIncludeContainer"], outputs: ["keySelectedChange", "outSelectItem", "outHover", "outApply", "outPopoverEvent", "outFunctionsControl", "outIconEvent"] }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }] });
101
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsPagesTemplateDetailComponent, isStandalone: true, selector: "libs_ui-components-pages_template-detail", inputs: { zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, configRight: { classPropertyName: "configRight", publicName: "configRight", isSignal: true, isRequired: false, transformFunction: null }, configTitle: { classPropertyName: "configTitle", publicName: "configTitle", isSignal: true, isRequired: false, transformFunction: null }, configCenter: { classPropertyName: "configCenter", publicName: "configCenter", isSignal: true, isRequired: false, transformFunction: null }, classIncludeHeader: { classPropertyName: "classIncludeHeader", publicName: "classIncludeHeader", isSignal: true, isRequired: false, transformFunction: null }, classIncludeBody: { classPropertyName: "classIncludeBody", publicName: "classIncludeBody", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, isSplitHeaderRatio: { classPropertyName: "isSplitHeaderRatio", publicName: "isSplitHeaderRatio", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disable: "disableChange", outScroll: "outScroll", outClose: "outClose", outSelectedMenuDropdown: "outSelectedMenuDropdown", outSelectedButtonDropdown: "outSelectedButtonDropdown", outFunctionControl: "outFunctionControl", outSelectedRadio: "outSelectedRadio", outStateDisable: "outStateDisable", outTooltipButtonFunctionControl: "outTooltipButtonFunctionControl" }, ngImport: i0, template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"\n (keydown.enter)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '&mdash;'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"libs-ui-components-page_detail-body {{ classIncludeBody() }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;margin-top:40px}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;overflow-y:auto}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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: 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: LibsUiComponentsRadioGroupComponent, selector: "libs_ui-components-radio-group", inputs: ["fieldKey", "keyActive", "keysDisable", "groups", "disable", "clickExactly", "horizontal", "labelConfig", "validRequired", "ignoreClassMarginLastItem", "typeRadio", "classInclude", "classLabelInclude", "classItemInclude", "alwaysShowSubText", "horizontalClassInclude"], outputs: ["groupsChange", "outClickButton", "outChange", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { 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: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "component", type: LibsUiComponentsButtonsDropdownComponent, selector: "libs_ui-components-buttons-dropdown", inputs: ["label", "fieldClass", "fieldClassIconLeft", "items", "fieldDisplay", "keyField", "keySelected", "applyNow", "showBorderBottom", "disable", "sizeButton", "classLabel", "iconOnlyType", "classIconRight", "classIconLeft", "typeButton", "popupConfig", "ignoreHiddenPopoverContentWhenMouseLeave", "classInclude", "modePopover", "classIncludeContainer"], outputs: ["keySelectedChange", "outSelectItem", "outHover", "outApply", "outPopoverEvent", "outFunctionsControl", "outIconEvent"] }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }] });
99
102
  }
100
103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsPagesTemplateDetailComponent, decorators: [{
101
104
  type: Component,
@@ -110,6 +113,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
110
113
  LibsUiComponentsScrollOverlayDirective,
111
114
  LibsUiComponentsButtonsDropdownComponent,
112
115
  LibsUiPipesEscapeHtmlPipe,
113
- ], template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '&mdash;'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"libs-ui-components-page_detail-body {{ classIncludeBody() }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;margin-top:40px}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;overflow-y:auto}\n"] }]
116
+ ], template: "<div\n class=\"libs-ui-components-page_detail\"\n [style.zIndex]=\"zIndex()\">\n <div\n [class.row]=\"!isSplitHeaderRatio()\"\n class=\"flex items-center px-[16px] py-[8px] justify-between bg-white libs-ui-border-top-general {{ classIncludeHeader() || '' }}\">\n <div\n [class.columns-8]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n <div class=\"flex items-center\">\n @if (!configTitle()?.ignoreButtonBack) {\n <i\n class=\"libs-ui-icon-chevron-right rotate-[180deg] before:text-[16px] mr-[8px] cursor-pointer text-[var(--libs-ui-color-default)]\"\n (click)=\"handlerClose($event)\"\n (keydown.enter)=\"handlerClose($event)\"></i>\n }\n <div class=\"flex w-full items-center\">\n @if (configTitle()?.isShowBackToListLabel) {\n <libs_ui-components-buttons-button\n [label]=\"'i18n_back_to_list'\"\n [classLabel]=\"'lib-ui-font-h6m'\"\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerClose($event)\" />\n }\n @if (configTitle()?.config; as config) {\n <libs_ui-components-popover\n [config]=\"configTitleComputed()\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"'cursor-pointer ' + (config.classInclude || 'text-[var(--libs-ui-color-default)] libs-ui-font-h6m')\"\n [innerHtml]=\"config.content ? (!configTitle()?.ignoreEscapeHtml ? (config.content | LibsUiPipesEscapeHtmlPipe | translate) : (config.content | translate)) : '&mdash;'\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n }\n @if (configTitle()?.configDescription; as configDescription) {\n <libs_ui-components-popover\n [config]=\"configDescription.config\"\n [type]=\"'text'\"\n [mode]=\"'hover'\"\n [classInclude]=\"configDescription.config.classInclude || 'libs-ui-font-h6r text-[#6a7383]'\"\n [innerHtml]=\"configDescription.innerView | LibsUiPipesEscapeHtmlPipe | translate\" />\n }\n </div>\n </div>\n </div>\n @if (isSplitHeaderRatio() && configCenter(); as configCenter) {\n <div class=\"w-[52%] flex items-center justify-center px-[48px]\">\n @if (!configCenter.template) {\n <libs_ui-components-popover\n type=\"text\"\n [config]=\"{\n maxWidth: 250,\n zIndex: zIndex() + 1,\n }\"\n [classInclude]=\"configCenter.classIncludeTitle ?? 'uppercase libs-ui-font-h4s'\"\n [innerHtml]=\"configCenter.title ? (configCenter.title | translate | LibsUiPipesEscapeHtmlPipe) : '&mdash'\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"configCenter.template\" />\n }\n </div>\n }\n <div\n class=\"flex justify-end items-center\"\n [class.columns-4]=\"!isSplitHeaderRatio()\"\n [class.w-[24%]]=\"isSplitHeaderRatio()\">\n @for (item of configRight(); track $index; let last = $last) {\n <div [class.mr-[12px]]=\"!last\">\n @if (item.key === 'button' && item.configButton; as configButton) {\n <libs_ui-components-buttons-button\n [label]=\"configButton.label || ''\"\n [classLabel]=\"configButton.classLabel || ''\"\n [type]=\"configButton.type || 'button-primary'\"\n [classInclude]=\"configButton.classInclude || ''\"\n [classIconLeft]=\"configButton.classIconLeft || ''\"\n [iconOnlyType]=\"configButton.iconOnlyType || false\"\n [classIconRight]=\"configButton.classIconRight || ''\"\n [popover]=\"configButton.popover || {}\"\n [disable]=\"configButton.disable || disable()\"\n [isPending]=\"configButton.isPending || false\"\n (outClick)=\"handlerClickAction(configButton)\" />\n }\n @if (item.key === 'swicth' && !item.ignoreShowButton && item.configSwicth; as configSwicth) {\n <libs_ui-components-switch\n [active]=\"configSwicth.active || false\"\n [disable]=\"configSwicth.disable || disable()\"\n (outSwitch)=\"handlerSwitch(configSwicth, $event)\" />\n }\n @if (item.key === 'menu-dropdown' && item.configDropdown; as configDropdown) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [zIndex]=\"2004\"\n [listConfig]=\"configDropdown.listConfig\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"configDropdown.popoverCustomConfig\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outFunctionsControl)=\"handlerDropdownFunctionControl($event)\">\n <libs_ui-components-buttons-button\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical text-[#333333] text-[12px] {{ configDropdown.classInclude }}'\"\n [classInclude]=\"'p-[7px] libs-ui-border-general'\"\n [type]=\"'button-third'\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n @if (item.key === 'button-dropdown' && item.configButtonDropdown; as configDropdown) {\n <libs_ui-components-buttons-dropdown\n [applyNow]=\"true\"\n [label]=\"item.configButtonDropdown.label || ' '\"\n [classIconRight]=\"item.configButtonDropdown.classIconRight || ' '\"\n [classIconLeft]=\"item.configButtonDropdown.classIconLeft || ' '\"\n [typeButton]=\"item.configButtonDropdown.type || 'button-secondary'\"\n [items]=\"item.configButtonDropdown.items || []\"\n [fieldDisplay]=\"item.configButtonDropdown.fieldDisplay\"\n [popupConfig]=\"item.configButtonDropdown.popupConfig || { width: 205, maxWidth: 408, maxHeight: 48, zIndex: 100, direction: 'bottom' }\"\n (outSelectItem)=\"handlerSelectedButtonDropdownItem($event)\" />\n }\n\n @if (item.key === 'radio-group' && item.configRadioGroup; as configRadioGroup) {\n <libs_ui-components-radio-group\n [groups]=\"configRadioGroup\"\n [horizontal]=\"true\"\n [typeRadio]=\"'medium'\"\n [ignoreClassMarginLastItem]=\"true\"\n (outChange)=\"handlerChangeRadio($event)\" />\n }\n\n @if (item.key === 'tooltip-button' && item.configTooltipButton; as configTooltipButton) {\n <libs_ui-components-popover\n [type]=\"configTooltipButton.configTooltip?.type || 'other'\"\n [config]=\"configTooltipButton.configTooltip?.config\">\n <libs_ui-components-buttons-button\n [type]=\"configTooltipButton.configButton?.type || 'button-third'\"\n [classIconLeft]=\"configTooltipButton.configButton?.classIconLeft || 'libs-ui-icon-more-vertical rotate-[90deg] mr-0'\"\n [label]=\"configTooltipButton.configButton?.label || ''\"\n [iconOnlyType]=\"configTooltipButton.configButton?.iconOnlyType ?? false\"\n [popover]=\"configTooltipButton.configButton?.popover || {}\"\n (outFunctionsControl)=\"handlerFunctionControlTooltipButton($event)\"\n [ignoreStopPropagationEvent]=\"true\"\n [disable]=\"configTooltipButton.configButton?.disable ?? false\" />\n </libs_ui-components-popover>\n }\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"libs-ui-components-page_detail-body {{ classIncludeBody() }}\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScroll($event)\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".libs-ui-components-page_detail{position:absolute;width:100%;height:100vh;left:0;top:0;background-color:#f4f5f7;margin-top:40px}.libs-ui-components-page_detail .libs-ui-components-page_detail-body{padding:0 16px;width:100%;height:100%;overflow-y:auto}\n"] }]
114
117
  }] });
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9wYWdlcy10ZW1wbGF0ZS9kZXRhaWwvc3JjL2RldGFpbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnZXMtdGVtcGxhdGUvZGV0YWlsL3NyYy9kZXRhaWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFXLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckcsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDaEcsT0FBTyxFQUFpRCxpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hJLE9BQU8sRUFBZ0MsZ0NBQWdDLEVBQXNCLE1BQU0sNkJBQTZCLENBQUM7QUFDakksT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdEYsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUF5QiwrQkFBK0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQXNCdEQsTUFBTSxPQUFPLDRDQUE0QztJQUMvQyx1QkFBdUIsQ0FBaUM7SUFDdEQsbUJBQW1CLEdB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Q0FBMEMsY0FHeEMsSUFBSSxXQUNQO3dCQUNQLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixzQ0FBc0M7d0JBQ3RDLGdDQUFnQzt3QkFDaEMsbUNBQW1DO3dCQUNuQywrQkFBK0I7d0JBQy9CLGlDQUFpQzt3QkFDakMsc0NBQXNDO3dCQUN0Qyx3Q0FBd0M7d0JBQ3hDLHlCQUF5QjtxQkFDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWRyb3Bkb3duJztcbmltcG9ydCB7IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNSYWRpb0dyb3VwQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1yYWRpby1ncm91cCc7XG5pbXBvcnQgeyBJUmFkaW9FdmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcmFkaW8tc2luZ2xlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBJU3dpdGNoLCBJU3dpdGNoRXZlbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSVBhZ2VzVGVtcGxhdGVEZXRhaWxDb25maWdDZW50ZXIsIElQYWdlc1RlbXBsYXRlRGV0YWlsQ29uZmlnUmlnaHQsIElQYWdlc1RlbXBsYXRlRGV0YWlsQ29uZmlnVGl0bGUgfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJUGFnZURldGFpbEZ1bmN0aW9uQ29udHJvbCB9IGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLmludGVyZmFjZSc7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtcGFnZXNfdGVtcGxhdGUtZGV0YWlsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RldGFpbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RldGFpbC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1JhZGlvR3JvdXBDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1N3aXRjaENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUGFnZXNUZW1wbGF0ZURldGFpbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgZHJvcGRvd25GdW5jdGlvbkNvbnRyb2whOiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudDtcbiAgcHJvdGVjdGVkIGNvbmZpZ1RpdGxlQ29tcHV0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdUaXRsZSgpPy5jb25maWc7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6ICdpMThuX2JhY2tfdG9fbGlzdCcgfTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5jb250ZW50KSB7XG4gICAgICBjb25maWcuY29udGVudCA9ICdpMThuX2JhY2tfdG9fbGlzdCc7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIHJldHVybiB7IC4uLmNvbmZpZywgY29udGVudDogZXNjYXBlSHRtbChjb25maWcuY29udGVudCkgfTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEwMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAwMCB9KTtcbiAgcmVhZG9ubHkgY29uZmlnUmlnaHQgPSBpbnB1dDxBcnJheTxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ1JpZ2h0Pj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVGl0bGUgPSBpbnB1dDxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ1RpdGxlPigpO1xuICByZWFkb25seSBjb25maWdDZW50ZXIgPSBpbnB1dDxJUGFnZXNUZW1wbGF0ZURldGFpbENvbmZpZ0NlbnRlcj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlSGVhZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVCb2R5ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBkaXNhYmxlID0gbW9kZWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBpc1NwbGl0SGVhZGVyUmF0aW8gPSBpbnB1dDxib29sZWFuPigpOyAvLyBkw7luZyBraGkgbXXhu5FuIGNoaWEgaGVhZGVyIGzDoG0gMyBwaOG6p24gdGhlbyB04buJIGzhu4cgMjQgNTIgMjRcblxuICByZWFkb25seSBvdXRTY3JvbGwgPSBvdXRwdXQ8RXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dENsb3NlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dFNlbGVjdGVkTWVudURyb3Bkb3duID0gb3V0cHV0PElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBvdXRTZWxlY3RlZEJ1dHRvbkRyb3Bkb3duID0gb3V0cHV0PElFbWl0U2VsZWN0S2V5PigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbkNvbnRyb2wgPSBvdXRwdXQ8SVBhZ2VEZXRhaWxGdW5jdGlvbkNvbnRyb2w+KCk7XG4gIHJlYWRvbmx5IG91dFNlbGVjdGVkUmFkaW8gPSBvdXRwdXQ8SVJhZGlvRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFN0YXRlRGlzYWJsZSA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRUb29sdGlwQnV0dG9uRnVuY3Rpb25Db250cm9sID0gb3V0cHV0PElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbkNvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElQYWdlRGV0YWlsRnVuY3Rpb25Db250cm9sIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3RhdGVEaXNhYmxlOiB0aGlzLnNldFN0YXRlRGlzYWJsZS5iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrQWN0aW9uKGV2ZW50OiBJQnV0dG9uKSB7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LmFjdGlvbikge1xuICAgICAgZXZlbnQuYWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTd2l0Y2goZXZlbnQ6IElTd2l0Y2gsIHN3aWN0aEV2ZW50OiBJU3dpdGNoRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuYWN0aW9uKSB7XG4gICAgICBhd2FpdCBldmVudC5hY3Rpb24oc3dpY3RoRXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xvc2UoZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMub3V0Q2xvc2UuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyUG9wb3ZlckV2ZW50KGV2ZW50OiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICBpZiAoZXZlbnQgIT09ICdjbGljaycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRDbG9zZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZEtleShldmVudD86IElFbWl0U2VsZWN0S2V5KSB7XG4gICAgdGhpcy5vdXRTZWxlY3RlZE1lbnVEcm9wZG93bi5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLmRyb3Bkb3duRnVuY3Rpb25Db250cm9sPy5yZXNldCgpOyAvL2zDtMyDaSBjaG/Mo24gbMOizIBuIDIgKGNoxrBhIHJlc2V0IHRoacyAIGtleVNlbGVjdGVkIGNoxrBhIHJlc2V0IG7Dqm4ga2jDtG5nIGNob8yjbiB0acOqzIFwIHZhzIBvIGzGsMyjYSBjaG/Mo24gY3XMgylcbiAgICB0aGlzLmRyb3Bkb3duRnVuY3Rpb25Db250cm9sPy5yZW1vdmVMaXN0KCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkQnV0dG9uRHJvcGRvd25JdGVtKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm91dFNlbGVjdGVkQnV0dG9uRHJvcGRvd24uZW1pdChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckRyb3Bkb3duRnVuY3Rpb25Db250cm9sKGV2ZW50OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMuZHJvcGRvd25GdW5jdGlvbkNvbnRyb2wgPSBldmVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0U3RhdGVEaXNhYmxlKHN0YXRlRGlzYWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZS5zZXQoc3RhdGVEaXNhYmxlKTtcbiAgICB0aGlzLm91dFN0YXRlRGlzYWJsZS5lbWl0KHRoaXMuZGlzYWJsZSgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlUmFkaW8oZXZlbnQ6IElSYWRpb0V2ZW50KSB7XG4gICAgdGhpcy5vdXRTZWxlY3RlZFJhZGlvLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xUb29sdGlwQnV0dG9uKGV2ZW50OiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5vdXRUb29sdGlwQnV0dG9uRnVuY3Rpb25Db250cm9sLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGwoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5vdXRTY3JvbGwuZW1pdChldmVudCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtcGFnZV9kZXRhaWxcIlxuICBbc3R5bGUuekluZGV4XT1cInpJbmRleCgpXCI+XG4gIDxkaXZcbiAgICBbY2xhc3Mucm93XT1cIiFpc1NwbGl0SGVhZGVyUmF0aW8oKVwiXG4gICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTZweF0gcHktWzhweF0ganVzdGlmeS1iZXR3ZWVuIGJnLXdoaXRlIGxpYnMtdWktYm9yZGVyLXRvcC1nZW5lcmFsIHt7IGNsYXNzSW5jbHVkZUhlYWRlcigpIHx8ICcnIH19XCI+XG4gICAgPGRpdlxuICAgICAgW2NsYXNzLmNvbHVtbnMtOF09XCIhaXNTcGxpdEhlYWRlclJhdGlvKClcIlxuICAgICAgW2NsYXNzLnctWzI0JV1dPVwiaXNTcGxpdEhlYWRlclJhdGlvKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICBAaWYgKCFjb25maWdUaXRsZSgpPy5pZ25vcmVCdXR0b25CYWNrKSB7XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgcm90YXRlLVsxODBkZWddIGJlZm9yZTp0ZXh0LVsxNnB4XSBtci1bOHB4XSBjdXJzb3ItcG9pbnRlciB0ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRlZmF1bHQpXVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckNsb3NlKCRldmVudClcIj48L2k+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIEBpZiAoY29uZmlnVGl0bGUoKT8uaXNTaG93QmFja1RvTGlzdExhYmVsKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgIFtsYWJlbF09XCInaTE4bl9iYWNrX3RvX2xpc3QnXCJcbiAgICAgICAgICAgICAgW2NsYXNzTGFiZWxdPVwiJ2xpYi11aS1mb250LWg2bSdcIlxuICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xvc2UoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29uZmlnVGl0bGUoKT8uY29uZmlnOyBhcyBjb25maWcpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZ1RpdGxlQ29tcHV0ZWQoKVwiXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIFttb2RlXT1cIidob3ZlcidcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidjdXJzb3ItcG9pbnRlciAnICsgKGNvbmZpZy5jbGFzc0luY2x1ZGUgfHwgJ3RleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGVmYXVsdCldIGxpYnMtdWktZm9udC1oNm0nKVwiXG4gICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnLmNvbnRlbnQgPyAoIWNvbmZpZ1RpdGxlKCk/Lmlnbm9yZUVzY2FwZUh0bWwgPyAoY29uZmlnLmNvbnRlbnQgfCBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIHwgdHJhbnNsYXRlKSA6IChjb25maWcuY29udGVudCB8IHRyYW5zbGF0ZSkpIDogJyZtZGFzaDsnXCJcbiAgICAgICAgICAgICAgKG91dEV2ZW50KT1cImhhbmRsZXJQb3BvdmVyRXZlbnQoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29uZmlnVGl0bGUoKT8uY29uZmlnRGVzY3JpcHRpb247IGFzIGNvbmZpZ0Rlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdEZXNjcmlwdGlvbi5jb25maWdcIlxuICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbbW9kZV09XCInaG92ZXInXCJcbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb25maWdEZXNjcmlwdGlvbi5jb25maWcuY2xhc3NJbmNsdWRlIHx8ICdsaWJzLXVpLWZvbnQtaDZyIHRleHQtWyM2YTczODNdJ1wiXG4gICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnRGVzY3JpcHRpb24uaW5uZXJWaWV3IHwgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSB8IHRyYW5zbGF0ZVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIEBpZiAoaXNTcGxpdEhlYWRlclJhdGlvKCkgJiYgY29uZmlnQ2VudGVyKCk7IGFzIGNvbmZpZ0NlbnRlcikge1xuICAgICAgPGRpdiBjbGFzcz1cInctWzUyJV0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtWzQ4cHhdXCI+XG4gICAgICAgIEBpZiAoIWNvbmZpZ0NlbnRlci50ZW1wbGF0ZSkge1xuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJ7XG4gICAgICAgICAgICAgIG1heFdpZHRoOiAyNTAsXG4gICAgICAgICAgICAgIHpJbmRleDogekluZGV4KCkgKyAxLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNvbmZpZ0NlbnRlci5jbGFzc0luY2x1ZGVUaXRsZSA/PyAndXBwZXJjYXNlIGxpYnMtdWktZm9udC1oNHMnXCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnQ2VudGVyLnRpdGxlID8gKGNvbmZpZ0NlbnRlci50aXRsZSB8IHRyYW5zbGF0ZSB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUpIDogJyZtZGFzaCdcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29uZmlnQ2VudGVyLnRlbXBsYXRlXCIgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXJcIlxuICAgICAgW2NsYXNzLmNvbHVtbnMtNF09XCIhaXNTcGxpdEhlYWRlclJhdGlvKClcIlxuICAgICAgW2NsYXNzLnctWzI0JV1dPVwiaXNTcGxpdEhlYWRlclJhdGlvKClcIj5cbiAgICAgIEBmb3IgKGl0ZW0gb2YgY29uZmlnUmlnaHQoKTsgdHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICAgIDxkaXYgW2NsYXNzLm1yLVsxMnB4XV09XCIhbGFzdFwiPlxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICdidXR0b24nICYmIGl0ZW0uY29uZmlnQnV0dG9uOyBhcyBjb25maWdCdXR0b24pIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0J1dHRvbi5sYWJlbCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cImNvbmZpZ0J1dHRvbi5jbGFzc0xhYmVsIHx8ICcnXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiY29uZmlnQnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnQnV0dG9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImNvbmZpZ0J1dHRvbi5jbGFzc0ljb25MZWZ0IHx8ICcnXCJcbiAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJjb25maWdCdXR0b24uaWNvbk9ubHlUeXBlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImNvbmZpZ0J1dHRvbi5jbGFzc0ljb25SaWdodCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtwb3BvdmVyXT1cImNvbmZpZ0J1dHRvbi5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uZmlnQnV0dG9uLmRpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgW2lzUGVuZGluZ109XCJjb25maWdCdXR0b24uaXNQZW5kaW5nIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0FjdGlvbihjb25maWdCdXR0b24pXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ3N3aWN0aCcgJiYgIWl0ZW0uaWdub3JlU2hvd0J1dHRvbiAmJiBpdGVtLmNvbmZpZ1N3aWN0aDsgYXMgY29uZmlnU3dpY3RoKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXN3aXRjaFxuICAgICAgICAgICAgICBbYWN0aXZlXT1cImNvbmZpZ1N3aWN0aC5hY3RpdmUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICBbZGlzYWJsZV09XCJjb25maWdTd2ljdGguZGlzYWJsZSB8fCBkaXNhYmxlKClcIlxuICAgICAgICAgICAgICAob3V0U3dpdGNoKT1cImhhbmRsZXJTd2l0Y2goY29uZmlnU3dpY3RoLCAkZXZlbnQpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ21lbnUtZHJvcGRvd24nICYmIGl0ZW0uY29uZmlnRHJvcGRvd247IGFzIGNvbmZpZ0Ryb3Bkb3duKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3pJbmRleF09XCIyMDA0XCJcbiAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwiY29uZmlnRHJvcGRvd24ubGlzdENvbmZpZ1wiXG4gICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cImNvbmZpZ0Ryb3Bkb3duLnBvcG92ZXJDdXN0b21Db25maWdcIlxuICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZEtleSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckRyb3Bkb3duRnVuY3Rpb25Db250cm9sKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1tb3JlLXZlcnRpY2FsIHRleHQtWyMzMzMzMzNdIHRleHQtWzEycHhdIHt7IGNvbmZpZ0Ryb3Bkb3duLmNsYXNzSW5jbHVkZSB9fSdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ3AtWzdweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCdcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ2J1dHRvbi1kcm9wZG93bicgJiYgaXRlbS5jb25maWdCdXR0b25Ecm9wZG93bjsgYXMgY29uZmlnRHJvcGRvd24pIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1kcm9wZG93blxuICAgICAgICAgICAgICBbYXBwbHlOb3ddPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLmxhYmVsIHx8ICcgJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLmNsYXNzSWNvblJpZ2h0IHx8ICcgJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24uY2xhc3NJY29uTGVmdCB8fCAnICdcIlxuICAgICAgICAgICAgICBbdHlwZUJ1dHRvbl09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLnR5cGUgfHwgJ2J1dHRvbi1zZWNvbmRhcnknXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24uaXRlbXMgfHwgW11cIlxuICAgICAgICAgICAgICBbZmllbGREaXNwbGF5XT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24uZmllbGREaXNwbGF5XCJcbiAgICAgICAgICAgICAgW3BvcHVwQ29uZmlnXT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24ucG9wdXBDb25maWcgfHwgeyB3aWR0aDogMjA1LCBtYXhXaWR0aDogNDA4LCBtYXhIZWlnaHQ6IDQ4LCB6SW5kZXg6IDEwMCwgZGlyZWN0aW9uOiAnYm90dG9tJyB9XCJcbiAgICAgICAgICAgICAgKG91dFNlbGVjdEl0ZW0pPVwiaGFuZGxlclNlbGVjdGVkQnV0dG9uRHJvcGRvd25JdGVtKCRldmVudClcIiAvPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICdyYWRpby1ncm91cCcgJiYgaXRlbS5jb25maWdSYWRpb0dyb3VwOyBhcyBjb25maWdSYWRpb0dyb3VwKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXJhZGlvLWdyb3VwXG4gICAgICAgICAgICAgIFtncm91cHNdPVwiY29uZmlnUmFkaW9Hcm91cFwiXG4gICAgICAgICAgICAgIFtob3Jpem9udGFsXT1cInRydWVcIlxuICAgICAgICAgICAgICBbdHlwZVJhZGlvXT1cIidtZWRpdW0nXCJcbiAgICAgICAgICAgICAgW2lnbm9yZUNsYXNzTWFyZ2luTGFzdEl0ZW1dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZVJhZGlvKCRldmVudClcIiAvPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICd0b29sdGlwLWJ1dHRvbicgJiYgaXRlbS5jb25maWdUb29sdGlwQnV0dG9uOyBhcyBjb25maWdUb29sdGlwQnV0dG9uKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdUb29sdGlwPy50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnVG9vbHRpcD8uY29uZmlnXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbdHlwZV09XCJjb25maWdUb29sdGlwQnV0dG9uLmNvbmZpZ0J1dHRvbj8udHlwZSB8fCAnYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmNsYXNzSWNvbkxlZnQgfHwgJ2xpYnMtdWktaWNvbi1tb3JlLXZlcnRpY2FsIHJvdGF0ZS1bOTBkZWddIG1yLTAnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmxhYmVsIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnQnV0dG9uPy5pY29uT25seVR5cGUgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnQnV0dG9uPy5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sVG9vbHRpcEJ1dHRvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmRpc2FibGUgPz8gZmFsc2VcIiAvPlxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtcGFnZV9kZXRhaWwtYm9keSB7eyBjbGFzc0luY2x1ZGVCb2R5KCkgfX1cIlxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsKCRldmVudClcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9wYWdlcy10ZW1wbGF0ZS9kZXRhaWwvc3JjL2RldGFpbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcGFnZXMtdGVtcGxhdGUvZGV0YWlsL3NyYy9kZXRhaWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFXLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckcsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDaEcsT0FBTyxFQUFpRCxpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hJLE9BQU8sRUFBZ0MsZ0NBQWdDLEVBQXNCLE1BQU0sNkJBQTZCLENBQUM7QUFDakksT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdEYsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUF5QiwrQkFBK0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQUd0RDs7R0FFRztBQW9CSCxNQUFNLE9BQU8sNENBQTRDO0lBQy9DLHVCQUF1QixDQUFpQztJQUN0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eEMsSUFBSSxXQUNQO3dCQUNQLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixzQ0FBc0M7d0JBQ3RDLGdDQUFnQzt3QkFDaEMsbUNBQW1DO3dCQUNuQywrQkFBK0I7d0JBQy9CLGlDQUFpQzt3QkFDakMsc0NBQXNDO3dCQUN0Qyx3Q0FBd0M7d0JBQ3hDLHlCQUF5QjtxQkFDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElCdXR0b24sIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWRyb3Bkb3duJztcbmltcG9ydCB7IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNSYWRpb0dyb3VwQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1yYWRpby1ncm91cCc7XG5pbXBvcnQgeyBJUmFkaW9FdmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcmFkaW8tc2luZ2xlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBJU3dpdGNoLCBJU3dpdGNoRXZlbnQsIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSVBhZ2VzVGVtcGxhdGVEZXRhaWxDb25maWdDZW50ZXIsIElQYWdlc1RlbXBsYXRlRGV0YWlsQ29uZmlnUmlnaHQsIElQYWdlc1RlbXBsYXRlRGV0YWlsQ29uZmlnVGl0bGUgfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJUGFnZURldGFpbEZ1bmN0aW9uQ29udHJvbCB9IGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLmludGVyZmFjZSc7XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTGlic1VpQ29tcG9uZW50c1BhZ2VzVGVtcGxhdGVEZXRhaWxWMkNvbXBvbmVudH0gaW5zdGVhZC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXBhZ2VzX3RlbXBsYXRlLWRldGFpbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZXRhaWwuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNSYWRpb0dyb3VwQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlLFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1BhZ2VzVGVtcGxhdGVEZXRhaWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIGRyb3Bkb3duRnVuY3Rpb25Db250cm9sITogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQ7XG4gIHByb3RlY3RlZCBjb25maWdUaXRsZUNvbXB1dGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnVGl0bGUoKT8uY29uZmlnO1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50OiAnaTE4bl9iYWNrX3RvX2xpc3QnIH07XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcuY29udGVudCkge1xuICAgICAgY29uZmlnLmNvbnRlbnQgPSAnaTE4bl9iYWNrX3RvX2xpc3QnO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG5cbiAgICByZXR1cm4geyAuLi5jb25maWcsIGNvbnRlbnQ6IGVzY2FwZUh0bWwoY29uZmlnLmNvbnRlbnQpIH07XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMDAwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDEwMDAgfSk7XG4gIHJlYWRvbmx5IGNvbmZpZ1JpZ2h0ID0gaW5wdXQ8QXJyYXk8SVBhZ2VzVGVtcGxhdGVEZXRhaWxDb25maWdSaWdodD4+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZ1RpdGxlID0gaW5wdXQ8SVBhZ2VzVGVtcGxhdGVEZXRhaWxDb25maWdUaXRsZT4oKTtcbiAgcmVhZG9ubHkgY29uZmlnQ2VudGVyID0gaW5wdXQ8SVBhZ2VzVGVtcGxhdGVEZXRhaWxDb25maWdDZW50ZXI+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUhlYWRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlQm9keSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IG1vZGVsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaXNTcGxpdEhlYWRlclJhdGlvID0gaW5wdXQ8Ym9vbGVhbj4oKTsgLy8gZMO5bmcga2hpIG114buRbiBjaGlhIGhlYWRlciBsw6BtIDMgcGjhuqduIHRoZW8gdOG7iSBs4buHIDI0IDUyIDI0XG5cbiAgcmVhZG9ubHkgb3V0U2Nyb2xsID0gb3V0cHV0PEV2ZW50PigpO1xuICByZWFkb25seSBvdXRDbG9zZSA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRTZWxlY3RlZE1lbnVEcm9wZG93biA9IG91dHB1dDxJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgb3V0U2VsZWN0ZWRCdXR0b25Ecm9wZG93biA9IG91dHB1dDxJRW1pdFNlbGVjdEtleT4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25Db250cm9sID0gb3V0cHV0PElQYWdlRGV0YWlsRnVuY3Rpb25Db250cm9sPigpO1xuICByZWFkb25seSBvdXRTZWxlY3RlZFJhZGlvID0gb3V0cHV0PElSYWRpb0V2ZW50PigpO1xuICByZWFkb25seSBvdXRTdGF0ZURpc2FibGUgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0VG9vbHRpcEJ1dHRvbkZ1bmN0aW9uQ29udHJvbCA9IG91dHB1dDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3V0RnVuY3Rpb25Db250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRnVuY3Rpb25zQ29udHJvbCgpOiBJUGFnZURldGFpbEZ1bmN0aW9uQ29udHJvbCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldFN0YXRlRGlzYWJsZTogdGhpcy5zZXRTdGF0ZURpc2FibGUuYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0FjdGlvbihldmVudDogSUJ1dHRvbikge1xuICAgIGlmIChldmVudD8uYWN0aW9uKSB7XG4gICAgICBldmVudC5hY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclN3aXRjaChldmVudDogSVN3aXRjaCwgc3dpY3RoRXZlbnQ6IElTd2l0Y2hFdmVudCkge1xuICAgIGlmIChldmVudD8uYWN0aW9uKSB7XG4gICAgICBhd2FpdCBldmVudC5hY3Rpb24oc3dpY3RoRXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xvc2UoZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMub3V0Q2xvc2UuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyUG9wb3ZlckV2ZW50KGV2ZW50OiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICBpZiAoZXZlbnQgIT09ICdjbGljaycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRDbG9zZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZEtleShldmVudD86IElFbWl0U2VsZWN0S2V5KSB7XG4gICAgdGhpcy5vdXRTZWxlY3RlZE1lbnVEcm9wZG93bi5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLmRyb3Bkb3duRnVuY3Rpb25Db250cm9sPy5yZXNldCgpOyAvL2zDtMyDaSBjaG/Mo24gbMOizIBuIDIgKGNoxrBhIHJlc2V0IHRoacyAIGtleVNlbGVjdGVkIGNoxrBhIHJlc2V0IG7Dqm4ga2jDtG5nIGNob8yjbiB0acOqzIFwIHZhzIBvIGzGsMyjYSBjaG/Mo24gY3XMgylcbiAgICB0aGlzLmRyb3Bkb3duRnVuY3Rpb25Db250cm9sPy5yZW1vdmVMaXN0KCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkQnV0dG9uRHJvcGRvd25JdGVtKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm91dFNlbGVjdGVkQnV0dG9uRHJvcGRvd24uZW1pdChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckRyb3Bkb3duRnVuY3Rpb25Db250cm9sKGV2ZW50OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMuZHJvcGRvd25GdW5jdGlvbkNvbnRyb2wgPSBldmVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0U3RhdGVEaXNhYmxlKHN0YXRlRGlzYWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZS5zZXQoc3RhdGVEaXNhYmxlKTtcbiAgICB0aGlzLm91dFN0YXRlRGlzYWJsZS5lbWl0KHRoaXMuZGlzYWJsZSgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlUmFkaW8oZXZlbnQ6IElSYWRpb0V2ZW50KSB7XG4gICAgdGhpcy5vdXRTZWxlY3RlZFJhZGlvLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xUb29sdGlwQnV0dG9uKGV2ZW50OiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5vdXRUb29sdGlwQnV0dG9uRnVuY3Rpb25Db250cm9sLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGwoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5vdXRTY3JvbGwuZW1pdChldmVudCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtcGFnZV9kZXRhaWxcIlxuICBbc3R5bGUuekluZGV4XT1cInpJbmRleCgpXCI+XG4gIDxkaXZcbiAgICBbY2xhc3Mucm93XT1cIiFpc1NwbGl0SGVhZGVyUmF0aW8oKVwiXG4gICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTZweF0gcHktWzhweF0ganVzdGlmeS1iZXR3ZWVuIGJnLXdoaXRlIGxpYnMtdWktYm9yZGVyLXRvcC1nZW5lcmFsIHt7IGNsYXNzSW5jbHVkZUhlYWRlcigpIHx8ICcnIH19XCI+XG4gICAgPGRpdlxuICAgICAgW2NsYXNzLmNvbHVtbnMtOF09XCIhaXNTcGxpdEhlYWRlclJhdGlvKClcIlxuICAgICAgW2NsYXNzLnctWzI0JV1dPVwiaXNTcGxpdEhlYWRlclJhdGlvKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICBAaWYgKCFjb25maWdUaXRsZSgpPy5pZ25vcmVCdXR0b25CYWNrKSB7XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgcm90YXRlLVsxODBkZWddIGJlZm9yZTp0ZXh0LVsxNnB4XSBtci1bOHB4XSBjdXJzb3ItcG9pbnRlciB0ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRlZmF1bHQpXVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckNsb3NlKCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlckNsb3NlKCRldmVudClcIj48L2k+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIEBpZiAoY29uZmlnVGl0bGUoKT8uaXNTaG93QmFja1RvTGlzdExhYmVsKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgIFtsYWJlbF09XCInaTE4bl9iYWNrX3RvX2xpc3QnXCJcbiAgICAgICAgICAgICAgW2NsYXNzTGFiZWxdPVwiJ2xpYi11aS1mb250LWg2bSdcIlxuICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xvc2UoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29uZmlnVGl0bGUoKT8uY29uZmlnOyBhcyBjb25maWcpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZ1RpdGxlQ29tcHV0ZWQoKVwiXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIFttb2RlXT1cIidob3ZlcidcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidjdXJzb3ItcG9pbnRlciAnICsgKGNvbmZpZy5jbGFzc0luY2x1ZGUgfHwgJ3RleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGVmYXVsdCldIGxpYnMtdWktZm9udC1oNm0nKVwiXG4gICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnLmNvbnRlbnQgPyAoIWNvbmZpZ1RpdGxlKCk/Lmlnbm9yZUVzY2FwZUh0bWwgPyAoY29uZmlnLmNvbnRlbnQgfCBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIHwgdHJhbnNsYXRlKSA6IChjb25maWcuY29udGVudCB8IHRyYW5zbGF0ZSkpIDogJyZtZGFzaDsnXCJcbiAgICAgICAgICAgICAgKG91dEV2ZW50KT1cImhhbmRsZXJQb3BvdmVyRXZlbnQoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29uZmlnVGl0bGUoKT8uY29uZmlnRGVzY3JpcHRpb247IGFzIGNvbmZpZ0Rlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdEZXNjcmlwdGlvbi5jb25maWdcIlxuICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbbW9kZV09XCInaG92ZXInXCJcbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb25maWdEZXNjcmlwdGlvbi5jb25maWcuY2xhc3NJbmNsdWRlIHx8ICdsaWJzLXVpLWZvbnQtaDZyIHRleHQtWyM2YTczODNdJ1wiXG4gICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnRGVzY3JpcHRpb24uaW5uZXJWaWV3IHwgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSB8IHRyYW5zbGF0ZVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIEBpZiAoaXNTcGxpdEhlYWRlclJhdGlvKCkgJiYgY29uZmlnQ2VudGVyKCk7IGFzIGNvbmZpZ0NlbnRlcikge1xuICAgICAgPGRpdiBjbGFzcz1cInctWzUyJV0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtWzQ4cHhdXCI+XG4gICAgICAgIEBpZiAoIWNvbmZpZ0NlbnRlci50ZW1wbGF0ZSkge1xuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJ7XG4gICAgICAgICAgICAgIG1heFdpZHRoOiAyNTAsXG4gICAgICAgICAgICAgIHpJbmRleDogekluZGV4KCkgKyAxLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNvbmZpZ0NlbnRlci5jbGFzc0luY2x1ZGVUaXRsZSA/PyAndXBwZXJjYXNlIGxpYnMtdWktZm9udC1oNHMnXCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiY29uZmlnQ2VudGVyLnRpdGxlID8gKGNvbmZpZ0NlbnRlci50aXRsZSB8IHRyYW5zbGF0ZSB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUpIDogJyZtZGFzaCdcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29uZmlnQ2VudGVyLnRlbXBsYXRlXCIgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXJcIlxuICAgICAgW2NsYXNzLmNvbHVtbnMtNF09XCIhaXNTcGxpdEhlYWRlclJhdGlvKClcIlxuICAgICAgW2NsYXNzLnctWzI0JV1dPVwiaXNTcGxpdEhlYWRlclJhdGlvKClcIj5cbiAgICAgIEBmb3IgKGl0ZW0gb2YgY29uZmlnUmlnaHQoKTsgdHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICAgIDxkaXYgW2NsYXNzLm1yLVsxMnB4XV09XCIhbGFzdFwiPlxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICdidXR0b24nICYmIGl0ZW0uY29uZmlnQnV0dG9uOyBhcyBjb25maWdCdXR0b24pIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0J1dHRvbi5sYWJlbCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cImNvbmZpZ0J1dHRvbi5jbGFzc0xhYmVsIHx8ICcnXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiY29uZmlnQnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnQnV0dG9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImNvbmZpZ0J1dHRvbi5jbGFzc0ljb25MZWZ0IHx8ICcnXCJcbiAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJjb25maWdCdXR0b24uaWNvbk9ubHlUeXBlIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImNvbmZpZ0J1dHRvbi5jbGFzc0ljb25SaWdodCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtwb3BvdmVyXT1cImNvbmZpZ0J1dHRvbi5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uZmlnQnV0dG9uLmRpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgW2lzUGVuZGluZ109XCJjb25maWdCdXR0b24uaXNQZW5kaW5nIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0FjdGlvbihjb25maWdCdXR0b24pXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ3N3aWN0aCcgJiYgIWl0ZW0uaWdub3JlU2hvd0J1dHRvbiAmJiBpdGVtLmNvbmZpZ1N3aWN0aDsgYXMgY29uZmlnU3dpY3RoKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXN3aXRjaFxuICAgICAgICAgICAgICBbYWN0aXZlXT1cImNvbmZpZ1N3aWN0aC5hY3RpdmUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICBbZGlzYWJsZV09XCJjb25maWdTd2ljdGguZGlzYWJsZSB8fCBkaXNhYmxlKClcIlxuICAgICAgICAgICAgICAob3V0U3dpdGNoKT1cImhhbmRsZXJTd2l0Y2goY29uZmlnU3dpY3RoLCAkZXZlbnQpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ21lbnUtZHJvcGRvd24nICYmIGl0ZW0uY29uZmlnRHJvcGRvd247IGFzIGNvbmZpZ0Ryb3Bkb3duKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3pJbmRleF09XCIyMDA0XCJcbiAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwiY29uZmlnRHJvcGRvd24ubGlzdENvbmZpZ1wiXG4gICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cImNvbmZpZ0Ryb3Bkb3duLnBvcG92ZXJDdXN0b21Db25maWdcIlxuICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZEtleSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckRyb3Bkb3duRnVuY3Rpb25Db250cm9sKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1tb3JlLXZlcnRpY2FsIHRleHQtWyMzMzMzMzNdIHRleHQtWzEycHhdIHt7IGNvbmZpZ0Ryb3Bkb3duLmNsYXNzSW5jbHVkZSB9fSdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ3AtWzdweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCdcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpdGVtLmtleSA9PT0gJ2J1dHRvbi1kcm9wZG93bicgJiYgaXRlbS5jb25maWdCdXR0b25Ecm9wZG93bjsgYXMgY29uZmlnRHJvcGRvd24pIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1kcm9wZG93blxuICAgICAgICAgICAgICBbYXBwbHlOb3ddPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLmxhYmVsIHx8ICcgJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLmNsYXNzSWNvblJpZ2h0IHx8ICcgJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24uY2xhc3NJY29uTGVmdCB8fCAnICdcIlxuICAgICAgICAgICAgICBbdHlwZUJ1dHRvbl09XCJpdGVtLmNvbmZpZ0J1dHRvbkRyb3Bkb3duLnR5cGUgfHwgJ2J1dHRvbi1zZWNvbmRhcnknXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24uaXRlbXMgfHwgW11cIlxuICAgICAgICAgICAgICBbZmllbGREaXNwbGF5XT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24uZmllbGREaXNwbGF5XCJcbiAgICAgICAgICAgICAgW3BvcHVwQ29uZmlnXT1cIml0ZW0uY29uZmlnQnV0dG9uRHJvcGRvd24ucG9wdXBDb25maWcgfHwgeyB3aWR0aDogMjA1LCBtYXhXaWR0aDogNDA4LCBtYXhIZWlnaHQ6IDQ4LCB6SW5kZXg6IDEwMCwgZGlyZWN0aW9uOiAnYm90dG9tJyB9XCJcbiAgICAgICAgICAgICAgKG91dFNlbGVjdEl0ZW0pPVwiaGFuZGxlclNlbGVjdGVkQnV0dG9uRHJvcGRvd25JdGVtKCRldmVudClcIiAvPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICdyYWRpby1ncm91cCcgJiYgaXRlbS5jb25maWdSYWRpb0dyb3VwOyBhcyBjb25maWdSYWRpb0dyb3VwKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXJhZGlvLWdyb3VwXG4gICAgICAgICAgICAgIFtncm91cHNdPVwiY29uZmlnUmFkaW9Hcm91cFwiXG4gICAgICAgICAgICAgIFtob3Jpem9udGFsXT1cInRydWVcIlxuICAgICAgICAgICAgICBbdHlwZVJhZGlvXT1cIidtZWRpdW0nXCJcbiAgICAgICAgICAgICAgW2lnbm9yZUNsYXNzTWFyZ2luTGFzdEl0ZW1dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZVJhZGlvKCRldmVudClcIiAvPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAoaXRlbS5rZXkgPT09ICd0b29sdGlwLWJ1dHRvbicgJiYgaXRlbS5jb25maWdUb29sdGlwQnV0dG9uOyBhcyBjb25maWdUb29sdGlwQnV0dG9uKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdUb29sdGlwPy50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnVG9vbHRpcD8uY29uZmlnXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbdHlwZV09XCJjb25maWdUb29sdGlwQnV0dG9uLmNvbmZpZ0J1dHRvbj8udHlwZSB8fCAnYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmNsYXNzSWNvbkxlZnQgfHwgJ2xpYnMtdWktaWNvbi1tb3JlLXZlcnRpY2FsIHJvdGF0ZS1bOTBkZWddIG1yLTAnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmxhYmVsIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnQnV0dG9uPy5pY29uT25seVR5cGUgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cImNvbmZpZ1Rvb2x0aXBCdXR0b24uY29uZmlnQnV0dG9uPy5wb3BvdmVyIHx8IHt9XCJcbiAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sVG9vbHRpcEJ1dHRvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uZmlnVG9vbHRpcEJ1dHRvbi5jb25maWdCdXR0b24/LmRpc2FibGUgPz8gZmFsc2VcIiAvPlxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudHMtcGFnZV9kZXRhaWwtYm9keSB7eyBjbGFzc0luY2x1ZGVCb2R5KCkgfX1cIlxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgKG91dFNjcm9sbCk9XCJoYW5kbGVyU2Nyb2xsKCRldmVudClcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=