@libs-ui/components-table 0.2.357-13 → 0.2.357-15
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.
|
@@ -787,7 +787,7 @@ export class LibsUiComponentsTableComponent {
|
|
|
787
787
|
clearTimeout(this.timeoutLeaveItem());
|
|
788
788
|
}
|
|
789
789
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
790
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsTableComponent, isStandalone: true, selector: "libs_ui-components-table", inputs: { optimizeTableRenderByOnViewport: { classPropertyName: "optimizeTableRenderByOnViewport", publicName: "optimizeTableRenderByOnViewport", isSignal: true, isRequired: false, transformFunction: null }, timeHighlighNewItem: { classPropertyName: "timeHighlighNewItem", publicName: "timeHighlighNewItem", isSignal: true, isRequired: false, transformFunction: null }, headerLeft: { classPropertyName: "headerLeft", publicName: "headerLeft", isSignal: true, isRequired: false, transformFunction: null }, headerRight: { classPropertyName: "headerRight", publicName: "headerRight", isSignal: true, isRequired: false, transformFunction: null }, ignoreCalculatorWidthHeader: { classPropertyName: "ignoreCalculatorWidthHeader", publicName: "ignoreCalculatorWidthHeader", isSignal: true, isRequired: false, transformFunction: null }, configTemplateItemCollapseExpand: { classPropertyName: "configTemplateItemCollapseExpand", publicName: "configTemplateItemCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, showFooter: { classPropertyName: "showFooter", publicName: "showFooter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderFooter: { classPropertyName: "ignoreBorderFooter", publicName: "ignoreBorderFooter", isSignal: true, isRequired: false, transformFunction: null }, customPositionFooter: { classPropertyName: "customPositionFooter", publicName: "customPositionFooter", isSignal: true, isRequired: false, transformFunction: null }, footerLeft: { classPropertyName: "footerLeft", publicName: "footerLeft", isSignal: true, isRequired: false, transformFunction: null }, footerRight: { classPropertyName: "footerRight", publicName: "footerRight", isSignal: true, isRequired: false, transformFunction: null }, disableCheckbox: { classPropertyName: "disableCheckbox", publicName: "disableCheckbox", isSignal: true, isRequired: false, transformFunction: null }, enableUnequalChildrenSizes: { classPropertyName: "enableUnequalChildrenSizes", publicName: "enableUnequalChildrenSizes", isSignal: true, isRequired: false, transformFunction: null }, bufferAmount: { classPropertyName: "bufferAmount", publicName: "bufferAmount", isSignal: true, isRequired: false, transformFunction: null }, totalItem: { classPropertyName: "totalItem", publicName: "totalItem", isSignal: true, isRequired: false, transformFunction: null }, isDashBorder: { classPropertyName: "isDashBorder", publicName: "isDashBorder", isSignal: true, isRequired: false, transformFunction: null }, classHeaderContainerInclude: { classPropertyName: "classHeaderContainerInclude", publicName: "classHeaderContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classHeaderLeftInclude: { classPropertyName: "classHeaderLeftInclude", publicName: "classHeaderLeftInclude", isSignal: true, isRequired: false, transformFunction: null }, classBodyInclude: { classPropertyName: "classBodyInclude", publicName: "classBodyInclude", isSignal: true, isRequired: false, transformFunction: null }, classFooterInclude: { classPropertyName: "classFooterInclude", publicName: "classFooterInclude", isSignal: true, isRequired: false, transformFunction: null }, classTableContainerInclude: { classPropertyName: "classTableContainerInclude", publicName: "classTableContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classBarInclude: { classPropertyName: "classBarInclude", publicName: "classBarInclude", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, defaultKeysSelected: { classPropertyName: "defaultKeysSelected", publicName: "defaultKeysSelected", isSignal: true, isRequired: false, transformFunction: null }, labelBarNoSelectItem: { classPropertyName: "labelBarNoSelectItem", publicName: "labelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, labelBarButtons: { classPropertyName: "labelBarButtons", publicName: "labelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarButtons: { classPropertyName: "classLabelBarButtons", publicName: "classLabelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, barButtons: { classPropertyName: "barButtons", publicName: "barButtons", isSignal: true, isRequired: false, transformFunction: null }, sortLocal: { classPropertyName: "sortLocal", publicName: "sortLocal", isSignal: true, isRequired: false, transformFunction: null }, filterOrSortLocal: { classPropertyName: "filterOrSortLocal", publicName: "filterOrSortLocal", isSignal: true, isRequired: false, transformFunction: null }, httpRequestData: { classPropertyName: "httpRequestData", publicName: "httpRequestData", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDataFooter: { classPropertyName: "httpRequestDataFooter", publicName: "httpRequestDataFooter", isSignal: true, isRequired: false, transformFunction: null }, newData: { classPropertyName: "newData", publicName: "newData", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBar: { classPropertyName: "ignoreBar", publicName: "ignoreBar", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarNoSelectItem: { classPropertyName: "classLabelBarNoSelectItem", publicName: "classLabelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassBgHeader: { classPropertyName: "ignoreClassBgHeader", publicName: "ignoreClassBgHeader", isSignal: true, isRequired: false, transformFunction: null }, noDataConfig: { classPropertyName: "noDataConfig", publicName: "noDataConfig", isSignal: true, isRequired: false, transformFunction: null }, showScrollTablePinnedIfNoData: { classPropertyName: "showScrollTablePinnedIfNoData", publicName: "showScrollTablePinnedIfNoData", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItemLast: { classPropertyName: "ignoreBorderItemLast", publicName: "ignoreBorderItemLast", isSignal: true, isRequired: false, transformFunction: null }, isHiddenHeaderWhenNodata: { classPropertyName: "isHiddenHeaderWhenNodata", publicName: "isHiddenHeaderWhenNodata", isSignal: true, isRequired: false, transformFunction: null }, maxItemSelected: { classPropertyName: "maxItemSelected", publicName: "maxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, configSelectMoreItem: { classPropertyName: "configSelectMoreItem", publicName: "configSelectMoreItem", isSignal: true, isRequired: false, transformFunction: null }, onlyShowNoResult: { classPropertyName: "onlyShowNoResult", publicName: "onlyShowNoResult", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItem: { classPropertyName: "ignoreBorderItem", publicName: "ignoreBorderItem", isSignal: true, isRequired: false, transformFunction: null }, activityLoadData: { classPropertyName: "activityLoadData", publicName: "activityLoadData", isSignal: true, isRequired: false, transformFunction: null }, paginationSetting: { classPropertyName: "paginationSetting", publicName: "paginationSetting", isSignal: true, isRequired: false, transformFunction: null }, templateNoData: { classPropertyName: "templateNoData", publicName: "templateNoData", isSignal: true, isRequired: false, transformFunction: null }, templateNoResult: { classPropertyName: "templateNoResult", publicName: "templateNoResult", isSignal: true, isRequired: false, transformFunction: null }, autoEmitKeysSelectedWithItems: { classPropertyName: "autoEmitKeysSelectedWithItems", publicName: "autoEmitKeysSelectedWithItems", isSignal: true, isRequired: false, transformFunction: null }, functionGetWidthItem: { classPropertyName: "functionGetWidthItem", publicName: "functionGetWidthItem", isSignal: true, isRequired: false, transformFunction: null }, useScrollMeasureColumn: { classPropertyName: "useScrollMeasureColumn", publicName: "useScrollMeasureColumn", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outLoadMore: "outLoadMore", outScrollIsGone: "outScrollIsGone", outLoading: "outLoading", outSort: "outSort", outClickBarButton: "outClickBarButton", outKeysSelected: "outKeysSelected", outFunctionsControl: "outFunctionsControl", outLoadDataComplete: "outLoadDataComplete", outTotalItem: "outTotalItem", outLoadDataError: "outLoadDataError" }, viewQueries: [{ propertyName: "headerElementRef", first: true, predicate: ["headerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerElementRef", first: true, predicate: ["footerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerLeftElementRef", first: true, predicate: ["footerLeftElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyElementRef", first: true, predicate: ["bodyElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyComponentRef", first: true, predicate: ["bodyComponentRef"], descendants: true, isSignal: true }, { propertyName: "paginationRef", first: true, predicate: LibsUiComponentsPaginationComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select=\"div.libs-ui-table-bar-left\"></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div\n class=\"{{ classLabelBarNoSelectItemCss() }}\"\n [innerHtml]=\"labelBarNoSelectItem() | translate: { value: totalItemDisplay() }\"></div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single\n [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate: { value: keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent: false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude: '!w-[121px]',\n position: {\n mode: 'start',\n distance: 0,\n },\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{ config: { content: 'i18n_more_select' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons(); track button) {\n @let constHtmlLabel = button.label || ' ';\n <libs_ui-components-buttons-button\n [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"constHtmlLabel | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select=\"div.libs-ui-table-bar-right\"></ng-content>\n </div>\n }\n\n <div\n #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]=\"!ignoreBar()\"\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div\n class=\"relative w-full shrink-0\"\n [style.height.px]=\"headerElementRef.offsetHeight\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\">\n <div\n #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{ scrollbarWidth: 0 }\"\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class]=\"classHeaderContainer()\"\n (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\"\n (mouseleave)=\"handlerMouseLeaveHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\n @for (header of headerLeft(); track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef; context: { headerItem: header, isHeaderLeft: true }\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @let constHtmlFunctionGetWidthItem = functionGetWidthItem();\n @if (useScrollMeasureColumn() && constHtmlFunctionGetWidthItem) {\n <div\n class=\"flex w-full h-full relative\"\n LibsUiScrollMeasureItemDirectionHorizontalDirective\n [elementScroll]=\"headerElementRef\"\n [items]=\"headerRight()\"\n [functionGetWidthItem]=\"constHtmlFunctionGetWidthItem\"\n (outViewPortItem)=\"handlerOutViewPortItemHeaderRight($event)\"\n (outPaddingLeft)=\"handlerOutPaddingLeftHeaderRight($event)\">\n @for (header of headerRightViewPort(); track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef; context: { headerItem: header, isHeaderLeft: false }\" />\n }\n </div>\n } @else {\n @for (header of headerRight(); track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef; context: { headerItem: header, isHeaderLeft: false }\" />\n }\n }\n }\n </div>\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet=\"templateFooterRef\" />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n <div\n #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n @if (items().length) {\n <virtual-scroller\n #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth : undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems; track data()) {\n @let constHtmlIsHightLightItem = data | LibsUiTableCheckItemHightLightPipe: itemsHightLight();\n <div\n #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"constHtmlIsHightLightItem\"\n [class.libs-ui-border-top-1px-36d3d3]=\"constHtmlIsHightLightItem && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"constHtmlIsHightLightItem && !ignoreBorderItem()\"\n [ngClass]=\"\n constHtmlIsHightLightItem || ($last && ignoreBorderItemLast())\n ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px'\n : ignoreBorderItem()\n ? ''\n : isDashBorder()\n ? 'libs-ui-border-bottom-dashed-general'\n : 'libs-ui-border-bottom-general'\n \"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !constHtmlIsHightLightItem\"\n (mouseenter)=\"setIndexHover($event, data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div\n class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!constHtmlIsHightLightItem\"\n [class.bg-[#f3fcfc]]=\"constHtmlIsHightLightItem\">\n @for (header of headerLeft(); track header) {\n <div\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !constHtmlIsHightLightItem\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef; context: { header: header, data: data, constHtmlIsHightLightItem: constHtmlIsHightLightItem }\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @if (useScrollMeasureColumn()) {\n <div\n class=\"flex w-full min-w-0\"\n [style.padding-left.px]=\"paddingLeftHeaderRight()\">\n @for (header of headerRightViewPort(); track header) {\n <div\n class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef; context: { header: header, data: data, constHtmlIsHightLightItem: constHtmlIsHightLightItem }\" />\n </div>\n }\n </div>\n } @else {\n @for (header of headerRight(); track header) {\n <div\n class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef; context: { header: header, data: data, constHtmlIsHightLightItem: constHtmlIsHightLightItem }\" />\n </div>\n }\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand'](); track dataExpand) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"dataExpand\"\n [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"dataExpand\"\n [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-[calc(100%-10px)] w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n @if (showScrollTablePinnedIfNoData()) {\n <div\n class=\"absolute h-[1px] bg-transparent top-0 left-0 z-[1]\"\n [style.width.px]=\"headerElementRef.scrollWidth\"></div>\n }\n }\n </div>\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet=\"templateFooterRef\" />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n\n @if (activityLoadData() === 'click-pagination') {\n <div class=\"flex w-full mt-[12px]\">\n <libs_ui-components-pagination\n [modeDisplayTotalPageAndGotoPage]=\"paginationConfig().modeDisplayTotalPageAndGotoPage\"\n [classDisplayTotalPageAndGotoPage]=\"paginationConfig().classDisplayTotalPageAndGotoPage\"\n [classIncludeItem]=\"paginationConfig().classIncludeItem\"\n [classIncludeContainer]=\"paginationConfig().classIncludeContainer\"\n [disable]=\"paginationConfig().disable\"\n [numberPageDisplay]=\"paginationConfig().numberPageDisplay\"\n [firstPageStartNumber]=\"paginationConfig().firstPageStartNumber\"\n [showTotalPage]=\"paginationConfig().showTotalPage\"\n [showInputGotoPage]=\"paginationConfig().showInputGotoPage\"\n [totalItems]=\"pagingTotalItems()\"\n [perPage]=\"pagingPerPage()\"\n [currentPage]=\"pagingCurrentPage()\"\n (outPageSelect)=\"handlerChangePage($event)\" />\n </div>\n }\n </div>\n</div>\n\n<ng-template\n #templateHeaderRef\n let-header=\"headerItem\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n [class]=\"'relative flex ' + (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ') + ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]=\"!header.ignorePyDefault\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef; context: { headerItem: header, isColRender: false, isHeaderLeft: isHeaderLeft }\" />\n }\n @if (header.rowsConfig; as rowsConfig) {\n @for (row of rowsConfig.rows; track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef; context: { headerItem: col, isColRender: true, isHeaderLeft: isHeaderLeft }\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template\n #templateHeaderContentRef\n let-header=\"headerItem\"\n let-isColRender=\"isColRender\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n #itemHeaderRef\n class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]=\"header.contentHeaderAlignCenter ?? true\"\n [class.justify-end]=\"header.contentHeaderJustifyContentEnd\"\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"\n isColRender\n ? (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n : {}\n \"\n [ngClass]=\"isColRender ? header.ngClass || {} : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div\n class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single\n [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\"></div>\n }\n }\n @for (tooltip of header.tooltipsLeft; track tooltip) {\n <div class=\"mr-[4px]\">\n @let constHtmlTooltip = tooltip.dataView || ' ';\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: constHtmlTooltip | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\n }\n \"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if (header.label | LibsUiPipesCallFunctionInTemplatePipe: header.parseValue : header | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover\n [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"header?.labelConfig?.classInclude || ''\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || { content: labelHeaderColumn }\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @for (tooltip of header.tooltipsRight; track tooltip) {\n <div class=\"ml-[4px]\">\n @let constHtmlTooltip = tooltip.dataView || ' ';\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: constHtmlTooltip | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\n }\n \"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow\n [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{ content: header.labelDescription.content | translate }\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template\n #templateBodyRef\n let-header=\"header\"\n let-data=\"data\"\n let-constHtmlIsHightLightItem=\"constHtmlIsHightLightItem\">\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div\n class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden && (data() | LibsUiPipesCallFunctionInTemplatePipe: header.checkConditionCheckBoxHidden : data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single\n [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe: keysSelected() : keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe: keysSelected() : keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event, data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe: getIndexRow | async\"></div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n @let constHtmlIsHover = itemOfIndexHover === data && !constHtmlIsHightLightItem;\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [isHover]=\"constHtmlIsHover\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"header.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [isHover]=\"constHtmlIsHover\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div\n #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '' : customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general' : 'libs-ui-table-shadow-top libs-ui-border-top-general' }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div\n #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft(); track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : footerLeft() : footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"footer.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n }\n </div>\n }\n </div>\n }\n @if (footerRight(); as footerRightList) {\n @let constHtmlFunctionGetWidthItemFooter = functionGetWidthItem();\n @if (useScrollMeasureColumn() && constHtmlFunctionGetWidthItemFooter) {\n <div\n class=\"flex h-full w-full relative\"\n LibsUiScrollMeasureItemDirectionHorizontalDirective\n [elementScroll]=\"footerElementRef\"\n [items]=\"footerRightList\"\n [functionGetWidthItem]=\"constHtmlFunctionGetWidthItemFooter\"\n (outViewPortItem)=\"handlerOutViewPortItemFooterRight($event)\">\n @for (footer of footerRightViewPort(); track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : footerLeft() : footerRightList) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"footer.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n }\n </div>\n }\n </div>\n } @else {\n @for (footer of footerRightList; track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : footerLeft() : footerRightList) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"footer.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n }\n </div>\n }\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (keySearch() || onlyShowNoResult()) {\n @if (templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n } @else {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\">\n <ng-container *ngComponentOutlet=\"'no-result' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"noDataConfig().ngStyle\"\n [ngClass]=\"noDataConfig().ngClass\"\n [innerHtml]=\"noDataSearchText() | translate\"></div>\n </div>\n </div>\n }\n } @else {\n @if (templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n } @else {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\">\n <ng-container *ngComponentOutlet=\"'no-data' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"noDataConfig().ngStyle\"\n [ngClass]=\"noDataConfig().ngClass\"\n [innerHtml]=\"noDataText() | translate\"></div>\n </div>\n </div>\n }\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: VirtualScrollerModule }, { kind: "component", type: i2.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: "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: "pipe", type: LibsUiPipesConvertObjectToSignalPipe, name: "LibsUiPipesConvertObjectToSignalPipe" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsSortArrowComponent, selector: "libs_ui-components-buttons-sort-arrow", inputs: ["size", "mode", "fieldSort", "disable", "ignorePopoverContent", "popoverContentAsc", "popoverContentDesc", "defaultMode", "zIndex"], outputs: ["modeChange", "outChange"] }, { kind: "component", type: LibsUiComponentsPaginationComponent, selector: "libs_ui-components-pagination", inputs: ["showTotalPage", "showInputGotoPage", "modeDisplayTotalPageAndGotoPage", "classDisplayTotalPageAndGotoPage", "classIncludeContainer", "classIncludeItem", "disable", "numberPageDisplay", "totalItems", "perPage", "firstPageStartNumber", "currentPage"], outputs: ["currentPageChange", "outPageSelect"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder", "dataComponentOutlet", "componentOutlet"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "pipe", type: LibsUiTableCalculatorColumnPipe, name: "LibsUiTableCalculatorColumnPipe" }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiIconsGetIconComponentPipe, name: "LibsUiIconsGetIconComponentPipe" }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesCheckSelectedByKeyPipe, name: "LibsUiPipesCheckSelectedByKeyPipe" }, { kind: "pipe", type: LibsUiTableCheckItemHightLightPipe, name: "LibsUiTableCheckItemHightLightPipe" }, { kind: "directive", type: LibsUiScrollMeasureItemDirectionHorizontalDirective, selector: "[LibsUiScrollMeasureItemDirectionHorizontalDirective]", inputs: ["elementScroll", "functionGetWidthItem", "items"], outputs: ["outViewPortItem", "outFunctionControl", "outDivVirtual", "outPaddingLeft"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [LibsUiComponentsTableTemplatesComponent], () => [LibsUiComponentsTableTemplatesComponent], () => [LibsUiComponentsTableTemplatesComponent,
|
|
790
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsTableComponent, isStandalone: true, selector: "libs_ui-components-table", inputs: { optimizeTableRenderByOnViewport: { classPropertyName: "optimizeTableRenderByOnViewport", publicName: "optimizeTableRenderByOnViewport", isSignal: true, isRequired: false, transformFunction: null }, timeHighlighNewItem: { classPropertyName: "timeHighlighNewItem", publicName: "timeHighlighNewItem", isSignal: true, isRequired: false, transformFunction: null }, headerLeft: { classPropertyName: "headerLeft", publicName: "headerLeft", isSignal: true, isRequired: false, transformFunction: null }, headerRight: { classPropertyName: "headerRight", publicName: "headerRight", isSignal: true, isRequired: false, transformFunction: null }, ignoreCalculatorWidthHeader: { classPropertyName: "ignoreCalculatorWidthHeader", publicName: "ignoreCalculatorWidthHeader", isSignal: true, isRequired: false, transformFunction: null }, configTemplateItemCollapseExpand: { classPropertyName: "configTemplateItemCollapseExpand", publicName: "configTemplateItemCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, showFooter: { classPropertyName: "showFooter", publicName: "showFooter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderFooter: { classPropertyName: "ignoreBorderFooter", publicName: "ignoreBorderFooter", isSignal: true, isRequired: false, transformFunction: null }, customPositionFooter: { classPropertyName: "customPositionFooter", publicName: "customPositionFooter", isSignal: true, isRequired: false, transformFunction: null }, footerLeft: { classPropertyName: "footerLeft", publicName: "footerLeft", isSignal: true, isRequired: false, transformFunction: null }, footerRight: { classPropertyName: "footerRight", publicName: "footerRight", isSignal: true, isRequired: false, transformFunction: null }, disableCheckbox: { classPropertyName: "disableCheckbox", publicName: "disableCheckbox", isSignal: true, isRequired: false, transformFunction: null }, enableUnequalChildrenSizes: { classPropertyName: "enableUnequalChildrenSizes", publicName: "enableUnequalChildrenSizes", isSignal: true, isRequired: false, transformFunction: null }, bufferAmount: { classPropertyName: "bufferAmount", publicName: "bufferAmount", isSignal: true, isRequired: false, transformFunction: null }, totalItem: { classPropertyName: "totalItem", publicName: "totalItem", isSignal: true, isRequired: false, transformFunction: null }, isDashBorder: { classPropertyName: "isDashBorder", publicName: "isDashBorder", isSignal: true, isRequired: false, transformFunction: null }, classHeaderContainerInclude: { classPropertyName: "classHeaderContainerInclude", publicName: "classHeaderContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classHeaderLeftInclude: { classPropertyName: "classHeaderLeftInclude", publicName: "classHeaderLeftInclude", isSignal: true, isRequired: false, transformFunction: null }, classBodyInclude: { classPropertyName: "classBodyInclude", publicName: "classBodyInclude", isSignal: true, isRequired: false, transformFunction: null }, classFooterInclude: { classPropertyName: "classFooterInclude", publicName: "classFooterInclude", isSignal: true, isRequired: false, transformFunction: null }, classTableContainerInclude: { classPropertyName: "classTableContainerInclude", publicName: "classTableContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classBarInclude: { classPropertyName: "classBarInclude", publicName: "classBarInclude", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, defaultKeysSelected: { classPropertyName: "defaultKeysSelected", publicName: "defaultKeysSelected", isSignal: true, isRequired: false, transformFunction: null }, labelBarNoSelectItem: { classPropertyName: "labelBarNoSelectItem", publicName: "labelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, labelBarButtons: { classPropertyName: "labelBarButtons", publicName: "labelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarButtons: { classPropertyName: "classLabelBarButtons", publicName: "classLabelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, barButtons: { classPropertyName: "barButtons", publicName: "barButtons", isSignal: true, isRequired: false, transformFunction: null }, sortLocal: { classPropertyName: "sortLocal", publicName: "sortLocal", isSignal: true, isRequired: false, transformFunction: null }, filterOrSortLocal: { classPropertyName: "filterOrSortLocal", publicName: "filterOrSortLocal", isSignal: true, isRequired: false, transformFunction: null }, httpRequestData: { classPropertyName: "httpRequestData", publicName: "httpRequestData", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDataFooter: { classPropertyName: "httpRequestDataFooter", publicName: "httpRequestDataFooter", isSignal: true, isRequired: false, transformFunction: null }, newData: { classPropertyName: "newData", publicName: "newData", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBar: { classPropertyName: "ignoreBar", publicName: "ignoreBar", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarNoSelectItem: { classPropertyName: "classLabelBarNoSelectItem", publicName: "classLabelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassBgHeader: { classPropertyName: "ignoreClassBgHeader", publicName: "ignoreClassBgHeader", isSignal: true, isRequired: false, transformFunction: null }, noDataConfig: { classPropertyName: "noDataConfig", publicName: "noDataConfig", isSignal: true, isRequired: false, transformFunction: null }, showScrollTablePinnedIfNoData: { classPropertyName: "showScrollTablePinnedIfNoData", publicName: "showScrollTablePinnedIfNoData", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItemLast: { classPropertyName: "ignoreBorderItemLast", publicName: "ignoreBorderItemLast", isSignal: true, isRequired: false, transformFunction: null }, isHiddenHeaderWhenNodata: { classPropertyName: "isHiddenHeaderWhenNodata", publicName: "isHiddenHeaderWhenNodata", isSignal: true, isRequired: false, transformFunction: null }, maxItemSelected: { classPropertyName: "maxItemSelected", publicName: "maxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, configSelectMoreItem: { classPropertyName: "configSelectMoreItem", publicName: "configSelectMoreItem", isSignal: true, isRequired: false, transformFunction: null }, onlyShowNoResult: { classPropertyName: "onlyShowNoResult", publicName: "onlyShowNoResult", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItem: { classPropertyName: "ignoreBorderItem", publicName: "ignoreBorderItem", isSignal: true, isRequired: false, transformFunction: null }, activityLoadData: { classPropertyName: "activityLoadData", publicName: "activityLoadData", isSignal: true, isRequired: false, transformFunction: null }, paginationSetting: { classPropertyName: "paginationSetting", publicName: "paginationSetting", isSignal: true, isRequired: false, transformFunction: null }, templateNoData: { classPropertyName: "templateNoData", publicName: "templateNoData", isSignal: true, isRequired: false, transformFunction: null }, templateNoResult: { classPropertyName: "templateNoResult", publicName: "templateNoResult", isSignal: true, isRequired: false, transformFunction: null }, autoEmitKeysSelectedWithItems: { classPropertyName: "autoEmitKeysSelectedWithItems", publicName: "autoEmitKeysSelectedWithItems", isSignal: true, isRequired: false, transformFunction: null }, functionGetWidthItem: { classPropertyName: "functionGetWidthItem", publicName: "functionGetWidthItem", isSignal: true, isRequired: false, transformFunction: null }, useScrollMeasureColumn: { classPropertyName: "useScrollMeasureColumn", publicName: "useScrollMeasureColumn", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outLoadMore: "outLoadMore", outScrollIsGone: "outScrollIsGone", outLoading: "outLoading", outSort: "outSort", outClickBarButton: "outClickBarButton", outKeysSelected: "outKeysSelected", outFunctionsControl: "outFunctionsControl", outLoadDataComplete: "outLoadDataComplete", outTotalItem: "outTotalItem", outLoadDataError: "outLoadDataError" }, viewQueries: [{ propertyName: "headerElementRef", first: true, predicate: ["headerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerElementRef", first: true, predicate: ["footerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerLeftElementRef", first: true, predicate: ["footerLeftElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyElementRef", first: true, predicate: ["bodyElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyComponentRef", first: true, predicate: ["bodyComponentRef"], descendants: true, isSignal: true }, { propertyName: "paginationRef", first: true, predicate: LibsUiComponentsPaginationComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col w-full h-full\">\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select=\"div.libs-ui-table-bar-left\"></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div\n class=\"{{ classLabelBarNoSelectItemCss() }}\"\n [innerHtml]=\"labelBarNoSelectItem() | translate: { value: totalItemDisplay() }\"></div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single\n [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate: { value: keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent: false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude: '!w-[121px]',\n position: {\n mode: 'start',\n distance: 0,\n },\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{ config: { content: 'i18n_more_select' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons(); track button) {\n @let constHtmlLabel = button.label || ' ';\n <libs_ui-components-buttons-button\n [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"constHtmlLabel | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select=\"div.libs-ui-table-bar-right\"></ng-content>\n </div>\n }\n\n <div\n #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]=\"!ignoreBar()\"\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div\n class=\"relative w-full shrink-0\"\n [style.height.px]=\"headerElementRef.offsetHeight\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\">\n <div\n #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{ scrollbarWidth: 0 }\"\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class]=\"classHeaderContainer()\"\n (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\"\n (mouseleave)=\"handlerMouseLeaveHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\n @for (header of headerLeft(); track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef; context: { headerItem: header, isHeaderLeft: true }\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @let constHtmlFunctionGetWidthItem = functionGetWidthItem();\n @if (useScrollMeasureColumn() && constHtmlFunctionGetWidthItem) {\n <div\n class=\"flex w-full h-full relative\"\n LibsUiScrollMeasureItemDirectionHorizontalDirective\n [elementScroll]=\"headerElementRef\"\n [items]=\"headerRight()\"\n [functionGetWidthItem]=\"constHtmlFunctionGetWidthItem\"\n (outViewPortItem)=\"handlerOutViewPortItemHeaderRight($event)\"\n (outPaddingLeft)=\"handlerOutPaddingLeftHeaderRight($event)\">\n @for (header of headerRightViewPort(); track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef; context: { headerItem: header, isHeaderLeft: false }\" />\n }\n </div>\n } @else {\n @for (header of headerRight(); track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef; context: { headerItem: header, isHeaderLeft: false }\" />\n }\n }\n }\n </div>\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet=\"templateFooterRef\" />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n <div\n #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n @if (items().length) {\n <virtual-scroller\n #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth : undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems; track data()) {\n @let constHtmlIsHightLightItem = data | LibsUiTableCheckItemHightLightPipe: itemsHightLight();\n <div\n #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"constHtmlIsHightLightItem\"\n [class.libs-ui-border-top-1px-36d3d3]=\"constHtmlIsHightLightItem && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"constHtmlIsHightLightItem && !ignoreBorderItem()\"\n [ngClass]=\"\n constHtmlIsHightLightItem || ($last && ignoreBorderItemLast())\n ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px'\n : ignoreBorderItem()\n ? ''\n : isDashBorder()\n ? 'libs-ui-border-bottom-dashed-general'\n : 'libs-ui-border-bottom-general'\n \"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !constHtmlIsHightLightItem\"\n (mouseenter)=\"setIndexHover($event, data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div\n class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!constHtmlIsHightLightItem\"\n [class.bg-[#f3fcfc]]=\"constHtmlIsHightLightItem\">\n @for (header of headerLeft(); track header) {\n <div\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !constHtmlIsHightLightItem\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef; context: { header: header, data: data, constHtmlIsHightLightItem: constHtmlIsHightLightItem }\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @if (useScrollMeasureColumn()) {\n <div\n class=\"flex w-full min-w-0\"\n [style.padding-left.px]=\"paddingLeftHeaderRight()\">\n @for (header of headerRightViewPort(); track header) {\n <div\n class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef; context: { header: header, data: data, constHtmlIsHightLightItem: constHtmlIsHightLightItem }\" />\n </div>\n }\n </div>\n } @else {\n @for (header of headerRight(); track header) {\n <div\n class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef; context: { header: header, data: data, constHtmlIsHightLightItem: constHtmlIsHightLightItem }\" />\n </div>\n }\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand'](); track dataExpand) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"dataExpand\"\n [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"dataExpand\"\n [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-[calc(100%-10px)] w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n @if (showScrollTablePinnedIfNoData()) {\n <div\n class=\"absolute h-[1px] bg-transparent top-0 left-0 z-[1]\"\n [style.width.px]=\"headerElementRef.scrollWidth\"></div>\n }\n }\n </div>\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet=\"templateFooterRef\" />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n\n @if (activityLoadData() === 'click-pagination') {\n <div class=\"flex w-full mt-[12px]\">\n <libs_ui-components-pagination\n [modeDisplayTotalPageAndGotoPage]=\"paginationConfig().modeDisplayTotalPageAndGotoPage\"\n [classDisplayTotalPageAndGotoPage]=\"paginationConfig().classDisplayTotalPageAndGotoPage\"\n [classIncludeItem]=\"paginationConfig().classIncludeItem\"\n [classIncludeContainer]=\"paginationConfig().classIncludeContainer\"\n [disable]=\"paginationConfig().disable\"\n [numberPageDisplay]=\"paginationConfig().numberPageDisplay\"\n [firstPageStartNumber]=\"paginationConfig().firstPageStartNumber\"\n [showTotalPage]=\"paginationConfig().showTotalPage\"\n [showInputGotoPage]=\"paginationConfig().showInputGotoPage\"\n [totalItems]=\"pagingTotalItems()\"\n [perPage]=\"pagingPerPage()\"\n [currentPage]=\"pagingCurrentPage()\"\n (outPageSelect)=\"handlerChangePage($event)\" />\n </div>\n }\n </div>\n</div>\n\n<ng-template\n #templateHeaderRef\n let-header=\"headerItem\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n [class]=\"'relative flex ' + (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ') + ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]=\"!header.ignorePyDefault\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef; context: { headerItem: header, isColRender: false, isHeaderLeft: isHeaderLeft }\" />\n }\n @if (header.rowsConfig; as rowsConfig) {\n @for (row of rowsConfig.rows; track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef; context: { headerItem: col, isColRender: true, isHeaderLeft: isHeaderLeft }\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template\n #templateHeaderContentRef\n let-header=\"headerItem\"\n let-isColRender=\"isColRender\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n #itemHeaderRef\n class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]=\"header.contentHeaderAlignCenter ?? true\"\n [class.justify-end]=\"header.contentHeaderJustifyContentEnd\"\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"\n isColRender\n ? (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n : {}\n \"\n [ngClass]=\"isColRender ? header.ngClass || {} : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div\n class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single\n [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\"></div>\n }\n }\n @for (tooltip of header.tooltipsLeft; track tooltip) {\n <div class=\"mr-[4px]\">\n @let constHtmlTooltip = tooltip.dataView || ' ';\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: constHtmlTooltip | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\n }\n \"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if (header.label | LibsUiPipesCallFunctionInTemplatePipe: header.parseValue : header | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover\n [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"header?.labelConfig?.classInclude || ''\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || { content: labelHeaderColumn }\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @for (tooltip of header.tooltipsRight; track tooltip) {\n <div class=\"ml-[4px]\">\n @let constHtmlTooltip = tooltip.dataView || ' ';\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: constHtmlTooltip | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\n }\n \"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow\n [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{ content: header.labelDescription.content | translate }\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template\n #templateBodyRef\n let-header=\"header\"\n let-data=\"data\"\n let-constHtmlIsHightLightItem=\"constHtmlIsHightLightItem\">\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div\n class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden && (data() | LibsUiPipesCallFunctionInTemplatePipe: header.checkConditionCheckBoxHidden : data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single\n [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe: keysSelected() : keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe: keysSelected() : keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event, data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe: getIndexRow | async\"></div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n @let constHtmlIsHover = itemOfIndexHover === data && !constHtmlIsHightLightItem;\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [isHover]=\"constHtmlIsHover\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"header.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [isHover]=\"constHtmlIsHover\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div\n #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '' : customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general' : 'libs-ui-table-shadow-top libs-ui-border-top-general' }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div\n #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft(); track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : footerLeft() : footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"footer.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n }\n </div>\n }\n </div>\n }\n @if (footerRight(); as footerRightList) {\n @let constHtmlFunctionGetWidthItemFooter = functionGetWidthItem();\n @if (useScrollMeasureColumn() && constHtmlFunctionGetWidthItemFooter) {\n <div\n class=\"flex h-full w-full relative\"\n LibsUiScrollMeasureItemDirectionHorizontalDirective\n [elementScroll]=\"footerElementRef\"\n [items]=\"footerRightList\"\n [functionGetWidthItem]=\"constHtmlFunctionGetWidthItemFooter\"\n (outViewPortItem)=\"handlerOutViewPortItemFooterRight($event)\">\n @for (footer of footerRightViewPort(); track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : footerLeft() : footerRightList) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"footer.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n }\n </div>\n }\n </div>\n } @else {\n @for (footer of footerRightList; track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : footerLeft() : footerRightList) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"footer.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n }\n </div>\n }\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (keySearch() || onlyShowNoResult()) {\n @if (templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n } @else {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\">\n <ng-container *ngComponentOutlet=\"'no-result' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"noDataConfig().ngStyle\"\n [ngClass]=\"noDataConfig().ngClass\"\n [innerHtml]=\"noDataSearchText() | translate\"></div>\n </div>\n </div>\n }\n } @else {\n @if (templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n } @else {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\">\n <ng-container *ngComponentOutlet=\"'no-data' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"noDataConfig().ngStyle\"\n [ngClass]=\"noDataConfig().ngClass\"\n [innerHtml]=\"noDataText() | translate\"></div>\n </div>\n </div>\n }\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: VirtualScrollerModule }, { kind: "component", type: i2.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: "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: "pipe", type: LibsUiPipesConvertObjectToSignalPipe, name: "LibsUiPipesConvertObjectToSignalPipe" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "onlyEmitMultiKeyWhenManualClick", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsSortArrowComponent, selector: "libs_ui-components-buttons-sort-arrow", inputs: ["size", "mode", "fieldSort", "disable", "ignorePopoverContent", "popoverContentAsc", "popoverContentDesc", "defaultMode", "zIndex"], outputs: ["modeChange", "outChange"] }, { kind: "component", type: LibsUiComponentsPaginationComponent, selector: "libs_ui-components-pagination", inputs: ["showTotalPage", "showInputGotoPage", "modeDisplayTotalPageAndGotoPage", "classDisplayTotalPageAndGotoPage", "classIncludeContainer", "classIncludeItem", "disable", "numberPageDisplay", "totalItems", "perPage", "firstPageStartNumber", "currentPage"], outputs: ["currentPageChange", "outPageSelect"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder", "dataComponentOutlet", "componentOutlet"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "pipe", type: LibsUiTableCalculatorColumnPipe, name: "LibsUiTableCalculatorColumnPipe" }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiIconsGetIconComponentPipe, name: "LibsUiIconsGetIconComponentPipe" }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesCheckSelectedByKeyPipe, name: "LibsUiPipesCheckSelectedByKeyPipe" }, { kind: "pipe", type: LibsUiTableCheckItemHightLightPipe, name: "LibsUiTableCheckItemHightLightPipe" }, { kind: "directive", type: LibsUiScrollMeasureItemDirectionHorizontalDirective, selector: "[LibsUiScrollMeasureItemDirectionHorizontalDirective]", inputs: ["elementScroll", "functionGetWidthItem", "items"], outputs: ["outViewPortItem", "outFunctionControl", "outDivVirtual", "outPaddingLeft"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [LibsUiComponentsTableTemplatesComponent], () => [LibsUiComponentsTableTemplatesComponent], () => [LibsUiComponentsTableTemplatesComponent,
|
|
791
791
|
LibsUiPipesConvertObjectToSignalPipe], () => [LibsUiComponentsTableTemplatesComponent,
|
|
792
792
|
LibsUiPipesConvertObjectToSignalPipe], () => [LibsUiComponentsTableTemplatesComponent,
|
|
793
793
|
LibsUiPipesConvertObjectToSignalPipe]] });
|
|
@@ -820,4 +820,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
820
820
|
LibsUiScrollMeasureItemDirectionHorizontalDirective,
|
|
821
821
|
], template: "<div class=\"flex flex-col w-full h-full\">\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select=\"div.libs-ui-table-bar-left\"></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div\n class=\"{{ classLabelBarNoSelectItemCss() }}\"\n [innerHtml]=\"labelBarNoSelectItem() | translate: { value: totalItemDisplay() }\"></div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single\n [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate: { value: keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent: false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude: '!w-[121px]',\n position: {\n mode: 'start',\n distance: 0,\n },\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{ config: { content: 'i18n_more_select' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons(); track button) {\n @let constHtmlLabel = button.label || ' ';\n <libs_ui-components-buttons-button\n [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"constHtmlLabel | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select=\"div.libs-ui-table-bar-right\"></ng-content>\n </div>\n }\n\n <div\n #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]=\"!ignoreBar()\"\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div\n class=\"relative w-full shrink-0\"\n [style.height.px]=\"headerElementRef.offsetHeight\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\">\n <div\n #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{ scrollbarWidth: 0 }\"\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class]=\"classHeaderContainer()\"\n (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\"\n (mouseleave)=\"handlerMouseLeaveHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\n @for (header of headerLeft(); track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef; context: { headerItem: header, isHeaderLeft: true }\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @let constHtmlFunctionGetWidthItem = functionGetWidthItem();\n @if (useScrollMeasureColumn() && constHtmlFunctionGetWidthItem) {\n <div\n class=\"flex w-full h-full relative\"\n LibsUiScrollMeasureItemDirectionHorizontalDirective\n [elementScroll]=\"headerElementRef\"\n [items]=\"headerRight()\"\n [functionGetWidthItem]=\"constHtmlFunctionGetWidthItem\"\n (outViewPortItem)=\"handlerOutViewPortItemHeaderRight($event)\"\n (outPaddingLeft)=\"handlerOutPaddingLeftHeaderRight($event)\">\n @for (header of headerRightViewPort(); track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef; context: { headerItem: header, isHeaderLeft: false }\" />\n }\n </div>\n } @else {\n @for (header of headerRight(); track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef; context: { headerItem: header, isHeaderLeft: false }\" />\n }\n }\n }\n </div>\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet=\"templateFooterRef\" />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n <div\n #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n @if (items().length) {\n <virtual-scroller\n #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth : undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems; track data()) {\n @let constHtmlIsHightLightItem = data | LibsUiTableCheckItemHightLightPipe: itemsHightLight();\n <div\n #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"constHtmlIsHightLightItem\"\n [class.libs-ui-border-top-1px-36d3d3]=\"constHtmlIsHightLightItem && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"constHtmlIsHightLightItem && !ignoreBorderItem()\"\n [ngClass]=\"\n constHtmlIsHightLightItem || ($last && ignoreBorderItemLast())\n ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px'\n : ignoreBorderItem()\n ? ''\n : isDashBorder()\n ? 'libs-ui-border-bottom-dashed-general'\n : 'libs-ui-border-bottom-general'\n \"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !constHtmlIsHightLightItem\"\n (mouseenter)=\"setIndexHover($event, data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div\n class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!constHtmlIsHightLightItem\"\n [class.bg-[#f3fcfc]]=\"constHtmlIsHightLightItem\">\n @for (header of headerLeft(); track header) {\n <div\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !constHtmlIsHightLightItem\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef; context: { header: header, data: data, constHtmlIsHightLightItem: constHtmlIsHightLightItem }\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @if (useScrollMeasureColumn()) {\n <div\n class=\"flex w-full min-w-0\"\n [style.padding-left.px]=\"paddingLeftHeaderRight()\">\n @for (header of headerRightViewPort(); track header) {\n <div\n class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef; context: { header: header, data: data, constHtmlIsHightLightItem: constHtmlIsHightLightItem }\" />\n </div>\n }\n </div>\n } @else {\n @for (header of headerRight(); track header) {\n <div\n class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef; context: { header: header, data: data, constHtmlIsHightLightItem: constHtmlIsHightLightItem }\" />\n </div>\n }\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand'](); track dataExpand) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"dataExpand\"\n [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"dataExpand\"\n [class]=\"configTemplateItemCollapseExpand()?.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-[calc(100%-10px)] w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n @if (showScrollTablePinnedIfNoData()) {\n <div\n class=\"absolute h-[1px] bg-transparent top-0 left-0 z-[1]\"\n [style.width.px]=\"headerElementRef.scrollWidth\"></div>\n }\n }\n </div>\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet=\"templateFooterRef\" />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n\n @if (activityLoadData() === 'click-pagination') {\n <div class=\"flex w-full mt-[12px]\">\n <libs_ui-components-pagination\n [modeDisplayTotalPageAndGotoPage]=\"paginationConfig().modeDisplayTotalPageAndGotoPage\"\n [classDisplayTotalPageAndGotoPage]=\"paginationConfig().classDisplayTotalPageAndGotoPage\"\n [classIncludeItem]=\"paginationConfig().classIncludeItem\"\n [classIncludeContainer]=\"paginationConfig().classIncludeContainer\"\n [disable]=\"paginationConfig().disable\"\n [numberPageDisplay]=\"paginationConfig().numberPageDisplay\"\n [firstPageStartNumber]=\"paginationConfig().firstPageStartNumber\"\n [showTotalPage]=\"paginationConfig().showTotalPage\"\n [showInputGotoPage]=\"paginationConfig().showInputGotoPage\"\n [totalItems]=\"pagingTotalItems()\"\n [perPage]=\"pagingPerPage()\"\n [currentPage]=\"pagingCurrentPage()\"\n (outPageSelect)=\"handlerChangePage($event)\" />\n </div>\n }\n </div>\n</div>\n\n<ng-template\n #templateHeaderRef\n let-header=\"headerItem\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n [class]=\"'relative flex ' + (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ') + ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]=\"!header.ignorePyDefault\"\n [ngStyle]=\"\n (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n \"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef; context: { headerItem: header, isColRender: false, isHeaderLeft: isHeaderLeft }\" />\n }\n @if (header.rowsConfig; as rowsConfig) {\n @for (row of rowsConfig.rows; track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef; context: { headerItem: col, isColRender: true, isHeaderLeft: isHeaderLeft }\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template\n #templateHeaderContentRef\n let-header=\"headerItem\"\n let-isColRender=\"isColRender\"\n let-isHeaderLeft=\"isHeaderLeft\">\n <div\n #itemHeaderRef\n class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]=\"header.contentHeaderAlignCenter ?? true\"\n [class.justify-end]=\"header.contentHeaderJustifyContentEnd\"\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"\n isColRender\n ? (header | LibsUiTableCalculatorColumnPipe: (isHeaderLeft ? ignoreCalculatorWidthHeader()?.headerLeft || false : ignoreCalculatorWidthHeader()?.headerRight || false) : headerElementRef.clientWidth : headerLeft() : headerRight()) ||\n (header.isShowIndexOnRow ? { width: '50px', 'flex-shrink': '0', padding: '8px' } : {})\n : {}\n \"\n [ngClass]=\"isColRender ? header.ngClass || {} : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div\n class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single\n [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\"></div>\n }\n }\n @for (tooltip of header.tooltipsLeft; track tooltip) {\n <div class=\"mr-[4px]\">\n @let constHtmlTooltip = tooltip.dataView || ' ';\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: constHtmlTooltip | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\n }\n \"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if (header.label | LibsUiPipesCallFunctionInTemplatePipe: header.parseValue : header | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover\n [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"header?.labelConfig?.classInclude || ''\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || { content: labelHeaderColumn }\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @for (tooltip of header.tooltipsRight; track tooltip) {\n <div class=\"ml-[4px]\">\n @let constHtmlTooltip = tooltip.dataView || ' ';\n <libs_ui-components-popover\n [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"\n tooltip.config || {\n content: constHtmlTooltip | translate,\n position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12,\n },\n },\n }\n \"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow\n [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{ content: header.labelDescription.content | translate }\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template\n #templateBodyRef\n let-header=\"header\"\n let-data=\"data\"\n let-constHtmlIsHightLightItem=\"constHtmlIsHightLightItem\">\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div\n class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden && (data() | LibsUiPipesCallFunctionInTemplatePipe: header.checkConditionCheckBoxHidden : data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single\n [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe: keysSelected() : keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe: keysSelected() : keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event, data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div\n LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe: getIndexRow | async\"></div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n @let constHtmlIsHover = itemOfIndexHover === data && !constHtmlIsHightLightItem;\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [isHover]=\"constHtmlIsHover\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"header.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [isHover]=\"constHtmlIsHover\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div\n #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '' : customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general' : 'libs-ui-table-shadow-top libs-ui-border-top-general' }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div\n #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft(); track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '' : 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerLeft || false : headerElementRef.clientWidth : footerLeft() : footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"footer.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n }\n </div>\n }\n </div>\n }\n @if (footerRight(); as footerRightList) {\n @let constHtmlFunctionGetWidthItemFooter = functionGetWidthItem();\n @if (useScrollMeasureColumn() && constHtmlFunctionGetWidthItemFooter) {\n <div\n class=\"flex h-full w-full relative\"\n LibsUiScrollMeasureItemDirectionHorizontalDirective\n [elementScroll]=\"footerElementRef\"\n [items]=\"footerRightList\"\n [functionGetWidthItem]=\"constHtmlFunctionGetWidthItemFooter\"\n (outViewPortItem)=\"handlerOutViewPortItemFooterRight($event)\">\n @for (footer of footerRightViewPort(); track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : footerLeft() : footerRightList) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"footer.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n }\n </div>\n }\n </div>\n } @else {\n @for (footer of footerRightList; track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer | LibsUiTableCalculatorColumnPipe: ignoreCalculatorWidthHeader()?.headerRight || false : headerElementRef.clientWidth : footerLeft() : footerRightList) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n @if (optimizeTableRenderByOnViewport()) {\n @defer (on viewport) {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n } @placeholder {\n <div [class]=\"footer.templateCssWrapperHost || 'w-full h-full'\"></div>\n }\n } @else {\n <libs_ui-components-table-templates\n [item]=\"itemFooter | LibsUiPipesConvertObjectToSignalPipe\"\n [class]=\"footer.templateCssWrapperHost || ''\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n }\n </div>\n }\n }\n }\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (keySearch() || onlyShowNoResult()) {\n @if (templateNoResult(); as templateNoResult) {\n <ng-container *ngTemplateOutlet=\"templateNoResult\" />\n } @else {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\">\n <ng-container *ngComponentOutlet=\"'no-result' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"noDataConfig().ngStyle\"\n [ngClass]=\"noDataConfig().ngClass\"\n [innerHtml]=\"noDataSearchText() | translate\"></div>\n </div>\n </div>\n }\n } @else {\n @if (templateNoData(); as templateNoData) {\n <ng-container *ngTemplateOutlet=\"templateNoData\" />\n } @else {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\">\n <ng-container *ngComponentOutlet=\"'no-data' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: 64 }\" />\n <div\n class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"noDataConfig().ngStyle\"\n [ngClass]=\"noDataConfig().ngClass\"\n [innerHtml]=\"noDataText() | translate\"></div>\n </div>\n </div>\n }\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"] }]
|
|
822
822
|
}], ctorParameters: () => [] });
|
|
823
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3hOLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBNEIscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRyxPQUFPLEVBQVcsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRyxPQUFPLEVBQVMseUNBQXlDLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRyxPQUFPLEVBQWtCLHVDQUF1QyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUcsT0FBTyxFQUFpRCxpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWhJLE9BQU8sRUFBcUIsbUNBQW1DLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVB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LE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxTQUFTO3dCQUNULGdCQUFnQjt3QkFDaEIsaUJBQWlCO3dCQUNqQix1Q0FBdUM7d0JBQ3ZDLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQixzQ0FBc0M7d0JBQ3RDLG9DQUFvQzt3QkFDcEMsaUNBQWlDO3dCQUNqQyx5Q0FBeUM7d0JBQ3pDLG1DQUFtQzt3QkFDbkMsdUNBQXVDO3dCQUN2QywrQkFBK0I7d0JBQy9CLGdDQUFnQzt3QkFDaEMsZ0NBQWdDO3dCQUNoQyxzQ0FBc0M7d0JBQ3RDLCtCQUErQjt3QkFDL0IscUNBQXFDO3dCQUNyQyxpQ0FBaUM7d0JBQ2pDLGtDQUFrQzt3QkFDbEMsbURBQW1EO3FCQUNwRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcywgTmdDb21wb25lbnRPdXRsZXQsIE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBjb21wdXRlZCwgRGVzdHJveVJlZiwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbGVyQ29tcG9uZW50LCBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUgfSBmcm9tICdAaWhhcmJlY2svbmd4LXZpcnR1YWwtc2Nyb2xsZXInO1xuaW1wb3J0IHsgSUJ1dHRvbiwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElTb3J0LCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1NvcnRBcnJvd0NvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1zb3J0JztcbmltcG9ydCB7IElDaGVja2JveEl0ZW0gfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LWdyb3VwJztcbmltcG9ydCB7IElDaGVja2JveEV2ZW50LCBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZSc7XG5pbXBvcnQgeyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElQYWdpbmF0aW9uQ29uZmlnLCBMaWJzVWlDb21wb25lbnRzUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcGFnaW5hdGlvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBMaWJzVWlTY3JvbGxNZWFzdXJlSXRlbURpcmVjdGlvbkhvcml6b250YWxEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1tZWFzdXJlLWl0ZW1zLWRpcmVjdGlvbi1ob3Jpem9udGFsJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lcic7XG5pbXBvcnQgeyBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIH0gZnJvbSAnQGxpYnMtdWkvaWNvbnMnO1xuaW1wb3J0IHsgSUh0dHBSZXNwb25zZUVycm9yLCBJUGFnaW5nLCBUWVBFX09CSkVDVCwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNoZWNrLXNlbGVjdGVkLWJ5LWtleSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jb252ZXJ0LW9iamVjdC10by1zaWduYWwnO1xuaW1wb3J0IHsgSUh0dHBSZXF1ZXN0Q29uZmlnLCBMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UsIHJldHVybkxpc3RPYmplY3QgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3QnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjb252ZXJ0T2JqZWN0VG9TaWduYWwsIGRlbGV0ZVVuaWNvZGUsIGdldCwgc2V0LCB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgbGFzdFZhbHVlRnJvbSwgb2YsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBhdWRpdFRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBJQnV0dG9uQmFyRXZlbnQsXG4gIElDb25maWdTZWxlY3RNb3JlSXRlbSxcbiAgSUNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kLFxuICBJTG9hZE1vcmVFdmVudCxcbiAgSVNvcnRFdmVudCxcbiAgSVRhYmxlRm9vdGVyQ29uZmlnLFxuICBJVGFibGVIZWFkZXJDb25maWcsXG4gIFRZUEVfREFUQV9GSUxURVJfVEFCTEUsXG4gIFRZUEVfREFUQV9UQUJMRSxcbiAgVFlQRV9JVEVNX0RBVEFfVEFCTEUsXG4gIFRZUEVfTkVXX0RBVEFfVEFCTEUsXG4gIFRZUEVfVEFCTEVfRklMVEVSLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSVRhYmxlRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVRhYmxlTm9EYXRhQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL25vLWRhdGEtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlIH0gZnJvbSAnLi9waXBlcy9jYWxjdWxhdG9yLWNvbHVtbi5waXBlJztcbmltcG9ydCB7IExpYnNVaVRhYmxlQ2hlY2tJdGVtSGlnaHRMaWdodFBpcGUgfSBmcm9tICcuL3BpcGVzL2NoZWNrLWl0ZW0taGlnaHQtbGlnaHQucGlwZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzVGFibGVUZW1wbGF0ZXNDb21wb25lbnQgfSBmcm9tICcuL3RlbXBsYXRlcy90ZW1wbGF0ZXMuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBOZ0NsYXNzLFxuICAgIE5nU3R5bGUsXG4gICAgQXN5bmNQaXBlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgTmdDb21wb25lbnRPdXRsZXQsXG4gICAgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1NvcnRBcnJvd0NvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUGFnaW5hdGlvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnQsXG4gICAgTGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSxcbiAgICBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlLFxuICAgIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsXG4gICAgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlLFxuICAgIExpYnNVaVRhYmxlQ2hlY2tJdGVtSGlnaHRMaWdodFBpcGUsXG4gICAgTGlic1VpU2Nyb2xsTWVhc3VyZUl0ZW1EaXJlY3Rpb25Ib3Jpem9udGFsRGlyZWN0aXZlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBHUk9VUCAxIOKAlCBwcml2YXRlIG5vbi1zaWduYWwgKi9cbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbT86IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50O1xuXG4gIC8qKiBHUk9VUCAyIOKAlCBwcm90ZWN0ZWQgbm9uLXNpZ25hbCAqL1xuICBwcm90ZWN0ZWQgaXRlbU9mSW5kZXhIb3Zlcj86IFRZUEVfSVRFTV9EQVRBX1RBQkxFO1xuXG4gIC8qKiBHUk9VUCAzIOKAlCBwcml2YXRlIHNpZ25hbCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG1vcmVJdGVtUG9wb3ZlckNvbmZpZyA9IHNpZ25hbCh7IHpJbmRleDogMTIwMCB9KTtcbiAgLy8gQ09OVkVOVElPTi1FWENFUFQ6IGFueSDigJQgSUxpc3RDb25maWdJdGVtVGV4dCBraMO0bmcgxJHGsOG7o2MgZXhwb3J0LCBXcml0YWJsZVNpZ25hbDxhbnk+IHTGsMahbmcgdGjDrWNoXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9yZUl0ZW1UZXh0Q29uZmlnID0gc2lnbmFsPGFueT4oe1xuICAgIGZpZWxkS2V5OiAna2V5JyxcbiAgICBpZ25vcmVJY29uU2VsZWN0ZWQ6IHRydWUsXG4gICAgZ2V0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjb25maWdMYWJlbFBvcG92ZXI6IHRoaXMubW9yZUl0ZW1Qb3BvdmVyQ29uZmlnLFxuICB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBtb3JlSXRlbUh0dHBEYXRhID0gc2lnbmFsPElIdHRwUmVxdWVzdENvbmZpZz4oe1xuICAgIG9iamVjdEluc3RhbmNlOiByZXR1cm5MaXN0T2JqZWN0KCksXG4gICAgZnVuY3Rpb25OYW1lOiAnbGlzdCcsXG4gICAgYXJndW1lbnRzVmFsdWU6IFtdLFxuICB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBoYXNTY3JvbGwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlU29ydCA9IHNpZ25hbDxJU29ydCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdpbmdTdG9yZSA9IHNpZ25hbDxJUGFnaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRlZExhc3RJdGVtID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZVBhcmFtc0NhbGxBcGkgPSBzaWduYWw8VFlQRV9PQkpFQ1Q+KHt9KTtcbiAgcHJpdmF0ZSByZWFkb25seSB0aW1lb3V0TGVhdmVJdGVtID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtb3VzZUVudGVySGVhZGVyID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZXMgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IHRvdGFsSXRlbUluQmFja2VuZCA9IHNpZ25hbDxudW1iZXI+KDApO1xuXG4gIC8qKiBHUk9VUCA0IOKAlCBwcm90ZWN0ZWQgc2lnbmFsICovXG4gIHByb3RlY3RlZCBrZXlzU2VsZWN0ZWQgPSBzaWduYWw8QXJyYXk8YW55Pj4oW10pO1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBpdGVtcyA9IHNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+PihbXSk7XG4gIHByb3RlY3RlZCBpdGVtRm9vdGVyID0gc2lnbmFsPFRZUEVfT0JKRUNUIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQga2V5U2VhcmNoID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgaXRlbXNIaWdodExpZ2h0ID0gc2lnbmFsPEFycmF5PFRZUEVfSVRFTV9EQVRBX1RBQkxFPj4oW10pO1xuICBwcm90ZWN0ZWQgaGVhZGVyUmlnaHRWaWV3UG9ydCA9IHNpZ25hbDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+PihbXSk7XG4gIHByb3RlY3RlZCBwYWRkaW5nTGVmdEhlYWRlclJpZ2h0ID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCBmb290ZXJSaWdodFZpZXdQb3J0ID0gc2lnbmFsPEFycmF5PElUYWJsZUZvb3RlckNvbmZpZz4+KFtdKTtcblxuICAvKiogR1JPVVAgNSDigJQgaW5wdXQoKSAqL1xuICByZWFkb25seSBvcHRpbWl6ZVRhYmxlUmVuZGVyQnlPblZpZXdwb3J0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdGltZUhpZ2hsaWdoTmV3SXRlbSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigyMDAwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDIwMDAgfSk7XG4gIHJlYWRvbmx5IGhlYWRlckxlZnQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgaGVhZGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyID0gaW5wdXQ8e1xuICAgIGhlYWRlckxlZnQ/OiBib29sZWFuO1xuICAgIGhlYWRlclJpZ2h0PzogYm9vbGVhbjtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQgPSBpbnB1dDxJQ29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQ+KCk7XG4gIHJlYWRvbmx5IHNob3dGb290ZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJGb290ZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjdXN0b21Qb3NpdGlvbkZvb3RlciA9IGlucHV0PCd0b3AnIHwgJ2JvdHRvbScsICd0b3AnIHwgJ2JvdHRvbScgfCB1bmRlZmluZWQ+KCdib3R0b20nLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICdib3R0b20nIH0pO1xuICByZWFkb25seSBmb290ZXJMZWZ0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlRm9vdGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZm9vdGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVGb290ZXJDb25maWc+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBkaXNhYmxlQ2hlY2tib3ggPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgYnVmZmVyQW1vdW50ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDUsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWwpID0+IHtcbiAgICAgIGlmICghdmFsKSByZXR1cm4gNTtcbiAgICAgIHJldHVybiB2YWwgPiAyNSA/IDI1IDogdmFsO1xuICAgIH0sXG4gIH0pO1xuICByZWFkb25seSB0b3RhbEl0ZW0gPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGlzRGFzaEJvcmRlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSGVhZGVyQ29udGFpbmVySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NIZWFkZXJMZWZ0SW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NCb2R5SW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NGb290ZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc1RhYmxlQ29udGFpbmVySW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NCYXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPignanVzdGlmeS1iZXR3ZWVuIG1iLVsxNnB4XScpO1xuXG4gIHJlYWRvbmx5IGZpZWxkS2V5ID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpZCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgfHwgJ2lkJyB9KTsgLy8gdMOqbiBmaWVsZCDEkeG7i25oIGRhbmggaXRlbSBj4bunYSBsaXN0RGF0YXNcbiAgcmVhZG9ubHkgZGVmYXVsdEtleXNTZWxlY3RlZCA9IGlucHV0PEFycmF5PGFueT4+KCk7XG4gIHJlYWRvbmx5IGxhYmVsQmFyTm9TZWxlY3RJdGVtID0gaW5wdXQ8c3RyaW5nPihgaTE4bl90b3RhbF9xdWFudGl0eWApOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgbGFiZWxCYXJCdXR0b25zID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX251bWJlcl9pdGVtX3NlbGVjdGVkJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCB8fCAnaTE4bl9udW1iZXJfaXRlbV9zZWxlY3RlZCcgfSk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBjbGFzc0xhYmVsQmFyQnV0dG9ucyA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnJyB9KTsgLy8gc+G7rSBk4bulbmcgxJHhu4MgaGnDqm4gdGjhu4sga2hpIHTDrWNoIGNo4buNbiBpdGVtXG4gIHJlYWRvbmx5IGJhckJ1dHRvbnMgPSBpbnB1dDxBcnJheTxJQnV0dG9uPj4oKTtcbiAgcmVhZG9ubHkgc29ydExvY2FsID0gaW5wdXQ8Ym9vbGVhbj4oKTsgLy8gdHLGsOG7nW5nIGjhu6NwIG7hur91IHNvcnRMb2NhbCBuw6B5IGtow7RuZyDEkcOhcCDhu6luZyDEkcaw4bujYyBuZ2hp4buHcCB24bulIHRow6wgbeG7m2kgY8OibiBuaOG6r2Mgc+G7rSBk4bulbmcgZmlsdGVyTG9jYWxcbiAgcmVhZG9ubHkgZmlsdGVyT3JTb3J0TG9jYWwgPSBpbnB1dDxUWVBFX1RBQkxFX0ZJTFRFUj4oKTtcbiAgcmVhZG9ubHkgaHR0cFJlcXVlc3REYXRhID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBodHRwUmVxdWVzdERhdGFGb290ZXIgPSBpbnB1dDxJSHR0cFJlcXVlc3RDb25maWc+KCk7XG4gIHJlYWRvbmx5IG5ld0RhdGEgPSBpbnB1dDxUWVBFX05FV19EQVRBX1RBQkxFPigpO1xuICByZWFkb25seSBmaWx0ZXIgPSBpbnB1dDxUWVBFX0RBVEFfRklMVEVSX1RBQkxFLCBUWVBFX0RBVEFfRklMVEVSX1RBQkxFIHwgdW5kZWZpbmVkPih7IGZpbHRlckRhdGE6IHt9IH0sIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8geyBmaWx0ZXJEYXRhOiB7fSB9IH0pO1xuICByZWFkb25seSBpZ25vcmVCYXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0xhYmVsQmFyTm9TZWxlY3RJdGVtID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpZ25vcmVDbGFzc0JnSGVhZGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbm9EYXRhQ29uZmlnID0gaW5wdXQ8SVRhYmxlTm9EYXRhQ29uZmlnLCBJVGFibGVOb0RhdGFDb25maWcgfCB1bmRlZmluZWQ+KFxuICAgIHsgdGV4dE5vRGF0YTogJ2kxOG5fbm9fZGF0YV95ZXQnLCB0ZXh0U2VhcmNoTm9EYXRhOiAnaTE4bl9ub19yZXN1bHQnIH0sXG4gICAgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCB8fCB7IHRleHROb0RhdGE6ICdpMThuX25vX2RhdGFfeWV0JywgdGV4dFNlYXJjaE5vRGF0YTogJ2kxOG5fbm9fcmVzdWx0JyB9IH1cbiAgKTtcbiAgcmVhZG9ubHkgc2hvd1Njcm9sbFRhYmxlUGlubmVkSWZOb0RhdGEgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtTGFzdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAwIH0pO1xuICByZWFkb25seSBjb25maWdTZWxlY3RNb3JlSXRlbSA9IGlucHV0PElDb25maWdTZWxlY3RNb3JlSXRlbT4oKTtcbiAgcmVhZG9ubHkgb25seVNob3dOb1Jlc3VsdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckl0ZW0gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBhY3Rpdml0eUxvYWREYXRhID0gaW5wdXQ8J3Njcm9sbC1pbmZpbml0eScgfCAnY2xpY2stcGFnaW5hdGlvbicsICdzY3JvbGwtaW5maW5pdHknIHwgJ2NsaWNrLXBhZ2luYXRpb24nIHwgdW5kZWZpbmVkPignc2Nyb2xsLWluZmluaXR5JywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnc2Nyb2xsLWluZmluaXR5JyB9KTtcbiAgcmVhZG9ubHkgcGFnaW5hdGlvblNldHRpbmcgPSBpbnB1dDxJUGFnaW5hdGlvbkNvbmZpZz4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVOb0RhdGEgPSBpbnB1dDxUWVBFX1RFTVBMQVRFX1JFRj4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVOb1Jlc3VsdCA9IGlucHV0PFRZUEVfVEVNUExBVEVfUkVGPigpO1xuICByZWFkb25seSBhdXRvRW1pdEtleXNTZWxlY3RlZFdpdGhJdGVtcyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGZ1bmN0aW9uR2V0V2lkdGhJdGVtID0gaW5wdXQ8KCkgPT4gUHJvbWlzZTxudW1iZXI+PigpOyAvLyBi4bqvdCBideG7mWMgdHJ1eeG7gW4gdsOgbyBraGkgdXNlU2Nyb2xsTWVhc3VyZUNvbHVtbiA9IHRydWVcbiAgcmVhZG9ubHkgdXNlU2Nyb2xsTWVhc3VyZUNvbHVtbiA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgLyoqIEdST1VQIDYg4oCUIHByb3RlY3RlZCBjb21wdXRlZCAqL1xuICBwcm90ZWN0ZWQgY2xhc3NIZWFkZXJDb250YWluZXIgPSBjb21wdXRlZCgoKSA9PiBgbGlicy11aS10YWJsZS1oZWFkZXItY29udGFpbmVyIHctZnVsbCBhYnNvbHV0ZSBmbGV4IHNocmluay0wICR7dGhpcy5pZ25vcmVDbGFzc0JnSGVhZGVyKCkgPyAnJyA6ICdiZy13aGl0ZSd9IG92ZXJmbG93LXgtaGlkZGVuIHotWzFdIGl0ZW1zLWNlbnRlciAke3RoaXMuY2xhc3NIZWFkZXJDb250YWluZXJJbmNsdWRlKCkgfHwgJyd9YCk7XG4gIHByb3RlY3RlZCBjbGFzc0hlYWRlckxlZnRDb250YWluZXIgPSBjb21wdXRlZCgoKSA9PiBgaC1mdWxsIGZsZXggc3RpY2t5IHRvcC0wIGxlZnQtMCB6LVsxXSAke3RoaXMuaWdub3JlQ2xhc3NCZ0hlYWRlcigpID8gJycgOiAnYmctd2hpdGUnfSAke3RoaXMuY2xhc3NIZWFkZXJMZWZ0SW5jbHVkZSgpIHx8ICcnfWApO1xuICBwcm90ZWN0ZWQgdG90YWxJdGVtRGlzcGxheSA9IGNvbXB1dGVkKCgpID0+IHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZSh0aGlzLnRvdGFsSXRlbSgpID8/IHRoaXMudG90YWxJdGVtSW5CYWNrZW5kKCksIGZhbHNlKSk7XG4gIHByb3RlY3RlZCBsaXN0Q29uZmlnTW9yZUl0ZW0gPSBjb21wdXRlZDxJTGlzdENvbmZpZ0l0ZW0+KCgpID0+ICh7XG4gICAgdHlwZTogJ3RleHQnLFxuICAgIGNvbmZpZ1RlbXBsYXRlVGV4dDogdGhpcy5tb3JlSXRlbVRleHRDb25maWcsXG4gICAgaHR0cFJlcXVlc3REYXRhOiB0aGlzLm1vcmVJdGVtSHR0cERhdGEsXG4gIH0pKTtcbiAgcHJvdGVjdGVkIGhhc0l0ZW1IaWdodExpZ2h0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pdGVtc0hpZ2h0TGlnaHQoKS5sZW5ndGggPiAwKTtcbiAgcHJvdGVjdGVkIGNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW1Dc3MgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSA/PyAncHgtWzEycHhdIHB5LVs1cHhdJyk7XG4gIHByb3RlY3RlZCBwYWdpbmF0aW9uQ29uZmlnID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICBtb2RlRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlOiB0aGlzLnBhZ2luYXRpb25TZXR0aW5nKCk/Lm1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UgPz8gJ2JvdHRvbScsXG4gICAgY2xhc3NEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2U6IHRoaXMucGFnaW5hdGlvblNldHRpbmcoKT8uY2xhc3NEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UgPz8gJycsXG4gICAgY2xhc3NJbmNsdWRlSXRlbTogdGhpcy5wYWdpbmF0aW9uU2V0dGluZygpPy5jbGFzc0luY2x1ZGVJdGVtID8/ICcnLFxuICAgIGNsYXNzSW5jbHVkZUNvbnRhaW5lcjogdGhpcy5wYWdpbmF0aW9uU2V0dGluZygpPy5jbGFzc0luY2x1ZGVDb250YWluZXIgPz8gJyFpdGVtcy1lbmQnLFxuICAgIGRpc2FibGU6ICh0aGlzLnBhZ2luYXRpb25TZXR0aW5nKCk/LmRpc2FibGUgPz8gZmFsc2UpIHx8IHRoaXMubG9hZGluZygpIHx8ICF0aGlzLml0ZW1zKCkubGVuZ3RoLFxuICAgIG51bWJlclBhZ2VEaXNwbGF5OiB0aGlzLnBhZ2luYXRpb25TZXR0aW5nKCk/Lm51bWJlclBhZ2VEaXNwbGF5ID8/IDUsXG4gICAgc2hvd1RvdGFsUGFnZTogdGhpcy5wYWdpbmF0aW9uU2V0dGluZygpPy5zaG93VG90YWxQYWdlID8/IGZhbHNlLFxuICAgIHNob3dJbnB1dEdvdG9QYWdlOiB0aGlzLnBhZ2luYXRpb25TZXR0aW5nKCk/LnNob3dJbnB1dEdvdG9QYWdlID8/IGZhbHNlLFxuICAgIGZpcnN0UGFnZVN0YXJ0TnVtYmVyOiB0aGlzLnBhZ2luYXRpb25TZXR0aW5nKCk/LmZpcnN0UGFnZVN0YXJ0TnVtYmVyID8/IDEsXG4gIH0pKTtcbiAgcHJvdGVjdGVkIHBhZ2luZ1RvdGFsSXRlbXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBhZ2luZ1N0b3JlKCk/LnRvdGFsX2l0ZW1zID8/ICh0aGlzLnBhZ2luZ1N0b3JlKCk/LnRvdGFsX3BhZ2VzID8/IDApICogKHRoaXMucGFnaW5nU3RvcmUoKT8ucGVyX3BhZ2UgPz8gMCkpO1xuICBwcm90ZWN0ZWQgcGFnaW5nUGVyUGFnZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFnaW5nU3RvcmUoKT8ucGVyX3BhZ2UgPz8gMCk7XG4gIHByb3RlY3RlZCBwYWdpbmdDdXJyZW50UGFnZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFnaW5nU3RvcmUoKT8ucGFnZSA/PyAwKTtcbiAgcHJvdGVjdGVkIG5vRGF0YVRleHQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vRGF0YUNvbmZpZygpLnRleHROb0RhdGEgPz8gJ2kxOG5fbm9fZGF0YV95ZXQnKTtcbiAgcHJvdGVjdGVkIG5vRGF0YVNlYXJjaFRleHQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vRGF0YUNvbmZpZygpLnRleHRTZWFyY2hOb0RhdGEgPz8gJ2kxOG5fbm9fcmVzdWx0Jyk7XG5cbiAgLyoqIEdST1VQIDcg4oCUIG91dHB1dCgpICovXG4gIHJlYWRvbmx5IG91dExvYWRNb3JlID0gb3V0cHV0PElMb2FkTW9yZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxJc0dvbmUgPSBvdXRwdXQ8SUxvYWRNb3JlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExvYWRpbmcgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0U29ydCA9IG91dHB1dDxJU29ydEV2ZW50PigpO1xuICByZWFkb25seSBvdXRDbGlja0JhckJ1dHRvbiA9IG91dHB1dDxJQnV0dG9uQmFyRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dEtleXNTZWxlY3RlZCA9IG91dHB1dDx7IGtleXM6IEFycmF5PGFueT47IGl0ZW1zPzogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4gfT4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJVGFibGVGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZERhdGFDb21wbGV0ZSA9IG91dHB1dDxXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj4+KCk7XG4gIHJlYWRvbmx5IG91dFRvdGFsSXRlbSA9IG91dHB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG91dExvYWREYXRhRXJyb3IgPSBvdXRwdXQ8SUh0dHBSZXNwb25zZUVycm9yPigpO1xuXG4gIC8qKiBHUk9VUCA4IOKAlCB2aWV3Q2hpbGQoKSAocHJpdmF0ZSkgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoZWFkZXJFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdoZWFkZXJFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9vdGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZm9vdGVyRWxlbWVudFJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZvb3RlckxlZnRFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdmb290ZXJMZWZ0RWxlbWVudFJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvZHlFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdib2R5RWxlbWVudFJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvZHlDb21wb25lbnRSZWYgPSB2aWV3Q2hpbGQ8VmlydHVhbFNjcm9sbGVyQ29tcG9uZW50PignYm9keUNvbXBvbmVudFJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2luYXRpb25SZWYgPSB2aWV3Q2hpbGQ8TGlic1VpQ29tcG9uZW50c1BhZ2luYXRpb25Db21wb25lbnQ+KExpYnNVaUNvbXBvbmVudHNQYWdpbmF0aW9uQ29tcG9uZW50KTtcblxuICAvKiogR1JPVVAgOSDigJQgaW5qZWN0KCkgKHByaXZhdGUgcmVhZG9ubHkpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLm1vcmVJdGVtVGV4dENvbmZpZy51cGRhdGUoKGMpID0+ICh7IC4uLmMsIGdldFZhbHVlOiBjb25maWc/LmdldFZhbHVlIH0pKTtcbiAgICAgICAgdGhpcy5tb3JlSXRlbUh0dHBEYXRhLnVwZGF0ZSgoYykgPT4gKHsgLi4uYywgb2JqZWN0SW5zdGFuY2U6IHJldHVybkxpc3RPYmplY3QoY29uZmlnPy5saXN0T3B0aW9uKSB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0S2V5c1NlbGVjdGVkKCk/Lmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnVwZGF0ZSgoa2V5cykgPT4gWy4uLmtleXMsIC4uLih0aGlzLmRlZmF1bHRLZXlzU2VsZWN0ZWQoKSB8fCBbXSldKTtcbiAgICAgICAgICB0aGlzLmVtaXRLZXlzU2VsZWN0ZWQodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3dGb290ZXIoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm5ld0RhdGEoKT8uZGF0YSgpLmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5hZGRJdGVtcyh0aGlzLm5ld0RhdGEoKT8uZGF0YSBhcyBhbnksICF0aGlzLm5ld0RhdGEoKT8uYWRkVG9MYXN0TGlzdCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhIHx8IHRoaXMuZmlsdGVyKCkuaWdub3JlQ2FsbEFwaUF1dG8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rZXlTZWFyY2guc2V0KGdldCh0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEsICdrZXlTZWFyY2gnLCAnJykpO1xuICAgICAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS5zZXQoY2xvbmVEZWVwKHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSkpO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXIoKT8uZmlsdGVyRGF0YSAmJiAhdGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhWydpbnN0YW5jZVNvcnQnXSAmJiB0aGlzLmluc3RhbmNlU29ydCgpKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlck9yU29ydExvY2FsKCkgJiYgdGhpcy5zdG9yZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnNldCh0aGlzLmZpbHRlck9yU29ydExvY2FsKCk/LihzaWduYWwoWy4uLnRoaXMuc3RvcmVzKCldKSwgeyAuLi4odGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhIHx8IHt9KSwgaW5zdGFuY2VTb3J0OiB0aGlzLmluc3RhbmNlU29ydCgpIH0pIHx8IFtdKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAucGlwZShhdWRpdFRpbWUoMTAwKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzZXQ6IHRoaXMucmVzZXQuYmluZCh0aGlzKSxcbiAgICAgIGNhbGxBcGlCeVNlcnZpY2U6IHRoaXMuY2FsbEFwaUJ5U2VydmljZS5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRTY3JvbGw6IHRoaXMucmVzZXRTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgIGFkZEl0ZW1zOiB0aGlzLmFkZEl0ZW1zLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVJdGVtczogdGhpcy5yZW1vdmVJdGVtcy5iaW5kKHRoaXMpLFxuICAgICAgZ2V0U2Nyb2xsQ29udGFpbmVyOiB0aGlzLmdldFNjcm9sbENvbnRhaW5lci5iaW5kKHRoaXMpLFxuICAgICAgaGlkZVRvb2xCYXJCb3R0b206ICgpID0+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSxcbiAgICAgIHJlc2V0S2V5U2VsZWN0ZWQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5lbWl0S2V5c1NlbGVjdGVkKHRydWUpO1xuICAgICAgfSxcbiAgICAgIGRldGVjdENoYW5nZXM6ICgpID0+IHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKSxcbiAgICAgIHNldENvdW50UGFnaW5nU3RvcmU6IChjb3VudDogbnVtYmVyKSA9PiB0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpICYmIHRoaXMucGFnaW5nU3RvcmUoKSAmJiB0aGlzLnBhZ2luZ1N0b3JlLnVwZGF0ZSgocGFnaW5nKSA9PiAoeyAuLi5wYWdpbmcsIHRvdGFsX2l0ZW1zOiBjb3VudCB9KSksXG4gICAgICBnZXRDb3VudDogdGhpcy5nZXRDb3VudC5iaW5kKHRoaXMpLFxuICAgICAgZ2V0U3RvcmU6ICgpID0+IHRoaXMuc3RvcmVzKCkgfHwgW10sXG4gICAgICBnZXRJdGVtczogKCkgPT4gdGhpcy5pdGVtcygpIHx8IFtdLFxuICAgICAgZ2V0SW5kZXhCeUl0ZW06IGFzeW5jIChpdGVtOiBUWVBFX0lURU1fREFUQV9UQUJMRSkgPT4gbGFzdFZhbHVlRnJvbSh0aGlzLmdldEluZGV4Um93KHsgdmFsdWU6IGl0ZW0gfSkpLFxuICAgICAgaGlnaHRMaWdodEl0ZW06IHRoaXMuaGlnaHRMaWdodEl0ZW0uYmluZCh0aGlzKSxcbiAgICAgIGNoYW5nZVBhZ2luYXRpb246IGFzeW5jIChwYWdlPzogbnVtYmVyKSA9PiBhd2FpdCB0aGlzLnBhZ2luYXRpb25SZWYoKT8uRnVuY3Rpb25zQ29udHJvbD8uY2hhbmdlUGFnZShwYWdlKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VBbGxDaGVja2VkKCkge1xuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5lbWl0S2V5c1NlbGVjdGVkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckNoYW5nZUNoZWNrZWRBbGxJdGVtcyhldmVudDogSUNoZWNrYm94RXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgICB0aGlzLmVtaXRLZXlzU2VsZWN0ZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zKCk7XG4gICAgY29uc3QgY2FuY2VsRmxhZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChpdGVtcy5tYXAoKGl0ZW0pID0+IHRoaXMuY2hlY2tDYW5jZWxDb25kaXRpb25DaGVja2VkSXRlbShpdGVtKSkpO1xuXG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KGl0ZW1zLmZpbHRlcigoXywgaW5kZXgpID0+ICFjYW5jZWxGbGFnc1tpbmRleF0pLm1hcCgoaXRlbSkgPT4gYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YCkpO1xuICAgIHRoaXMuZW1pdEtleXNTZWxlY3RlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZChldmVudDogSUNoZWNrYm94SXRlbSwgaXRlbTogVFlQRV9PQkpFQ1QpIHtcbiAgICBjb25zdCBrZXkgPSBnZXQ8dW5rbm93bj4oaXRlbSwgdGhpcy5maWVsZEtleSgpKTtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldCh0aGlzLmtleXNTZWxlY3RlZCgpKTtcblxuICAgIGtleXMuYWRkKGtleSk7XG4gICAgaWYgKCFldmVudC5jaGVja2VkKSB7XG4gICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoQXJyYXkuZnJvbShrZXlzKSk7XG4gICAgdGhpcy5lbWl0S2V5c1NlbGVjdGVkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckNoYW5nZVNvcnQoc29ydDogSVNvcnQpIHtcbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gdGhpcy5oZWFkZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwO1xuICAgIGlmICh0aGlzLmluc3RhbmNlU29ydCgpPy5maWVsZFNvcnQgIT09IHNvcnQuZmllbGRTb3J0KSB7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydCgpPy5yZXNldCgpO1xuICAgIH1cbiAgICB0aGlzLmluc3RhbmNlU29ydC5zZXQoc29ydCk7XG4gICAgaWYgKHRoaXMuc29ydExvY2FsKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlclNvcnRMb2NhbChzb3J0LCBzY3JvbGxMZWZ0KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSk7XG4gICAgdGhpcy5vdXRTb3J0LmVtaXQoe1xuICAgICAgc29ydDogc29ydCxcbiAgICAgIG9uU29ydFN1Y2Nlc3M6ICgpID0+IHRoaXMub25Tb3J0U3VjY2VzcyhzY3JvbGxMZWZ0KSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgICAgdGhpcy5vblNvcnRTdWNjZXNzKHNjcm9sbExlZnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xNb3JlU2VsZWN0SXRlbShmdW5jdGlvbkNvbnRyb2w6IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbSA9IGZ1bmN0aW9uQ29udHJvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWRNb3JlSXRlbShldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWV2ZW50Py5rZXkgfHwgIXRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0/LnJlc2V0KCk7XG5cbiAgICBjb25zdCBwZXJQYWdlID0gTnVtYmVyKGV2ZW50LmtleSkudmFsdWVPZigpO1xuICAgIGNvbnN0IGN1cnJlbnRQZXJQYWdlID0gTnVtYmVyKHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKHBlclBhZ2UpKS52YWx1ZU9mKCk7XG4gICAgY29uc3QgaXNQYWdpbmdOdW1iZXIgPSB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LnBhZ2luZ051bWJlcjtcblxuICAgIGlmIChjdXJyZW50UGVyUGFnZSA+IHBlclBhZ2UgfHwgdGhpcy5pdGVtcygpLmxlbmd0aCA+PSBwZXJQYWdlKSB7XG4gICAgICBpZiAoIWlzUGFnaW5nTnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQZXJQYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChcbiAgICAgICAgdGhpcy5pdGVtcygpXG4gICAgICAgICAgLnNsaWNlKDAsIHBlclBhZ2UpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YClcbiAgICAgICk7XG4gICAgICB0aGlzLmVtaXRLZXlzU2VsZWN0ZWQodHJ1ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSwgdHJ1ZSk7XG4gICAgY29uc3QgY29tcGxldGVTdWIgPSB0aGlzLm91dExvYWREYXRhQ29tcGxldGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbXBsZXRlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBlcnJvclN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKCFpc1BhZ2luZ051bWJlcikge1xuICAgICAgICB0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShjdXJyZW50UGVyUGFnZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoXG4gICAgICAgIHRoaXMuaXRlbXMoKVxuICAgICAgICAgIC5zbGljZSgwLCBwZXJQYWdlKVxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGAke2dldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWApXG4gICAgICApO1xuICAgICAgdGhpcy5lbWl0S2V5c1NlbGVjdGVkKHRydWUpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZXJyb3JTdWIgPSB0aGlzLm91dExvYWREYXRhRXJyb3Iuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGVycm9yU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBjb21wbGV0ZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBlclBhZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCYXJCdXR0b25DbGljayhidXR0b246IElCdXR0b24pIHtcbiAgICBjb25zdCBpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4gPSBbXTtcblxuICAgIHRoaXMua2V5c1NlbGVjdGVkKCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtcygpLmZpbmQoKGl0ZW0pID0+IGAke2dldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWAgPT09IGAke2tleX1gKTtcblxuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLm91dENsaWNrQmFyQnV0dG9uLmVtaXQoe1xuICAgICAgYnV0dG9uLFxuICAgICAgaXRlbXMsXG4gICAgICBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpLFxuICAgICAgaGlkZGVuQmFyQnV0dG9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm47XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEluZGV4SG92ZXIoZTogRXZlbnQsIGl0ZW06IFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciA9IGl0ZW07XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRJbmRleEhvdmVyV2hlbk1vdXNlTGVhdmUoZT86IEV2ZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY3VycmVudEluZGV4SXRlbUhvdmVyID0gdGhpcy5pdGVtT2ZJbmRleEhvdmVyO1xuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dExlYXZlSXRlbSgpKTtcbiAgICB0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0uc2V0KFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1PZkluZGV4SG92ZXIgJiYgdGhpcy5pdGVtT2ZJbmRleEhvdmVyICE9PSBjdXJyZW50SW5kZXhJdGVtSG92ZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZSk7XG4gICAgICB9KSBhcyB1bmtub3duIGFzIG51bWJlclxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRJbmRleEhvdmVyKGU/OiBFdmVudCkge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VMZWF2ZUNvbnRhaW5lcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlRW50ZXJIZWFkZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5tb3VzZUVudGVySGVhZGVyLnNldCh0cnVlKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlTGVhdmVIZWFkZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5tb3VzZUVudGVySGVhZGVyLnNldChmYWxzZSk7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUVudGVyRm9vdGVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgICBpZiAodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSkge1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VMZWF2ZUZvb3RlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSkge1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQoJ2JnLVsjZjhmOWZhXScpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsSGVhZGVyKGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMubW91c2VFbnRlckhlYWRlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgYm9keUVsID0gdGhpcy5ib2R5RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChib2R5RWwpIHtcbiAgICAgIGJvZHlFbC5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgY29uc3QgZm9vdGVyRWwgPSB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoZm9vdGVyRWwpIHtcbiAgICAgIGZvb3RlckVsLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICAgIH1cbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm9keShlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMubW91c2VFbnRlckhlYWRlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgaGVhZGVyRWwgPSB0aGlzLmhlYWRlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoaGVhZGVyRWwpIHtcbiAgICAgIGhlYWRlckVsLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICAgIH1cbiAgICBjb25zdCBmb290ZXJFbCA9IHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChmb290ZXJFbCkge1xuICAgICAgZm9vdGVyRWwuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb3R0b20oZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmxvYWRpbmcoKSB8fCB0aGlzLmFjdGl2aXR5TG9hZERhdGEoKSAhPT0gJ3Njcm9sbC1pbmZpbml0eScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRMb2FkTW9yZS5lbWl0KHsgbG9hZE1vcmVTdWNjZXNzOiB0aGlzLmxvYWRNb3JlU3VjY2Vzcy5iaW5kKHRoaXMpIH0pO1xuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZShmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdpbmdTdG9yZS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLihkYXRhIHx8IHt9KSwgcGFnZSB9KSk7XG4gICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KFxuICAgICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IHBhZ2luZzogdGhpcy5wYWdpbmdTdG9yZSgpLCBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpIHx8IHt9LCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCB0aGlzLmxvYWRlZExhc3RJdGVtKCksIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKVxuICAgICk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlLCB0cnVlLCB0cnVlKTtcbiAgfVxuXG4gIC8vIENPTlZFTlRJT04tRVhDRVBUOiBhbnkg4oCUIFPhu60gZOG7pW5nIGFueSBhcnJheSDEkeG7gyBtYXAgbmfGsOG7o2MgZ2VuZXJpYyBwcm9wZXJ0aWVzIGxpbmggxJHhu5luZ1xuICBwcm90ZWN0ZWQgaGFuZGxlck91dFZpZXdQb3J0SXRlbUhlYWRlclJpZ2h0KGV2ZW50OiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5oZWFkZXJSaWdodFZpZXdQb3J0LnNldChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck91dFBhZGRpbmdMZWZ0SGVhZGVyUmlnaHQoZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMucGFkZGluZ0xlZnRIZWFkZXJSaWdodC5zZXQoZXZlbnQpO1xuICB9XG5cbiAgLy8gQ09OVkVOVElPTi1FWENFUFQ6IGFueSDigJQgTWFwIGFycmF5IHNpZ25hbCBsaW5oIGhv4bqhdCBjaG8gZ2VuZXJpY1xuICBwcm90ZWN0ZWQgaGFuZGxlck91dFZpZXdQb3J0SXRlbUZvb3RlclJpZ2h0KGV2ZW50OiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5mb290ZXJSaWdodFZpZXdQb3J0LnNldChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SW5kZXhSb3cgPSAoZGF0YTogeyB2YWx1ZTogVFlQRV9JVEVNX0RBVEFfVEFCTEUgfSkgPT4ge1xuICAgIHJldHVybiBvZih0aGlzLml0ZW1zKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBkYXRhLnZhbHVlKSArIDEpO1xuICB9O1xuXG4gIHByaXZhdGUgZmFrZVJlc3BvbnNlQXBpKCk6IFRZUEVfT0JKRUNUIHtcbiAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChmYWxzZSk7XG4gICAgaWYgKHRoaXMuYWN0aXZpdHlMb2FkRGF0YSgpID09PSAnc2Nyb2xsLWluZmluaXR5Jykge1xuICAgICAgdGhpcy5wYWdpbmdTdG9yZS5zZXQoe30pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5mYWtlUmVzcG9uc2VQYWdpbmdBcGkoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmJvZHlDb21wb25lbnRSZWYoKSBhcyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGxBcGlCeVNlcnZpY2UoZmlyc3RDYWxsOiBib29sZWFuLCByZXNldEFmdGVyQ2FsbEFwaT86IGJvb2xlYW4sIGlzQ2hhbmdlUGFnZT86IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZpcnN0Q2FsbCB8fCBpc0NoYW5nZVBhZ2UpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIHx8IHRoaXMubG9hZGluZygpIHx8IHRoaXMubG9hZGVkTGFzdEl0ZW0oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgICAgdGhpcy5yZXNldEluZGV4SG92ZXIoKTtcbiAgICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSB0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIGFzIElIdHRwUmVxdWVzdENvbmZpZztcblxuICAgICAgaWYgKGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlICYmICFndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJCeSAmJiB0aGlzLmluc3RhbmNlU29ydCgpKSB7XG4gICAgICAgIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlckJ5ID0ge1xuICAgICAgICAgIGZpZWxkR2V0VmFsdWU6ICdzdG9yZVBhcmFtc0NhbGxBcGkuaW5zdGFuY2VTb3J0LmZpZWxkU29ydCcsXG4gICAgICAgICAgZmllbGRVcGRhdGU6ICdbMF0nLFxuICAgICAgICAgIHN1YkZpZWxkVXBkYXRlOiAnb3JkZXJfYnknLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlclR5cGUgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKSkge1xuICAgICAgICBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJUeXBlID0ge1xuICAgICAgICAgIGZpZWxkR2V0VmFsdWU6ICdzdG9yZVBhcmFtc0NhbGxBcGkuaW5zdGFuY2VTb3J0Lm1vZGUnLFxuICAgICAgICAgIGZpZWxkVXBkYXRlOiAnWzBdJyxcbiAgICAgICAgICBzdWJGaWVsZFVwZGF0ZTogJ29yZGVyX3R5cGUnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICBpZiAoIXJlc2V0QWZ0ZXJDYWxsQXBpKSB7XG4gICAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChcbiAgICAgICAgICB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4udGhpcy5mYWtlUmVzcG9uc2VBcGkoKSwgc3RvcmVQYXJhbXNDYWxsQXBpOiB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpIH0sIHRoaXMucGFnaW5nU3RvcmUoKSB8fCB7fSwgdGhpcy5rZXlTZWFyY2goKSwgdHJ1ZSwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmNhbGxBcGkodGhpcy5odHRwUmVxdWVzdERhdGEoKSBhcyBJSHR0cFJlcXVlc3RDb25maWcpO1xuXG4gICAgICBpZiAoKGZpcnN0Q2FsbCB8fCBpc0NoYW5nZVBhZ2UpICYmIHJlc2V0QWZ0ZXJDYWxsQXBpKSB7XG4gICAgICAgIHRoaXMuaGFzU2Nyb2xsLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQuc2V0KHJlc3VsdC5wYWdpbmc/LnRvdGFsX2l0ZW1zIHx8IDApO1xuICAgICAgdGhpcy5vdXRUb3RhbEl0ZW0uZW1pdCh0aGlzLnRvdGFsSXRlbUluQmFja2VuZCgpKTtcbiAgICAgIHRoaXMucGFnaW5nU3RvcmUudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCB0b3RhbF9pdGVtczogdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQoKSB8fCAwIH0pKTtcbiAgICAgIGlmICghaXNDaGFuZ2VQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnaW5nU3RvcmUuc2V0KHJlc3VsdC5wYWdpbmcpO1xuICAgICAgICBpZiAoIXRoaXMucGFnaW5nU3RvcmUoKSkge1xuICAgICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KFxuICAgICAgICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi5yZXN1bHQsIHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCkgfHwge30sIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIHRoaXMubG9hZGVkTGFzdEl0ZW0oKSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkZEl0ZW1zKGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSB8fCBbXSksIGZhbHNlLCB0cnVlKTtcbiAgICAgIHRoaXMub3V0TG9hZERhdGFDb21wbGV0ZS5lbWl0KHRoaXMuc3RvcmVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgdGhpcy5vdXRMb2FkRGF0YUVycm9yLmVtaXQoZXJyb3IgYXMgSUh0dHBSZXNwb25zZUVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkge1xuICAgIGlmICghdGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSB8fCAhdGhpcy5zaG93Rm9vdGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCkgfHwge30sIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIGZhbHNlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICB0aGlzLml0ZW1Gb290ZXIuc2V0KGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRJdGVtcyhpdGVtczogVFlQRV9EQVRBX1RBQkxFLCBhZGRGaXJzdDogYm9vbGVhbiwgaWdub3JlSGlnaHRMaWdodD86IGJvb2xlYW4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4sIGF1dG9Db3VudE5ld0l0ZW0/OiBib29sZWFuKSB7XG4gICAgaWYgKCFpdGVtcygpPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldCh0aGlzLml0ZW1zKCkubWFwKChpdGVtKSA9PiBgJHtnZXQ8dW5rbm93bj4oaXRlbSwgdGhpcy5maWVsZEtleSgpKX1gKSk7XG4gICAgY29uc3QgaXRlbXNBZGQ6IEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4gPSBbXTtcblxuICAgIGl0ZW1zKCkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YDtcbiAgICAgIGlmICghZXhpc3RpbmdLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgIGV4aXN0aW5nS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgaXRlbXNBZGQucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChpdGVtc0FkZC5sZW5ndGgpIHtcbiAgICAgIGlmIChhZGRGaXJzdCkge1xuICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZSgoZGF0YSkgPT4gWy4uLml0ZW1zQWRkLCAuLi5kYXRhXSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZSgoZGF0YSkgPT4gWy4uLml0ZW1zQWRkLCAuLi5kYXRhXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZSgoZGF0YSkgPT4gWy4uLmRhdGEsIC4uLml0ZW1zQWRkXSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZSgoZGF0YSkgPT4gWy4uLmRhdGEsIC4uLml0ZW1zQWRkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdXRvQ291bnROZXdJdGVtICYmIGl0ZW1zQWRkLmxlbmd0aCkge1xuICAgICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUgKyBpdGVtc0FkZC5sZW5ndGgpO1xuICAgIH1cbiAgICBpZiAoIWlnbm9yZUhpZ2h0TGlnaHQpIHtcbiAgICAgIHRoaXMuaXRlbXNIaWdodExpZ2h0LnVwZGF0ZSgoaXRlbXNIaWdodExpZ2h0KSA9PiBbLi4uaXRlbXNIaWdodExpZ2h0LCAuLi5pdGVtc0FkZF0pO1xuICAgICAgdGltZXIodGhpcy50aW1lSGlnaGxpZ2hOZXdJdGVtKCkpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpdGVtc0FkZC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zSGlnaHRMaWdodC51cGRhdGUoKGl0ZW1zSGlnaHRMaWdodCkgPT4gaXRlbXNIaWdodExpZ2h0LmZpbHRlcigoaXRlbUhpZ2h0TGlnaHQpID0+IGl0ZW1IaWdodExpZ2h0ICE9PSBpdGVtKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gICAgaWYgKCFpZ25vcmVSZUNhbGxGb290ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlSXRlbXMoa2V5czogQXJyYXk8dW5rbm93bj4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4sIGF1dG9Db3VudE5ld0l0ZW0/OiBib29sZWFuKSB7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoKTtcbiAgICBpZiAoIXRoaXMuaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRoaXMuaXRlbXMudXBkYXRlKChpdGVtcykgPT4ge1xuICAgICAgICBsZXQgaXNVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChgJHtnZXQ8dW5rbm93bj4oaXRlbSwgdGhpcy5maWVsZEtleSgpKX1gID09PSBgJHtTdHJpbmcoa2V5KX1gKSB7XG4gICAgICAgICAgICBpc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXNVcGRhdGUgPyBuZXdJdGVtcyA6IGl0ZW1zO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YCA9PT0gYCR7U3RyaW5nKGtleSl9YCkge1xuICAgICAgICAgICAgaXNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGF1dG9Db3VudE5ld0l0ZW0pIHtcbiAgICAgICAgICAgICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1VwZGF0ZSA/IG5ld0l0ZW1zIDogaXRlbXM7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCF0aGlzLmtleXNTZWxlY3RlZCgpPy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFhdXRvQ291bnROZXdJdGVtKSB7XG4gICAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnVwZGF0ZSgoa2V5cykgPT4ga2V5cy5maWx0ZXIoKGtleVNlbGVjdGVkKSA9PiBrZXlTZWxlY3RlZCAhPT0ga2V5KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUgLSBrZXlzLmxlbmd0aCk7XG4gICAgYXdhaXQgdGhpcy5jaGVja1Njcm9sbCgpO1xuICAgIGlmICghaWdub3JlUmVDYWxsRm9vdGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0S2V5c1NlbGVjdGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaHR0cFJlcXVlc3REYXRhKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZ2luZ1N0b3JlKCk/LnRvdGFsX2l0ZW1zIHx8IHRoaXMuaXRlbXMoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMoKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGxvYWRNb3JlU3VjY2VzcyhkYXRhOiBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+Pikge1xuICAgIHRoaXMuYWRkSXRlbXMoZGF0YSwgZmFsc2UpO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tDYW5jZWxDb25kaXRpb25DaGVja2VkSXRlbShpdGVtOiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pIHtcbiAgICBsZXQgaXNDYW5jZWxDaGVjayA9IGZhbHNlO1xuXG4gICAgaWYgKCFpc0NhbmNlbENoZWNrICYmIHRoaXMuaGVhZGVyTGVmdCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlckxlZnQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuKSB7XG4gICAgICBpc0NhbmNlbENoZWNrID0gKGF3YWl0IGxhc3RWYWx1ZUZyb20oKHRoaXMuaGVhZGVyTGVmdCgpWzBdLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gYXMgYW55KSh7IGl0ZW06IGl0ZW0oKSB9KSkpIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaXNDYW5jZWxDaGVjayAmJiB0aGlzLmhlYWRlclJpZ2h0KCkubGVuZ3RoICYmIHRoaXMuaGVhZGVyUmlnaHQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuKSB7XG4gICAgICBpc0NhbmNlbENoZWNrID0gKGF3YWl0IGxhc3RWYWx1ZUZyb20oKHRoaXMuaGVhZGVyUmlnaHQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIGFzIGFueSkoeyBpdGVtOiBpdGVtKCkgfSkpKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNDYW5jZWxDaGVjaztcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclNvcnRMb2NhbChzb3J0OiBJU29ydCwgc2Nyb2xsTGVmdDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSAmJiB0aGlzLnN0b3JlcygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5pdGVtcy5zZXQodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpPy4oc2lnbmFsKFsuLi50aGlzLnN0b3JlcygpXSksIHsgLi4udGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSwgaW5zdGFuY2VTb3J0OiBzb3J0IH0pIHx8IFtdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGZpZWxkU29ydCwgbW9kZSB9ID0gc29ydDtcblxuICAgIHRoaXMuaXRlbXMudXBkYXRlKChpdGVtcykgPT4ge1xuICAgICAgaXRlbXMuc29ydCgoaXRlbUEsIGl0ZW1CKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZTEgPSBtb2RlID09PSAnYXNjJyA/IGl0ZW1BKClbZmllbGRTb3J0XSA6IGl0ZW1CKClbZmllbGRTb3J0XTtcbiAgICAgICAgbGV0IHZhbHVlMiA9IG1vZGUgPT09ICdhc2MnID8gaXRlbUIoKVtmaWVsZFNvcnRdIDogaXRlbUEoKVtmaWVsZFNvcnRdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUxID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHZhbHVlMSA9IGRlbGV0ZVVuaWNvZGUodmFsdWUxKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgIHZhbHVlMiA9IGRlbGV0ZVVuaWNvZGUodmFsdWUyKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlMSA9PT0gdmFsdWUyKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWUxID4gdmFsdWUyID8gMSA6IC0xO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgIH0pO1xuICAgIHRoaXMub25Tb3J0U3VjY2VzcyhzY3JvbGxMZWZ0KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKHBlclBhZ2U6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgYXJndW1lbnRzVmFsdWUgPSB0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpPy5hcmd1bWVudHNWYWx1ZTtcblxuICAgIGlmICghYXJndW1lbnRzVmFsdWUgfHwgIXRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgcmV0dXJuICctMSc7XG4gICAgfVxuICAgIGNvbnN0IGtleVBlclBhZ2UgPSB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LmtleVBlclBhZ2UgfHwgJ3Blcl9wYWdlJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhcmd1bWVudCA9IGFyZ3VtZW50c1ZhbHVlW2ldO1xuXG4gICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBIdHRwUGFyYW1zICYmIGFyZ3VtZW50LmhhcyhrZXlQZXJQYWdlKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50UGVyUGFnZSA9IGdldDx1bmtub3duPihhcmd1bWVudCwga2V5UGVyUGFnZSwgJzI1JyBhcyBhbnkpO1xuXG4gICAgICAgIGFyZ3VtZW50ID0gYXJndW1lbnQuc2V0KGtleVBlclBhZ2UsIHBlclBhZ2UpO1xuICAgICAgICBzZXQoYXJndW1lbnRzVmFsdWUsIGAke2l9YCBhcyBhbnksIGFyZ3VtZW50KTtcblxuICAgICAgICByZXR1cm4gY3VycmVudFBlclBhZ2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIE9iamVjdCAmJiBPYmplY3Qua2V5cyhhcmd1bWVudCkuaW5jbHVkZXMoa2V5UGVyUGFnZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBnZXQoYXJndW1lbnQsIGtleVBlclBhZ2UsICcyNScpO1xuXG4gICAgICAgIHNldChhcmd1bWVudCwga2V5UGVyUGFnZSwgcGVyUGFnZSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQZXJQYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnLTEnO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNvcnRTdWNjZXNzKHNjcm9sbExlZnQ6IG51bWJlcikge1xuICAgIHRoaXMucmVzZXRTY3JvbGwoc2Nyb2xsTGVmdCwgMCk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFNjcm9sbChzY3JvbGxQb3NpdGlvbkxlZnQ/OiBudW1iZXIsIHNjcm9sbFBvc2l0aW9uVG9wPzogbnVtYmVyKSB7XG4gICAgY29uc3QgaGVhZGVyRWwgPSB0aGlzLmhlYWRlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoaGVhZGVyRWwpIHtcbiAgICAgIGhlYWRlckVsLnNjcm9sbExlZnQgPSBzY3JvbGxQb3NpdGlvbkxlZnQgfHwgMDtcbiAgICB9XG4gICAgY29uc3QgYm9keUVsID0gdGhpcy5ib2R5RWxlbWVudDtcbiAgICBpZiAoYm9keUVsKSB7XG4gICAgICBib2R5RWwuc2Nyb2xsVG9wID0gc2Nyb2xsUG9zaXRpb25Ub3AgfHwgMDtcbiAgICAgIGJvZHlFbC5zY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb25MZWZ0IHx8IDA7XG4gICAgfVxuICAgIGNvbnN0IGZvb3RlckVsID0gdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGZvb3RlckVsKSB7XG4gICAgICBmb290ZXJFbC5zY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb25MZWZ0IHx8IDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldChjbGVhclNvcnQ/OiBib29sZWFuKSB7XG4gICAgaWYgKGNsZWFyU29ydCkge1xuICAgICAgdGhpcy5pbnN0YW5jZVNvcnQoKT8ucmVzZXQoKTtcbiAgICAgIHRoaXMuaW5zdGFuY2VTb3J0LnNldCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB0aGlzLml0ZW1zLnNldChbXSk7XG4gICAgdGhpcy5zdG9yZXMuc2V0KFtdKTtcbiAgICB0aGlzLmZha2VSZXNwb25zZUFwaSgpO1xuICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tTY3JvbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFzU2Nyb2xsID0gdGhpcy5oYXNTY3JvbGwoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGltZXIoNTAwKVxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuYm9keUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzU2Nyb2xsLnNldCh0aGlzLmJvZHlFbGVtZW50LnNjcm9sbEhlaWdodCA+IHRoaXMuYm9keUVsZW1lbnQub2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhc1Njcm9sbCAmJiAhdGhpcy5oYXNTY3JvbGwoKSkge1xuICAgICAgICAgICAgdGhpcy5vdXRTY3JvbGxJc0dvbmUuZW1pdCh7fSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSkge1xuICAgICAgICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBib2R5RWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYm9keUVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGlnaHRMaWdodEl0ZW0oaXRlbXM6IEFycmF5PFRZUEVfSVRFTV9EQVRBX1RBQkxFPikge1xuICAgIHRoaXMuaXRlbXNIaWdodExpZ2h0LnVwZGF0ZSgoaXRlbXNIaWdodExpZ2h0KSA9PiBbLi4uaXRlbXNIaWdodExpZ2h0LCAuLi5pdGVtc10pO1xuXG4gICAgdGltZXIodGhpcy50aW1lSGlnaGxpZ2hOZXdJdGVtKCkpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgdGhpcy5pdGVtc0hpZ2h0TGlnaHQudXBkYXRlKChpdGVtc0hpZ2h0TGlnaHQpID0+IGl0ZW1zSGlnaHRMaWdodC5maWx0ZXIoKGl0ZW1IaWdodExpZ2h0KSA9PiBpdGVtSGlnaHRMaWdodCAhPT0gaXRlbSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0S2V5c1NlbGVjdGVkKG9ubHlXaGVuQXV0b0VuYWJsZWQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmIChvbmx5V2hlbkF1dG9FbmFibGVkICYmICF0aGlzLmF1dG9FbWl0S2V5c1NlbGVjdGVkV2l0aEl0ZW1zKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXV0b0VtaXRLZXlzU2VsZWN0ZWRXaXRoSXRlbXMoKSkge1xuICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmtleXNTZWxlY3RlZCgpXG4gICAgICAgIC5tYXAoKGtleSkgPT4gdGhpcy5pdGVtcygpLmZpbmQoKGl0ZW0pID0+IGAke2dldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWAgPT09IGAke2tleX1gKSlcbiAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+ID0+ICEhaXRlbSk7XG4gICAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSwgaXRlbXMgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dExlYXZlSXRlbSgpKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbFwiPlxuICBAaWYgKCFpZ25vcmVCYXIoKSkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcmVsYXRpdmUgei1bMV0gYm90dG9tLTAgbGVmdC0wIHctZnVsbCBiZy13aGl0ZSBsaWJzLXVpLXRhYmxlLXNoYWRvdy1ib3R0b20ge3sgY2xhc3NCYXJJbmNsdWRlKCkgfX1cIlxuICAgICAgW2NsYXNzLnB4LVsxNnB4XV09XCJrZXlzU2VsZWN0ZWQoKS5sZW5ndGggfHwgbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKVwiXG4gICAgICBbY2xhc3MucHktWzZweF1dPVwia2V5c1NlbGVjdGVkKCkubGVuZ3RoIHx8IGxhYmVsQmFyTm9TZWxlY3RJdGVtKClcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwicmVzZXRJbmRleEhvdmVyKCRldmVudClcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImRpdi5saWJzLXVpLXRhYmxlLWJhci1sZWZ0XCI+PC9uZy1jb250ZW50PlxuICAgICAgQGlmICgha2V5c1NlbGVjdGVkKCkubGVuZ3RoICYmIGxhYmVsQmFyTm9TZWxlY3RJdGVtKCkpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwie3sgY2xhc3NMYWJlbEJhck5vU2VsZWN0SXRlbUNzcygpIH19XCJcbiAgICAgICAgICBbaW5uZXJIdG1sXT1cImxhYmVsQmFyTm9TZWxlY3RJdGVtKCkgfCB0cmFuc2xhdGU6IHsgdmFsdWU6IHRvdGFsSXRlbURpc3BsYXkoKSB9XCI+PC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGtleXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcGwtWzEycHhdXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGgtZnVsbCBtdC1bLTJweF1cIj5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInRydWVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgZGlzYWJsZUNoZWNrYm94KClcIlxuICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VBbGxDaGVja2VkKClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVtIHRleHQtWyMwNzE2MzFdIG1yLVs4cHhdIHt7IGNsYXNzTGFiZWxCYXJCdXR0b25zKCkgfX1cIj5cbiAgICAgICAgICAgIHt7IGxhYmVsQmFyQnV0dG9ucygpIHwgdHJhbnNsYXRlOiB7IHZhbHVlOiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggfSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAoY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cIntcbiAgICAgICAgICAgICAgICB3aWR0aEJ5UGFyZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IDIwNDgsXG4gICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlOiAnIXctWzEyMXB4XScsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIG1vZGU6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdENvbmZpZ01vcmVJdGVtKClcIlxuICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjVcIlxuICAgICAgICAgICAgICBjbGFzcz1cIiF3LVsxNnB4XSBoLVsxNnB4XSBtci1bOHB4XVwiXG4gICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkTW9yZUl0ZW0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2xNb3JlU2VsZWN0SXRlbSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLTAgbS0wJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2JlZm9yZTohdGV4dC1bMTZweF0gbGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwIG1yLVs2cHhdJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwieyBjb25maWc6IHsgY29udGVudDogJ2kxOG5fbW9yZV9zZWxlY3QnIH0gfVwiXG4gICAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLVsxNnB4XSBsaWJzLXVpLWJvcmRlci1sZWZ0LWdlbmVyYWwgbWwtWzE2cHhdXCI+PC9kaXY+XG4gICAgICAgICAgQGlmIChiYXJCdXR0b25zKCk/Lmxlbmd0aCkge1xuICAgICAgICAgICAgQGZvciAoYnV0dG9uIG9mIGJhckJ1dHRvbnMoKTsgdHJhY2sgYnV0dG9uKSB7XG4gICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sTGFiZWwgPSBidXR0b24ubGFiZWwgfHwgJyAnO1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiYnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b24uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uc3RIdG1sTGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQmFyQnV0dG9uQ2xpY2soYnV0dG9uKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImRpdi5saWJzLXVpLXRhYmxlLWJhci1yaWdodFwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxkaXZcbiAgICAjdGFibGVDb250YWluZXJFbGVtZW50UmVmXG4gICAgY2xhc3M9XCJsaWJzLXVpLXRhYmxlIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCByZWxhdGl2ZSB7eyBjbGFzc1RhYmxlQ29udGFpbmVySW5jbHVkZSgpIH19XCJcbiAgICBbY2xhc3MucHgtWzE2cHhdXT1cIiFpZ25vcmVCYXIoKVwiXG4gICAgKG1vdXNlbGVhdmUpPVwiaGFuZGxlck1vdXNlTGVhdmVDb250YWluZXIoJGV2ZW50KVwiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsIHNocmluay0wXCJcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5vZmZzZXRIZWlnaHRcIlxuICAgICAgW2NsYXNzLiFoaWRkZW5dPVwiIWl0ZW1zKCkubGVuZ3RoICYmIGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNoZWFkZXJFbGVtZW50UmVmXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIFtvcHRpb25zXT1cInsgc2Nyb2xsYmFyV2lkdGg6IDAgfVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1ib3R0b20tZGFzaGVkLWdlbmVyYWxdPVwiIWhhc0l0ZW1IaWdodExpZ2h0KCkgJiYgaXNEYXNoQm9yZGVyKClcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWxdPVwiIWhhc0l0ZW1IaWdodExpZ2h0KCkgJiYgIWlzRGFzaEJvcmRlcigpXCJcbiAgICAgICAgW2NsYXNzXT1cImNsYXNzSGVhZGVyQ29udGFpbmVyKClcIlxuICAgICAgICAob3V0U2Nyb2xsKT1cImhhbmRsZXJTY3JvbGxIZWFkZXIoJGV2ZW50KVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJNb3VzZUVudGVySGVhZGVyKCRldmVudClcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVyTW91c2VMZWF2ZUhlYWRlcigkZXZlbnQpXCI+XG4gICAgICAgIEBpZiAoaGVhZGVyTGVmdCgpLmxlbmd0aCkge1xuICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNsYXNzSGVhZGVyTGVmdENvbnRhaW5lcigpXCI+XG4gICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyTGVmdCgpOyB0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmOyBjb250ZXh0OiB7IGhlYWRlckl0ZW06IGhlYWRlciwgaXNIZWFkZXJMZWZ0OiB0cnVlIH1cIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICBAbGV0IGNvbnN0SHRtbEZ1bmN0aW9uR2V0V2lkdGhJdGVtID0gZnVuY3Rpb25HZXRXaWR0aEl0ZW0oKTtcbiAgICAgICAgICBAaWYgKHVzZVNjcm9sbE1lYXN1cmVDb2x1bW4oKSAmJiBjb25zdEh0bWxGdW5jdGlvbkdldFdpZHRoSXRlbSkge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggdy1mdWxsIGgtZnVsbCByZWxhdGl2ZVwiXG4gICAgICAgICAgICAgIExpYnNVaVNjcm9sbE1lYXN1cmVJdGVtRGlyZWN0aW9uSG9yaXpvbnRhbERpcmVjdGl2ZVxuICAgICAgICAgICAgICBbZWxlbWVudFNjcm9sbF09XCJoZWFkZXJFbGVtZW50UmVmXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cImhlYWRlclJpZ2h0KClcIlxuICAgICAgICAgICAgICBbZnVuY3Rpb25HZXRXaWR0aEl0ZW1dPVwiY29uc3RIdG1sRnVuY3Rpb25HZXRXaWR0aEl0ZW1cIlxuICAgICAgICAgICAgICAob3V0Vmlld1BvcnRJdGVtKT1cImhhbmRsZXJPdXRWaWV3UG9ydEl0ZW1IZWFkZXJSaWdodCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG91dFBhZGRpbmdMZWZ0KT1cImhhbmRsZXJPdXRQYWRkaW5nTGVmdEhlYWRlclJpZ2h0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlclJpZ2h0Vmlld1BvcnQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmOyBjb250ZXh0OiB7IGhlYWRlckl0ZW06IGhlYWRlciwgaXNIZWFkZXJMZWZ0OiBmYWxzZSB9XCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlclJlZjsgY29udGV4dDogeyBoZWFkZXJJdGVtOiBoZWFkZXIsIGlzSGVhZGVyTGVmdDogZmFsc2UgfVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKHNob3dGb290ZXIoKSAmJiBpdGVtRm9vdGVyKCkgJiYgY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ3RvcCcpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUZvb3RlclJlZlwiIC8+XG4gICAgfVxuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgb3ZlcmZsb3cteC1oaWRkZW4gYmctd2hpdGUge3sgY2xhc3NCb2R5SW5jbHVkZSgpIHx8ICcnIH19XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNib2R5RWxlbWVudFJlZlxuICAgICAgICBjbGFzcz1cImZsZXggaC1mdWxsIHctZnVsbCByZWxhdGl2ZVwiXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIChvdXRTY3JvbGwpPVwiaGFuZGxlclNjcm9sbEJvZHkoJGV2ZW50KVwiXG4gICAgICAgIChvdXRTY3JvbGxCb3R0b20pPVwiaGFuZGxlclNjcm9sbEJvdHRvbSgkZXZlbnQpXCI+XG4gICAgICAgIEBpZiAoaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICA8dmlydHVhbC1zY3JvbGxlclxuICAgICAgICAgICAgI2JvZHlDb21wb25lbnRSZWZcbiAgICAgICAgICAgIFtpdGVtc109XCJpdGVtcygpXCJcbiAgICAgICAgICAgIFtlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplc109XCJlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcygpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoID4gKGJvZHlFbGVtZW50UmVmID8gYm9keUVsZW1lbnRSZWYuc2Nyb2xsV2lkdGggOiAwKSA/IGhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGggOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW3BhcmVudFNjcm9sbF09XCJib2R5RWxlbWVudFJlZlwiXG4gICAgICAgICAgICBbYnVmZmVyQW1vdW50XT1cImJ1ZmZlckFtb3VudCgpXCI+XG4gICAgICAgICAgICBAZm9yIChkYXRhIG9mIGJvZHlDb21wb25lbnRSZWYudmlld1BvcnRJdGVtczsgdHJhY2sgZGF0YSgpKSB7XG4gICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbSA9IGRhdGEgfCBMaWJzVWlUYWJsZUNoZWNrSXRlbUhpZ2h0TGlnaHRQaXBlOiBpdGVtc0hpZ2h0TGlnaHQoKTtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICNlbGVtZW50SG92ZXJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2YzZmNmY11dPVwiY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLXRvcC0xcHgtMzZkM2QzXT1cImNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW0gJiYgJGZpcnN0ICYmICFpZ25vcmVCb3JkZXJJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1ib3R0b20tMXB4LTM2ZDNkM109XCJjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtICYmICFpZ25vcmVCb3JkZXJJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbSB8fCAoJGxhc3QgJiYgaWdub3JlQm9yZGVySXRlbUxhc3QoKSlcbiAgICAgICAgICAgICAgICAgICAgPyAnbGlicy11aS1ib3JkZXItcmFkaXVzLWJvdHRvbS1sZWZ0LTRweCBsaWJzLXVpLWJvcmRlci1yYWRpdXMtYm90dG9tLXJpZ2h0LTRweCdcbiAgICAgICAgICAgICAgICAgICAgOiBpZ25vcmVCb3JkZXJJdGVtKClcbiAgICAgICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgOiBpc0Rhc2hCb3JkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnbGlicy11aS1ib3JkZXItYm90dG9tLWRhc2hlZC1nZW5lcmFsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJnLVsjZjhmOWZhXV09XCJpdGVtT2ZJbmRleEhvdmVyID09PSBkYXRhICYmICFjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRJbmRleEhvdmVyKCRldmVudCwgZGF0YSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGggfHwgaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctd2hpdGVdPVwiIWNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHB4LVsxMnB4XSBweS1bOHB4XSB7eyBoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnJyA6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmOGY5ZmFdXT1cIml0ZW1PZkluZGV4SG92ZXIgPT09IGRhdGEgJiYgIWNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyTGVmdCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7IHdpZHRoOiAnNTBweCcsICdmbGV4LXNocmluayc6ICcwJywgcGFkZGluZzogJzhweCcgfSA6IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmOyBjb250ZXh0OiB7IGhlYWRlcjogaGVhZGVyLCBkYXRhOiBkYXRhLCBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtOiBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChoZWFkZXJSaWdodCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh1c2VTY3JvbGxNZWFzdXJlQ29sdW1uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgbWluLXctMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctbGVmdC5weF09XCJwYWRkaW5nTGVmdEhlYWRlclJpZ2h0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHRWaWV3UG9ydCgpOyB0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHB4LVsxMnB4XSBweS1bOHB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogaGVhZGVyTGVmdCgpIDogaGVhZGVyUmlnaHQoKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7IHdpZHRoOiAnNTBweCcsICdmbGV4LXNocmluayc6ICcwJywgcGFkZGluZzogJzhweCcgfSA6IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmOyBjb250ZXh0OiB7IGhlYWRlcjogaGVhZGVyLCBkYXRhOiBkYXRhLCBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtOiBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHB4LVsxMnB4XSBweS1bOHB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJSaWdodCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7IHdpZHRoOiAnNTBweCcsICdmbGV4LXNocmluayc6ICcwJywgcGFkZGluZzogJzhweCcgfSA6IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmOyBjb250ZXh0OiB7IGhlYWRlcjogaGVhZGVyLCBkYXRhOiBkYXRhLCBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtOiBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpICYmIGRhdGEoKS5zcGVjaWZpY0V4cGFuZCAmJiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNzc1dyYXBwZXIgfHwgJ2ZsZXggdy1mdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUV4cGFuZCBvZiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSgpOyB0cmFjayBkYXRhRXhwYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uY29sVGVtcGxhdGVDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG9wdGltaXplVGFibGVSZW5kZXJCeU9uVmlld3BvcnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGRlZmVyIChvbiB2aWV3cG9ydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cImRhdGFFeHBhbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAcGxhY2Vob2xkZXIge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICd3LWZ1bGwgaC1mdWxsJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiZGF0YUV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBoLVsxMDBweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb2RhdGFSZWZcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3ZpcnR1YWwtc2Nyb2xsZXI+XG4gICAgICAgIH0gQGVsc2UgaWYgKCFsb2FkaW5nKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RpY2t5IGxlZnQtMCB0b3AtMCB6LVsxXSBoLVtjYWxjKDEwMCUtMTBweCldIHctZnVsbFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlTm9kYXRhUmVmXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKHNob3dTY3JvbGxUYWJsZVBpbm5lZElmTm9EYXRhKCkpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBoLVsxcHhdIGJnLXRyYW5zcGFyZW50IHRvcC0wIGxlZnQtMCB6LVsxXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoXCI+PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGlmIChzaG93Rm9vdGVyKCkgJiYgaXRlbUZvb3RlcigpICYmIGN1c3RvbVBvc2l0aW9uRm9vdGVyKCkgPT09ICdib3R0b20nKSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUZvb3RlclJlZlwiIC8+XG4gICAgICB9XG5cbiAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSB3LWZ1bGwgaC1mdWxsIHotWzJdIGZsZXggaXRlbXMtY2VudGVyIGNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zcGlubmVyIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChhY3Rpdml0eUxvYWREYXRhKCkgPT09ICdjbGljay1wYWdpbmF0aW9uJykge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIG10LVsxMnB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBhZ2luYXRpb25cbiAgICAgICAgICBbbW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZV09XCJwYWdpbmF0aW9uQ29uZmlnKCkubW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZVwiXG4gICAgICAgICAgW2NsYXNzRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlXT1cInBhZ2luYXRpb25Db25maWcoKS5jbGFzc0Rpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZVwiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZUl0ZW1dPVwicGFnaW5hdGlvbkNvbmZpZygpLmNsYXNzSW5jbHVkZUl0ZW1cIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVDb250YWluZXJdPVwicGFnaW5hdGlvbkNvbmZpZygpLmNsYXNzSW5jbHVkZUNvbnRhaW5lclwiXG4gICAgICAgICAgW2Rpc2FibGVdPVwicGFnaW5hdGlvbkNvbmZpZygpLmRpc2FibGVcIlxuICAgICAgICAgIFtudW1iZXJQYWdlRGlzcGxheV09XCJwYWdpbmF0aW9uQ29uZmlnKCkubnVtYmVyUGFnZURpc3BsYXlcIlxuICAgICAgICAgIFtmaXJzdFBhZ2VTdGFydE51bWJlcl09XCJwYWdpbmF0aW9uQ29uZmlnKCkuZmlyc3RQYWdlU3RhcnROdW1iZXJcIlxuICAgICAgICAgIFtzaG93VG90YWxQYWdlXT1cInBhZ2luYXRpb25Db25maWcoKS5zaG93VG90YWxQYWdlXCJcbiAgICAgICAgICBbc2hvd0lucHV0R290b1BhZ2VdPVwicGFnaW5hdGlvbkNvbmZpZygpLnNob3dJbnB1dEdvdG9QYWdlXCJcbiAgICAgICAgICBbdG90YWxJdGVtc109XCJwYWdpbmdUb3RhbEl0ZW1zKClcIlxuICAgICAgICAgIFtwZXJQYWdlXT1cInBhZ2luZ1BlclBhZ2UoKVwiXG4gICAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2luZ0N1cnJlbnRQYWdlKClcIlxuICAgICAgICAgIChvdXRQYWdlU2VsZWN0KT1cImhhbmRsZXJDaGFuZ2VQYWdlKCRldmVudClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgI3RlbXBsYXRlSGVhZGVyUmVmXG4gIGxldC1oZWFkZXI9XCJoZWFkZXJJdGVtXCJcbiAgbGV0LWlzSGVhZGVyTGVmdD1cImlzSGVhZGVyTGVmdFwiPlxuICA8ZGl2XG4gICAgW2NsYXNzXT1cIidyZWxhdGl2ZSBmbGV4ICcgKyAoaGVhZGVyLnBhZGRpbmdMZWZ0UmlnaHRIZWFkZXJDb250YWluZXIgPz8gJyBweC1bMTJweF0gJykgKyAoaXNIZWFkZXJMZWZ0ICYmICFoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnIGxpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwgJyA6ICcgJykgKyAnIGxpYnMtdWktdGFibGUtaGVhZGVyLWNvbCAnXCJcbiAgICBbY2xhc3MuZmxleC1jb2xdPVwiaGVhZGVyLnJvd3NDb25maWdcIlxuICAgIFtjbGFzcy5weS1bOHB4XV09XCIhaGVhZGVyLmlnbm9yZVB5RGVmYXVsdFwiXG4gICAgW25nU3R5bGVdPVwiXG4gICAgICAoaGVhZGVyIHwgTGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTogKGlzSGVhZGVyTGVmdCA/IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJMZWZ0IHx8IGZhbHNlIDogaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyKCk/LmhlYWRlclJpZ2h0IHx8IGZhbHNlKSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8geyB3aWR0aDogJzUwcHgnLCAnZmxleC1zaHJpbmsnOiAnMCcsIHBhZGRpbmc6ICc4cHgnIH0gOiB7fSlcbiAgICBcIlxuICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgQGlmICghaGVhZGVyLnJvd3NDb25maWcpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7IGNvbnRleHQ6IHsgaGVhZGVySXRlbTogaGVhZGVyLCBpc0NvbFJlbmRlcjogZmFsc2UsIGlzSGVhZGVyTGVmdDogaXNIZWFkZXJMZWZ0IH1cIiAvPlxuICAgIH1cbiAgICBAaWYgKGhlYWRlci5yb3dzQ29uZmlnOyBhcyByb3dzQ29uZmlnKSB7XG4gICAgICBAZm9yIChyb3cgb2Ygcm93c0NvbmZpZy5yb3dzOyB0cmFjayByb3cpIHtcbiAgICAgICAgPGRpdiBbY2xhc3NdPVwicm93LmNsYXNzUm93XCI+XG4gICAgICAgICAgQGZvciAoY29sIG9mIHJvdy5jb2xzOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7IGNvbnRleHQ6IHsgaGVhZGVySXRlbTogY29sLCBpc0NvbFJlbmRlcjogdHJ1ZSwgaXNIZWFkZXJMZWZ0OiBpc0hlYWRlckxlZnQgfVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICN0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWZcbiAgbGV0LWhlYWRlcj1cImhlYWRlckl0ZW1cIlxuICBsZXQtaXNDb2xSZW5kZXI9XCJpc0NvbFJlbmRlclwiXG4gIGxldC1pc0hlYWRlckxlZnQ9XCJpc0hlYWRlckxlZnRcIj5cbiAgPGRpdlxuICAgICNpdGVtSGVhZGVyUmVmXG4gICAgY2xhc3M9XCJmbGV4IGxpYnMtdWktZm9udC1oNm0gbWluLWgtWzE4cHhdIHRleHQtWyM2YTczODNdIG1heC13LWZ1bGxcIlxuICAgIFtjbGFzcy5pdGVtcy1jZW50ZXJdPVwiaGVhZGVyLmNvbnRlbnRIZWFkZXJBbGlnbkNlbnRlciA/PyB0cnVlXCJcbiAgICBbY2xhc3MuanVzdGlmeS1lbmRdPVwiaGVhZGVyLmNvbnRlbnRIZWFkZXJKdXN0aWZ5Q29udGVudEVuZFwiXG4gICAgW2NsYXNzLnctZnVsbF09XCJoZWFkZXIuaXNTaG93SW5kZXhPblJvd1wiXG4gICAgW25nU3R5bGVdPVwiXG4gICAgICBpc0NvbFJlbmRlclxuICAgICAgICA/IChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiAoaXNIZWFkZXJMZWZ0ID8gaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyKCk/LmhlYWRlckxlZnQgfHwgZmFsc2UgOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UpIDogaGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aCA6IGhlYWRlckxlZnQoKSA6IGhlYWRlclJpZ2h0KCkpIHx8XG4gICAgICAgICAgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8geyB3aWR0aDogJzUwcHgnLCAnZmxleC1zaHJpbmsnOiAnMCcsIHBhZGRpbmc6ICc4cHgnIH0gOiB7fSlcbiAgICAgICAgOiB7fVxuICAgIFwiXG4gICAgW25nQ2xhc3NdPVwiaXNDb2xSZW5kZXIgPyBoZWFkZXIubmdDbGFzcyB8fCB7fSA6IHt9XCI+XG4gICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3gpIHtcbiAgICAgIEBpZiAoaGVhZGVyLmhhc0NoZWNrYm94QWxsKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImZsZXggaC1mdWxsIHt7IGhlYWRlci5jaGVja2JveEFsbENsYXNzSW5jbHVkZSB8fCAnbXItWzE2cHhdJyB9fVwiXG4gICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY2hlY2tib3hBbGlnbkNlbnRlclwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXG4gICAgICAgICAgICBba2V5XT1cIidhbGwnXCJcbiAgICAgICAgICAgIFtzdGlsbE90aGVyT3B0aW9uc109XCIhIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggIT09IGl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cIiEha2V5c1NlbGVjdGVkKCkubGVuZ3RoICYmIGtleXNTZWxlY3RlZCgpLmxlbmd0aCA9PT0gaXRlbXMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiaGVhZGVyLmNoZWNrYm94Q2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUNoZWNrZWRBbGxJdGVtcygkZXZlbnQpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIG1sLVsyNHB4XSB7eyBoZWFkZXIuY2hlY2tib3hDbGFzc0luY2x1ZGUgfX1cIj48L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gICAgQGZvciAodG9vbHRpcCBvZiBoZWFkZXIudG9vbHRpcHNMZWZ0OyB0cmFjayB0b29sdGlwKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibXItWzRweF1cIj5cbiAgICAgICAgQGxldCBjb25zdEh0bWxUb29sdGlwID0gdG9vbHRpcC5kYXRhVmlldyB8fCAnICc7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIFt0eXBlXT1cInRvb2x0aXA/LnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgW21vZGVdPVwidG9vbHRpcD8ubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cInRvb2x0aXAuY2xhc3NJbmNsdWRlIHx8ICd0ZXh0LVsjNmE3MzgzXSdcIlxuICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0b29sdGlwLmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cIlxuICAgICAgICAgICAgdG9vbHRpcC5jb25maWcgfHwge1xuICAgICAgICAgICAgICBjb250ZW50OiBjb25zdEh0bWxUb29sdGlwIHwgdHJhbnNsYXRlLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIG1vZGU6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgICAgICAgIGF1dG9VcGRhdGVQb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgZW5kRGlzdGFuY2U6IDEyLFxuICAgICAgICAgICAgICAgICAgc3RhcnREaXN0YW5jZTogLTEyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvb2x0aXAuZGF0YVZpZXdcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdykge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGgtZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIge3sgaGVhZGVyLmNsYXNzSW5jbHVkZUluZGV4T25Sb3cgfHwgJycgfX1cIj5cbiAgICAgICAge3sgaGVhZGVyLmxhYmVsID8/ICcjJyB9fVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICBAaWYgKGhlYWRlci5sYWJlbCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGhlYWRlci5wYXJzZVZhbHVlIDogaGVhZGVyIHwgYXN5bmMgfCB0cmFuc2xhdGU7IGFzIGxhYmVsSGVhZGVyQ29sdW1uKSB7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIFt0eXBlXT1cImhlYWRlcj8ubGFiZWxDb25maWc/LnR5cGUgfHwgJ3RleHQnXCJcbiAgICAgICAgICBbbW9kZV09XCJoZWFkZXI/LmxhYmVsQ29uZmlnPy5tb2RlIHx8ICdob3ZlcidcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8uaWdub3JlU2hvd1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgIFtjb25maWddPVwiaGVhZGVyLmxhYmVsQ29uZmlnPy5jb25maWcgfHwgeyBjb250ZW50OiBsYWJlbEhlYWRlckNvbHVtbiB9XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImxhYmVsSGVhZGVyQ29sdW1uXCIgLz5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAZm9yICh0b29sdGlwIG9mIGhlYWRlci50b29sdGlwc1JpZ2h0OyB0cmFjayB0b29sdGlwKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWwtWzRweF1cIj5cbiAgICAgICAgQGxldCBjb25zdEh0bWxUb29sdGlwID0gdG9vbHRpcC5kYXRhVmlldyB8fCAnICc7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIFt0eXBlXT1cInRvb2x0aXA/LnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgW21vZGVdPVwidG9vbHRpcD8ubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cInRvb2x0aXAuY2xhc3NJbmNsdWRlIHx8ICd0ZXh0LVsjNmE3MzgzXSdcIlxuICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0b29sdGlwLmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cIlxuICAgICAgICAgICAgdG9vbHRpcC5jb25maWcgfHwge1xuICAgICAgICAgICAgICBjb250ZW50OiBjb25zdEh0bWxUb29sdGlwIHwgdHJhbnNsYXRlLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIG1vZGU6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgICAgICAgIGF1dG9VcGRhdGVQb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgZW5kRGlzdGFuY2U6IDEyLFxuICAgICAgICAgICAgICAgICAgc3RhcnREaXN0YW5jZTogLTEyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvb2x0aXAuZGF0YVZpZXdcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaGFzU29ydCAmJiBoZWFkZXIub3JkZXJieSkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1sLVs0cHhdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1zb3J0LWFycm93XG4gICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8ICFpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgW2ZpZWxkU29ydF09XCJoZWFkZXIub3JkZXJieVwiXG4gICAgICAgICAgW2lnbm9yZVBvcG92ZXJDb250ZW50XT1cImhlYWRlci5zb3J0SWdub3JlVG9vbHRpcENvbnRlbnQgPz8gdHJ1ZVwiXG4gICAgICAgICAgW3BvcG92ZXJDb250ZW50QXNjXT1cImhlYWRlci5zb3J0VG9vbHRpcENvbnRlbnRBc2NcIlxuICAgICAgICAgIFtwb3BvdmVyQ29udGVudERlc2NdPVwiaGVhZGVyLnNvcnRUb29sdGlwQ29udGVudERlc2NcIlxuICAgICAgICAgIFtkZWZhdWx0TW9kZV09XCJoZWFkZXIuZGVmYXVsdE1vZGVcIlxuICAgICAgICAgIFt6SW5kZXhdPVwiaGVhZGVyLnpJbmRleFRvb2x0aXBTb3J0XCJcbiAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VTb3J0KCRldmVudClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmIChoZWFkZXIubGFiZWxEZXNjcmlwdGlvbikge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogaGVhZGVyLmxhYmVsRGVzY3JpcHRpb24uY29udGVudCB8IHRyYW5zbGF0ZSB9XCJcbiAgICAgICAgW2lubmVySFRNTF09XCJoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jb250ZW50IHwgdHJhbnNsYXRlXCIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICN0ZW1wbGF0ZUJvZHlSZWZcbiAgbGV0LWhlYWRlcj1cImhlYWRlclwiXG4gIGxldC1kYXRhPVwiZGF0YVwiXG4gIGxldC1jb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtPVwiY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsXCI+XG4gICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3gpIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbFwiXG4gICAgICAgIFtjbGFzcy5pbnZpc2libGVdPVwiaGVhZGVyLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gJiYgKGRhdGEoKSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGhlYWRlci5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIDogZGF0YSgpIHwgYXN5bmMpXCJcbiAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY2hlY2tib3hBbGlnbkNlbnRlclwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZVxuICAgICAgICAgIFtrZXldPVwiZGF0YSgpW2ZpZWxkS2V5KCldXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOiBrZXlzU2VsZWN0ZWQoKSA6IGtleXNTZWxlY3RlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8IGRpc2FibGVDaGVja2JveCgpIHx8ICEhKG1heEl0ZW1TZWxlY3RlZCgpICYmICEoZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOiBrZXlzU2VsZWN0ZWQoKSA6IGtleXNTZWxlY3RlZCgpLmxlbmd0aCkgJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoID49IG1heEl0ZW1TZWxlY3RlZCgpKVwiXG4gICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoJGV2ZW50LCBkYXRhKCkpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3c7IGFzIGNvbmZpZykge1xuICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBsaWJzLXVpLWZvbnQtaDRye3sgY29uZmlnLmNsYXNzSW5jbHVkZUluZGV4T25Sb3cgfHwgJycgfX1cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICBbY29uZmlnXT1cInt9XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImRhdGEgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBnZXRJbmRleFJvdyB8IGFzeW5jXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5jb2xUZW1wbGF0ZUNvbmZpZykge1xuICAgICAgQGxldCBjb25zdEh0bWxJc0hvdmVyID0gaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbTtcbiAgICAgIEBpZiAob3B0aW1pemVUYWJsZVJlbmRlckJ5T25WaWV3cG9ydCgpKSB7XG4gICAgICAgIEBkZWZlciAob24gdmlld3BvcnQpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgW2lzSG92ZXJdPVwiY29uc3RIdG1sSXNIb3ZlclwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgICAgW2l0ZW1dPVwiZGF0YVwiXG4gICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImhlYWRlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgW2NvbmZpZ3NdPVwiaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgfSBAcGxhY2Vob2xkZXIge1xuICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImhlYWRlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICd3LWZ1bGwgaC1mdWxsJ1wiPjwvZGl2PlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICBbaXNIb3Zlcl09XCJjb25zdEh0bWxJc0hvdmVyXCJcbiAgICAgICAgICBbY2xhc3NdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgIFtpdGVtXT1cImRhdGFcIlxuICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgW2NvbmZpZ3NdPVwiaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUZvb3RlclJlZj5cbiAgQGlmICghaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhKCkgfHwgKGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpICYmIGl0ZW1zKCkubGVuZ3RoKSkge1xuICAgIDxkaXZcbiAgICAgICNmb290ZXJFbGVtZW50UmVmXG4gICAgICBjbGFzcz1cImZsZXggdy1mdWxsIGJnLVsjZjhmOWZhXSBvdmVyZmxvdy14LWhpZGRlbiB6LVsxXSB7eyBpZ25vcmVCb3JkZXJGb290ZXIoKSA/ICcnIDogY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ3RvcCcgPyAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnIDogJ2xpYnMtdWktdGFibGUtc2hhZG93LXRvcCBsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCcgfX0gbWluLWgtWzM1cHhdXCJcbiAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJNb3VzZUVudGVyRm9vdGVyKCRldmVudClcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwiaGFuZGxlck1vdXNlTGVhdmVGb290ZXIoJGV2ZW50KVwiPlxuICAgICAgQGlmIChmb290ZXJMZWZ0KCkpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICNmb290ZXJMZWZ0RWxlbWVudFJlZlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBzdGlja3kgdG9wLTAgbGVmdC0wIHotWzFdIGJnLVsjZjhmOWZhXVwiPlxuICAgICAgICAgIEBmb3IgKGZvb3RlciBvZiBmb290ZXJMZWZ0KCk7IHRyYWNrIGZvb3Rlcikge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB4LVsxMnB4XSBweS1bOHB4XSB7eyBmb290ZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnJyA6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihmb290ZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyTGVmdCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBmb290ZXJMZWZ0KCkgOiBmb290ZXJSaWdodCgpKSB8fCB7fVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvb3Rlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgIEBpZiAoZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnICYmIGl0ZW1Gb290ZXIoKSkge1xuICAgICAgICAgICAgICAgIEBpZiAob3B0aW1pemVUYWJsZVJlbmRlckJ5T25WaWV3cG9ydCgpKSB7XG4gICAgICAgICAgICAgICAgICBAZGVmZXIgKG9uIHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICB9IEBwbGFjZWhvbGRlciB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICd3LWZ1bGwgaC1mdWxsJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChmb290ZXJSaWdodCgpOyBhcyBmb290ZXJSaWdodExpc3QpIHtcbiAgICAgICAgQGxldCBjb25zdEh0bWxGdW5jdGlvbkdldFdpZHRoSXRlbUZvb3RlciA9IGZ1bmN0aW9uR2V0V2lkdGhJdGVtKCk7XG4gICAgICAgIEBpZiAodXNlU2Nyb2xsTWVhc3VyZUNvbHVtbigpICYmIGNvbnN0SHRtbEZ1bmN0aW9uR2V0V2lkdGhJdGVtRm9vdGVyKSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LWZ1bGwgcmVsYXRpdmVcIlxuICAgICAgICAgICAgTGlic1VpU2Nyb2xsTWVhc3VyZUl0ZW1EaXJlY3Rpb25Ib3Jpem9udGFsRGlyZWN0aXZlXG4gICAgICAgICAgICBbZWxlbWVudFNjcm9sbF09XCJmb290ZXJFbGVtZW50UmVmXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJmb290ZXJSaWdodExpc3RcIlxuICAgICAgICAgICAgW2Z1bmN0aW9uR2V0V2lkdGhJdGVtXT1cImNvbnN0SHRtbEZ1bmN0aW9uR2V0V2lkdGhJdGVtRm9vdGVyXCJcbiAgICAgICAgICAgIChvdXRWaWV3UG9ydEl0ZW0pPVwiaGFuZGxlck91dFZpZXdQb3J0SXRlbUZvb3RlclJpZ2h0KCRldmVudClcIj5cbiAgICAgICAgICAgIEBmb3IgKGZvb3RlciBvZiBmb290ZXJSaWdodFZpZXdQb3J0KCk7IHRyYWNrIGZvb3Rlcikge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTJweF0gcHktWzhweF1cIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihmb290ZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogZm9vdGVyTGVmdCgpIDogZm9vdGVyUmlnaHRMaXN0KSB8fCB7fVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgICBAaWYgKGZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZyAmJiBpdGVtRm9vdGVyKCkpIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAob3B0aW1pemVUYWJsZVJlbmRlckJ5T25WaWV3cG9ydCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBkZWZlciAob24gdmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIH0gQHBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAndy1mdWxsIGgtZnVsbCdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgQGZvciAoZm9vdGVyIG9mIGZvb3RlclJpZ2h0TGlzdDsgdHJhY2sgZm9vdGVyKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwiKGZvb3RlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJSaWdodCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBmb290ZXJMZWZ0KCkgOiBmb290ZXJSaWdodExpc3QpIHx8IHt9XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgQGlmIChmb290ZXIuY29sVGVtcGxhdGVDb25maWcgJiYgaXRlbUZvb3RlcigpKSB7XG4gICAgICAgICAgICAgICAgQGlmIChvcHRpbWl6ZVRhYmxlUmVuZGVyQnlPblZpZXdwb3J0KCkpIHtcbiAgICAgICAgICAgICAgICAgIEBkZWZlciAob24gdmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtRm9vdGVyIHwgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICAgIH0gQHBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJ3ctZnVsbCBoLWZ1bGwnXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtRm9vdGVyIHwgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlTm9kYXRhUmVmPlxuICBAaWYgKGtleVNlYXJjaCgpIHx8IG9ubHlTaG93Tm9SZXN1bHQoKSkge1xuICAgIEBpZiAodGVtcGxhdGVOb1Jlc3VsdCgpOyBhcyB0ZW1wbGF0ZU5vUmVzdWx0KSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb1Jlc3VsdFwiIC8+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBhYnNvbHV0ZSBsZWZ0LTAgdG9wLTAgei1bMV1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgc2hyaW5rLTBcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cIiduby1yZXN1bHQnIHwgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB8IGFzeW5jOyBpbnB1dHM6IHsgc2l6ZTogNjQgfVwiIC8+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLXRhYmxlLW5vLWRhdGEtY29uZmlnLXRleHRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwibm9EYXRhQ29uZmlnKCkubmdTdHlsZVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJub0RhdGFDb25maWcoKS5uZ0NsYXNzXCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwibm9EYXRhU2VhcmNoVGV4dCgpIHwgdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9IEBlbHNlIHtcbiAgICBAaWYgKHRlbXBsYXRlTm9EYXRhKCk7IGFzIHRlbXBsYXRlTm9EYXRhKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb0RhdGFcIiAvPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgYWJzb2x1dGUgbGVmdC0wIHRvcC0wIHotWzFdXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIHNocmluay0wXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCInbm8tZGF0YScgfCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIHwgYXN5bmM7IGlucHV0czogeyBzaXplOiA2NCB9XCIgLz5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktdGFibGUtbm8tZGF0YS1jb25maWctdGV4dFwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJub0RhdGFDb25maWcoKS5uZ1N0eWxlXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm5vRGF0YUNvbmZpZygpLm5nQ2xhc3NcIlxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJub0RhdGFUZXh0KCkgfCB0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
823
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3hOLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBNEIscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRyxPQUFPLEVBQVcsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRyxPQUFPLEVBQVMseUNBQXlDLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRyxPQUFPLEVBQWtCLHVDQUF1QyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUcsT0FBTyxFQUFpRCxpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWhJLE9BQU8sRUFBcUIsbUNBQW1DLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVB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LE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxTQUFTO3dCQUNULGdCQUFnQjt3QkFDaEIsaUJBQWlCO3dCQUNqQix1Q0FBdUM7d0JBQ3ZDLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQixzQ0FBc0M7d0JBQ3RDLG9DQUFvQzt3QkFDcEMsaUNBQWlDO3dCQUNqQyx5Q0FBeUM7d0JBQ3pDLG1DQUFtQzt3QkFDbkMsdUNBQXVDO3dCQUN2QywrQkFBK0I7d0JBQy9CLGdDQUFnQzt3QkFDaEMsZ0NBQWdDO3dCQUNoQyxzQ0FBc0M7d0JBQ3RDLCtCQUErQjt3QkFDL0IscUNBQXFDO3dCQUNyQyxpQ0FBaUM7d0JBQ2pDLGtDQUFrQzt3QkFDbEMsbURBQW1EO3FCQUNwRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcywgTmdDb21wb25lbnRPdXRsZXQsIE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBjb21wdXRlZCwgRGVzdHJveVJlZiwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbGVyQ29tcG9uZW50LCBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUgfSBmcm9tICdAaWhhcmJlY2svbmd4LXZpcnR1YWwtc2Nyb2xsZXInO1xuaW1wb3J0IHsgSUJ1dHRvbiwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElTb3J0LCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1NvcnRBcnJvd0NvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1zb3J0JztcbmltcG9ydCB7IElDaGVja2JveEl0ZW0gfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LWdyb3VwJztcbmltcG9ydCB7IElDaGVja2JveEV2ZW50LCBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZSc7XG5pbXBvcnQgeyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElQYWdpbmF0aW9uQ29uZmlnLCBMaWJzVWlDb21wb25lbnRzUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcGFnaW5hdGlvbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBMaWJzVWlTY3JvbGxNZWFzdXJlSXRlbURpcmVjdGlvbkhvcml6b250YWxEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1tZWFzdXJlLWl0ZW1zLWRpcmVjdGlvbi1ob3Jpem9udGFsJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lcic7XG5pbXBvcnQgeyBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIH0gZnJvbSAnQGxpYnMtdWkvaWNvbnMnO1xuaW1wb3J0IHsgSUh0dHBSZXNwb25zZUVycm9yLCBJUGFnaW5nLCBUWVBFX09CSkVDVCwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNoZWNrLXNlbGVjdGVkLWJ5LWtleSc7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jb252ZXJ0LW9iamVjdC10by1zaWduYWwnO1xuaW1wb3J0IHsgSUh0dHBSZXF1ZXN0Q29uZmlnLCBMaWJzVWlIdHRwUmVxdWVzdFNlcnZpY2UsIHJldHVybkxpc3RPYmplY3QgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3QnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBjb252ZXJ0T2JqZWN0VG9TaWduYWwsIGRlbGV0ZVVuaWNvZGUsIGdldCwgc2V0LCB2aWV3RGF0YU51bWJlckJ5TGFuZ3VhZ2UgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgbGFzdFZhbHVlRnJvbSwgb2YsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBhdWRpdFRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBJQnV0dG9uQmFyRXZlbnQsXG4gIElDb25maWdTZWxlY3RNb3JlSXRlbSxcbiAgSUNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kLFxuICBJTG9hZE1vcmVFdmVudCxcbiAgSVNvcnRFdmVudCxcbiAgSVRhYmxlRm9vdGVyQ29uZmlnLFxuICBJVGFibGVIZWFkZXJDb25maWcsXG4gIFRZUEVfREFUQV9GSUxURVJfVEFCTEUsXG4gIFRZUEVfREFUQV9UQUJMRSxcbiAgVFlQRV9JVEVNX0RBVEFfVEFCTEUsXG4gIFRZUEVfTkVXX0RBVEFfVEFCTEUsXG4gIFRZUEVfVEFCTEVfRklMVEVSLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSVRhYmxlRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVRhYmxlTm9EYXRhQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL25vLWRhdGEtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlIH0gZnJvbSAnLi9waXBlcy9jYWxjdWxhdG9yLWNvbHVtbi5waXBlJztcbmltcG9ydCB7IExpYnNVaVRhYmxlQ2hlY2tJdGVtSGlnaHRMaWdodFBpcGUgfSBmcm9tICcuL3BpcGVzL2NoZWNrLWl0ZW0taGlnaHQtbGlnaHQucGlwZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzVGFibGVUZW1wbGF0ZXNDb21wb25lbnQgfSBmcm9tICcuL3RlbXBsYXRlcy90ZW1wbGF0ZXMuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBOZ0NsYXNzLFxuICAgIE5nU3R5bGUsXG4gICAgQXN5bmNQaXBlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgTmdDb21wb25lbnRPdXRsZXQsXG4gICAgTGlic1VpQ29tcG9uZW50c1RhYmxlVGVtcGxhdGVzQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1NvcnRBcnJvd0NvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUGFnaW5hdGlvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnQsXG4gICAgTGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSxcbiAgICBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlLFxuICAgIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsXG4gICAgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlLFxuICAgIExpYnNVaVRhYmxlQ2hlY2tJdGVtSGlnaHRMaWdodFBpcGUsXG4gICAgTGlic1VpU2Nyb2xsTWVhc3VyZUl0ZW1EaXJlY3Rpb25Ib3Jpem9udGFsRGlyZWN0aXZlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBHUk9VUCAxIOKAlCBwcml2YXRlIG5vbi1zaWduYWwgKi9cbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbT86IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50O1xuXG4gIC8qKiBHUk9VUCAyIOKAlCBwcm90ZWN0ZWQgbm9uLXNpZ25hbCAqL1xuICBwcm90ZWN0ZWQgaXRlbU9mSW5kZXhIb3Zlcj86IFRZUEVfSVRFTV9EQVRBX1RBQkxFO1xuXG4gIC8qKiBHUk9VUCAzIOKAlCBwcml2YXRlIHNpZ25hbCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG1vcmVJdGVtUG9wb3ZlckNvbmZpZyA9IHNpZ25hbCh7IHpJbmRleDogMTIwMCB9KTtcbiAgLy8gQ09OVkVOVElPTi1FWENFUFQ6IGFueSDigJQgSUxpc3RDb25maWdJdGVtVGV4dCBraMO0bmcgxJHGsOG7o2MgZXhwb3J0LCBXcml0YWJsZVNpZ25hbDxhbnk+IHTGsMahbmcgdGjDrWNoXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9yZUl0ZW1UZXh0Q29uZmlnID0gc2lnbmFsPGFueT4oe1xuICAgIGZpZWxkS2V5OiAna2V5JyxcbiAgICBpZ25vcmVJY29uU2VsZWN0ZWQ6IHRydWUsXG4gICAgZ2V0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjb25maWdMYWJlbFBvcG92ZXI6IHRoaXMubW9yZUl0ZW1Qb3BvdmVyQ29uZmlnLFxuICB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBtb3JlSXRlbUh0dHBEYXRhID0gc2lnbmFsPElIdHRwUmVxdWVzdENvbmZpZz4oe1xuICAgIG9iamVjdEluc3RhbmNlOiByZXR1cm5MaXN0T2JqZWN0KCksXG4gICAgZnVuY3Rpb25OYW1lOiAnbGlzdCcsXG4gICAgYXJndW1lbnRzVmFsdWU6IFtdLFxuICB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBoYXNTY3JvbGwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlU29ydCA9IHNpZ25hbDxJU29ydCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdpbmdTdG9yZSA9IHNpZ25hbDxJUGFnaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRlZExhc3RJdGVtID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZVBhcmFtc0NhbGxBcGkgPSBzaWduYWw8VFlQRV9PQkpFQ1Q+KHt9KTtcbiAgcHJpdmF0ZSByZWFkb25seSB0aW1lb3V0TGVhdmVJdGVtID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtb3VzZUVudGVySGVhZGVyID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZXMgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IHRvdGFsSXRlbUluQmFja2VuZCA9IHNpZ25hbDxudW1iZXI+KDApO1xuXG4gIC8qKiBHUk9VUCA0IOKAlCBwcm90ZWN0ZWQgc2lnbmFsICovXG4gIHByb3RlY3RlZCBrZXlzU2VsZWN0ZWQgPSBzaWduYWw8QXJyYXk8YW55Pj4oW10pO1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBpdGVtcyA9IHNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+PihbXSk7XG4gIHByb3RlY3RlZCBpdGVtRm9vdGVyID0gc2lnbmFsPFRZUEVfT0JKRUNUIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQga2V5U2VhcmNoID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgaXRlbXNIaWdodExpZ2h0ID0gc2lnbmFsPEFycmF5PFRZUEVfSVRFTV9EQVRBX1RBQkxFPj4oW10pO1xuICBwcm90ZWN0ZWQgaGVhZGVyUmlnaHRWaWV3UG9ydCA9IHNpZ25hbDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+PihbXSk7XG4gIHByb3RlY3RlZCBwYWRkaW5nTGVmdEhlYWRlclJpZ2h0ID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCBmb290ZXJSaWdodFZpZXdQb3J0ID0gc2lnbmFsPEFycmF5PElUYWJsZUZvb3RlckNvbmZpZz4+KFtdKTtcblxuICAvKiogR1JPVVAgNSDigJQgaW5wdXQoKSAqL1xuICByZWFkb25seSBvcHRpbWl6ZVRhYmxlUmVuZGVyQnlPblZpZXdwb3J0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdGltZUhpZ2hsaWdoTmV3SXRlbSA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigyMDAwLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IDIwMDAgfSk7XG4gIHJlYWRvbmx5IGhlYWRlckxlZnQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgaGVhZGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyID0gaW5wdXQ8e1xuICAgIGhlYWRlckxlZnQ/OiBib29sZWFuO1xuICAgIGhlYWRlclJpZ2h0PzogYm9vbGVhbjtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQgPSBpbnB1dDxJQ29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQ+KCk7XG4gIHJlYWRvbmx5IHNob3dGb290ZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJGb290ZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjdXN0b21Qb3NpdGlvbkZvb3RlciA9IGlucHV0PCd0b3AnIHwgJ2JvdHRvbScsICd0b3AnIHwgJ2JvdHRvbScgfCB1bmRlZmluZWQ+KCdib3R0b20nLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICdib3R0b20nIH0pO1xuICByZWFkb25seSBmb290ZXJMZWZ0ID0gaW5wdXQ8QXJyYXk8SVRhYmxlRm9vdGVyQ29uZmlnPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgZm9vdGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVGb290ZXJDb25maWc+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBkaXNhYmxlQ2hlY2tib3ggPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgYnVmZmVyQW1vdW50ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDUsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWwpID0+IHtcbiAgICAgIGlmICghdmFsKSByZXR1cm4gNTtcbiAgICAgIHJldHVybiB2YWwgPiAyNSA/IDI1IDogdmFsO1xuICAgIH0sXG4gIH0pO1xuICByZWFkb25seSB0b3RhbEl0ZW0gPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGlzRGFzaEJvcmRlciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSGVhZGVyQ29udGFpbmVySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NIZWFkZXJMZWZ0SW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NCb2R5SW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NGb290ZXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc1RhYmxlQ29udGFpbmVySW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NCYXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPignanVzdGlmeS1iZXR3ZWVuIG1iLVsxNnB4XScpO1xuXG4gIHJlYWRvbmx5IGZpZWxkS2V5ID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpZCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgfHwgJ2lkJyB9KTsgLy8gdMOqbiBmaWVsZCDEkeG7i25oIGRhbmggaXRlbSBj4bunYSBsaXN0RGF0YXNcbiAgcmVhZG9ubHkgZGVmYXVsdEtleXNTZWxlY3RlZCA9IGlucHV0PEFycmF5PGFueT4+KCk7XG4gIHJlYWRvbmx5IGxhYmVsQmFyTm9TZWxlY3RJdGVtID0gaW5wdXQ8c3RyaW5nPihgaTE4bl90b3RhbF9xdWFudGl0eWApOyAvLyBz4butIGThu6VuZyDEkeG7gyBoacOqbiB0aOG7iyBraGkgdMOtY2ggY2jhu41uIGl0ZW1cbiAgcmVhZG9ubHkgbGFiZWxCYXJCdXR0b25zID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdpMThuX251bWJlcl9pdGVtX3NlbGVjdGVkJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCB8fCAnaTE4bl9udW1iZXJfaXRlbV9zZWxlY3RlZCcgfSk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBjbGFzc0xhYmVsQmFyQnV0dG9ucyA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnJyB9KTsgLy8gc+G7rSBk4bulbmcgxJHhu4MgaGnDqm4gdGjhu4sga2hpIHTDrWNoIGNo4buNbiBpdGVtXG4gIHJlYWRvbmx5IGJhckJ1dHRvbnMgPSBpbnB1dDxBcnJheTxJQnV0dG9uPj4oKTtcbiAgcmVhZG9ubHkgc29ydExvY2FsID0gaW5wdXQ8Ym9vbGVhbj4oKTsgLy8gdHLGsOG7nW5nIGjhu6NwIG7hur91IHNvcnRMb2NhbCBuw6B5IGtow7RuZyDEkcOhcCDhu6luZyDEkcaw4bujYyBuZ2hp4buHcCB24bulIHRow6wgbeG7m2kgY8OibiBuaOG6r2Mgc+G7rSBk4bulbmcgZmlsdGVyTG9jYWxcbiAgcmVhZG9ubHkgZmlsdGVyT3JTb3J0TG9jYWwgPSBpbnB1dDxUWVBFX1RBQkxFX0ZJTFRFUj4oKTtcbiAgcmVhZG9ubHkgaHR0cFJlcXVlc3REYXRhID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBodHRwUmVxdWVzdERhdGFGb290ZXIgPSBpbnB1dDxJSHR0cFJlcXVlc3RDb25maWc+KCk7XG4gIHJlYWRvbmx5IG5ld0RhdGEgPSBpbnB1dDxUWVBFX05FV19EQVRBX1RBQkxFPigpO1xuICByZWFkb25seSBmaWx0ZXIgPSBpbnB1dDxUWVBFX0RBVEFfRklMVEVSX1RBQkxFLCBUWVBFX0RBVEFfRklMVEVSX1RBQkxFIHwgdW5kZWZpbmVkPih7IGZpbHRlckRhdGE6IHt9IH0sIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8geyBmaWx0ZXJEYXRhOiB7fSB9IH0pO1xuICByZWFkb25seSBpZ25vcmVCYXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0xhYmVsQmFyTm9TZWxlY3RJdGVtID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpZ25vcmVDbGFzc0JnSGVhZGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbm9EYXRhQ29uZmlnID0gaW5wdXQ8SVRhYmxlTm9EYXRhQ29uZmlnLCBJVGFibGVOb0RhdGFDb25maWcgfCB1bmRlZmluZWQ+KFxuICAgIHsgdGV4dE5vRGF0YTogJ2kxOG5fbm9fZGF0YV95ZXQnLCB0ZXh0U2VhcmNoTm9EYXRhOiAnaTE4bl9ub19yZXN1bHQnIH0sXG4gICAgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCB8fCB7IHRleHROb0RhdGE6ICdpMThuX25vX2RhdGFfeWV0JywgdGV4dFNlYXJjaE5vRGF0YTogJ2kxOG5fbm9fcmVzdWx0JyB9IH1cbiAgKTtcbiAgcmVhZG9ubHkgc2hvd1Njcm9sbFRhYmxlUGlubmVkSWZOb0RhdGEgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtTGFzdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMDAsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gMTAwIH0pO1xuICByZWFkb25seSBjb25maWdTZWxlY3RNb3JlSXRlbSA9IGlucHV0PElDb25maWdTZWxlY3RNb3JlSXRlbT4oKTtcbiAgcmVhZG9ubHkgb25seVNob3dOb1Jlc3VsdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckl0ZW0gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBhY3Rpdml0eUxvYWREYXRhID0gaW5wdXQ8J3Njcm9sbC1pbmZpbml0eScgfCAnY2xpY2stcGFnaW5hdGlvbicsICdzY3JvbGwtaW5maW5pdHknIHwgJ2NsaWNrLXBhZ2luYXRpb24nIHwgdW5kZWZpbmVkPignc2Nyb2xsLWluZmluaXR5JywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnc2Nyb2xsLWluZmluaXR5JyB9KTtcbiAgcmVhZG9ubHkgcGFnaW5hdGlvblNldHRpbmcgPSBpbnB1dDxJUGFnaW5hdGlvbkNvbmZpZz4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVOb0RhdGEgPSBpbnB1dDxUWVBFX1RFTVBMQVRFX1JFRj4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVOb1Jlc3VsdCA9IGlucHV0PFRZUEVfVEVNUExBVEVfUkVGPigpO1xuICByZWFkb25seSBhdXRvRW1pdEtleXNTZWxlY3RlZFdpdGhJdGVtcyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGZ1bmN0aW9uR2V0V2lkdGhJdGVtID0gaW5wdXQ8KCkgPT4gUHJvbWlzZTxudW1iZXI+PigpOyAvLyBi4bqvdCBideG7mWMgdHJ1eeG7gW4gdsOgbyBraGkgdXNlU2Nyb2xsTWVhc3VyZUNvbHVtbiA9IHRydWVcbiAgcmVhZG9ubHkgdXNlU2Nyb2xsTWVhc3VyZUNvbHVtbiA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgLyoqIEdST1VQIDYg4oCUIHByb3RlY3RlZCBjb21wdXRlZCAqL1xuICBwcm90ZWN0ZWQgY2xhc3NIZWFkZXJDb250YWluZXIgPSBjb21wdXRlZCgoKSA9PiBgbGlicy11aS10YWJsZS1oZWFkZXItY29udGFpbmVyIHctZnVsbCBhYnNvbHV0ZSBmbGV4IHNocmluay0wICR7dGhpcy5pZ25vcmVDbGFzc0JnSGVhZGVyKCkgPyAnJyA6ICdiZy13aGl0ZSd9IG92ZXJmbG93LXgtaGlkZGVuIHotWzFdIGl0ZW1zLWNlbnRlciAke3RoaXMuY2xhc3NIZWFkZXJDb250YWluZXJJbmNsdWRlKCkgfHwgJyd9YCk7XG4gIHByb3RlY3RlZCBjbGFzc0hlYWRlckxlZnRDb250YWluZXIgPSBjb21wdXRlZCgoKSA9PiBgaC1mdWxsIGZsZXggc3RpY2t5IHRvcC0wIGxlZnQtMCB6LVsxXSAke3RoaXMuaWdub3JlQ2xhc3NCZ0hlYWRlcigpID8gJycgOiAnYmctd2hpdGUnfSAke3RoaXMuY2xhc3NIZWFkZXJMZWZ0SW5jbHVkZSgpIHx8ICcnfWApO1xuICBwcm90ZWN0ZWQgdG90YWxJdGVtRGlzcGxheSA9IGNvbXB1dGVkKCgpID0+IHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZSh0aGlzLnRvdGFsSXRlbSgpID8/IHRoaXMudG90YWxJdGVtSW5CYWNrZW5kKCksIGZhbHNlKSk7XG4gIHByb3RlY3RlZCBsaXN0Q29uZmlnTW9yZUl0ZW0gPSBjb21wdXRlZDxJTGlzdENvbmZpZ0l0ZW0+KCgpID0+ICh7XG4gICAgdHlwZTogJ3RleHQnLFxuICAgIGNvbmZpZ1RlbXBsYXRlVGV4dDogdGhpcy5tb3JlSXRlbVRleHRDb25maWcsXG4gICAgaHR0cFJlcXVlc3REYXRhOiB0aGlzLm1vcmVJdGVtSHR0cERhdGEsXG4gIH0pKTtcbiAgcHJvdGVjdGVkIGhhc0l0ZW1IaWdodExpZ2h0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pdGVtc0hpZ2h0TGlnaHQoKS5sZW5ndGggPiAwKTtcbiAgcHJvdGVjdGVkIGNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW1Dc3MgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW0oKSA/PyAncHgtWzEycHhdIHB5LVs1cHhdJyk7XG4gIHByb3RlY3RlZCBwYWdpbmF0aW9uQ29uZmlnID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICBtb2RlRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlOiB0aGlzLnBhZ2luYXRpb25TZXR0aW5nKCk/Lm1vZGVEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UgPz8gJ2JvdHRvbScsXG4gICAgY2xhc3NEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2U6IHRoaXMucGFnaW5hdGlvblNldHRpbmcoKT8uY2xhc3NEaXNwbGF5VG90YWxQYWdlQW5kR290b1BhZ2UgPz8gJycsXG4gICAgY2xhc3NJbmNsdWRlSXRlbTogdGhpcy5wYWdpbmF0aW9uU2V0dGluZygpPy5jbGFzc0luY2x1ZGVJdGVtID8/ICcnLFxuICAgIGNsYXNzSW5jbHVkZUNvbnRhaW5lcjogdGhpcy5wYWdpbmF0aW9uU2V0dGluZygpPy5jbGFzc0luY2x1ZGVDb250YWluZXIgPz8gJyFpdGVtcy1lbmQnLFxuICAgIGRpc2FibGU6ICh0aGlzLnBhZ2luYXRpb25TZXR0aW5nKCk/LmRpc2FibGUgPz8gZmFsc2UpIHx8IHRoaXMubG9hZGluZygpIHx8ICF0aGlzLml0ZW1zKCkubGVuZ3RoLFxuICAgIG51bWJlclBhZ2VEaXNwbGF5OiB0aGlzLnBhZ2luYXRpb25TZXR0aW5nKCk/Lm51bWJlclBhZ2VEaXNwbGF5ID8/IDUsXG4gICAgc2hvd1RvdGFsUGFnZTogdGhpcy5wYWdpbmF0aW9uU2V0dGluZygpPy5zaG93VG90YWxQYWdlID8/IGZhbHNlLFxuICAgIHNob3dJbnB1dEdvdG9QYWdlOiB0aGlzLnBhZ2luYXRpb25TZXR0aW5nKCk/LnNob3dJbnB1dEdvdG9QYWdlID8/IGZhbHNlLFxuICAgIGZpcnN0UGFnZVN0YXJ0TnVtYmVyOiB0aGlzLnBhZ2luYXRpb25TZXR0aW5nKCk/LmZpcnN0UGFnZVN0YXJ0TnVtYmVyID8/IDEsXG4gIH0pKTtcbiAgcHJvdGVjdGVkIHBhZ2luZ1RvdGFsSXRlbXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBhZ2luZ1N0b3JlKCk/LnRvdGFsX2l0ZW1zID8/ICh0aGlzLnBhZ2luZ1N0b3JlKCk/LnRvdGFsX3BhZ2VzID8/IDApICogKHRoaXMucGFnaW5nU3RvcmUoKT8ucGVyX3BhZ2UgPz8gMCkpO1xuICBwcm90ZWN0ZWQgcGFnaW5nUGVyUGFnZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFnaW5nU3RvcmUoKT8ucGVyX3BhZ2UgPz8gMCk7XG4gIHByb3RlY3RlZCBwYWdpbmdDdXJyZW50UGFnZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMucGFnaW5nU3RvcmUoKT8ucGFnZSA/PyAwKTtcbiAgcHJvdGVjdGVkIG5vRGF0YVRleHQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vRGF0YUNvbmZpZygpLnRleHROb0RhdGEgPz8gJ2kxOG5fbm9fZGF0YV95ZXQnKTtcbiAgcHJvdGVjdGVkIG5vRGF0YVNlYXJjaFRleHQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vRGF0YUNvbmZpZygpLnRleHRTZWFyY2hOb0RhdGEgPz8gJ2kxOG5fbm9fcmVzdWx0Jyk7XG5cbiAgLyoqIEdST1VQIDcg4oCUIG91dHB1dCgpICovXG4gIHJlYWRvbmx5IG91dExvYWRNb3JlID0gb3V0cHV0PElMb2FkTW9yZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxJc0dvbmUgPSBvdXRwdXQ8SUxvYWRNb3JlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExvYWRpbmcgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0U29ydCA9IG91dHB1dDxJU29ydEV2ZW50PigpO1xuICByZWFkb25seSBvdXRDbGlja0JhckJ1dHRvbiA9IG91dHB1dDxJQnV0dG9uQmFyRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dEtleXNTZWxlY3RlZCA9IG91dHB1dDx7IGtleXM6IEFycmF5PGFueT47IGl0ZW1zPzogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4gfT4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJVGFibGVGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZERhdGFDb21wbGV0ZSA9IG91dHB1dDxXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj4+KCk7XG4gIHJlYWRvbmx5IG91dFRvdGFsSXRlbSA9IG91dHB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG91dExvYWREYXRhRXJyb3IgPSBvdXRwdXQ8SUh0dHBSZXNwb25zZUVycm9yPigpO1xuXG4gIC8qKiBHUk9VUCA4IOKAlCB2aWV3Q2hpbGQoKSAocHJpdmF0ZSkgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoZWFkZXJFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdoZWFkZXJFbGVtZW50UmVmJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9vdGVyRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZm9vdGVyRWxlbWVudFJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZvb3RlckxlZnRFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdmb290ZXJMZWZ0RWxlbWVudFJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvZHlFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdib2R5RWxlbWVudFJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvZHlDb21wb25lbnRSZWYgPSB2aWV3Q2hpbGQ8VmlydHVhbFNjcm9sbGVyQ29tcG9uZW50PignYm9keUNvbXBvbmVudFJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2luYXRpb25SZWYgPSB2aWV3Q2hpbGQ8TGlic1VpQ29tcG9uZW50c1BhZ2luYXRpb25Db21wb25lbnQ+KExpYnNVaUNvbXBvbmVudHNQYWdpbmF0aW9uQ29tcG9uZW50KTtcblxuICAvKiogR1JPVVAgOSDigJQgaW5qZWN0KCkgKHByaXZhdGUgcmVhZG9ubHkpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLm1vcmVJdGVtVGV4dENvbmZpZy51cGRhdGUoKGMpID0+ICh7IC4uLmMsIGdldFZhbHVlOiBjb25maWc/LmdldFZhbHVlIH0pKTtcbiAgICAgICAgdGhpcy5tb3JlSXRlbUh0dHBEYXRhLnVwZGF0ZSgoYykgPT4gKHsgLi4uYywgb2JqZWN0SW5zdGFuY2U6IHJldHVybkxpc3RPYmplY3QoY29uZmlnPy5saXN0T3B0aW9uKSB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0S2V5c1NlbGVjdGVkKCk/Lmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnVwZGF0ZSgoa2V5cykgPT4gWy4uLmtleXMsIC4uLih0aGlzLmRlZmF1bHRLZXlzU2VsZWN0ZWQoKSB8fCBbXSldKTtcbiAgICAgICAgICB0aGlzLmVtaXRLZXlzU2VsZWN0ZWQodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3dGb290ZXIoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm5ld0RhdGEoKT8uZGF0YSgpLmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5hZGRJdGVtcyh0aGlzLm5ld0RhdGEoKT8uZGF0YSBhcyBhbnksICF0aGlzLm5ld0RhdGEoKT8uYWRkVG9MYXN0TGlzdCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhIHx8IHRoaXMuZmlsdGVyKCkuaWdub3JlQ2FsbEFwaUF1dG8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rZXlTZWFyY2guc2V0KGdldCh0aGlzLmZpbHRlcigpLmZpbHRlckRhdGEsICdrZXlTZWFyY2gnLCAnJykpO1xuICAgICAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS5zZXQoY2xvbmVEZWVwKHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSkpO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXIoKT8uZmlsdGVyRGF0YSAmJiAhdGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhWydpbnN0YW5jZVNvcnQnXSAmJiB0aGlzLmluc3RhbmNlU29ydCgpKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlck9yU29ydExvY2FsKCkgJiYgdGhpcy5zdG9yZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnNldCh0aGlzLmZpbHRlck9yU29ydExvY2FsKCk/LihzaWduYWwoWy4uLnRoaXMuc3RvcmVzKCldKSwgeyAuLi4odGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhIHx8IHt9KSwgaW5zdGFuY2VTb3J0OiB0aGlzLmluc3RhbmNlU29ydCgpIH0pIHx8IFtdKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAucGlwZShhdWRpdFRpbWUoMTAwKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElUYWJsZUZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzZXQ6IHRoaXMucmVzZXQuYmluZCh0aGlzKSxcbiAgICAgIGNhbGxBcGlCeVNlcnZpY2U6IHRoaXMuY2FsbEFwaUJ5U2VydmljZS5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRTY3JvbGw6IHRoaXMucmVzZXRTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgIGFkZEl0ZW1zOiB0aGlzLmFkZEl0ZW1zLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVJdGVtczogdGhpcy5yZW1vdmVJdGVtcy5iaW5kKHRoaXMpLFxuICAgICAgZ2V0U2Nyb2xsQ29udGFpbmVyOiB0aGlzLmdldFNjcm9sbENvbnRhaW5lci5iaW5kKHRoaXMpLFxuICAgICAgaGlkZVRvb2xCYXJCb3R0b206ICgpID0+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSxcbiAgICAgIHJlc2V0S2V5U2VsZWN0ZWQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5lbWl0S2V5c1NlbGVjdGVkKHRydWUpO1xuICAgICAgfSxcbiAgICAgIGRldGVjdENoYW5nZXM6ICgpID0+IHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKSxcbiAgICAgIHNldENvdW50UGFnaW5nU3RvcmU6IChjb3VudDogbnVtYmVyKSA9PiB0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpICYmIHRoaXMucGFnaW5nU3RvcmUoKSAmJiB0aGlzLnBhZ2luZ1N0b3JlLnVwZGF0ZSgocGFnaW5nKSA9PiAoeyAuLi5wYWdpbmcsIHRvdGFsX2l0ZW1zOiBjb3VudCB9KSksXG4gICAgICBnZXRDb3VudDogdGhpcy5nZXRDb3VudC5iaW5kKHRoaXMpLFxuICAgICAgZ2V0U3RvcmU6ICgpID0+IHRoaXMuc3RvcmVzKCkgfHwgW10sXG4gICAgICBnZXRJdGVtczogKCkgPT4gdGhpcy5pdGVtcygpIHx8IFtdLFxuICAgICAgZ2V0SW5kZXhCeUl0ZW06IGFzeW5jIChpdGVtOiBUWVBFX0lURU1fREFUQV9UQUJMRSkgPT4gbGFzdFZhbHVlRnJvbSh0aGlzLmdldEluZGV4Um93KHsgdmFsdWU6IGl0ZW0gfSkpLFxuICAgICAgaGlnaHRMaWdodEl0ZW06IHRoaXMuaGlnaHRMaWdodEl0ZW0uYmluZCh0aGlzKSxcbiAgICAgIGNoYW5nZVBhZ2luYXRpb246IGFzeW5jIChwYWdlPzogbnVtYmVyKSA9PiBhd2FpdCB0aGlzLnBhZ2luYXRpb25SZWYoKT8uRnVuY3Rpb25zQ29udHJvbD8uY2hhbmdlUGFnZShwYWdlKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VBbGxDaGVja2VkKCkge1xuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5lbWl0S2V5c1NlbGVjdGVkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckNoYW5nZUNoZWNrZWRBbGxJdGVtcyhldmVudDogSUNoZWNrYm94RXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgICB0aGlzLmVtaXRLZXlzU2VsZWN0ZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zKCk7XG4gICAgY29uc3QgY2FuY2VsRmxhZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChpdGVtcy5tYXAoKGl0ZW0pID0+IHRoaXMuY2hlY2tDYW5jZWxDb25kaXRpb25DaGVja2VkSXRlbShpdGVtKSkpO1xuXG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KGl0ZW1zLmZpbHRlcigoXywgaW5kZXgpID0+ICFjYW5jZWxGbGFnc1tpbmRleF0pLm1hcCgoaXRlbSkgPT4gYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YCkpO1xuICAgIHRoaXMuZW1pdEtleXNTZWxlY3RlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZChldmVudDogSUNoZWNrYm94SXRlbSwgaXRlbTogVFlQRV9PQkpFQ1QpIHtcbiAgICBjb25zdCBrZXkgPSBnZXQ8dW5rbm93bj4oaXRlbSwgdGhpcy5maWVsZEtleSgpKTtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldCh0aGlzLmtleXNTZWxlY3RlZCgpKTtcblxuICAgIGtleXMuYWRkKGtleSk7XG4gICAgaWYgKCFldmVudC5jaGVja2VkKSB7XG4gICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoQXJyYXkuZnJvbShrZXlzKSk7XG4gICAgdGhpcy5lbWl0S2V5c1NlbGVjdGVkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckNoYW5nZVNvcnQoc29ydDogSVNvcnQpIHtcbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gdGhpcy5oZWFkZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwO1xuICAgIGlmICh0aGlzLmluc3RhbmNlU29ydCgpPy5maWVsZFNvcnQgIT09IHNvcnQuZmllbGRTb3J0KSB7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydCgpPy5yZXNldCgpO1xuICAgIH1cbiAgICB0aGlzLmluc3RhbmNlU29ydC5zZXQoc29ydCk7XG4gICAgaWYgKHRoaXMuc29ydExvY2FsKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlclNvcnRMb2NhbChzb3J0LCBzY3JvbGxMZWZ0KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSk7XG4gICAgdGhpcy5vdXRTb3J0LmVtaXQoe1xuICAgICAgc29ydDogc29ydCxcbiAgICAgIG9uU29ydFN1Y2Nlc3M6ICgpID0+IHRoaXMub25Tb3J0U3VjY2VzcyhzY3JvbGxMZWZ0KSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgICAgdGhpcy5vblNvcnRTdWNjZXNzKHNjcm9sbExlZnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xNb3JlU2VsZWN0SXRlbShmdW5jdGlvbkNvbnRyb2w6IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbSA9IGZ1bmN0aW9uQ29udHJvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWRNb3JlSXRlbShldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWV2ZW50Py5rZXkgfHwgIXRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0/LnJlc2V0KCk7XG5cbiAgICBjb25zdCBwZXJQYWdlID0gTnVtYmVyKGV2ZW50LmtleSkudmFsdWVPZigpO1xuICAgIGNvbnN0IGN1cnJlbnRQZXJQYWdlID0gTnVtYmVyKHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKHBlclBhZ2UpKS52YWx1ZU9mKCk7XG4gICAgY29uc3QgaXNQYWdpbmdOdW1iZXIgPSB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LnBhZ2luZ051bWJlcjtcblxuICAgIGlmIChjdXJyZW50UGVyUGFnZSA+IHBlclBhZ2UgfHwgdGhpcy5pdGVtcygpLmxlbmd0aCA+PSBwZXJQYWdlKSB7XG4gICAgICBpZiAoIWlzUGFnaW5nTnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQZXJQYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChcbiAgICAgICAgdGhpcy5pdGVtcygpXG4gICAgICAgICAgLnNsaWNlKDAsIHBlclBhZ2UpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YClcbiAgICAgICk7XG4gICAgICB0aGlzLmVtaXRLZXlzU2VsZWN0ZWQodHJ1ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSwgdHJ1ZSk7XG4gICAgY29uc3QgY29tcGxldGVTdWIgPSB0aGlzLm91dExvYWREYXRhQ29tcGxldGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbXBsZXRlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBlcnJvclN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKCFpc1BhZ2luZ051bWJlcikge1xuICAgICAgICB0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShjdXJyZW50UGVyUGFnZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoXG4gICAgICAgIHRoaXMuaXRlbXMoKVxuICAgICAgICAgIC5zbGljZSgwLCBwZXJQYWdlKVxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGAke2dldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWApXG4gICAgICApO1xuICAgICAgdGhpcy5lbWl0S2V5c1NlbGVjdGVkKHRydWUpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZXJyb3JTdWIgPSB0aGlzLm91dExvYWREYXRhRXJyb3Iuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGVycm9yU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBjb21wbGV0ZVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBlclBhZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCYXJCdXR0b25DbGljayhidXR0b246IElCdXR0b24pIHtcbiAgICBjb25zdCBpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4gPSBbXTtcblxuICAgIHRoaXMua2V5c1NlbGVjdGVkKCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtcygpLmZpbmQoKGl0ZW0pID0+IGAke2dldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWAgPT09IGAke2tleX1gKTtcblxuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLm91dENsaWNrQmFyQnV0dG9uLmVtaXQoe1xuICAgICAgYnV0dG9uLFxuICAgICAgaXRlbXMsXG4gICAgICBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpLFxuICAgICAgaGlkZGVuQmFyQnV0dG9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm47XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEluZGV4SG92ZXIoZTogRXZlbnQsIGl0ZW06IFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciA9IGl0ZW07XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRJbmRleEhvdmVyV2hlbk1vdXNlTGVhdmUoZT86IEV2ZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY3VycmVudEluZGV4SXRlbUhvdmVyID0gdGhpcy5pdGVtT2ZJbmRleEhvdmVyO1xuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dExlYXZlSXRlbSgpKTtcbiAgICB0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0uc2V0KFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1PZkluZGV4SG92ZXIgJiYgdGhpcy5pdGVtT2ZJbmRleEhvdmVyICE9PSBjdXJyZW50SW5kZXhJdGVtSG92ZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZSk7XG4gICAgICB9KSBhcyB1bmtub3duIGFzIG51bWJlclxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRJbmRleEhvdmVyKGU/OiBFdmVudCkge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VMZWF2ZUNvbnRhaW5lcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlRW50ZXJIZWFkZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5tb3VzZUVudGVySGVhZGVyLnNldCh0cnVlKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlTGVhdmVIZWFkZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5tb3VzZUVudGVySGVhZGVyLnNldChmYWxzZSk7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUVudGVyRm9vdGVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgICBpZiAodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSkge1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VMZWF2ZUZvb3RlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSkge1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQoJ2JnLVsjZjhmOWZhXScpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsSGVhZGVyKGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMubW91c2VFbnRlckhlYWRlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgYm9keUVsID0gdGhpcy5ib2R5RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChib2R5RWwpIHtcbiAgICAgIGJvZHlFbC5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgY29uc3QgZm9vdGVyRWwgPSB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoZm9vdGVyRWwpIHtcbiAgICAgIGZvb3RlckVsLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICAgIH1cbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm9keShlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMubW91c2VFbnRlckhlYWRlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgaGVhZGVyRWwgPSB0aGlzLmhlYWRlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoaGVhZGVyRWwpIHtcbiAgICAgIGhlYWRlckVsLnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICAgIH1cbiAgICBjb25zdCBmb290ZXJFbCA9IHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChmb290ZXJFbCkge1xuICAgICAgZm9vdGVyRWwuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb3R0b20oZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmxvYWRpbmcoKSB8fCB0aGlzLmFjdGl2aXR5TG9hZERhdGEoKSAhPT0gJ3Njcm9sbC1pbmZpbml0eScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRMb2FkTW9yZS5lbWl0KHsgbG9hZE1vcmVTdWNjZXNzOiB0aGlzLmxvYWRNb3JlU3VjY2Vzcy5iaW5kKHRoaXMpIH0pO1xuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZShmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdpbmdTdG9yZS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLihkYXRhIHx8IHt9KSwgcGFnZSB9KSk7XG4gICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KFxuICAgICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IHBhZ2luZzogdGhpcy5wYWdpbmdTdG9yZSgpLCBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpIHx8IHt9LCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCB0aGlzLmxvYWRlZExhc3RJdGVtKCksIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKVxuICAgICk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlLCB0cnVlLCB0cnVlKTtcbiAgfVxuXG4gIC8vIENPTlZFTlRJT04tRVhDRVBUOiBhbnkg4oCUIFPhu60gZOG7pW5nIGFueSBhcnJheSDEkeG7gyBtYXAgbmfGsOG7o2MgZ2VuZXJpYyBwcm9wZXJ0aWVzIGxpbmggxJHhu5luZ1xuICBwcm90ZWN0ZWQgaGFuZGxlck91dFZpZXdQb3J0SXRlbUhlYWRlclJpZ2h0KGV2ZW50OiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5oZWFkZXJSaWdodFZpZXdQb3J0LnNldChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck91dFBhZGRpbmdMZWZ0SGVhZGVyUmlnaHQoZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMucGFkZGluZ0xlZnRIZWFkZXJSaWdodC5zZXQoZXZlbnQpO1xuICB9XG5cbiAgLy8gQ09OVkVOVElPTi1FWENFUFQ6IGFueSDigJQgTWFwIGFycmF5IHNpZ25hbCBsaW5oIGhv4bqhdCBjaG8gZ2VuZXJpY1xuICBwcm90ZWN0ZWQgaGFuZGxlck91dFZpZXdQb3J0SXRlbUZvb3RlclJpZ2h0KGV2ZW50OiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5mb290ZXJSaWdodFZpZXdQb3J0LnNldChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SW5kZXhSb3cgPSAoZGF0YTogeyB2YWx1ZTogVFlQRV9JVEVNX0RBVEFfVEFCTEUgfSkgPT4ge1xuICAgIHJldHVybiBvZih0aGlzLml0ZW1zKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBkYXRhLnZhbHVlKSArIDEpO1xuICB9O1xuXG4gIHByaXZhdGUgZmFrZVJlc3BvbnNlQXBpKCk6IFRZUEVfT0JKRUNUIHtcbiAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChmYWxzZSk7XG4gICAgaWYgKHRoaXMuYWN0aXZpdHlMb2FkRGF0YSgpID09PSAnc2Nyb2xsLWluZmluaXR5Jykge1xuICAgICAgdGhpcy5wYWdpbmdTdG9yZS5zZXQoe30pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5mYWtlUmVzcG9uc2VQYWdpbmdBcGkoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLmJvZHlDb21wb25lbnRSZWYoKSBhcyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGxBcGlCeVNlcnZpY2UoZmlyc3RDYWxsOiBib29sZWFuLCByZXNldEFmdGVyQ2FsbEFwaT86IGJvb2xlYW4sIGlzQ2hhbmdlUGFnZT86IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZpcnN0Q2FsbCB8fCBpc0NoYW5nZVBhZ2UpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIHx8IHRoaXMubG9hZGluZygpIHx8IHRoaXMubG9hZGVkTGFzdEl0ZW0oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgICAgdGhpcy5yZXNldEluZGV4SG92ZXIoKTtcbiAgICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSB0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpIGFzIElIdHRwUmVxdWVzdENvbmZpZztcblxuICAgICAgaWYgKGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlICYmICFndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJCeSAmJiB0aGlzLmluc3RhbmNlU29ydCgpKSB7XG4gICAgICAgIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlckJ5ID0ge1xuICAgICAgICAgIGZpZWxkR2V0VmFsdWU6ICdzdG9yZVBhcmFtc0NhbGxBcGkuaW5zdGFuY2VTb3J0LmZpZWxkU29ydCcsXG4gICAgICAgICAgZmllbGRVcGRhdGU6ICdbMF0nLFxuICAgICAgICAgIHN1YkZpZWxkVXBkYXRlOiAnb3JkZXJfYnknLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlclR5cGUgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKSkge1xuICAgICAgICBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJUeXBlID0ge1xuICAgICAgICAgIGZpZWxkR2V0VmFsdWU6ICdzdG9yZVBhcmFtc0NhbGxBcGkuaW5zdGFuY2VTb3J0Lm1vZGUnLFxuICAgICAgICAgIGZpZWxkVXBkYXRlOiAnWzBdJyxcbiAgICAgICAgICBzdWJGaWVsZFVwZGF0ZTogJ29yZGVyX3R5cGUnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGZpcnN0Q2FsbCkge1xuICAgICAgICBpZiAoIXJlc2V0QWZ0ZXJDYWxsQXBpKSB7XG4gICAgICAgICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChcbiAgICAgICAgICB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4udGhpcy5mYWtlUmVzcG9uc2VBcGkoKSwgc3RvcmVQYXJhbXNDYWxsQXBpOiB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaSgpIH0sIHRoaXMucGFnaW5nU3RvcmUoKSB8fCB7fSwgdGhpcy5rZXlTZWFyY2goKSwgdHJ1ZSwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmNhbGxBcGkodGhpcy5odHRwUmVxdWVzdERhdGEoKSBhcyBJSHR0cFJlcXVlc3RDb25maWcpO1xuXG4gICAgICBpZiAoKGZpcnN0Q2FsbCB8fCBpc0NoYW5nZVBhZ2UpICYmIHJlc2V0QWZ0ZXJDYWxsQXBpKSB7XG4gICAgICAgIHRoaXMuaGFzU2Nyb2xsLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQuc2V0KHJlc3VsdC5wYWdpbmc/LnRvdGFsX2l0ZW1zIHx8IDApO1xuICAgICAgdGhpcy5vdXRUb3RhbEl0ZW0uZW1pdCh0aGlzLnRvdGFsSXRlbUluQmFja2VuZCgpKTtcbiAgICAgIHRoaXMucGFnaW5nU3RvcmUudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCB0b3RhbF9pdGVtczogdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQoKSB8fCAwIH0pKTtcbiAgICAgIGlmICghaXNDaGFuZ2VQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnaW5nU3RvcmUuc2V0KHJlc3VsdC5wYWdpbmcpO1xuICAgICAgICBpZiAoIXRoaXMucGFnaW5nU3RvcmUoKSkge1xuICAgICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KFxuICAgICAgICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi5yZXN1bHQsIHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCkgfHwge30sIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIHRoaXMubG9hZGVkTGFzdEl0ZW0oKSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkZEl0ZW1zKGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSB8fCBbXSksIGZhbHNlLCB0cnVlKTtcbiAgICAgIHRoaXMub3V0TG9hZERhdGFDb21wbGV0ZS5lbWl0KHRoaXMuc3RvcmVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgdGhpcy5vdXRMb2FkRGF0YUVycm9yLmVtaXQoZXJyb3IgYXMgSUh0dHBSZXNwb25zZUVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkge1xuICAgIGlmICghdGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSB8fCAhdGhpcy5zaG93Rm9vdGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCkgfHwge30sIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIGZhbHNlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICB0aGlzLml0ZW1Gb290ZXIuc2V0KGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRJdGVtcyhpdGVtczogVFlQRV9EQVRBX1RBQkxFLCBhZGRGaXJzdDogYm9vbGVhbiwgaWdub3JlSGlnaHRMaWdodD86IGJvb2xlYW4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4sIGF1dG9Db3VudE5ld0l0ZW0/OiBib29sZWFuKSB7XG4gICAgaWYgKCFpdGVtcygpPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldCh0aGlzLml0ZW1zKCkubWFwKChpdGVtKSA9PiBgJHtnZXQ8dW5rbm93bj4oaXRlbSwgdGhpcy5maWVsZEtleSgpKX1gKSk7XG4gICAgY29uc3QgaXRlbXNBZGQ6IEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4gPSBbXTtcblxuICAgIGl0ZW1zKCkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YDtcbiAgICAgIGlmICghZXhpc3RpbmdLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgIGV4aXN0aW5nS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgaXRlbXNBZGQucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChpdGVtc0FkZC5sZW5ndGgpIHtcbiAgICAgIGlmIChhZGRGaXJzdCkge1xuICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZSgoZGF0YSkgPT4gWy4uLml0ZW1zQWRkLCAuLi5kYXRhXSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZSgoZGF0YSkgPT4gWy4uLml0ZW1zQWRkLCAuLi5kYXRhXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZSgoZGF0YSkgPT4gWy4uLmRhdGEsIC4uLml0ZW1zQWRkXSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZSgoZGF0YSkgPT4gWy4uLmRhdGEsIC4uLml0ZW1zQWRkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdXRvQ291bnROZXdJdGVtICYmIGl0ZW1zQWRkLmxlbmd0aCkge1xuICAgICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUgKyBpdGVtc0FkZC5sZW5ndGgpO1xuICAgIH1cbiAgICBpZiAoIWlnbm9yZUhpZ2h0TGlnaHQpIHtcbiAgICAgIHRoaXMuaXRlbXNIaWdodExpZ2h0LnVwZGF0ZSgoaXRlbXNIaWdodExpZ2h0KSA9PiBbLi4uaXRlbXNIaWdodExpZ2h0LCAuLi5pdGVtc0FkZF0pO1xuICAgICAgdGltZXIodGhpcy50aW1lSGlnaGxpZ2hOZXdJdGVtKCkpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBpdGVtc0FkZC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zSGlnaHRMaWdodC51cGRhdGUoKGl0ZW1zSGlnaHRMaWdodCkgPT4gaXRlbXNIaWdodExpZ2h0LmZpbHRlcigoaXRlbUhpZ2h0TGlnaHQpID0+IGl0ZW1IaWdodExpZ2h0ICE9PSBpdGVtKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gICAgaWYgKCFpZ25vcmVSZUNhbGxGb290ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlSXRlbXMoa2V5czogQXJyYXk8dW5rbm93bj4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4sIGF1dG9Db3VudE5ld0l0ZW0/OiBib29sZWFuKSB7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoKTtcbiAgICBpZiAoIXRoaXMuaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRoaXMuaXRlbXMudXBkYXRlKChpdGVtcykgPT4ge1xuICAgICAgICBsZXQgaXNVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChgJHtnZXQ8dW5rbm93bj4oaXRlbSwgdGhpcy5maWVsZEtleSgpKX1gID09PSBgJHtTdHJpbmcoa2V5KX1gKSB7XG4gICAgICAgICAgICBpc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXNVcGRhdGUgPyBuZXdJdGVtcyA6IGl0ZW1zO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoYCR7Z2V0PHVua25vd24+KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSl9YCA9PT0gYCR7U3RyaW5nKGtleSl9YCkge1xuICAgICAgICAgICAgaXNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGF1dG9Db3VudE5ld0l0ZW0pIHtcbiAgICAgICAgICAgICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1VwZGF0ZSA/IG5ld0l0ZW1zIDogaXRlbXM7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCF0aGlzLmtleXNTZWxlY3RlZCgpPy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFhdXRvQ291bnROZXdJdGVtKSB7XG4gICAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnVwZGF0ZSgoa2V5cykgPT4ga2V5cy5maWx0ZXIoKGtleVNlbGVjdGVkKSA9PiBrZXlTZWxlY3RlZCAhPT0ga2V5KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUgLSBrZXlzLmxlbmd0aCk7XG4gICAgYXdhaXQgdGhpcy5jaGVja1Njcm9sbCgpO1xuICAgIGlmICghaWdub3JlUmVDYWxsRm9vdGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0S2V5c1NlbGVjdGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaHR0cFJlcXVlc3REYXRhKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZ2luZ1N0b3JlKCk/LnRvdGFsX2l0ZW1zIHx8IHRoaXMuaXRlbXMoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMoKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGxvYWRNb3JlU3VjY2VzcyhkYXRhOiBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+Pikge1xuICAgIHRoaXMuYWRkSXRlbXMoZGF0YSwgZmFsc2UpO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tDYW5jZWxDb25kaXRpb25DaGVja2VkSXRlbShpdGVtOiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pIHtcbiAgICBsZXQgaXNDYW5jZWxDaGVjayA9IGZhbHNlO1xuXG4gICAgaWYgKCFpc0NhbmNlbENoZWNrICYmIHRoaXMuaGVhZGVyTGVmdCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlckxlZnQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuKSB7XG4gICAgICBpc0NhbmNlbENoZWNrID0gKGF3YWl0IGxhc3RWYWx1ZUZyb20oKHRoaXMuaGVhZGVyTGVmdCgpWzBdLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gYXMgYW55KSh7IGl0ZW06IGl0ZW0oKSB9KSkpIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaXNDYW5jZWxDaGVjayAmJiB0aGlzLmhlYWRlclJpZ2h0KCkubGVuZ3RoICYmIHRoaXMuaGVhZGVyUmlnaHQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuKSB7XG4gICAgICBpc0NhbmNlbENoZWNrID0gKGF3YWl0IGxhc3RWYWx1ZUZyb20oKHRoaXMuaGVhZGVyUmlnaHQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIGFzIGFueSkoeyBpdGVtOiBpdGVtKCkgfSkpKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNDYW5jZWxDaGVjaztcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclNvcnRMb2NhbChzb3J0OiBJU29ydCwgc2Nyb2xsTGVmdDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSAmJiB0aGlzLnN0b3JlcygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5pdGVtcy5zZXQodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpPy4oc2lnbmFsKFsuLi50aGlzLnN0b3JlcygpXSksIHsgLi4udGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSwgaW5zdGFuY2VTb3J0OiBzb3J0IH0pIHx8IFtdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGZpZWxkU29ydCwgbW9kZSB9ID0gc29ydDtcblxuICAgIHRoaXMuaXRlbXMudXBkYXRlKChpdGVtcykgPT4ge1xuICAgICAgaXRlbXMuc29ydCgoaXRlbUEsIGl0ZW1CKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZTEgPSBtb2RlID09PSAnYXNjJyA/IGl0ZW1BKClbZmllbGRTb3J0XSA6IGl0ZW1CKClbZmllbGRTb3J0XTtcbiAgICAgICAgbGV0IHZhbHVlMiA9IG1vZGUgPT09ICdhc2MnID8gaXRlbUIoKVtmaWVsZFNvcnRdIDogaXRlbUEoKVtmaWVsZFNvcnRdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUxID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHZhbHVlMSA9IGRlbGV0ZVVuaWNvZGUodmFsdWUxKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgIHZhbHVlMiA9IGRlbGV0ZVVuaWNvZGUodmFsdWUyKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlMSA9PT0gdmFsdWUyKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWUxID4gdmFsdWUyID8gMSA6IC0xO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgIH0pO1xuICAgIHRoaXMub25Tb3J0U3VjY2VzcyhzY3JvbGxMZWZ0KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKHBlclBhZ2U6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgYXJndW1lbnRzVmFsdWUgPSB0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpPy5hcmd1bWVudHNWYWx1ZTtcblxuICAgIGlmICghYXJndW1lbnRzVmFsdWUgfHwgIXRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgcmV0dXJuICctMSc7XG4gICAgfVxuICAgIGNvbnN0IGtleVBlclBhZ2UgPSB0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/LmtleVBlclBhZ2UgfHwgJ3Blcl9wYWdlJztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhcmd1bWVudCA9IGFyZ3VtZW50c1ZhbHVlW2ldO1xuXG4gICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBIdHRwUGFyYW1zICYmIGFyZ3VtZW50LmhhcyhrZXlQZXJQYWdlKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50UGVyUGFnZSA9IGdldDx1bmtub3duPihhcmd1bWVudCwga2V5UGVyUGFnZSwgJzI1JyBhcyBhbnkpO1xuXG4gICAgICAgIGFyZ3VtZW50ID0gYXJndW1lbnQuc2V0KGtleVBlclBhZ2UsIHBlclBhZ2UpO1xuICAgICAgICBzZXQoYXJndW1lbnRzVmFsdWUsIGAke2l9YCBhcyBhbnksIGFyZ3VtZW50KTtcblxuICAgICAgICByZXR1cm4gY3VycmVudFBlclBhZ2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIE9iamVjdCAmJiBPYmplY3Qua2V5cyhhcmd1bWVudCkuaW5jbHVkZXMoa2V5UGVyUGFnZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBnZXQoYXJndW1lbnQsIGtleVBlclBhZ2UsICcyNScpO1xuXG4gICAgICAgIHNldChhcmd1bWVudCwga2V5UGVyUGFnZSwgcGVyUGFnZSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQZXJQYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnLTEnO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNvcnRTdWNjZXNzKHNjcm9sbExlZnQ6IG51bWJlcikge1xuICAgIHRoaXMucmVzZXRTY3JvbGwoc2Nyb2xsTGVmdCwgMCk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFNjcm9sbChzY3JvbGxQb3NpdGlvbkxlZnQ/OiBudW1iZXIsIHNjcm9sbFBvc2l0aW9uVG9wPzogbnVtYmVyKSB7XG4gICAgY29uc3QgaGVhZGVyRWwgPSB0aGlzLmhlYWRlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoaGVhZGVyRWwpIHtcbiAgICAgIGhlYWRlckVsLnNjcm9sbExlZnQgPSBzY3JvbGxQb3NpdGlvbkxlZnQgfHwgMDtcbiAgICB9XG4gICAgY29uc3QgYm9keUVsID0gdGhpcy5ib2R5RWxlbWVudDtcbiAgICBpZiAoYm9keUVsKSB7XG4gICAgICBib2R5RWwuc2Nyb2xsVG9wID0gc2Nyb2xsUG9zaXRpb25Ub3AgfHwgMDtcbiAgICAgIGJvZHlFbC5zY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb25MZWZ0IHx8IDA7XG4gICAgfVxuICAgIGNvbnN0IGZvb3RlckVsID0gdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGZvb3RlckVsKSB7XG4gICAgICBmb290ZXJFbC5zY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb25MZWZ0IHx8IDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldChjbGVhclNvcnQ/OiBib29sZWFuKSB7XG4gICAgaWYgKGNsZWFyU29ydCkge1xuICAgICAgdGhpcy5pbnN0YW5jZVNvcnQoKT8ucmVzZXQoKTtcbiAgICAgIHRoaXMuaW5zdGFuY2VTb3J0LnNldCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB0aGlzLml0ZW1zLnNldChbXSk7XG4gICAgdGhpcy5zdG9yZXMuc2V0KFtdKTtcbiAgICB0aGlzLmZha2VSZXNwb25zZUFwaSgpO1xuICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tTY3JvbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFzU2Nyb2xsID0gdGhpcy5oYXNTY3JvbGwoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGltZXIoNTAwKVxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuYm9keUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzU2Nyb2xsLnNldCh0aGlzLmJvZHlFbGVtZW50LnNjcm9sbEhlaWdodCA+IHRoaXMuYm9keUVsZW1lbnQub2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhc1Njcm9sbCAmJiAhdGhpcy5oYXNTY3JvbGwoKSkge1xuICAgICAgICAgICAgdGhpcy5vdXRTY3JvbGxJc0dvbmUuZW1pdCh7fSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSkge1xuICAgICAgICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBib2R5RWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYm9keUVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGlnaHRMaWdodEl0ZW0oaXRlbXM6IEFycmF5PFRZUEVfSVRFTV9EQVRBX1RBQkxFPikge1xuICAgIHRoaXMuaXRlbXNIaWdodExpZ2h0LnVwZGF0ZSgoaXRlbXNIaWdodExpZ2h0KSA9PiBbLi4uaXRlbXNIaWdodExpZ2h0LCAuLi5pdGVtc10pO1xuXG4gICAgdGltZXIodGhpcy50aW1lSGlnaGxpZ2hOZXdJdGVtKCkpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgdGhpcy5pdGVtc0hpZ2h0TGlnaHQudXBkYXRlKChpdGVtc0hpZ2h0TGlnaHQpID0+IGl0ZW1zSGlnaHRMaWdodC5maWx0ZXIoKGl0ZW1IaWdodExpZ2h0KSA9PiBpdGVtSGlnaHRMaWdodCAhPT0gaXRlbSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0S2V5c1NlbGVjdGVkKG9ubHlXaGVuQXV0b0VuYWJsZWQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmIChvbmx5V2hlbkF1dG9FbmFibGVkICYmICF0aGlzLmF1dG9FbWl0S2V5c1NlbGVjdGVkV2l0aEl0ZW1zKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXV0b0VtaXRLZXlzU2VsZWN0ZWRXaXRoSXRlbXMoKSkge1xuICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmtleXNTZWxlY3RlZCgpXG4gICAgICAgIC5tYXAoKGtleSkgPT4gdGhpcy5pdGVtcygpLmZpbmQoKGl0ZW0pID0+IGAke2dldDx1bmtub3duPihpdGVtLCB0aGlzLmZpZWxkS2V5KCkpfWAgPT09IGAke2tleX1gKSlcbiAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+ID0+ICEhaXRlbSk7XG4gICAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSwgaXRlbXMgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dExlYXZlSXRlbSgpKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbFwiPlxuICBAaWYgKCFpZ25vcmVCYXIoKSkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcmVsYXRpdmUgei1bMV0gYm90dG9tLTAgbGVmdC0wIHctZnVsbCBiZy13aGl0ZSBsaWJzLXVpLXRhYmxlLXNoYWRvdy1ib3R0b20ge3sgY2xhc3NCYXJJbmNsdWRlKCkgfX1cIlxuICAgICAgW2NsYXNzLnB4LVsxNnB4XV09XCJrZXlzU2VsZWN0ZWQoKS5sZW5ndGggfHwgbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKVwiXG4gICAgICBbY2xhc3MucHktWzZweF1dPVwia2V5c1NlbGVjdGVkKCkubGVuZ3RoIHx8IGxhYmVsQmFyTm9TZWxlY3RJdGVtKClcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwicmVzZXRJbmRleEhvdmVyKCRldmVudClcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImRpdi5saWJzLXVpLXRhYmxlLWJhci1sZWZ0XCI+PC9uZy1jb250ZW50PlxuICAgICAgQGlmICgha2V5c1NlbGVjdGVkKCkubGVuZ3RoICYmIGxhYmVsQmFyTm9TZWxlY3RJdGVtKCkpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwie3sgY2xhc3NMYWJlbEJhck5vU2VsZWN0SXRlbUNzcygpIH19XCJcbiAgICAgICAgICBbaW5uZXJIdG1sXT1cImxhYmVsQmFyTm9TZWxlY3RJdGVtKCkgfCB0cmFuc2xhdGU6IHsgdmFsdWU6IHRvdGFsSXRlbURpc3BsYXkoKSB9XCI+PC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGtleXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcGwtWzEycHhdXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGgtZnVsbCBtdC1bLTJweF1cIj5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInRydWVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgZGlzYWJsZUNoZWNrYm94KClcIlxuICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VBbGxDaGVja2VkKClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVtIHRleHQtWyMwNzE2MzFdIG1yLVs4cHhdIHt7IGNsYXNzTGFiZWxCYXJCdXR0b25zKCkgfX1cIj5cbiAgICAgICAgICAgIHt7IGxhYmVsQmFyQnV0dG9ucygpIHwgdHJhbnNsYXRlOiB7IHZhbHVlOiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggfSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAoY29uZmlnU2VsZWN0TW9yZUl0ZW0oKSkge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cIntcbiAgICAgICAgICAgICAgICB3aWR0aEJ5UGFyZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IDIwNDgsXG4gICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlOiAnIXctWzEyMXB4XScsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIG1vZGU6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdENvbmZpZ01vcmVJdGVtKClcIlxuICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjVcIlxuICAgICAgICAgICAgICBjbGFzcz1cIiF3LVsxNnB4XSBoLVsxNnB4XSBtci1bOHB4XVwiXG4gICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkTW9yZUl0ZW0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2xNb3JlU2VsZWN0SXRlbSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLTAgbS0wJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2JlZm9yZTohdGV4dC1bMTZweF0gbGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwIG1yLVs2cHhdJ1wiXG4gICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwieyBjb25maWc6IHsgY29udGVudDogJ2kxOG5fbW9yZV9zZWxlY3QnIH0gfVwiXG4gICAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLVsxNnB4XSBsaWJzLXVpLWJvcmRlci1sZWZ0LWdlbmVyYWwgbWwtWzE2cHhdXCI+PC9kaXY+XG4gICAgICAgICAgQGlmIChiYXJCdXR0b25zKCk/Lmxlbmd0aCkge1xuICAgICAgICAgICAgQGZvciAoYnV0dG9uIG9mIGJhckJ1dHRvbnMoKTsgdHJhY2sgYnV0dG9uKSB7XG4gICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sTGFiZWwgPSBidXR0b24ubGFiZWwgfHwgJyAnO1xuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiYnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b24uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uc3RIdG1sTGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQmFyQnV0dG9uQ2xpY2soYnV0dG9uKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImRpdi5saWJzLXVpLXRhYmxlLWJhci1yaWdodFwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxkaXZcbiAgICAjdGFibGVDb250YWluZXJFbGVtZW50UmVmXG4gICAgY2xhc3M9XCJsaWJzLXVpLXRhYmxlIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCByZWxhdGl2ZSB7eyBjbGFzc1RhYmxlQ29udGFpbmVySW5jbHVkZSgpIH19XCJcbiAgICBbY2xhc3MucHgtWzE2cHhdXT1cIiFpZ25vcmVCYXIoKVwiXG4gICAgKG1vdXNlbGVhdmUpPVwiaGFuZGxlck1vdXNlTGVhdmVDb250YWluZXIoJGV2ZW50KVwiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsIHNocmluay0wXCJcbiAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5vZmZzZXRIZWlnaHRcIlxuICAgICAgW2NsYXNzLiFoaWRkZW5dPVwiIWl0ZW1zKCkubGVuZ3RoICYmIGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNoZWFkZXJFbGVtZW50UmVmXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIFtvcHRpb25zXT1cInsgc2Nyb2xsYmFyV2lkdGg6IDAgfVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1ib3R0b20tZGFzaGVkLWdlbmVyYWxdPVwiIWhhc0l0ZW1IaWdodExpZ2h0KCkgJiYgaXNEYXNoQm9yZGVyKClcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWxdPVwiIWhhc0l0ZW1IaWdodExpZ2h0KCkgJiYgIWlzRGFzaEJvcmRlcigpXCJcbiAgICAgICAgW2NsYXNzXT1cImNsYXNzSGVhZGVyQ29udGFpbmVyKClcIlxuICAgICAgICAob3V0U2Nyb2xsKT1cImhhbmRsZXJTY3JvbGxIZWFkZXIoJGV2ZW50KVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJNb3VzZUVudGVySGVhZGVyKCRldmVudClcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVyTW91c2VMZWF2ZUhlYWRlcigkZXZlbnQpXCI+XG4gICAgICAgIEBpZiAoaGVhZGVyTGVmdCgpLmxlbmd0aCkge1xuICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNsYXNzSGVhZGVyTGVmdENvbnRhaW5lcigpXCI+XG4gICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyTGVmdCgpOyB0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmOyBjb250ZXh0OiB7IGhlYWRlckl0ZW06IGhlYWRlciwgaXNIZWFkZXJMZWZ0OiB0cnVlIH1cIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICBAbGV0IGNvbnN0SHRtbEZ1bmN0aW9uR2V0V2lkdGhJdGVtID0gZnVuY3Rpb25HZXRXaWR0aEl0ZW0oKTtcbiAgICAgICAgICBAaWYgKHVzZVNjcm9sbE1lYXN1cmVDb2x1bW4oKSAmJiBjb25zdEh0bWxGdW5jdGlvbkdldFdpZHRoSXRlbSkge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggdy1mdWxsIGgtZnVsbCByZWxhdGl2ZVwiXG4gICAgICAgICAgICAgIExpYnNVaVNjcm9sbE1lYXN1cmVJdGVtRGlyZWN0aW9uSG9yaXpvbnRhbERpcmVjdGl2ZVxuICAgICAgICAgICAgICBbZWxlbWVudFNjcm9sbF09XCJoZWFkZXJFbGVtZW50UmVmXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cImhlYWRlclJpZ2h0KClcIlxuICAgICAgICAgICAgICBbZnVuY3Rpb25HZXRXaWR0aEl0ZW1dPVwiY29uc3RIdG1sRnVuY3Rpb25HZXRXaWR0aEl0ZW1cIlxuICAgICAgICAgICAgICAob3V0Vmlld1BvcnRJdGVtKT1cImhhbmRsZXJPdXRWaWV3UG9ydEl0ZW1IZWFkZXJSaWdodCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG91dFBhZGRpbmdMZWZ0KT1cImhhbmRsZXJPdXRQYWRkaW5nTGVmdEhlYWRlclJpZ2h0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlclJpZ2h0Vmlld1BvcnQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlSGVhZGVyUmVmOyBjb250ZXh0OiB7IGhlYWRlckl0ZW06IGhlYWRlciwgaXNIZWFkZXJMZWZ0OiBmYWxzZSB9XCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlclJlZjsgY29udGV4dDogeyBoZWFkZXJJdGVtOiBoZWFkZXIsIGlzSGVhZGVyTGVmdDogZmFsc2UgfVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKHNob3dGb290ZXIoKSAmJiBpdGVtRm9vdGVyKCkgJiYgY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ3RvcCcpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUZvb3RlclJlZlwiIC8+XG4gICAgfVxuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgb3ZlcmZsb3cteC1oaWRkZW4gYmctd2hpdGUge3sgY2xhc3NCb2R5SW5jbHVkZSgpIHx8ICcnIH19XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNib2R5RWxlbWVudFJlZlxuICAgICAgICBjbGFzcz1cImZsZXggaC1mdWxsIHctZnVsbCByZWxhdGl2ZVwiXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIChvdXRTY3JvbGwpPVwiaGFuZGxlclNjcm9sbEJvZHkoJGV2ZW50KVwiXG4gICAgICAgIChvdXRTY3JvbGxCb3R0b20pPVwiaGFuZGxlclNjcm9sbEJvdHRvbSgkZXZlbnQpXCI+XG4gICAgICAgIEBpZiAoaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICA8dmlydHVhbC1zY3JvbGxlclxuICAgICAgICAgICAgI2JvZHlDb21wb25lbnRSZWZcbiAgICAgICAgICAgIFtpdGVtc109XCJpdGVtcygpXCJcbiAgICAgICAgICAgIFtlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplc109XCJlbmFibGVVbmVxdWFsQ2hpbGRyZW5TaXplcygpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoID4gKGJvZHlFbGVtZW50UmVmID8gYm9keUVsZW1lbnRSZWYuc2Nyb2xsV2lkdGggOiAwKSA/IGhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGggOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW3BhcmVudFNjcm9sbF09XCJib2R5RWxlbWVudFJlZlwiXG4gICAgICAgICAgICBbYnVmZmVyQW1vdW50XT1cImJ1ZmZlckFtb3VudCgpXCI+XG4gICAgICAgICAgICBAZm9yIChkYXRhIG9mIGJvZHlDb21wb25lbnRSZWYudmlld1BvcnRJdGVtczsgdHJhY2sgZGF0YSgpKSB7XG4gICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbSA9IGRhdGEgfCBMaWJzVWlUYWJsZUNoZWNrSXRlbUhpZ2h0TGlnaHRQaXBlOiBpdGVtc0hpZ2h0TGlnaHQoKTtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICNlbGVtZW50SG92ZXJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2YzZmNmY11dPVwiY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLXRvcC0xcHgtMzZkM2QzXT1cImNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW0gJiYgJGZpcnN0ICYmICFpZ25vcmVCb3JkZXJJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1ib3R0b20tMXB4LTM2ZDNkM109XCJjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtICYmICFpZ25vcmVCb3JkZXJJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbSB8fCAoJGxhc3QgJiYgaWdub3JlQm9yZGVySXRlbUxhc3QoKSlcbiAgICAgICAgICAgICAgICAgICAgPyAnbGlicy11aS1ib3JkZXItcmFkaXVzLWJvdHRvbS1sZWZ0LTRweCBsaWJzLXVpLWJvcmRlci1yYWRpdXMtYm90dG9tLXJpZ2h0LTRweCdcbiAgICAgICAgICAgICAgICAgICAgOiBpZ25vcmVCb3JkZXJJdGVtKClcbiAgICAgICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgOiBpc0Rhc2hCb3JkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnbGlicy11aS1ib3JkZXItYm90dG9tLWRhc2hlZC1nZW5lcmFsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJnLVsjZjhmOWZhXV09XCJpdGVtT2ZJbmRleEhvdmVyID09PSBkYXRhICYmICFjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRJbmRleEhvdmVyKCRldmVudCwgZGF0YSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGggfHwgaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctd2hpdGVdPVwiIWNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHB4LVsxMnB4XSBweS1bOHB4XSB7eyBoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnJyA6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmOGY5ZmFdXT1cIml0ZW1PZkluZGV4SG92ZXIgPT09IGRhdGEgJiYgIWNvbnN0SHRtbElzSGlnaHRMaWdodEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyTGVmdCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7IHdpZHRoOiAnNTBweCcsICdmbGV4LXNocmluayc6ICcwJywgcGFkZGluZzogJzhweCcgfSA6IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmOyBjb250ZXh0OiB7IGhlYWRlcjogaGVhZGVyLCBkYXRhOiBkYXRhLCBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtOiBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChoZWFkZXJSaWdodCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh1c2VTY3JvbGxNZWFzdXJlQ29sdW1uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgbWluLXctMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctbGVmdC5weF09XCJwYWRkaW5nTGVmdEhlYWRlclJpZ2h0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHRWaWV3UG9ydCgpOyB0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHB4LVsxMnB4XSBweS1bOHB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogaGVhZGVyTGVmdCgpIDogaGVhZGVyUmlnaHQoKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7IHdpZHRoOiAnNTBweCcsICdmbGV4LXNocmluayc6ICcwJywgcGFkZGluZzogJzhweCcgfSA6IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmOyBjb250ZXh0OiB7IGhlYWRlcjogaGVhZGVyLCBkYXRhOiBkYXRhLCBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtOiBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTsgdHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHB4LVsxMnB4XSBweS1bOHB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhlYWRlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJSaWdodCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7IHdpZHRoOiAnNTBweCcsICdmbGV4LXNocmluayc6ICcwJywgcGFkZGluZzogJzhweCcgfSA6IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmOyBjb250ZXh0OiB7IGhlYWRlcjogaGVhZGVyLCBkYXRhOiBkYXRhLCBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtOiBjb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpICYmIGRhdGEoKS5zcGVjaWZpY0V4cGFuZCAmJiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNzc1dyYXBwZXIgfHwgJ2ZsZXggdy1mdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUV4cGFuZCBvZiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSgpOyB0cmFjayBkYXRhRXhwYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uY29sVGVtcGxhdGVDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG9wdGltaXplVGFibGVSZW5kZXJCeU9uVmlld3BvcnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGRlZmVyIChvbiB2aWV3cG9ydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cImRhdGFFeHBhbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAcGxhY2Vob2xkZXIge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICd3LWZ1bGwgaC1mdWxsJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiZGF0YUV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBoLVsxMDBweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb2RhdGFSZWZcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3ZpcnR1YWwtc2Nyb2xsZXI+XG4gICAgICAgIH0gQGVsc2UgaWYgKCFsb2FkaW5nKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RpY2t5IGxlZnQtMCB0b3AtMCB6LVsxXSBoLVtjYWxjKDEwMCUtMTBweCldIHctZnVsbFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlTm9kYXRhUmVmXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKHNob3dTY3JvbGxUYWJsZVBpbm5lZElmTm9EYXRhKCkpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBoLVsxcHhdIGJnLXRyYW5zcGFyZW50IHRvcC0wIGxlZnQtMCB6LVsxXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoXCI+PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGlmIChzaG93Rm9vdGVyKCkgJiYgaXRlbUZvb3RlcigpICYmIGN1c3RvbVBvc2l0aW9uRm9vdGVyKCkgPT09ICdib3R0b20nKSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUZvb3RlclJlZlwiIC8+XG4gICAgICB9XG5cbiAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSB3LWZ1bGwgaC1mdWxsIHotWzJdIGZsZXggaXRlbXMtY2VudGVyIGNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zcGlubmVyIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChhY3Rpdml0eUxvYWREYXRhKCkgPT09ICdjbGljay1wYWdpbmF0aW9uJykge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIG10LVsxMnB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBhZ2luYXRpb25cbiAgICAgICAgICBbbW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZV09XCJwYWdpbmF0aW9uQ29uZmlnKCkubW9kZURpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZVwiXG4gICAgICAgICAgW2NsYXNzRGlzcGxheVRvdGFsUGFnZUFuZEdvdG9QYWdlXT1cInBhZ2luYXRpb25Db25maWcoKS5jbGFzc0Rpc3BsYXlUb3RhbFBhZ2VBbmRHb3RvUGFnZVwiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZUl0ZW1dPVwicGFnaW5hdGlvbkNvbmZpZygpLmNsYXNzSW5jbHVkZUl0ZW1cIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVDb250YWluZXJdPVwicGFnaW5hdGlvbkNvbmZpZygpLmNsYXNzSW5jbHVkZUNvbnRhaW5lclwiXG4gICAgICAgICAgW2Rpc2FibGVdPVwicGFnaW5hdGlvbkNvbmZpZygpLmRpc2FibGVcIlxuICAgICAgICAgIFtudW1iZXJQYWdlRGlzcGxheV09XCJwYWdpbmF0aW9uQ29uZmlnKCkubnVtYmVyUGFnZURpc3BsYXlcIlxuICAgICAgICAgIFtmaXJzdFBhZ2VTdGFydE51bWJlcl09XCJwYWdpbmF0aW9uQ29uZmlnKCkuZmlyc3RQYWdlU3RhcnROdW1iZXJcIlxuICAgICAgICAgIFtzaG93VG90YWxQYWdlXT1cInBhZ2luYXRpb25Db25maWcoKS5zaG93VG90YWxQYWdlXCJcbiAgICAgICAgICBbc2hvd0lucHV0R290b1BhZ2VdPVwicGFnaW5hdGlvbkNvbmZpZygpLnNob3dJbnB1dEdvdG9QYWdlXCJcbiAgICAgICAgICBbdG90YWxJdGVtc109XCJwYWdpbmdUb3RhbEl0ZW1zKClcIlxuICAgICAgICAgIFtwZXJQYWdlXT1cInBhZ2luZ1BlclBhZ2UoKVwiXG4gICAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2luZ0N1cnJlbnRQYWdlKClcIlxuICAgICAgICAgIChvdXRQYWdlU2VsZWN0KT1cImhhbmRsZXJDaGFuZ2VQYWdlKCRldmVudClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgI3RlbXBsYXRlSGVhZGVyUmVmXG4gIGxldC1oZWFkZXI9XCJoZWFkZXJJdGVtXCJcbiAgbGV0LWlzSGVhZGVyTGVmdD1cImlzSGVhZGVyTGVmdFwiPlxuICA8ZGl2XG4gICAgW2NsYXNzXT1cIidyZWxhdGl2ZSBmbGV4ICcgKyAoaGVhZGVyLnBhZGRpbmdMZWZ0UmlnaHRIZWFkZXJDb250YWluZXIgPz8gJyBweC1bMTJweF0gJykgKyAoaXNIZWFkZXJMZWZ0ICYmICFoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnIGxpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwgJyA6ICcgJykgKyAnIGxpYnMtdWktdGFibGUtaGVhZGVyLWNvbCAnXCJcbiAgICBbY2xhc3MuZmxleC1jb2xdPVwiaGVhZGVyLnJvd3NDb25maWdcIlxuICAgIFtjbGFzcy5weS1bOHB4XV09XCIhaGVhZGVyLmlnbm9yZVB5RGVmYXVsdFwiXG4gICAgW25nU3R5bGVdPVwiXG4gICAgICAoaGVhZGVyIHwgTGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTogKGlzSGVhZGVyTGVmdCA/IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJMZWZ0IHx8IGZhbHNlIDogaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyKCk/LmhlYWRlclJpZ2h0IHx8IGZhbHNlKSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBoZWFkZXJMZWZ0KCkgOiBoZWFkZXJSaWdodCgpKSB8fFxuICAgICAgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8geyB3aWR0aDogJzUwcHgnLCAnZmxleC1zaHJpbmsnOiAnMCcsIHBhZGRpbmc6ICc4cHgnIH0gOiB7fSlcbiAgICBcIlxuICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgQGlmICghaGVhZGVyLnJvd3NDb25maWcpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7IGNvbnRleHQ6IHsgaGVhZGVySXRlbTogaGVhZGVyLCBpc0NvbFJlbmRlcjogZmFsc2UsIGlzSGVhZGVyTGVmdDogaXNIZWFkZXJMZWZ0IH1cIiAvPlxuICAgIH1cbiAgICBAaWYgKGhlYWRlci5yb3dzQ29uZmlnOyBhcyByb3dzQ29uZmlnKSB7XG4gICAgICBAZm9yIChyb3cgb2Ygcm93c0NvbmZpZy5yb3dzOyB0cmFjayByb3cpIHtcbiAgICAgICAgPGRpdiBbY2xhc3NdPVwicm93LmNsYXNzUm93XCI+XG4gICAgICAgICAgQGZvciAoY29sIG9mIHJvdy5jb2xzOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7IGNvbnRleHQ6IHsgaGVhZGVySXRlbTogY29sLCBpc0NvbFJlbmRlcjogdHJ1ZSwgaXNIZWFkZXJMZWZ0OiBpc0hlYWRlckxlZnQgfVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICN0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWZcbiAgbGV0LWhlYWRlcj1cImhlYWRlckl0ZW1cIlxuICBsZXQtaXNDb2xSZW5kZXI9XCJpc0NvbFJlbmRlclwiXG4gIGxldC1pc0hlYWRlckxlZnQ9XCJpc0hlYWRlckxlZnRcIj5cbiAgPGRpdlxuICAgICNpdGVtSGVhZGVyUmVmXG4gICAgY2xhc3M9XCJmbGV4IGxpYnMtdWktZm9udC1oNm0gbWluLWgtWzE4cHhdIHRleHQtWyM2YTczODNdIG1heC13LWZ1bGxcIlxuICAgIFtjbGFzcy5pdGVtcy1jZW50ZXJdPVwiaGVhZGVyLmNvbnRlbnRIZWFkZXJBbGlnbkNlbnRlciA/PyB0cnVlXCJcbiAgICBbY2xhc3MuanVzdGlmeS1lbmRdPVwiaGVhZGVyLmNvbnRlbnRIZWFkZXJKdXN0aWZ5Q29udGVudEVuZFwiXG4gICAgW2NsYXNzLnctZnVsbF09XCJoZWFkZXIuaXNTaG93SW5kZXhPblJvd1wiXG4gICAgW25nU3R5bGVdPVwiXG4gICAgICBpc0NvbFJlbmRlclxuICAgICAgICA/IChoZWFkZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiAoaXNIZWFkZXJMZWZ0ID8gaWdub3JlQ2FsY3VsYXRvcldpZHRoSGVhZGVyKCk/LmhlYWRlckxlZnQgfHwgZmFsc2UgOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UpIDogaGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aCA6IGhlYWRlckxlZnQoKSA6IGhlYWRlclJpZ2h0KCkpIHx8XG4gICAgICAgICAgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8geyB3aWR0aDogJzUwcHgnLCAnZmxleC1zaHJpbmsnOiAnMCcsIHBhZGRpbmc6ICc4cHgnIH0gOiB7fSlcbiAgICAgICAgOiB7fVxuICAgIFwiXG4gICAgW25nQ2xhc3NdPVwiaXNDb2xSZW5kZXIgPyBoZWFkZXIubmdDbGFzcyB8fCB7fSA6IHt9XCI+XG4gICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3gpIHtcbiAgICAgIEBpZiAoaGVhZGVyLmhhc0NoZWNrYm94QWxsKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImZsZXggaC1mdWxsIHt7IGhlYWRlci5jaGVja2JveEFsbENsYXNzSW5jbHVkZSB8fCAnbXItWzE2cHhdJyB9fVwiXG4gICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY2hlY2tib3hBbGlnbkNlbnRlclwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXG4gICAgICAgICAgICBba2V5XT1cIidhbGwnXCJcbiAgICAgICAgICAgIFtzdGlsbE90aGVyT3B0aW9uc109XCIhIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBrZXlzU2VsZWN0ZWQoKS5sZW5ndGggIT09IGl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cIiEha2V5c1NlbGVjdGVkKCkubGVuZ3RoICYmIGtleXNTZWxlY3RlZCgpLmxlbmd0aCA9PT0gaXRlbXMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiaGVhZGVyLmNoZWNrYm94Q2xhc3NJbmNsdWRlXCJcbiAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUNoZWNrZWRBbGxJdGVtcygkZXZlbnQpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIG1sLVsyNHB4XSB7eyBoZWFkZXIuY2hlY2tib3hDbGFzc0luY2x1ZGUgfX1cIj48L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gICAgQGZvciAodG9vbHRpcCBvZiBoZWFkZXIudG9vbHRpcHNMZWZ0OyB0cmFjayB0b29sdGlwKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibXItWzRweF1cIj5cbiAgICAgICAgQGxldCBjb25zdEh0bWxUb29sdGlwID0gdG9vbHRpcC5kYXRhVmlldyB8fCAnICc7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIFt0eXBlXT1cInRvb2x0aXA/LnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgW21vZGVdPVwidG9vbHRpcD8ubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cInRvb2x0aXAuY2xhc3NJbmNsdWRlIHx8ICd0ZXh0LVsjNmE3MzgzXSdcIlxuICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0b29sdGlwLmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cIlxuICAgICAgICAgICAgdG9vbHRpcC5jb25maWcgfHwge1xuICAgICAgICAgICAgICBjb250ZW50OiBjb25zdEh0bWxUb29sdGlwIHwgdHJhbnNsYXRlLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIG1vZGU6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgICAgICAgIGF1dG9VcGRhdGVQb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgZW5kRGlzdGFuY2U6IDEyLFxuICAgICAgICAgICAgICAgICAgc3RhcnREaXN0YW5jZTogLTEyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvb2x0aXAuZGF0YVZpZXdcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdykge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGgtZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIge3sgaGVhZGVyLmNsYXNzSW5jbHVkZUluZGV4T25Sb3cgfHwgJycgfX1cIj5cbiAgICAgICAge3sgaGVhZGVyLmxhYmVsID8/ICcjJyB9fVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICBAaWYgKGhlYWRlci5sYWJlbCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGhlYWRlci5wYXJzZVZhbHVlIDogaGVhZGVyIHwgYXN5bmMgfCB0cmFuc2xhdGU7IGFzIGxhYmVsSGVhZGVyQ29sdW1uKSB7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIFt0eXBlXT1cImhlYWRlcj8ubGFiZWxDb25maWc/LnR5cGUgfHwgJ3RleHQnXCJcbiAgICAgICAgICBbbW9kZV09XCJoZWFkZXI/LmxhYmVsQ29uZmlnPy5tb2RlIHx8ICdob3ZlcidcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8uaWdub3JlU2hvd1Rvb2x0aXAgfHwgZmFsc2VcIlxuICAgICAgICAgIFtjb25maWddPVwiaGVhZGVyLmxhYmVsQ29uZmlnPy5jb25maWcgfHwgeyBjb250ZW50OiBsYWJlbEhlYWRlckNvbHVtbiB9XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImxhYmVsSGVhZGVyQ29sdW1uXCIgLz5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAZm9yICh0b29sdGlwIG9mIGhlYWRlci50b29sdGlwc1JpZ2h0OyB0cmFjayB0b29sdGlwKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWwtWzRweF1cIj5cbiAgICAgICAgQGxldCBjb25zdEh0bWxUb29sdGlwID0gdG9vbHRpcC5kYXRhVmlldyB8fCAnICc7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIFt0eXBlXT1cInRvb2x0aXA/LnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgW21vZGVdPVwidG9vbHRpcD8ubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cInRvb2x0aXAuY2xhc3NJbmNsdWRlIHx8ICd0ZXh0LVsjNmE3MzgzXSdcIlxuICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0b29sdGlwLmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cIlxuICAgICAgICAgICAgdG9vbHRpcC5jb25maWcgfHwge1xuICAgICAgICAgICAgICBjb250ZW50OiBjb25zdEh0bWxUb29sdGlwIHwgdHJhbnNsYXRlLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIG1vZGU6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgICAgICAgIGF1dG9VcGRhdGVQb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgZW5kRGlzdGFuY2U6IDEyLFxuICAgICAgICAgICAgICAgICAgc3RhcnREaXN0YW5jZTogLTEyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInRvb2x0aXAuZGF0YVZpZXdcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaGFzU29ydCAmJiBoZWFkZXIub3JkZXJieSkge1xuICAgICAgPGRpdiBjbGFzcz1cIm1sLVs0cHhdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1zb3J0LWFycm93XG4gICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8ICFpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgW2ZpZWxkU29ydF09XCJoZWFkZXIub3JkZXJieVwiXG4gICAgICAgICAgW2lnbm9yZVBvcG92ZXJDb250ZW50XT1cImhlYWRlci5zb3J0SWdub3JlVG9vbHRpcENvbnRlbnQgPz8gdHJ1ZVwiXG4gICAgICAgICAgW3BvcG92ZXJDb250ZW50QXNjXT1cImhlYWRlci5zb3J0VG9vbHRpcENvbnRlbnRBc2NcIlxuICAgICAgICAgIFtwb3BvdmVyQ29udGVudERlc2NdPVwiaGVhZGVyLnNvcnRUb29sdGlwQ29udGVudERlc2NcIlxuICAgICAgICAgIFtkZWZhdWx0TW9kZV09XCJoZWFkZXIuZGVmYXVsdE1vZGVcIlxuICAgICAgICAgIFt6SW5kZXhdPVwiaGVhZGVyLnpJbmRleFRvb2x0aXBTb3J0XCJcbiAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VTb3J0KCRldmVudClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmIChoZWFkZXIubGFiZWxEZXNjcmlwdGlvbikge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogaGVhZGVyLmxhYmVsRGVzY3JpcHRpb24uY29udGVudCB8IHRyYW5zbGF0ZSB9XCJcbiAgICAgICAgW2lubmVySFRNTF09XCJoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jb250ZW50IHwgdHJhbnNsYXRlXCIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICN0ZW1wbGF0ZUJvZHlSZWZcbiAgbGV0LWhlYWRlcj1cImhlYWRlclwiXG4gIGxldC1kYXRhPVwiZGF0YVwiXG4gIGxldC1jb25zdEh0bWxJc0hpZ2h0TGlnaHRJdGVtPVwiY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsXCI+XG4gICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3gpIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbFwiXG4gICAgICAgIFtjbGFzcy5pbnZpc2libGVdPVwiaGVhZGVyLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gJiYgKGRhdGEoKSB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGhlYWRlci5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIDogZGF0YSgpIHwgYXN5bmMpXCJcbiAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY2hlY2tib3hBbGlnbkNlbnRlclwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZVxuICAgICAgICAgIFtrZXldPVwiZGF0YSgpW2ZpZWxkS2V5KCldXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOiBrZXlzU2VsZWN0ZWQoKSA6IGtleXNTZWxlY3RlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8IGRpc2FibGVDaGVja2JveCgpIHx8ICEhKG1heEl0ZW1TZWxlY3RlZCgpICYmICEoZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOiBrZXlzU2VsZWN0ZWQoKSA6IGtleXNTZWxlY3RlZCgpLmxlbmd0aCkgJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoID49IG1heEl0ZW1TZWxlY3RlZCgpKVwiXG4gICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoJGV2ZW50LCBkYXRhKCkpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3c7IGFzIGNvbmZpZykge1xuICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBsaWJzLXVpLWZvbnQtaDRye3sgY29uZmlnLmNsYXNzSW5jbHVkZUluZGV4T25Sb3cgfHwgJycgfX1cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICBbY29uZmlnXT1cInt9XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImRhdGEgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBnZXRJbmRleFJvdyB8IGFzeW5jXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5jb2xUZW1wbGF0ZUNvbmZpZykge1xuICAgICAgQGxldCBjb25zdEh0bWxJc0hvdmVyID0gaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhY29uc3RIdG1sSXNIaWdodExpZ2h0SXRlbTtcbiAgICAgIEBpZiAob3B0aW1pemVUYWJsZVJlbmRlckJ5T25WaWV3cG9ydCgpKSB7XG4gICAgICAgIEBkZWZlciAob24gdmlld3BvcnQpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgW2lzSG92ZXJdPVwiY29uc3RIdG1sSXNIb3ZlclwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgICAgW2l0ZW1dPVwiZGF0YVwiXG4gICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImhlYWRlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgW2NvbmZpZ3NdPVwiaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgfSBAcGxhY2Vob2xkZXIge1xuICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImhlYWRlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICd3LWZ1bGwgaC1mdWxsJ1wiPjwvZGl2PlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICBbaXNIb3Zlcl09XCJjb25zdEh0bWxJc0hvdmVyXCJcbiAgICAgICAgICBbY2xhc3NdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgIFtpdGVtXT1cImRhdGFcIlxuICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgW2NvbmZpZ3NdPVwiaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUZvb3RlclJlZj5cbiAgQGlmICghaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhKCkgfHwgKGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpICYmIGl0ZW1zKCkubGVuZ3RoKSkge1xuICAgIDxkaXZcbiAgICAgICNmb290ZXJFbGVtZW50UmVmXG4gICAgICBjbGFzcz1cImZsZXggdy1mdWxsIGJnLVsjZjhmOWZhXSBvdmVyZmxvdy14LWhpZGRlbiB6LVsxXSB7eyBpZ25vcmVCb3JkZXJGb290ZXIoKSA/ICcnIDogY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ3RvcCcgPyAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnIDogJ2xpYnMtdWktdGFibGUtc2hhZG93LXRvcCBsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCcgfX0gbWluLWgtWzM1cHhdXCJcbiAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJNb3VzZUVudGVyRm9vdGVyKCRldmVudClcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwiaGFuZGxlck1vdXNlTGVhdmVGb290ZXIoJGV2ZW50KVwiPlxuICAgICAgQGlmIChmb290ZXJMZWZ0KCkpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICNmb290ZXJMZWZ0RWxlbWVudFJlZlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBzdGlja3kgdG9wLTAgbGVmdC0wIHotWzFdIGJnLVsjZjhmOWZhXVwiPlxuICAgICAgICAgIEBmb3IgKGZvb3RlciBvZiBmb290ZXJMZWZ0KCk7IHRyYWNrIGZvb3Rlcikge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB4LVsxMnB4XSBweS1bOHB4XSB7eyBmb290ZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnJyA6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihmb290ZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyTGVmdCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBmb290ZXJMZWZ0KCkgOiBmb290ZXJSaWdodCgpKSB8fCB7fVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvb3Rlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgIEBpZiAoZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnICYmIGl0ZW1Gb290ZXIoKSkge1xuICAgICAgICAgICAgICAgIEBpZiAob3B0aW1pemVUYWJsZVJlbmRlckJ5T25WaWV3cG9ydCgpKSB7XG4gICAgICAgICAgICAgICAgICBAZGVmZXIgKG9uIHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICB9IEBwbGFjZWhvbGRlciB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICd3LWZ1bGwgaC1mdWxsJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChmb290ZXJSaWdodCgpOyBhcyBmb290ZXJSaWdodExpc3QpIHtcbiAgICAgICAgQGxldCBjb25zdEh0bWxGdW5jdGlvbkdldFdpZHRoSXRlbUZvb3RlciA9IGZ1bmN0aW9uR2V0V2lkdGhJdGVtKCk7XG4gICAgICAgIEBpZiAodXNlU2Nyb2xsTWVhc3VyZUNvbHVtbigpICYmIGNvbnN0SHRtbEZ1bmN0aW9uR2V0V2lkdGhJdGVtRm9vdGVyKSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LWZ1bGwgcmVsYXRpdmVcIlxuICAgICAgICAgICAgTGlic1VpU2Nyb2xsTWVhc3VyZUl0ZW1EaXJlY3Rpb25Ib3Jpem9udGFsRGlyZWN0aXZlXG4gICAgICAgICAgICBbZWxlbWVudFNjcm9sbF09XCJmb290ZXJFbGVtZW50UmVmXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJmb290ZXJSaWdodExpc3RcIlxuICAgICAgICAgICAgW2Z1bmN0aW9uR2V0V2lkdGhJdGVtXT1cImNvbnN0SHRtbEZ1bmN0aW9uR2V0V2lkdGhJdGVtRm9vdGVyXCJcbiAgICAgICAgICAgIChvdXRWaWV3UG9ydEl0ZW0pPVwiaGFuZGxlck91dFZpZXdQb3J0SXRlbUZvb3RlclJpZ2h0KCRldmVudClcIj5cbiAgICAgICAgICAgIEBmb3IgKGZvb3RlciBvZiBmb290ZXJSaWdodFZpZXdQb3J0KCk7IHRyYWNrIGZvb3Rlcikge1xuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTJweF0gcHktWzhweF1cIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihmb290ZXIgfCBMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOiBpZ25vcmVDYWxjdWxhdG9yV2lkdGhIZWFkZXIoKT8uaGVhZGVyUmlnaHQgfHwgZmFsc2UgOiBoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoIDogZm9vdGVyTGVmdCgpIDogZm9vdGVyUmlnaHRMaXN0KSB8fCB7fVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgICBAaWYgKGZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZyAmJiBpdGVtRm9vdGVyKCkpIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAob3B0aW1pemVUYWJsZVJlbmRlckJ5T25WaWV3cG9ydCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBkZWZlciAob24gdmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIH0gQHBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVySG9zdCB8fCAndy1mdWxsIGgtZnVsbCdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbUZvb3RlciB8IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjb25maWdzXT1cImZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgQGZvciAoZm9vdGVyIG9mIGZvb3RlclJpZ2h0TGlzdDsgdHJhY2sgZm9vdGVyKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwiKGZvb3RlciB8IExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6IGlnbm9yZUNhbGN1bGF0b3JXaWR0aEhlYWRlcigpPy5oZWFkZXJSaWdodCB8fCBmYWxzZSA6IGhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGggOiBmb290ZXJMZWZ0KCkgOiBmb290ZXJSaWdodExpc3QpIHx8IHt9XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgQGlmIChmb290ZXIuY29sVGVtcGxhdGVDb25maWcgJiYgaXRlbUZvb3RlcigpKSB7XG4gICAgICAgICAgICAgICAgQGlmIChvcHRpbWl6ZVRhYmxlUmVuZGVyQnlPblZpZXdwb3J0KCkpIHtcbiAgICAgICAgICAgICAgICAgIEBkZWZlciAob24gdmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtRm9vdGVyIHwgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICAgIH0gQHBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3NdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJ3ctZnVsbCBoLWZ1bGwnXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlc1xuICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtRm9vdGVyIHwgTGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImZvb3Rlci50ZW1wbGF0ZUNzc1dyYXBwZXJIb3N0IHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJmb290ZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlTm9kYXRhUmVmPlxuICBAaWYgKGtleVNlYXJjaCgpIHx8IG9ubHlTaG93Tm9SZXN1bHQoKSkge1xuICAgIEBpZiAodGVtcGxhdGVOb1Jlc3VsdCgpOyBhcyB0ZW1wbGF0ZU5vUmVzdWx0KSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb1Jlc3VsdFwiIC8+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBhYnNvbHV0ZSBsZWZ0LTAgdG9wLTAgei1bMV1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgc2hyaW5rLTBcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cIiduby1yZXN1bHQnIHwgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB8IGFzeW5jOyBpbnB1dHM6IHsgc2l6ZTogNjQgfVwiIC8+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLXRhYmxlLW5vLWRhdGEtY29uZmlnLXRleHRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwibm9EYXRhQ29uZmlnKCkubmdTdHlsZVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJub0RhdGFDb25maWcoKS5uZ0NsYXNzXCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwibm9EYXRhU2VhcmNoVGV4dCgpIHwgdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9IEBlbHNlIHtcbiAgICBAaWYgKHRlbXBsYXRlTm9EYXRhKCk7IGFzIHRlbXBsYXRlTm9EYXRhKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb0RhdGFcIiAvPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgYWJzb2x1dGUgbGVmdC0wIHRvcC0wIHotWzFdXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIHNocmluay0wXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCInbm8tZGF0YScgfCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIHwgYXN5bmM7IGlucHV0czogeyBzaXplOiA2NCB9XCIgLz5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktdGFibGUtbm8tZGF0YS1jb25maWctdGV4dFwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJub0RhdGFDb25maWcoKS5uZ1N0eWxlXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm5vRGF0YUNvbmZpZygpLm5nQ2xhc3NcIlxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJub0RhdGFUZXh0KCkgfCB0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|