@libs-ui/components-list 0.2.203 → 0.2.205
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/defines/list.define.d.ts +1 -1
- package/esm2022/interfaces/config-item.interface.mjs +1 -1
- package/esm2022/list.component.mjs +6 -3
- package/esm2022/templates/checkbox/checkbox.component.mjs +8 -6
- package/esm2022/templates/group/group.component.mjs +2 -2
- package/esm2022/templates/radio/radio.component.mjs +8 -6
- package/esm2022/templates/tag/tag.component.mjs +2 -2
- package/esm2022/templates/text/text.component.mjs +9 -6
- package/fesm2022/libs-ui-components-list.mjs +24 -16
- package/fesm2022/libs-ui-components-list.mjs.map +1 -1
- package/interfaces/config-item.interface.d.ts +11 -11
- package/list.component.d.ts +1 -1
- package/package.json +23 -23
- package/templates/templates.component.abstract.d.ts +1 -1
- package/templates/text/text.component.d.ts +1 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import { AsyncPipe, NgClass, NgComponentOutlet, NgTemplateOutlet } from '@angular/common';
|
|
3
|
-
import { ChangeDetectionStrategy, Component, signal, viewChild } from '@angular/core';
|
|
3
|
+
import { ChangeDetectionStrategy, Component, computed, signal, viewChild } from '@angular/core';
|
|
4
4
|
import { VirtualScrollerComponent, VirtualScrollerModule } from '@iharbeck/ngx-virtual-scroller';
|
|
5
5
|
import { LibsUiComponentsAvatarComponent } from '@libs-ui/components-avatar';
|
|
6
6
|
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
@@ -11,19 +11,21 @@ import { LibsUiComponentsSpinnerComponent } from '@libs-ui/components-spinner';
|
|
|
11
11
|
import { LibsUiComponentsSwitchComponent } from '@libs-ui/components-switch';
|
|
12
12
|
import { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';
|
|
13
13
|
import { LibsUiPipesConvertObjectToSignalPipe } from '@libs-ui/pipes-convert-object-to-signal';
|
|
14
|
+
import { LibsUiPipesConvertSignalToObjectPipe } from '@libs-ui/pipes-convert-signal-to-object';
|
|
15
|
+
import { LibsUiPipesGetValueOfObjectPipe } from '@libs-ui/pipes-get-value-of-object';
|
|
14
16
|
import { cloneDeep, convertObjectToSignal, deleteUnicode, escapeHtml, isEmpty } from '@libs-ui/utils';
|
|
15
17
|
import { TranslateModule } from '@ngx-translate/core';
|
|
16
18
|
import { LibsUiComponentsListHighlightKeySearchDirective } from '../../highlight-key-search/highlight-key-search.directive';
|
|
17
19
|
import { LibsUiCheckSelectedByKeyPipe } from '../../pipes/check-selected-by-key.pipe';
|
|
18
20
|
import { LibsUiComponentsListRowsComponent } from '../rows/rows.component';
|
|
19
21
|
import { LibsUiComponentsListTemplatesComponentAbstract } from '../templates.component.abstract';
|
|
20
|
-
import { LibsUiPipesGetValueOfObjectPipe } from '@libs-ui/pipes-get-value-of-object';
|
|
21
22
|
import * as i0 from "@angular/core";
|
|
22
23
|
import * as i1 from "@iharbeck/ngx-virtual-scroller";
|
|
23
24
|
import * as i2 from "@ngx-translate/core";
|
|
24
25
|
export class LibsUiComponentsListTextComponent extends LibsUiComponentsListTemplatesComponentAbstract {
|
|
25
26
|
// #region PROPERTY
|
|
26
27
|
configTemplateText = signal(undefined);
|
|
28
|
+
isShowHeightCalculate = computed(() => this.heightViewPort() && (!this.config()?.ignoreShowDataWhenNotSearch || (this.config()?.ignoreShowDataWhenNotSearch && this.config()?.ignoreFixHeightShowDataWhenNotSearch)));
|
|
27
29
|
/* VIEW CHILD */
|
|
28
30
|
virtualScrollerComponent = viewChild(VirtualScrollerComponent);
|
|
29
31
|
ngOnInit() {
|
|
@@ -212,7 +214,7 @@ export class LibsUiComponentsListTextComponent extends LibsUiComponentsListTempl
|
|
|
212
214
|
item.specific_loadImgError = true;
|
|
213
215
|
}
|
|
214
216
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListTextComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
215
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsListTextComponent, isStandalone: true, selector: "libs_ui-components-list-templates_text", viewQueries: [{ propertyName: "virtualScrollerComponent", first: true, predicate: VirtualScrollerComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (configTemplateText(); as configTemplateText) {\n <div class=\"relative h-full w-full\">\n @if (items() && items().length) {\n <div #elementScroll\n [style.height]=\" heightViewPort() && (!config()?.ignoreShowDataWhenNotSearch || (config()?.ignoreShowDataWhenNotSearch && config()?.ignoreFixHeightShowDataWhenNotSearch)) ? heightViewPort()+'px':'100%'\"\n class=\"w-full\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (!configTemplateText.notUseVirtualScroll) {\n <virtual-scroller #scroll\n [parentScroll]=\"elementScroll\"\n [items]=\"items()\"\n class=\"h-full\">\n <ng-container *ngTemplateOutlet='listRef;context:{itemsView:scroll.viewPortItems}' />\n </virtual-scroller>\n }\n @if (configTemplateText.notUseVirtualScroll) {\n <ng-container *ngTemplateOutlet='listRef;context:{itemsView:items()}' />\n }\n </div>\n }\n @if ((!items() || !items().length) && (!config()?.ignoreShowDataWhenNotSearch || keySearch())) {\n <div [class]=\"'libs-ui-font-h5r text-[#9ca2ad] '+ (config()?.textNoDataClassInclude ?? 'py-[6px] px-[16px]')\">\n @if (!keySearch() && !loading()) {\n {{ (config()?.textNoData ?? 'i18n_have_no_selection') | translate }}\n }\n @if (templateRefSearchNoData() && keySearch() && !loading()) {\n <ng-container *ngTemplateOutlet=\"templateRefSearchNoData() || null;context:{keySearch:keySearch()}\" />\n }\n @if (!templateRefSearchNoData() && keySearch() && !loading()) {\n {{ (config()?.textSearchNoData ?? 'i18n_no_result') | translate }}\n }\n @if (loading()) {\n \n }\n </div>\n }\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"loadingIconSize() || 'medium'\" />\n }\n </div>\n <ng-template #listRef\n let-itemsView='itemsView'>\n @for (item of itemsView; track item()[fieldKey()]) {\n <div #itemRef\n [class]=\"item().classItemWrapper || ''\">\n <div LibsUiComponentsListHighlightKeySearchDirective\n [isHighlight]=\"config()?.highlightTextSearchInResult\"\n [keySearch]=\"keySearch()\"\n [class]=\"'libs-ui-list-template-text-item libs-ui-font-h5r flex '+(item().classItem || '')\"\n [class.items-center]=\"!item().itemAlignStart\"\n [class.items-start]=\"item().itemAlignStart\"\n [class.libs-ui-bg-list-hover-danger]=\"!clickExactly() && item().hoverDanger\"\n [class.libs-ui-bg-list-hover]=\"!clickExactly() && !item().hoverDanger\"\n [class.libs-ui-bg-list-active]=\"!clickExactly() && keySelected() === item()[fieldKey()]\"\n [class.!pl-[16px]]=\"paddingLeftItem()\"\n [class.bg-[#ffffff]]=\"clickExactly()\"\n [class.libs-ui-bg-list-hover-ffffff]=\"item().disable\"\n [class.cursor-default]=\"item().disable\"\n [class.!py-[2px]]=\"clickExactly()\"\n [class.!pr-[48px]]=\"keySelected() === item()[fieldKey()] && (!configTemplateText?.ignoreIconSelected || configTemplateText?.actionSort)&& !configTemplateText?.stylePaddingRightItemOther\"\n [ngClass]=\"{'pointer-events-none libs-ui-disable':loading() || disable() || ((item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length) && !ignoreClassDisableDefaultWhenUseKeysDisableItem())}\"\n (click)=\"handlerClickRelative($event,item())\">\n @if ((item().bullet|LibsUiPipesConvertObjectToSignalPipe)?.(); as bullet) {\n <span class=\"libs-ui-list-template-text-item-bullet flex flex-shrink-0\"\n [style.backgroundColor]=\"bullet.backgroundColor\"\n (click)=\"handlerSelectItem($event,item())\">\n </span>\n }\n @if ((item().avatarConfig|LibsUiPipesConvertObjectToSignalPipe)?.(); as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape ?? 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [classImageInclude]=\"avatarConfig.classImageInclude\"\n [size]=\"avatarConfig.size ?? 32\"\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\"\n [classImageInclude]=\"avatarConfig.classImageInclude\" />\n }\n @if (configTemplateText.getImage || configTemplateText.fieldGetImage) {\n <img\n [src]=\"configTemplateText.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateText.getImageError ? configTemplateText.getImageError : configTemplateText.getImage):item()) | async) : item()[configTemplateText.fieldGetImage || '']\"\n [class]=\"'libs-ui-list-template-text-item-avatar ' + (configTemplateText.classIncludeImage ?? '')\"\n [class.w-[18px]]=\"configTemplateText.imgTypeIcon\"\n [class.h-[18px]]=\"configTemplateText.imgTypeIcon\"\n (error)=\"handlerImageError($event, item())\"\n (click)=\"handlerSelectItem($event,item())\" />\n }\n @if ((item().buttonLeftConfig | LibsUiPipesConvertObjectToSignalPipe)?.(); as buttonLeft) {\n @if (item().hrefButton) {\n <a [class.w-full]=\"!buttonLeft.ignoreWidth100\"\n [href]=\"item().hrefButton\">\n <ng-container *ngTemplateOutlet=\"buttonLeftTemplate\" />\n </a>\n }\n @if (!item().hrefButton) {\n <div [class.w-full]=\"!buttonLeft.ignoreWidth100\">\n <ng-container *ngTemplateOutlet=\"buttonLeftTemplate\" />\n </div>\n }\n <ng-template #buttonLeftTemplate>\n <libs_ui-components-buttons-button class=\"w-full\"\n [type]=\"buttonLeft.type ?? 'button-link-primary'\"\n [label]=\"buttonLeft.label ?? ' '\"\n [zIndex]=\"buttonLeft.zIndex\"\n [disable]=\"buttonLeft.disable ?? false\"\n [classIconLeft]=\"(buttonLeft.classIconLeft ? (buttonLeft.classIconLeft+' flex mr-[8px] text-[12px]') : '')\"\n [classInclude]=\"(buttonLeft.classInclude??'')+' w-full'\"\n [classLabel]=\"buttonLeft.classLabel ?? 'libs-ui-font-h4r'\"\n [ignoreStopPropagationEvent]=\"buttonLeft.ignoreStopPropagationEvent\"\n [styleIconLeft]=\"buttonLeft.styleIconLeft\"\n [styleButton]=\"buttonLeft.styleButton\"\n (outClick)=\"handlerSelectItem($event,item())\" />\n </ng-template>\n }\n @if ((item().switchConfig|LibsUiPipesConvertObjectToSignalPipe)?.(); as switchConfig) {\n <libs_ui-components-switch [active]=\"switchConfig.active\"\n (outSwitch)=\"handlerSelectItem('click',item())\" />\n }\n @if (item().classIconLeft) {\n <i [class]=\"item().classIconLeft + ' mr-[8px] text-[14px]'\"></i>\n }\n @if (!item().ignoreShowFieldLabel && !configTemplateText.rows) {\n @if ((item().popoverLabel|LibsUiPipesConvertObjectToSignalPipe)?.() ?? {type:'text'}; as popoverLabel) {\n <libs_ui-components-popover [type]=\"popoverLabel.type || 'text'\"\n [elementRefCustom]=\"popoverLabel.type === 'text'? undefined:itemRef\"\n [ignoreShowPopover]=\"popoverLabel.ignoreShowPopover\"\n [config]=\"popoverLabel.config ?? configTemplateText.configLabelPopover?.() ?? {}\"\n [innerHtml]=\"item().fieldLabel\"\n [classInclude]=\"item().classInclude\"\n (outEvent)=\"handlerSelectItem($event,item())\" />\n }\n }\n @if ((item().fieldPopover|LibsUiPipesConvertObjectToSignalPipe)?.(); as popover) {\n <libs_ui-components-popover class=\"{{ popover.classInclude }}\"\n [config]=\"popover.config\">\n @if (popover.dataView) {\n <div [innerHtml]=\"popover.dataView | translate\"></div>\n } @else {\n <i class=\"libs-ui-icon-tooltip-outline\"></i>\n }\n </libs_ui-components-popover>\n }\n @if (configTemplateText?.rows) {\n <libs_ui-components-list-templates_rows\n class=\"w-full {{ configTemplateText.classRowsWrapper || configTemplateText.classRows || '' }}\"\n [item]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keySelected]=\"keySelected()\"\n [configTemplate]=\"configTemplateText\"\n [zIndex]=\"zIndex()\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outEvent)=\"handlerSelectItem($event.event,$event.item,$event.action)\" />\n }\n @if (configTemplateText.getComponentOutlet) {\n <ng-container\n *ngComponentOutlet=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldKey():undefined:true | LibsUiPipesCallFunctionInTemplatePipe:configTemplateText.getComponentOutlet:item()) | async; inputs:(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateText.getDataComponentOutlet:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\" />\n }\n\n @if (keySelected() === item()[fieldKey()] || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:multiKeySelected():multiKeySelected()?.length) && !configTemplateText.ignoreIconSelected && !configTemplateText.actionSort) {\n <i [class]=\"'libs-ui-icon-check '+(configTemplateText.classIncludeIconSelected || 'right-[12px]')\">\n </i>\n }\n @if (keySelected() === item()[fieldKey()] && configTemplateText.actionSort) {\n <div class=\"libs-ui-list-template-text-sort\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || disable() || false\"\n [mode]=\"configTemplateText?.itemSort?.()?.mode || ''\"\n [fieldSort]=\"item()[fieldKey()]\"\n (outChange)=\"handlerSort($event)\" />\n </div>\n }\n </div>\n </div>\n }\n </ng-template>\n}\n", styles: [".libs-ui-list-template-text-item{padding:6px 16px 6px 1px;font-size:12px;line-height:18px;position:relative;cursor:pointer}.libs-ui-list-template-text-item>.libs-ui-icon-check,.libs-ui-list-template-text-item .libs-ui-list-template-text-sort{position:absolute;right:16px}.libs-ui-list-template-text-item>.libs-ui-icon-check:before,.libs-ui-list-template-text-item .libs-ui-list-template-text-sort:before{font-size:16px;color:var(--libs-ui-color-default, #226FF5)}.libs-ui-list-template-text-item-bullet{width:10px;height:10px;border-radius:50%;margin-right:8px;cursor:pointer}.libs-ui-list-template-text-item-avatar{width:24px;height:24px;border-radius:50%;margin-right:8px;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: VirtualScrollerModule }, { kind: "component", type: i1.VirtualScrollerComponent, selector: "virtual-scroller,[virtualScroller]", inputs: ["executeRefreshOutsideAngularZone", "enableUnequalChildrenSizes", "RTL", "useMarginInsteadOfTranslate", "modifyOverflowStyleOfParentScroll", "stripedTable", "scrollbarWidth", "scrollbarHeight", "childWidth", "childHeight", "ssrChildWidth", "ssrChildHeight", "ssrViewportWidth", "ssrViewportHeight", "bufferAmount", "scrollAnimationTime", "resizeBypassRefreshThreshold", "scrollThrottlingTime", "scrollDebounceTime", "checkResizeInterval", "items", "compareItems", "horizontal", "parentScroll"], outputs: ["vsUpdate", "vsChange", "vsStart", "vsEnd"], exportAs: ["virtualScroller"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["getLastTextAfterSpace", "typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "idGenColor", "textAvatar", "classImageInclude"], outputs: ["outAvatarError"] }, { 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", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiCheckSelectedByKeyPipe, name: "LibsUiCheckSelectedByKeyPipe" }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { kind: "component", type: LibsUiComponentsButtonsSortArrowComponent, selector: "libs_ui-components-buttons-sort-arrow", inputs: ["size", "mode", "fieldSort", "disable", "ignorePopoverContent", "popoverContentAsc", "popoverContentDesc", "defaultMode", "zIndex"], outputs: ["modeChange", "outChange"] }, { kind: "directive", type: LibsUiComponentsListHighlightKeySearchDirective, selector: "[LibsUiComponentsListHighlightKeySearchDirective]", inputs: ["isHighlight", "keySearch", "classHighlight"] }, { kind: "component", type: LibsUiComponentsListRowsComponent, selector: "libs_ui-components-list-templates_rows", inputs: ["configTemplate", "item", "keySelected", "fieldKey", "zIndex"], outputs: ["outChangStageFlagMousePopover", "outEvent"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesConvertObjectToSignalPipe, name: "LibsUiPipesConvertObjectToSignalPipe" }, { kind: "pipe", type: LibsUiPipesGetValueOfObjectPipe, name: "LibsUiPipesGetValueOfObjectPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
217
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsListTextComponent, isStandalone: true, selector: "libs_ui-components-list-templates_text", viewQueries: [{ propertyName: "virtualScrollerComponent", first: true, predicate: VirtualScrollerComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (configTemplateText(); as configTemplateText) {\n <div class=\"relative h-full w-full\">\n @if (items() && items().length) {\n <div #elementScroll\n [style.height]=\"isShowHeightCalculate() ? heightViewPort()+'px':'100%'\"\n class=\"w-full\"\n [class.h-full]=\"!isShowHeightCalculate()\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (!configTemplateText.notUseVirtualScroll) {\n <virtual-scroller #scroll\n [parentScroll]=\"elementScroll\"\n [items]=\"items()\"\n class=\"h-full\">\n <ng-container *ngTemplateOutlet='listRef;context:{itemsView:scroll.viewPortItems}' />\n </virtual-scroller>\n }\n @if (configTemplateText.notUseVirtualScroll) {\n <ng-container *ngTemplateOutlet='listRef;context:{itemsView:items()}' />\n }\n </div>\n }\n @if ((!items() || !items().length) && (!config()?.ignoreShowDataWhenNotSearch || keySearch())) {\n <div [class]=\"'libs-ui-font-h5r text-[#9ca2ad] '+ (config()?.textNoDataClassInclude ?? 'py-[6px] px-[16px]')\">\n @if (!keySearch() && !loading()) {\n {{ (config()?.textNoData ?? 'i18n_have_no_selection') | translate }}\n }\n @if (templateRefSearchNoData() && keySearch() && !loading()) {\n <ng-container *ngTemplateOutlet=\"templateRefSearchNoData() || null;context:{keySearch:keySearch()}\" />\n }\n @if (!templateRefSearchNoData() && keySearch() && !loading()) {\n {{ (config()?.textSearchNoData ?? 'i18n_no_result') | translate }}\n }\n @if (loading()) {\n \n }\n </div>\n }\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"loadingIconSize() || 'medium'\" />\n }\n </div>\n <ng-template #listRef\n let-itemsView='itemsView'>\n @for (item of itemsView; track item()[fieldKey()]) {\n <div #itemRef\n [class]=\"item().classItemWrapper || ''\">\n <div LibsUiComponentsListHighlightKeySearchDirective\n [isHighlight]=\"config()?.highlightTextSearchInResult\"\n [keySearch]=\"keySearch()\"\n [class]=\"'libs-ui-list-template-text-item libs-ui-font-h5r flex '+(item().classItem || '')\"\n [class.items-center]=\"!item().itemAlignStart\"\n [class.items-start]=\"item().itemAlignStart\"\n [class.libs-ui-bg-list-hover-danger]=\"!clickExactly() && item().hoverDanger\"\n [class.libs-ui-bg-list-hover]=\"!clickExactly() && !item().hoverDanger\"\n [class.libs-ui-bg-list-active]=\"!clickExactly() && keySelected() === item()[fieldKey()]\"\n [class.!pl-[16px]]=\"paddingLeftItem()\"\n [class.bg-[#ffffff]]=\"clickExactly()\"\n [class.libs-ui-bg-list-hover-ffffff]=\"item().disable\"\n [class.cursor-default]=\"item().disable\"\n [class.!py-[2px]]=\"clickExactly()\"\n [class.!pr-[48px]]=\"keySelected() === item()[fieldKey()] && (!configTemplateText?.ignoreIconSelected || configTemplateText?.actionSort)&& !configTemplateText?.stylePaddingRightItemOther\"\n [ngClass]=\"{'pointer-events-none libs-ui-disable':loading() || disable() || ((item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length) && !ignoreClassDisableDefaultWhenUseKeysDisableItem())}\"\n (click)=\"handlerClickRelative($event,item())\">\n @if ((item().bullet|LibsUiPipesConvertObjectToSignalPipe)?.(); as bullet) {\n <span class=\"libs-ui-list-template-text-item-bullet flex flex-shrink-0\"\n [style.backgroundColor]=\"bullet.backgroundColor\"\n (click)=\"handlerSelectItem($event,item())\">\n </span>\n }\n @if ((item().avatarConfig|LibsUiPipesConvertObjectToSignalPipe)?.(); as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape ?? 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [classImageInclude]=\"avatarConfig.classImageInclude\"\n [size]=\"avatarConfig.size ?? 32\"\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\"\n [classImageInclude]=\"avatarConfig.classImageInclude\" />\n }\n @if (configTemplateText.getImage || configTemplateText.fieldGetImage) {\n <img\n [src]=\"configTemplateText.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateText.getImageError ? configTemplateText.getImageError : configTemplateText.getImage):item()) | async) : item()[configTemplateText.fieldGetImage || '']\"\n [class]=\"'libs-ui-list-template-text-item-avatar ' + (configTemplateText.classIncludeImage ?? '')\"\n [class.w-[18px]]=\"configTemplateText.imgTypeIcon\"\n [class.h-[18px]]=\"configTemplateText.imgTypeIcon\"\n (error)=\"handlerImageError($event, item())\"\n (click)=\"handlerSelectItem($event,item())\" />\n }\n @if ((item().buttonLeftConfig | LibsUiPipesConvertObjectToSignalPipe)?.(); as buttonLeft) {\n @if (item().hrefButton) {\n <a [class.w-full]=\"!buttonLeft.ignoreWidth100\"\n [href]=\"item().hrefButton\">\n <ng-container *ngTemplateOutlet=\"buttonLeftTemplate\" />\n </a>\n }\n @if (!item().hrefButton) {\n <div [class.w-full]=\"!buttonLeft.ignoreWidth100\">\n <ng-container *ngTemplateOutlet=\"buttonLeftTemplate\" />\n </div>\n }\n <ng-template #buttonLeftTemplate>\n <libs_ui-components-buttons-button class=\"w-full\"\n [type]=\"buttonLeft.type ?? 'button-link-primary'\"\n [label]=\"buttonLeft.label ?? ' '\"\n [zIndex]=\"buttonLeft.zIndex\"\n [disable]=\"buttonLeft.disable ?? false\"\n [classIconLeft]=\"(buttonLeft.classIconLeft ? (buttonLeft.classIconLeft+' flex mr-[8px] text-[12px]') : '')\"\n [classInclude]=\"(buttonLeft.classInclude??'')+' w-full'\"\n [classLabel]=\"buttonLeft.classLabel ?? 'libs-ui-font-h4r'\"\n [ignoreStopPropagationEvent]=\"buttonLeft.ignoreStopPropagationEvent\"\n [styleIconLeft]=\"buttonLeft.styleIconLeft\"\n [styleButton]=\"buttonLeft.styleButton\"\n (outClick)=\"handlerSelectItem($event,item())\" />\n </ng-template>\n }\n @if ((item().switchConfig|LibsUiPipesConvertObjectToSignalPipe)?.(); as switchConfig) {\n <libs_ui-components-switch [active]=\"switchConfig.active\"\n (outSwitch)=\"handlerSelectItem('click',item())\" />\n }\n @if (item().classIconLeft) {\n <i [class]=\"item().classIconLeft + ' mr-[8px] text-[14px]'\"></i>\n }\n @if (!item().ignoreShowFieldLabel && !configTemplateText.rows) {\n @if (((item().popoverLabel|LibsUiPipesConvertObjectToSignalPipe)?.() | LibsUiPipesConvertSignalToObjectPipe) ?? {type:'text'}; as popoverLabel) {\n <libs_ui-components-popover [type]=\"popoverLabel.type || 'text'\"\n [elementRefCustom]=\"popoverLabel.type === 'text'? undefined:itemRef\"\n [ignoreShowPopover]=\"popoverLabel.ignoreShowPopover\"\n [config]=\"popoverLabel.config ?? configTemplateText.configLabelPopover?.() ?? {}\"\n [innerHtml]=\"item().fieldLabel\"\n [classInclude]=\"item().classInclude\"\n (outEvent)=\"handlerSelectItem($event,item())\" />\n }\n }\n @if ((item().fieldPopover|LibsUiPipesConvertObjectToSignalPipe)?.(); as popover) {\n <libs_ui-components-popover class=\"{{ popover.classInclude }}\"\n [config]=\"popover.config\">\n @if (popover.dataView) {\n <div [innerHtml]=\"popover.dataView | translate\"></div>\n } @else {\n <i class=\"libs-ui-icon-tooltip-outline\"></i>\n }\n </libs_ui-components-popover>\n }\n @if (configTemplateText?.rows) {\n <libs_ui-components-list-templates_rows\n class=\"w-full {{ configTemplateText.classRowsWrapper || configTemplateText.classRows || '' }}\"\n [item]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keySelected]=\"keySelected()\"\n [configTemplate]=\"configTemplateText\"\n [zIndex]=\"zIndex()\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outEvent)=\"handlerSelectItem($event.event,$event.item,$event.action)\" />\n }\n @if (configTemplateText.getComponentOutlet) {\n <ng-container\n *ngComponentOutlet=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldKey():undefined:true | LibsUiPipesCallFunctionInTemplatePipe:configTemplateText.getComponentOutlet:item()) | async; inputs:(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateText.getDataComponentOutlet:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\" />\n }\n\n @if (keySelected() === item()[fieldKey()] || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:multiKeySelected():multiKeySelected()?.length) && !configTemplateText.ignoreIconSelected && !configTemplateText.actionSort) {\n <i [class]=\"'libs-ui-icon-check '+(configTemplateText.classIncludeIconSelected || 'right-[12px]')\">\n </i>\n }\n @if (keySelected() === item()[fieldKey()] && configTemplateText.actionSort) {\n <div class=\"libs-ui-list-template-text-sort\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || disable() || false\"\n [mode]=\"configTemplateText?.itemSort?.()?.mode || ''\"\n [fieldSort]=\"item()[fieldKey()]\"\n (outChange)=\"handlerSort($event)\" />\n </div>\n }\n </div>\n </div>\n }\n </ng-template>\n}\n", styles: [".libs-ui-list-template-text-item{padding:6px 16px 6px 1px;font-size:12px;line-height:18px;position:relative;cursor:pointer}.libs-ui-list-template-text-item>.libs-ui-icon-check,.libs-ui-list-template-text-item .libs-ui-list-template-text-sort{position:absolute;right:16px}.libs-ui-list-template-text-item>.libs-ui-icon-check:before,.libs-ui-list-template-text-item .libs-ui-list-template-text-sort:before{font-size:16px;color:var(--libs-ui-color-default, #226FF5)}.libs-ui-list-template-text-item-bullet{width:10px;height:10px;border-radius:50%;margin-right:8px;cursor:pointer}.libs-ui-list-template-text-item-avatar{width:24px;height:24px;border-radius:50%;margin-right:8px;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: VirtualScrollerModule }, { kind: "component", type: i1.VirtualScrollerComponent, selector: "virtual-scroller,[virtualScroller]", inputs: ["executeRefreshOutsideAngularZone", "enableUnequalChildrenSizes", "RTL", "useMarginInsteadOfTranslate", "modifyOverflowStyleOfParentScroll", "stripedTable", "scrollbarWidth", "scrollbarHeight", "childWidth", "childHeight", "ssrChildWidth", "ssrChildHeight", "ssrViewportWidth", "ssrViewportHeight", "bufferAmount", "scrollAnimationTime", "resizeBypassRefreshThreshold", "scrollThrottlingTime", "scrollDebounceTime", "checkResizeInterval", "items", "compareItems", "horizontal", "parentScroll"], outputs: ["vsUpdate", "vsChange", "vsStart", "vsEnd"], exportAs: ["virtualScroller"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["getLastTextAfterSpace", "typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "idGenColor", "textAvatar", "classImageInclude"], outputs: ["outAvatarError"] }, { 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", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "notShowScrollBarX", "notShowScrollBarY", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiCheckSelectedByKeyPipe, name: "LibsUiCheckSelectedByKeyPipe" }, { kind: "component", type: LibsUiComponentsSwitchComponent, selector: "libs_ui-components-switch", inputs: ["size", "disable", "active"], outputs: ["activeChange", "outSwitch"] }, { kind: "component", type: LibsUiComponentsButtonsSortArrowComponent, selector: "libs_ui-components-buttons-sort-arrow", inputs: ["size", "mode", "fieldSort", "disable", "ignorePopoverContent", "popoverContentAsc", "popoverContentDesc", "defaultMode", "zIndex"], outputs: ["modeChange", "outChange"] }, { kind: "directive", type: LibsUiComponentsListHighlightKeySearchDirective, selector: "[LibsUiComponentsListHighlightKeySearchDirective]", inputs: ["isHighlight", "keySearch", "classHighlight"] }, { kind: "component", type: LibsUiComponentsListRowsComponent, selector: "libs_ui-components-list-templates_rows", inputs: ["configTemplate", "item", "keySelected", "fieldKey", "zIndex"], outputs: ["outChangStageFlagMousePopover", "outEvent"] }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesConvertObjectToSignalPipe, name: "LibsUiPipesConvertObjectToSignalPipe" }, { kind: "pipe", type: LibsUiPipesGetValueOfObjectPipe, name: "LibsUiPipesGetValueOfObjectPipe" }, { kind: "pipe", type: LibsUiPipesConvertSignalToObjectPipe, name: "LibsUiPipesConvertSignalToObjectPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
216
218
|
}
|
|
217
219
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListTextComponent, decorators: [{
|
|
218
220
|
type: Component,
|
|
@@ -231,7 +233,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
231
233
|
LibsUiComponentsListRowsComponent,
|
|
232
234
|
LibsUiPipesCallFunctionInTemplatePipe,
|
|
233
235
|
LibsUiPipesConvertObjectToSignalPipe,
|
|
234
|
-
LibsUiPipesGetValueOfObjectPipe
|
|
235
|
-
], template: "@if (configTemplateText(); as configTemplateText) {\n <div class=\"relative h-full w-full\">\n @if (items() && items().length) {\n <div #elementScroll\n [style.height]=\" heightViewPort() && (!config()?.ignoreShowDataWhenNotSearch || (config()?.ignoreShowDataWhenNotSearch && config()?.ignoreFixHeightShowDataWhenNotSearch)) ? heightViewPort()+'px':'100%'\"\n class=\"w-full\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (!configTemplateText.notUseVirtualScroll) {\n <virtual-scroller #scroll\n [parentScroll]=\"elementScroll\"\n [items]=\"items()\"\n class=\"h-full\">\n <ng-container *ngTemplateOutlet='listRef;context:{itemsView:scroll.viewPortItems}' />\n </virtual-scroller>\n }\n @if (configTemplateText.notUseVirtualScroll) {\n <ng-container *ngTemplateOutlet='listRef;context:{itemsView:items()}' />\n }\n </div>\n }\n @if ((!items() || !items().length) && (!config()?.ignoreShowDataWhenNotSearch || keySearch())) {\n <div [class]=\"'libs-ui-font-h5r text-[#9ca2ad] '+ (config()?.textNoDataClassInclude ?? 'py-[6px] px-[16px]')\">\n @if (!keySearch() && !loading()) {\n {{ (config()?.textNoData ?? 'i18n_have_no_selection') | translate }}\n }\n @if (templateRefSearchNoData() && keySearch() && !loading()) {\n <ng-container *ngTemplateOutlet=\"templateRefSearchNoData() || null;context:{keySearch:keySearch()}\" />\n }\n @if (!templateRefSearchNoData() && keySearch() && !loading()) {\n {{ (config()?.textSearchNoData ?? 'i18n_no_result') | translate }}\n }\n @if (loading()) {\n \n }\n </div>\n }\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"loadingIconSize() || 'medium'\" />\n }\n </div>\n <ng-template #listRef\n let-itemsView='itemsView'>\n @for (item of itemsView; track item()[fieldKey()]) {\n <div #itemRef\n [class]=\"item().classItemWrapper || ''\">\n <div LibsUiComponentsListHighlightKeySearchDirective\n [isHighlight]=\"config()?.highlightTextSearchInResult\"\n [keySearch]=\"keySearch()\"\n [class]=\"'libs-ui-list-template-text-item libs-ui-font-h5r flex '+(item().classItem || '')\"\n [class.items-center]=\"!item().itemAlignStart\"\n [class.items-start]=\"item().itemAlignStart\"\n [class.libs-ui-bg-list-hover-danger]=\"!clickExactly() && item().hoverDanger\"\n [class.libs-ui-bg-list-hover]=\"!clickExactly() && !item().hoverDanger\"\n [class.libs-ui-bg-list-active]=\"!clickExactly() && keySelected() === item()[fieldKey()]\"\n [class.!pl-[16px]]=\"paddingLeftItem()\"\n [class.bg-[#ffffff]]=\"clickExactly()\"\n [class.libs-ui-bg-list-hover-ffffff]=\"item().disable\"\n [class.cursor-default]=\"item().disable\"\n [class.!py-[2px]]=\"clickExactly()\"\n [class.!pr-[48px]]=\"keySelected() === item()[fieldKey()] && (!configTemplateText?.ignoreIconSelected || configTemplateText?.actionSort)&& !configTemplateText?.stylePaddingRightItemOther\"\n [ngClass]=\"{'pointer-events-none libs-ui-disable':loading() || disable() || ((item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length) && !ignoreClassDisableDefaultWhenUseKeysDisableItem())}\"\n (click)=\"handlerClickRelative($event,item())\">\n @if ((item().bullet|LibsUiPipesConvertObjectToSignalPipe)?.(); as bullet) {\n <span class=\"libs-ui-list-template-text-item-bullet flex flex-shrink-0\"\n [style.backgroundColor]=\"bullet.backgroundColor\"\n (click)=\"handlerSelectItem($event,item())\">\n </span>\n }\n @if ((item().avatarConfig|LibsUiPipesConvertObjectToSignalPipe)?.(); as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape ?? 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [classImageInclude]=\"avatarConfig.classImageInclude\"\n [size]=\"avatarConfig.size ?? 32\"\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\"\n [classImageInclude]=\"avatarConfig.classImageInclude\" />\n }\n @if (configTemplateText.getImage || configTemplateText.fieldGetImage) {\n <img\n [src]=\"configTemplateText.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateText.getImageError ? configTemplateText.getImageError : configTemplateText.getImage):item()) | async) : item()[configTemplateText.fieldGetImage || '']\"\n [class]=\"'libs-ui-list-template-text-item-avatar ' + (configTemplateText.classIncludeImage ?? '')\"\n [class.w-[18px]]=\"configTemplateText.imgTypeIcon\"\n [class.h-[18px]]=\"configTemplateText.imgTypeIcon\"\n (error)=\"handlerImageError($event, item())\"\n (click)=\"handlerSelectItem($event,item())\" />\n }\n @if ((item().buttonLeftConfig | LibsUiPipesConvertObjectToSignalPipe)?.(); as buttonLeft) {\n @if (item().hrefButton) {\n <a [class.w-full]=\"!buttonLeft.ignoreWidth100\"\n [href]=\"item().hrefButton\">\n <ng-container *ngTemplateOutlet=\"buttonLeftTemplate\" />\n </a>\n }\n @if (!item().hrefButton) {\n <div [class.w-full]=\"!buttonLeft.ignoreWidth100\">\n <ng-container *ngTemplateOutlet=\"buttonLeftTemplate\" />\n </div>\n }\n <ng-template #buttonLeftTemplate>\n <libs_ui-components-buttons-button class=\"w-full\"\n [type]=\"buttonLeft.type ?? 'button-link-primary'\"\n [label]=\"buttonLeft.label ?? ' '\"\n [zIndex]=\"buttonLeft.zIndex\"\n [disable]=\"buttonLeft.disable ?? false\"\n [classIconLeft]=\"(buttonLeft.classIconLeft ? (buttonLeft.classIconLeft+' flex mr-[8px] text-[12px]') : '')\"\n [classInclude]=\"(buttonLeft.classInclude??'')+' w-full'\"\n [classLabel]=\"buttonLeft.classLabel ?? 'libs-ui-font-h4r'\"\n [ignoreStopPropagationEvent]=\"buttonLeft.ignoreStopPropagationEvent\"\n [styleIconLeft]=\"buttonLeft.styleIconLeft\"\n [styleButton]=\"buttonLeft.styleButton\"\n (outClick)=\"handlerSelectItem($event,item())\" />\n </ng-template>\n }\n @if ((item().switchConfig|LibsUiPipesConvertObjectToSignalPipe)?.(); as switchConfig) {\n <libs_ui-components-switch [active]=\"switchConfig.active\"\n (outSwitch)=\"handlerSelectItem('click',item())\" />\n }\n @if (item().classIconLeft) {\n <i [class]=\"item().classIconLeft + ' mr-[8px] text-[14px]'\"></i>\n }\n @if (!item().ignoreShowFieldLabel && !configTemplateText.rows) {\n @if ((item().popoverLabel|LibsUiPipesConvertObjectToSignalPipe)?.() ?? {type:'text'}; as popoverLabel) {\n <libs_ui-components-popover [type]=\"popoverLabel.type || 'text'\"\n [elementRefCustom]=\"popoverLabel.type === 'text'? undefined:itemRef\"\n [ignoreShowPopover]=\"popoverLabel.ignoreShowPopover\"\n [config]=\"popoverLabel.config ?? configTemplateText.configLabelPopover?.() ?? {}\"\n [innerHtml]=\"item().fieldLabel\"\n [classInclude]=\"item().classInclude\"\n (outEvent)=\"handlerSelectItem($event,item())\" />\n }\n }\n @if ((item().fieldPopover|LibsUiPipesConvertObjectToSignalPipe)?.(); as popover) {\n <libs_ui-components-popover class=\"{{ popover.classInclude }}\"\n [config]=\"popover.config\">\n @if (popover.dataView) {\n <div [innerHtml]=\"popover.dataView | translate\"></div>\n } @else {\n <i class=\"libs-ui-icon-tooltip-outline\"></i>\n }\n </libs_ui-components-popover>\n }\n @if (configTemplateText?.rows) {\n <libs_ui-components-list-templates_rows\n class=\"w-full {{ configTemplateText.classRowsWrapper || configTemplateText.classRows || '' }}\"\n [item]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keySelected]=\"keySelected()\"\n [configTemplate]=\"configTemplateText\"\n [zIndex]=\"zIndex()\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outEvent)=\"handlerSelectItem($event.event,$event.item,$event.action)\" />\n }\n @if (configTemplateText.getComponentOutlet) {\n <ng-container\n *ngComponentOutlet=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldKey():undefined:true | LibsUiPipesCallFunctionInTemplatePipe:configTemplateText.getComponentOutlet:item()) | async; inputs:(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateText.getDataComponentOutlet:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\" />\n }\n\n @if (keySelected() === item()[fieldKey()] || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:multiKeySelected():multiKeySelected()?.length) && !configTemplateText.ignoreIconSelected && !configTemplateText.actionSort) {\n <i [class]=\"'libs-ui-icon-check '+(configTemplateText.classIncludeIconSelected || 'right-[12px]')\">\n </i>\n }\n @if (keySelected() === item()[fieldKey()] && configTemplateText.actionSort) {\n <div class=\"libs-ui-list-template-text-sort\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || disable() || false\"\n [mode]=\"configTemplateText?.itemSort?.()?.mode || ''\"\n [fieldSort]=\"item()[fieldKey()]\"\n (outChange)=\"handlerSort($event)\" />\n </div>\n }\n </div>\n </div>\n }\n </ng-template>\n}\n", styles: [".libs-ui-list-template-text-item{padding:6px 16px 6px 1px;font-size:12px;line-height:18px;position:relative;cursor:pointer}.libs-ui-list-template-text-item>.libs-ui-icon-check,.libs-ui-list-template-text-item .libs-ui-list-template-text-sort{position:absolute;right:16px}.libs-ui-list-template-text-item>.libs-ui-icon-check:before,.libs-ui-list-template-text-item .libs-ui-list-template-text-sort:before{font-size:16px;color:var(--libs-ui-color-default, #226FF5)}.libs-ui-list-template-text-item-bullet{width:10px;height:10px;border-radius:50%;margin-right:8px;cursor:pointer}.libs-ui-list-template-text-item-avatar{width:24px;height:24px;border-radius:50%;margin-right:8px;cursor:pointer}\n"] }]
|
|
236
|
+
LibsUiPipesGetValueOfObjectPipe,
|
|
237
|
+
LibsUiPipesConvertSignalToObjectPipe
|
|
238
|
+
], template: "@if (configTemplateText(); as configTemplateText) {\n <div class=\"relative h-full w-full\">\n @if (items() && items().length) {\n <div #elementScroll\n [style.height]=\"isShowHeightCalculate() ? heightViewPort()+'px':'100%'\"\n class=\"w-full\"\n [class.h-full]=\"!isShowHeightCalculate()\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (!configTemplateText.notUseVirtualScroll) {\n <virtual-scroller #scroll\n [parentScroll]=\"elementScroll\"\n [items]=\"items()\"\n class=\"h-full\">\n <ng-container *ngTemplateOutlet='listRef;context:{itemsView:scroll.viewPortItems}' />\n </virtual-scroller>\n }\n @if (configTemplateText.notUseVirtualScroll) {\n <ng-container *ngTemplateOutlet='listRef;context:{itemsView:items()}' />\n }\n </div>\n }\n @if ((!items() || !items().length) && (!config()?.ignoreShowDataWhenNotSearch || keySearch())) {\n <div [class]=\"'libs-ui-font-h5r text-[#9ca2ad] '+ (config()?.textNoDataClassInclude ?? 'py-[6px] px-[16px]')\">\n @if (!keySearch() && !loading()) {\n {{ (config()?.textNoData ?? 'i18n_have_no_selection') | translate }}\n }\n @if (templateRefSearchNoData() && keySearch() && !loading()) {\n <ng-container *ngTemplateOutlet=\"templateRefSearchNoData() || null;context:{keySearch:keySearch()}\" />\n }\n @if (!templateRefSearchNoData() && keySearch() && !loading()) {\n {{ (config()?.textSearchNoData ?? 'i18n_no_result') | translate }}\n }\n @if (loading()) {\n \n }\n </div>\n }\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"loadingIconSize() || 'medium'\" />\n }\n </div>\n <ng-template #listRef\n let-itemsView='itemsView'>\n @for (item of itemsView; track item()[fieldKey()]) {\n <div #itemRef\n [class]=\"item().classItemWrapper || ''\">\n <div LibsUiComponentsListHighlightKeySearchDirective\n [isHighlight]=\"config()?.highlightTextSearchInResult\"\n [keySearch]=\"keySearch()\"\n [class]=\"'libs-ui-list-template-text-item libs-ui-font-h5r flex '+(item().classItem || '')\"\n [class.items-center]=\"!item().itemAlignStart\"\n [class.items-start]=\"item().itemAlignStart\"\n [class.libs-ui-bg-list-hover-danger]=\"!clickExactly() && item().hoverDanger\"\n [class.libs-ui-bg-list-hover]=\"!clickExactly() && !item().hoverDanger\"\n [class.libs-ui-bg-list-active]=\"!clickExactly() && keySelected() === item()[fieldKey()]\"\n [class.!pl-[16px]]=\"paddingLeftItem()\"\n [class.bg-[#ffffff]]=\"clickExactly()\"\n [class.libs-ui-bg-list-hover-ffffff]=\"item().disable\"\n [class.cursor-default]=\"item().disable\"\n [class.!py-[2px]]=\"clickExactly()\"\n [class.!pr-[48px]]=\"keySelected() === item()[fieldKey()] && (!configTemplateText?.ignoreIconSelected || configTemplateText?.actionSort)&& !configTemplateText?.stylePaddingRightItemOther\"\n [ngClass]=\"{'pointer-events-none libs-ui-disable':loading() || disable() || ((item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:keysDisableItem():keysDisableItem()?.length) && !ignoreClassDisableDefaultWhenUseKeysDisableItem())}\"\n (click)=\"handlerClickRelative($event,item())\">\n @if ((item().bullet|LibsUiPipesConvertObjectToSignalPipe)?.(); as bullet) {\n <span class=\"libs-ui-list-template-text-item-bullet flex flex-shrink-0\"\n [style.backgroundColor]=\"bullet.backgroundColor\"\n (click)=\"handlerSelectItem($event,item())\">\n </span>\n }\n @if ((item().avatarConfig|LibsUiPipesConvertObjectToSignalPipe)?.(); as avatarConfig) {\n <libs_ui-components-avatar [typeShape]=\"avatarConfig.typeShape ?? 'circle'\"\n [classInclude]=\"avatarConfig.classInclude\"\n [classImageInclude]=\"avatarConfig.classImageInclude\"\n [size]=\"avatarConfig.size ?? 32\"\n [linkAvatar]=\"avatarConfig.linkAvatar\"\n [linkAvatarError]=\"avatarConfig.linkAvatarError\"\n [idGenColor]=\"avatarConfig.idGenColor\"\n [textAvatar]=\"avatarConfig.textAvatar\"\n [classImageInclude]=\"avatarConfig.classImageInclude\" />\n }\n @if (configTemplateText.getImage || configTemplateText.fieldGetImage) {\n <img\n [src]=\"configTemplateText.getImage ? (('avatar' | LibsUiPipesCallFunctionInTemplatePipe:(item().specific_loadImgError && configTemplateText.getImageError ? configTemplateText.getImageError : configTemplateText.getImage):item()) | async) : item()[configTemplateText.fieldGetImage || '']\"\n [class]=\"'libs-ui-list-template-text-item-avatar ' + (configTemplateText.classIncludeImage ?? '')\"\n [class.w-[18px]]=\"configTemplateText.imgTypeIcon\"\n [class.h-[18px]]=\"configTemplateText.imgTypeIcon\"\n (error)=\"handlerImageError($event, item())\"\n (click)=\"handlerSelectItem($event,item())\" />\n }\n @if ((item().buttonLeftConfig | LibsUiPipesConvertObjectToSignalPipe)?.(); as buttonLeft) {\n @if (item().hrefButton) {\n <a [class.w-full]=\"!buttonLeft.ignoreWidth100\"\n [href]=\"item().hrefButton\">\n <ng-container *ngTemplateOutlet=\"buttonLeftTemplate\" />\n </a>\n }\n @if (!item().hrefButton) {\n <div [class.w-full]=\"!buttonLeft.ignoreWidth100\">\n <ng-container *ngTemplateOutlet=\"buttonLeftTemplate\" />\n </div>\n }\n <ng-template #buttonLeftTemplate>\n <libs_ui-components-buttons-button class=\"w-full\"\n [type]=\"buttonLeft.type ?? 'button-link-primary'\"\n [label]=\"buttonLeft.label ?? ' '\"\n [zIndex]=\"buttonLeft.zIndex\"\n [disable]=\"buttonLeft.disable ?? false\"\n [classIconLeft]=\"(buttonLeft.classIconLeft ? (buttonLeft.classIconLeft+' flex mr-[8px] text-[12px]') : '')\"\n [classInclude]=\"(buttonLeft.classInclude??'')+' w-full'\"\n [classLabel]=\"buttonLeft.classLabel ?? 'libs-ui-font-h4r'\"\n [ignoreStopPropagationEvent]=\"buttonLeft.ignoreStopPropagationEvent\"\n [styleIconLeft]=\"buttonLeft.styleIconLeft\"\n [styleButton]=\"buttonLeft.styleButton\"\n (outClick)=\"handlerSelectItem($event,item())\" />\n </ng-template>\n }\n @if ((item().switchConfig|LibsUiPipesConvertObjectToSignalPipe)?.(); as switchConfig) {\n <libs_ui-components-switch [active]=\"switchConfig.active\"\n (outSwitch)=\"handlerSelectItem('click',item())\" />\n }\n @if (item().classIconLeft) {\n <i [class]=\"item().classIconLeft + ' mr-[8px] text-[14px]'\"></i>\n }\n @if (!item().ignoreShowFieldLabel && !configTemplateText.rows) {\n @if (((item().popoverLabel|LibsUiPipesConvertObjectToSignalPipe)?.() | LibsUiPipesConvertSignalToObjectPipe) ?? {type:'text'}; as popoverLabel) {\n <libs_ui-components-popover [type]=\"popoverLabel.type || 'text'\"\n [elementRefCustom]=\"popoverLabel.type === 'text'? undefined:itemRef\"\n [ignoreShowPopover]=\"popoverLabel.ignoreShowPopover\"\n [config]=\"popoverLabel.config ?? configTemplateText.configLabelPopover?.() ?? {}\"\n [innerHtml]=\"item().fieldLabel\"\n [classInclude]=\"item().classInclude\"\n (outEvent)=\"handlerSelectItem($event,item())\" />\n }\n }\n @if ((item().fieldPopover|LibsUiPipesConvertObjectToSignalPipe)?.(); as popover) {\n <libs_ui-components-popover class=\"{{ popover.classInclude }}\"\n [config]=\"popover.config\">\n @if (popover.dataView) {\n <div [innerHtml]=\"popover.dataView | translate\"></div>\n } @else {\n <i class=\"libs-ui-icon-tooltip-outline\"></i>\n }\n </libs_ui-components-popover>\n }\n @if (configTemplateText?.rows) {\n <libs_ui-components-list-templates_rows\n class=\"w-full {{ configTemplateText.classRowsWrapper || configTemplateText.classRows || '' }}\"\n [item]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keySelected]=\"keySelected()\"\n [configTemplate]=\"configTemplateText\"\n [zIndex]=\"zIndex()\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outEvent)=\"handlerSelectItem($event.event,$event.item,$event.action)\" />\n }\n @if (configTemplateText.getComponentOutlet) {\n <ng-container\n *ngComponentOutlet=\"(item()|LibsUiPipesGetValueOfObjectPipe:fieldKey():undefined:true | LibsUiPipesCallFunctionInTemplatePipe:configTemplateText.getComponentOutlet:item()) | async; inputs:(undefined | LibsUiPipesCallFunctionInTemplatePipe:configTemplateText.getDataComponentOutlet:item():fieldKey():{valueIsEmpty:{item:item()}}) | async\" />\n }\n\n @if (keySelected() === item()[fieldKey()] || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe:multiKeySelected():multiKeySelected()?.length) && !configTemplateText.ignoreIconSelected && !configTemplateText.actionSort) {\n <i [class]=\"'libs-ui-icon-check '+(configTemplateText.classIncludeIconSelected || 'right-[12px]')\">\n </i>\n }\n @if (keySelected() === item()[fieldKey()] && configTemplateText.actionSort) {\n <div class=\"libs-ui-list-template-text-sort\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || disable() || false\"\n [mode]=\"configTemplateText?.itemSort?.()?.mode || ''\"\n [fieldSort]=\"item()[fieldKey()]\"\n (outChange)=\"handlerSort($event)\" />\n </div>\n }\n </div>\n </div>\n }\n </ng-template>\n}\n", styles: [".libs-ui-list-template-text-item{padding:6px 16px 6px 1px;font-size:12px;line-height:18px;position:relative;cursor:pointer}.libs-ui-list-template-text-item>.libs-ui-icon-check,.libs-ui-list-template-text-item .libs-ui-list-template-text-sort{position:absolute;right:16px}.libs-ui-list-template-text-item>.libs-ui-icon-check:before,.libs-ui-list-template-text-item .libs-ui-list-template-text-sort:before{font-size:16px;color:var(--libs-ui-color-default, #226FF5)}.libs-ui-list-template-text-item-bullet{width:10px;height:10px;border-radius:50%;margin-right:8px;cursor:pointer}.libs-ui-list-template-text-item-avatar{width:24px;height:24px;border-radius:50%;margin-right:8px;cursor:pointer}\n"] }]
|
|
236
239
|
}] });
|
|
237
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL3RleHQvdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL3RleHQvdGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBUyx5Q0FBeUMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9GLE9BQU8sRUFB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QyxzQ0FBc0M7d0JBQ3RDLDRCQUE0Qjt3QkFDNUIsK0JBQStCO3dCQUMvQix5Q0FBeUM7d0JBQ3pDLCtDQUErQzt3QkFDL0MsaUNBQWlDO3dCQUNqQyxxQ0FBcUM7d0JBQ3JDLG9DQUFvQzt3QkFDcEMsK0JBQStCO3FCQUNoQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcywgTmdDb21wb25lbnRPdXRsZXQsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgT25Jbml0LCBzaWduYWwsIHZpZXdDaGlsZCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudCwgVmlydHVhbFNjcm9sbGVyTW9kdWxlIH0gZnJvbSAnQGloYXJiZWNrL25neC12aXJ0dWFsLXNjcm9sbGVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNBdmF0YXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWF2YXRhcic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSVNvcnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zU29ydEFycm93Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLXNvcnQnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zcGlubmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTd2l0Y2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXN3aXRjaCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jb252ZXJ0LW9iamVjdC10by1zaWduYWwnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjb252ZXJ0T2JqZWN0VG9TaWduYWwsIGRlbGV0ZVVuaWNvZGUsIGVzY2FwZUh0bWwsIGlzRW1wdHkgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaXN0SGlnaGxpZ2h0S2V5U2VhcmNoRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vaGlnaGxpZ2h0LWtleS1zZWFyY2gvaGlnaGxpZ2h0LWtleS1zZWFyY2guZGlyZWN0aXZlJztcbmltcG9ydCB7IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9jaGVjay1zZWxlY3RlZC1ieS1rZXkucGlwZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzTGlzdFJvd3NDb21wb25lbnQgfSBmcm9tICcuLi9yb3dzL3Jvd3MuY29tcG9uZW50JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaXN0VGVtcGxhdGVzQ29tcG9uZW50QWJzdHJhY3QgfSBmcm9tICcuLi90ZW1wbGF0ZXMuY29tcG9uZW50LmFic3RyYWN0JztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbVRleHQgfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMvY29uZmlnLWl0ZW0uaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1nZXQtdmFsdWUtb2Ytb2JqZWN0JztcbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1saXN0LXRlbXBsYXRlc190ZXh0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RleHQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90ZXh0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgVmlydHVhbFNjcm9sbGVyTW9kdWxlLCBOZ1RlbXBsYXRlT3V0bGV0LCBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTmdDbGFzcywgQXN5bmNQaXBlLCBOZ0NvbXBvbmVudE91dGxldCxcbiAgICBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlLFxuICAgIExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c1N3aXRjaENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1NvcnRBcnJvd0NvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzTGlzdEhpZ2hsaWdodEtleVNlYXJjaERpcmVjdGl2ZSxcbiAgICBMaWJzVWlDb21wb25lbnRzTGlzdFJvd3NDb21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZSxcbiAgICBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUsXG4gICAgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNMaXN0VGV4dENvbXBvbmVudCBleHRlbmRzIExpYnNVaUNvbXBvbmVudHNMaXN0VGVtcGxhdGVzQ29tcG9uZW50QWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByb3RlY3RlZCBjb25maWdUZW1wbGF0ZVRleHQgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtVGV4dCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlydHVhbFNjcm9sbGVyQ29tcG9uZW50ID0gdmlld0NoaWxkPFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudD4oVmlydHVhbFNjcm9sbGVyQ29tcG9uZW50KTtcblxuICBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoaXNFbXB0eSh0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZVRleHQ/LigpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgdGhpcy5jb25maWdUZW1wbGF0ZVRleHQuc2V0KHRoaXMuY29uZmlnKCk/LmNvbmZpZ1RlbXBsYXRlVGV4dD8uKCkpO1xuICAgIHRoaXMuZmllbGRLZXkuc2V0KHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/LmZpZWxkS2V5ID8/IHRoaXMuZmllbGRLZXlEZWZhdWx0KCkpO1xuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSgpO1xuICB9XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm90dG9tKCkge1xuICAgIGlmICh0aGlzLmxvYWRlZExhc3RJdGVtKCkpIHtcbiAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmxvYWRpbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NTZWFyY2goKSB7XG4gICAgaWYgKCF0aGlzLmlzU2VhcmNoT25saW5lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NEYXRhKHRydWUpO1xuICAgIH1cbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrUmVsYXRpdmUoZTogRXZlbnQsIGl0ZW06IGFueSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuY2xpY2tFeGFjdGx5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVyU2VsZWN0SXRlbShlLCBpdGVtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0SXRlbShlOiBFdmVudCB8IHN0cmluZywgaXRlbTogYW55LCBhY3Rpb24/OiAoaXRlbTogYW55KSA9PiB2b2lkLCBpZ25vcmVEaXNhYmxlID0gZmFsc2UsIGlzQ2xpY2tNYW51YWwgPSB0cnVlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgaWYgKGl0ZW0uZGlzYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXNhYmxlKCkgJiYgIWlnbm9yZURpc2FibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlID09PSAnc3RyaW5nJyAmJiBlICE9PSAnY2xpY2snKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXRlbSB8fCAodGhpcy5rZXlzRGlzYWJsZUl0ZW0oKSAmJiB0aGlzLmtleXNEaXNhYmxlSXRlbSgpPy5zb21lKGtleSA9PiBrZXkgPT09IGl0ZW1bdGhpcy5maWVsZEtleSgpXSkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhY3Rpb24pIHtcbiAgICAgIGFjdGlvbihpdGVtLnJlZik7XG4gICAgICB0aGlzLml0ZW1zKCkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgdGhpcy5idWlsZFZhbHVlQnlDb25maWcoaXRlbSwgdGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uYWN0aW9uU29ydCkge1xuICAgICAgY29uc3QgY3VycmVudEl0ZW1Tb3J0ID0gdGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uaXRlbVNvcnQ/LigpO1xuICAgICAgY29uc3QgbW9kZSA9IGN1cnJlbnRJdGVtU29ydD8uZmllbGRTb3J0ICE9PSBpdGVtW3RoaXMuZmllbGRLZXkoKV0gPyAnYXNjJyA6IGN1cnJlbnRJdGVtU29ydD8ubW9kZSA9PT0gJ2Rlc2MnID8gJ2FzYycgOiAnZGVzYyc7XG4gICAgICBjb25zdCBuZXdTb3J0OiBJU29ydCA9IHtcbiAgICAgICAgZmllbGRTb3J0OiBpdGVtW3RoaXMuZmllbGRLZXkoKV0sXG4gICAgICAgIG1vZGUsXG4gICAgICAgIG1vZGVOdW1iZXI6IG1vZGUgPT09ICdhc2MnID8gMSA6IDIsXG4gICAgICAgIHJlc2V0OiAoKSA9PiAwXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNvbmZpZ1RlbXBsYXRlVGV4dCgpPy5pdGVtU29ydD8uc2V0KG5ld1NvcnQpO1xuXG4gICAgICB0aGlzLm91dFNvcnRTaW5nbGVTZWxlY3QuZW1pdCh0aGlzLmNvbmZpZ1RlbXBsYXRlVGV4dCgpPy5pdGVtU29ydD8uKCkgfHwgbmV3U29ydCk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlTZWxlY3RlZC5zZXQoaXRlbVt0aGlzLmZpZWxkS2V5KCldKTtcbiAgICB0aGlzLm91dFNlbGVjdEtleS5lbWl0KHsga2V5OiB0aGlzLmtleVNlbGVjdGVkKCksIGl0ZW0sIGlzQ2xpY2tNYW51YWwgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNvcnQoaXRlbVNvcnQ6IElTb3J0KSB7XG4gICAgaXRlbVNvcnQucmVzZXQgPSAoKSA9PiAwO1xuXG4gICAgdGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uaXRlbVNvcnQ/LnNldChpdGVtU29ydCk7XG4gICAgdGhpcy5vdXRTb3J0U2luZ2xlU2VsZWN0LmVtaXQodGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uaXRlbVNvcnQ/LigpIHx8IGl0ZW1Tb3J0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzRGF0YShyZXBsYWNlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1CeUtleVNlYXJjaDogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4gPSBbXTtcbiAgICBjb25zdCBrZXlzSGlkZGVuID0gdGhpcy5rZXlzSGlkZGVuSXRlbSgpIHx8IFtdO1xuXG4gICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKVxuICAgIH1cbiAgICB0aGlzLnN0b3JlKCkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgZGF0YVN0b3JlID0gY2xvbmVEZWVwKGl0ZW0pIGFzIFdyaXRhYmxlU2lnbmFsPGFueT47XG4gICAgICBjb25zdCBrZXkgPSBrZXlzSGlkZGVuLmZpbmQoa2V5ID0+IGRhdGFTdG9yZSgpW3RoaXMuZmllbGRLZXkoKV0gPT09IGtleSk7XG4gICAgICBkYXRhU3RvcmUudXBkYXRlKHN0b3JlID0+IHsgcmV0dXJuIHsgLi4uc3RvcmUsIHJlZjogaXRlbSgpIH0gfSk7XG5cbiAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gZGVsZXRlVW5pY29kZSh0aGlzLmJ1aWxkVmFsdWVCeUNvbmZpZyhkYXRhU3RvcmUsIHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCkpKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCB0ZXh0RXNjYXBlID0gZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICAgICAgY29uc3Qga2V5U2VhcmNoID0gZGVsZXRlVW5pY29kZShlc2NhcGVIdG1sKHRoaXMua2V5U2VhcmNoKCkudG9Mb2NhbGVMb3dlckNhc2UoKSkpO1xuXG4gICAgICAgIGlmICgoKHRoaXMuaXNTZWFyY2hPbmxpbmUoKSAmJiB0aGlzLmNvbmZpZygpPy5odHRwUmVxdWVzdERhdGE/LigpPy5zZXJ2aWNlTmFtZSAmJiAhdGhpcy5jb25maWcoKT8uaHR0cFJlcXVlc3REYXRhPy4oKT8uc2VydmljZU90aGVyKSB8fFxuICAgICAgICAgICh0ZXh0ICYmICh0ZXh0LmluY2x1ZGVzKGtleVNlYXJjaCkgfHwgdGV4dEVzY2FwZS5pbmNsdWRlcyhrZXlTZWFyY2gpKSkpICYmIChyZXBsYWNlIHx8ICghcmVwbGFjZSAmJiAhdGhpcy5pdGVtcygpLmZpbmQoZGF0YUl0ZW0gPT4gZGF0YUl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSBkYXRhU3RvcmUoKVt0aGlzLmZpZWxkS2V5KCldKSkpICYmICFpdGVtQnlLZXlTZWFyY2guZmluZChkYXRhSXRlbSA9PiBkYXRhSXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPT09IGRhdGFTdG9yZSgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgICAgZGF0YVN0b3JlLnVwZGF0ZShzdG9yZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5zdG9yZSxcbiAgICAgICAgICAgICAgaHJlZkJ1dHRvbjogdGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uZ2V0SHJlZkJ1dHRvbj8uKHN0b3JlKSxcbiAgICAgICAgICAgICAgY2xhc3NJdGVtOiBpdGVtKCkuY2xhc3NJdGVtIHx8IHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/LmdldENsYXNzSXRlbT8uKHN0b3JlKSxcbiAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlOiBzdG9yZS5jbGFzc0luY2x1ZGUgfHwgdGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uZ2V0Q2xhc3NJbmNsdWRlUG9wb3Zlcj8uKHN0b3JlKSxcbiAgICAgICAgICAgICAgYnV0dG9uTGVmdENvbmZpZzogdGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uZ2V0Q29uZmlnQnV0dG9uTGVmdD8uKHN0b3JlKSxcbiAgICAgICAgICAgICAgY2xhc3NJY29uTGVmdDogc3RvcmUuY2xhc3NJY29uTGVmdCB8fCB0aGlzLmNvbmZpZ1RlbXBsYXRlVGV4dCgpPy5nZXRDbGFzc0ljb25MZWZ0Py4oc3RvcmUpLFxuICAgICAgICAgICAgICBob3ZlckRhbmdlcjogc3RvcmUuaG92ZXJEYW5nZXIgfHwgdGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uZ2V0Q29uZmlnSG92ZXJEYW5nZXI/LihzdG9yZSksXG4gICAgICAgICAgICAgIGF2YXRhckNvbmZpZzogdGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uZ2V0QXZhdGFyQ29uZmlnPy4oc3RvcmUpLFxuICAgICAgICAgICAgICBpdGVtQWxpZ25TdGFydDogc3RvcmUuaXRlbUFsaWduU3RhcnQgfHwgdGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uZ2V0Q29uZmlnQWxpZ25TdGFydD8uKHN0b3JlKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpdGVtQnlLZXlTZWFyY2gucHVzaChkYXRhU3RvcmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXhJdGVtUmVtb3ZlID0gdGhpcy5pdGVtcygpLmZpbmRJbmRleChpdGVtID0+IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXhJdGVtUmVtb3ZlID4gLTEpIHtcbiAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleEl0ZW1SZW1vdmUsIDEpO1xuXG4gICAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBjYWxsYmFja0NoZWNrU2Nyb2xsID0gKHByZVN0YXRlSGFzU2Nyb2xsOiBib29sZWFuLCBjdXJyZW50SGFzU2Nyb2xsOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnNjcm9sbFRvSXRlbVNlbGVjdGVkKCk7XG4gICAgICBpZiAodGhpcy5rZXlzSGlkZGVuSXRlbSgpPy5sZW5ndGggJiYgcHJlU3RhdGVIYXNTY3JvbGwgJiYgIWN1cnJlbnRIYXNTY3JvbGwgJiYgKHRoaXMuaXNTZWFyY2hPbmxpbmUoKSkpIHtcbiAgICAgICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gY29udmVydE9iamVjdFRvU2lnbmFsPFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+Pj4oaXRlbUJ5S2V5U2VhcmNoKSgpO1xuICAgICAgdGhpcy5pdGVtcy5zZXQoaXRlbXMpO1xuICAgICAgdGhpcy5jb25maWcoKT8uc29ydD8uKHRoaXMuaXRlbXMoKSk7XG4gICAgICB0aGlzLmVtaXRLZXlTZWxlY3RlZERlZmF1bHRJZkV4aXN0SXRlbSh0aGlzLml0ZW1zKCkpO1xuICAgICAgdGhpcy5hdXRvU2VsZWN0Rmlyc3RJdGVtKHRoaXMuaXRlbXMoKSk7XG4gICAgICB0aGlzLnNldEhlaWdodFZpZXdQb3J0KCk7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuY2hlY2tWaWV3UG9ydFNjcm9sbChjYWxsYmFja0NoZWNrU2Nyb2xsKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICAgIHRoaXMub3V0TG9hZEl0ZW1zQ29tcGxldGUuZW1pdCh7IGl0ZW1zOiB0aGlzLml0ZW1zKCksIHBhZ2luZzogdGhpcy5wYWdpbmdTdG9yZSgpIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc0J5U2VhcmNoID0gY29udmVydE9iamVjdFRvU2lnbmFsPFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+Pj4oaXRlbUJ5S2V5U2VhcmNoKSgpO1xuICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IFsuLi5pdGVtcywgLi4uaXRlbXNCeVNlYXJjaF0pO1xuICAgIHRoaXMuY29uZmlnKCk/LnNvcnQ/Lih0aGlzLml0ZW1zKCkpO1xuICAgIHRoaXMuc2V0SGVpZ2h0Vmlld1BvcnQoKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmNoZWNrVmlld1BvcnRTY3JvbGwoY2FsbGJhY2tDaGVja1Njcm9sbCk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgIHRoaXMub3V0TG9hZEl0ZW1zQ29tcGxldGUuZW1pdCh7IGl0ZW1zOiB0aGlzLml0ZW1zKCksIHBhZ2luZzogdGhpcy5wYWdpbmdTdG9yZSgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb0l0ZW1TZWxlY3RlZCgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/LmF1dG9TY3JvbGxUb0l0ZW1TZWxlY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVBdXRvU2Nyb2xsSXRlbVNlbGVjdGVkKCkpO1xuICAgIHRoaXMudGltZUF1dG9TY3JvbGxJdGVtU2VsZWN0ZWQuc2V0KChzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5rZXlTZWxlY3RlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pdGVtcygpLmZpbmRJbmRleChpdGVtID0+IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSB0aGlzLmtleVNlbGVjdGVkKCkpO1xuXG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldENvbnRhaW5lciA9ICh0aGlzLmVsZW1lbnRTY3JvbGwoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk/Lm9mZnNldEhlaWdodDtcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbE9mZnNldCA9ICgob2Zmc2V0Q29udGFpbmVyID8gb2Zmc2V0Q29udGFpbmVyIC0gdGhpcy5oZWlnaHRJdGVtKCkgOiAwKSAvIDIpICogLTE7XG5cbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQoKT8uc2Nyb2xsVG9JbmRleChpbmRleCwgdHJ1ZSwgYWRkaXRpb25hbE9mZnNldCwgdGhpcy50aW1lQW5pbWF0aW9uU2Nyb2xsVG9JbmRleEl0ZW0oKSk7XG4gICAgICB9XG4gICAgfSkgYXMgdW5rbm93bikgYXMgbnVtYmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhdXRvU2VsZWN0Rmlyc3RJdGVtKGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pikge1xuICAgIGlmICh0aGlzLmF1dG9TZWxlY3RlZEZpcnN0SXRlbUNhbGxPdXRzaWRlQmVmb3JlKCkgfHwgdGhpcy5rZXlTZWxlY3RlZCgpIHx8ICF0aGlzLmNvbmZpZygpPy5hdXRvU2VsZWN0Rmlyc3RJdGVtIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlclNlbGVjdEl0ZW0oJ2NsaWNrJywgaXRlbXNbMF0oKSwgdW5kZWZpbmVkLCB0cnVlLCBmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEtleVNlbGVjdGVkRGVmYXVsdElmRXhpc3RJdGVtKGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pikge1xuICAgIGNvbnN0IGl0ZW0gPSBpdGVtcy5maW5kKHN0b3JlID0+IHN0b3JlKClbdGhpcy5maWVsZEtleSgpXSA9PT0gdGhpcy5rZXlTZWxlY3RlZCgpKTtcblxuICAgIGlmIChpdGVtKSB7XG4gICAgICB0aGlzLmhhbmRsZXJTZWxlY3RJdGVtKCdjbGljaycsIGl0ZW0oKSwgdW5kZWZpbmVkLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldExlbmd0aEl0ZW0oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcygpLmxlbmd0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVySW1hZ2VFcnJvcihldmVudDogRXZlbnQsIGl0ZW06IGFueSkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGl0ZW0uc3BlY2lmaWNfbG9hZEltZ0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuIiwiQGlmIChjb25maWdUZW1wbGF0ZVRleHQoKTsgYXMgY29uZmlnVGVtcGxhdGVUZXh0KSB7XG4gIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBoLWZ1bGwgdy1mdWxsXCI+XG4gICAgQGlmIChpdGVtcygpICYmIGl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICA8ZGl2ICNlbGVtZW50U2Nyb2xsXG4gICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiIGhlaWdodFZpZXdQb3J0KCkgJiYgKCFjb25maWcoKT8uaWdub3JlU2hvd0RhdGFXaGVuTm90U2VhcmNoIHx8IChjb25maWcoKT8uaWdub3JlU2hvd0RhdGFXaGVuTm90U2VhcmNoICYmIGNvbmZpZygpPy5pZ25vcmVGaXhIZWlnaHRTaG93RGF0YVdoZW5Ob3RTZWFyY2gpKSAgPyBoZWlnaHRWaWV3UG9ydCgpKydweCc6JzEwMCUnXCJcbiAgICAgICAgY2xhc3M9XCJ3LWZ1bGxcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICAob3V0U2Nyb2xsQm90dG9tKT1cImhhbmRsZXJTY3JvbGxCb3R0b20oKVwiPlxuICAgICAgICBAaWYgKCFjb25maWdUZW1wbGF0ZVRleHQubm90VXNlVmlydHVhbFNjcm9sbCkge1xuICAgICAgICAgIDx2aXJ0dWFsLXNjcm9sbGVyICNzY3JvbGxcbiAgICAgICAgICAgIFtwYXJlbnRTY3JvbGxdPVwiZWxlbWVudFNjcm9sbFwiXG4gICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXMoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImgtZnVsbFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD0nbGlzdFJlZjtjb250ZXh0OntpdGVtc1ZpZXc6c2Nyb2xsLnZpZXdQb3J0SXRlbXN9JyAvPlxuICAgICAgICAgIDwvdmlydHVhbC1zY3JvbGxlcj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlVGV4dC5ub3RVc2VWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD0nbGlzdFJlZjtjb250ZXh0OntpdGVtc1ZpZXc6aXRlbXMoKX0nIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKCghaXRlbXMoKSB8fCAhaXRlbXMoKS5sZW5ndGgpICYmICghY29uZmlnKCk/Lmlnbm9yZVNob3dEYXRhV2hlbk5vdFNlYXJjaCB8fCBrZXlTZWFyY2goKSkpIHtcbiAgICAgIDxkaXYgW2NsYXNzXT1cIidsaWJzLXVpLWZvbnQtaDVyIHRleHQtWyM5Y2EyYWRdICcrIChjb25maWcoKT8udGV4dE5vRGF0YUNsYXNzSW5jbHVkZSA/PyAncHktWzZweF0gcHgtWzE2cHhdJylcIj5cbiAgICAgICAgQGlmICgha2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgIHt7IChjb25maWcoKT8udGV4dE5vRGF0YSA/PyAnaTE4bl9oYXZlX25vX3NlbGVjdGlvbicpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIH1cbiAgICAgICAgQGlmICh0ZW1wbGF0ZVJlZlNlYXJjaE5vRGF0YSgpICYmIGtleVNlYXJjaCgpICYmICFsb2FkaW5nKCkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVSZWZTZWFyY2hOb0RhdGEoKSB8fCBudWxsO2NvbnRleHQ6e2tleVNlYXJjaDprZXlTZWFyY2goKX1cIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoIXRlbXBsYXRlUmVmU2VhcmNoTm9EYXRhKCkgJiYga2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgIHt7IChjb25maWcoKT8udGV4dFNlYXJjaE5vRGF0YSA/PyAnaTE4bl9ub19yZXN1bHQnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICB9XG4gICAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgICAgJm5ic3A7XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zcGlubmVyIFtzaXplXT1cImxvYWRpbmdJY29uU2l6ZSgpIHx8ICdtZWRpdW0nXCIgLz5cbiAgICB9XG4gIDwvZGl2PlxuICA8bmctdGVtcGxhdGUgI2xpc3RSZWZcbiAgICBsZXQtaXRlbXNWaWV3PSdpdGVtc1ZpZXcnPlxuICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXNWaWV3OyB0cmFjayBpdGVtKClbZmllbGRLZXkoKV0pIHtcbiAgICAgIDxkaXYgI2l0ZW1SZWZcbiAgICAgICAgW2NsYXNzXT1cIml0ZW0oKS5jbGFzc0l0ZW1XcmFwcGVyIHx8ICcnXCI+XG4gICAgICAgIDxkaXYgTGlic1VpQ29tcG9uZW50c0xpc3RIaWdobGlnaHRLZXlTZWFyY2hEaXJlY3RpdmVcbiAgICAgICAgICBbaXNIaWdobGlnaHRdPVwiY29uZmlnKCk/LmhpZ2hsaWdodFRleHRTZWFyY2hJblJlc3VsdFwiXG4gICAgICAgICAgW2tleVNlYXJjaF09XCJrZXlTZWFyY2goKVwiXG4gICAgICAgICAgW2NsYXNzXT1cIidsaWJzLXVpLWxpc3QtdGVtcGxhdGUtdGV4dC1pdGVtIGxpYnMtdWktZm9udC1oNXIgZmxleCAnKyhpdGVtKCkuY2xhc3NJdGVtIHx8ICcnKVwiXG4gICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCIhaXRlbSgpLml0ZW1BbGlnblN0YXJ0XCJcbiAgICAgICAgICBbY2xhc3MuaXRlbXMtc3RhcnRdPVwiaXRlbSgpLml0ZW1BbGlnblN0YXJ0XCJcbiAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWhvdmVyLWRhbmdlcl09XCIhY2xpY2tFeGFjdGx5KCkgJiYgaXRlbSgpLmhvdmVyRGFuZ2VyXCJcbiAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWhvdmVyXT1cIiFjbGlja0V4YWN0bHkoKSAgJiYgIWl0ZW0oKS5ob3ZlckRhbmdlclwiXG4gICAgICAgICAgW2NsYXNzLmxpYnMtdWktYmctbGlzdC1hY3RpdmVdPVwiIWNsaWNrRXhhY3RseSgpICYmIGtleVNlbGVjdGVkKCkgPT09IGl0ZW0oKVtmaWVsZEtleSgpXVwiXG4gICAgICAgICAgW2NsYXNzLiFwbC1bMTZweF1dPVwicGFkZGluZ0xlZnRJdGVtKClcIlxuICAgICAgICAgIFtjbGFzcy5iZy1bI2ZmZmZmZl1dPVwiY2xpY2tFeGFjdGx5KClcIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJnLWxpc3QtaG92ZXItZmZmZmZmXT1cIml0ZW0oKS5kaXNhYmxlXCJcbiAgICAgICAgICBbY2xhc3MuY3Vyc29yLWRlZmF1bHRdPVwiaXRlbSgpLmRpc2FibGVcIlxuICAgICAgICAgIFtjbGFzcy4hcHktWzJweF1dPVwiY2xpY2tFeGFjdGx5KClcIlxuICAgICAgICAgIFtjbGFzcy4hcHItWzQ4cHhdXT1cImtleVNlbGVjdGVkKCkgPT09IGl0ZW0oKVtmaWVsZEtleSgpXSAmJiAoIWNvbmZpZ1RlbXBsYXRlVGV4dD8uaWdub3JlSWNvblNlbGVjdGVkIHx8IGNvbmZpZ1RlbXBsYXRlVGV4dD8uYWN0aW9uU29ydCkmJiAhY29uZmlnVGVtcGxhdGVUZXh0Py5zdHlsZVBhZGRpbmdSaWdodEl0ZW1PdGhlclwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydwb2ludGVyLWV2ZW50cy1ub25lIGxpYnMtdWktZGlzYWJsZSc6bG9hZGluZygpIHx8IGRpc2FibGUoKSB8fCAoKGl0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c0Rpc2FibGVJdGVtKCk6a2V5c0Rpc2FibGVJdGVtKCk/Lmxlbmd0aCkgJiYgIWlnbm9yZUNsYXNzRGlzYWJsZURlZmF1bHRXaGVuVXNlS2V5c0Rpc2FibGVJdGVtKCkpfVwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJDbGlja1JlbGF0aXZlKCRldmVudCxpdGVtKCkpXCI+XG4gICAgICAgICAgQGlmICgoaXRlbSgpLmJ1bGxldHxMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUpPy4oKTsgYXMgYnVsbGV0KSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktbGlzdC10ZW1wbGF0ZS10ZXh0LWl0ZW0tYnVsbGV0IGZsZXggZmxleC1zaHJpbmstMFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiYnVsbGV0LmJhY2tncm91bmRDb2xvclwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyU2VsZWN0SXRlbSgkZXZlbnQsaXRlbSgpKVwiPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKChpdGVtKCkuYXZhdGFyQ29uZmlnfExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZSk/LigpOyBhcyBhdmF0YXJDb25maWcpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYXZhdGFyIFt0eXBlU2hhcGVdPVwiYXZhdGFyQ29uZmlnLnR5cGVTaGFwZSA/PyAnY2lyY2xlJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYXZhdGFyQ29uZmlnLmNsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAgIFtjbGFzc0ltYWdlSW5jbHVkZV09XCJhdmF0YXJDb25maWcuY2xhc3NJbWFnZUluY2x1ZGVcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJhdmF0YXJDb25maWcuc2l6ZSA/PyAzMlwiXG4gICAgICAgICAgICAgIFtsaW5rQXZhdGFyXT1cImF2YXRhckNvbmZpZy5saW5rQXZhdGFyXCJcbiAgICAgICAgICAgICAgW2xpbmtBdmF0YXJFcnJvcl09XCJhdmF0YXJDb25maWcubGlua0F2YXRhckVycm9yXCJcbiAgICAgICAgICAgICAgW2lkR2VuQ29sb3JdPVwiYXZhdGFyQ29uZmlnLmlkR2VuQ29sb3JcIlxuICAgICAgICAgICAgICBbdGV4dEF2YXRhcl09XCJhdmF0YXJDb25maWcudGV4dEF2YXRhclwiXG4gICAgICAgICAgICAgIFtjbGFzc0ltYWdlSW5jbHVkZV09XCJhdmF0YXJDb25maWcuY2xhc3NJbWFnZUluY2x1ZGVcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlVGV4dC5nZXRJbWFnZSB8fCBjb25maWdUZW1wbGF0ZVRleHQuZmllbGRHZXRJbWFnZSkge1xuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBbc3JjXT1cImNvbmZpZ1RlbXBsYXRlVGV4dC5nZXRJbWFnZSA/ICgoJ2F2YXRhcicgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOihpdGVtKCkuc3BlY2lmaWNfbG9hZEltZ0Vycm9yICYmIGNvbmZpZ1RlbXBsYXRlVGV4dC5nZXRJbWFnZUVycm9yID8gY29uZmlnVGVtcGxhdGVUZXh0LmdldEltYWdlRXJyb3IgOiBjb25maWdUZW1wbGF0ZVRleHQuZ2V0SW1hZ2UpOml0ZW0oKSkgfCBhc3luYykgOiBpdGVtKClbY29uZmlnVGVtcGxhdGVUZXh0LmZpZWxkR2V0SW1hZ2UgfHwgJyddXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cIidsaWJzLXVpLWxpc3QtdGVtcGxhdGUtdGV4dC1pdGVtLWF2YXRhciAnICsgKGNvbmZpZ1RlbXBsYXRlVGV4dC5jbGFzc0luY2x1ZGVJbWFnZSA/PyAnJylcIlxuICAgICAgICAgICAgICBbY2xhc3Mudy1bMThweF1dPVwiY29uZmlnVGVtcGxhdGVUZXh0LmltZ1R5cGVJY29uXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmgtWzE4cHhdXT1cImNvbmZpZ1RlbXBsYXRlVGV4dC5pbWdUeXBlSWNvblwiXG4gICAgICAgICAgICAgIChlcnJvcik9XCJoYW5kbGVySW1hZ2VFcnJvcigkZXZlbnQsIGl0ZW0oKSlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclNlbGVjdEl0ZW0oJGV2ZW50LGl0ZW0oKSlcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKChpdGVtKCkuYnV0dG9uTGVmdENvbmZpZyB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZSk/LigpOyBhcyBidXR0b25MZWZ0KSB7XG4gICAgICAgICAgICBAaWYgKGl0ZW0oKS5ocmVmQnV0dG9uKSB7XG4gICAgICAgICAgICAgIDxhIFtjbGFzcy53LWZ1bGxdPVwiIWJ1dHRvbkxlZnQuaWdub3JlV2lkdGgxMDBcIlxuICAgICAgICAgICAgICAgIFtocmVmXT1cIml0ZW0oKS5ocmVmQnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbkxlZnRUZW1wbGF0ZVwiIC8+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoIWl0ZW0oKS5ocmVmQnV0dG9uKSB7XG4gICAgICAgICAgICAgIDxkaXYgW2NsYXNzLnctZnVsbF09XCIhYnV0dG9uTGVmdC5pZ25vcmVXaWR0aDEwMFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25MZWZ0VGVtcGxhdGVcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnV0dG9uTGVmdFRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIGNsYXNzPVwidy1mdWxsXCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJidXR0b25MZWZ0LnR5cGUgPz8gJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uTGVmdC5sYWJlbCA/PyAnICdcIlxuICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiYnV0dG9uTGVmdC56SW5kZXhcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbkxlZnQuZGlzYWJsZSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiKGJ1dHRvbkxlZnQuY2xhc3NJY29uTGVmdCA/IChidXR0b25MZWZ0LmNsYXNzSWNvbkxlZnQrJyBmbGV4IG1yLVs4cHhdIHRleHQtWzEycHhdJykgOiAnJylcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiKGJ1dHRvbkxlZnQuY2xhc3NJbmNsdWRlPz8nJykrJyB3LWZ1bGwnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJidXR0b25MZWZ0LmNsYXNzTGFiZWwgPz8gJ2xpYnMtdWktZm9udC1oNHInXCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwiYnV0dG9uTGVmdC5pZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlSWNvbkxlZnRdPVwiYnV0dG9uTGVmdC5zdHlsZUljb25MZWZ0XCJcbiAgICAgICAgICAgICAgICBbc3R5bGVCdXR0b25dPVwiYnV0dG9uTGVmdC5zdHlsZUJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJTZWxlY3RJdGVtKCRldmVudCxpdGVtKCkpXCIgLz5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoKGl0ZW0oKS5zd2l0Y2hDb25maWd8TGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlKT8uKCk7IGFzIHN3aXRjaENvbmZpZykge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zd2l0Y2ggW2FjdGl2ZV09XCJzd2l0Y2hDb25maWcuYWN0aXZlXCJcbiAgICAgICAgICAgICAgKG91dFN3aXRjaCk9XCJoYW5kbGVyU2VsZWN0SXRlbSgnY2xpY2snLGl0ZW0oKSlcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGl0ZW0oKS5jbGFzc0ljb25MZWZ0KSB7XG4gICAgICAgICAgICA8aSBbY2xhc3NdPVwiaXRlbSgpLmNsYXNzSWNvbkxlZnQgKyAnIG1yLVs4cHhdIHRleHQtWzE0cHhdJ1wiPjwvaT5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmICghaXRlbSgpLmlnbm9yZVNob3dGaWVsZExhYmVsICYmICFjb25maWdUZW1wbGF0ZVRleHQucm93cykge1xuICAgICAgICAgICAgQGlmICgoaXRlbSgpLnBvcG92ZXJMYWJlbHxMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUpPy4oKSA/PyB7dHlwZTondGV4dCd9OyBhcyBwb3BvdmVyTGFiZWwpIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cInBvcG92ZXJMYWJlbC50eXBlIHx8ICd0ZXh0J1wiXG4gICAgICAgICAgICAgICAgW2VsZW1lbnRSZWZDdXN0b21dPVwicG9wb3ZlckxhYmVsLnR5cGUgPT09ICd0ZXh0Jz8gdW5kZWZpbmVkOml0ZW1SZWZcIlxuICAgICAgICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJwb3BvdmVyTGFiZWwuaWdub3JlU2hvd1BvcG92ZXJcIlxuICAgICAgICAgICAgICAgIFtjb25maWddPVwicG9wb3ZlckxhYmVsLmNvbmZpZyA/PyBjb25maWdUZW1wbGF0ZVRleHQuY29uZmlnTGFiZWxQb3BvdmVyPy4oKSA/PyB7fVwiXG4gICAgICAgICAgICAgICAgW2lubmVySHRtbF09XCJpdGVtKCkuZmllbGRMYWJlbFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJpdGVtKCkuY2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICAgICAgICAob3V0RXZlbnQpPVwiaGFuZGxlclNlbGVjdEl0ZW0oJGV2ZW50LGl0ZW0oKSlcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKChpdGVtKCkuZmllbGRQb3BvdmVyfExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZSk/LigpOyBhcyBwb3BvdmVyKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgY2xhc3M9XCJ7eyBwb3BvdmVyLmNsYXNzSW5jbHVkZSB9fVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwicG9wb3Zlci5jb25maWdcIj5cbiAgICAgICAgICAgICAgQGlmIChwb3BvdmVyLmRhdGFWaWV3KSB7XG4gICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIdG1sXT1cInBvcG92ZXIuZGF0YVZpZXcgfCB0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tdG9vbHRpcC1vdXRsaW5lXCI+PC9pPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlVGV4dD8ucm93cykge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1saXN0LXRlbXBsYXRlc19yb3dzXG4gICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIHt7IGNvbmZpZ1RlbXBsYXRlVGV4dC5jbGFzc1Jvd3NXcmFwcGVyIHx8IGNvbmZpZ1RlbXBsYXRlVGV4dC5jbGFzc1Jvd3MgfHwgJycgfX1cIlxuICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtKClcIlxuICAgICAgICAgICAgICBbZmllbGRLZXldPVwiZmllbGRLZXkoKVwiXG4gICAgICAgICAgICAgIFtrZXlTZWxlY3RlZF09XCJrZXlTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ1RlbXBsYXRlXT1cImNvbmZpZ1RlbXBsYXRlVGV4dFwiXG4gICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPVwiaGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvdXRFdmVudCk9XCJoYW5kbGVyU2VsZWN0SXRlbSgkZXZlbnQuZXZlbnQsJGV2ZW50Lml0ZW0sJGV2ZW50LmFjdGlvbilcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlVGV4dC5nZXRDb21wb25lbnRPdXRsZXQpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nQ29tcG9uZW50T3V0bGV0PVwiKGl0ZW0oKXxMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlOmZpZWxkS2V5KCk6dW5kZWZpbmVkOnRydWUgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmNvbmZpZ1RlbXBsYXRlVGV4dC5nZXRDb21wb25lbnRPdXRsZXQ6aXRlbSgpKSB8IGFzeW5jOyBpbnB1dHM6KHVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29uZmlnVGVtcGxhdGVUZXh0LmdldERhdGFDb21wb25lbnRPdXRsZXQ6aXRlbSgpOmZpZWxkS2V5KCk6e3ZhbHVlSXNFbXB0eTp7aXRlbTppdGVtKCl9fSkgfCBhc3luY1wiIC8+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChrZXlTZWxlY3RlZCgpID09PSBpdGVtKClbZmllbGRLZXkoKV0gfHwgKGl0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6bXVsdGlLZXlTZWxlY3RlZCgpOm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoKSAmJiAhY29uZmlnVGVtcGxhdGVUZXh0Lmlnbm9yZUljb25TZWxlY3RlZCAmJiAhY29uZmlnVGVtcGxhdGVUZXh0LmFjdGlvblNvcnQpIHtcbiAgICAgICAgICAgIDxpIFtjbGFzc109XCInbGlicy11aS1pY29uLWNoZWNrICcrKGNvbmZpZ1RlbXBsYXRlVGV4dC5jbGFzc0luY2x1ZGVJY29uU2VsZWN0ZWQgfHwgJ3JpZ2h0LVsxMnB4XScpXCI+XG4gICAgICAgICAgICA8L2k+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoa2V5U2VsZWN0ZWQoKSA9PT0gaXRlbSgpW2ZpZWxkS2V5KCldICYmIGNvbmZpZ1RlbXBsYXRlVGV4dC5hY3Rpb25Tb3J0KSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1saXN0LXRlbXBsYXRlLXRleHQtc29ydFwiPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc29ydC1hcnJvdyBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgZGlzYWJsZSgpIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbbW9kZV09XCJjb25maWdUZW1wbGF0ZVRleHQ/Lml0ZW1Tb3J0Py4oKT8ubW9kZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2ZpZWxkU29ydF09XCJpdGVtKClbZmllbGRLZXkoKV1cIlxuICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlclNvcnQoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L25nLXRlbXBsYXRlPlxufVxuIl19
|
|
240
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL3RleHQvdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL3RleHQvdGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQVMseUNBQXlDLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRyxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMv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Qy9DLGlDQUFpQywrTUFDakMscUNBQXFDLHlFQUNyQyxvQ0FBb0Msd0VBQ3BDLCtCQUErQixtRUFDL0Isb0NBQW9DOzs0RkFHM0IsaUNBQWlDO2tCQTFCN0MsU0FBUzsrQkFFRSx3Q0FBd0MsY0FHdEMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLGVBQWU7d0JBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCO3dCQUNyQyxnQ0FBZ0M7d0JBQ2hDLCtCQUErQjt3QkFDL0Isc0NBQXNDO3dCQUN0QyxnQ0FBZ0M7d0JBQ2hDLHNDQUFzQzt3QkFDdEMsNEJBQTRCO3dCQUM1QiwrQkFBK0I7d0JBQy9CLHlDQUF5Qzt3QkFDekMsK0NBQStDO3dCQUMvQyxpQ0FBaUM7d0JBQ2pDLHFDQUFxQzt3QkFDckMsb0NBQW9DO3dCQUNwQywrQkFBK0I7d0JBQy9CLG9DQUFvQztxQkFDckMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nQ29tcG9uZW50T3V0bGV0LCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBPbkluaXQsIHNpZ25hbCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbGVyQ29tcG9uZW50LCBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUgfSBmcm9tICdAaWhhcmJlY2svbmd4LXZpcnR1YWwtc2Nyb2xsZXInO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0F2YXRhckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYXZhdGFyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJU29ydCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTb3J0QXJyb3dDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtc29ydCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc2Nyb2xsLW92ZXJsYXknO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1NwaW5uZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNwaW5uZXInO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1N3aXRjaENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3dpdGNoJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNvbnZlcnQtb2JqZWN0LXRvLXNpZ25hbCc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NvbnZlcnRTaWduYWxUb09iamVjdFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jb252ZXJ0LXNpZ25hbC10by1vYmplY3QnO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNHZXRWYWx1ZU9mT2JqZWN0UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWdldC12YWx1ZS1vZi1vYmplY3QnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjb252ZXJ0T2JqZWN0VG9TaWduYWwsIGRlbGV0ZVVuaWNvZGUsIGVzY2FwZUh0bWwsIGlzRW1wdHkgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaXN0SGlnaGxpZ2h0S2V5U2VhcmNoRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vaGlnaGxpZ2h0LWtleS1zZWFyY2gvaGlnaGxpZ2h0LWtleS1zZWFyY2guZGlyZWN0aXZlJztcbmltcG9ydCB7IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9jaGVjay1zZWxlY3RlZC1ieS1rZXkucGlwZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzTGlzdFJvd3NDb21wb25lbnQgfSBmcm9tICcuLi9yb3dzL3Jvd3MuY29tcG9uZW50JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaXN0VGVtcGxhdGVzQ29tcG9uZW50QWJzdHJhY3QgfSBmcm9tICcuLi90ZW1wbGF0ZXMuY29tcG9uZW50LmFic3RyYWN0JztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbVRleHQgfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMvY29uZmlnLWl0ZW0uaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWxpc3QtdGVtcGxhdGVzX3RleHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RleHQuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUsIE5nVGVtcGxhdGVPdXRsZXQsIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBOZ0NsYXNzLCBBc3luY1BpcGUsIE5nQ29tcG9uZW50T3V0bGV0LFxuICAgIExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNBdmF0YXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsXG4gICAgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzU3dpdGNoQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zU29ydEFycm93Q29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNMaXN0SGlnaGxpZ2h0S2V5U2VhcmNoRGlyZWN0aXZlLFxuICAgIExpYnNVaUNvbXBvbmVudHNMaXN0Um93c0NvbXBvbmVudCxcbiAgICBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlLFxuICAgIExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZSxcbiAgICBMaWJzVWlQaXBlc0dldFZhbHVlT2ZPYmplY3RQaXBlLFxuICAgIExpYnNVaVBpcGVzQ29udmVydFNpZ25hbFRvT2JqZWN0UGlwZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNMaXN0VGV4dENvbXBvbmVudCBleHRlbmRzIExpYnNVaUNvbXBvbmVudHNMaXN0VGVtcGxhdGVzQ29tcG9uZW50QWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByb3RlY3RlZCBjb25maWdUZW1wbGF0ZVRleHQgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtVGV4dCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGlzU2hvd0hlaWdodENhbGN1bGF0ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGVpZ2h0Vmlld1BvcnQoKSAmJiAoIXRoaXMuY29uZmlnKCk/Lmlnbm9yZVNob3dEYXRhV2hlbk5vdFNlYXJjaCB8fCAodGhpcy5jb25maWcoKT8uaWdub3JlU2hvd0RhdGFXaGVuTm90U2VhcmNoICYmIHRoaXMuY29uZmlnKCk/Lmlnbm9yZUZpeEhlaWdodFNob3dEYXRhV2hlbk5vdFNlYXJjaCkpKTtcbiAgLyogVklFVyBDSElMRCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZpcnR1YWxTY3JvbGxlckNvbXBvbmVudCA9IHZpZXdDaGlsZDxWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ+KFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudCk7XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKGlzRW1wdHkodGhpcy5jb25maWcoKT8uY29uZmlnVGVtcGxhdGVUZXh0Py4oKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0LnNldCh0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZVRleHQ/LigpKTtcbiAgICB0aGlzLmZpZWxkS2V5LnNldCh0aGlzLmNvbmZpZ1RlbXBsYXRlVGV4dCgpPy5maWVsZEtleSA/PyB0aGlzLmZpZWxkS2V5RGVmYXVsdCgpKTtcbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UoKTtcbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlclNjcm9sbEJvdHRvbSgpIHtcbiAgICBpZiAodGhpcy5sb2FkZWRMYXN0SXRlbSgpKSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2FkaW5nKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzU2VhcmNoKCkge1xuICAgIGlmICghdGhpcy5pc1NlYXJjaE9ubGluZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRGF0YSh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja1JlbGF0aXZlKGU6IEV2ZW50LCBpdGVtOiBhbnkpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmNsaWNrRXhhY3RseSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlclNlbGVjdEl0ZW0oZSwgaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdEl0ZW0oZTogRXZlbnQgfCBzdHJpbmcsIGl0ZW06IGFueSwgYWN0aW9uPzogKGl0ZW06IGFueSkgPT4gdm9pZCwgaWdub3JlRGlzYWJsZSA9IGZhbHNlLCBpc0NsaWNrTWFudWFsID0gdHJ1ZSkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChpdGVtLmRpc2FibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZSgpICYmICFpZ25vcmVEaXNhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZSA9PT0gJ3N0cmluZycgJiYgZSAhPT0gJ2NsaWNrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWl0ZW0gfHwgKHRoaXMua2V5c0Rpc2FibGVJdGVtKCkgJiYgdGhpcy5rZXlzRGlzYWJsZUl0ZW0oKT8uc29tZShrZXkgPT4ga2V5ID09PSBpdGVtW3RoaXMuZmllbGRLZXkoKV0pKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uKSB7XG4gICAgICBhY3Rpb24oaXRlbS5yZWYpO1xuICAgICAgdGhpcy5pdGVtcygpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIHRoaXMuYnVpbGRWYWx1ZUJ5Q29uZmlnKGl0ZW0sIHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCkpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/LmFjdGlvblNvcnQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJdGVtU29ydCA9IHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/Lml0ZW1Tb3J0Py4oKTtcbiAgICAgIGNvbnN0IG1vZGUgPSBjdXJyZW50SXRlbVNvcnQ/LmZpZWxkU29ydCAhPT0gaXRlbVt0aGlzLmZpZWxkS2V5KCldID8gJ2FzYycgOiBjdXJyZW50SXRlbVNvcnQ/Lm1vZGUgPT09ICdkZXNjJyA/ICdhc2MnIDogJ2Rlc2MnO1xuICAgICAgY29uc3QgbmV3U29ydDogSVNvcnQgPSB7XG4gICAgICAgIGZpZWxkU29ydDogaXRlbVt0aGlzLmZpZWxkS2V5KCldLFxuICAgICAgICBtb2RlLFxuICAgICAgICBtb2RlTnVtYmVyOiBtb2RlID09PSAnYXNjJyA/IDEgOiAyLFxuICAgICAgICByZXNldDogKCkgPT4gMFxuICAgICAgfTtcblxuICAgICAgdGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uaXRlbVNvcnQ/LnNldChuZXdTb3J0KTtcblxuICAgICAgdGhpcy5vdXRTb3J0U2luZ2xlU2VsZWN0LmVtaXQodGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uaXRlbVNvcnQ/LigpIHx8IG5ld1NvcnQpO1xuICAgIH1cblxuICAgIHRoaXMua2V5U2VsZWN0ZWQuc2V0KGl0ZW1bdGhpcy5maWVsZEtleSgpXSk7XG4gICAgdGhpcy5vdXRTZWxlY3RLZXkuZW1pdCh7IGtleTogdGhpcy5rZXlTZWxlY3RlZCgpLCBpdGVtLCBpc0NsaWNrTWFudWFsIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTb3J0KGl0ZW1Tb3J0OiBJU29ydCkge1xuICAgIGl0ZW1Tb3J0LnJlc2V0ID0gKCkgPT4gMDtcblxuICAgIHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/Lml0ZW1Tb3J0Py5zZXQoaXRlbVNvcnQpO1xuICAgIHRoaXMub3V0U29ydFNpbmdsZVNlbGVjdC5lbWl0KHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/Lml0ZW1Tb3J0Py4oKSB8fCBpdGVtU29ydCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0RhdGEocmVwbGFjZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtQnlLZXlTZWFyY2g6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+ID0gW107XG4gICAgY29uc3Qga2V5c0hpZGRlbiA9IHRoaXMua2V5c0hpZGRlbkl0ZW0oKSB8fCBbXTtcblxuICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICB0aGlzLml0ZW1zLnNldChbXSlcbiAgICB9XG4gICAgdGhpcy5zdG9yZSgpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTdG9yZSA9IGNsb25lRGVlcChpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuICAgICAgY29uc3Qga2V5ID0ga2V5c0hpZGRlbi5maW5kKGtleSA9PiBkYXRhU3RvcmUoKVt0aGlzLmZpZWxkS2V5KCldID09PSBrZXkpO1xuICAgICAgZGF0YVN0b3JlLnVwZGF0ZShzdG9yZSA9PiB7IHJldHVybiB7IC4uLnN0b3JlLCByZWY6IGl0ZW0oKSB9IH0pO1xuXG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGRlbGV0ZVVuaWNvZGUodGhpcy5idWlsZFZhbHVlQnlDb25maWcoZGF0YVN0b3JlLCB0aGlzLmNvbmZpZ1RlbXBsYXRlVGV4dCgpKSkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgdGV4dEVzY2FwZSA9IGVzY2FwZUh0bWwodGV4dCk7XG4gICAgICAgIGNvbnN0IGtleVNlYXJjaCA9IGRlbGV0ZVVuaWNvZGUoZXNjYXBlSHRtbCh0aGlzLmtleVNlYXJjaCgpLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICBpZiAoKCh0aGlzLmlzU2VhcmNoT25saW5lKCkgJiYgdGhpcy5jb25maWcoKT8uaHR0cFJlcXVlc3REYXRhPy4oKT8uc2VydmljZU5hbWUgJiYgIXRoaXMuY29uZmlnKCk/Lmh0dHBSZXF1ZXN0RGF0YT8uKCk/LnNlcnZpY2VPdGhlcikgfHxcbiAgICAgICAgICAodGV4dCAmJiAodGV4dC5pbmNsdWRlcyhrZXlTZWFyY2gpIHx8IHRleHRFc2NhcGUuaW5jbHVkZXMoa2V5U2VhcmNoKSkpKSAmJiAocmVwbGFjZSB8fCAoIXJlcGxhY2UgJiYgIXRoaXMuaXRlbXMoKS5maW5kKGRhdGFJdGVtID0+IGRhdGFJdGVtKClbdGhpcy5maWVsZEtleSgpXSA9PT0gZGF0YVN0b3JlKClbdGhpcy5maWVsZEtleSgpXSkpKSAmJiAhaXRlbUJ5S2V5U2VhcmNoLmZpbmQoZGF0YUl0ZW0gPT4gZGF0YUl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSBkYXRhU3RvcmUoKVt0aGlzLmZpZWxkS2V5KCldKSkge1xuICAgICAgICAgIGRhdGFTdG9yZS51cGRhdGUoc3RvcmUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uc3RvcmUsXG4gICAgICAgICAgICAgIGhyZWZCdXR0b246IHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/LmdldEhyZWZCdXR0b24/LihzdG9yZSksXG4gICAgICAgICAgICAgIGNsYXNzSXRlbTogaXRlbSgpLmNsYXNzSXRlbSB8fCB0aGlzLmNvbmZpZ1RlbXBsYXRlVGV4dCgpPy5nZXRDbGFzc0l0ZW0/LihzdG9yZSksXG4gICAgICAgICAgICAgIGNsYXNzSW5jbHVkZTogc3RvcmUuY2xhc3NJbmNsdWRlIHx8IHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/LmdldENsYXNzSW5jbHVkZVBvcG92ZXI/LihzdG9yZSksXG4gICAgICAgICAgICAgIGJ1dHRvbkxlZnRDb25maWc6IHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/LmdldENvbmZpZ0J1dHRvbkxlZnQ/LihzdG9yZSksXG4gICAgICAgICAgICAgIGNsYXNzSWNvbkxlZnQ6IHN0b3JlLmNsYXNzSWNvbkxlZnQgfHwgdGhpcy5jb25maWdUZW1wbGF0ZVRleHQoKT8uZ2V0Q2xhc3NJY29uTGVmdD8uKHN0b3JlKSxcbiAgICAgICAgICAgICAgaG92ZXJEYW5nZXI6IHN0b3JlLmhvdmVyRGFuZ2VyIHx8IHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/LmdldENvbmZpZ0hvdmVyRGFuZ2VyPy4oc3RvcmUpLFxuICAgICAgICAgICAgICBhdmF0YXJDb25maWc6IHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/LmdldEF2YXRhckNvbmZpZz8uKHN0b3JlKSxcbiAgICAgICAgICAgICAgaXRlbUFsaWduU3RhcnQ6IHN0b3JlLml0ZW1BbGlnblN0YXJ0IHx8IHRoaXMuY29uZmlnVGVtcGxhdGVUZXh0KCk/LmdldENvbmZpZ0FsaWduU3RhcnQ/LihzdG9yZSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaXRlbUJ5S2V5U2VhcmNoLnB1c2goZGF0YVN0b3JlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4SXRlbVJlbW92ZSA9IHRoaXMuaXRlbXMoKS5maW5kSW5kZXgoaXRlbSA9PiBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9PT0ga2V5KTtcblxuICAgICAgaWYgKGluZGV4SXRlbVJlbW92ZSA+IC0xKSB7XG4gICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXhJdGVtUmVtb3ZlLCAxKTtcblxuICAgICAgICAgIHJldHVybiBpdGVtcztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY2FsbGJhY2tDaGVja1Njcm9sbCA9IChwcmVTdGF0ZUhhc1Njcm9sbDogYm9vbGVhbiwgY3VycmVudEhhc1Njcm9sbDogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5zY3JvbGxUb0l0ZW1TZWxlY3RlZCgpO1xuICAgICAgaWYgKHRoaXMua2V5c0hpZGRlbkl0ZW0oKT8ubGVuZ3RoICYmIHByZVN0YXRlSGFzU2Nyb2xsICYmICFjdXJyZW50SGFzU2Nyb2xsICYmICh0aGlzLmlzU2VhcmNoT25saW5lKCkpKSB7XG4gICAgICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZShmYWxzZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICBjb25zdCBpdGVtcyA9IGNvbnZlcnRPYmplY3RUb1NpZ25hbDxXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj4+KGl0ZW1CeUtleVNlYXJjaCkoKTtcbiAgICAgIHRoaXMuaXRlbXMuc2V0KGl0ZW1zKTtcbiAgICAgIHRoaXMuY29uZmlnKCk/LnNvcnQ/Lih0aGlzLml0ZW1zKCkpO1xuICAgICAgdGhpcy5lbWl0S2V5U2VsZWN0ZWREZWZhdWx0SWZFeGlzdEl0ZW0odGhpcy5pdGVtcygpKTtcbiAgICAgIHRoaXMuYXV0b1NlbGVjdEZpcnN0SXRlbSh0aGlzLml0ZW1zKCkpO1xuICAgICAgdGhpcy5zZXRIZWlnaHRWaWV3UG9ydCgpO1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmNoZWNrVmlld1BvcnRTY3JvbGwoY2FsbGJhY2tDaGVja1Njcm9sbCk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgICB0aGlzLm91dExvYWRJdGVtc0NvbXBsZXRlLmVtaXQoeyBpdGVtczogdGhpcy5pdGVtcygpLCBwYWdpbmc6IHRoaXMucGFnaW5nU3RvcmUoKSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNCeVNlYXJjaCA9IGNvbnZlcnRPYmplY3RUb1NpZ25hbDxXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj4+KGl0ZW1CeUtleVNlYXJjaCkoKTtcbiAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiBbLi4uaXRlbXMsIC4uLml0ZW1zQnlTZWFyY2hdKTtcbiAgICB0aGlzLmNvbmZpZygpPy5zb3J0Py4odGhpcy5pdGVtcygpKTtcbiAgICB0aGlzLnNldEhlaWdodFZpZXdQb3J0KCk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5jaGVja1ZpZXdQb3J0U2Nyb2xsKGNhbGxiYWNrQ2hlY2tTY3JvbGwpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB0aGlzLm91dExvYWRJdGVtc0NvbXBsZXRlLmVtaXQoeyBpdGVtczogdGhpcy5pdGVtcygpLCBwYWdpbmc6IHRoaXMucGFnaW5nU3RvcmUoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9JdGVtU2VsZWN0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ1RlbXBsYXRlVGV4dCgpPy5hdXRvU2Nyb2xsVG9JdGVtU2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lQXV0b1Njcm9sbEl0ZW1TZWxlY3RlZCgpKTtcbiAgICB0aGlzLnRpbWVBdXRvU2Nyb2xsSXRlbVNlbGVjdGVkLnNldCgoc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMua2V5U2VsZWN0ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuaXRlbXMoKS5maW5kSW5kZXgoaXRlbSA9PiBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9PT0gdGhpcy5rZXlTZWxlY3RlZCgpKTtcblxuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBvZmZzZXRDb250YWluZXIgPSAodGhpcy5lbGVtZW50U2Nyb2xsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpPy5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxPZmZzZXQgPSAoKG9mZnNldENvbnRhaW5lciA/IG9mZnNldENvbnRhaW5lciAtIHRoaXMuaGVpZ2h0SXRlbSgpIDogMCkgLyAyKSAqIC0xO1xuXG4gICAgICAgIHRoaXMudmlydHVhbFNjcm9sbGVyQ29tcG9uZW50KCk/LnNjcm9sbFRvSW5kZXgoaW5kZXgsIHRydWUsIGFkZGl0aW9uYWxPZmZzZXQsIHRoaXMudGltZUFuaW1hdGlvblNjcm9sbFRvSW5kZXhJdGVtKCkpO1xuICAgICAgfVxuICAgIH0pIGFzIHVua25vd24pIGFzIG51bWJlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXV0b1NlbGVjdEZpcnN0SXRlbShpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4pIHtcbiAgICBpZiAodGhpcy5hdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZSgpIHx8IHRoaXMua2V5U2VsZWN0ZWQoKSB8fCAhdGhpcy5jb25maWcoKT8uYXV0b1NlbGVjdEZpcnN0SXRlbSB8fCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZXJTZWxlY3RJdGVtKCdjbGljaycsIGl0ZW1zWzBdKCksIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRLZXlTZWxlY3RlZERlZmF1bHRJZkV4aXN0SXRlbShpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4pIHtcbiAgICBjb25zdCBpdGVtID0gaXRlbXMuZmluZChzdG9yZSA9PiBzdG9yZSgpW3RoaXMuZmllbGRLZXkoKV0gPT09IHRoaXMua2V5U2VsZWN0ZWQoKSk7XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0SXRlbSgnY2xpY2snLCBpdGVtKCksIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRMZW5ndGhJdGVtKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMoKS5sZW5ndGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckltYWdlRXJyb3IoZXZlbnQ6IEV2ZW50LCBpdGVtOiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpdGVtLnNwZWNpZmljX2xvYWRJbWdFcnJvciA9IHRydWU7XG4gIH1cbn1cbiIsIkBpZiAoY29uZmlnVGVtcGxhdGVUZXh0KCk7IGFzIGNvbmZpZ1RlbXBsYXRlVGV4dCkge1xuICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgaC1mdWxsIHctZnVsbFwiPlxuICAgIEBpZiAoaXRlbXMoKSAmJiBpdGVtcygpLmxlbmd0aCkge1xuICAgICAgPGRpdiAjZWxlbWVudFNjcm9sbFxuICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cImlzU2hvd0hlaWdodENhbGN1bGF0ZSgpID8gaGVpZ2h0Vmlld1BvcnQoKSsncHgnOicxMDAlJ1wiXG4gICAgICAgIGNsYXNzPVwidy1mdWxsXCJcbiAgICAgICAgW2NsYXNzLmgtZnVsbF09XCIhaXNTaG93SGVpZ2h0Q2FsY3VsYXRlKClcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICAob3V0U2Nyb2xsQm90dG9tKT1cImhhbmRsZXJTY3JvbGxCb3R0b20oKVwiPlxuICAgICAgICBAaWYgKCFjb25maWdUZW1wbGF0ZVRleHQubm90VXNlVmlydHVhbFNjcm9sbCkge1xuICAgICAgICAgIDx2aXJ0dWFsLXNjcm9sbGVyICNzY3JvbGxcbiAgICAgICAgICAgIFtwYXJlbnRTY3JvbGxdPVwiZWxlbWVudFNjcm9sbFwiXG4gICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXMoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImgtZnVsbFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD0nbGlzdFJlZjtjb250ZXh0OntpdGVtc1ZpZXc6c2Nyb2xsLnZpZXdQb3J0SXRlbXN9JyAvPlxuICAgICAgICAgIDwvdmlydHVhbC1zY3JvbGxlcj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlVGV4dC5ub3RVc2VWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD0nbGlzdFJlZjtjb250ZXh0OntpdGVtc1ZpZXc6aXRlbXMoKX0nIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKCghaXRlbXMoKSB8fCAhaXRlbXMoKS5sZW5ndGgpICYmICghY29uZmlnKCk/Lmlnbm9yZVNob3dEYXRhV2hlbk5vdFNlYXJjaCB8fCBrZXlTZWFyY2goKSkpIHtcbiAgICAgIDxkaXYgW2NsYXNzXT1cIidsaWJzLXVpLWZvbnQtaDVyIHRleHQtWyM5Y2EyYWRdICcrIChjb25maWcoKT8udGV4dE5vRGF0YUNsYXNzSW5jbHVkZSA/PyAncHktWzZweF0gcHgtWzE2cHhdJylcIj5cbiAgICAgICAgQGlmICgha2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgIHt7IChjb25maWcoKT8udGV4dE5vRGF0YSA/PyAnaTE4bl9oYXZlX25vX3NlbGVjdGlvbicpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIH1cbiAgICAgICAgQGlmICh0ZW1wbGF0ZVJlZlNlYXJjaE5vRGF0YSgpICYmIGtleVNlYXJjaCgpICYmICFsb2FkaW5nKCkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVSZWZTZWFyY2hOb0RhdGEoKSB8fCBudWxsO2NvbnRleHQ6e2tleVNlYXJjaDprZXlTZWFyY2goKX1cIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoIXRlbXBsYXRlUmVmU2VhcmNoTm9EYXRhKCkgJiYga2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgIHt7IChjb25maWcoKT8udGV4dFNlYXJjaE5vRGF0YSA/PyAnaTE4bl9ub19yZXN1bHQnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICB9XG4gICAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgICAgJm5ic3A7XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zcGlubmVyIFtzaXplXT1cImxvYWRpbmdJY29uU2l6ZSgpIHx8ICdtZWRpdW0nXCIgLz5cbiAgICB9XG4gIDwvZGl2PlxuICA8bmctdGVtcGxhdGUgI2xpc3RSZWZcbiAgICBsZXQtaXRlbXNWaWV3PSdpdGVtc1ZpZXcnPlxuICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXNWaWV3OyB0cmFjayBpdGVtKClbZmllbGRLZXkoKV0pIHtcbiAgICAgIDxkaXYgI2l0ZW1SZWZcbiAgICAgICAgW2NsYXNzXT1cIml0ZW0oKS5jbGFzc0l0ZW1XcmFwcGVyIHx8ICcnXCI+XG4gICAgICAgIDxkaXYgTGlic1VpQ29tcG9uZW50c0xpc3RIaWdobGlnaHRLZXlTZWFyY2hEaXJlY3RpdmVcbiAgICAgICAgICBbaXNIaWdobGlnaHRdPVwiY29uZmlnKCk/LmhpZ2hsaWdodFRleHRTZWFyY2hJblJlc3VsdFwiXG4gICAgICAgICAgW2tleVNlYXJjaF09XCJrZXlTZWFyY2goKVwiXG4gICAgICAgICAgW2NsYXNzXT1cIidsaWJzLXVpLWxpc3QtdGVtcGxhdGUtdGV4dC1pdGVtIGxpYnMtdWktZm9udC1oNXIgZmxleCAnKyhpdGVtKCkuY2xhc3NJdGVtIHx8ICcnKVwiXG4gICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCIhaXRlbSgpLml0ZW1BbGlnblN0YXJ0XCJcbiAgICAgICAgICBbY2xhc3MuaXRlbXMtc3RhcnRdPVwiaXRlbSgpLml0ZW1BbGlnblN0YXJ0XCJcbiAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWhvdmVyLWRhbmdlcl09XCIhY2xpY2tFeGFjdGx5KCkgJiYgaXRlbSgpLmhvdmVyRGFuZ2VyXCJcbiAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWhvdmVyXT1cIiFjbGlja0V4YWN0bHkoKSAgJiYgIWl0ZW0oKS5ob3ZlckRhbmdlclwiXG4gICAgICAgICAgW2NsYXNzLmxpYnMtdWktYmctbGlzdC1hY3RpdmVdPVwiIWNsaWNrRXhhY3RseSgpICYmIGtleVNlbGVjdGVkKCkgPT09IGl0ZW0oKVtmaWVsZEtleSgpXVwiXG4gICAgICAgICAgW2NsYXNzLiFwbC1bMTZweF1dPVwicGFkZGluZ0xlZnRJdGVtKClcIlxuICAgICAgICAgIFtjbGFzcy5iZy1bI2ZmZmZmZl1dPVwiY2xpY2tFeGFjdGx5KClcIlxuICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJnLWxpc3QtaG92ZXItZmZmZmZmXT1cIml0ZW0oKS5kaXNhYmxlXCJcbiAgICAgICAgICBbY2xhc3MuY3Vyc29yLWRlZmF1bHRdPVwiaXRlbSgpLmRpc2FibGVcIlxuICAgICAgICAgIFtjbGFzcy4hcHktWzJweF1dPVwiY2xpY2tFeGFjdGx5KClcIlxuICAgICAgICAgIFtjbGFzcy4hcHItWzQ4cHhdXT1cImtleVNlbGVjdGVkKCkgPT09IGl0ZW0oKVtmaWVsZEtleSgpXSAmJiAoIWNvbmZpZ1RlbXBsYXRlVGV4dD8uaWdub3JlSWNvblNlbGVjdGVkIHx8IGNvbmZpZ1RlbXBsYXRlVGV4dD8uYWN0aW9uU29ydCkmJiAhY29uZmlnVGVtcGxhdGVUZXh0Py5zdHlsZVBhZGRpbmdSaWdodEl0ZW1PdGhlclwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydwb2ludGVyLWV2ZW50cy1ub25lIGxpYnMtdWktZGlzYWJsZSc6bG9hZGluZygpIHx8IGRpc2FibGUoKSB8fCAoKGl0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6a2V5c0Rpc2FibGVJdGVtKCk6a2V5c0Rpc2FibGVJdGVtKCk/Lmxlbmd0aCkgJiYgIWlnbm9yZUNsYXNzRGlzYWJsZURlZmF1bHRXaGVuVXNlS2V5c0Rpc2FibGVJdGVtKCkpfVwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJDbGlja1JlbGF0aXZlKCRldmVudCxpdGVtKCkpXCI+XG4gICAgICAgICAgQGlmICgoaXRlbSgpLmJ1bGxldHxMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUpPy4oKTsgYXMgYnVsbGV0KSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktbGlzdC10ZW1wbGF0ZS10ZXh0LWl0ZW0tYnVsbGV0IGZsZXggZmxleC1zaHJpbmstMFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiYnVsbGV0LmJhY2tncm91bmRDb2xvclwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyU2VsZWN0SXRlbSgkZXZlbnQsaXRlbSgpKVwiPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKChpdGVtKCkuYXZhdGFyQ29uZmlnfExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZSk/LigpOyBhcyBhdmF0YXJDb25maWcpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYXZhdGFyIFt0eXBlU2hhcGVdPVwiYXZhdGFyQ29uZmlnLnR5cGVTaGFwZSA/PyAnY2lyY2xlJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYXZhdGFyQ29uZmlnLmNsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAgIFtjbGFzc0ltYWdlSW5jbHVkZV09XCJhdmF0YXJDb25maWcuY2xhc3NJbWFnZUluY2x1ZGVcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJhdmF0YXJDb25maWcuc2l6ZSA/PyAzMlwiXG4gICAgICAgICAgICAgIFtsaW5rQXZhdGFyXT1cImF2YXRhckNvbmZpZy5saW5rQXZhdGFyXCJcbiAgICAgICAgICAgICAgW2xpbmtBdmF0YXJFcnJvcl09XCJhdmF0YXJDb25maWcubGlua0F2YXRhckVycm9yXCJcbiAgICAgICAgICAgICAgW2lkR2VuQ29sb3JdPVwiYXZhdGFyQ29uZmlnLmlkR2VuQ29sb3JcIlxuICAgICAgICAgICAgICBbdGV4dEF2YXRhcl09XCJhdmF0YXJDb25maWcudGV4dEF2YXRhclwiXG4gICAgICAgICAgICAgIFtjbGFzc0ltYWdlSW5jbHVkZV09XCJhdmF0YXJDb25maWcuY2xhc3NJbWFnZUluY2x1ZGVcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlVGV4dC5nZXRJbWFnZSB8fCBjb25maWdUZW1wbGF0ZVRleHQuZmllbGRHZXRJbWFnZSkge1xuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBbc3JjXT1cImNvbmZpZ1RlbXBsYXRlVGV4dC5nZXRJbWFnZSA/ICgoJ2F2YXRhcicgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOihpdGVtKCkuc3BlY2lmaWNfbG9hZEltZ0Vycm9yICYmIGNvbmZpZ1RlbXBsYXRlVGV4dC5nZXRJbWFnZUVycm9yID8gY29uZmlnVGVtcGxhdGVUZXh0LmdldEltYWdlRXJyb3IgOiBjb25maWdUZW1wbGF0ZVRleHQuZ2V0SW1hZ2UpOml0ZW0oKSkgfCBhc3luYykgOiBpdGVtKClbY29uZmlnVGVtcGxhdGVUZXh0LmZpZWxkR2V0SW1hZ2UgfHwgJyddXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cIidsaWJzLXVpLWxpc3QtdGVtcGxhdGUtdGV4dC1pdGVtLWF2YXRhciAnICsgKGNvbmZpZ1RlbXBsYXRlVGV4dC5jbGFzc0luY2x1ZGVJbWFnZSA/PyAnJylcIlxuICAgICAgICAgICAgICBbY2xhc3Mudy1bMThweF1dPVwiY29uZmlnVGVtcGxhdGVUZXh0LmltZ1R5cGVJY29uXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmgtWzE4cHhdXT1cImNvbmZpZ1RlbXBsYXRlVGV4dC5pbWdUeXBlSWNvblwiXG4gICAgICAgICAgICAgIChlcnJvcik9XCJoYW5kbGVySW1hZ2VFcnJvcigkZXZlbnQsIGl0ZW0oKSlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclNlbGVjdEl0ZW0oJGV2ZW50LGl0ZW0oKSlcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKChpdGVtKCkuYnV0dG9uTGVmdENvbmZpZyB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZSk/LigpOyBhcyBidXR0b25MZWZ0KSB7XG4gICAgICAgICAgICBAaWYgKGl0ZW0oKS5ocmVmQnV0dG9uKSB7XG4gICAgICAgICAgICAgIDxhIFtjbGFzcy53LWZ1bGxdPVwiIWJ1dHRvbkxlZnQuaWdub3JlV2lkdGgxMDBcIlxuICAgICAgICAgICAgICAgIFtocmVmXT1cIml0ZW0oKS5ocmVmQnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbkxlZnRUZW1wbGF0ZVwiIC8+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoIWl0ZW0oKS5ocmVmQnV0dG9uKSB7XG4gICAgICAgICAgICAgIDxkaXYgW2NsYXNzLnctZnVsbF09XCIhYnV0dG9uTGVmdC5pZ25vcmVXaWR0aDEwMFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25MZWZ0VGVtcGxhdGVcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnV0dG9uTGVmdFRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIGNsYXNzPVwidy1mdWxsXCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJidXR0b25MZWZ0LnR5cGUgPz8gJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uTGVmdC5sYWJlbCA/PyAnICdcIlxuICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiYnV0dG9uTGVmdC56SW5kZXhcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbkxlZnQuZGlzYWJsZSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiKGJ1dHRvbkxlZnQuY2xhc3NJY29uTGVmdCA/IChidXR0b25MZWZ0LmNsYXNzSWNvbkxlZnQrJyBmbGV4IG1yLVs4cHhdIHRleHQtWzEycHhdJykgOiAnJylcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiKGJ1dHRvbkxlZnQuY2xhc3NJbmNsdWRlPz8nJykrJyB3LWZ1bGwnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJidXR0b25MZWZ0LmNsYXNzTGFiZWwgPz8gJ2xpYnMtdWktZm9udC1oNHInXCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwiYnV0dG9uTGVmdC5pZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlSWNvbkxlZnRdPVwiYnV0dG9uTGVmdC5zdHlsZUljb25MZWZ0XCJcbiAgICAgICAgICAgICAgICBbc3R5bGVCdXR0b25dPVwiYnV0dG9uTGVmdC5zdHlsZUJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJTZWxlY3RJdGVtKCRldmVudCxpdGVtKCkpXCIgLz5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoKGl0ZW0oKS5zd2l0Y2hDb25maWd8TGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlKT8uKCk7IGFzIHN3aXRjaENvbmZpZykge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zd2l0Y2ggW2FjdGl2ZV09XCJzd2l0Y2hDb25maWcuYWN0aXZlXCJcbiAgICAgICAgICAgICAgKG91dFN3aXRjaCk9XCJoYW5kbGVyU2VsZWN0SXRlbSgnY2xpY2snLGl0ZW0oKSlcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGl0ZW0oKS5jbGFzc0ljb25MZWZ0KSB7XG4gICAgICAgICAgICA8aSBbY2xhc3NdPVwiaXRlbSgpLmNsYXNzSWNvbkxlZnQgKyAnIG1yLVs4cHhdIHRleHQtWzE0cHhdJ1wiPjwvaT5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmICghaXRlbSgpLmlnbm9yZVNob3dGaWVsZExhYmVsICYmICFjb25maWdUZW1wbGF0ZVRleHQucm93cykge1xuICAgICAgICAgICAgQGlmICgoKGl0ZW0oKS5wb3BvdmVyTGFiZWx8TGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlKT8uKCkgfCBMaWJzVWlQaXBlc0NvbnZlcnRTaWduYWxUb09iamVjdFBpcGUpID8/IHt0eXBlOid0ZXh0J307IGFzIHBvcG92ZXJMYWJlbCkge1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwicG9wb3ZlckxhYmVsLnR5cGUgfHwgJ3RleHQnXCJcbiAgICAgICAgICAgICAgICBbZWxlbWVudFJlZkN1c3RvbV09XCJwb3BvdmVyTGFiZWwudHlwZSA9PT0gJ3RleHQnPyB1bmRlZmluZWQ6aXRlbVJlZlwiXG4gICAgICAgICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cInBvcG92ZXJMYWJlbC5pZ25vcmVTaG93UG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgW2NvbmZpZ109XCJwb3BvdmVyTGFiZWwuY29uZmlnID8/IGNvbmZpZ1RlbXBsYXRlVGV4dC5jb25maWdMYWJlbFBvcG92ZXI/LigpID8/IHt9XCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cIml0ZW0oKS5maWVsZExhYmVsXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIml0ZW0oKS5jbGFzc0luY2x1ZGVcIlxuICAgICAgICAgICAgICAgIChvdXRFdmVudCk9XCJoYW5kbGVyU2VsZWN0SXRlbSgkZXZlbnQsaXRlbSgpKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoKGl0ZW0oKS5maWVsZFBvcG92ZXJ8TGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlKT8uKCk7IGFzIHBvcG92ZXIpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBjbGFzcz1cInt7IHBvcG92ZXIuY2xhc3NJbmNsdWRlIH19XCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJwb3BvdmVyLmNvbmZpZ1wiPlxuICAgICAgICAgICAgICBAaWYgKHBvcG92ZXIuZGF0YVZpZXcpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckh0bWxdPVwicG9wb3Zlci5kYXRhVmlldyB8IHRyYW5zbGF0ZVwiPjwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi10b29sdGlwLW91dGxpbmVcIj48L2k+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVUZXh0Py5yb3dzKSB7XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxpc3QtdGVtcGxhdGVzX3Jvd3NcbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwge3sgY29uZmlnVGVtcGxhdGVUZXh0LmNsYXNzUm93c1dyYXBwZXIgfHwgY29uZmlnVGVtcGxhdGVUZXh0LmNsYXNzUm93cyB8fCAnJyB9fVwiXG4gICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW0oKVwiXG4gICAgICAgICAgICAgIFtmaWVsZEtleV09XCJmaWVsZEtleSgpXCJcbiAgICAgICAgICAgICAgW2tleVNlbGVjdGVkXT1cImtleVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICBbY29uZmlnVGVtcGxhdGVdPVwiY29uZmlnVGVtcGxhdGVUZXh0XCJcbiAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9XCJoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG91dEV2ZW50KT1cImhhbmRsZXJTZWxlY3RJdGVtKCRldmVudC5ldmVudCwkZXZlbnQuaXRlbSwkZXZlbnQuYWN0aW9uKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVUZXh0LmdldENvbXBvbmVudE91dGxldCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdDb21wb25lbnRPdXRsZXQ9XCIoaXRlbSgpfExpYnNVaVBpcGVzR2V0VmFsdWVPZk9iamVjdFBpcGU6ZmllbGRLZXkoKTp1bmRlZmluZWQ6dHJ1ZSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6Y29uZmlnVGVtcGxhdGVUZXh0LmdldENvbXBvbmVudE91dGxldDppdGVtKCkpIHwgYXN5bmM7IGlucHV0czoodW5kZWZpbmVkIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpjb25maWdUZW1wbGF0ZVRleHQuZ2V0RGF0YUNvbXBvbmVudE91dGxldDppdGVtKCk6ZmllbGRLZXkoKTp7dmFsdWVJc0VtcHR5OntpdGVtOml0ZW0oKX19KSB8IGFzeW5jXCIgLz5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKGtleVNlbGVjdGVkKCkgPT09IGl0ZW0oKVtmaWVsZEtleSgpXSB8fCAoaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZTptdWx0aUtleVNlbGVjdGVkKCk6bXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGgpICYmICFjb25maWdUZW1wbGF0ZVRleHQuaWdub3JlSWNvblNlbGVjdGVkICYmICFjb25maWdUZW1wbGF0ZVRleHQuYWN0aW9uU29ydCkge1xuICAgICAgICAgICAgPGkgW2NsYXNzXT1cIidsaWJzLXVpLWljb24tY2hlY2sgJysoY29uZmlnVGVtcGxhdGVUZXh0LmNsYXNzSW5jbHVkZUljb25TZWxlY3RlZCB8fCAncmlnaHQtWzEycHhdJylcIj5cbiAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChrZXlTZWxlY3RlZCgpID09PSBpdGVtKClbZmllbGRLZXkoKV0gJiYgY29uZmlnVGVtcGxhdGVUZXh0LmFjdGlvblNvcnQpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWxpc3QtdGVtcGxhdGUtdGV4dC1zb3J0XCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1zb3J0LWFycm93IFtkaXNhYmxlXT1cImxvYWRpbmcoKSB8fCBkaXNhYmxlKCkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgIFttb2RlXT1cImNvbmZpZ1RlbXBsYXRlVGV4dD8uaXRlbVNvcnQ/LigpPy5tb2RlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbZmllbGRTb3J0XT1cIml0ZW0oKVtmaWVsZEtleSgpXVwiXG4gICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyU29ydCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvbmctdGVtcGxhdGU+XG59XG4iXX0=
|