fantasy-ngzorro 2.2.19 → 2.2.21

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.
@@ -2427,8 +2427,8 @@ export class HdFormLinesComponent {
2427
2427
  HdFormLinesComponent.decorators = [
2428
2428
  { type: Component, args: [{
2429
2429
  selector: "hd-form-lines",
2430
- template: "<ng-container *ngIf=\"showForm && showToolbar\">\n <hd-button-group class=\"hd-formLines-toolbar\">\n <ng-template #buttonGroupLeft>\n <!-- \u6709\u5168\u5C40\u641C\u7D22\uFF1A\u5DE6\u4FA7\u653E\u641C\u7D22\u6846 -->\n <ng-container *ngIf=\"showSearch\">\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input (keyup.enter)=\"searchLines()\" placeholder=\"\u8BF7\u8F93\u5165\u5185\u5BB9\u641C\u7D22\" style=\"width: 300px;\"\n [(ngModel)]=\"filterStr\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\" (click)=\"searchLines()\"></i>\n </ng-template>\n </ng-container>\n <!-- \u65E0\u5168\u5C40\u641C\u7D22\uFF1A\u5DE6\u4FA7\u653E\u81EA\u5B9A\u4E49\u6309\u94AE -->\n <ng-container *ngIf=\"!showSearch\">\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </ng-container>\n </ng-template>\n <ng-template #buttonGroupRight>\n <!-- \u6709\u5168\u5C40\u641C\u7D22\uFF1A\u53F3\u4FA7\u8303\u56F4\u518D\u5DE6\u53F3\u5206\u5F00 -->\n <div class=\"hd-formLines-toolbar-right\" *ngIf=\"showSearch\">\n <div class=\"hd-formLines-toolbar-right-left\">\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </div>\n <div class=\"hd-formLines-toolbar-right-right\">\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"colSettingsTpl\"></ng-container>\n </div>\n </div>\n <!-- \u65E0\u5168\u5C40\u641C\u7D22\uFF1A\u53F3\u4FA7\u53EA\u653E\u81EA\u5B9A\u4E49\u53F3\u4FA7\u6309\u94AE + \u5217\u8BBE\u7F6E -->\n <ng-container *ngIf=\"!showSearch\">\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"colSettingsTpl\"></ng-container>\n </ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n\n<ng-template #colSettingsTpl>\n <ng-container *ngIf=\"showColSettingsButton\">\n <span class=\"hd-formLines-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"colSettingsMenu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-formLines-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #colSettingsMenu=\"nzDropdownMenu\">\n <div class=\"hd-formLines-col-settings-dropdown\">\n <div class=\"hd-formLines-col-settings-list\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzBlockNode nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div class=\"hd-formLines-col-settings-footer\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </div>\n </nz-dropdown-menu>\n </ng-container>\n</ng-template>\n\n<!-- <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 0)\">\u805A\u7126\u7B2C\u4E00\u4E2A</hd-button> -->\n\n<ng-container *ngIf=\"showForm\">\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n\n<form *ngIf=\"showForm\" nz-form [formGroup]=\"validateHdFormLines\" class=\"ant-advanced-search-form hd-formLines-container\"\n (keydown)=\"onKeyDown($event)\">\n <nz-table nzTemplateMode [nzFrontPagination]=\"false\" [nzLoading]=\"tableLoading\" [nzScroll]=\"scroll\">\n <thead>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isAllChecked()\"\n [nzIndeterminate]=\"isIndeterminate()\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onAllChecked($event)\"></label>\n </th>\n <th nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let item of formLines\">\n <th *ngIf=\"isColumnVisible(item)\" [nzAlign]=\"item.align ? item.align : 'left'\">\n <span *ngIf=\"item.require\" style=\"color: red;\">*</span>{{ item.label }}\n </th>\n </ng-container>\n <th [style.width.px]=\"operateColWidth\" nzRight=\"0\">\u64CD\u4F5C</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let line of linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize);index as dataIndex\"\n formArrayName=\"lines\">\n <tr [formGroup]=\"line\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isLineChecked(line)\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onLineCheckedChange(line, $event)\"></label>\n </td>\n <td nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\n {{ line.get('lineIndex').value }}\n </td>\n <ng-container *ngFor=\"let formItem of formLines; index as innerIndex\">\n <td *ngIf=\"isColumnVisible(formItem)\" [nzAlign]=\"formItem.align ? formItem.align : 'left'\">\n <nz-form-item>\n <nz-form-control\n [nzValidateStatus]=\"getControlValidateStatus(line, formItem)\"\n [nzErrorTip]=\"formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A'\">\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"'Input'\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <input #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"getStyle(line, formItem, '100px')\" nz-input\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name ).value : null}\"\n [id]=\"'input-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#input-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : null\"\n (input)=\"limitInputLength($event, line, formItem)\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [formControlName]=\"formItem.name\" />\n </nz-input-group>\n <ng-template #inputCleanTemplate>\n <i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\" nzType=\"close-circle\"\n *ngIf=\"line.get(formItem.name).value && !line.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem ,line)\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Select'\">\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n nzDropdownClassName=\"hd-select-table\"\n *ngIf=\"formItem.selectOption.tableColumns;else nomarlSelectTemplate\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <div class=\"hd-select-empty\"\n *ngIf=\"!(formItem.selectOption?.selectList?.length > 0 || line.get(formItem.selectOption.selectListName)?.value?.length > 0)\">\n <img\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI0MXB4IiB2aWV3Qm94PSIwIDAgNjQgNDEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjUgKDY3NDY5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzIuMDAwMDAwLCAtMTMzNS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY0LjAwMDAwMCwgMTExNC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MC4wMDAwMDAsIDc4LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNjguMDAwMDAwLCAxNDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlICBmaWxsPSIjRjVGNUY1IiBjeD0iMzIiIGN5PSIzMyIgcng9IjMyIiByeT0iNyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5LjAwMDAwMCwgMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI0Q5RDlEOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQ2LDEyLjc2MDU2MDQgTDM1Ljg1NDMwNDcsMS4yNTczOTYzMyBDMzUuMzY3NDQxNCwwLjQ3MzgyNjYwNSAzNC42NTU4Nzg5LDAgMzMuOTA2NzYxNywwIEwxMi4wOTMyMzgzLDAgQzExLjM0NDEyMTEsMCAxMC42MzI1NTg2LDAuNDczOTUwMjU1IDEwLjE0NTY5NTMsMS4yNTczOTYzMyBMMi42MTQ3OTcyN2UtMTIsMTIuNzYwNTYwNCBMMCwyMiBMNDYsMjIgTDQ2LDEyLjc2MDU2MDQgWiIgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTMyLjYxMzI4MTMsMTUuOTMxNSBDMzIuNjEzMjgxMywxNC4zMjU4NTExIDMzLjYwNjk1MzEsMTMuMDAwMjM0IDM0LjgzOTY5OTIsMTMgTDQ2LDEzIEw0NiwzMS4xMzcxMjc3IEM0NiwzMy4yNTg5NTc0IDQ0LjY3OTM4NjcsMzUgNDMuMDUwNDI5NywzNSBMMi45NDk1NzAzMSwzNSBDMS4zMjA1MjM0NCwzNSAwLDMzLjI1ODg0MDQgMCwzMS4xMzcxMjc3IEwwLDEzIEwxMS4xNjAzMDA4LDEzIEMxMi4zOTMwNDY5LDEzIDEzLjM4NjcxODgsMTQuMzIyODA4NSAxMy4zODY3MTg4LDE1LjkyODQ1NzQgTDEzLjM4NjcxODgsMTUuOTQ5NjM4MyBDMTMuMzg2NzE4OCwxNy41NTUyODcyIDE0LjM5MTcxMDksMTguODUxMTgwOSAxNS42MjQ0NTcsMTguODUxMTgwOSBMMzAuMzc1NTQzLDE4Ljg1MTE4MDkgQzMxLjYwODI4OTEsMTguODUxMTgwOSAzMi42MTMyODEzLDE3LjU0MzM1MTEgMzIuNjEzMjgxMywxNS45Mzc3MDIxIEwzMi42MTMyODEzLDE1LjkzMTUgWiIgIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n alt=\"empty\">\n <p class=\"ant-empty-description\">\u6682\u65E0\u6570\u636E</p>\n </div>\n\n <nz-option nzCustomContent\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n <div class=\"hd-option-line\">\n <div *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns\"\n [ngStyle]=\"getSelectTableColumnStyle(selectOptionTableColumn)\">\n <ng-container *ngIf=\"selectOptionTableColumn.icons;else notPictureTemplate\">\n <div class=\"hd-option-icons\">\n <ng-container *ngFor=\"let icon of selectOptionTableColumn.icons\">\n <img *ngIf=\"icon.iconName === 'hd-recommend-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVpJREFUOE+l07FLQkEcB/Dv7713Zg1GQ0SgW9AmTYVp1BRUokZBEI1u/QVBUBD1D0Rt0dQaPYmotXza1tKQzQ1Fk0iDHr5vPEOTUpO88e77+9zvjjtBh8HTOb8e0hu0eN8Xzz22ikonoGzHdgXcAVB16S75U/mbn/m2AK+mglqbBUAGvCIRuVCJ7HLXQCUTPQOxXi8Q4FolnYWuAH0+HaEpjrdxAyC3VSq33xKgPTWiYYUai8IjUCabw4Zw1XWNF2+OZrXoi+cLImBth4odfQAw0elCW6zdKvU2/wVkYs8ggzBlRqrcI/DrrK1wQ7DWAIToV8lsqGxHDwTY6qYbA1jpCVAux3oBSirhDPYCOL6kE/s/QB77UrnNJoDDVkCN6pI+BJH+6xINQdpKOCf1d/AEYBxgUUQC5PcLbPMDXy1lhGXx7r0G6ExklpBwI0xh2w7ID+UzL71iL/MJdzuZdDL/kXcAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <img *ngIf=\"icon.iconName === 'hd-img-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAyhJREFUWEe1ll1o1XYYxp8nPUmUihdCV3bAirvYzUC80Xpy3KwTZNR2CdOhDkTBwe6G32XzwqpjE3Qt4pUKZQqDyQZNTp1uY8yCJG0F2d2+LlWOOkShovQkaV45lcJpTdOTHJubBPI+z/Pj//H+/0TGR66uf8sPoz8A/Kstkp38YORxFitmEVU1vm1cBPlp9ZuQXtX0jmfxygQgvxSWBRWlDECvhgrwQFuqLufG4TAtRCaAwCl+IcDXtWEi2KFb7pUFBxCBEpSMMsDWGWEiNzXLe2/BASp2cTuJH+KCRMJ3dGvsrzQQqafAtw0XpBEfIhc00/tswQD8QWM1FP45d4A8V9XJN9k5Nl4vRKoR8G3jMshdyebRPs0cOftaAaRUbAsRrRRRhuczFsF/lPATNQrL3Hr7/nz1lGvvtkwGUSEC8gLkWfMGkAfQMp9J0n8ByhS5J+QDVr+BshBlUu6q3d5v9G3jIcg3GgnJqp2C853iCIB1WU0a1F2iOO2tPnK3CLQ1aJZKLpCfddPrmtoF8uuqZn9iyfcEzVQumYtlQDO9vS8PsprHd4xvAR7I7FuHUIBvdNP9crr0lT7g24U+UNlfh1f6Esrn2ofeuVphbCPyneJuAN+lT0jokZCduum9cobM2Qn9krEGEa6+hi36jEC3aro34vASW3FoG9si8sdGRoKCY6rlnpjLIxGgYhunSPY0AiAiP+mW93EmAN8ujoJobwgAuKOb7orUAHKjY1EwHjwFkGsEoKpVJ6WVH3n/p1oDwVBhk0TK742GV/UKYOZMt5QKoGIbX5E8mgwg4wCbADQn1c1uPvP2gWqB7xjDADck7OwBVan0QFFyQaj2A9wxV60A13XT7Uw1Ar5TlDiBQP6hRHs0a3Ss9n8wuK4jYtN5Em/H6B5ppht7r4jvhEOFtYiUGQEAnhDoV033ZNJwB45xRAS9IBfX1qnhRD7uhhQLENiFQ0Ll9LSBCM7olnu43gUpTjEfiPSB3D6tUQRbcpZ7bbZHLEBYKnRFogxV505rmjzIrtG/6w2fMS0l430RHAVoULBZtdybdQFkCcuqSXUtzxqSpHsBfmUdgJhaiDQAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <span *ngIf=\"icon.iconName === 'hd-select-close' && selectItem[icon.fieldName]\"\n class=\"hd-select-close\">\n \u7981\u7528\n </span>\n <span *ngIf=\"icon.iconName === 'hd-select-purchase' && selectItem[icon.fieldName]\"\n class=\"hd-select-purchase\">\n \u534F\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notPictureTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name], selectOptionTableColumn.width);else overflowTemplate\">\n <div>{{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-container>\n <ng-template #overflowTemplate>\n <div class=\"hd-option-overflow\" nz-tooltip\n [nzTooltipTitle]=\"selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name]\">\n {{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-template>\n </ng-template>\n </div>\n </div>\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.showLabelAndValue || formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n <ng-template #nomarlSelectTemplate>\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.showLabelAndValue || formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-template>\n\n </ng-container>\n <ng-container *ngSwitchCase=\"'Date'\">\n <nz-date-picker #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" *ngIf=\"formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\" nzShowTime\n nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker #formInputDom *ngIf=\"!formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\">\n </nz-date-picker>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'DateRange'\">\n <nz-range-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzDisabledDate]=\"formItem.hdDisabledDate\" [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\"\n [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'TextArea'\">\n <textarea #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name).value : null}\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [maxlength]=\"formItem.maxLength || null\" rows=\"4\" nz-input\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"'InputNumber'\">\n <div style=\"display: flex;align-items: center;\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <nz-input-number #formInputDom [ngStyle]=\"getStyle(line, formItem, '100px')\"\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"\n [nzMin]=\"formItem?.inputNumber?.min || 0\" [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPrecision]=\"formItem?.inputNumber?.precision != null ? formItem.inputNumber.precision : 2\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [nzId]=\"'inputNumber-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#inputNumber-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : setActiveDomInFormLines(dataIndex , innerIndex)\">\n </nz-input-number>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'MultipleSelect'\">\n <nz-select #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" nzMode=\"multiple\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <ng-container\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of line.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"line.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\" nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'ViewDom'\">\n <span class=\"hd-formLines-viewDom\" *ngIf=\"!formItem?.hideViewDomValue\">\n {{\n (formItem.preserveNumber && line.get(formItem.name).value) ?\n LodashRound(line.get(formItem.name).value,\n formItem.preserveNumber).toFixed(formItem.preserveNumber)\n : line.get(formItem.name).value\n }}\n </span>\n <ng-container\n *ngTemplateOutlet=\"ViewDomRightTemplate;context:{formItem: formItem, formLine: line}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Switch'\">\n <nz-switch (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Time'\">\n <nz-time-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n <div *ngIf=\"formItem?.explainOption?.show\"\n [style.color]=\"formItem?.explainOption?.color ? formItem.explainOption.color : null\">\n {{ line.get(formItem.explainOption.name).value }}\n </div>\n </td>\n </ng-container>\n <td [style.width.px]=\"operateColWidth\" nzRight=\"0\">\n <span class=\"common-btn-group\">\n <a *ngIf=\"operateButtons.includes('add')\" (click)=\"addFormLine(line)\">\u6DFB\u52A0</a>\n <a *ngIf=\"operateButtons.includes('copy')\" (click)=\"copyFormLine(line)\">\u590D\u5236</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && !showDeleteConfirm\"\n (click)=\"deleteFormLine(line)\">\u5220\u9664</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && showDeleteConfirm\" nz-popconfirm\n nzPopconfirmTitle=\"\u786E\u8BA4\u8981\u5220\u9664\u8BE5\u884C\u5417?\" nzPopconfirmPlacement=\"bottom\"\n (nzOnConfirm)=\"deleteFormLine(line)\">\u5220\u9664</a>\n </span>\n </td>\n </tr>\n </ng-container>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td *ngIf=\"showCheckbox\"></td>\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td [nzAlign]=\"totalOption.align ? totalOption.align : 'left'\">{{\n (totalOption.value || totalOption.value ===\n 0) ? (((totalOption.value % 1 === 0) && !totalOption.showDecimal) ? totalOption.value :\n LodashRound(totalOption.value, totalOption.preserveNumber).toFixed(totalOption.preserveNumber)) : ''\n }}\n </td>\n </ng-container>\n </tr>\n </tbody>\n </nz-table>\n <nz-list\n *ngIf=\"linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize).length === 0\"\n [nzDataSource]=\"[]\"></nz-list>\n <ng-container>\n <hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n <div class=\"hd-formLines-pagination\">\n <div class=\"hd-formLines-pagination-left\">\n <div *ngIf=\"showKeyboardOperateTip\">\u652F\u6301\u952E\u76D8\u64CD\u4F5C\uFF0C\u4F7F\u7528\n <i nz-icon nzType=\"up-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"down-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"left-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"right-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <span style=\"font-size: 14px;margin-left: 4px;font-weight: bolder;\">Enter</span>\n \u952E\u5207\u6362\u8868\u5355\u9879\n </div>\n </div>\n <nz-pagination [nzSize]=\"'small'\" style=\"text-align: right;\" [nzPageIndex]=\"paginationPageIndex\"\n [nzPageSize]=\"paginationPageSize\" [nzPageSizeOptions]=\"[10, 20, 30, 40, 50]\"\n [nzTotal]=\"linesFormArray.controls.length\" nzShowSizeChanger (nzPageIndexChange)=\"pageIndexChange($event)\"\n (nzPageSizeChange)=\"pageSizeChange($event)\" [nzShowTotal]=\"totalTemplate\"></nz-pagination>\n <ng-template #totalTemplate let-total>\u5171 {{ linesFormArray.controls.length }} \u6761\u6570\u636E</ng-template>\n </div>\n\n </ng-container>\n</form>\n",
2431
- styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection--multiple .ant-select-selection__rendered>ul>li.ant-select-search--inline:only-child{margin-left:4px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.hd-formLines-toolbar{display:block}.hd-formLines-toolbar ::ng-deep .hd-button-group-right{flex:1;min-width:0;display:flex;justify-content:flex-end}.hd-formLines-toolbar-right{display:flex;align-items:center;justify-content:space-between;width:100%;margin-left:16px}.hd-formLines-toolbar-right-left,.hd-formLines-toolbar-right-right{display:flex;align-items:center}.hd-formLines-col-settings{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px;padding:0;margin-left:12px;cursor:pointer;color:#2a3634;background:0 0;border:1px solid #e5e6eb;border-radius:4px;vertical-align:middle;flex-shrink:0}.hd-formLines-col-settings:hover{color:#20b95d;background:#f5f8f6;border-color:#20b95d}.hd-formLines-col-settings .hd-formLines-col-settings-icon{display:block;width:14px;height:14px;flex-shrink:0}.hd-formLines-col-settings-dropdown{background:#fff;border:1px solid #e5e6eb;border-radius:4px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);overflow:hidden}.hd-formLines-col-settings-list{max-height:400px;overflow-y:auto}.hd-formLines-col-settings-footer{text-align:right;background:#fff;padding:4px;border-top:1px solid #f0f0f0}.hd-formLines-container ::ng-deep td{padding:4px 8px!important}.hd-formLines-container .ant-table-tbody>tr>td,.hd-formLines-container ::ng-deep .ant-table-thead>tr>th{padding:16px 8px}.hd-formLines-container ::ng-deep .hd-table-total>td{border:0!important}.hd-formLines-container ::ng-deep .ant-form-item{margin-bottom:0}.hd-formLines-container .ant-input-number{width:100%}.hd-formLines-container .hd-formLines-viewDom{font-size:14px}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled{background:#f5f8f6!important;border-bottom:1px solid #e8e8e8;position:-webkit-sticky;position:sticky;top:0;z-index:10;padding:0}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled:hover{background:#f5f8f6!important}::ng-deep .hd-option-header{display:flex;align-items:center;color:rgba(0,0,0,.85);background:#f5f8f6}::ng-deep .hd-option-header-column{padding:5px 0}.hd-option-line{display:flex;align-items:center}.hd-option-overflow{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-select-empty{display:flex;align-items:center;flex-direction:column;padding:20px 0;background:#fff}::ng-deep .ant-empty-small{background:#fff!important;padding:8px 0;margin:0}.hd-formLines-pagination{display:flex;align-items:center;justify-content:space-between}.hd-formLines-pagination .hd-formLines-pagination-left{margin-left:10px;display:flex;align-items:center}.hd-option-icons{display:flex;align-items:center}.hd-select-close{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #f5222d;color:#f5222d;font-size:14px}.hd-select-purchase{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #20bd62;color:#20bd62;font-size:14px}"]
2430
+ template: "<ng-container *ngIf=\"showForm && showToolbar\">\n <hd-button-group class=\"hd-formLines-toolbar\">\n <ng-template #buttonGroupLeft>\n <!-- \u641C\u7D22\u6846 + \u5DE6\u4FA7\u81EA\u5B9A\u4E49\u6309\u94AE\uFF08\u7D27\u6328\u641C\u7D22\u6846\u540E\uFF09 -->\n <ng-container *ngIf=\"showSearch\">\n <nz-input-group class=\"hd-lines-search\" [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input (keyup.enter)=\"searchLines()\" placeholder=\"\u8BF7\u8F93\u5165\u5185\u5BB9\u641C\u7D22\"\n [(ngModel)]=\"filterStr\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\" (click)=\"searchLines()\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"formLinesLeftButton\"></ng-container>\n </ng-template>\n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"formLinesRightButton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"colSettingsTpl\"></ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n\n<ng-template #colSettingsTpl>\n <ng-container *ngIf=\"showColSettingsButton\">\n <span class=\"hd-formLines-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"colSettingsMenu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-formLines-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #colSettingsMenu=\"nzDropdownMenu\">\n <div class=\"hd-formLines-col-settings-dropdown\">\n <div class=\"hd-formLines-col-settings-list\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzBlockNode nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div class=\"hd-formLines-col-settings-footer\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </div>\n </nz-dropdown-menu>\n </ng-container>\n</ng-template>\n\n<!-- <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 0)\">\u805A\u7126\u7B2C\u4E00\u4E2A</hd-button> -->\n\n<ng-container *ngIf=\"showForm\">\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" background=\"transparent\" type=\"row\" size=\"12\"></hd-space>\n</ng-container>\n\n<form *ngIf=\"showForm\" nz-form [formGroup]=\"validateHdFormLines\" class=\"ant-advanced-search-form hd-formLines-container\"\n (keydown)=\"onKeyDown($event)\">\n <nz-table nzTemplateMode [nzFrontPagination]=\"false\" [nzLoading]=\"tableLoading\" [nzScroll]=\"scroll\">\n <thead>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isAllChecked()\"\n [nzIndeterminate]=\"isIndeterminate()\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onAllChecked($event)\"></label>\n </th>\n <th nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let item of formLines\">\n <th *ngIf=\"isColumnVisible(item)\" [nzAlign]=\"item.align ? item.align : 'left'\">\n <span *ngIf=\"item.require\" style=\"color: red;\">*</span>{{ item.label }}\n </th>\n </ng-container>\n <th [style.width.px]=\"operateColWidth\" nzRight=\"0\">\u64CD\u4F5C</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let line of linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize);index as dataIndex\"\n formArrayName=\"lines\">\n <tr [formGroup]=\"line\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showCheckbox\">\n <label nz-checkbox\n [ngModel]=\"isLineChecked(line)\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onLineCheckedChange(line, $event)\"></label>\n </td>\n <td nzWidth=\"58px\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showLineNumber\">\n {{ line.get('lineIndex').value }}\n </td>\n <ng-container *ngFor=\"let formItem of formLines; index as innerIndex\">\n <td *ngIf=\"isColumnVisible(formItem)\" [nzAlign]=\"formItem.align ? formItem.align : 'left'\">\n <nz-form-item>\n <nz-form-control\n [nzValidateStatus]=\"getControlValidateStatus(line, formItem)\"\n [nzErrorTip]=\"formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A'\">\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"'Input'\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <input #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"getStyle(line, formItem, '100px')\" nz-input\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name ).value : null}\"\n [id]=\"'input-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#input-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : null\"\n (input)=\"limitInputLength($event, line, formItem)\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [formControlName]=\"formItem.name\" />\n </nz-input-group>\n <ng-template #inputCleanTemplate>\n <i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\" nzType=\"close-circle\"\n *ngIf=\"line.get(formItem.name).value && !line.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem ,line)\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Select'\">\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n nzDropdownClassName=\"hd-select-table\"\n *ngIf=\"formItem.selectOption.tableColumns;else nomarlSelectTemplate\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <div class=\"hd-select-empty\"\n *ngIf=\"!(formItem.selectOption?.selectList?.length > 0 || line.get(formItem.selectOption.selectListName)?.value?.length > 0)\">\n <img\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI0MXB4IiB2aWV3Qm94PSIwIDAgNjQgNDEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjUgKDY3NDY5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzIuMDAwMDAwLCAtMTMzNS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY0LjAwMDAwMCwgMTExNC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MC4wMDAwMDAsIDc4LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNjguMDAwMDAwLCAxNDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlICBmaWxsPSIjRjVGNUY1IiBjeD0iMzIiIGN5PSIzMyIgcng9IjMyIiByeT0iNyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5LjAwMDAwMCwgMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI0Q5RDlEOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQ2LDEyLjc2MDU2MDQgTDM1Ljg1NDMwNDcsMS4yNTczOTYzMyBDMzUuMzY3NDQxNCwwLjQ3MzgyNjYwNSAzNC42NTU4Nzg5LDAgMzMuOTA2NzYxNywwIEwxMi4wOTMyMzgzLDAgQzExLjM0NDEyMTEsMCAxMC42MzI1NTg2LDAuNDczOTUwMjU1IDEwLjE0NTY5NTMsMS4yNTczOTYzMyBMMi42MTQ3OTcyN2UtMTIsMTIuNzYwNTYwNCBMMCwyMiBMNDYsMjIgTDQ2LDEyLjc2MDU2MDQgWiIgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTMyLjYxMzI4MTMsMTUuOTMxNSBDMzIuNjEzMjgxMywxNC4zMjU4NTExIDMzLjYwNjk1MzEsMTMuMDAwMjM0IDM0LjgzOTY5OTIsMTMgTDQ2LDEzIEw0NiwzMS4xMzcxMjc3IEM0NiwzMy4yNTg5NTc0IDQ0LjY3OTM4NjcsMzUgNDMuMDUwNDI5NywzNSBMMi45NDk1NzAzMSwzNSBDMS4zMjA1MjM0NCwzNSAwLDMzLjI1ODg0MDQgMCwzMS4xMzcxMjc3IEwwLDEzIEwxMS4xNjAzMDA4LDEzIEMxMi4zOTMwNDY5LDEzIDEzLjM4NjcxODgsMTQuMzIyODA4NSAxMy4zODY3MTg4LDE1LjkyODQ1NzQgTDEzLjM4NjcxODgsMTUuOTQ5NjM4MyBDMTMuMzg2NzE4OCwxNy41NTUyODcyIDE0LjM5MTcxMDksMTguODUxMTgwOSAxNS42MjQ0NTcsMTguODUxMTgwOSBMMzAuMzc1NTQzLDE4Ljg1MTE4MDkgQzMxLjYwODI4OTEsMTguODUxMTgwOSAzMi42MTMyODEzLDE3LjU0MzM1MTEgMzIuNjEzMjgxMywxNS45Mzc3MDIxIEwzMi42MTMyODEzLDE1LjkzMTUgWiIgIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n alt=\"empty\">\n <p class=\"ant-empty-description\">\u6682\u65E0\u6570\u636E</p>\n </div>\n\n <nz-option nzCustomContent\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n <div class=\"hd-option-line\">\n <div *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns\"\n [ngStyle]=\"getSelectTableColumnStyle(selectOptionTableColumn)\">\n <ng-container *ngIf=\"selectOptionTableColumn.icons;else notPictureTemplate\">\n <div class=\"hd-option-icons\">\n <ng-container *ngFor=\"let icon of selectOptionTableColumn.icons\">\n <img *ngIf=\"icon.iconName === 'hd-recommend-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVpJREFUOE+l07FLQkEcB/Dv7713Zg1GQ0SgW9AmTYVp1BRUokZBEI1u/QVBUBD1D0Rt0dQaPYmotXza1tKQzQ1Fk0iDHr5vPEOTUpO88e77+9zvjjtBh8HTOb8e0hu0eN8Xzz22ikonoGzHdgXcAVB16S75U/mbn/m2AK+mglqbBUAGvCIRuVCJ7HLXQCUTPQOxXi8Q4FolnYWuAH0+HaEpjrdxAyC3VSq33xKgPTWiYYUai8IjUCabw4Zw1XWNF2+OZrXoi+cLImBth4odfQAw0elCW6zdKvU2/wVkYs8ggzBlRqrcI/DrrK1wQ7DWAIToV8lsqGxHDwTY6qYbA1jpCVAux3oBSirhDPYCOL6kE/s/QB77UrnNJoDDVkCN6pI+BJH+6xINQdpKOCf1d/AEYBxgUUQC5PcLbPMDXy1lhGXx7r0G6ExklpBwI0xh2w7ID+UzL71iL/MJdzuZdDL/kXcAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <img *ngIf=\"icon.iconName === 'hd-img-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAyhJREFUWEe1ll1o1XYYxp8nPUmUihdCV3bAirvYzUC80Xpy3KwTZNR2CdOhDkTBwe6G32XzwqpjE3Qt4pUKZQqDyQZNTp1uY8yCJG0F2d2+LlWOOkShovQkaV45lcJpTdOTHJubBPI+z/Pj//H+/0TGR66uf8sPoz8A/Kstkp38YORxFitmEVU1vm1cBPlp9ZuQXtX0jmfxygQgvxSWBRWlDECvhgrwQFuqLufG4TAtRCaAwCl+IcDXtWEi2KFb7pUFBxCBEpSMMsDWGWEiNzXLe2/BASp2cTuJH+KCRMJ3dGvsrzQQqafAtw0XpBEfIhc00/tswQD8QWM1FP45d4A8V9XJN9k5Nl4vRKoR8G3jMshdyebRPs0cOftaAaRUbAsRrRRRhuczFsF/lPATNQrL3Hr7/nz1lGvvtkwGUSEC8gLkWfMGkAfQMp9J0n8ByhS5J+QDVr+BshBlUu6q3d5v9G3jIcg3GgnJqp2C853iCIB1WU0a1F2iOO2tPnK3CLQ1aJZKLpCfddPrmtoF8uuqZn9iyfcEzVQumYtlQDO9vS8PsprHd4xvAR7I7FuHUIBvdNP9crr0lT7g24U+UNlfh1f6Esrn2ofeuVphbCPyneJuAN+lT0jokZCduum9cobM2Qn9krEGEa6+hi36jEC3aro34vASW3FoG9si8sdGRoKCY6rlnpjLIxGgYhunSPY0AiAiP+mW93EmAN8ujoJobwgAuKOb7orUAHKjY1EwHjwFkGsEoKpVJ6WVH3n/p1oDwVBhk0TK742GV/UKYOZMt5QKoGIbX5E8mgwg4wCbADQn1c1uPvP2gWqB7xjDADck7OwBVan0QFFyQaj2A9wxV60A13XT7Uw1Ar5TlDiBQP6hRHs0a3Ss9n8wuK4jYtN5Em/H6B5ppht7r4jvhEOFtYiUGQEAnhDoV033ZNJwB45xRAS9IBfX1qnhRD7uhhQLENiFQ0Ll9LSBCM7olnu43gUpTjEfiPSB3D6tUQRbcpZ7bbZHLEBYKnRFogxV505rmjzIrtG/6w2fMS0l430RHAVoULBZtdybdQFkCcuqSXUtzxqSpHsBfmUdgJhaiDQAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <span *ngIf=\"icon.iconName === 'hd-select-close' && selectItem[icon.fieldName]\"\n class=\"hd-select-close\">\n \u7981\u7528\n </span>\n <span *ngIf=\"icon.iconName === 'hd-select-purchase' && selectItem[icon.fieldName]\"\n class=\"hd-select-purchase\">\n \u534F\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notPictureTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name], selectOptionTableColumn.width);else overflowTemplate\">\n <div>{{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-container>\n <ng-template #overflowTemplate>\n <div class=\"hd-option-overflow\" nz-tooltip\n [nzTooltipTitle]=\"selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name]\">\n {{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])\n }}\n </div>\n </ng-template>\n </ng-template>\n </div>\n </div>\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.showLabelAndValue || formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n <ng-template #nomarlSelectTemplate>\n <nz-select #formInputDom (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.showLabelAndValue || formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-template>\n\n </ng-container>\n <ng-container *ngSwitchCase=\"'Date'\">\n <nz-date-picker #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" *ngIf=\"formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\" nzShowTime\n nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker #formInputDom *ngIf=\"!formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\"\n [nzShowToday]=\"formItem.hdShowToday !== false\">\n </nz-date-picker>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'DateRange'\">\n <nz-range-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzDisabledDate]=\"formItem.hdDisabledDate\" [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\"\n [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'TextArea'\">\n <textarea #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name).value : null}\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [maxlength]=\"formItem.maxLength || null\" rows=\"4\" nz-input\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"'InputNumber'\">\n <div style=\"display: flex;align-items: center;\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\">\n <nz-input-number #formInputDom [ngStyle]=\"getStyle(line, formItem, '100px')\"\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"\n [nzMin]=\"formItem?.inputNumber?.min || 0\" [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPrecision]=\"formItem?.inputNumber?.precision != null ? formItem.inputNumber.precision : 2\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [nzId]=\"'inputNumber-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#inputNumber-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : setActiveDomInFormLines(dataIndex , innerIndex)\">\n </nz-input-number>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{ line.get(formItem.explainOptionRight.name).value }}\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'MultipleSelect'\">\n <nz-select #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" nzMode=\"multiple\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (nzOpenChange)=\"onOpenChangeEvent(formItem.onOpenChangeEvent || null, $event, line, formItem.onOpenChangeEventDebounceTime, formItem)\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <ng-container\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of line.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"line.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\" nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'ViewDom'\">\n <span class=\"hd-formLines-viewDom\" *ngIf=\"!formItem?.hideViewDomValue\">\n {{\n (formItem.preserveNumber && line.get(formItem.name).value) ?\n LodashRound(line.get(formItem.name).value,\n formItem.preserveNumber).toFixed(formItem.preserveNumber)\n : line.get(formItem.name).value\n }}\n </span>\n <ng-container\n *ngTemplateOutlet=\"ViewDomRightTemplate;context:{formItem: formItem, formLine: line}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Switch'\">\n <nz-switch (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Time'\">\n <nz-time-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n (focusin)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n <div *ngIf=\"formItem?.explainOption?.show\"\n [style.color]=\"formItem?.explainOption?.color ? formItem.explainOption.color : null\">\n {{ line.get(formItem.explainOption.name).value }}\n </div>\n </td>\n </ng-container>\n <td [style.width.px]=\"operateColWidth\" nzRight=\"0\">\n <span class=\"common-btn-group\">\n <a *ngIf=\"operateButtons.includes('add')\" (click)=\"addFormLine(line)\">\u6DFB\u52A0</a>\n <a *ngIf=\"operateButtons.includes('copy')\" (click)=\"copyFormLine(line)\">\u590D\u5236</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && !showDeleteConfirm\"\n (click)=\"deleteFormLine(line)\">\u5220\u9664</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && showDeleteConfirm\" nz-popconfirm\n nzPopconfirmTitle=\"\u786E\u8BA4\u8981\u5220\u9664\u8BE5\u884C\u5417?\" nzPopconfirmPlacement=\"bottom\"\n (nzOnConfirm)=\"deleteFormLine(line)\">\u5220\u9664</a>\n </span>\n </td>\n </tr>\n </ng-container>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td *ngIf=\"showCheckbox\"></td>\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td [nzAlign]=\"totalOption.align ? totalOption.align : 'left'\">{{\n (totalOption.value || totalOption.value ===\n 0) ? (((totalOption.value % 1 === 0) && !totalOption.showDecimal) ? totalOption.value :\n LodashRound(totalOption.value, totalOption.preserveNumber).toFixed(totalOption.preserveNumber)) : ''\n }}\n </td>\n </ng-container>\n </tr>\n </tbody>\n </nz-table>\n <nz-list\n *ngIf=\"linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize).length === 0\"\n [nzDataSource]=\"[]\"></nz-list>\n <ng-container>\n <hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n <div class=\"hd-formLines-pagination\">\n <div class=\"hd-formLines-pagination-left\">\n <div *ngIf=\"showKeyboardOperateTip\">\u652F\u6301\u952E\u76D8\u64CD\u4F5C\uFF0C\u4F7F\u7528\n <i nz-icon nzType=\"up-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"down-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"left-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <i nz-icon nzType=\"right-circle\" nzTheme=\"outline\" style=\"font-size: 16px;margin-left: 4px;\"></i>\n <span style=\"font-size: 14px;margin-left: 4px;font-weight: bolder;\">Enter</span>\n \u952E\u5207\u6362\u8868\u5355\u9879\n </div>\n </div>\n <nz-pagination [nzSize]=\"'small'\" style=\"text-align: right;\" [nzPageIndex]=\"paginationPageIndex\"\n [nzPageSize]=\"paginationPageSize\" [nzPageSizeOptions]=\"[10, 20, 30, 40, 50]\"\n [nzTotal]=\"linesFormArray.controls.length\" nzShowSizeChanger (nzPageIndexChange)=\"pageIndexChange($event)\"\n (nzPageSizeChange)=\"pageSizeChange($event)\" [nzShowTotal]=\"totalTemplate\"></nz-pagination>\n <ng-template #totalTemplate let-total>\u5171 {{ linesFormArray.controls.length }} \u6761\u6570\u636E</ng-template>\n </div>\n\n </ng-container>\n</form>\n",
2431
+ styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection--multiple .ant-select-selection__rendered>ul>li.ant-select-search--inline:only-child{margin-left:4px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.hd-formLines-toolbar{display:block}.hd-formLines-toolbar ::ng-deep .hd-button-group-left{gap:12px}.hd-formLines-toolbar ::ng-deep .hd-button-group-left hd-button{margin-right:0}.hd-formLines-toolbar ::ng-deep .hd-lines-search{width:300px;flex-shrink:0}.hd-formLines-col-settings{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px;padding:0;margin-left:12px;cursor:pointer;color:#2a3634;background:0 0;border:1px solid #e5e6eb;border-radius:4px;vertical-align:middle;flex-shrink:0}.hd-formLines-col-settings:hover{color:#20b95d;background:#f5f8f6;border-color:#20b95d}.hd-formLines-col-settings .hd-formLines-col-settings-icon{display:block;width:14px;height:14px;flex-shrink:0}.hd-formLines-col-settings-dropdown{background:#fff;border:1px solid #e5e6eb;border-radius:4px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);overflow:hidden}.hd-formLines-col-settings-list{max-height:400px;overflow-y:auto}.hd-formLines-col-settings-footer{text-align:right;background:#fff;padding:4px;border-top:1px solid #f0f0f0}.hd-formLines-container ::ng-deep td{padding:4px 8px!important}.hd-formLines-container .ant-table-tbody>tr>td,.hd-formLines-container ::ng-deep .ant-table-thead>tr>th{padding:16px 8px}.hd-formLines-container ::ng-deep .hd-table-total>td{border:0!important}.hd-formLines-container ::ng-deep .ant-form-item{margin-bottom:0}.hd-formLines-container .ant-input-number{width:100%}.hd-formLines-container .hd-formLines-viewDom{font-size:14px}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled{background:#f5f8f6!important;border-bottom:1px solid #e8e8e8;position:-webkit-sticky;position:sticky;top:0;z-index:10;padding:0}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled:hover{background:#f5f8f6!important}::ng-deep .hd-option-header{display:flex;align-items:center;color:rgba(0,0,0,.85);background:#f5f8f6}::ng-deep .hd-option-header-column{padding:5px 0}.hd-option-line{display:flex;align-items:center}.hd-option-overflow{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-select-empty{display:flex;align-items:center;flex-direction:column;padding:20px 0;background:#fff}::ng-deep .ant-empty-small{background:#fff!important;padding:8px 0;margin:0}.hd-formLines-pagination{display:flex;align-items:center;justify-content:space-between}.hd-formLines-pagination .hd-formLines-pagination-left{margin-left:10px;display:flex;align-items:center}.hd-option-icons{display:flex;align-items:center}.hd-select-close{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #f5222d;color:#f5222d;font-size:14px}.hd-select-purchase{display:block;height:16px;line-height:14px;text-align:center;padding:0 4px;border:1px solid #20bd62;color:#20bd62;font-size:14px}"]
2432
2432
  }] }
2433
2433
  ];
2434
2434
  /** @nocollapse */
@@ -2721,4 +2721,4 @@ if (false) {
2721
2721
  */
2722
2722
  HdFormLinesComponent.prototype.commonSessionService;
2723
2723
  }
2724
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZm9ybS1saW5lcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mYW50YXN5LW5nem9ycm8vIiwic291cmNlcyI6WyJoZC1mb3JtLWxpbmVzL2hkLWZvcm0tbGluZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsV0FBVyxFQUNYLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxLQUFLLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUNMLFlBQVksRUFDWixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIscUJBQXFCLEdBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQVksWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7O01BR2pGLHNDQUFzQyxHQUFHLEVBQUU7QUFPakQsTUFBTSxPQUFPLG9CQUFvQjs7Ozs7O0lBMkcvQixZQUNVLEVBQWUsRUFDZixHQUFzQixFQUN0QixvQkFBMEM7UUFGMUMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FB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dkMsbURBQ3NDOzs7OztJQUV0QyxvREFDdUM7Ozs7O0lBRXZDLDBDQUM2Qjs7SUFHN0IsaURBQW1DOztJQUNuQyw2Q0FBK0I7O0lBQy9CLDRDQUFtQzs7SUFDbkMsNkNBQW9DOztJQUNwQyxrREFBeUM7O0lBQ3pDLG1EQUEwQzs7SUFDMUMsb0RBQXdFOzs7OztJQUN4RSwyQ0FBZ0M7Ozs7O0lBQ2hDLDRDQUFrQzs7Ozs7SUFDbEMsMkNBQXlCOzs7Ozs7SUFFekIsK0NBQXlDOztJQTRpRHpDLCtDQUErQzs7Ozs7SUF1UC9DLDhDQUF1RDs7Ozs7SUFoeURyRCxrQ0FBdUI7Ozs7O0lBQ3ZCLG1DQUE4Qjs7Ozs7SUFDOUIsb0RBQWtEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0ICogYXMgbG9jYWxmb3JhZ2UgZnJvbSBcImxvY2FsZm9yYWdlXCI7XG5pbXBvcnQge1xuICBJbnB1dEJvb2xlYW4sXG4gIE56RGF0ZVBpY2tlckNvbXBvbmVudCxcbiAgTnpJbnB1dE51bWJlckNvbXBvbmVudCxcbiAgTnpSYW5nZVBpY2tlckNvbXBvbmVudCxcbiAgTnpTZWxlY3RDb21wb25lbnQsXG4gIE56VGltZVBpY2tlckNvbXBvbmVudCxcbn0gZnJvbSBcIm5nLXpvcnJvLWFudGRcIjtcbmltcG9ydCB7IE56Rm9ybWF0RW1pdEV2ZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvY29yZVwiO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgVG90YWxPcHRpb24gfSBmcm9tIFwiLi4vaGQtZGV0YWlsLWxpbmVzL2hkLWRldGFpbC1saW5lcy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUcmVlR3JpZCB9IGZyb20gXCIuLi9oZC10YWJsZS9oZC10YWJsZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBTZWxlY3RPcHRpb25UYWJsZUNvbHVtbiB9IGZyb20gXCIuLi9tb2RlbC9jb21tb24tdHlwZVwiO1xuaW1wb3J0IHsgQ29tbW9uU2Vzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZS9jb21tb24tc2Vzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBGb3JtTGluZSwgRm9ybUxpbmVUeXBlLCBGb3JtTGluZXNDYWNoZU9wdGlvbiB9IGZyb20gXCIuL2hkLWZvcm0tbGluZXMuc2VydmljZVwiO1xuXG4vKiog5LiOIGFudC1zZWxlY3Qg6YCJ6aG56aG55rC05bmz5YaF6L656Led5LiA6Ie077yM55So5LqO6KGo5aS05LiO6YCJ6aG56KGM5a+56b2QICovXG5jb25zdCBTRUxFQ1RfVEFCTEVfT1BUSU9OX0hPUklaT05UQUxfUEFERElORyA9IDEyO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiaGQtZm9ybS1saW5lc1wiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2hkLWZvcm0tbGluZXMuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2hkLWZvcm0tbGluZXMuY29tcG9uZW50Lmxlc3NcIl0sXG59KVxuZXhwb3J0IGNsYXNzIEhkRm9ybUxpbmVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkcmVuKFwiZm9ybUlucHV0RG9tXCIpIGZvcm1JbnB1dERvbUxpc3QhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dMaW5lTnVtYmVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGFsbG93RW1wdHk6IGJvb2xlYW4gPSB0cnVlO1xuICBAT3V0cHV0KCkgZGVsZXRlTGFzdExpbmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dLZXlib2FyZE9wZXJhdGVUaXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuWQr+eUqOmUruebmOaWueWQkemUri9FbnRlciDlnKjljZXlhYPmoLzpl7Tot7PovazvvIzpu5jorqTlvIDlkK8gKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGVuYWJsZUtleWJvYXJkT3BlcmF0ZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB0YWJsZUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuWxleekuuihjOWLvumAieWIl++8jOeUqOS6juWklumDqOaJuemHj+aTjeS9nOWLvumAieihjCAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0NoZWNrYm94OiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiDmmK/lkKblsZXnpLrliJforr7nva7vvIjpvb/ova7vvInvvIzpu5jorqTlhbPpl63vvJvpnIDopoHml7bpobXpnaLmiYvlt6UgYFtzaG93Q29sU2V0dGluZ3NdPVwidHJ1ZVwiYO+8m+S7hemdniBoaWRlIOeahCBWaWV3RG9tIOWPr+mFjee9ru+8jOemgeatouaLluaLveiwg+W6jyAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0NvbFNldHRpbmdzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiDliJforr7nva7nvJPlrZgga2V5IOeJh+aute+8m+acieWAvOaXtuaMgeS5heWMluWIsCBJbmRleGVkRELvvIzml6DliJnku4XlvZPliY3kvJror53nlJ/mlYggKi9cbiAgQElucHV0KCkgdXVpZDogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtTGluZXM6IEFycmF5PEZvcm1MaW5lPjtcbiAgLy8g6ZKI5a+5Zm9ybUxpbmVz6YeM6Z2i5omA5pyJ55qEbmFtZe+8jFxuICBASW5wdXQoKSBmb3JtTGluZXNEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIG9wZXJhdGVCdXR0b25zOiBBcnJheTxzdHJpbmc+ID0gW1wiYWRkXCIsIFwiZGVsZXRlXCJdOyAvLyDmk43kvZzliJfmjInpkq7vvJphZGQgLyBkZWxldGUgLyBjb3B5XG4gIEBJbnB1dCgpIHNjcm9sbDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHsgeDogXCIxcHhcIiB9O1xuICBAT3V0cHV0KCkgY2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiDmlrDlop7nqbrooYzlkI7mipvlh7ror6XooYwgRm9ybUdyb3Vw77yI5omL5Yqo5re75Yqg44CB6ZSu55uY6Lez6KGM6Ieq5Yqo6KGl6KGM562J77yJICovXG4gIEBPdXRwdXQoKSBhZGRMaW5lRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4oKTtcbiAgLyoqIOWLvumAieWPmOWMluaXtuaKm+WHuuW9k+WJjeWLvumAieihjCBGb3JtR3JvdXAg5YiX6KGoICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cFtdPigpO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0RlbGV0ZUNvbmZpcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGFnaW5hdGlvblBhZ2VJbmRleDogbnVtYmVyID0gMTtcbiAgcGFnaW5hdGlvblBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgdmFsaWRhdGVIZEZvcm1MaW5lczogRm9ybUdyb3VwO1xuICBuZXdMaW5lOiBhbnk7XG4gIGlucHV0VmFsdWU6IHN0cmluZztcblxuICAvLyDlkIjorqHljLrln59cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dUb3RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0b3RhbE9wdGlvbjogQXJyYXk8VG90YWxPcHRpb24+ID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnNOdW1iZXI6IG51bWJlciB8IHN0cmluZyA9IDA7XG4gIHRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuXG4gIHNob3dGb3JtOiBib29sZWFuID0gZmFsc2U7XG4gIGZpbHRlclN0cjogc3RyaW5nO1xuICBzdG9yZUZvcm1MaW5lc0RhdGE6IGFueSA9IFtdOyAvLyDnvJPlrZjnmoTmgLvnmoTooajljZXmlbDmja5cbiAgZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhOiBhbnkgPSBbXTsgLy8g562b6YCJ5Ye65p2l55qE5pWw5o2u5YiX6KGoXG4gIGZpbHRlckluZGV4U3RvcmU6IEFycmF5PG51bWJlcj4gPSBbXTsgLy8g562b6YCJ5Ye65p2l55qE5pWw5o2u5Zyo5Y6f5aeL5YiX6KGo5Lit55qE5LiL5qCHXG4gIGlzRmlsdGVyRGF0YTogYm9vbGVhbiA9IGZhbHNlOyAvLyDmmK/lkKbmmK/lt7Lnu4/nrZvpgInov4fnmoTmlbDmja5cbiAgZm9ybVZhbGlkOiBib29sZWFuID0gZmFsc2U7IC8vIOihqOWNleW9k+WJjeeahOeKtuaAgVxuICAvKiog5Yu+6YCJ55qE6KGMIGlk77yI6Leo6aG144CB5pCc57Si6YeN5bu65ZCO5LuN5L+d55WZ77yJICovXG4gIHByaXZhdGUgc2VsZWN0ZWRSb3dJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBmbjogYW55OyBldmVudDogYW55OyBsaW5lOiBhbnkgfT4oKTtcbiAgcHJpdmF0ZSBkZWJvdW5jZVRpbWVvdXQ6IG51bWJlciA9IDA7IC8vIOm7mOiupOmYsuaKluaXtumXtFxuXG4gIHByaXZhdGUgc2VhcmNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZm9ybUlucHV0RG9tTGlzdFN1YjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgb3BlbkNoYW5nZVN1YmplY3QgPSBuZXcgU3ViamVjdDx7IGZuOiBhbnk7IGV2ZW50OiBhbnk7IGxpbmU6IGFueSB9PigpO1xuICBwcml2YXRlIG9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgb3BlbkNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8vIOW9k+WJjemhteeahGRvbeS6jOe7tOaVsOe7hFxuICBjb2xsZWN0RG9tTGlzdDogQXJyYXk8XG4gICAgQXJyYXk8XG4gICAgICB8IEVsZW1lbnRSZWZcbiAgICAgIHwgTnpTZWxlY3RDb21wb25lbnRcbiAgICAgIHwgTnpJbnB1dE51bWJlckNvbXBvbmVudFxuICAgICAgfCBOekRhdGVQaWNrZXJDb21wb25lbnRcbiAgICAgIHwgTnpSYW5nZVBpY2tlckNvbXBvbmVudFxuICAgICAgfCBOelRpbWVQaWNrZXJDb21wb25lbnRcbiAgICA+XG4gID4gPSBbXTtcbiAgLy8g5b2T5YmN6IGa54Sm55qEZG9t5YWD57Sg5Z2Q5qCHXG4gIGFjdGl2ZURvbVg6IG51bWJlciA9IG51bGw7XG4gIGFjdGl2ZURvbVk6IG51bWJlciA9IG51bGw7XG4gIGFjdGl2ZURvbTpcbiAgICB8IEVsZW1lbnRSZWZcbiAgICB8IE56U2VsZWN0Q29tcG9uZW50XG4gICAgfCBOeklucHV0TnVtYmVyQ29tcG9uZW50XG4gICAgfCBOekRhdGVQaWNrZXJDb21wb25lbnRcbiAgICB8IE56UmFuZ2VQaWNrZXJDb21wb25lbnRcbiAgICB8IE56VGltZVBpY2tlckNvbXBvbmVudCA9IG51bGw7XG4gIGFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBAQ29udGVudENoaWxkKFwiVmlld0RvbVJpZ2h0VGVtcGxhdGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIFZpZXdEb21SaWdodFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKiog5bel5YW35qCP5bem5L6n6Ieq5a6a5LmJ5oyJ6ZKu77yM55So5rOV5ZCMIGhkLXRhYmxlIOeahCB0YWJsZUxlZnRCdXR0b24gKi9cbiAgQENvbnRlbnRDaGlsZChcImZvcm1MaW5lc0xlZnRCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGZvcm1MaW5lc0xlZnRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKiDlt6XlhbfmoI/lj7Pkvqfoh6rlrprkuYnmjInpkq7vvIznlKjms5XlkIwgaGQtdGFibGUg55qEIHRhYmxlUmlnaHRCdXR0b24gKi9cbiAgQENvbnRlbnRDaGlsZChcImZvcm1MaW5lc1JpZ2h0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBmb3JtTGluZXNSaWdodEJ1dHRvbjogVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqIOihqOagvOS4iuaWueiHquWumuS5ieWMuuWfn++8iOWmguWLvumAieaPkOekuu+8ie+8jOeUqOazleWQjCBoZC10YWJsZSDnmoQgdGFibGVUb3RhbCAqL1xuICBAQ29udGVudENoaWxkKFwidGFibGVUb3RhbFwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVUb3RhbDogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvLyDliJforr7nva5cbiAgaXNEcm9wZG93blZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd0xpc3ROb2RlczogYm9vbGVhbiA9IGZhbHNlO1xuICBub3dMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBoaWRlTGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgY2FuY2VsTm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgY2FuY2VsSGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIGZvcm1MaW5lc0NhY2hlT3B0aW9uOiBGb3JtTGluZXNDYWNoZU9wdGlvbiA9IG5ldyBGb3JtTGluZXNDYWNoZU9wdGlvbigpO1xuICBwcml2YXRlIGxvY2FsZm9yYWdlOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIGxvY2FsdGlvblRtcDogc3RyaW5nID0gXCJcIjtcbiAgcHJpdmF0ZSB1c2VyU2Vzc2lvbjogYW55O1xuICAvKiog5piv5ZCm5bey5LuOIEluZGV4ZWREQiDor7vliLDov4fliJforr7nva7nvJPlrZjvvIjlkKsgY29scyDkuLrnqbrvvIkgKi9cbiAgcHJpdmF0ZSBjb2xzQ2FjaGVMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb21tb25TZXNzaW9uU2VydmljZTogQ29tbW9uU2Vzc2lvblNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMubG9jYWxmb3JhZ2UgPSBsb2NhbGZvcmFnZS5jcmVhdGVJbnN0YW5jZSh7XG4gICAgICBkcml2ZXI6IGxvY2FsZm9yYWdlLklOREVYRUREQixcbiAgICAgIG5hbWU6IFwiaGQtZnNjbVwiLFxuICAgICAgdmVyc2lvbjogMS4wLFxuICAgICAgc3RvcmVOYW1lOiBcImhkLWZzY20tc3RvcmVcIixcbiAgICB9KTtcbiAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VhcmNoU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lb3V0KSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgbGluZSkpO1xuICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMub3BlbkNoYW5nZVN1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLm9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQsIGxpbmUgfSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubG9jYWx0aW9uVG1wID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgaWYgKHRoaXMubG9jYWx0aW9uVG1wKSB7XG4gICAgICB0aGlzLmxvY2FsdGlvblRtcCA9IHRoaXMubG9jYWx0aW9uVG1wLnJlcGxhY2UoL1xcLy9nLCBcIl9cIik7XG4gICAgfVxuICAgIHRoaXMudXNlclNlc3Npb24gPSB0aGlzLmNvbW1vblNlc3Npb25TZXJ2aWNlLmdldFNlc3Npb24oXG4gICAgICBcIl9fanlfYXV0aG9yaXphdGlvbl9zZXNzaW9uX19cIixcbiAgICApO1xuICAgIGlmICghdGhpcy51c2VyU2Vzc2lvbikge1xuICAgICAgdGhpcy51c2VyU2Vzc2lvbiA9IHsgdXNlckNvZGU6IFwiZGV2XCIgfTtcbiAgICB9XG4gICAgLy8g57yT5a2Y5LiA5LiL5oC755qE6KGo5Y2V5pWw5o2uXG4gICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLmZvcm1MaW5lc0RhdGE7XG4gICAgdGhpcy5pbml0Q29sU2V0dGluZ3MoKTtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgdGhpcy5mb3JtSW5wdXREb21MaXN0U3ViID0gdGhpcy5mb3JtSW5wdXREb21MaXN0LmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5vcGVuQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvcm1JbnB1dERvbUxpc3RTdWIpIHtcbiAgICAgIHRoaXMuZm9ybUlucHV0RG9tTGlzdFN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmb3JtTGluZXNMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IG9wZXJhdGVDb2xXaWR0aCgpIHtcbiAgICBjb25zdCBjb3VudCA9ICh0aGlzLm9wZXJhdGVCdXR0b25zIHx8IFtdKS5maWx0ZXIoKGJ0bikgPT5cbiAgICAgIFtcImFkZFwiLCBcImNvcHlcIiwgXCJkZWxldGVcIl0uaW5jbHVkZXMoYnRuKSxcbiAgICApLmxlbmd0aDtcbiAgICByZXR1cm4gTWF0aC5tYXgoY291bnQgKiA0MCwgODApO1xuICB9XG5cbiAgLyoqIGFsbG93RW1wdHkg5LiU5pON5L2c5YiX5LuF5pyJ5Yig6Zmk5pe277ya5YWB6K64IDAg6KGM77yM5Yid5aeL5YyW5LiO5Yig6Iez56m66YO95LiN6Ieq5Yqo6KGl56m66KGMICovXG4gIGdldCBpc1RydWx5RW1wdHlBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJ1dHRvbnMgPSAodGhpcy5vcGVyYXRlQnV0dG9ucyB8fCBbXSkuZmlsdGVyKChidG4pID0+XG4gICAgICBbXCJhZGRcIiwgXCJjb3B5XCIsIFwiZGVsZXRlXCJdLmluY2x1ZGVzKGJ0biksXG4gICAgKTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hbGxvd0VtcHR5ICYmXG4gICAgICBidXR0b25zLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgYnV0dG9uc1swXSA9PT0gXCJkZWxldGVcIlxuICAgICk7XG4gIH1cblxuICAvKiog5Yu+6YCJ5YiX5Zu65a6a5pe277yM5bqP5Y+35YiX55qEIGxlZnQg5YGP56e7ICovXG4gIGdldCBsaW5lTnVtYmVyTGVmdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93Q2hlY2tib3ggPyBcIjQwcHhcIiA6IFwiMHB4XCI7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUm93SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGhkX3Jvd18ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOSl9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um93SWQobGluZTogRm9ybUdyb3VwKTogc3RyaW5nIHtcbiAgICBpZiAoIWxpbmUgfHwgIWxpbmUuZ2V0KFwiX2hkUm93SWRcIikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbGluZS5nZXQoXCJfaGRSb3dJZFwiKS52YWx1ZTtcbiAgfVxuXG4gIC8qKiDlvZPliY3pobXnmoTooYzvvIjnlKjkuo7ooajlpLTlhajpgInvvIzku4XkvZznlKjkuo7lvZPliY3pobXvvIzot6jpobXli77pgInku43kv53nlZnvvIkgKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50UGFnZUxpbmVzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICBjb25zdCBzdGFydCA9ICh0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggLSAxKSAqIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgcmV0dXJuICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdKS5zbGljZShzdGFydCwgZW5kKTtcbiAgfVxuXG4gIGlzTGluZUNoZWNrZWQobGluZTogRm9ybUdyb3VwKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgIHJldHVybiAhIWlkICYmIHRoaXMuc2VsZWN0ZWRSb3dJZHMuaGFzKGlkKTtcbiAgfVxuXG4gIGlzQWxsQ2hlY2tlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYWdlTGluZXMgPSB0aGlzLmdldEN1cnJlbnRQYWdlTGluZXMoKTtcbiAgICByZXR1cm4gKFxuICAgICAgcGFnZUxpbmVzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHBhZ2VMaW5lcy5ldmVyeSgobGluZSkgPT4gdGhpcy5pc0xpbmVDaGVja2VkKGxpbmUpKVxuICAgICk7XG4gIH1cblxuICBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFnZUxpbmVzID0gdGhpcy5nZXRDdXJyZW50UGFnZUxpbmVzKCk7XG4gICAgY29uc3QgY2hlY2tlZENvdW50ID0gcGFnZUxpbmVzLmZpbHRlcigobGluZSkgPT5cbiAgICAgIHRoaXMuaXNMaW5lQ2hlY2tlZChsaW5lKSxcbiAgICApLmxlbmd0aDtcbiAgICByZXR1cm4gY2hlY2tlZENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPCBwYWdlTGluZXMubGVuZ3RoO1xuICB9XG5cbiAgb25BbGxDaGVja2VkKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmdldEN1cnJlbnRQYWdlTGluZXMoKS5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0Um93SWQobGluZSk7XG4gICAgICBpZiAoIWlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuYWRkKGlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZGVsZXRlKGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIG9uTGluZUNoZWNrZWRDaGFuZ2UobGluZTogRm9ybUdyb3VwLCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgIGlmICghaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuYWRkKGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd0lkcy5kZWxldGUoaWQpO1xuICAgIH1cbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuZ2V0U2VsZWN0ZWRMaW5lcygpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTGluZUZyb21TZWxlY3Rpb24obGluZTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgIGlmIChpZCAmJiB0aGlzLnNlbGVjdGVkUm93SWRzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZGVsZXRlKGlkKTtcbiAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlWYWx1ZXNUb0xpbmUoXG4gICAgbGluZTogRm9ybUdyb3VwLFxuICAgIHZhbHVlczogeyBbZmllbGQ6IHN0cmluZ106IGFueSB9LFxuICAgIGVtaXRFdmVudDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXModmFsdWVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGxldCBjb250cm9sID0gbGluZS5nZXQoa2V5KTtcbiAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICBsaW5lLmFkZENvbnRyb2woa2V5LCB0aGlzLmZiLmNvbnRyb2wodmFsdWVzW2tleV0pKTtcbiAgICAgICAgY29udHJvbCA9IGxpbmUuZ2V0KGtleSk7XG4gICAgICB9XG4gICAgICAvLyDpnZnpu5jotYvlgLzvvIzpgb/lhY0gdmFsdWVDaGFuZ2VzIC8gRE9NIG1heGxlbmd0aCDlm57lhpnmiormoKHpqozmgIHmiZPkubFcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWVzW2tleV0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgIGNvbnRyb2wubWFya0FzVW50b3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgICBjb25zdCBmb3JtSXRlbSA9IHRoaXMuZm9ybUxpbmVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0ga2V5KTtcbiAgICAgICAgaWYgKGZvcm1JdGVtICYmIGZvcm1JdGVtLm9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChmb3JtSXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZXNba2V5XSwgbGluZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICog5LuF5Zyo55So5oi35Lqk5LqS5ZCO44CB5LiU5b2T5YmN5YC856Gu5a6e5Li656m655qEIHJlcXVpcmVkIOmUmeivr+aXtuWxleekuue6ouahhu+8jFxuICAgKiDpgb/lhY3mibnph4/otYvlgLzml7Ygbmctem9ycm8g5q6L55WZ44CM5LiN6IO95Li656m644CN5o+Q56S6XG4gICAqL1xuICBnZXRDb250cm9sVmFsaWRhdGVTdGF0dXMobGluZTogRm9ybUdyb3VwLCBmb3JtSXRlbTogRm9ybUxpbmUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBsaW5lLmdldChmb3JtSXRlbS5uYW1lKTtcbiAgICBpZiAoIWNvbnRyb2wgfHwgY29udHJvbC5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IGVtcHR5ID1cbiAgICAgIGNvbnRyb2wudmFsdWUgPT09IG51bGwgfHxcbiAgICAgIGNvbnRyb2wudmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgY29udHJvbC52YWx1ZSA9PT0gXCJcIjtcbiAgICBpZiAoXG4gICAgICAoY29udHJvbC5kaXJ0eSB8fCBjb250cm9sLnRvdWNoZWQpICYmXG4gICAgICBlbXB0eSAmJlxuICAgICAgY29udHJvbC5oYXNFcnJvcihcInJlcXVpcmVkXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gXCJlcnJvclwiO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIC8qKiDnlKjmiLfovpPlhaXml7bmjIkgbWF4TGVuZ3RoIOaIquaWre+8iOS4jeS9v+eUqOWOn+eUnyBtYXhsZW5ndGjvvIzpgb/lhY3lubLmibDnqIvluo/ljJbotYvlgLzvvIkgKi9cbiAgbGltaXRJbnB1dExlbmd0aChldmVudDogRXZlbnQsIGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IEZvcm1MaW5lKTogdm9pZCB7XG4gICAgaWYgKCFmb3JtSXRlbSB8fCAhZm9ybUl0ZW0ubWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgaWYgKGlucHV0ICYmIGlucHV0LnZhbHVlICYmIGlucHV0LnZhbHVlLmxlbmd0aCA+IGZvcm1JdGVtLm1heExlbmd0aCkge1xuICAgICAgY29uc3QgbmV4dCA9IGlucHV0LnZhbHVlLnNsaWNlKDAsIGZvcm1JdGVtLm1heExlbmd0aCk7XG4gICAgICBpbnB1dC52YWx1ZSA9IG5leHQ7XG4gICAgICBjb25zdCBjb250cm9sID0gbGluZS5nZXQoZm9ybUl0ZW0ubmFtZSk7XG4gICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICBjb250cm9sLnNldFZhbHVlKG5leHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiDojrflj5blvZPliY3li77pgInkuJTlt7LmjILovb3nmoTooYwgRm9ybUdyb3Vw77yI5b2T5YmN562b6YCJ57uT5p6c5YaF77yJICovXG4gIHB1YmxpYyBnZXRTZWxlY3RlZExpbmVzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMgYXMgRm9ybUdyb3VwW10pLmZpbHRlcigobGluZSkgPT5cbiAgICAgIHRoaXMuaXNMaW5lQ2hlY2tlZChsaW5lKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWFqOmDqOWLvumAieihjOaVsOaNru+8iOWQq+i3qOmhteOAgeaQnOe0ouWQjuacquWxleekuuS9huS7jeWLvumAieeahOihjO+8iVxuICAgKi9cbiAgcHVibGljIGdldFNlbGVjdGVkTGluZXNEYXRhKCk6IGFueVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBtb3VudGVkQnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMgYXMgRm9ybUdyb3VwW10pLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICAgIGlmIChpZCAmJiB0aGlzLnNlbGVjdGVkUm93SWRzLmhhcyhpZCkpIHtcbiAgICAgICAgbW91bnRlZEJ5SWQuc2V0KGlkLCBsaW5lLmdldFJhd1ZhbHVlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgKHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhIHx8IFtdKS5mb3JFYWNoKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IGRhdGEgJiYgZGF0YS5faGRSb3dJZDtcbiAgICAgIGlmIChpZCAmJiB0aGlzLnNlbGVjdGVkUm93SWRzLmhhcyhpZCkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobW91bnRlZEJ5SWQuaGFzKGlkKSA/IG1vdW50ZWRCeUlkLmdldChpZCkgOiB7IC4uLmRhdGEgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDlhZzlupXvvJrliJrmlrDlop7jgIHlsJrmnKrov5sgc3RvcmUg55qE5Yu+6YCJ6KGMXG4gICAgdGhpcy5zZWxlY3RlZFJvd0lkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhcmVzdWx0LnNvbWUoKGl0ZW0pID0+IGl0ZW0gJiYgaXRlbS5faGRSb3dJZCA9PT0gaWQpICYmXG4gICAgICAgIG1vdW50ZWRCeUlkLmhhcyhpZClcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChtb3VudGVkQnlJZC5nZXQoaWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIOaJuemHj+Whq+WFheWLvumAieihjOWtl+aute+8iOaUr+aMgei3qOmhteOAgeaQnOe0ouWQjuacquWxleekuuS9huS7jeWLvumAieeahOihjO+8iVxuICAgKiBAcGFyYW0gdmFsdWVzIOimgeWGmeWFpeeahOWtl+aute+8jOWmgiB7IHJlbWFyazogJ+aJuemHj+Wkh+azqCcsIHByaWNlOiAxMCB9XG4gICAqIEBwYXJhbSBlbWl0RXZlbnQg5piv5ZCm6Kem5Y+RIHZhbHVlQ2hhbmdlcyAvIG9uQ2hhbmdlRXZlbnTvvIzpu5jorqQgdHJ1ZVxuICAgKiBAcmV0dXJucyDlrp7pmYXloavlhYXnmoTooYzmlbBcbiAgICovXG4gIHB1YmxpYyBiYXRjaEZpbGxTZWxlY3RlZChcbiAgICB2YWx1ZXM6IHsgW2ZpZWxkOiBzdHJpbmddOiBhbnkgfSxcbiAgICBlbWl0RXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBudW1iZXIge1xuICAgIGlmICghdmFsdWVzIHx8IHRoaXMuc2VsZWN0ZWRSb3dJZHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IG1vdW50ZWRCeUlkID0gbmV3IE1hcDxzdHJpbmcsIEZvcm1Hcm91cD4oKTtcbiAgICAodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scyBhcyBGb3JtR3JvdXBbXSkuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIG1vdW50ZWRCeUlkLnNldChpZCwgbGluZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgY291bnQgPSAwO1xuICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGNvbnN0IGxpbmUgPSBtb3VudGVkQnlJZC5nZXQoaWQpO1xuICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgdGhpcy5hcHBseVZhbHVlc1RvTGluZShsaW5lLCB2YWx1ZXMsIGVtaXRFdmVudCk7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIOW9k+WJjeetm+mAiS/pobXpnaLmnKrmjILovb3vvJrnm7TmjqXmlLnmgLvmlbDmja7vvIzpgIDlh7rmkJzntKLlkI7lj6/op4FcbiAgICAgIGNvbnN0IHN0b3JlSXRlbSA9ICh0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSB8fCBbXSkuZmluZChcbiAgICAgICAgKGRhdGEpID0+IGRhdGEgJiYgZGF0YS5faGRSb3dJZCA9PT0gaWQsXG4gICAgICApO1xuICAgICAgaWYgKHN0b3JlSXRlbSkge1xuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIHN0b3JlSXRlbVtrZXldID0gdmFsdWVzW2tleV07XG4gICAgICAgIH0pO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKiDmuIXnqbrli77pgIkgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkUm93SWRzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFJvd0lkcy5jbGVhcigpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqIOW9k+WJjeWLvumAieaVsOmHj++8iOWQq+i3qOmhteOAgeaQnOe0ouS/neeVme+8iSAqL1xuICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUm93SWRzLnNpemU7XG4gIH1cblxuICAvKiog5piv5ZCm5bGV56S66aG26YOo5bel5YW35qCPICovXG4gIGdldCBzaG93VG9vbGJhcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLnNob3dTZWFyY2ggfHxcbiAgICAgICEhdGhpcy5zaG93Q2hlY2tib3ggfHxcbiAgICAgICEhdGhpcy5mb3JtTGluZXNMZWZ0QnV0dG9uIHx8XG4gICAgICAhIXRoaXMuZm9ybUxpbmVzUmlnaHRCdXR0b24gfHxcbiAgICAgIHRoaXMuc2hvd0NvbFNldHRpbmdzQnV0dG9uXG4gICAgKTtcbiAgfVxuXG4gIC8qKiDmmK/lkKblsZXnpLrliJforr7nva7pvb/ova7vvIjmnInlj6/phY3nva4gVmlld0RvbSDml7bvvIkgKi9cbiAgZ2V0IHNob3dDb2xTZXR0aW5nc0J1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLnNob3dDb2xTZXR0aW5ncyAmJiB0aGlzLmdldENvbmZpZ3VyYWJsZUZvcm1MaW5lcygpLmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgLyoqIOWIl+aYr+WQpua4suafk++8mmhpZGUg5rC45LiN5bGV56S677ybVmlld0RvbSDlj5cgaXNTaG93IOaOp+WItiAqL1xuICBpc0NvbHVtblZpc2libGUoaXRlbTogRm9ybUxpbmUpOiBib29sZWFuIHtcbiAgICBpZiAoIWl0ZW0gfHwgaXRlbS5oaWRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgPT09IEZvcm1MaW5lVHlwZS5WaWV3RG9tKSB7XG4gICAgICByZXR1cm4gaXRlbS5pc1Nob3cgIT09IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiDlj6/ov5vlhaXliJforr7nva7nmoTlrZfmrrXvvJrpnZ4gaGlkZSDnmoQgVmlld0RvbSAqL1xuICBnZXRDb25maWd1cmFibGVGb3JtTGluZXMoKTogRm9ybUxpbmVbXSB7XG4gICAgaWYgKCF0aGlzLmZvcm1MaW5lcyB8fCAhdGhpcy5mb3JtTGluZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcm1MaW5lcy5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50eXBlID09PSBGb3JtTGluZVR5cGUuVmlld0RvbSAmJiAhaXRlbS5oaWRlLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldENhY2hlS2V5KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdXNlckNvZGUgPVxuICAgICAgKHRoaXMudXNlclNlc3Npb24gJiYgdGhpcy51c2VyU2Vzc2lvbi51c2VyQ29kZSkgfHwgXCJkZXZcIjtcbiAgICByZXR1cm4gKFxuICAgICAgXCJoZC1mb3JtLWxpbmVzX1wiICtcbiAgICAgIHVzZXJDb2RlICtcbiAgICAgIFwiX1wiICtcbiAgICAgIHRoaXMubG9jYWx0aW9uVG1wICtcbiAgICAgIFwiX1wiICtcbiAgICAgIHRoaXMudXVpZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRDb2xTZXR0aW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHNDYWNoZUxvYWRlZCA9IGZhbHNlO1xuICAgIGlmICghdGhpcy5zaG93Q29sU2V0dGluZ3MgfHwgIXRoaXMuZm9ybUxpbmVzIHx8ICF0aGlzLmZvcm1MaW5lcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudXVpZCkge1xuICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgIC5yZWFkeSgpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgICAgICAuZ2V0SXRlbSh0aGlzLmdldENhY2hlS2V5KCkpXG4gICAgICAgICAgLnRoZW4oKHZhbHVlOiBGb3JtTGluZXNDYWNoZU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUuY29scykpIHtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtTGluZXNDYWNoZU9wdGlvbiA9IHZhbHVlO1xuICAgICAgICAgICAgICB0aGlzLmNvbHNDYWNoZUxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uID0gbmV3IEZvcm1MaW5lc0NhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgICAgIHRoaXMuY29sc0NhY2hlTG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldENvbHMoKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uID0gbmV3IEZvcm1MaW5lc0NhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmNvbHNDYWNoZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhcIiwgZSk7XG4gICAgICAgIHRoaXMuZm9ybUxpbmVzQ2FjaGVPcHRpb24gPSBuZXcgRm9ybUxpbmVzQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgdGhpcy5jb2xzQ2FjaGVMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQ29sc0NhY2hlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbHNDYWNoZUxvYWRlZCAmJiBBcnJheS5pc0FycmF5KHRoaXMuZm9ybUxpbmVzQ2FjaGVPcHRpb24uY29scyk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVGb3JtTGluZXNDYWNoZU9wdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXVpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvY2FsZm9yYWdlLnNldEl0ZW0odGhpcy5nZXRDYWNoZUtleSgpLCB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uKTtcbiAgfVxuXG4gIC8qKiDmjIkgZm9ybUxpbmVzIOWOn+Wni+mhuuW6j+aOkuWIl+iKgueCue+8iOemgeatouiwg+W6j+aXtuS/neaMgea6kOmhuuW6j++8iSAqL1xuICBwcml2YXRlIHNvcnROb2Rlc0J5Rm9ybUxpbmVzT3JkZXIobm9kZXM6IFRyZWVHcmlkW10pOiBUcmVlR3JpZFtdIHtcbiAgICBjb25zdCBvcmRlciA9IHRoaXMuZ2V0Q29uZmlndXJhYmxlRm9ybUxpbmVzKCkubWFwKChmKSA9PiBmLm5hbWUpO1xuICAgIHJldHVybiBub2Rlcy5zbGljZSgpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIHJldHVybiBvcmRlci5pbmRleE9mKGEua2V5KSAtIG9yZGVyLmluZGV4T2YoYi5rZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0Q29scygpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dMaXN0Tm9kZXMgPSBmYWxzZTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IFtdO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IFtdO1xuICAgIGNvbnN0IGNvbmZpZ3VyYWJsZSA9IHRoaXMuZ2V0Q29uZmlndXJhYmxlRm9ybUxpbmVzKCk7XG4gICAgY29uc3QgaGFzQ2FjaGUgPSB0aGlzLmhhc0NvbHNDYWNoZSgpO1xuICAgIGNvbmZpZ3VyYWJsZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoaGFzQ2FjaGUpIHtcbiAgICAgICAgZWxlbWVudC5pc1Nob3cgPSB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoZWxlbWVudC5uYW1lKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc1Nob3cgPT09IHVuZGVmaW5lZCB8fCBlbGVtZW50LmlzU2hvdyA9PT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50LmlzU2hvdyA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBub2RlOiBUcmVlR3JpZCA9IHtcbiAgICAgICAgdGl0bGU6IGVsZW1lbnQubGFiZWwsXG4gICAgICAgIGtleTogZWxlbWVudC5uYW1lLFxuICAgICAgICBjaGVja2VkOiBlbGVtZW50LmlzU2hvdyAhPT0gZmFsc2UsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBpZiAoZWxlbWVudC5pc1Nob3cgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubm93TGlzdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRoaXMuc29ydE5vZGVzQnlGb3JtTGluZXNPcmRlcih0aGlzLm5vd0xpc3ROb2Rlcyk7XG4gICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gdGhpcy5zb3J0Tm9kZXNCeUZvcm1MaW5lc09yZGVyKHRoaXMuaGlkZUxpc3ROb2Rlcyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNob3dMaXN0Tm9kZXMgPSB0cnVlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBjYW5jZWxEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNhbmNlbEhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jYW5jZWxOb3dMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNvbmZpcm1Ecm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbEhpZGVMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuaGlkZUxpc3ROb2RlcykpO1xuICAgIHRoaXMuY2FuY2VsTm93TGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm5vd0xpc3ROb2RlcykpO1xuICAgIHRoaXMuaXNEcm9wZG93blZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgc3VibWl0R3JpZHMoKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJsZU5hbWVzID0gdGhpcy5ub3dMaXN0Tm9kZXMubWFwKChpdGVtKSA9PiBpdGVtLmtleSk7XG4gICAgdGhpcy5nZXRDb25maWd1cmFibGVGb3JtTGluZXMoKS5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICBsaW5lLmlzU2hvdyA9IHZpc2libGVOYW1lcy5pbmNsdWRlcyhsaW5lLm5hbWUpO1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybUxpbmVzQ2FjaGVPcHRpb24uY29scyA9IHZpc2libGVOYW1lcztcbiAgICB0aGlzLmNvbHNDYWNoZUxvYWRlZCA9IHRydWU7XG4gICAgdGhpcy5zYXZlRm9ybUxpbmVzQ2FjaGVPcHRpb24oKTtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiog5Yu+6YCJL+WPlua2iO+8muS7heWcqOaYvuekui/pmpDol4/kuKTnu4Tpl7Tnp7vliqjvvIzkuI3mlLnlj5ggZm9ybUxpbmVzIOmhuuW6jyAqL1xuICBjaGVja0FjdGlvbihldmVudDogTnpGb3JtYXRFbWl0RXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQubm9kZS5vcmlnaW4uY2hlY2tlZCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLmtleSA9PT0gZXZlbnQubm9kZS5vcmlnaW4ua2V5O1xuICAgICAgfSk7XG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbm9kZS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ua2V5ICE9PSBldmVudC5ub2RlLm9yaWdpbi5rZXk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzID0gdGhpcy5zb3J0Tm9kZXNCeUZvcm1MaW5lc09yZGVyKFxuICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5jb25jYXQoW25vZGVdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeU5vZGVMaXN0ID0gdGhpcy5oaWRlTGlzdE5vZGVzLnNsaWNlKDApO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5rZXkgPT09IGV2ZW50Lm5vZGUub3JpZ2luLmtleSkge1xuICAgICAgICAgIGNvbnN0IGlubmVySXRlbSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaXRlbSkpO1xuICAgICAgICAgIGlubmVySXRlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3QucHVzaChpbm5lckl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRoaXMuc29ydE5vZGVzQnlGb3JtTGluZXNPcmRlcih0ZW1wb3JhcnlOb2RlTGlzdCk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRoaXMubm93TGlzdE5vZGVzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5rZXkgIT09IGV2ZW50Lm5vZGUub3JpZ2luLmtleTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZG9tTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgXCIuYW50LXNlbGVjdC1kcm9wZG93bi5oZC1zZWxlY3QtdGFibGVcIixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRvbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRvbSA9IGRvbUxpc3RbMF07XG4gICAgICAgICAgZG9tXG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbChcIi5oZC1vcHRpb24taGVhZGVyXCIpXG4gICAgICAgICAgICAuZm9yRWFjaCgoaGVhZGVyKSA9PiBoZWFkZXIucmVtb3ZlKCkpO1xuICAgICAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy5nZXRPbGREb21JbmRleCh0aGlzLmFjdGl2ZURvbVksIHRoaXMuZm9ybUxpbmVzKTtcbiAgICAgICAgICBkb20uaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVET01TdHJ1Y3R1cmUoXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUxpbmVzW29sZEluZGV4XSxcbiAgICAgICAgICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5zbGljZShcbiAgICAgICAgICAgICAgICAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSxcbiAgICAgICAgICAgICAgICAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSArXG4gICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSxcbiAgICAgICAgICAgICAgKVt0aGlzLmFjdGl2ZURvbVhdLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRvbS5maXJzdENoaWxkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdFRhYmxlQ29sdW1uU3R5bGUoY29sdW1uOiBTZWxlY3RPcHRpb25UYWJsZUNvbHVtbik6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gIH0ge1xuICAgIGlmICghY29sdW1uIHx8ICFjb2x1bW4ud2lkdGgpIHtcbiAgICAgIHJldHVybiB7IHdpZHRoOiBcInVuc2V0XCIgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgd2lkdGg6IGAke2NvbHVtbi53aWR0aH1weGAgfTtcbiAgfVxuXG4gIGNyZWF0ZURPTVN0cnVjdHVyZShmb3JtSXRlbSwgbGluZSkge1xuICAgIC8vIOWIm+W7uuWklumDqCBkaXZcbiAgICBjb25zdCBoZE9wdGlvbkhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaGRPcHRpb25IZWFkZXIuY2xhc3NOYW1lID0gXCJoZC1vcHRpb24taGVhZGVyXCI7XG4gICAgaGRPcHRpb25IZWFkZXIuc3R5bGUucGFkZGluZ0xlZnQgPSBgJHtTRUxFQ1RfVEFCTEVfT1BUSU9OX0hPUklaT05UQUxfUEFERElOR31weGA7XG4gICAgaGRPcHRpb25IZWFkZXIuc3R5bGUucGFkZGluZ1JpZ2h0ID0gYCR7U0VMRUNUX1RBQkxFX09QVElPTl9IT1JJWk9OVEFMX1BBRERJTkd9cHhgO1xuXG4gICAgLy8g5qOA5p+l5p2h5Lu277yM56Gu5a6a5piv5ZCm6KaB5Yib5bu65a2Q5YWD57SgXG4gICAgLy8gY29uc3Qgc2VsZWN0TGlzdExlbmd0aCA9IChmb3JtSXRlbSAmJiBmb3JtSXRlbS5zZWxlY3RPcHRpb24gJiYgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3QgJiYgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3QubGVuZ3RoKSB8fCAwO1xuICAgIC8vIGlmXG4gICAgLy8gY29uc3QgbGluZVZhbHVlTGVuZ3RoID0gKGxpbmUuZ2V0KGZvcm1JdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0TmFtZSkgJiYgbGluZS5nZXQoZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3ROYW1lKS52YWx1ZSAmJiBsaW5lLmdldChmb3JtSXRlbS5zZWxlY3RPcHRpb24uc2VsZWN0TGlzdE5hbWUpLnZhbHVlLmxlbmd0aCkgfHwgMDtcblxuICAgIC8vIGlmIChzZWxlY3RMaXN0TGVuZ3RoID4gMCB8fCBsaW5lVmFsdWVMZW5ndGggPiAwKSB7XG4gICAgLy8g6YGN5Y6GIHRhYmxlQ29sdW1ucyDliJvlu7rlhoXpg6jliJcgZGl2XG4gICAgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnRhYmxlQ29sdW1ucy5mb3JFYWNoKChzZWxlY3RPcHRpb25UYWJsZUNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgY29sdW1uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNvbHVtbkRpdi5jbGFzc05hbWUgPSBcImhkLW9wdGlvbi1oZWFkZXItY29sdW1uXCI7XG5cbiAgICAgIGNvbnN0IHdpZHRoU3R5bGUgPSB0aGlzLmdldFNlbGVjdFRhYmxlQ29sdW1uU3R5bGUoXG4gICAgICAgIHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbkRpdi5zdHlsZS53aWR0aCA9IHdpZHRoU3R5bGUud2lkdGg7XG5cbiAgICAgIC8vIOa3u+WKoOWIl+agh+etvuWGheWuuVxuICAgICAgaWYgKHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLmxhYmVsKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxuICAgICAgICAgIHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLmxhYmVsLFxuICAgICAgICApO1xuICAgICAgICBjb2x1bW5EaXYuYXBwZW5kQ2hpbGQobGFiZWxUZXh0KTtcbiAgICAgIH1cblxuICAgICAgLy8g5re75Yqg5YiXIGRpdiDliLDlpJbpg6ggZGl2XG4gICAgICBoZE9wdGlvbkhlYWRlci5hcHBlbmRDaGlsZChjb2x1bW5EaXYpO1xuICAgIH0pO1xuICAgIC8vIH1cblxuICAgIHJldHVybiBoZE9wdGlvbkhlYWRlcjtcbiAgfVxuXG4gIGNvbGxlY3REb21EYXRhKCkge1xuICAgIHRoaXMuY29sbGVjdERvbUxpc3QgPSBbXTtcbiAgICBjb25zdCBwYWdlRG9tTGlzdCA9IHRoaXMuZm9ybUlucHV0RG9tTGlzdC50b0FycmF5KCk7XG4gICAgLy8gU3RlcCAxOiDojrflj5blvZPliY3pobXnmoTmlbDmja7ph49cbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAtIDEpICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICBjb25zdCBhZGp1c3RlZEVuZEluZGV4ID1cbiAgICAgIGVuZEluZGV4ID4gdGhpcy5mb3JtTGluZXNMZW5ndGggPyB0aGlzLmZvcm1MaW5lc0xlbmd0aCA6IGVuZEluZGV4O1xuICAgIGNvbnN0IHBhZ2VMaW5lc0xlbmd0aCA9IGFkanVzdGVkRW5kSW5kZXggLSBzdGFydEluZGV4O1xuXG4gICAgY29uc3QgaW50ZXJ2YWwgPSBwYWdlRG9tTGlzdC5sZW5ndGggLyBwYWdlTGluZXNMZW5ndGg7XG4gICAgLy8gU3RlcCAyOiDmi4bliIZmb3JtSW5wdXREb21MaXN0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlTGluZXNMZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5wdXNoKHBhZ2VEb21MaXN0LnNwbGljZSgwLCBpbnRlcnZhbCkpO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVJbnB1dE51bWJlcktleWJvYXJkU3RlcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIG5nLXpvcnJvIDgg5ZyoIGlucHV0IOeahCBvbktleURvd24g6YeM55So5LiK5LiL6ZSu6LCDIHVwKCkvZG93bigpIOaUuSBzdGVw44CCXG4gICAqIOWPquimhuebliBvbktleURvd27vvIjkuI3liqggdXAvZG93bu+8ie+8jOmUruebmOaWueWQkemUruS6pOe7meihqOWNlei3s+i9rO+8jCsvLSDmjInpkq7ku43lj6/nlKjjgIJcbiAgICovXG4gIHByaXZhdGUgZGlzYWJsZUlucHV0TnVtYmVyS2V5Ym9hcmRTdGVwKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVLZXlib2FyZE9wZXJhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sbGVjdERvbUxpc3RbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3QgZG9tID0gdGhpcy5jb2xsZWN0RG9tTGlzdFtpXVtqXTtcbiAgICAgICAgaWYgKGRvbSBpbnN0YW5jZW9mIE56SW5wdXROdW1iZXJDb21wb25lbnQpIHtcbiAgICAgICAgICBkb20ub25LZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gNDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgZG9tLnNldFZhbGlkYXRlVmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g6IGa54Sm5LiL5LiA5LiqZG9tXG4gIGp1bXBUb05leHRJbnB1dCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGlmIChcbiAgICAgIHggPT09IG51bGwgfHxcbiAgICAgIHkgPT09IG51bGwgfHxcbiAgICAgICF0aGlzLmNvbGxlY3REb21MaXN0IHx8XG4gICAgICB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDlpoLmnpzmmK/mnIDlkI7kuIDkuKrlj6/ovpPlhaXlhYPntKDvvIzmlrDlop7ooYxcbiAgICBpZiAoXG4gICAgICAhKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQpICYmXG4gICAgICB4ID09PSB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCAtIDEgJiZcbiAgICAgIHkgPT09IHRoaXMuY29sbGVjdERvbUxpc3RbMF0ubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgdGhpcy5hZGROZXdMaW5lQW5kRm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHkgPT09IHRoaXMuY29sbGVjdERvbUxpc3RbMF0ubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizFcIik7XG4gICAgICAgIC8vIOWmguaenOaYr+acgOWQjuS4gOWIl++8jOWImei3s+i9rOWIsOS4i+S4gOihjOesrOS4gOS4qui+k+WFpeahhlxuICAgICAgICB0aGlzLmZvY3VzRG9tKHggKyAxLCAwLCBcInJpZ2h0XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIsyXCIpO1xuICAgICAgICAvLyDlpoLmnpzkuI3mmK/mnIDlkI7kuIDliJfvvIzliJnot7PovazliLDlvZPliY3ooYzkuIvkuIDkuKrovpPlhaXmoYZcbiAgICAgICAgdGhpcy5mb2N1c0RvbSh4LCB5ICsgMSwgXCJyaWdodFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5aKe5Yqg5paw6KGM5bm25LiU6IGa54Sm5Yiw56ys5LiA5Liq5YWD57Sg77yMXG4gICAqIOi/memHjOimgeazqOaEj++8jOWmguaenOWtmOWcqOe/u+mhteaDheWGte+8jOmcgOimgeWkhOeQhlxuICAgKi9cbiAgYWRkTmV3TGluZUFuZEZvY3VzKCkge1xuICAgIC8vIOW9k+WJjeihjOS4uuW9k+WJjemhteacgOWQjuS4gOihjOeahOaXtuWAme+8jOWIpOaWreS4i+S4gOmhteaYr+WQpuacieaVsOaNrlxuICAgIC8vIDHjgIHlpoLmnpzmnInvvJrnv7vpobUr6IGa54Sm56ys5LiA6KGM56ys5LiA5Liq5YWD57SgXG4gICAgLy8gMuOAgeWmguaenOayoeacie+8muaWsOWinuihjCvnv7vpobUr6IGa54Sm56ys5LiA6KGM56ys5LiA5Liq5YWD57SgXG4gICAgaWYgKHRoaXMuYWN0aXZlRG9tWCA9PT0gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUgLSAxKSB7XG4gICAgICAvLyDliKTmlq3kuIvkuIDpobXmmK/lkKbmnInmlbDmja5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IDxcbiAgICAgICAgTWF0aC5jZWlsKHRoaXMuZm9ybUxpbmVzTGVuZ3RoIC8gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUpXG4gICAgICApIHtcbiAgICAgICAgLy8g57+76aG1K+iBmueEpuesrOS4gOihjOesrOS4gOS4quWFg+e0oFxuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXgrKztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLM1wiKTtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKDAsIDAsIFwicmlnaHRcIik7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5paw5aKe6KGMK+e/u+mhtSvogZrnhKbnrKzkuIDooYznrKzkuIDkuKrlhYPntKBcbiAgICAgICAgdGhpcy5hZGRGb3JtTGluZSgpO1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXgrKztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLNFwiKTtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKDAsIDApO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRGb3JtTGluZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOiBmueEpuWIsOS4iuS4gOS4qmRvbVxuICBqdW1wVG9QcmV2SW5wdXQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHggPT09IDAgJiYgeSA9PT0gMCkge1xuICAgICAgLy8g5aaC5p6c5piv56ys5LiA5Liq5Y+v6L6T5YWl5YWD57Sg77yMIOWIpOaWreaYr+WQpuacieS4iuS4gOmhte+8jCDlpoLmnpzmnInvvIzliJnnv7vpobUr6IGa54Sm5Yiw5LiK5LiA6aG15pyA5ZCO5LiA5Liq5YWD57SgXG4gICAgICBpZiAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID4gMSkge1xuICAgICAgICAvLyDnv7vpobUr6IGa54Sm5Yiw5LiK5LiA6aG15pyA5ZCO5LiA5Liq5YWD57SgXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleC0tO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIs1XCIpO1xuICAgICAgICAgIHRoaXMuZm9jdXNEb20oXG4gICAgICAgICAgICB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgICB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh5ID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLNlwiKTtcbiAgICAgICAgLy8g5aaC5p6c5piv56ys5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5LiK5LiA6KGM5pyA5ZCO5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCAtIDEsIHRoaXMuY29sbGVjdERvbUxpc3RbMF0ubGVuZ3RoIC0gMSwgXCJsZWZ0XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIs3XCIpO1xuICAgICAgICAvLyDlpoLmnpzkuI3mmK/nrKzkuIDliJfvvIzliJnot7PovazliLDlvZPliY3ooYzkuIrkuIDkuKrovpPlhaXmoYZcbiAgICAgICAgdGhpcy5mb2N1c0RvbSh4LCB5IC0gMSwgXCJsZWZ0XCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDogZrnhKbliLDmn5DkuKpkb21cbiAgICogQHBhcmFtIHgg5Z2Q5qCHeFxuICAgKiBAcGFyYW0geSDlnZDmoId5XG4gICAqIEBwYXJhbSBqdW1wRGlyZWN0aW9uIOi3s+i9rOaWueWQkVxuICAgKi9cbiAgZm9jdXNEb20oeDogbnVtYmVyLCB5OiBudW1iZXIsIGp1bXBEaXJlY3Rpb246IHN0cmluZyA9IFwicmlnaHRcIikge1xuICAgIGlmIChcbiAgICAgIHggPT09IG51bGwgfHxcbiAgICAgIHkgPT09IG51bGwgfHxcbiAgICAgICF0aGlzLmNvbGxlY3REb21MaXN0IHx8XG4gICAgICB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDlhYjmuIXpmaTkuIDkuIvlvZPliY3nmoTnhKbngrlcbiAgICB0aGlzLmNsZWFuRm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgIGlmICh0aGlzLmNvbGxlY3REb21MaXN0W3hdICYmIHRoaXMuY29sbGVjdERvbUxpc3RbeF1beV0pIHtcbiAgICAgIGNvbnN0IGRvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbeF1beV07XG4gICAgICAvLyDpnIDopoHliKTmlq3kuIvkuIDkuKpmb2N1c+eahGRvbeaYr+WQpuaYr+emgeeUqOeKtuaAge+8jOWmguaenOaYr+emgeeUqOeKtuaAgemcgOimgei3s+i/h1xuICAgICAgaWYgKGRvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgIGlmIChkb20ubnpEaXNhYmxlZCkge1xuICAgICAgICAgIGlmIChqdW1wRGlyZWN0aW9uID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHgsIHkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuanVtcFRvUHJldklucHV0KHgsIHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZG9tLm56U2VsZWN0VG9wQ29udHJvbENvbXBvbmVudC5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyhcbiAgICAgICAgICB7IGJlaGF2aW9yOiBcInNtb290aFwiLCBibG9jazogXCJjZW50ZXJcIiwgaW5saW5lOiBcImNlbnRlclwiIH0sXG4gICAgICAgICk7XG4gICAgICAgIC8vIOi/memHjOWkmumAieahhumcgOimgemineWkluWkhOeQhuS4i++8jOWboOS4uuWQkeS4i+eahOaXtuWAmeS8muinpuWPkeWGhemDqElucHV055qE6IGa54Sm77yM5oqK5LiL5LiA5LiqZG9t55qEZm9jdXPmlL7liLDlro/ku7vliqHkuK3vvIzlu7bov5/lpITnkIbjgIJcbiAgICAgICAgaWYgKGRvbS5uelNlbGVjdFNlcnZpY2UubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBkb20uZm9jdXMoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb20uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkb20gaW5zdGFuY2VvZiBOeklucHV0TnVtYmVyQ29tcG9uZW50KSB7XG4gICAgICAgIGlmIChkb20ubnpEaXNhYmxlZCkge1xuICAgICAgICAgIGlmIChqdW1wRGlyZWN0aW9uID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHgsIHkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuanVtcFRvUHJldklucHV0KHgsIHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXREb206IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbS5ueklkKTtcbiAgICAgICAgaW5wdXREb20uZm9jdXMoKTtcbiAgICAgICAgaW5wdXREb20uc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgIGJlaGF2aW9yOiBcInNtb290aFwiLFxuICAgICAgICAgIGJsb2NrOiBcImNlbnRlclwiLFxuICAgICAgICAgIGlubGluZTogXCJjZW50ZXJcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlucHV0RG9tLnNlbGVjdCgpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoZG9tLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQpIHtcbiAgICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRvbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGRvbS5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgICBiZWhhdmlvcjogXCJzbW9vdGhcIixcbiAgICAgICAgICBibG9jazogXCJjZW50ZXJcIixcbiAgICAgICAgICBpbmxpbmU6IFwiY2VudGVyXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBkb20gaW5zdGFuY2VvZiBOekRhdGVQaWNrZXJDb21wb25lbnQgfHxcbiAgICAgICAgZG9tIGluc3RhbmNlb2YgTnpSYW5nZVBpY2tlckNvbXBvbmVudCB8fFxuICAgICAgICBkb20gaW5zdGFuY2VvZiBOelRpbWVQaWNrZXJDb21wb25lbnRcbiAgICAgICkge1xuICAgICAgICAvLyBUT0RPOuWcqG5nem9ycm84LjUueOeJiOacrO+8jOaXtumXtOebuOWFs+eahOmAieaLqeWZqOayoeacieaatOmcsuWHum9wZW7mlrnms5XvvIzmmoLml7blhYjkuI3lpITnkIbjgILvvIgxMC545Y+K5Lul5LiK54mI5pys5o+Q5L6b5LqGb3BlbuaWueazle+8iVxuICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQoeCwgeSk7XG4gICAgICAgIH0gZWxzZSBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNldEFjdGl2ZURvbSh4LCB5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g5rKh5pyJZG9t55qE5Zy65pmv5LiL77yM6ZyA6KaB5Yik5pat5piv5bem6L+Y5piv5Y+z77yMXG4gICAgfVxuICB9XG5cbiAgY2xlYW5Gb2N1c0RvbSh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGlmIChcbiAgICAgIHggPT09IG51bGwgfHxcbiAgICAgIHkgPT09IG51bGwgfHxcbiAgICAgICF0aGlzLmNvbGxlY3REb21MaXN0IHx8XG4gICAgICB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb2xsZWN0RG9tTGlzdFt4XSAmJiB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldKSB7XG4gICAgICBjb25zdCBkb20gPSB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldO1xuICAgICAgaWYgKGRvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgIGRvbS5ibHVyKCk7XG4gICAgICAgIGRvbS5uek9wZW4gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgTnpJbnB1dE51bWJlckNvbXBvbmVudCkge1xuICAgICAgICBkb20uYmx1cigpO1xuICAgICAgfSBlbHNlIGlmIChkb20gaW5zdGFuY2VvZiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGRvbS5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0QWN0aXZlRG9tKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgdGhpcy5hY3RpdmVEb21YID0geDtcbiAgICB0aGlzLmFjdGl2ZURvbVkgPSB5O1xuICAgIHRoaXMuYWN0aXZlRG9tID0gdGhpcy5jb2xsZWN0RG9tTGlzdFt0aGlzLmFjdGl2ZURvbVhdW3RoaXMuYWN0aXZlRG9tWV07XG4gICAgaWYgKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuKHRoaXMuYWN0aXZlRG9tLm9wZW4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7ooYzlj7flkozliJflj7flkI3np7Dojrflj5blvZPliY3ogZrnhKbnmoRkb23kvY3nva5cbiAgICogQHBhcmFtIHJvd051bWJlciDooYzlj7dcbiAgICogQHBhcmFtIGNvbE51bWJlciDliJflj7dcbiAgICovXG4gIHNldEFjdGl2ZURvbUluRm9ybUxpbmVzKHJvd051bWJlcjogbnVtYmVyLCBjb2xOdW1iZXI6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlRG9tWCA9IHJvd051bWJlcjtcbiAgICB0aGlzLmFjdGl2ZURvbVkgPSB0aGlzLmdldERvbUluZGV4KGNvbE51bWJlciwgdGhpcy5mb3JtTGluZXMpO1xuICAgIHRoaXMuc2V0QWN0aXZlRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDplK7nm5jngrnlh7vkuovku7ZcbiAgICogQHBhcmFtIGV2ZW50IOmUruebmOS6i+S7tlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUtleWJvYXJkT3BlcmF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5hY3RpdmVEb21YID09PSBudWxsIHx8IHRoaXMuYWN0aXZlRG9tWSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSBcIkFycm93VXBcIjpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQgJiZcbiAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlblxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tWCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YIC0gMSwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQgJiZcbiAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlblxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5Yik5pat5piv5ZCm5Zyo5pyA5ZCO5LiA6KGM77yM5Yqg6KGMXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURvbVggPT09IHRoaXMuY29sbGVjdERvbUxpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHRoaXMuY2xlYW5Gb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgICAgdGhpcy5hZGROZXdMaW5lQW5kRm9jdXMoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCArIDEsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgIHRoaXMuanVtcFRvUHJldklucHV0KHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQXJyb3dSaWdodFwiOlxuICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkVudGVyXCI6XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4odGhpcy5hY3RpdmVEb20ub3Blbik7XG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRG9tWCA9PT0gdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdGhpcy5hZGROZXdMaW5lQW5kRm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJFc2NhcGVcIjpcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQpIHtcbiAgICAgICAgICBjb25zdCBub3dBY3RpdmVEb20gPSB0aGlzLmFjdGl2ZURvbSBhcyBOelNlbGVjdENvbXBvbmVudDtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuKG5vd0FjdGl2ZURvbS5vcGVuKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgaWYgKG5vd0FjdGl2ZURvbS5uelNlbGVjdFNlcnZpY2UubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8g5aaC5p6c5b2T5YmN6IGa54Sm55qE5piv6YCJ5oup5qGG77yM5LiU6ZSu5YWlMC05YS16QS1a77yM5YiZ5by55Ye6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50ICYmXG4gICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4gPT09IGZhbHNlICYmXG4gICAgICAgICAgL15bMC05YS16QS1aXSQvLnRlc3QoZXZlbnQua2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBkb20gPSB0aGlzLmFjdGl2ZURvbTtcbiAgICAgICAgICBkb20ubnpPcGVuID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih0cnVlKTtcbiAgICAgICAgICAvLyAvLyBUT0RPOui/memHjOaaguaXtuazqOmHiu+8jOS4jeiDveebtOaOpeW4puWFpemUruWFpeWAvO+8jOi/meagt+S8muWvvOiHtOi+k+WFpeS4reaWh+eahOaXtuWAmeW4puWFpeiLseaWh+Wtl+espu+8jOS4jeespuWQiOmihOacn1xuICAgICAgICAgIC8vIGRvbS5uelNlbGVjdFRvcENvbnRyb2xDb21wb25lbnQuaW5wdXRWYWx1ZSA9IGV2ZW50LmtleTtcbiAgICAgICAgICAvLyAvLyDojrflj5YgaW5wdXQg5YWD57SgXG4gICAgICAgICAgLy8gY29uc3QgaW5wdXRFbGVtZW50ID0gZG9tLm56U2VsZWN0VG9wQ29udHJvbENvbXBvbmVudC5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyAgIC8vIOinpuWPkei+k+WFpeS6i+S7tu+8jOS7peehruS/nSBBbmd1bGFyIOajgOa1i+WIsOWAvOeahOWPmOWMllxuICAgICAgICAgIC8vICAgY29uc3QgZXZlbnRJbnB1dCA9IG5ldyBFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSk7XG4gICAgICAgICAgLy8gICBpbnB1dEVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudElucHV0KTtcbiAgICAgICAgICAvLyB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5Zyo5Yid5aeLZG9t5LiL5qCH5ZKM5pWw5o2u6ZuGIOiOt+WPluWcqGNvbGxlY3REb21MaXN05Lit55qE5LiL5qCHXG4gICAqIEBwYXJhbSBpbmRleCDliJ3lp4vkuIvmoIdcbiAgICogQHBhcmFtIGxpc3Qg6ICB5pWw5o2u6ZuGXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGdldERvbUluZGV4KGluZGV4OiBudW1iZXIsIGxpc3Q6IEFycmF5PEZvcm1MaW5lPik6IG51bWJlciB7XG4gICAgY29uc3QgdHlwZUxpc3QgPSBbXG4gICAgICBcIklucHV0XCIsXG4gICAgICBcIlNlbGVjdFwiLFxuICAgICAgXCJEYXRlXCIsXG4gICAgICBcIkRhdGVSYW5nZVwiLFxuICAgICAgXCJUZXh0QXJlYVwiLFxuICAgICAgXCJJbnB1dE51bWJlclwiLFxuICAgICAgXCJNdWx0aXBsZVNlbGVjdFwiLFxuICAgIF07XG4gICAgbGV0IGZpbHRlckxpc3QgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpID09PSBpbmRleCkge1xuICAgICAgICByZXR1cm4gZmlsdGVyTGlzdC5sZW5ndGg7XG4gICAgICB9XG4gICAgICAvLyDkuI7mqKHmnb/kuIDoh7TvvJpoaWRlIC8gaXNTaG93PWZhbHNlIOeahOWIl+S4jea4suafkyAjZm9ybUlucHV0RG9t77yM5LiN6K6h5YWlIGNvbGxlY3REb21MaXN0IOeahOWIl+S4i+agh1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlTGlzdC5pbmNsdWRlcyhsaXN0W2ldLnR5cGUpICYmXG4gICAgICAgICFsaXN0W2ldLmhpZGUgJiZcbiAgICAgICAgbGlzdFtpXS5pc1Nob3cgIT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgZmlsdGVyTGlzdC5wdXNoKGxpc3RbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7lnKhjb2xsZWN0RG9tTGlzdOS4reeahOS4i+agh+WSjOaVsOaNrumbhiDojrflj5bliJ3lp4tkb23kuIvmoIdcbiAgICogQHBhcmFtIGluZGV4IOaWsOS4i+agh1xuICAgKiBAcGFyYW0gbGlzdCDogIHmlbDmja7pm4ZcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgZ2V0T2xkRG9tSW5kZXgoaW5kZXg6IG51bWJlciwgbGlzdDogQXJyYXk8Rm9ybUxpbmU+KTogbnVtYmVyIHtcbiAgICBjb25zb2xlLmxvZyhcImluZGV4XCIsIGluZGV4KTtcbiAgICBjb25zb2xlLmxvZyhcImxpc3RcIiwgbGlzdCk7XG4gICAgY29uc3QgdHlwZUxpc3QgPSBbXG4gICAgICBcIklucHV0XCIsXG4gICAgICBcIlNlbGVjdFwiLFxuICAgICAgXCJEYXRlXCIsXG4gICAgICBcIkRhdGVSYW5nZVwiLFxuICAgICAgXCJUZXh0QXJlYVwiLFxuICAgICAgXCJJbnB1dE51bWJlclwiLFxuICAgICAgXCJNdWx0aXBsZVNlbGVjdFwiLFxuICAgIF07XG4gICAgbGV0IGZpbHRlckxpc3QgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZUxpc3QuaW5jbHVkZXMobGlzdFtpXS50eXBlKSAmJlxuICAgICAgICAhbGlzdFtpXS5oaWRlICYmXG4gICAgICAgIGxpc3RbaV0uaXNTaG93ICE9PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIGZpbHRlckxpc3QucHVzaChsaXN0W2ldKTtcbiAgICAgICAgaWYgKGZpbHRlckxpc3QubGVuZ3RoID09PSBpbmRleCArIDEpIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldCBsaW5lc0Zvcm1BcnJheSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KFwibGluZXNcIikgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgZ2V0IExvZGFzaFJvdW5kKCkge1xuICAgIHJldHVybiByb3VuZDtcbiAgfVxuXG4gIC8vIOaatOmcsueahOaWueazle+8jOeUqOS6juiOt+WPluaJgOacieaVsOaNrueahHZhbGlk54q25oCBXG4gIHB1YmxpYyBnZXRWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWQ7XG4gIH1cblxuICBvblNlYXJjaEV2ZW50KFxuICAgIGZuOiBhbnksXG4gICAgZXZlbnQ6IGFueSxcbiAgICBsaW5lOiBhbnksXG4gICAgb25TZWFyY2hFdmVudERlYm91bmNlVGltZTogYW55LFxuICApIHtcbiAgICBpZiAoIWZuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgb25TZWFyY2hFdmVudERlYm91bmNlVGltZSAhPSBudWxsID8gb25TZWFyY2hFdmVudERlYm91bmNlVGltZSA6IDA7XG4gICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXop6blj5HvvIzkuI3otbAgZGVib3VuY2VUaW1l77yI6YG/5YWN5byC5q2l77yJXG4gICAgaWYgKCFkZWJvdW5jZU1zKSB7XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlYm91bmNlVGltZW91dCA9IGRlYm91bmNlTXM7XG4gICAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0XG4gICAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgbGluZSkpO1xuICAgICAgdGhpcy5zZWFyY2hTdWJqZWN0Lm5leHQoeyBmbiwgZXZlbnQsIGxpbmUgfSk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4odHJ1ZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBvbk9wZW5DaGFuZ2VFdmVudChcbiAgICBmbjogYW55LFxuICAgIG9wZW46IGJvb2xlYW4sXG4gICAgbGluZTogYW55LFxuICAgIG9uT3BlbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lOiBhbnksXG4gICAgZm9ybUl0ZW0/OiBhbnksXG4gICkge1xuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5bGV5byA5pe25YWI5riF56m65penIG9wdGlvbnPvvIzpgb/lhY3mnaHku7blj5jljJblkI7or7fmsYLov5Tlm57liY3ku43lsZXnpLrkuIrkuIDmibnkuIvmi4nmlbDmja5cbiAgICBpZiAob3Blbikge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdE9wdGlvbnNPbk9wZW4oZm9ybUl0ZW0sIGxpbmUpO1xuICAgIH1cbiAgICBjb25zdCBkZWJvdW5jZU1zID1cbiAgICAgIG9uT3BlbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lICE9IG51bGxcbiAgICAgICAgPyBvbk9wZW5DaGFuZ2VFdmVudERlYm91bmNlVGltZVxuICAgICAgICA6IDA7XG4gICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXop6blj5HvvIzkuI3otbAgZGVib3VuY2VUaW1l77yI6YG/5YWN5byC5q2l77yJXG4gICAgaWYgKCFkZWJvdW5jZU1zKSB7XG4gICAgICBpZiAob3Blbikge1xuICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChmbiwgb3BlbiwgbGluZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlbkNoYW5nZURlYm91bmNlVGltZW91dCA9IGRlYm91bmNlTXM7XG4gICAgaWYgKHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5vcGVuQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMub3BlbkNoYW5nZVN1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLm9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQsIGxpbmUgfSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLm9wZW5DaGFuZ2VTdWJqZWN0Lm5leHQoeyBmbiwgZXZlbnQ6IG9wZW4sIGxpbmUgfSk7XG4gIH1cblxuICAvKiog5pyJIG9uT3BlbkNoYW5nZUV2ZW50IOaXtuWxleW8gOS4i+aLieWFiOa4heepuumAiemhue+8jOeUseS4muWKoeWbnuiwg+WGjeWGmeWFpeaWsOaVsOaNriAqL1xuICBwcml2YXRlIGNsZWFyU2VsZWN0T3B0aW9uc09uT3Blbihmb3JtSXRlbTogYW55LCBsaW5lOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWZvcm1JdGVtIHx8ICFmb3JtSXRlbS5zZWxlY3RPcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gZm9ybUl0ZW0uc2VsZWN0T3B0aW9uO1xuICAgIGlmIChvcHQuc2VsZWN0TGlzdCAhPSBudWxsKSB7XG4gICAgICBvcHQuc2VsZWN0TGlzdCA9IFtdO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBvcHQuc2VsZWN0TGlzdE5hbWUgJiZcbiAgICAgIGxpbmUgJiZcbiAgICAgIGxpbmUuZ2V0ICYmXG4gICAgICBsaW5lLmdldChvcHQuc2VsZWN0TGlzdE5hbWUpXG4gICAgKSB7XG4gICAgICBsaW5lLmdldChvcHQuc2VsZWN0TGlzdE5hbWUpLnNldFZhbHVlKFtdLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBmbiDniLbnu4Tku7blh73mlbBcbiAgICogQHBhcmFtIGV2ZW50IOS6i+S7tuWAvFxuICAgKiBAcGFyYW0gbGluZSDop6blj5HnmoTooYxcbiAgICovXG4gIHRyaWdnZXJFdmVudChmbjogYW55LCBldmVudDogYW55LCBsaW5lOiBhbnkpIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGZuKGV2ZW50LCBsaW5lKTtcbiAgICB9XG4gIH1cblxuICBpbm5lckdldFZhbGlkKCkge1xuICAgIGxldCB0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBsaW5lczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgfSk7XG4gICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZm9yRWFjaCgoZm9ybUxpbmVzRGF0YUl0ZW0pID0+IHtcbiAgICAgIGxldCBmb3JtR3JvdXBPYmo6IGFueSA9IHt9O1xuICAgICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAvLyDmlrDlop7ooYwg5Yid5aeL5pWw5o2u6YO95Li6bnVsbFxuICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5qdWRnZVZhbHVlSXNOb3RFbXB0eShmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdKVxuICAgICAgICAgICAgICA/IGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0ubmFtZV1cbiAgICAgICAgICAgICAgOiBpdGVtLnZhbHVlIHx8IG51bGwsXG4gICAgICAgICAgICBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGl0ZW0ucmVxdWlyZSA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6IFtdLFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXRlbS5zZWxlY3RPcHRpb24gJiYgaXRlbS5zZWxlY3RPcHRpb24ubGFiZWwpIHtcbiAgICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgICAgICAgZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdIHx8IG51bGwsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZvcm1Hcm91cE9iai5saW5lSW5kZXggPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgICh0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzLmdldChcImxpbmVzXCIpIGFzIEZvcm1BcnJheSkuY29udHJvbHMubGVuZ3RoICsgMSxcbiAgICAgICAgW10sXG4gICAgICApO1xuICAgICAgbGV0IGZvcm1Hcm91cFRtcCA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwT2JqKTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudCkge1xuICAgICAgICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgICAgICAgaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lICE9IG51bGxcbiAgICAgICAgICAgICAgPyBpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXBUbXAuZ2V0KGl0ZW0ubmFtZSk7XG4gICAgICAgICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXorqLpmIXvvIzkuI3otbAgZGVib3VuY2VUaW1lXG4gICAgICAgICAgaWYgKGRlYm91bmNlTXMgPiAwKSB7XG4gICAgICAgICAgICBjb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoZGVib3VuY2VNcykpXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwVG1wKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwVG1wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAodG1wVmFsaWRhdGVIZEZvcm1MaW5lcy5nZXQoXCJsaW5lc1wiKSBhcyBGb3JtQXJyYXkpLmluc2VydChcbiAgICAgICAgKHRtcFZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KFwibGluZXNcIikgYXMgRm9ybUFycmF5KS5jb250cm9scy5sZW5ndGgsXG4gICAgICAgIGZvcm1Hcm91cFRtcCxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRtcFZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gIH1cblxuICAvLyDmmrTpnLLnmoTmlrnms5XvvIznlKjkuo7ojrflj5bmiYDmnInmlbDmja5cbiAgcHVibGljIGdldExpbmVzKCkge1xuICAgIGxldCBhbGxMaW5lcyA9IFtdO1xuICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZvckVhY2goKGZvcm1MaW5lc0RhdGFJdGVtKSA9PiB7XG4gICAgICBsZXQgZm9ybUdyb3VwT2JqOiBhbnkgPSB7fTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgLy8g5paw5aKe6KGMIOWIneWni+aVsOaNrumDveS4um51bGxcbiAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0ubmFtZV0gPSBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdO1xuICAgICAgfSk7XG4gICAgICBmb3JtR3JvdXBPYmoubGluZUluZGV4ID0gZm9ybUxpbmVzRGF0YUl0ZW0ubGluZUluZGV4O1xuICAgICAgYWxsTGluZXMucHVzaChmb3JtR3JvdXBPYmopO1xuICAgIH0pO1xuICAgIHJldHVybiBhbGxMaW5lcztcbiAgfVxuXG4gIC8vIOWFqOWxgOaAp+eahOaQnOe0ou+8iOa2teeblumhtemdouS4iuaJgOacieeahOWPr+inhuaWh+Wtl++8iVxuICBzZWFyY2hMaW5lcygpIHtcbiAgICBpZiAodGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEubGVuZ3RoIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlTG9hZGluZyA9IHRydWU7XG4gICAgLy8g5aaC5p6c5rKh5pyJ6L6T5YWl5pCc57Si5a2X56ym5Liy77yM5YiZ5pi+56S657yT5a2Y5YaF55qE5omA5pyJ5pWw5o2uXG4gICAgaWYgKCF0aGlzLmZpbHRlclN0cikge1xuICAgICAgdGhpcy5pc0ZpbHRlckRhdGEgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0U3RvcmVEYXRhKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJTdHIudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5pc0ZpbHRlckRhdGEgPSB0cnVlO1xuICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZSA9IFtdO1xuXG4gICAgLy8g5qC55o2u5pCc57Si5a2X56ym5Liy6L+H5ruk5pWw5o2uXG4gICAgY29uc3QgZmlsdGVyZWREYXRhID0gdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZmlsdGVyKFxuICAgICAgKGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5mb3JtTGluZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoaXRlbS5oaWRlICYmIGl0ZW0uY2FuU2VhcmNoKSB8fFxuICAgICAgICAgICAgKCFpdGVtLmhpZGUgJiYgaXRlbS5uYW1lICE9PSBcInV1aWRcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaXRlbVwiLCBpdGVtLm5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW2l0ZW0ubmFtZV1cbiAgICAgICAgICAgICAgPyBkYXRhW2l0ZW0ubmFtZV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICApO1xuICAgIC8vIOe8k+WtmOS4gOS4i+etm+mAieWQjueahOihqOWNleaVsOaNrlxuICAgIHRoaXMuZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhID0gZmlsdGVyZWREYXRhO1xuICAgIC8vIOWkhOeQhuetm+mAieWlveeahOaVsOaNriDnhLblkI7ph43mlrDmuLLmn5NcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEgPSBmaWx0ZXJlZERhdGE7XG4gICAgdGhpcy5pbml0KHRydWUpO1xuICB9XG5cbiAgc2V0U3RvcmVEYXRhKCkge1xuICAgIHRoaXMuZm9ybUxpbmVzRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhO1xuICAgIHRoaXMuaW5pdCh0cnVlKTtcbiAgfVxuXG4gIGdldFN0eWxlKGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IGFueSwgd2lkdGg6IHN0cmluZykge1xuICAgIGxldCBzdHlsZU9iaiA9IHtcbiAgICAgIFwibWluLXdpZHRoXCI6IHdpZHRoLFxuICAgIH07XG4gICAgaWYgKGZvcm1JdGVtLnN0eWxlKSB7XG4gICAgICBzdHlsZU9iaiA9IHsgLi4uc3R5bGVPYmosIC4uLmZvcm1JdGVtLnN0eWxlIH07XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGZvcm1JdGVtLmNvbG9yT3B0aW9uICYmXG4gICAgICBmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lICYmXG4gICAgICBsaW5lLmdldChmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lKS52YWx1ZVxuICAgICkge1xuICAgICAgc3R5bGVPYmogPSB7XG4gICAgICAgIC4uLnN0eWxlT2JqLFxuICAgICAgICAuLi57IGNvbG9yOiBsaW5lLmdldChmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lKS52YWx1ZSB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlT2JqO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJmb3JtTGluZXNEYXRhXCJdICYmXG4gICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1wiZm9ybUxpbmVzRGF0YVwiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1wiZm9ybUxpbmVzRGF0YVwiXS5wcmV2aW91c1ZhbHVlKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhICYmIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IHRoaXMuZm9ybUxpbmVzRGF0YTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiZm9ybUxpbmVzXCJdICYmXG4gICAgICBjaGFuZ2VzW1wiZm9ybUxpbmVzXCJdLnByZXZpb3VzVmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcImZvcm1MaW5lc1wiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1wiZm9ybUxpbmVzXCJdLnByZXZpb3VzVmFsdWUpXG4gICAgKSB7XG4gICAgICB0aGlzLmluaXRDb2xTZXR0aW5ncygpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1widG90YWxPcHRpb25cIl0gJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJ0b3RhbE9wdGlvblwiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1widG90YWxPcHRpb25cIl0ucHJldmlvdXNWYWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWwoKTtcbiAgICB9XG4gIH1cblxuICBjYWxjdWxhdGVUb3RhbCgpIHtcbiAgICAvLyDov5nph4zlpITnkIblkIjorqHmlbDmja5cbiAgICBpZiAodGhpcy5zaG93VG90YWwpIHtcbiAgICAgIHRoaXMudG90YWxPcHRpb25MaXN0ID0gbmV3IEFycmF5KE51bWJlcih0aGlzLmNvbHVtbnNOdW1iZXIpIC0gMSkuZmlsbChcIlwiKTtcbiAgICAgIHRoaXMudG90YWxPcHRpb24uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5pbnNlcnRJbmRleCAmJiAoaXRlbS5pbnNlcnRWYWx1ZSB8fCBpdGVtLmluc2VydFZhbHVlID09PSAwKSkge1xuICAgICAgICAgIHRoaXMudG90YWxPcHRpb25MaXN0W2l0ZW0uaW5zZXJ0SW5kZXggLSAxXSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLmluc2VydFZhbHVlLFxuICAgICAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ24gfHwgXCJsZWZ0XCIsXG4gICAgICAgICAgICBzaG93RGVjaW1hbDogaXRlbS5zaG93RGVjaW1hbCB8fCBmYWxzZSxcbiAgICAgICAgICAgIHByZXNlcnZlTnVtYmVyOiBpdGVtLnByZXNlcnZlTnVtYmVyICE9IG51bGwgPyBpdGVtLnByZXNlcnZlTnVtYmVyIDogMixcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXQoaXNFZGl0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSAxO1xuICAgIC8vIOW8guW4uOaNleiOt1xuICAgIGlmICghdGhpcy5jaGVja0xpc3QodGhpcy5mb3JtTGluZXMpKSB7XG4gICAgICB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgICAvLyDlpoLmnpzmsqHmnIlmb3JtTGluZXNEYXRh77yM5YiZ6K6k5Li65piv5paw5aKeXG4gICAgaWYgKFxuICAgICAgIWlzRWRpdCAmJlxuICAgICAgKCF0aGlzLmZvcm1MaW5lc0RhdGEgfHxcbiAgICAgICAgKHRoaXMuZm9ybUxpbmVzRGF0YSAmJiB0aGlzLmZvcm1MaW5lc0RhdGEubGVuZ3RoID09PSAwKSlcbiAgICApIHtcbiAgICAgIHRoaXMudGFibGVMb2FkaW5nID0gZmFsc2U7XG4gICAgICAvLyBhbGxvd0VtcHR5IOS4lOS7heWIoOmZpOaMiemSru+8muS4jeiHquWKqOihpeepuuihjFxuICAgICAgaWYgKCF0aGlzLmlzVHJ1bHlFbXB0eUFsbG93ZWQpIHtcbiAgICAgICAgdGhpcy5hZGRGb3JtTGluZShudWxsLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNob3dGb3JtID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g57yW6L6R6YC76L6RXG4gICAgICB0aGlzLmFkZEZvcm1MaW5lV2l0aERhdGEoKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGRhdGEpID0+XG4gICAgICB0aGlzLm9uSGRGb3JtVmFsdWVDaGFuZ2VkKGRhdGEpLFxuICAgICk7XG4gICAgdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuihqOWNlVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcyA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbGluZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgIH0pO1xuICAgIHRoaXMubmV3TGluZSA9IHRoaXMubmV3TGluZUl0ZW0oKTtcbiAgfVxuXG4gIGRlbGF5SnVtcFRvTmV4dElucHV0KCkge1xuICAgIC8vIOWFs+mXremUruebmOaTjeS9nOaXtu+8jOmAieaLqeahhumAieS4reWQjuS4jeiHquWKqOi3s+i9rOWIsOS4i+S4gOS4qui+k+WFpeaOp+S7tlxuICAgIGlmICghdGhpcy5lbmFibGVLZXlib2FyZE9wZXJhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICog5a6a5LmJ56m655qEbmV3TGluZUl0ZW0g57uT5p6EXG4gICAqL1xuICBwcml2YXRlIG5ld0xpbmVJdGVtKCk6IEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTGluZUZyb21WYWx1ZXMobnVsbCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u6KGM5pWw5o2u5Yib5bu6IEZvcm1Hcm91cO+8iOWQq+makOiXj+Wtl+auteOAgXNlbGVjdCDnmoQgbGFiZWwg562J6ZmE5bGe5a2X5q6177yJXG4gICAqIEBwYXJhbSBmb3JtTGluZXNEYXRhSXRlbSDooYzmlbDmja7vvIznqbrooYzkvKAgbnVsbFxuICAgKiBAcGFyYW0gaXNFbXB0eUxpbmUg5piv5ZCm56m66KGM77yI5b2x5ZON5b+F5aGr5qCh6aqM6KeE5YiZ77yM5LiO5Y6G5Y+y6YC76L6R5L+d5oyB5LiA6Ie077yJXG4gICAqIEBwYXJhbSByZWdlbmVyYXRlUm93SWQg5piv5ZCm5by65Yi255Sf5oiQ5paw6KGMIGlk77yI5aSN5Yi26KGM5pe25L2/55So77yJXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUxpbmVGcm9tVmFsdWVzKFxuICAgIGZvcm1MaW5lc0RhdGFJdGVtOiBhbnksXG4gICAgaXNFbXB0eUxpbmU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICByZWdlbmVyYXRlUm93SWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogRm9ybUdyb3VwIHtcbiAgICBsZXQgZm9ybUdyb3VwT2JqOiBhbnkgPSB7fTtcbiAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBmb3JtR3JvdXBPYmpbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgZm9ybUxpbmVzRGF0YUl0ZW0gIT0gbnVsbFxuICAgICAgICAgICAgICA/IGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0ubmFtZV1cbiAgICAgICAgICAgICAgOiBpdGVtLnZhbHVlLFxuICAgICAgICAgIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkLFxuICAgICAgICB9LFxuICAgICAgICBpc0VtcHR5TGluZVxuICAgICAgICAgID8gaXRlbS5yZXF1aXJlICYmICFpdGVtLmhpZGVcbiAgICAgICAgICAgID8gW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICAgICAgICA6IFtdXG4gICAgICAgICAgOiBpdGVtLnJlcXVpcmVcbiAgICAgICAgICAgID8gW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICAgICAgICA6IFtdLFxuICAgICAgKTtcbiAgICAgIGlmIChpdGVtLnNlbGVjdE9wdGlvbiAmJiBpdGVtLnNlbGVjdE9wdGlvbi5sYWJlbCkge1xuICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgICAgIGZvcm1MaW5lc0RhdGFJdGVtICE9IG51bGxcbiAgICAgICAgICAgID8gZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdIHx8IG51bGxcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOeos+WumuihjCBpZO+8muaQnOe0oumHjeW7uuihqOWNleWQjueUqOS6juS/neeVmeWLvumAiVxuICAgIGNvbnN0IHJvd0lkID1cbiAgICAgICFyZWdlbmVyYXRlUm93SWQgJiYgZm9ybUxpbmVzRGF0YUl0ZW0gJiYgZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWRcbiAgICAgICAgPyBmb3JtTGluZXNEYXRhSXRlbS5faGRSb3dJZFxuICAgICAgICA6IHRoaXMuZ2VuZXJhdGVSb3dJZCgpO1xuICAgIGZvcm1Hcm91cE9iai5faGRSb3dJZCA9IHRoaXMuZmIuY29udHJvbChyb3dJZCk7XG4gICAgaWYgKGZvcm1MaW5lc0RhdGFJdGVtICYmICFmb3JtTGluZXNEYXRhSXRlbS5faGRSb3dJZCkge1xuICAgICAgZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWQgPSByb3dJZDtcbiAgICB9XG5cbiAgICAvLyDlpI3liLbmupDooYzkuIrlpJrkvZnnmoTlrZfmrrXvvIjpmpDol4/pmYTlsZ7lrZfmrrXjgIFzZWxlY3RMaXN0TmFtZSDnrYnvvIlcbiAgICBpZiAoZm9ybUxpbmVzRGF0YUl0ZW0pIHtcbiAgICAgIE9iamVjdC5rZXlzKGZvcm1MaW5lc0RhdGFJdGVtKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleSA9PT0gXCJsaW5lSW5kZXhcIiB8fFxuICAgICAgICAgIGtleSA9PT0gXCJpc0hkRm9ybUxpbmVTZWFyY2hBZGRcIiB8fFxuICAgICAgICAgIGtleSA9PT0gXCJfaGRSb3dJZFwiXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZvcm1Hcm91cE9ialtrZXldKSB7XG4gICAgICAgICAgZm9ybUdyb3VwT2JqW2tleV0gPSB0aGlzLmZiLmNvbnRyb2woZm9ybUxpbmVzRGF0YUl0ZW1ba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvcm1Hcm91cE9iai5saW5lSW5kZXggPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCArIDEsXG4gICAgICBbXSxcbiAgICApO1xuICAgIGZvcm1Hcm91cE9iai5pc0hkRm9ybUxpbmVTZWFyY2hBZGQgPSB0aGlzLmZiLmNvbnRyb2wodGhpcy5pc0ZpbHRlckRhdGEsIFtdKTtcbiAgICBsZXQgZm9ybUdyb3VwU3VibWl0ID0gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBPYmopO1xuICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZGVib3VuY2VNcyA9XG4gICAgICAgICAgaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lICE9IG51bGxcbiAgICAgICAgICAgID8gaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXBTdWJtaXQuZ2V0KGl0ZW0ubmFtZSk7XG4gICAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gRm9ybUxpbmVUeXBlLlNlbGVjdCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kZWxheUp1bXBUb05leHRJbnB1dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChpdGVtLm9uQ2hhbmdlRXZlbnQsIHZhbHVlLCBmb3JtR3JvdXBTdWJtaXQpO1xuICAgICAgICB9O1xuICAgICAgICAvLyDmnKrphY3nva7miJbkuLogMO+8muWQjOatpeiuoumYhe+8jOS4jei1sCBkZWJvdW5jZVRpbWVcbiAgICAgICAgaWYgKGRlYm91bmNlTXMgPiAwKSB7XG4gICAgICAgICAgY29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZShkZWJvdW5jZU1zKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaGFuZGxlQ2hhbmdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoaGFuZGxlQ2hhbmdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmb3JtR3JvdXBTdWJtaXQ7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUxpbmVOdW1iZXIoKSB7XG4gICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaXRlbS5nZXQoXCJsaW5lSW5kZXhcIikuc2V0VmFsdWUoaW5kZXggKyAxLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog57yW6L6R55qE5pe25YCZ5pWw5o2u5aSE55CGXG4gICAqL1xuICBhZGRGb3JtTGluZVdpdGhEYXRhKCkge1xuICAgIHRoaXMuZm9ybUxpbmVzRGF0YS5mb3JFYWNoKChmb3JtTGluZXNEYXRhSXRlbSkgPT4ge1xuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5pbnNlcnQoXG4gICAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoLFxuICAgICAgICB0aGlzLmNyZWF0ZUxpbmVGcm9tVmFsdWVzKGZvcm1MaW5lc0RhdGFJdGVtKSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dGb3JtID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlnKjmjIflrprooYzkuIvmlrnmlrDlop7nqbrooYzvvJvkuI3kvKAgYWZ0ZXJMaW5lIOWImei/veWKoOWIsOacq+WwvlxuICAgKiBAcGFyYW0gYWZ0ZXJMaW5lIOW9k+WJjeihjCBGb3JtR3JvdXDvvIjkuI3opoHkvKAgbGluZUluZGV477yM6YG/5YWN5bqP5Y+35YGP56e75a+86Ie05o+S6ZSZ5L2N572u77yJXG4gICAqL1xuICBhZGRGb3JtTGluZShhZnRlckxpbmU/OiBGb3JtR3JvdXAgfCBudWxsLCBpc0ZvY3VzOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IGluc2VydEF0ID0gdGhpcy5nZXRJbnNlcnRJbmRleEFmdGVyKGFmdGVyTGluZSk7XG4gICAgY29uc3QgbmV3TGluZSA9IHRoaXMubmV3TGluZUl0ZW0oKTtcbiAgICB0aGlzLmxpbmVzRm9ybUFycmF5Lmluc2VydChpbnNlcnRBdCwgbmV3TGluZSk7XG4gICAgdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgdGhpcy5hZGRMaW5lRXZlbnQuZW1pdChuZXdMaW5lKTtcbiAgICAvLyDot7PliLDmlrDlop7ooYzmiYDlnKjpobXvvIzpgb/lhY3pobXnoIHlvILluLjml7bnnIvkuI3liLDmlbDmja5cbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPVxuICAgICAgTWF0aC5mbG9vcihpbnNlcnRBdCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplKSArIDE7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgICBpZiAoaXNGb2N1cykge1xuICAgICAgICB0aGlzLmFjdGl2ZURvbVggPSB0aGlzLnRvUGFnZUxvY2FsUm93SW5kZXgoaW5zZXJ0QXQpO1xuICAgICAgICB0aGlzLmFjdGl2ZURvbVkgPSAwO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizEzXCIpO1xuICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlpI3liLblvZPliY3ooYzvvJrlnKjlvZPliY3ooYzkuIvmlrnmlrDlop7kuIDooYzvvIzlpI3liLbmiYDmnInlrZfmrrXlgLzvvIjlkKvpmpDol4/lrZfmrrXvvIlcbiAgICovXG4gIGNvcHlGb3JtTGluZShsaW5lOiBGb3JtR3JvdXApIHtcbiAgICBjb25zdCBzb3VyY2VJbmRleCA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuaW5kZXhPZihsaW5lKTtcbiAgICBpZiAoc291cmNlSW5kZXggPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGdldFJhd1ZhbHVlIOWMheWQqyBkaXNhYmxlZCDlrZfmrrXvvJvlpI3liLbooYzkvb/nlKjmlrDnmoQgX2hkUm93SWRcbiAgICBjb25zdCBzb3VyY2VWYWx1ZXMgPSBsaW5lLmdldFJhd1ZhbHVlKCk7XG4gICAgY29uc3QgaW5zZXJ0QXQgPSBzb3VyY2VJbmRleCArIDE7XG4gICAgdGhpcy5saW5lc0Zvcm1BcnJheS5pbnNlcnQoXG4gICAgICBpbnNlcnRBdCxcbiAgICAgIHRoaXMuY3JlYXRlTGluZUZyb21WYWx1ZXMoc291cmNlVmFsdWVzLCBmYWxzZSwgdHJ1ZSksXG4gICAgKTtcbiAgICB0aGlzLmNhbGN1bGF0ZUxpbmVOdW1iZXIoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgIHRoaXMuYWN0aXZlRG9tWCA9IHRoaXMudG9QYWdlTG9jYWxSb3dJbmRleChpbnNlcnRBdCk7XG4gICAgICB0aGlzLmFjdGl2ZURvbVkgPSAwO1xuICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBAT3V0cHV0KCkgZGVsZXRlTGluZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiDliKDpmaTooYxcbiAgICogQHBhcmFtIGxpbmVPckluZGV4IOihjCBGb3JtR3JvdXDvvIzmiJYgMS1iYXNlZCDnmoQgbGluZUluZGV477yI5YW85a65IHJlc2V0Rm9ybe+8iVxuICAgKi9cbiAgZGVsZXRlRm9ybUxpbmUobGluZU9ySW5kZXg6IEZvcm1Hcm91cCB8IG51bWJlcikge1xuICAgIGxldCByZW1vdmVBdCA9IC0xO1xuICAgIGlmICh0eXBlb2YgbGluZU9ySW5kZXggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJlbW92ZUF0ID0gbGluZU9ySW5kZXggLSAxO1xuICAgIH0gZWxzZSBpZiAobGluZU9ySW5kZXgpIHtcbiAgICAgIHJlbW92ZUF0ID0gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5pbmRleE9mKGxpbmVPckluZGV4KTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXG4gICAgICBcImluZGV4XCIsXG4gICAgICB0eXBlb2YgbGluZU9ySW5kZXggPT09IFwibnVtYmVyXCIgPyBsaW5lT3JJbmRleCA6IHJlbW92ZUF0LFxuICAgICk7XG4gICAgaWYgKHJlbW92ZUF0IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDmnIDlkI7kuIDmnaHmlbDmja7nmoTml7blgJnopoHliKTmlq3kuIDkuItcbiAgICBpZiAodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggPT09IDEgJiYgIXRoaXMuYWxsb3dFbXB0eSkge1xuICAgICAgaWYgKHRoaXMuZGVsZXRlTGFzdExpbmVFdmVudCkge1xuICAgICAgICB0aGlzLmRlbGV0ZUxhc3RMaW5lRXZlbnQuZW1pdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZW1vdmVkTGluZSA9IHRoaXMubGluZXNGb3JtQXJyYXkuYXQocmVtb3ZlQXQpIGFzIEZvcm1Hcm91cDtcbiAgICB0aGlzLmxpbmVzRm9ybUFycmF5LnJlbW92ZUF0KHJlbW92ZUF0KTtcbiAgICB0aGlzLnJlbW92ZUxpbmVGcm9tU2VsZWN0aW9uKHJlbW92ZWRMaW5lKTtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc0ZpbHRlckRhdGEgJiZcbiAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMgJiZcbiAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09PSAwICYmXG4gICAgICAhdGhpcy5pc1RydWx5RW1wdHlBbGxvd2VkXG4gICAgKSB7XG4gICAgICB0aGlzLmFkZEZvcm1MaW5lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOW9k+WJjemhteW3suaXoOaVsOaNruaXtuWbnumAgOmhteegge+8jOS4lOmhteeggeacgOWwj+S4uiAx77yI6YG/5YWN5Yig56m65ZCO5Y+Y5oiQIDAg5a+86Ie05YaN5re75Yqg55yL5LiN6KeB77yJXG4gICAgICBjb25zdCBtYXhQYWdlID0gTWF0aC5tYXgoXG4gICAgICAgIDEsXG4gICAgICAgIE1hdGguY2VpbChcbiAgICAgICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPiBtYXhQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA9IG1heFBhZ2U7XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGN1bGF0ZUxpbmVOdW1iZXIoKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKiog5Zyo5oyH5a6a6KGM5ZCO5pa555qE5o+S5YWl5LiL5qCH77yb5peg6KGM5YiZ6L+95Yqg5Yiw5pyr5bC+ICovXG4gIHByaXZhdGUgZ2V0SW5zZXJ0SW5kZXhBZnRlcihhZnRlckxpbmU/OiBGb3JtR3JvdXAgfCBudWxsKTogbnVtYmVyIHtcbiAgICBpZiAoIWFmdGVyTGluZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBpZHggPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmluZGV4T2YoYWZ0ZXJMaW5lKTtcbiAgICByZXR1cm4gaWR4ID49IDAgPyBpZHggKyAxIDogdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGg7XG4gIH1cblxuICAvKiog5YWo5bGA6KGM5LiL5qCH6L2s5b2T5YmN6aG15YaF55qE6KGM5LiL5qCH77yI5L6b6IGa54Sm55So77yJICovXG4gIHByaXZhdGUgdG9QYWdlTG9jYWxSb3dJbmRleChnbG9iYWxJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKFxuICAgICAgZ2xvYmFsSW5kZXggLSAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcGFnZUluZGV4Q2hhbmdlKGV2ZW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSBldmVudDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBwYWdlU2l6ZUNoYW5nZShldmVudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUgPSBldmVudDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgb25IZEZvcm1WYWx1ZUNoYW5nZWQoZGF0YT86IGFueSkge1xuICAgIGlmICh0aGlzLmlzRmlsdGVyRGF0YSkge1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5saW5lcyAmJiB0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gZGF0YS5saW5lcztcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGFbaXRlbV0gPSB7XG4gICAgICAgICAgICAgIC4uLnRoaXMuZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhW2luZGV4XSxcbiAgICAgICAgICAgICAgLi4ubGluZXNbaW5kZXhdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChsaW5lcy5sZW5ndGggPiB0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoKSB7XG4gICAgICAgICAgLy8g5pyJ5paw5aKe5pWw5o2u55qE5oOF5Ya1XG4gICAgICAgICAgLy8gc3RlcCAxOiDlhYjmib7mlrDlop7nmoRpbmRleOS4i+agh1xuICAgICAgICAgIGNvbnN0IGdldE5vd0xpbmVzID0gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLmdldFJhd1ZhbHVlKCkubGluZXM7XG4gICAgICAgICAgbGV0IGFkZEluZGV4ID0gLTE7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnZXROb3dMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGdldE5vd0xpbmVzW2ldLmlzSGRGb3JtTGluZVNlYXJjaEFkZCkge1xuICAgICAgICAgICAgICBhZGRJbmRleCA9IGk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWRkSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5zcGxpY2UoXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZVthZGRJbmRleCAtIDFdICsgMSxcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgZ2V0Tm93TGluZXNbYWRkSW5kZXhdLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnB1c2godGhpcy5maWx0ZXJJbmRleFN0b3JlW2FkZEluZGV4IC0gMV0gKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDmnInliKDpmaTmlbDmja7nmoTmg4XlhrVcbiAgICAgICAgICAvLyBzdGVwIDE65YWI5om+5Yiw5Yig6Zmk55qEaW5kZXjkuIvmoIdcbiAgICAgICAgICBsZXQgZGVsZXRlZEluZGV4ID0gLTE7XG4gICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGVkSW5kZXggPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5saW5lSW5kZXggLSBjb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVkSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZWxldGVkSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBzdGVwIDI6IOWIoOmZpOaAu+aVsOaNruS4reeahOWvueW6lOaVsOaNriwg5oqK5LiL5qCH5pWw57uE5ZKMbGluZXPplb/luqblr7npvZDvvIzlkIzml7bmiorkuIvmoIfmlbDnu4TlnKhkZWxldGVkSW5kZXjlkI7pnaLnmoTlgLzlhajpg70tMVxuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5maWx0ZXIoXG4gICAgICAgICAgICAgIChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCAhPT0gdGhpcy5maWx0ZXJJbmRleFN0b3JlW2RlbGV0ZWRJbmRleF07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnNwbGljZShkZWxldGVkSW5kZXgsIDEpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKGkgPj0gZGVsZXRlZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlW2ldLS07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc3RlcCAyOiDmsqHmnInmib7liLBkZWxldGVkSW5kZXjor7TmmI7liKDpmaTmk43kvZzlnKjmnIDlkI7kuIDooYxcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckluZGV4ID1cbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlW3RoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggIT09IGZpbHRlckluZGV4O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5wb3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEubGluZXMpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IGRhdGEubGluZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5saW5lcykge1xuICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IGRhdGEubGluZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g5oC76KGo5Y2VXG4gICAgaWYgKCF0aGlzLmlzRmlsdGVyRGF0YSkge1xuICAgICAgdGhpcy5mb3JtVmFsaWQgPSB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmZvcm1WYWxpZCkge1xuICAgICAgICAvLyDlpoLmnpzmlbTkvZPooajljZXmmK90cnVl77yM5LiN566h5a2Q6KGo5Y2V5piv5LuA5LmI77yM6YO95Y+Y5oiQ5a2Q6KGo5Y2V55qE54q25oCBXG4gICAgICAgIHRoaXMuZm9ybVZhbGlkID0gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5aaC5p6c5pW05L2T6KGo5Y2V5pivZmFsc2XvvJox44CB5a2Q6KGo5Y2V5Li6dHJ1Ze+8jOmcgOimgemHjeeul++8mzLjgIHlrZDooajljZXkuLpmYWxzZe+8jOeUqOWtkOihqOWNleeKtuaAgVxuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkKSB7XG4gICAgICAgICAgdGhpcy5mb3JtVmFsaWQgPSB0aGlzLmlubmVyR2V0VmFsaWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvcm1WYWxpZCA9IHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWxpZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB0aGlzLmNhbGN1bGF0ZUxpbmVOdW1iZXIoKTtcbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tMaXN0KGxpc3Q6IEFycmF5PEZvcm1MaW5lPik6IGJvb2xlYW4ge1xuICAgIGlmICghbGlzdCB8fCAobGlzdCAmJiBsaXN0Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IG5hbWVMaXN0ID0gW107XG4gICAgbGV0IHNlbGVjdE9wdGlvbkNoZWNrTGlzdCA9IFtdO1xuICAgIGxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgLy8g5qCh6aqM5Y2V6aG56YCJ5oup5ZmoXG4gICAgICAvLyBpZiAoaXRlbS50eXBlID09PSBGb3JtTGluZVR5cGUuU2VsZWN0ICYmICghaXRlbS5zZWxlY3RMaXN0IHx8IChpdGVtLnNlbGVjdExpc3QgJiYgaXRlbS5zZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkpKSB7XG4gICAgICAvLyAgIHRocm93ICdmb3JtTGluZXPnu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIPvvIzlrZjlnKjljZXpobnpgInmi6nlmajmsqHmnInkvKDlhaXpgInpobkhJ1xuICAgICAgLy8gfVxuICAgICAgbmFtZUxpc3QucHVzaChpdGVtLm5hbWUpO1xuXG4gICAgICAvLyDmoKHpqozmnIlvblNlYXJjaOeahOWtl+auteeahHNlbGVjdE9wdGlvbueahHZhbHVl44CBbGFiZWzmmK/lkKblnKhmb3JtTGluZemHjOmdoumDveWumuS5ieS6hlxuICAgICAgaWYgKGl0ZW0ub25TZWFyY2hFdmVudCAmJiBpdGVtLnNlbGVjdE9wdGlvbikge1xuICAgICAgICBzZWxlY3RPcHRpb25DaGVja0xpc3QgPSBbXTtcbiAgICAgICAgbGlzdC5mb3JFYWNoKChpbm5lckl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpbm5lckl0ZW0ubmFtZSA9PT0gaXRlbS5zZWxlY3RPcHRpb24udmFsdWUgfHxcbiAgICAgICAgICAgIGlubmVySXRlbS5uYW1lID09PSBpdGVtLnNlbGVjdE9wdGlvbi5sYWJlbFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgc2VsZWN0T3B0aW9uQ2hlY2tMaXN0LnB1c2goaW5uZXJJdGVtLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzZWxlY3RPcHRpb25DaGVja0xpc3QubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHRocm93IGBmb3JtTGluZXPnu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIPvvIzlrZfmrrUke2l0ZW0ubmFtZX3nmoRzZWxlY3RPcHRpb27nmoR2YWx1ZeOAgWxhYmVs5a2X5q615pyq6IO95ZyoZm9ybUxpbmVz5Lit5om+5Yiw5a+55bqU5a2X5q6177yBYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOagoemqjG5hbWXmmK/lkKbph43lpI1cbiAgICBpZiAoWy4uLm5ldyBTZXQobmFtZUxpc3QpXS5sZW5ndGggIT09IGxpc3QubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBcImZvcm1MaW5lc+e7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMg++8jOWtmOWcqOmHjeWkjW5hbWXlgLwhXCI7XG4gICAgfVxuICAgIC8vIC4uLm1vcmUgY2hlY2tcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJtaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlRXZlbnQuZW1pdCh0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0UmF3VmFsdWUoKSk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIC8vIOWIoOmZpFxuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0aGlzLmRlbGV0ZUZvcm1MaW5lKGkpO1xuICAgIH1cbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSAxO1xuICB9XG5cbiAgcHVibGljIGlucHV0Q2xlYW4oZm9ybUl0ZW06IGFueSwgbGluZTogYW55KTogdm9pZCB7XG4gICAgbGluZS5nZXQoZm9ybUl0ZW0ubmFtZSkuc2V0VmFsdWUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0VmFsdWUoaWQ6IHN0cmluZywgcm93TnVtYmVyOiBudW1iZXIsIGNvbE51bWJlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXREb206IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaWQpO1xuICAgIGlucHV0RG9tLnNlbGVjdCgpO1xuICAgIHRoaXMuc2V0QWN0aXZlRG9tSW5Gb3JtTGluZXMocm93TnVtYmVyLCBjb2xOdW1iZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZXh0V2lkdGhDYWNoZTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG4gIGlzVGV4dE92ZXJmbG93KHRleHQ6IHN0cmluZywgbWF4V2lkdGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNhY2hlZFdpZHRoID0gdGhpcy50ZXh0V2lkdGhDYWNoZVt0ZXh0XTtcbiAgICBpZiAoY2FjaGVkV2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFdpZHRoICsgMTUgPj0gbWF4V2lkdGg7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgc3Bhbi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICBzcGFuLnN0eWxlLndoaXRlU3BhY2UgPSBcIm5vd3JhcFwiO1xuICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBcIjE0cHhcIjtcbiAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiOyAvLyDlsIbmoLflvI/kv67mlLnkuLogaW5saW5lLWJsb2NrXG4gICAgc3Bhbi5pbm5lclRleHQgPSB0ZXh0O1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgY29uc3QgaXNPdmVyZmxvdyA9IHNwYW4ub2Zmc2V0V2lkdGggKyAxNSA+PSBtYXhXaWR0aDtcbiAgICB0aGlzLnRleHRXaWR0aENhY2hlW3RleHRdID0gc3Bhbi5vZmZzZXRXaWR0aDtcbiAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgIHJldHVybiBpc092ZXJmbG93O1xuICB9XG5cbiAganVkZ2VDb2xFbXB0eShzdHI6IGFueSkge1xuICAgIGlmIChzdHIgfHwgc3RyID09PSAwKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCI856m6PlwiO1xuICAgIH1cbiAgfVxuXG4gIGp1ZGdlVmFsdWVJc05vdEVtcHR5KHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciA9PT0gbnVsbCAmJiBzdHIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
2724
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZm9ybS1saW5lcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mYW50YXN5LW5nem9ycm8vIiwic291cmNlcyI6WyJoZC1mb3JtLWxpbmVzL2hkLWZvcm0tbGluZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsV0FBVyxFQUNYLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxLQUFLLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUNMLFlBQVksRUFDWixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIscUJBQXFCLEdBQ3RCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQVksWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7O01BR2pGLHNDQUFzQyxHQUFHLEVBQUU7QUFPakQsTUFBTSxPQUFPLG9CQUFvQjs7Ozs7O0lBMkcvQixZQUNVLEVBQWUsRUFDZixHQUFzQixFQUN0QixvQkFBMEM7UUFGMUMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FB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dkMsbURBQ3NDOzs7OztJQUV0QyxvREFDdUM7Ozs7O0lBRXZDLDBDQUM2Qjs7SUFHN0IsaURBQW1DOztJQUNuQyw2Q0FBK0I7O0lBQy9CLDRDQUFtQzs7SUFDbkMsNkNBQW9DOztJQUNwQyxrREFBeUM7O0lBQ3pDLG1EQUEwQzs7SUFDMUMsb0RBQXdFOzs7OztJQUN4RSwyQ0FBZ0M7Ozs7O0lBQ2hDLDRDQUFrQzs7Ozs7SUFDbEMsMkNBQXlCOzs7Ozs7SUFFekIsK0NBQXlDOztJQTRpRHpDLCtDQUErQzs7Ozs7SUF1UC9DLDhDQUF1RDs7Ozs7SUFoeURyRCxrQ0FBdUI7Ozs7O0lBQ3ZCLG1DQUE4Qjs7Ozs7SUFDOUIsb0RBQWtEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0ICogYXMgbG9jYWxmb3JhZ2UgZnJvbSBcImxvY2FsZm9yYWdlXCI7XG5pbXBvcnQge1xuICBJbnB1dEJvb2xlYW4sXG4gIE56RGF0ZVBpY2tlckNvbXBvbmVudCxcbiAgTnpJbnB1dE51bWJlckNvbXBvbmVudCxcbiAgTnpSYW5nZVBpY2tlckNvbXBvbmVudCxcbiAgTnpTZWxlY3RDb21wb25lbnQsXG4gIE56VGltZVBpY2tlckNvbXBvbmVudCxcbn0gZnJvbSBcIm5nLXpvcnJvLWFudGRcIjtcbmltcG9ydCB7IE56Rm9ybWF0RW1pdEV2ZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvY29yZVwiO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgVG90YWxPcHRpb24gfSBmcm9tIFwiLi4vaGQtZGV0YWlsLWxpbmVzL2hkLWRldGFpbC1saW5lcy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUcmVlR3JpZCB9IGZyb20gXCIuLi9oZC10YWJsZS9oZC10YWJsZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBTZWxlY3RPcHRpb25UYWJsZUNvbHVtbiB9IGZyb20gXCIuLi9tb2RlbC9jb21tb24tdHlwZVwiO1xuaW1wb3J0IHsgQ29tbW9uU2Vzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZS9jb21tb24tc2Vzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBGb3JtTGluZSwgRm9ybUxpbmVUeXBlLCBGb3JtTGluZXNDYWNoZU9wdGlvbiB9IGZyb20gXCIuL2hkLWZvcm0tbGluZXMuc2VydmljZVwiO1xuXG4vKiog5LiOIGFudC1zZWxlY3Qg6YCJ6aG56aG55rC05bmz5YaF6L656Led5LiA6Ie077yM55So5LqO6KGo5aS05LiO6YCJ6aG56KGM5a+56b2QICovXG5jb25zdCBTRUxFQ1RfVEFCTEVfT1BUSU9OX0hPUklaT05UQUxfUEFERElORyA9IDEyO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiaGQtZm9ybS1saW5lc1wiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2hkLWZvcm0tbGluZXMuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2hkLWZvcm0tbGluZXMuY29tcG9uZW50Lmxlc3NcIl0sXG59KVxuZXhwb3J0IGNsYXNzIEhkRm9ybUxpbmVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkcmVuKFwiZm9ybUlucHV0RG9tXCIpIGZvcm1JbnB1dERvbUxpc3QhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dMaW5lTnVtYmVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGFsbG93RW1wdHk6IGJvb2xlYW4gPSB0cnVlO1xuICBAT3V0cHV0KCkgZGVsZXRlTGFzdExpbmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dLZXlib2FyZE9wZXJhdGVUaXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuWQr+eUqOmUruebmOaWueWQkemUri9FbnRlciDlnKjljZXlhYPmoLzpl7Tot7PovazvvIzpu5jorqTlvIDlkK8gKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGVuYWJsZUtleWJvYXJkT3BlcmF0ZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB0YWJsZUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuWxleekuuihjOWLvumAieWIl++8jOeUqOS6juWklumDqOaJuemHj+aTjeS9nOWLvumAieihjCAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0NoZWNrYm94OiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiDmmK/lkKblsZXnpLrliJforr7nva7vvIjpvb/ova7vvInvvIzpu5jorqTlhbPpl63vvJvpnIDopoHml7bpobXpnaLmiYvlt6UgYFtzaG93Q29sU2V0dGluZ3NdPVwidHJ1ZVwiYO+8m+S7hemdniBoaWRlIOeahCBWaWV3RG9tIOWPr+mFjee9ru+8jOemgeatouaLluaLveiwg+W6jyAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0NvbFNldHRpbmdzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiDliJforr7nva7nvJPlrZgga2V5IOeJh+aute+8m+acieWAvOaXtuaMgeS5heWMluWIsCBJbmRleGVkRELvvIzml6DliJnku4XlvZPliY3kvJror53nlJ/mlYggKi9cbiAgQElucHV0KCkgdXVpZDogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtTGluZXM6IEFycmF5PEZvcm1MaW5lPjtcbiAgLy8g6ZKI5a+5Zm9ybUxpbmVz6YeM6Z2i5omA5pyJ55qEbmFtZe+8jFxuICBASW5wdXQoKSBmb3JtTGluZXNEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIG9wZXJhdGVCdXR0b25zOiBBcnJheTxzdHJpbmc+ID0gW1wiYWRkXCIsIFwiZGVsZXRlXCJdOyAvLyDmk43kvZzliJfmjInpkq7vvJphZGQgLyBkZWxldGUgLyBjb3B5XG4gIEBJbnB1dCgpIHNjcm9sbDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHsgeDogXCIxcHhcIiB9O1xuICBAT3V0cHV0KCkgY2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiDmlrDlop7nqbrooYzlkI7mipvlh7ror6XooYwgRm9ybUdyb3Vw77yI5omL5Yqo5re75Yqg44CB6ZSu55uY6Lez6KGM6Ieq5Yqo6KGl6KGM562J77yJICovXG4gIEBPdXRwdXQoKSBhZGRMaW5lRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4oKTtcbiAgLyoqIOWLvumAieWPmOWMluaXtuaKm+WHuuW9k+WJjeWLvumAieihjCBGb3JtR3JvdXAg5YiX6KGoICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cFtdPigpO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0RlbGV0ZUNvbmZpcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGFnaW5hdGlvblBhZ2VJbmRleDogbnVtYmVyID0gMTtcbiAgcGFnaW5hdGlvblBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgdmFsaWRhdGVIZEZvcm1MaW5lczogRm9ybUdyb3VwO1xuICBuZXdMaW5lOiBhbnk7XG4gIGlucHV0VmFsdWU6IHN0cmluZztcblxuICAvLyDlkIjorqHljLrln59cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dUb3RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0b3RhbE9wdGlvbjogQXJyYXk8VG90YWxPcHRpb24+ID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnNOdW1iZXI6IG51bWJlciB8IHN0cmluZyA9IDA7XG4gIHRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuXG4gIHNob3dGb3JtOiBib29sZWFuID0gZmFsc2U7XG4gIGZpbHRlclN0cjogc3RyaW5nO1xuICBzdG9yZUZvcm1MaW5lc0RhdGE6IGFueSA9IFtdOyAvLyDnvJPlrZjnmoTmgLvnmoTooajljZXmlbDmja5cbiAgZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhOiBhbnkgPSBbXTsgLy8g562b6YCJ5Ye65p2l55qE5pWw5o2u5YiX6KGoXG4gIGZpbHRlckluZGV4U3RvcmU6IEFycmF5PG51bWJlcj4gPSBbXTsgLy8g562b6YCJ5Ye65p2l55qE5pWw5o2u5Zyo5Y6f5aeL5YiX6KGo5Lit55qE5LiL5qCHXG4gIGlzRmlsdGVyRGF0YTogYm9vbGVhbiA9IGZhbHNlOyAvLyDmmK/lkKbmmK/lt7Lnu4/nrZvpgInov4fnmoTmlbDmja5cbiAgZm9ybVZhbGlkOiBib29sZWFuID0gZmFsc2U7IC8vIOihqOWNleW9k+WJjeeahOeKtuaAgVxuICAvKiog5Yu+6YCJ55qE6KGMIGlk77yI6Leo6aG144CB5pCc57Si6YeN5bu65ZCO5LuN5L+d55WZ77yJICovXG4gIHByaXZhdGUgc2VsZWN0ZWRSb3dJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBmbjogYW55OyBldmVudDogYW55OyBsaW5lOiBhbnkgfT4oKTtcbiAgcHJpdmF0ZSBkZWJvdW5jZVRpbWVvdXQ6IG51bWJlciA9IDA7IC8vIOm7mOiupOmYsuaKluaXtumXtFxuXG4gIHByaXZhdGUgc2VhcmNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZm9ybUlucHV0RG9tTGlzdFN1YjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgb3BlbkNoYW5nZVN1YmplY3QgPSBuZXcgU3ViamVjdDx7IGZuOiBhbnk7IGV2ZW50OiBhbnk7IGxpbmU6IGFueSB9PigpO1xuICBwcml2YXRlIG9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgb3BlbkNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8vIOW9k+WJjemhteeahGRvbeS6jOe7tOaVsOe7hFxuICBjb2xsZWN0RG9tTGlzdDogQXJyYXk8XG4gICAgQXJyYXk8XG4gICAgICB8IEVsZW1lbnRSZWZcbiAgICAgIHwgTnpTZWxlY3RDb21wb25lbnRcbiAgICAgIHwgTnpJbnB1dE51bWJlckNvbXBvbmVudFxuICAgICAgfCBOekRhdGVQaWNrZXJDb21wb25lbnRcbiAgICAgIHwgTnpSYW5nZVBpY2tlckNvbXBvbmVudFxuICAgICAgfCBOelRpbWVQaWNrZXJDb21wb25lbnRcbiAgICA+XG4gID4gPSBbXTtcbiAgLy8g5b2T5YmN6IGa54Sm55qEZG9t5YWD57Sg5Z2Q5qCHXG4gIGFjdGl2ZURvbVg6IG51bWJlciA9IG51bGw7XG4gIGFjdGl2ZURvbVk6IG51bWJlciA9IG51bGw7XG4gIGFjdGl2ZURvbTpcbiAgICB8IEVsZW1lbnRSZWZcbiAgICB8IE56U2VsZWN0Q29tcG9uZW50XG4gICAgfCBOeklucHV0TnVtYmVyQ29tcG9uZW50XG4gICAgfCBOekRhdGVQaWNrZXJDb21wb25lbnRcbiAgICB8IE56UmFuZ2VQaWNrZXJDb21wb25lbnRcbiAgICB8IE56VGltZVBpY2tlckNvbXBvbmVudCA9IG51bGw7XG4gIGFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBAQ29udGVudENoaWxkKFwiVmlld0RvbVJpZ2h0VGVtcGxhdGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIFZpZXdEb21SaWdodFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKiog5bel5YW35qCP5bem5L6n6Ieq5a6a5LmJ5oyJ6ZKu77yM55So5rOV5ZCMIGhkLXRhYmxlIOeahCB0YWJsZUxlZnRCdXR0b24gKi9cbiAgQENvbnRlbnRDaGlsZChcImZvcm1MaW5lc0xlZnRCdXR0b25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGZvcm1MaW5lc0xlZnRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKiDlt6XlhbfmoI/lj7Pkvqfoh6rlrprkuYnmjInpkq7vvIznlKjms5XlkIwgaGQtdGFibGUg55qEIHRhYmxlUmlnaHRCdXR0b24gKi9cbiAgQENvbnRlbnRDaGlsZChcImZvcm1MaW5lc1JpZ2h0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBmb3JtTGluZXNSaWdodEJ1dHRvbjogVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqIOihqOagvOS4iuaWueiHquWumuS5ieWMuuWfn++8iOWmguWLvumAieaPkOekuu+8ie+8jOeUqOazleWQjCBoZC10YWJsZSDnmoQgdGFibGVUb3RhbCAqL1xuICBAQ29udGVudENoaWxkKFwidGFibGVUb3RhbFwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVUb3RhbDogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvLyDliJforr7nva5cbiAgaXNEcm9wZG93blZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd0xpc3ROb2RlczogYm9vbGVhbiA9IGZhbHNlO1xuICBub3dMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBoaWRlTGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgY2FuY2VsTm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgY2FuY2VsSGlkZUxpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIGZvcm1MaW5lc0NhY2hlT3B0aW9uOiBGb3JtTGluZXNDYWNoZU9wdGlvbiA9IG5ldyBGb3JtTGluZXNDYWNoZU9wdGlvbigpO1xuICBwcml2YXRlIGxvY2FsZm9yYWdlOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIGxvY2FsdGlvblRtcDogc3RyaW5nID0gXCJcIjtcbiAgcHJpdmF0ZSB1c2VyU2Vzc2lvbjogYW55O1xuICAvKiog5piv5ZCm5bey5LuOIEluZGV4ZWREQiDor7vliLDov4fliJforr7nva7nvJPlrZjvvIjlkKsgY29scyDkuLrnqbrvvIkgKi9cbiAgcHJpdmF0ZSBjb2xzQ2FjaGVMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb21tb25TZXNzaW9uU2VydmljZTogQ29tbW9uU2Vzc2lvblNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMubG9jYWxmb3JhZ2UgPSBsb2NhbGZvcmFnZS5jcmVhdGVJbnN0YW5jZSh7XG4gICAgICBkcml2ZXI6IGxvY2FsZm9yYWdlLklOREVYRUREQixcbiAgICAgIG5hbWU6IFwiaGQtZnNjbVwiLFxuICAgICAgdmVyc2lvbjogMS4wLFxuICAgICAgc3RvcmVOYW1lOiBcImhkLWZzY20tc3RvcmVcIixcbiAgICB9KTtcbiAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VhcmNoU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lb3V0KSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgbGluZSkpO1xuICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMub3BlbkNoYW5nZVN1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLm9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQsIGxpbmUgfSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubG9jYWx0aW9uVG1wID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgaWYgKHRoaXMubG9jYWx0aW9uVG1wKSB7XG4gICAgICB0aGlzLmxvY2FsdGlvblRtcCA9IHRoaXMubG9jYWx0aW9uVG1wLnJlcGxhY2UoL1xcLy9nLCBcIl9cIik7XG4gICAgfVxuICAgIHRoaXMudXNlclNlc3Npb24gPSB0aGlzLmNvbW1vblNlc3Npb25TZXJ2aWNlLmdldFNlc3Npb24oXG4gICAgICBcIl9fanlfYXV0aG9yaXphdGlvbl9zZXNzaW9uX19cIixcbiAgICApO1xuICAgIGlmICghdGhpcy51c2VyU2Vzc2lvbikge1xuICAgICAgdGhpcy51c2VyU2Vzc2lvbiA9IHsgdXNlckNvZGU6IFwiZGV2XCIgfTtcbiAgICB9XG4gICAgLy8g57yT5a2Y5LiA5LiL5oC755qE6KGo5Y2V5pWw5o2uXG4gICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLmZvcm1MaW5lc0RhdGE7XG4gICAgdGhpcy5pbml0Q29sU2V0dGluZ3MoKTtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgdGhpcy5mb3JtSW5wdXREb21MaXN0U3ViID0gdGhpcy5mb3JtSW5wdXREb21MaXN0LmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5vcGVuQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvcm1JbnB1dERvbUxpc3RTdWIpIHtcbiAgICAgIHRoaXMuZm9ybUlucHV0RG9tTGlzdFN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmb3JtTGluZXNMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IG9wZXJhdGVDb2xXaWR0aCgpIHtcbiAgICBjb25zdCBjb3VudCA9ICh0aGlzLm9wZXJhdGVCdXR0b25zIHx8IFtdKS5maWx0ZXIoKGJ0bikgPT5cbiAgICAgIFtcImFkZFwiLCBcImNvcHlcIiwgXCJkZWxldGVcIl0uaW5jbHVkZXMoYnRuKSxcbiAgICApLmxlbmd0aDtcbiAgICByZXR1cm4gTWF0aC5tYXgoY291bnQgKiA0MCwgODApO1xuICB9XG5cbiAgLyoqIGFsbG93RW1wdHkg5LiU5pON5L2c5YiX5LuF5pyJ5Yig6Zmk5pe277ya5YWB6K64IDAg6KGM77yM5Yid5aeL5YyW5LiO5Yig6Iez56m66YO95LiN6Ieq5Yqo6KGl56m66KGMICovXG4gIGdldCBpc1RydWx5RW1wdHlBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJ1dHRvbnMgPSAodGhpcy5vcGVyYXRlQnV0dG9ucyB8fCBbXSkuZmlsdGVyKChidG4pID0+XG4gICAgICBbXCJhZGRcIiwgXCJjb3B5XCIsIFwiZGVsZXRlXCJdLmluY2x1ZGVzKGJ0biksXG4gICAgKTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hbGxvd0VtcHR5ICYmXG4gICAgICBidXR0b25zLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgYnV0dG9uc1swXSA9PT0gXCJkZWxldGVcIlxuICAgICk7XG4gIH1cblxuICAvKiog5Yu+6YCJ5YiX5Zu65a6a5pe277yM5bqP5Y+35YiX55qEIGxlZnQg5YGP56e7ICovXG4gIGdldCBsaW5lTnVtYmVyTGVmdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93Q2hlY2tib3ggPyBcIjQwcHhcIiA6IFwiMHB4XCI7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUm93SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGhkX3Jvd18ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOSl9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um93SWQobGluZTogRm9ybUdyb3VwKTogc3RyaW5nIHtcbiAgICBpZiAoIWxpbmUgfHwgIWxpbmUuZ2V0KFwiX2hkUm93SWRcIikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbGluZS5nZXQoXCJfaGRSb3dJZFwiKS52YWx1ZTtcbiAgfVxuXG4gIC8qKiDlvZPliY3pobXnmoTooYzvvIjnlKjkuo7ooajlpLTlhajpgInvvIzku4XkvZznlKjkuo7lvZPliY3pobXvvIzot6jpobXli77pgInku43kv53nlZnvvIkgKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50UGFnZUxpbmVzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICBjb25zdCBzdGFydCA9ICh0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggLSAxKSAqIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgcmV0dXJuICh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdKS5zbGljZShzdGFydCwgZW5kKTtcbiAgfVxuXG4gIGlzTGluZUNoZWNrZWQobGluZTogRm9ybUdyb3VwKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgIHJldHVybiAhIWlkICYmIHRoaXMuc2VsZWN0ZWRSb3dJZHMuaGFzKGlkKTtcbiAgfVxuXG4gIGlzQWxsQ2hlY2tlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYWdlTGluZXMgPSB0aGlzLmdldEN1cnJlbnRQYWdlTGluZXMoKTtcbiAgICByZXR1cm4gKFxuICAgICAgcGFnZUxpbmVzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHBhZ2VMaW5lcy5ldmVyeSgobGluZSkgPT4gdGhpcy5pc0xpbmVDaGVja2VkKGxpbmUpKVxuICAgICk7XG4gIH1cblxuICBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFnZUxpbmVzID0gdGhpcy5nZXRDdXJyZW50UGFnZUxpbmVzKCk7XG4gICAgY29uc3QgY2hlY2tlZENvdW50ID0gcGFnZUxpbmVzLmZpbHRlcigobGluZSkgPT5cbiAgICAgIHRoaXMuaXNMaW5lQ2hlY2tlZChsaW5lKSxcbiAgICApLmxlbmd0aDtcbiAgICByZXR1cm4gY2hlY2tlZENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPCBwYWdlTGluZXMubGVuZ3RoO1xuICB9XG5cbiAgb25BbGxDaGVja2VkKGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmdldEN1cnJlbnRQYWdlTGluZXMoKS5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0Um93SWQobGluZSk7XG4gICAgICBpZiAoIWlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuYWRkKGlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZGVsZXRlKGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIG9uTGluZUNoZWNrZWRDaGFuZ2UobGluZTogRm9ybUdyb3VwLCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgIGlmICghaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuYWRkKGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd0lkcy5kZWxldGUoaWQpO1xuICAgIH1cbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuZ2V0U2VsZWN0ZWRMaW5lcygpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTGluZUZyb21TZWxlY3Rpb24obGluZTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgIGlmIChpZCAmJiB0aGlzLnNlbGVjdGVkUm93SWRzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZGVsZXRlKGlkKTtcbiAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlWYWx1ZXNUb0xpbmUoXG4gICAgbGluZTogRm9ybUdyb3VwLFxuICAgIHZhbHVlczogeyBbZmllbGQ6IHN0cmluZ106IGFueSB9LFxuICAgIGVtaXRFdmVudDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXModmFsdWVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGxldCBjb250cm9sID0gbGluZS5nZXQoa2V5KTtcbiAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICBsaW5lLmFkZENvbnRyb2woa2V5LCB0aGlzLmZiLmNvbnRyb2wodmFsdWVzW2tleV0pKTtcbiAgICAgICAgY29udHJvbCA9IGxpbmUuZ2V0KGtleSk7XG4gICAgICB9XG4gICAgICAvLyDpnZnpu5jotYvlgLzvvIzpgb/lhY0gdmFsdWVDaGFuZ2VzIC8gRE9NIG1heGxlbmd0aCDlm57lhpnmiormoKHpqozmgIHmiZPkubFcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWVzW2tleV0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgIGNvbnRyb2wubWFya0FzVW50b3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgICBjb25zdCBmb3JtSXRlbSA9IHRoaXMuZm9ybUxpbmVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0ga2V5KTtcbiAgICAgICAgaWYgKGZvcm1JdGVtICYmIGZvcm1JdGVtLm9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChmb3JtSXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZXNba2V5XSwgbGluZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICog5LuF5Zyo55So5oi35Lqk5LqS5ZCO44CB5LiU5b2T5YmN5YC856Gu5a6e5Li656m655qEIHJlcXVpcmVkIOmUmeivr+aXtuWxleekuue6ouahhu+8jFxuICAgKiDpgb/lhY3mibnph4/otYvlgLzml7Ygbmctem9ycm8g5q6L55WZ44CM5LiN6IO95Li656m644CN5o+Q56S6XG4gICAqL1xuICBnZXRDb250cm9sVmFsaWRhdGVTdGF0dXMobGluZTogRm9ybUdyb3VwLCBmb3JtSXRlbTogRm9ybUxpbmUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBsaW5lLmdldChmb3JtSXRlbS5uYW1lKTtcbiAgICBpZiAoIWNvbnRyb2wgfHwgY29udHJvbC5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IGVtcHR5ID1cbiAgICAgIGNvbnRyb2wudmFsdWUgPT09IG51bGwgfHxcbiAgICAgIGNvbnRyb2wudmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgY29udHJvbC52YWx1ZSA9PT0gXCJcIjtcbiAgICBpZiAoXG4gICAgICAoY29udHJvbC5kaXJ0eSB8fCBjb250cm9sLnRvdWNoZWQpICYmXG4gICAgICBlbXB0eSAmJlxuICAgICAgY29udHJvbC5oYXNFcnJvcihcInJlcXVpcmVkXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gXCJlcnJvclwiO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIC8qKiDnlKjmiLfovpPlhaXml7bmjIkgbWF4TGVuZ3RoIOaIquaWre+8iOS4jeS9v+eUqOWOn+eUnyBtYXhsZW5ndGjvvIzpgb/lhY3lubLmibDnqIvluo/ljJbotYvlgLzvvIkgKi9cbiAgbGltaXRJbnB1dExlbmd0aChldmVudDogRXZlbnQsIGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IEZvcm1MaW5lKTogdm9pZCB7XG4gICAgaWYgKCFmb3JtSXRlbSB8fCAhZm9ybUl0ZW0ubWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgaWYgKGlucHV0ICYmIGlucHV0LnZhbHVlICYmIGlucHV0LnZhbHVlLmxlbmd0aCA+IGZvcm1JdGVtLm1heExlbmd0aCkge1xuICAgICAgY29uc3QgbmV4dCA9IGlucHV0LnZhbHVlLnNsaWNlKDAsIGZvcm1JdGVtLm1heExlbmd0aCk7XG4gICAgICBpbnB1dC52YWx1ZSA9IG5leHQ7XG4gICAgICBjb25zdCBjb250cm9sID0gbGluZS5nZXQoZm9ybUl0ZW0ubmFtZSk7XG4gICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICBjb250cm9sLnNldFZhbHVlKG5leHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiDojrflj5blvZPliY3li77pgInkuJTlt7LmjILovb3nmoTooYwgRm9ybUdyb3Vw77yI5b2T5YmN562b6YCJ57uT5p6c5YaF77yJICovXG4gIHB1YmxpYyBnZXRTZWxlY3RlZExpbmVzKCk6IEZvcm1Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMgYXMgRm9ybUdyb3VwW10pLmZpbHRlcigobGluZSkgPT5cbiAgICAgIHRoaXMuaXNMaW5lQ2hlY2tlZChsaW5lKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWFqOmDqOWLvumAieihjOaVsOaNru+8iOWQq+i3qOmhteOAgeaQnOe0ouWQjuacquWxleekuuS9huS7jeWLvumAieeahOihjO+8iVxuICAgKi9cbiAgcHVibGljIGdldFNlbGVjdGVkTGluZXNEYXRhKCk6IGFueVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBtb3VudGVkQnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMgYXMgRm9ybUdyb3VwW10pLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChsaW5lKTtcbiAgICAgIGlmIChpZCAmJiB0aGlzLnNlbGVjdGVkUm93SWRzLmhhcyhpZCkpIHtcbiAgICAgICAgbW91bnRlZEJ5SWQuc2V0KGlkLCBsaW5lLmdldFJhd1ZhbHVlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgKHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhIHx8IFtdKS5mb3JFYWNoKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IGRhdGEgJiYgZGF0YS5faGRSb3dJZDtcbiAgICAgIGlmIChpZCAmJiB0aGlzLnNlbGVjdGVkUm93SWRzLmhhcyhpZCkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobW91bnRlZEJ5SWQuaGFzKGlkKSA/IG1vdW50ZWRCeUlkLmdldChpZCkgOiB7IC4uLmRhdGEgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDlhZzlupXvvJrliJrmlrDlop7jgIHlsJrmnKrov5sgc3RvcmUg55qE5Yu+6YCJ6KGMXG4gICAgdGhpcy5zZWxlY3RlZFJvd0lkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhcmVzdWx0LnNvbWUoKGl0ZW0pID0+IGl0ZW0gJiYgaXRlbS5faGRSb3dJZCA9PT0gaWQpICYmXG4gICAgICAgIG1vdW50ZWRCeUlkLmhhcyhpZClcbiAgICAgICkge1xuICAgICAgICByZXN1bHQucHVzaChtb3VudGVkQnlJZC5nZXQoaWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIOaJuemHj+Whq+WFheWLvumAieihjOWtl+aute+8iOaUr+aMgei3qOmhteOAgeaQnOe0ouWQjuacquWxleekuuS9huS7jeWLvumAieeahOihjO+8iVxuICAgKiBAcGFyYW0gdmFsdWVzIOimgeWGmeWFpeeahOWtl+aute+8jOWmgiB7IHJlbWFyazogJ+aJuemHj+Wkh+azqCcsIHByaWNlOiAxMCB9XG4gICAqIEBwYXJhbSBlbWl0RXZlbnQg5piv5ZCm6Kem5Y+RIHZhbHVlQ2hhbmdlcyAvIG9uQ2hhbmdlRXZlbnTvvIzpu5jorqQgdHJ1ZVxuICAgKiBAcmV0dXJucyDlrp7pmYXloavlhYXnmoTooYzmlbBcbiAgICovXG4gIHB1YmxpYyBiYXRjaEZpbGxTZWxlY3RlZChcbiAgICB2YWx1ZXM6IHsgW2ZpZWxkOiBzdHJpbmddOiBhbnkgfSxcbiAgICBlbWl0RXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBudW1iZXIge1xuICAgIGlmICghdmFsdWVzIHx8IHRoaXMuc2VsZWN0ZWRSb3dJZHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IG1vdW50ZWRCeUlkID0gbmV3IE1hcDxzdHJpbmcsIEZvcm1Hcm91cD4oKTtcbiAgICAodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scyBhcyBGb3JtR3JvdXBbXSkuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGxpbmUpO1xuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIG1vdW50ZWRCeUlkLnNldChpZCwgbGluZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgY291bnQgPSAwO1xuICAgIHRoaXMuc2VsZWN0ZWRSb3dJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgIGNvbnN0IGxpbmUgPSBtb3VudGVkQnlJZC5nZXQoaWQpO1xuICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgdGhpcy5hcHBseVZhbHVlc1RvTGluZShsaW5lLCB2YWx1ZXMsIGVtaXRFdmVudCk7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIOW9k+WJjeetm+mAiS/pobXpnaLmnKrmjILovb3vvJrnm7TmjqXmlLnmgLvmlbDmja7vvIzpgIDlh7rmkJzntKLlkI7lj6/op4FcbiAgICAgIGNvbnN0IHN0b3JlSXRlbSA9ICh0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSB8fCBbXSkuZmluZChcbiAgICAgICAgKGRhdGEpID0+IGRhdGEgJiYgZGF0YS5faGRSb3dJZCA9PT0gaWQsXG4gICAgICApO1xuICAgICAgaWYgKHN0b3JlSXRlbSkge1xuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIHN0b3JlSXRlbVtrZXldID0gdmFsdWVzW2tleV07XG4gICAgICAgIH0pO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKiDmuIXnqbrli77pgIkgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkUm93SWRzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFJvd0lkcy5jbGVhcigpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqIOW9k+WJjeWLvumAieaVsOmHj++8iOWQq+i3qOmhteOAgeaQnOe0ouS/neeVme+8iSAqL1xuICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUm93SWRzLnNpemU7XG4gIH1cblxuICAvKiog5piv5ZCm5bGV56S66aG26YOo5bel5YW35qCPICovXG4gIGdldCBzaG93VG9vbGJhcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLnNob3dTZWFyY2ggfHxcbiAgICAgICEhdGhpcy5zaG93Q2hlY2tib3ggfHxcbiAgICAgICEhdGhpcy5mb3JtTGluZXNMZWZ0QnV0dG9uIHx8XG4gICAgICAhIXRoaXMuZm9ybUxpbmVzUmlnaHRCdXR0b24gfHxcbiAgICAgIHRoaXMuc2hvd0NvbFNldHRpbmdzQnV0dG9uXG4gICAgKTtcbiAgfVxuXG4gIC8qKiDmmK/lkKblsZXnpLrliJforr7nva7pvb/ova7vvIjmnInlj6/phY3nva4gVmlld0RvbSDml7bvvIkgKi9cbiAgZ2V0IHNob3dDb2xTZXR0aW5nc0J1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLnNob3dDb2xTZXR0aW5ncyAmJiB0aGlzLmdldENvbmZpZ3VyYWJsZUZvcm1MaW5lcygpLmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgLyoqIOWIl+aYr+WQpua4suafk++8mmhpZGUg5rC45LiN5bGV56S677ybVmlld0RvbSDlj5cgaXNTaG93IOaOp+WItiAqL1xuICBpc0NvbHVtblZpc2libGUoaXRlbTogRm9ybUxpbmUpOiBib29sZWFuIHtcbiAgICBpZiAoIWl0ZW0gfHwgaXRlbS5oaWRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgPT09IEZvcm1MaW5lVHlwZS5WaWV3RG9tKSB7XG4gICAgICByZXR1cm4gaXRlbS5pc1Nob3cgIT09IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiDlj6/ov5vlhaXliJforr7nva7nmoTlrZfmrrXvvJrpnZ4gaGlkZSDnmoQgVmlld0RvbSAqL1xuICBnZXRDb25maWd1cmFibGVGb3JtTGluZXMoKTogRm9ybUxpbmVbXSB7XG4gICAgaWYgKCF0aGlzLmZvcm1MaW5lcyB8fCAhdGhpcy5mb3JtTGluZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcm1MaW5lcy5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50eXBlID09PSBGb3JtTGluZVR5cGUuVmlld0RvbSAmJiAhaXRlbS5oaWRlLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldENhY2hlS2V5KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdXNlckNvZGUgPVxuICAgICAgKHRoaXMudXNlclNlc3Npb24gJiYgdGhpcy51c2VyU2Vzc2lvbi51c2VyQ29kZSkgfHwgXCJkZXZcIjtcbiAgICByZXR1cm4gKFxuICAgICAgXCJoZC1mb3JtLWxpbmVzX1wiICtcbiAgICAgIHVzZXJDb2RlICtcbiAgICAgIFwiX1wiICtcbiAgICAgIHRoaXMubG9jYWx0aW9uVG1wICtcbiAgICAgIFwiX1wiICtcbiAgICAgIHRoaXMudXVpZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRDb2xTZXR0aW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHNDYWNoZUxvYWRlZCA9IGZhbHNlO1xuICAgIGlmICghdGhpcy5zaG93Q29sU2V0dGluZ3MgfHwgIXRoaXMuZm9ybUxpbmVzIHx8ICF0aGlzLmZvcm1MaW5lcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2V0Q29scygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudXVpZCkge1xuICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgIC5yZWFkeSgpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgICAgICAuZ2V0SXRlbSh0aGlzLmdldENhY2hlS2V5KCkpXG4gICAgICAgICAgLnRoZW4oKHZhbHVlOiBGb3JtTGluZXNDYWNoZU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUuY29scykpIHtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtTGluZXNDYWNoZU9wdGlvbiA9IHZhbHVlO1xuICAgICAgICAgICAgICB0aGlzLmNvbHNDYWNoZUxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uID0gbmV3IEZvcm1MaW5lc0NhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgICAgIHRoaXMuY29sc0NhY2hlTG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldENvbHMoKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uID0gbmV3IEZvcm1MaW5lc0NhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmNvbHNDYWNoZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhcIiwgZSk7XG4gICAgICAgIHRoaXMuZm9ybUxpbmVzQ2FjaGVPcHRpb24gPSBuZXcgRm9ybUxpbmVzQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgdGhpcy5jb2xzQ2FjaGVMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQ29sc0NhY2hlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbHNDYWNoZUxvYWRlZCAmJiBBcnJheS5pc0FycmF5KHRoaXMuZm9ybUxpbmVzQ2FjaGVPcHRpb24uY29scyk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVGb3JtTGluZXNDYWNoZU9wdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXVpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvY2FsZm9yYWdlLnNldEl0ZW0odGhpcy5nZXRDYWNoZUtleSgpLCB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uKTtcbiAgfVxuXG4gIC8qKiDmjIkgZm9ybUxpbmVzIOWOn+Wni+mhuuW6j+aOkuWIl+iKgueCue+8iOemgeatouiwg+W6j+aXtuS/neaMgea6kOmhuuW6j++8iSAqL1xuICBwcml2YXRlIHNvcnROb2Rlc0J5Rm9ybUxpbmVzT3JkZXIobm9kZXM6IFRyZWVHcmlkW10pOiBUcmVlR3JpZFtdIHtcbiAgICBjb25zdCBvcmRlciA9IHRoaXMuZ2V0Q29uZmlndXJhYmxlRm9ybUxpbmVzKCkubWFwKChmKSA9PiBmLm5hbWUpO1xuICAgIHJldHVybiBub2Rlcy5zbGljZSgpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIHJldHVybiBvcmRlci5pbmRleE9mKGEua2V5KSAtIG9yZGVyLmluZGV4T2YoYi5rZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0Q29scygpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dMaXN0Tm9kZXMgPSBmYWxzZTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IFtdO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IFtdO1xuICAgIGNvbnN0IGNvbmZpZ3VyYWJsZSA9IHRoaXMuZ2V0Q29uZmlndXJhYmxlRm9ybUxpbmVzKCk7XG4gICAgY29uc3QgaGFzQ2FjaGUgPSB0aGlzLmhhc0NvbHNDYWNoZSgpO1xuICAgIGNvbmZpZ3VyYWJsZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoaGFzQ2FjaGUpIHtcbiAgICAgICAgZWxlbWVudC5pc1Nob3cgPSB0aGlzLmZvcm1MaW5lc0NhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoZWxlbWVudC5uYW1lKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc1Nob3cgPT09IHVuZGVmaW5lZCB8fCBlbGVtZW50LmlzU2hvdyA9PT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50LmlzU2hvdyA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBub2RlOiBUcmVlR3JpZCA9IHtcbiAgICAgICAgdGl0bGU6IGVsZW1lbnQubGFiZWwsXG4gICAgICAgIGtleTogZWxlbWVudC5uYW1lLFxuICAgICAgICBjaGVja2VkOiBlbGVtZW50LmlzU2hvdyAhPT0gZmFsc2UsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBpZiAoZWxlbWVudC5pc1Nob3cgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubm93TGlzdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRoaXMuc29ydE5vZGVzQnlGb3JtTGluZXNPcmRlcih0aGlzLm5vd0xpc3ROb2Rlcyk7XG4gICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gdGhpcy5zb3J0Tm9kZXNCeUZvcm1MaW5lc09yZGVyKHRoaXMuaGlkZUxpc3ROb2Rlcyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNob3dMaXN0Tm9kZXMgPSB0cnVlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBjYW5jZWxEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNhbmNlbEhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jYW5jZWxOb3dMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNvbmZpcm1Ecm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbEhpZGVMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuaGlkZUxpc3ROb2RlcykpO1xuICAgIHRoaXMuY2FuY2VsTm93TGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm5vd0xpc3ROb2RlcykpO1xuICAgIHRoaXMuaXNEcm9wZG93blZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgc3VibWl0R3JpZHMoKTogdm9pZCB7XG4gICAgY29uc3QgdmlzaWJsZU5hbWVzID0gdGhpcy5ub3dMaXN0Tm9kZXMubWFwKChpdGVtKSA9PiBpdGVtLmtleSk7XG4gICAgdGhpcy5nZXRDb25maWd1cmFibGVGb3JtTGluZXMoKS5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICBsaW5lLmlzU2hvdyA9IHZpc2libGVOYW1lcy5pbmNsdWRlcyhsaW5lLm5hbWUpO1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybUxpbmVzQ2FjaGVPcHRpb24uY29scyA9IHZpc2libGVOYW1lcztcbiAgICB0aGlzLmNvbHNDYWNoZUxvYWRlZCA9IHRydWU7XG4gICAgdGhpcy5zYXZlRm9ybUxpbmVzQ2FjaGVPcHRpb24oKTtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiog5Yu+6YCJL+WPlua2iO+8muS7heWcqOaYvuekui/pmpDol4/kuKTnu4Tpl7Tnp7vliqjvvIzkuI3mlLnlj5ggZm9ybUxpbmVzIOmhuuW6jyAqL1xuICBjaGVja0FjdGlvbihldmVudDogTnpGb3JtYXRFbWl0RXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQubm9kZS5vcmlnaW4uY2hlY2tlZCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLmtleSA9PT0gZXZlbnQubm9kZS5vcmlnaW4ua2V5O1xuICAgICAgfSk7XG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbm9kZS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ua2V5ICE9PSBldmVudC5ub2RlLm9yaWdpbi5rZXk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzID0gdGhpcy5zb3J0Tm9kZXNCeUZvcm1MaW5lc09yZGVyKFxuICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5jb25jYXQoW25vZGVdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeU5vZGVMaXN0ID0gdGhpcy5oaWRlTGlzdE5vZGVzLnNsaWNlKDApO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5rZXkgPT09IGV2ZW50Lm5vZGUub3JpZ2luLmtleSkge1xuICAgICAgICAgIGNvbnN0IGlubmVySXRlbSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaXRlbSkpO1xuICAgICAgICAgIGlubmVySXRlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3QucHVzaChpbm5lckl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRoaXMuc29ydE5vZGVzQnlGb3JtTGluZXNPcmRlcih0ZW1wb3JhcnlOb2RlTGlzdCk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRoaXMubm93TGlzdE5vZGVzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5rZXkgIT09IGV2ZW50Lm5vZGUub3JpZ2luLmtleTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZG9tTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgXCIuYW50LXNlbGVjdC1kcm9wZG93bi5oZC1zZWxlY3QtdGFibGVcIixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRvbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRvbSA9IGRvbUxpc3RbMF07XG4gICAgICAgICAgZG9tXG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbChcIi5oZC1vcHRpb24taGVhZGVyXCIpXG4gICAgICAgICAgICAuZm9yRWFjaCgoaGVhZGVyKSA9PiBoZWFkZXIucmVtb3ZlKCkpO1xuICAgICAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy5nZXRPbGREb21JbmRleCh0aGlzLmFjdGl2ZURvbVksIHRoaXMuZm9ybUxpbmVzKTtcbiAgICAgICAgICBkb20uaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVET01TdHJ1Y3R1cmUoXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUxpbmVzW29sZEluZGV4XSxcbiAgICAgICAgICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5zbGljZShcbiAgICAgICAgICAgICAgICAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSxcbiAgICAgICAgICAgICAgICAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSArXG4gICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSxcbiAgICAgICAgICAgICAgKVt0aGlzLmFjdGl2ZURvbVhdLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRvbS5maXJzdENoaWxkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdFRhYmxlQ29sdW1uU3R5bGUoY29sdW1uOiBTZWxlY3RPcHRpb25UYWJsZUNvbHVtbik6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gIH0ge1xuICAgIGlmICghY29sdW1uIHx8ICFjb2x1bW4ud2lkdGgpIHtcbiAgICAgIHJldHVybiB7IHdpZHRoOiBcInVuc2V0XCIgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgd2lkdGg6IGAke2NvbHVtbi53aWR0aH1weGAgfTtcbiAgfVxuXG4gIGNyZWF0ZURPTVN0cnVjdHVyZShmb3JtSXRlbSwgbGluZSkge1xuICAgIC8vIOWIm+W7uuWklumDqCBkaXZcbiAgICBjb25zdCBoZE9wdGlvbkhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaGRPcHRpb25IZWFkZXIuY2xhc3NOYW1lID0gXCJoZC1vcHRpb24taGVhZGVyXCI7XG4gICAgaGRPcHRpb25IZWFkZXIuc3R5bGUucGFkZGluZ0xlZnQgPSBgJHtTRUxFQ1RfVEFCTEVfT1BUSU9OX0hPUklaT05UQUxfUEFERElOR31weGA7XG4gICAgaGRPcHRpb25IZWFkZXIuc3R5bGUucGFkZGluZ1JpZ2h0ID0gYCR7U0VMRUNUX1RBQkxFX09QVElPTl9IT1JJWk9OVEFMX1BBRERJTkd9cHhgO1xuXG4gICAgLy8g5qOA5p+l5p2h5Lu277yM56Gu5a6a5piv5ZCm6KaB5Yib5bu65a2Q5YWD57SgXG4gICAgLy8gY29uc3Qgc2VsZWN0TGlzdExlbmd0aCA9IChmb3JtSXRlbSAmJiBmb3JtSXRlbS5zZWxlY3RPcHRpb24gJiYgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3QgJiYgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3QubGVuZ3RoKSB8fCAwO1xuICAgIC8vIGlmXG4gICAgLy8gY29uc3QgbGluZVZhbHVlTGVuZ3RoID0gKGxpbmUuZ2V0KGZvcm1JdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0TmFtZSkgJiYgbGluZS5nZXQoZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3ROYW1lKS52YWx1ZSAmJiBsaW5lLmdldChmb3JtSXRlbS5zZWxlY3RPcHRpb24uc2VsZWN0TGlzdE5hbWUpLnZhbHVlLmxlbmd0aCkgfHwgMDtcblxuICAgIC8vIGlmIChzZWxlY3RMaXN0TGVuZ3RoID4gMCB8fCBsaW5lVmFsdWVMZW5ndGggPiAwKSB7XG4gICAgLy8g6YGN5Y6GIHRhYmxlQ29sdW1ucyDliJvlu7rlhoXpg6jliJcgZGl2XG4gICAgZm9ybUl0ZW0uc2VsZWN0T3B0aW9uLnRhYmxlQ29sdW1ucy5mb3JFYWNoKChzZWxlY3RPcHRpb25UYWJsZUNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgY29sdW1uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNvbHVtbkRpdi5jbGFzc05hbWUgPSBcImhkLW9wdGlvbi1oZWFkZXItY29sdW1uXCI7XG5cbiAgICAgIGNvbnN0IHdpZHRoU3R5bGUgPSB0aGlzLmdldFNlbGVjdFRhYmxlQ29sdW1uU3R5bGUoXG4gICAgICAgIHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLFxuICAgICAgKTtcbiAgICAgIGNvbHVtbkRpdi5zdHlsZS53aWR0aCA9IHdpZHRoU3R5bGUud2lkdGg7XG5cbiAgICAgIC8vIOa3u+WKoOWIl+agh+etvuWGheWuuVxuICAgICAgaWYgKHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLmxhYmVsKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxuICAgICAgICAgIHNlbGVjdE9wdGlvblRhYmxlQ29sdW1uLmxhYmVsLFxuICAgICAgICApO1xuICAgICAgICBjb2x1bW5EaXYuYXBwZW5kQ2hpbGQobGFiZWxUZXh0KTtcbiAgICAgIH1cblxuICAgICAgLy8g5re75Yqg5YiXIGRpdiDliLDlpJbpg6ggZGl2XG4gICAgICBoZE9wdGlvbkhlYWRlci5hcHBlbmRDaGlsZChjb2x1bW5EaXYpO1xuICAgIH0pO1xuICAgIC8vIH1cblxuICAgIHJldHVybiBoZE9wdGlvbkhlYWRlcjtcbiAgfVxuXG4gIGNvbGxlY3REb21EYXRhKCkge1xuICAgIHRoaXMuY29sbGVjdERvbUxpc3QgPSBbXTtcbiAgICBjb25zdCBwYWdlRG9tTGlzdCA9IHRoaXMuZm9ybUlucHV0RG9tTGlzdC50b0FycmF5KCk7XG4gICAgLy8gU3RlcCAxOiDojrflj5blvZPliY3pobXnmoTmlbDmja7ph49cbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAtIDEpICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICBjb25zdCBhZGp1c3RlZEVuZEluZGV4ID1cbiAgICAgIGVuZEluZGV4ID4gdGhpcy5mb3JtTGluZXNMZW5ndGggPyB0aGlzLmZvcm1MaW5lc0xlbmd0aCA6IGVuZEluZGV4O1xuICAgIGNvbnN0IHBhZ2VMaW5lc0xlbmd0aCA9IGFkanVzdGVkRW5kSW5kZXggLSBzdGFydEluZGV4O1xuXG4gICAgY29uc3QgaW50ZXJ2YWwgPSBwYWdlRG9tTGlzdC5sZW5ndGggLyBwYWdlTGluZXNMZW5ndGg7XG4gICAgLy8gU3RlcCAyOiDmi4bliIZmb3JtSW5wdXREb21MaXN0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlTGluZXNMZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5wdXNoKHBhZ2VEb21MaXN0LnNwbGljZSgwLCBpbnRlcnZhbCkpO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVJbnB1dE51bWJlcktleWJvYXJkU3RlcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIG5nLXpvcnJvIDgg5ZyoIGlucHV0IOeahCBvbktleURvd24g6YeM55So5LiK5LiL6ZSu6LCDIHVwKCkvZG93bigpIOaUuSBzdGVw44CCXG4gICAqIOWPquimhuebliBvbktleURvd27vvIjkuI3liqggdXAvZG93bu+8ie+8jOmUruebmOaWueWQkemUruS6pOe7meihqOWNlei3s+i9rO+8jCsvLSDmjInpkq7ku43lj6/nlKjjgIJcbiAgICovXG4gIHByaXZhdGUgZGlzYWJsZUlucHV0TnVtYmVyS2V5Ym9hcmRTdGVwKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVLZXlib2FyZE9wZXJhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sbGVjdERvbUxpc3RbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3QgZG9tID0gdGhpcy5jb2xsZWN0RG9tTGlzdFtpXVtqXTtcbiAgICAgICAgaWYgKGRvbSBpbnN0YW5jZW9mIE56SW5wdXROdW1iZXJDb21wb25lbnQpIHtcbiAgICAgICAgICBkb20ub25LZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDM4IHx8IGUua2V5Q29kZSA9PT0gNDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgZG9tLnNldFZhbGlkYXRlVmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g6IGa54Sm5LiL5LiA5LiqZG9tXG4gIGp1bXBUb05leHRJbnB1dCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGlmIChcbiAgICAgIHggPT09IG51bGwgfHxcbiAgICAgIHkgPT09IG51bGwgfHxcbiAgICAgICF0aGlzLmNvbGxlY3REb21MaXN0IHx8XG4gICAgICB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDlpoLmnpzmmK/mnIDlkI7kuIDkuKrlj6/ovpPlhaXlhYPntKDvvIzmlrDlop7ooYxcbiAgICBpZiAoXG4gICAgICAhKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQpICYmXG4gICAgICB4ID09PSB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCAtIDEgJiZcbiAgICAgIHkgPT09IHRoaXMuY29sbGVjdERvbUxpc3RbMF0ubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgdGhpcy5hZGROZXdMaW5lQW5kRm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHkgPT09IHRoaXMuY29sbGVjdERvbUxpc3RbMF0ubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizFcIik7XG4gICAgICAgIC8vIOWmguaenOaYr+acgOWQjuS4gOWIl++8jOWImei3s+i9rOWIsOS4i+S4gOihjOesrOS4gOS4qui+k+WFpeahhlxuICAgICAgICB0aGlzLmZvY3VzRG9tKHggKyAxLCAwLCBcInJpZ2h0XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIsyXCIpO1xuICAgICAgICAvLyDlpoLmnpzkuI3mmK/mnIDlkI7kuIDliJfvvIzliJnot7PovazliLDlvZPliY3ooYzkuIvkuIDkuKrovpPlhaXmoYZcbiAgICAgICAgdGhpcy5mb2N1c0RvbSh4LCB5ICsgMSwgXCJyaWdodFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5aKe5Yqg5paw6KGM5bm25LiU6IGa54Sm5Yiw56ys5LiA5Liq5YWD57Sg77yMXG4gICAqIOi/memHjOimgeazqOaEj++8jOWmguaenOWtmOWcqOe/u+mhteaDheWGte+8jOmcgOimgeWkhOeQhlxuICAgKi9cbiAgYWRkTmV3TGluZUFuZEZvY3VzKCkge1xuICAgIC8vIOW9k+WJjeihjOS4uuW9k+WJjemhteacgOWQjuS4gOihjOeahOaXtuWAme+8jOWIpOaWreS4i+S4gOmhteaYr+WQpuacieaVsOaNrlxuICAgIC8vIDHjgIHlpoLmnpzmnInvvJrnv7vpobUr6IGa54Sm56ys5LiA6KGM56ys5LiA5Liq5YWD57SgXG4gICAgLy8gMuOAgeWmguaenOayoeacie+8muaWsOWinuihjCvnv7vpobUr6IGa54Sm56ys5LiA6KGM56ys5LiA5Liq5YWD57SgXG4gICAgaWYgKHRoaXMuYWN0aXZlRG9tWCA9PT0gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUgLSAxKSB7XG4gICAgICAvLyDliKTmlq3kuIvkuIDpobXmmK/lkKbmnInmlbDmja5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IDxcbiAgICAgICAgTWF0aC5jZWlsKHRoaXMuZm9ybUxpbmVzTGVuZ3RoIC8gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUpXG4gICAgICApIHtcbiAgICAgICAgLy8g57+76aG1K+iBmueEpuesrOS4gOihjOesrOS4gOS4quWFg+e0oFxuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXgrKztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLM1wiKTtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKDAsIDAsIFwicmlnaHRcIik7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5paw5aKe6KGMK+e/u+mhtSvogZrnhKbnrKzkuIDooYznrKzkuIDkuKrlhYPntKBcbiAgICAgICAgdGhpcy5hZGRGb3JtTGluZSgpO1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXgrKztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb2xsZWN0RG9tRGF0YSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLNFwiKTtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKDAsIDApO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRGb3JtTGluZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOiBmueEpuWIsOS4iuS4gOS4qmRvbVxuICBqdW1wVG9QcmV2SW5wdXQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB4ID09PSBudWxsIHx8XG4gICAgICB5ID09PSBudWxsIHx8XG4gICAgICAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fFxuICAgICAgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHggPT09IDAgJiYgeSA9PT0gMCkge1xuICAgICAgLy8g5aaC5p6c5piv56ys5LiA5Liq5Y+v6L6T5YWl5YWD57Sg77yMIOWIpOaWreaYr+WQpuacieS4iuS4gOmhte+8jCDlpoLmnpzmnInvvIzliJnnv7vpobUr6IGa54Sm5Yiw5LiK5LiA6aG15pyA5ZCO5LiA5Liq5YWD57SgXG4gICAgICBpZiAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID4gMSkge1xuICAgICAgICAvLyDnv7vpobUr6IGa54Sm5Yiw5LiK5LiA6aG15pyA5ZCO5LiA5Liq5YWD57SgXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleC0tO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIs1XCIpO1xuICAgICAgICAgIHRoaXMuZm9jdXNEb20oXG4gICAgICAgICAgICB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgICB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh5ID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omn6KGM6L+H56iLNlwiKTtcbiAgICAgICAgLy8g5aaC5p6c5piv56ys5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5LiK5LiA6KGM5pyA5ZCO5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCAtIDEsIHRoaXMuY29sbGVjdERvbUxpc3RbMF0ubGVuZ3RoIC0gMSwgXCJsZWZ0XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLmiafooYzov4fnqIs3XCIpO1xuICAgICAgICAvLyDlpoLmnpzkuI3mmK/nrKzkuIDliJfvvIzliJnot7PovazliLDlvZPliY3ooYzkuIrkuIDkuKrovpPlhaXmoYZcbiAgICAgICAgdGhpcy5mb2N1c0RvbSh4LCB5IC0gMSwgXCJsZWZ0XCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDogZrnhKbliLDmn5DkuKpkb21cbiAgICogQHBhcmFtIHgg5Z2Q5qCHeFxuICAgKiBAcGFyYW0geSDlnZDmoId5XG4gICAqIEBwYXJhbSBqdW1wRGlyZWN0aW9uIOi3s+i9rOaWueWQkVxuICAgKi9cbiAgZm9jdXNEb20oeDogbnVtYmVyLCB5OiBudW1iZXIsIGp1bXBEaXJlY3Rpb246IHN0cmluZyA9IFwicmlnaHRcIikge1xuICAgIGlmIChcbiAgICAgIHggPT09IG51bGwgfHxcbiAgICAgIHkgPT09IG51bGwgfHxcbiAgICAgICF0aGlzLmNvbGxlY3REb21MaXN0IHx8XG4gICAgICB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDlhYjmuIXpmaTkuIDkuIvlvZPliY3nmoTnhKbngrlcbiAgICB0aGlzLmNsZWFuRm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgIGlmICh0aGlzLmNvbGxlY3REb21MaXN0W3hdICYmIHRoaXMuY29sbGVjdERvbUxpc3RbeF1beV0pIHtcbiAgICAgIGNvbnN0IGRvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbeF1beV07XG4gICAgICAvLyDpnIDopoHliKTmlq3kuIvkuIDkuKpmb2N1c+eahGRvbeaYr+WQpuaYr+emgeeUqOeKtuaAge+8jOWmguaenOaYr+emgeeUqOeKtuaAgemcgOimgei3s+i/h1xuICAgICAgaWYgKGRvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgIGlmIChkb20ubnpEaXNhYmxlZCkge1xuICAgICAgICAgIGlmIChqdW1wRGlyZWN0aW9uID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHgsIHkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuanVtcFRvUHJldklucHV0KHgsIHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZG9tLm56U2VsZWN0VG9wQ29udHJvbENvbXBvbmVudC5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyhcbiAgICAgICAgICB7IGJlaGF2aW9yOiBcInNtb290aFwiLCBibG9jazogXCJjZW50ZXJcIiwgaW5saW5lOiBcImNlbnRlclwiIH0sXG4gICAgICAgICk7XG4gICAgICAgIC8vIOi/memHjOWkmumAieahhumcgOimgemineWkluWkhOeQhuS4i++8jOWboOS4uuWQkeS4i+eahOaXtuWAmeS8muinpuWPkeWGhemDqElucHV055qE6IGa54Sm77yM5oqK5LiL5LiA5LiqZG9t55qEZm9jdXPmlL7liLDlro/ku7vliqHkuK3vvIzlu7bov5/lpITnkIbjgIJcbiAgICAgICAgaWYgKGRvbS5uelNlbGVjdFNlcnZpY2UubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBkb20uZm9jdXMoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb20uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkb20gaW5zdGFuY2VvZiBOeklucHV0TnVtYmVyQ29tcG9uZW50KSB7XG4gICAgICAgIGlmIChkb20ubnpEaXNhYmxlZCkge1xuICAgICAgICAgIGlmIChqdW1wRGlyZWN0aW9uID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHgsIHkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuanVtcFRvUHJldklucHV0KHgsIHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXREb206IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbS5ueklkKTtcbiAgICAgICAgaW5wdXREb20uZm9jdXMoKTtcbiAgICAgICAgaW5wdXREb20uc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgIGJlaGF2aW9yOiBcInNtb290aFwiLFxuICAgICAgICAgIGJsb2NrOiBcImNlbnRlclwiLFxuICAgICAgICAgIGlubGluZTogXCJjZW50ZXJcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlucHV0RG9tLnNlbGVjdCgpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoZG9tLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQpIHtcbiAgICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRvbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGRvbS5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgICBiZWhhdmlvcjogXCJzbW9vdGhcIixcbiAgICAgICAgICBibG9jazogXCJjZW50ZXJcIixcbiAgICAgICAgICBpbmxpbmU6IFwiY2VudGVyXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBkb20gaW5zdGFuY2VvZiBOekRhdGVQaWNrZXJDb21wb25lbnQgfHxcbiAgICAgICAgZG9tIGluc3RhbmNlb2YgTnpSYW5nZVBpY2tlckNvbXBvbmVudCB8fFxuICAgICAgICBkb20gaW5zdGFuY2VvZiBOelRpbWVQaWNrZXJDb21wb25lbnRcbiAgICAgICkge1xuICAgICAgICAvLyBUT0RPOuWcqG5nem9ycm84LjUueOeJiOacrO+8jOaXtumXtOebuOWFs+eahOmAieaLqeWZqOayoeacieaatOmcsuWHum9wZW7mlrnms5XvvIzmmoLml7blhYjkuI3lpITnkIbjgILvvIgxMC545Y+K5Lul5LiK54mI5pys5o+Q5L6b5LqGb3BlbuaWueazle+8iVxuICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQoeCwgeSk7XG4gICAgICAgIH0gZWxzZSBpZiAoanVtcERpcmVjdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNldEFjdGl2ZURvbSh4LCB5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g5rKh5pyJZG9t55qE5Zy65pmv5LiL77yM6ZyA6KaB5Yik5pat5piv5bem6L+Y5piv5Y+z77yMXG4gICAgfVxuICB9XG5cbiAgY2xlYW5Gb2N1c0RvbSh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGlmIChcbiAgICAgIHggPT09IG51bGwgfHxcbiAgICAgIHkgPT09IG51bGwgfHxcbiAgICAgICF0aGlzLmNvbGxlY3REb21MaXN0IHx8XG4gICAgICB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb2xsZWN0RG9tTGlzdFt4XSAmJiB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldKSB7XG4gICAgICBjb25zdCBkb20gPSB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldO1xuICAgICAgaWYgKGRvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgIGRvbS5ibHVyKCk7XG4gICAgICAgIGRvbS5uek9wZW4gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgTnpJbnB1dE51bWJlckNvbXBvbmVudCkge1xuICAgICAgICBkb20uYmx1cigpO1xuICAgICAgfSBlbHNlIGlmIChkb20gaW5zdGFuY2VvZiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGRvbS5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0QWN0aXZlRG9tKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgdGhpcy5hY3RpdmVEb21YID0geDtcbiAgICB0aGlzLmFjdGl2ZURvbVkgPSB5O1xuICAgIHRoaXMuYWN0aXZlRG9tID0gdGhpcy5jb2xsZWN0RG9tTGlzdFt0aGlzLmFjdGl2ZURvbVhdW3RoaXMuYWN0aXZlRG9tWV07XG4gICAgaWYgKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuKHRoaXMuYWN0aXZlRG9tLm9wZW4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7ooYzlj7flkozliJflj7flkI3np7Dojrflj5blvZPliY3ogZrnhKbnmoRkb23kvY3nva5cbiAgICogQHBhcmFtIHJvd051bWJlciDooYzlj7dcbiAgICogQHBhcmFtIGNvbE51bWJlciDliJflj7dcbiAgICovXG4gIHNldEFjdGl2ZURvbUluRm9ybUxpbmVzKHJvd051bWJlcjogbnVtYmVyLCBjb2xOdW1iZXI6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlRG9tWCA9IHJvd051bWJlcjtcbiAgICB0aGlzLmFjdGl2ZURvbVkgPSB0aGlzLmdldERvbUluZGV4KGNvbE51bWJlciwgdGhpcy5mb3JtTGluZXMpO1xuICAgIHRoaXMuc2V0QWN0aXZlRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDplK7nm5jngrnlh7vkuovku7ZcbiAgICogQHBhcmFtIGV2ZW50IOmUruebmOS6i+S7tlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUtleWJvYXJkT3BlcmF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5hY3RpdmVEb21YID09PSBudWxsIHx8IHRoaXMuYWN0aXZlRG9tWSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSBcIkFycm93VXBcIjpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQgJiZcbiAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlblxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tWCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YIC0gMSwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQgJiZcbiAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlblxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5Yik5pat5piv5ZCm5Zyo5pyA5ZCO5LiA6KGM77yM5Yqg6KGMXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURvbVggPT09IHRoaXMuY29sbGVjdERvbUxpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHRoaXMuY2xlYW5Gb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgICAgdGhpcy5hZGROZXdMaW5lQW5kRm9jdXMoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCArIDEsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgIHRoaXMuanVtcFRvUHJldklucHV0KHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQXJyb3dSaWdodFwiOlxuICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkVudGVyXCI6XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4odGhpcy5hY3RpdmVEb20ub3Blbik7XG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRG9tWCA9PT0gdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdGhpcy5hZGROZXdMaW5lQW5kRm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJFc2NhcGVcIjpcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQpIHtcbiAgICAgICAgICBjb25zdCBub3dBY3RpdmVEb20gPSB0aGlzLmFjdGl2ZURvbSBhcyBOelNlbGVjdENvbXBvbmVudDtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuKG5vd0FjdGl2ZURvbS5vcGVuKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgaWYgKG5vd0FjdGl2ZURvbS5uelNlbGVjdFNlcnZpY2UubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8g5aaC5p6c5b2T5YmN6IGa54Sm55qE5piv6YCJ5oup5qGG77yM5LiU6ZSu5YWlMC05YS16QS1a77yM5YiZ5by55Ye6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50ICYmXG4gICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4gPT09IGZhbHNlICYmXG4gICAgICAgICAgL15bMC05YS16QS1aXSQvLnRlc3QoZXZlbnQua2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBkb20gPSB0aGlzLmFjdGl2ZURvbTtcbiAgICAgICAgICBkb20ubnpPcGVuID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3Blbih0cnVlKTtcbiAgICAgICAgICAvLyAvLyBUT0RPOui/memHjOaaguaXtuazqOmHiu+8jOS4jeiDveebtOaOpeW4puWFpemUruWFpeWAvO+8jOi/meagt+S8muWvvOiHtOi+k+WFpeS4reaWh+eahOaXtuWAmeW4puWFpeiLseaWh+Wtl+espu+8jOS4jeespuWQiOmihOacn1xuICAgICAgICAgIC8vIGRvbS5uelNlbGVjdFRvcENvbnRyb2xDb21wb25lbnQuaW5wdXRWYWx1ZSA9IGV2ZW50LmtleTtcbiAgICAgICAgICAvLyAvLyDojrflj5YgaW5wdXQg5YWD57SgXG4gICAgICAgICAgLy8gY29uc3QgaW5wdXRFbGVtZW50ID0gZG9tLm56U2VsZWN0VG9wQ29udHJvbENvbXBvbmVudC5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyAgIC8vIOinpuWPkei+k+WFpeS6i+S7tu+8jOS7peehruS/nSBBbmd1bGFyIOajgOa1i+WIsOWAvOeahOWPmOWMllxuICAgICAgICAgIC8vICAgY29uc3QgZXZlbnRJbnB1dCA9IG5ldyBFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSk7XG4gICAgICAgICAgLy8gICBpbnB1dEVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudElucHV0KTtcbiAgICAgICAgICAvLyB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5Zyo5Yid5aeLZG9t5LiL5qCH5ZKM5pWw5o2u6ZuGIOiOt+WPluWcqGNvbGxlY3REb21MaXN05Lit55qE5LiL5qCHXG4gICAqIEBwYXJhbSBpbmRleCDliJ3lp4vkuIvmoIdcbiAgICogQHBhcmFtIGxpc3Qg6ICB5pWw5o2u6ZuGXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGdldERvbUluZGV4KGluZGV4OiBudW1iZXIsIGxpc3Q6IEFycmF5PEZvcm1MaW5lPik6IG51bWJlciB7XG4gICAgY29uc3QgdHlwZUxpc3QgPSBbXG4gICAgICBcIklucHV0XCIsXG4gICAgICBcIlNlbGVjdFwiLFxuICAgICAgXCJEYXRlXCIsXG4gICAgICBcIkRhdGVSYW5nZVwiLFxuICAgICAgXCJUZXh0QXJlYVwiLFxuICAgICAgXCJJbnB1dE51bWJlclwiLFxuICAgICAgXCJNdWx0aXBsZVNlbGVjdFwiLFxuICAgIF07XG4gICAgbGV0IGZpbHRlckxpc3QgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpID09PSBpbmRleCkge1xuICAgICAgICByZXR1cm4gZmlsdGVyTGlzdC5sZW5ndGg7XG4gICAgICB9XG4gICAgICAvLyDkuI7mqKHmnb/kuIDoh7TvvJpoaWRlIC8gaXNTaG93PWZhbHNlIOeahOWIl+S4jea4suafkyAjZm9ybUlucHV0RG9t77yM5LiN6K6h5YWlIGNvbGxlY3REb21MaXN0IOeahOWIl+S4i+agh1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlTGlzdC5pbmNsdWRlcyhsaXN0W2ldLnR5cGUpICYmXG4gICAgICAgICFsaXN0W2ldLmhpZGUgJiZcbiAgICAgICAgbGlzdFtpXS5pc1Nob3cgIT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgZmlsdGVyTGlzdC5wdXNoKGxpc3RbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7lnKhjb2xsZWN0RG9tTGlzdOS4reeahOS4i+agh+WSjOaVsOaNrumbhiDojrflj5bliJ3lp4tkb23kuIvmoIdcbiAgICogQHBhcmFtIGluZGV4IOaWsOS4i+agh1xuICAgKiBAcGFyYW0gbGlzdCDogIHmlbDmja7pm4ZcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgZ2V0T2xkRG9tSW5kZXgoaW5kZXg6IG51bWJlciwgbGlzdDogQXJyYXk8Rm9ybUxpbmU+KTogbnVtYmVyIHtcbiAgICBjb25zb2xlLmxvZyhcImluZGV4XCIsIGluZGV4KTtcbiAgICBjb25zb2xlLmxvZyhcImxpc3RcIiwgbGlzdCk7XG4gICAgY29uc3QgdHlwZUxpc3QgPSBbXG4gICAgICBcIklucHV0XCIsXG4gICAgICBcIlNlbGVjdFwiLFxuICAgICAgXCJEYXRlXCIsXG4gICAgICBcIkRhdGVSYW5nZVwiLFxuICAgICAgXCJUZXh0QXJlYVwiLFxuICAgICAgXCJJbnB1dE51bWJlclwiLFxuICAgICAgXCJNdWx0aXBsZVNlbGVjdFwiLFxuICAgIF07XG4gICAgbGV0IGZpbHRlckxpc3QgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZUxpc3QuaW5jbHVkZXMobGlzdFtpXS50eXBlKSAmJlxuICAgICAgICAhbGlzdFtpXS5oaWRlICYmXG4gICAgICAgIGxpc3RbaV0uaXNTaG93ICE9PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIGZpbHRlckxpc3QucHVzaChsaXN0W2ldKTtcbiAgICAgICAgaWYgKGZpbHRlckxpc3QubGVuZ3RoID09PSBpbmRleCArIDEpIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldCBsaW5lc0Zvcm1BcnJheSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KFwibGluZXNcIikgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgZ2V0IExvZGFzaFJvdW5kKCkge1xuICAgIHJldHVybiByb3VuZDtcbiAgfVxuXG4gIC8vIOaatOmcsueahOaWueazle+8jOeUqOS6juiOt+WPluaJgOacieaVsOaNrueahHZhbGlk54q25oCBXG4gIHB1YmxpYyBnZXRWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWQ7XG4gIH1cblxuICBvblNlYXJjaEV2ZW50KFxuICAgIGZuOiBhbnksXG4gICAgZXZlbnQ6IGFueSxcbiAgICBsaW5lOiBhbnksXG4gICAgb25TZWFyY2hFdmVudERlYm91bmNlVGltZTogYW55LFxuICApIHtcbiAgICBpZiAoIWZuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgb25TZWFyY2hFdmVudERlYm91bmNlVGltZSAhPSBudWxsID8gb25TZWFyY2hFdmVudERlYm91bmNlVGltZSA6IDA7XG4gICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXop6blj5HvvIzkuI3otbAgZGVib3VuY2VUaW1l77yI6YG/5YWN5byC5q2l77yJXG4gICAgaWYgKCFkZWJvdW5jZU1zKSB7XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlYm91bmNlVGltZW91dCA9IGRlYm91bmNlTXM7XG4gICAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0XG4gICAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBsaW5lIH0pID0+IHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgbGluZSkpO1xuICAgICAgdGhpcy5zZWFyY2hTdWJqZWN0Lm5leHQoeyBmbiwgZXZlbnQsIGxpbmUgfSk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4odHJ1ZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBvbk9wZW5DaGFuZ2VFdmVudChcbiAgICBmbjogYW55LFxuICAgIG9wZW46IGJvb2xlYW4sXG4gICAgbGluZTogYW55LFxuICAgIG9uT3BlbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lOiBhbnksXG4gICAgZm9ybUl0ZW0/OiBhbnksXG4gICkge1xuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5bGV5byA5pe25YWI5riF56m65penIG9wdGlvbnPvvIzpgb/lhY3mnaHku7blj5jljJblkI7or7fmsYLov5Tlm57liY3ku43lsZXnpLrkuIrkuIDmibnkuIvmi4nmlbDmja5cbiAgICBpZiAob3Blbikge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdE9wdGlvbnNPbk9wZW4oZm9ybUl0ZW0sIGxpbmUpO1xuICAgIH1cbiAgICBjb25zdCBkZWJvdW5jZU1zID1cbiAgICAgIG9uT3BlbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lICE9IG51bGxcbiAgICAgICAgPyBvbk9wZW5DaGFuZ2VFdmVudERlYm91bmNlVGltZVxuICAgICAgICA6IDA7XG4gICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXop6blj5HvvIzkuI3otbAgZGVib3VuY2VUaW1l77yI6YG/5YWN5byC5q2l77yJXG4gICAgaWYgKCFkZWJvdW5jZU1zKSB7XG4gICAgICBpZiAob3Blbikge1xuICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChmbiwgb3BlbiwgbGluZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlbkNoYW5nZURlYm91bmNlVGltZW91dCA9IGRlYm91bmNlTXM7XG4gICAgaWYgKHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5vcGVuQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMub3BlbkNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMub3BlbkNoYW5nZVN1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLm9wZW5DaGFuZ2VEZWJvdW5jZVRpbWVvdXQpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQsIGxpbmUgfSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLm9wZW5DaGFuZ2VTdWJqZWN0Lm5leHQoeyBmbiwgZXZlbnQ6IG9wZW4sIGxpbmUgfSk7XG4gIH1cblxuICAvKiog5pyJIG9uT3BlbkNoYW5nZUV2ZW50IOaXtuWxleW8gOS4i+aLieWFiOa4heepuumAiemhue+8jOeUseS4muWKoeWbnuiwg+WGjeWGmeWFpeaWsOaVsOaNriAqL1xuICBwcml2YXRlIGNsZWFyU2VsZWN0T3B0aW9uc09uT3Blbihmb3JtSXRlbTogYW55LCBsaW5lOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWZvcm1JdGVtIHx8ICFmb3JtSXRlbS5zZWxlY3RPcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gZm9ybUl0ZW0uc2VsZWN0T3B0aW9uO1xuICAgIGlmIChvcHQuc2VsZWN0TGlzdCAhPSBudWxsKSB7XG4gICAgICBvcHQuc2VsZWN0TGlzdCA9IFtdO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBvcHQuc2VsZWN0TGlzdE5hbWUgJiZcbiAgICAgIGxpbmUgJiZcbiAgICAgIGxpbmUuZ2V0ICYmXG4gICAgICBsaW5lLmdldChvcHQuc2VsZWN0TGlzdE5hbWUpXG4gICAgKSB7XG4gICAgICBsaW5lLmdldChvcHQuc2VsZWN0TGlzdE5hbWUpLnNldFZhbHVlKFtdLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBmbiDniLbnu4Tku7blh73mlbBcbiAgICogQHBhcmFtIGV2ZW50IOS6i+S7tuWAvFxuICAgKiBAcGFyYW0gbGluZSDop6blj5HnmoTooYxcbiAgICovXG4gIHRyaWdnZXJFdmVudChmbjogYW55LCBldmVudDogYW55LCBsaW5lOiBhbnkpIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGZuKGV2ZW50LCBsaW5lKTtcbiAgICB9XG4gIH1cblxuICBpbm5lckdldFZhbGlkKCkge1xuICAgIGxldCB0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBsaW5lczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgfSk7XG4gICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZm9yRWFjaCgoZm9ybUxpbmVzRGF0YUl0ZW0pID0+IHtcbiAgICAgIGxldCBmb3JtR3JvdXBPYmo6IGFueSA9IHt9O1xuICAgICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAvLyDmlrDlop7ooYwg5Yid5aeL5pWw5o2u6YO95Li6bnVsbFxuICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5qdWRnZVZhbHVlSXNOb3RFbXB0eShmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdKVxuICAgICAgICAgICAgICA/IGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0ubmFtZV1cbiAgICAgICAgICAgICAgOiBpdGVtLnZhbHVlIHx8IG51bGwsXG4gICAgICAgICAgICBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGl0ZW0ucmVxdWlyZSA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6IFtdLFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXRlbS5zZWxlY3RPcHRpb24gJiYgaXRlbS5zZWxlY3RPcHRpb24ubGFiZWwpIHtcbiAgICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgICAgICAgZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdIHx8IG51bGwsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZvcm1Hcm91cE9iai5saW5lSW5kZXggPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICAgICh0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzLmdldChcImxpbmVzXCIpIGFzIEZvcm1BcnJheSkuY29udHJvbHMubGVuZ3RoICsgMSxcbiAgICAgICAgW10sXG4gICAgICApO1xuICAgICAgbGV0IGZvcm1Hcm91cFRtcCA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwT2JqKTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudCkge1xuICAgICAgICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgICAgICAgaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lICE9IG51bGxcbiAgICAgICAgICAgICAgPyBpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXBUbXAuZ2V0KGl0ZW0ubmFtZSk7XG4gICAgICAgICAgLy8g5pyq6YWN572u5oiW5Li6IDDvvJrlkIzmraXorqLpmIXvvIzkuI3otbAgZGVib3VuY2VUaW1lXG4gICAgICAgICAgaWYgKGRlYm91bmNlTXMgPiAwKSB7XG4gICAgICAgICAgICBjb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoZGVib3VuY2VNcykpXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwVG1wKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwVG1wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAodG1wVmFsaWRhdGVIZEZvcm1MaW5lcy5nZXQoXCJsaW5lc1wiKSBhcyBGb3JtQXJyYXkpLmluc2VydChcbiAgICAgICAgKHRtcFZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KFwibGluZXNcIikgYXMgRm9ybUFycmF5KS5jb250cm9scy5sZW5ndGgsXG4gICAgICAgIGZvcm1Hcm91cFRtcCxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRtcFZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gIH1cblxuICAvLyDmmrTpnLLnmoTmlrnms5XvvIznlKjkuo7ojrflj5bmiYDmnInmlbDmja5cbiAgcHVibGljIGdldExpbmVzKCkge1xuICAgIGxldCBhbGxMaW5lcyA9IFtdO1xuICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZvckVhY2goKGZvcm1MaW5lc0RhdGFJdGVtKSA9PiB7XG4gICAgICBsZXQgZm9ybUdyb3VwT2JqOiBhbnkgPSB7fTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgLy8g5paw5aKe6KGMIOWIneWni+aVsOaNrumDveS4um51bGxcbiAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0ubmFtZV0gPSBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdO1xuICAgICAgfSk7XG4gICAgICBmb3JtR3JvdXBPYmoubGluZUluZGV4ID0gZm9ybUxpbmVzRGF0YUl0ZW0ubGluZUluZGV4O1xuICAgICAgYWxsTGluZXMucHVzaChmb3JtR3JvdXBPYmopO1xuICAgIH0pO1xuICAgIHJldHVybiBhbGxMaW5lcztcbiAgfVxuXG4gIC8vIOWFqOWxgOaAp+eahOaQnOe0ou+8iOa2teeblumhtemdouS4iuaJgOacieeahOWPr+inhuaWh+Wtl++8iVxuICBzZWFyY2hMaW5lcygpIHtcbiAgICBpZiAodGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEubGVuZ3RoIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlTG9hZGluZyA9IHRydWU7XG4gICAgLy8g5aaC5p6c5rKh5pyJ6L6T5YWl5pCc57Si5a2X56ym5Liy77yM5YiZ5pi+56S657yT5a2Y5YaF55qE5omA5pyJ5pWw5o2uXG4gICAgaWYgKCF0aGlzLmZpbHRlclN0cikge1xuICAgICAgdGhpcy5pc0ZpbHRlckRhdGEgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0U3RvcmVEYXRhKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdGhpcy5maWx0ZXJTdHIudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5pc0ZpbHRlckRhdGEgPSB0cnVlO1xuICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZSA9IFtdO1xuXG4gICAgLy8g5qC55o2u5pCc57Si5a2X56ym5Liy6L+H5ruk5pWw5o2uXG4gICAgY29uc3QgZmlsdGVyZWREYXRhID0gdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZmlsdGVyKFxuICAgICAgKGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5mb3JtTGluZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoaXRlbS5oaWRlICYmIGl0ZW0uY2FuU2VhcmNoKSB8fFxuICAgICAgICAgICAgKCFpdGVtLmhpZGUgJiYgaXRlbS5uYW1lICE9PSBcInV1aWRcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaXRlbVwiLCBpdGVtLm5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW2l0ZW0ubmFtZV1cbiAgICAgICAgICAgICAgPyBkYXRhW2l0ZW0ubmFtZV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICApO1xuICAgIC8vIOe8k+WtmOS4gOS4i+etm+mAieWQjueahOihqOWNleaVsOaNrlxuICAgIHRoaXMuZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhID0gZmlsdGVyZWREYXRhO1xuICAgIC8vIOWkhOeQhuetm+mAieWlveeahOaVsOaNriDnhLblkI7ph43mlrDmuLLmn5NcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEgPSBmaWx0ZXJlZERhdGE7XG4gICAgdGhpcy5pbml0KHRydWUpO1xuICB9XG5cbiAgc2V0U3RvcmVEYXRhKCkge1xuICAgIHRoaXMuZm9ybUxpbmVzRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhO1xuICAgIHRoaXMuaW5pdCh0cnVlKTtcbiAgfVxuXG4gIGdldFN0eWxlKGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IGFueSwgd2lkdGg6IHN0cmluZykge1xuICAgIGxldCBzdHlsZU9iaiA9IHtcbiAgICAgIFwibWluLXdpZHRoXCI6IHdpZHRoLFxuICAgIH07XG4gICAgaWYgKGZvcm1JdGVtLnN0eWxlKSB7XG4gICAgICBzdHlsZU9iaiA9IHsgLi4uc3R5bGVPYmosIC4uLmZvcm1JdGVtLnN0eWxlIH07XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGZvcm1JdGVtLmNvbG9yT3B0aW9uICYmXG4gICAgICBmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lICYmXG4gICAgICBsaW5lLmdldChmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lKS52YWx1ZVxuICAgICkge1xuICAgICAgc3R5bGVPYmogPSB7XG4gICAgICAgIC4uLnN0eWxlT2JqLFxuICAgICAgICAuLi57IGNvbG9yOiBsaW5lLmdldChmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lKS52YWx1ZSB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlT2JqO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJmb3JtTGluZXNEYXRhXCJdICYmXG4gICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1wiZm9ybUxpbmVzRGF0YVwiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1wiZm9ybUxpbmVzRGF0YVwiXS5wcmV2aW91c1ZhbHVlKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhICYmIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IHRoaXMuZm9ybUxpbmVzRGF0YTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiZm9ybUxpbmVzXCJdICYmXG4gICAgICBjaGFuZ2VzW1wiZm9ybUxpbmVzXCJdLnByZXZpb3VzVmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcImZvcm1MaW5lc1wiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1wiZm9ybUxpbmVzXCJdLnByZXZpb3VzVmFsdWUpXG4gICAgKSB7XG4gICAgICB0aGlzLmluaXRDb2xTZXR0aW5ncygpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1widG90YWxPcHRpb25cIl0gJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJ0b3RhbE9wdGlvblwiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1widG90YWxPcHRpb25cIl0ucHJldmlvdXNWYWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWwoKTtcbiAgICB9XG4gIH1cblxuICBjYWxjdWxhdGVUb3RhbCgpIHtcbiAgICAvLyDov5nph4zlpITnkIblkIjorqHmlbDmja5cbiAgICBpZiAodGhpcy5zaG93VG90YWwpIHtcbiAgICAgIHRoaXMudG90YWxPcHRpb25MaXN0ID0gbmV3IEFycmF5KE51bWJlcih0aGlzLmNvbHVtbnNOdW1iZXIpIC0gMSkuZmlsbChcIlwiKTtcbiAgICAgIHRoaXMudG90YWxPcHRpb24uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5pbnNlcnRJbmRleCAmJiAoaXRlbS5pbnNlcnRWYWx1ZSB8fCBpdGVtLmluc2VydFZhbHVlID09PSAwKSkge1xuICAgICAgICAgIHRoaXMudG90YWxPcHRpb25MaXN0W2l0ZW0uaW5zZXJ0SW5kZXggLSAxXSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLmluc2VydFZhbHVlLFxuICAgICAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ24gfHwgXCJsZWZ0XCIsXG4gICAgICAgICAgICBzaG93RGVjaW1hbDogaXRlbS5zaG93RGVjaW1hbCB8fCBmYWxzZSxcbiAgICAgICAgICAgIHByZXNlcnZlTnVtYmVyOiBpdGVtLnByZXNlcnZlTnVtYmVyICE9IG51bGwgPyBpdGVtLnByZXNlcnZlTnVtYmVyIDogMixcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXQoaXNFZGl0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSAxO1xuICAgIC8vIOW8guW4uOaNleiOt1xuICAgIGlmICghdGhpcy5jaGVja0xpc3QodGhpcy5mb3JtTGluZXMpKSB7XG4gICAgICB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgICAvLyDlpoLmnpzmsqHmnIlmb3JtTGluZXNEYXRh77yM5YiZ6K6k5Li65piv5paw5aKeXG4gICAgaWYgKFxuICAgICAgIWlzRWRpdCAmJlxuICAgICAgKCF0aGlzLmZvcm1MaW5lc0RhdGEgfHxcbiAgICAgICAgKHRoaXMuZm9ybUxpbmVzRGF0YSAmJiB0aGlzLmZvcm1MaW5lc0RhdGEubGVuZ3RoID09PSAwKSlcbiAgICApIHtcbiAgICAgIHRoaXMudGFibGVMb2FkaW5nID0gZmFsc2U7XG4gICAgICAvLyBhbGxvd0VtcHR5IOS4lOS7heWIoOmZpOaMiemSru+8muS4jeiHquWKqOihpeepuuihjFxuICAgICAgaWYgKCF0aGlzLmlzVHJ1bHlFbXB0eUFsbG93ZWQpIHtcbiAgICAgICAgdGhpcy5hZGRGb3JtTGluZShudWxsLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNob3dGb3JtID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g57yW6L6R6YC76L6RXG4gICAgICB0aGlzLmFkZEZvcm1MaW5lV2l0aERhdGEoKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGRhdGEpID0+XG4gICAgICB0aGlzLm9uSGRGb3JtVmFsdWVDaGFuZ2VkKGRhdGEpLFxuICAgICk7XG4gICAgdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuihqOWNlVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcyA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgbGluZXM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgIH0pO1xuICAgIHRoaXMubmV3TGluZSA9IHRoaXMubmV3TGluZUl0ZW0oKTtcbiAgfVxuXG4gIGRlbGF5SnVtcFRvTmV4dElucHV0KCkge1xuICAgIC8vIOWFs+mXremUruebmOaTjeS9nOaXtu+8jOmAieaLqeahhumAieS4reWQjuS4jeiHquWKqOi3s+i9rOWIsOS4i+S4gOS4qui+k+WFpeaOp+S7tlxuICAgIGlmICghdGhpcy5lbmFibGVLZXlib2FyZE9wZXJhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICog5a6a5LmJ56m655qEbmV3TGluZUl0ZW0g57uT5p6EXG4gICAqL1xuICBwcml2YXRlIG5ld0xpbmVJdGVtKCk6IEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTGluZUZyb21WYWx1ZXMobnVsbCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u6KGM5pWw5o2u5Yib5bu6IEZvcm1Hcm91cO+8iOWQq+makOiXj+Wtl+auteOAgXNlbGVjdCDnmoQgbGFiZWwg562J6ZmE5bGe5a2X5q6177yJXG4gICAqIEBwYXJhbSBmb3JtTGluZXNEYXRhSXRlbSDooYzmlbDmja7vvIznqbrooYzkvKAgbnVsbFxuICAgKiBAcGFyYW0gaXNFbXB0eUxpbmUg5piv5ZCm56m66KGM77yI5b2x5ZON5b+F5aGr5qCh6aqM6KeE5YiZ77yM5LiO5Y6G5Y+y6YC76L6R5L+d5oyB5LiA6Ie077yJXG4gICAqIEBwYXJhbSByZWdlbmVyYXRlUm93SWQg5piv5ZCm5by65Yi255Sf5oiQ5paw6KGMIGlk77yI5aSN5Yi26KGM5pe25L2/55So77yJXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUxpbmVGcm9tVmFsdWVzKFxuICAgIGZvcm1MaW5lc0RhdGFJdGVtOiBhbnksXG4gICAgaXNFbXB0eUxpbmU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICByZWdlbmVyYXRlUm93SWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogRm9ybUdyb3VwIHtcbiAgICBsZXQgZm9ybUdyb3VwT2JqOiBhbnkgPSB7fTtcbiAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBmb3JtR3JvdXBPYmpbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbChcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgZm9ybUxpbmVzRGF0YUl0ZW0gIT0gbnVsbFxuICAgICAgICAgICAgICA/IGZvcm1MaW5lc0RhdGFJdGVtW2l0ZW0ubmFtZV1cbiAgICAgICAgICAgICAgOiBpdGVtLnZhbHVlLFxuICAgICAgICAgIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkLFxuICAgICAgICB9LFxuICAgICAgICBpc0VtcHR5TGluZVxuICAgICAgICAgID8gaXRlbS5yZXF1aXJlICYmICFpdGVtLmhpZGVcbiAgICAgICAgICAgID8gW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICAgICAgICA6IFtdXG4gICAgICAgICAgOiBpdGVtLnJlcXVpcmVcbiAgICAgICAgICAgID8gW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICAgICAgICA6IFtdLFxuICAgICAgKTtcbiAgICAgIGlmIChpdGVtLnNlbGVjdE9wdGlvbiAmJiBpdGVtLnNlbGVjdE9wdGlvbi5sYWJlbCkge1xuICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdID0gdGhpcy5mYi5jb250cm9sKFxuICAgICAgICAgIGZvcm1MaW5lc0RhdGFJdGVtICE9IG51bGxcbiAgICAgICAgICAgID8gZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdIHx8IG51bGxcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOeos+WumuihjCBpZO+8muaQnOe0oumHjeW7uuihqOWNleWQjueUqOS6juS/neeVmeWLvumAiVxuICAgIGNvbnN0IHJvd0lkID1cbiAgICAgICFyZWdlbmVyYXRlUm93SWQgJiYgZm9ybUxpbmVzRGF0YUl0ZW0gJiYgZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWRcbiAgICAgICAgPyBmb3JtTGluZXNEYXRhSXRlbS5faGRSb3dJZFxuICAgICAgICA6IHRoaXMuZ2VuZXJhdGVSb3dJZCgpO1xuICAgIGZvcm1Hcm91cE9iai5faGRSb3dJZCA9IHRoaXMuZmIuY29udHJvbChyb3dJZCk7XG4gICAgaWYgKGZvcm1MaW5lc0RhdGFJdGVtICYmICFmb3JtTGluZXNEYXRhSXRlbS5faGRSb3dJZCkge1xuICAgICAgZm9ybUxpbmVzRGF0YUl0ZW0uX2hkUm93SWQgPSByb3dJZDtcbiAgICB9XG5cbiAgICAvLyDlpI3liLbmupDooYzkuIrlpJrkvZnnmoTlrZfmrrXvvIjpmpDol4/pmYTlsZ7lrZfmrrXjgIFzZWxlY3RMaXN0TmFtZSDnrYnvvIlcbiAgICBpZiAoZm9ybUxpbmVzRGF0YUl0ZW0pIHtcbiAgICAgIE9iamVjdC5rZXlzKGZvcm1MaW5lc0RhdGFJdGVtKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleSA9PT0gXCJsaW5lSW5kZXhcIiB8fFxuICAgICAgICAgIGtleSA9PT0gXCJpc0hkRm9ybUxpbmVTZWFyY2hBZGRcIiB8fFxuICAgICAgICAgIGtleSA9PT0gXCJfaGRSb3dJZFwiXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZvcm1Hcm91cE9ialtrZXldKSB7XG4gICAgICAgICAgZm9ybUdyb3VwT2JqW2tleV0gPSB0aGlzLmZiLmNvbnRyb2woZm9ybUxpbmVzRGF0YUl0ZW1ba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvcm1Hcm91cE9iai5saW5lSW5kZXggPSB0aGlzLmZiLmNvbnRyb2woXG4gICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCArIDEsXG4gICAgICBbXSxcbiAgICApO1xuICAgIGZvcm1Hcm91cE9iai5pc0hkRm9ybUxpbmVTZWFyY2hBZGQgPSB0aGlzLmZiLmNvbnRyb2wodGhpcy5pc0ZpbHRlckRhdGEsIFtdKTtcbiAgICBsZXQgZm9ybUdyb3VwU3VibWl0ID0gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBPYmopO1xuICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZGVib3VuY2VNcyA9XG4gICAgICAgICAgaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lICE9IG51bGxcbiAgICAgICAgICAgID8gaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXBTdWJtaXQuZ2V0KGl0ZW0ubmFtZSk7XG4gICAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gRm9ybUxpbmVUeXBlLlNlbGVjdCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kZWxheUp1bXBUb05leHRJbnB1dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChpdGVtLm9uQ2hhbmdlRXZlbnQsIHZhbHVlLCBmb3JtR3JvdXBTdWJtaXQpO1xuICAgICAgICB9O1xuICAgICAgICAvLyDmnKrphY3nva7miJbkuLogMO+8muWQjOatpeiuoumYhe+8jOS4jei1sCBkZWJvdW5jZVRpbWVcbiAgICAgICAgaWYgKGRlYm91bmNlTXMgPiAwKSB7XG4gICAgICAgICAgY29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZShkZWJvdW5jZU1zKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaGFuZGxlQ2hhbmdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoaGFuZGxlQ2hhbmdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmb3JtR3JvdXBTdWJtaXQ7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUxpbmVOdW1iZXIoKSB7XG4gICAgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaXRlbS5nZXQoXCJsaW5lSW5kZXhcIikuc2V0VmFsdWUoaW5kZXggKyAxLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog57yW6L6R55qE5pe25YCZ5pWw5o2u5aSE55CGXG4gICAqL1xuICBhZGRGb3JtTGluZVdpdGhEYXRhKCkge1xuICAgIHRoaXMuZm9ybUxpbmVzRGF0YS5mb3JFYWNoKChmb3JtTGluZXNEYXRhSXRlbSkgPT4ge1xuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5pbnNlcnQoXG4gICAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoLFxuICAgICAgICB0aGlzLmNyZWF0ZUxpbmVGcm9tVmFsdWVzKGZvcm1MaW5lc0RhdGFJdGVtKSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dGb3JtID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlnKjmjIflrprooYzkuIvmlrnmlrDlop7nqbrooYzvvJvkuI3kvKAgYWZ0ZXJMaW5lIOWImei/veWKoOWIsOacq+WwvlxuICAgKiBAcGFyYW0gYWZ0ZXJMaW5lIOW9k+WJjeihjCBGb3JtR3JvdXDvvIjkuI3opoHkvKAgbGluZUluZGV477yM6YG/5YWN5bqP5Y+35YGP56e75a+86Ie05o+S6ZSZ5L2N572u77yJXG4gICAqL1xuICBhZGRGb3JtTGluZShhZnRlckxpbmU/OiBGb3JtR3JvdXAgfCBudWxsLCBpc0ZvY3VzOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IGluc2VydEF0ID0gdGhpcy5nZXRJbnNlcnRJbmRleEFmdGVyKGFmdGVyTGluZSk7XG4gICAgY29uc3QgbmV3TGluZSA9IHRoaXMubmV3TGluZUl0ZW0oKTtcbiAgICB0aGlzLmxpbmVzRm9ybUFycmF5Lmluc2VydChpbnNlcnRBdCwgbmV3TGluZSk7XG4gICAgdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgdGhpcy5hZGRMaW5lRXZlbnQuZW1pdChuZXdMaW5lKTtcbiAgICAvLyDot7PliLDmlrDlop7ooYzmiYDlnKjpobXvvIzpgb/lhY3pobXnoIHlvILluLjml7bnnIvkuI3liLDmlbDmja5cbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPVxuICAgICAgTWF0aC5mbG9vcihpbnNlcnRBdCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplKSArIDE7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgICBpZiAoaXNGb2N1cykge1xuICAgICAgICB0aGlzLmFjdGl2ZURvbVggPSB0aGlzLnRvUGFnZUxvY2FsUm93SW5kZXgoaW5zZXJ0QXQpO1xuICAgICAgICB0aGlzLmFjdGl2ZURvbVkgPSAwO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuaJp+ihjOi/h+eoizEzXCIpO1xuICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlpI3liLblvZPliY3ooYzvvJrlnKjlvZPliY3ooYzkuIvmlrnmlrDlop7kuIDooYzvvIzlpI3liLbmiYDmnInlrZfmrrXlgLzvvIjlkKvpmpDol4/lrZfmrrXvvIlcbiAgICovXG4gIGNvcHlGb3JtTGluZShsaW5lOiBGb3JtR3JvdXApIHtcbiAgICBjb25zdCBzb3VyY2VJbmRleCA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuaW5kZXhPZihsaW5lKTtcbiAgICBpZiAoc291cmNlSW5kZXggPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGdldFJhd1ZhbHVlIOWMheWQqyBkaXNhYmxlZCDlrZfmrrXvvJvlpI3liLbooYzkvb/nlKjmlrDnmoQgX2hkUm93SWRcbiAgICBjb25zdCBzb3VyY2VWYWx1ZXMgPSBsaW5lLmdldFJhd1ZhbHVlKCk7XG4gICAgY29uc3QgaW5zZXJ0QXQgPSBzb3VyY2VJbmRleCArIDE7XG4gICAgdGhpcy5saW5lc0Zvcm1BcnJheS5pbnNlcnQoXG4gICAgICBpbnNlcnRBdCxcbiAgICAgIHRoaXMuY3JlYXRlTGluZUZyb21WYWx1ZXMoc291cmNlVmFsdWVzLCBmYWxzZSwgdHJ1ZSksXG4gICAgKTtcbiAgICB0aGlzLmNhbGN1bGF0ZUxpbmVOdW1iZXIoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgIHRoaXMuYWN0aXZlRG9tWCA9IHRoaXMudG9QYWdlTG9jYWxSb3dJbmRleChpbnNlcnRBdCk7XG4gICAgICB0aGlzLmFjdGl2ZURvbVkgPSAwO1xuICAgICAgdGhpcy5mb2N1c0RvbSh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBAT3V0cHV0KCkgZGVsZXRlTGluZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiDliKDpmaTooYxcbiAgICogQHBhcmFtIGxpbmVPckluZGV4IOihjCBGb3JtR3JvdXDvvIzmiJYgMS1iYXNlZCDnmoQgbGluZUluZGV477yI5YW85a65IHJlc2V0Rm9ybe+8iVxuICAgKi9cbiAgZGVsZXRlRm9ybUxpbmUobGluZU9ySW5kZXg6IEZvcm1Hcm91cCB8IG51bWJlcikge1xuICAgIGxldCByZW1vdmVBdCA9IC0xO1xuICAgIGlmICh0eXBlb2YgbGluZU9ySW5kZXggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJlbW92ZUF0ID0gbGluZU9ySW5kZXggLSAxO1xuICAgIH0gZWxzZSBpZiAobGluZU9ySW5kZXgpIHtcbiAgICAgIHJlbW92ZUF0ID0gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5pbmRleE9mKGxpbmVPckluZGV4KTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXG4gICAgICBcImluZGV4XCIsXG4gICAgICB0eXBlb2YgbGluZU9ySW5kZXggPT09IFwibnVtYmVyXCIgPyBsaW5lT3JJbmRleCA6IHJlbW92ZUF0LFxuICAgICk7XG4gICAgaWYgKHJlbW92ZUF0IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDmnIDlkI7kuIDmnaHmlbDmja7nmoTml7blgJnopoHliKTmlq3kuIDkuItcbiAgICBpZiAodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggPT09IDEgJiYgIXRoaXMuYWxsb3dFbXB0eSkge1xuICAgICAgaWYgKHRoaXMuZGVsZXRlTGFzdExpbmVFdmVudCkge1xuICAgICAgICB0aGlzLmRlbGV0ZUxhc3RMaW5lRXZlbnQuZW1pdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZW1vdmVkTGluZSA9IHRoaXMubGluZXNGb3JtQXJyYXkuYXQocmVtb3ZlQXQpIGFzIEZvcm1Hcm91cDtcbiAgICB0aGlzLmxpbmVzRm9ybUFycmF5LnJlbW92ZUF0KHJlbW92ZUF0KTtcbiAgICB0aGlzLnJlbW92ZUxpbmVGcm9tU2VsZWN0aW9uKHJlbW92ZWRMaW5lKTtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc0ZpbHRlckRhdGEgJiZcbiAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMgJiZcbiAgICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09PSAwICYmXG4gICAgICAhdGhpcy5pc1RydWx5RW1wdHlBbGxvd2VkXG4gICAgKSB7XG4gICAgICB0aGlzLmFkZEZvcm1MaW5lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOW9k+WJjemhteW3suaXoOaVsOaNruaXtuWbnumAgOmhteegge+8jOS4lOmhteeggeacgOWwj+S4uiAx77yI6YG/5YWN5Yig56m65ZCO5Y+Y5oiQIDAg5a+86Ie05YaN5re75Yqg55yL5LiN6KeB77yJXG4gICAgICBjb25zdCBtYXhQYWdlID0gTWF0aC5tYXgoXG4gICAgICAgIDEsXG4gICAgICAgIE1hdGguY2VpbChcbiAgICAgICAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPiBtYXhQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA9IG1heFBhZ2U7XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGN1bGF0ZUxpbmVOdW1iZXIoKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKiog5Zyo5oyH5a6a6KGM5ZCO5pa555qE5o+S5YWl5LiL5qCH77yb5peg6KGM5YiZ6L+95Yqg5Yiw5pyr5bC+ICovXG4gIHByaXZhdGUgZ2V0SW5zZXJ0SW5kZXhBZnRlcihhZnRlckxpbmU/OiBGb3JtR3JvdXAgfCBudWxsKTogbnVtYmVyIHtcbiAgICBpZiAoIWFmdGVyTGluZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBpZHggPSB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmluZGV4T2YoYWZ0ZXJMaW5lKTtcbiAgICByZXR1cm4gaWR4ID49IDAgPyBpZHggKyAxIDogdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGg7XG4gIH1cblxuICAvKiog5YWo5bGA6KGM5LiL5qCH6L2s5b2T5YmN6aG15YaF55qE6KGM5LiL5qCH77yI5L6b6IGa54Sm55So77yJICovXG4gIHByaXZhdGUgdG9QYWdlTG9jYWxSb3dJbmRleChnbG9iYWxJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKFxuICAgICAgZ2xvYmFsSW5kZXggLSAodGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4IC0gMSkgKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcGFnZUluZGV4Q2hhbmdlKGV2ZW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSBldmVudDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBwYWdlU2l6ZUNoYW5nZShldmVudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUgPSBldmVudDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgb25IZEZvcm1WYWx1ZUNoYW5nZWQoZGF0YT86IGFueSkge1xuICAgIGlmICh0aGlzLmlzRmlsdGVyRGF0YSkge1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5saW5lcyAmJiB0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gZGF0YS5saW5lcztcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGFbaXRlbV0gPSB7XG4gICAgICAgICAgICAgIC4uLnRoaXMuZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhW2luZGV4XSxcbiAgICAgICAgICAgICAgLi4ubGluZXNbaW5kZXhdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChsaW5lcy5sZW5ndGggPiB0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoKSB7XG4gICAgICAgICAgLy8g5pyJ5paw5aKe5pWw5o2u55qE5oOF5Ya1XG4gICAgICAgICAgLy8gc3RlcCAxOiDlhYjmib7mlrDlop7nmoRpbmRleOS4i+agh1xuICAgICAgICAgIGNvbnN0IGdldE5vd0xpbmVzID0gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLmdldFJhd1ZhbHVlKCkubGluZXM7XG4gICAgICAgICAgbGV0IGFkZEluZGV4ID0gLTE7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnZXROb3dMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGdldE5vd0xpbmVzW2ldLmlzSGRGb3JtTGluZVNlYXJjaEFkZCkge1xuICAgICAgICAgICAgICBhZGRJbmRleCA9IGk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWRkSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5zcGxpY2UoXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZVthZGRJbmRleCAtIDFdICsgMSxcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgZ2V0Tm93TGluZXNbYWRkSW5kZXhdLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnB1c2godGhpcy5maWx0ZXJJbmRleFN0b3JlW2FkZEluZGV4IC0gMV0gKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDmnInliKDpmaTmlbDmja7nmoTmg4XlhrVcbiAgICAgICAgICAvLyBzdGVwIDE65YWI5om+5Yiw5Yig6Zmk55qEaW5kZXjkuIvmoIdcbiAgICAgICAgICBsZXQgZGVsZXRlZEluZGV4ID0gLTE7XG4gICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGVkSW5kZXggPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5saW5lSW5kZXggLSBjb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVkSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZWxldGVkSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBzdGVwIDI6IOWIoOmZpOaAu+aVsOaNruS4reeahOWvueW6lOaVsOaNriwg5oqK5LiL5qCH5pWw57uE5ZKMbGluZXPplb/luqblr7npvZDvvIzlkIzml7bmiorkuIvmoIfmlbDnu4TlnKhkZWxldGVkSW5kZXjlkI7pnaLnmoTlgLzlhajpg70tMVxuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5maWx0ZXIoXG4gICAgICAgICAgICAgIChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCAhPT0gdGhpcy5maWx0ZXJJbmRleFN0b3JlW2RlbGV0ZWRJbmRleF07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnNwbGljZShkZWxldGVkSW5kZXgsIDEpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKGkgPj0gZGVsZXRlZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlW2ldLS07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc3RlcCAyOiDmsqHmnInmib7liLBkZWxldGVkSW5kZXjor7TmmI7liKDpmaTmk43kvZzlnKjmnIDlkI7kuIDooYxcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckluZGV4ID1cbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlW3RoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggIT09IGZpbHRlckluZGV4O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5wb3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEubGluZXMpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IGRhdGEubGluZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5saW5lcykge1xuICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IGRhdGEubGluZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g5oC76KGo5Y2VXG4gICAgaWYgKCF0aGlzLmlzRmlsdGVyRGF0YSkge1xuICAgICAgdGhpcy5mb3JtVmFsaWQgPSB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmZvcm1WYWxpZCkge1xuICAgICAgICAvLyDlpoLmnpzmlbTkvZPooajljZXmmK90cnVl77yM5LiN566h5a2Q6KGo5Y2V5piv5LuA5LmI77yM6YO95Y+Y5oiQ5a2Q6KGo5Y2V55qE54q25oCBXG4gICAgICAgIHRoaXMuZm9ybVZhbGlkID0gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5aaC5p6c5pW05L2T6KGo5Y2V5pivZmFsc2XvvJox44CB5a2Q6KGo5Y2V5Li6dHJ1Ze+8jOmcgOimgemHjeeul++8mzLjgIHlrZDooajljZXkuLpmYWxzZe+8jOeUqOWtkOihqOWNleeKtuaAgVxuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkKSB7XG4gICAgICAgICAgdGhpcy5mb3JtVmFsaWQgPSB0aGlzLmlubmVyR2V0VmFsaWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvcm1WYWxpZCA9IHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWxpZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB0aGlzLmNhbGN1bGF0ZUxpbmVOdW1iZXIoKTtcbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tMaXN0KGxpc3Q6IEFycmF5PEZvcm1MaW5lPik6IGJvb2xlYW4ge1xuICAgIGlmICghbGlzdCB8fCAobGlzdCAmJiBsaXN0Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IG5hbWVMaXN0ID0gW107XG4gICAgbGV0IHNlbGVjdE9wdGlvbkNoZWNrTGlzdCA9IFtdO1xuICAgIGxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgLy8g5qCh6aqM5Y2V6aG56YCJ5oup5ZmoXG4gICAgICAvLyBpZiAoaXRlbS50eXBlID09PSBGb3JtTGluZVR5cGUuU2VsZWN0ICYmICghaXRlbS5zZWxlY3RMaXN0IHx8IChpdGVtLnNlbGVjdExpc3QgJiYgaXRlbS5zZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkpKSB7XG4gICAgICAvLyAgIHRocm93ICdmb3JtTGluZXPnu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIPvvIzlrZjlnKjljZXpobnpgInmi6nlmajmsqHmnInkvKDlhaXpgInpobkhJ1xuICAgICAgLy8gfVxuICAgICAgbmFtZUxpc3QucHVzaChpdGVtLm5hbWUpO1xuXG4gICAgICAvLyDmoKHpqozmnIlvblNlYXJjaOeahOWtl+auteeahHNlbGVjdE9wdGlvbueahHZhbHVl44CBbGFiZWzmmK/lkKblnKhmb3JtTGluZemHjOmdoumDveWumuS5ieS6hlxuICAgICAgaWYgKGl0ZW0ub25TZWFyY2hFdmVudCAmJiBpdGVtLnNlbGVjdE9wdGlvbikge1xuICAgICAgICBzZWxlY3RPcHRpb25DaGVja0xpc3QgPSBbXTtcbiAgICAgICAgbGlzdC5mb3JFYWNoKChpbm5lckl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpbm5lckl0ZW0ubmFtZSA9PT0gaXRlbS5zZWxlY3RPcHRpb24udmFsdWUgfHxcbiAgICAgICAgICAgIGlubmVySXRlbS5uYW1lID09PSBpdGVtLnNlbGVjdE9wdGlvbi5sYWJlbFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgc2VsZWN0T3B0aW9uQ2hlY2tMaXN0LnB1c2goaW5uZXJJdGVtLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzZWxlY3RPcHRpb25DaGVja0xpc3QubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHRocm93IGBmb3JtTGluZXPnu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIPvvIzlrZfmrrUke2l0ZW0ubmFtZX3nmoRzZWxlY3RPcHRpb27nmoR2YWx1ZeOAgWxhYmVs5a2X5q615pyq6IO95ZyoZm9ybUxpbmVz5Lit5om+5Yiw5a+55bqU5a2X5q6177yBYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOagoemqjG5hbWXmmK/lkKbph43lpI1cbiAgICBpZiAoWy4uLm5ldyBTZXQobmFtZUxpc3QpXS5sZW5ndGggIT09IGxpc3QubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBcImZvcm1MaW5lc+e7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMg++8jOWtmOWcqOmHjeWkjW5hbWXlgLwhXCI7XG4gICAgfVxuICAgIC8vIC4uLm1vcmUgY2hlY2tcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJtaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlRXZlbnQuZW1pdCh0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0UmF3VmFsdWUoKSk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIC8vIOWIoOmZpFxuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0aGlzLmRlbGV0ZUZvcm1MaW5lKGkpO1xuICAgIH1cbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSAxO1xuICB9XG5cbiAgcHVibGljIGlucHV0Q2xlYW4oZm9ybUl0ZW06IGFueSwgbGluZTogYW55KTogdm9pZCB7XG4gICAgbGluZS5nZXQoZm9ybUl0ZW0ubmFtZSkuc2V0VmFsdWUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0VmFsdWUoaWQ6IHN0cmluZywgcm93TnVtYmVyOiBudW1iZXIsIGNvbE51bWJlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXREb206IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaWQpO1xuICAgIGlucHV0RG9tLnNlbGVjdCgpO1xuICAgIHRoaXMuc2V0QWN0aXZlRG9tSW5Gb3JtTGluZXMocm93TnVtYmVyLCBjb2xOdW1iZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZXh0V2lkdGhDYWNoZTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG4gIGlzVGV4dE92ZXJmbG93KHRleHQ6IHN0cmluZywgbWF4V2lkdGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNhY2hlZFdpZHRoID0gdGhpcy50ZXh0V2lkdGhDYWNoZVt0ZXh0XTtcbiAgICBpZiAoY2FjaGVkV2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFdpZHRoICsgMTUgPj0gbWF4V2lkdGg7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgc3Bhbi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICBzcGFuLnN0eWxlLndoaXRlU3BhY2UgPSBcIm5vd3JhcFwiO1xuICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBcIjE0cHhcIjtcbiAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiOyAvLyDlsIbmoLflvI/kv67mlLnkuLogaW5saW5lLWJsb2NrXG4gICAgc3Bhbi5pbm5lclRleHQgPSB0ZXh0O1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgY29uc3QgaXNPdmVyZmxvdyA9IHNwYW4ub2Zmc2V0V2lkdGggKyAxNSA+PSBtYXhXaWR0aDtcbiAgICB0aGlzLnRleHRXaWR0aENhY2hlW3RleHRdID0gc3Bhbi5vZmZzZXRXaWR0aDtcbiAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgIHJldHVybiBpc092ZXJmbG93O1xuICB9XG5cbiAganVkZ2VDb2xFbXB0eShzdHI6IGFueSkge1xuICAgIGlmIChzdHIgfHwgc3RyID09PSAwKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCI856m6PlwiO1xuICAgIH1cbiAgfVxuXG4gIGp1ZGdlVmFsdWVJc05vdEVtcHR5KHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciA9PT0gbnVsbCAmJiBzdHIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==