@libs-ui/components-list 0.2.343-0 → 0.2.344-1

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.
@@ -1,6 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  import { AsyncPipe } from '@angular/common';
3
3
  import { ChangeDetectionStrategy, Component, isSignal, signal } from '@angular/core';
4
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
5
  import { VirtualScrollerModule } from '@iharbeck/ngx-virtual-scroller';
5
6
  import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
6
7
  import { LibsUiComponentsCheckboxSingleComponent } from '@libs-ui/components-checkbox-single';
@@ -8,10 +9,9 @@ import { LibsUiComponentsRadioSingleComponent } from '@libs-ui/components-radio-
8
9
  import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';
9
10
  import { LibsUiComponentsSpinnerComponent } from '@libs-ui/components-spinner';
10
11
  import { LibsUiPipesCallFunctionInTemplatePipe } from '@libs-ui/pipes-call-function-in-template';
11
- import { cloneDeep, deleteUnicode, escapeHtml, isEmpty, isNil, uuid, set, get } from '@libs-ui/utils';
12
+ import { cloneDeep, deleteUnicode, escapeHtml, get, isEmpty, isNil, set, uuid } from '@libs-ui/utils';
12
13
  import { TranslateModule } from '@ngx-translate/core';
13
14
  import { range } from 'rxjs';
14
- import { takeUntil } from 'rxjs/operators';
15
15
  import { LibsUiCheckSelectedByKeyPipe } from '../../pipes/check-selected-by-key.pipe';
16
16
  import { LibsUiComponentsListTemplatesComponentAbstract } from '../templates.component.abstract';
17
17
  import { LibsUiComponentsListGroupItemComponent } from './item/item.component';
@@ -46,7 +46,7 @@ export class LibsUiComponentsListGroupComponent extends LibsUiComponentsListTemp
46
46
  }
47
47
  this.callApiByService();
48
48
  this.onUpdateMultiKeySelectedGroup()
49
- ?.pipe(takeUntil(this.onDestroy))
49
+ ?.pipe(takeUntilDestroyed(this.destroyRef))
50
50
  .subscribe(() => {
51
51
  if (!this.store() || !this.store().length) {
52
52
  return;
@@ -785,4 +785,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
785
785
  LibsUiComponentsListGroupItemComponent,
786
786
  ], template: "@if (configTemplateGroup(); as configTemplateGroup) {\n @let constHtmlHeightViewPort = heightViewPort() ? heightViewPort() + 'px' : '100%';\n @let constHtmlDisable = loading() || disable() || false;\n <div\n class=\"libs-ui-list-group overflow-[hidden]\"\n [style.height]=\"constHtmlHeightViewPort\">\n <div class=\"flex flex-col w-full h-full relative min-h-[28px]\">\n @if (items().length && configTemplateGroup.configButtonSelectAndUndSelectItem?.(); as configButtonSelectItem) {\n <div [class]=\"'flex items-center bg-[#ffffff] ' + (configButtonSelectItem.classInclude ?? 'libs-ui-border-bottom-general')\">\n <libs_ui-components-buttons-button\n [type]=\"configButtonSelectItem.buttonCheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonCheckAll?.label ?? 'i18n_select_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonCheckAll?.classInclude || 'pr-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonCheckAll?.classLabel || 'libs-ui-font-h6r'\"\n [disable]=\"constHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(true)\" />\n <div class=\"text-[#999999]\">|</div>\n <libs_ui-components-buttons-button\n [type]=\"configButtonSelectItem.buttonUncheckAll?.type ?? 'button-link-primary'\"\n [label]=\"configButtonSelectItem.buttonUncheckAll?.label ?? 'i18n_unselect_all_searched_results'\"\n [classInclude]=\"configButtonSelectItem.buttonUncheckAll?.classInclude || 'pl-[8px]'\"\n [classLabel]=\"configButtonSelectItem.buttonUncheckAll?.classLabel || 'libs-ui-font-h6s'\"\n [disable]=\"constHtmlDisable\"\n (outClick)=\"handlerCheckedOrUnCheckedAll(false)\" />\n </div>\n }\n @if (items().length && configTemplateGroup.configCheckboxCheckAll?.(); as configCheckBox) {\n <div [class]=\"'flex libs-ui-border-bottom-general ' + (configTemplateGroup.classIncludeHasConfigCheckBoxAll ?? ' bg-[#ffffff]')\">\n <libs_ui-components-checkbox-single\n [label]=\"configCheckBox.label ?? 'i18n_all'\"\n [classLabelInclude]=\"configCheckBox.classLabelInclude || ''\"\n [checked]=\"totalItemChecked() >= totalItem() && totalItem() > 0\"\n [disable]=\"constHtmlDisable\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outChange)=\"handlerCheckedOrUnCheckedAll($event.checked)\" />\n </div>\n }\n @if (items() && items().length) {\n <div class=\"w-full h-full relative flex\">\n <div\n LibsUiComponentsScrollOverlayDirective\n class=\"w-full h-full absolute top-0 left-0 {{ configTemplateGroup.classIncludeGroup ? configTemplateGroup.classIncludeGroup : '' }}\">\n @for (item of items(); track item()[fieldKey()]; let first = $first; let last = $last) {\n <div\n #itemRef\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\"\n class=\"flex flex-col relative\">\n @let constHtmlPadding = level() * (configTemplateGroup.isViewTree ? 8 : 16);\n <div\n class=\"flex items-center py-[6px]\"\n [class.libs-ui-bg-list-hover]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.libs-ui-bg-list-hover-active]=\"!configTemplateGroup.ignoreClickLabelGroup\"\n [class.!cursor-pointer]=\"!configTemplateGroup.ignoreClickLabelGroup && (configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\"\n [style.paddingLeft.px]=\"constHtmlPadding\"\n [style.paddingRight.px]=\"constHtmlPadding\"\n (click)=\"configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem ? handlerToggleExpand($event, item) : undefined\">\n @if (configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree) {\n <i\n class=\"cursor-pointer libs-ui-icon-chevron-right before:!text-[16px]\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event, item)\"></i>\n }\n <div\n class=\"flex\"\n [class.w-full]=\"configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)\"\n [class.w-[calc(100%-16px)]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\">\n @if (!configTemplateGroup.isViewRadio) {\n <libs_ui-components-checkbox-single\n [avatarConfig]=\"item().avatarConfig\"\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [ignoreCheckbox]=\"configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"\n !item()[configTemplateGroup.fieldGetItems]?.()?.length &&\n !(\n (configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) &&\n (configTemplateGroup.iconExpand === 'left' || (configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\n )\n \"\n [class.max-w-[calc(100%-24px)]]=\"\n (configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) &&\n (configTemplateGroup.iconExpand === 'left' || (configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\n \"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [dataComponentOutlet]=\"undefined | LibsUiPipesCallFunctionInTemplatePipe: configTemplateGroup.getDataComponentOutletGroup : item() : fieldKey() : { valueIsEmpty: { item: item() } } | async\"\n [componentOutlet]=\"0 | LibsUiPipesCallFunctionInTemplatePipe: configTemplateGroup.getComponentOutletGroup : item() : fieldKey() : { valueIs0: 0 } | async\"\n [linkImage]=\"\n configTemplateGroup.getImage\n ? ('avatar' | LibsUiPipesCallFunctionInTemplatePipe: (item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage) : item() | async)\n : item()[configTemplateGroup.fieldGetAvatarItem || '']\n \"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [classLabelInclude]=\"\n (configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : configTemplateGroup.isViewTree ? ' libs-ui-font-h6r ' : ' libs-ui-font-h6s ') +\n (configTemplateGroup.ignoreTextUppercaseLabelGroup || configTemplateGroup.isViewTree ? '' : ' text-uppercase ')\n \"\n [disable]=\"disable() || (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe: keysDisableItem() : keysDisableItem()?.length)\"\n [checked]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe: keysChecked() : keysChecked().length\"\n [stillOtherOptions]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe: keysStillOtherOptions() : keysStillOtherOptions().length\"\n (outChange)=\"handlerChangeChecked($event.checked, item, true)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outClickLabel)=\"handlerToggleExpand('clickLabel', item, configTemplateGroup.ignoreCheckboxGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (configTemplateGroup.isViewRadio) {\n <libs_ui-components-radio-single\n [class.ml-[8px]]=\"configTemplateGroup.iconExpand === 'left' || configTemplateGroup.isViewTree\"\n [avatarConfig]=\"item().avatarConfig\"\n [ignoreRadio]=\"configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem\"\n [class]=\"configTemplateGroup.classIncludeItem || ''\"\n [class.w-auto]=\"configTemplateGroup.isViewTree\"\n [class.w-full]=\"\n !item()[configTemplateGroup.fieldGetItems]?.()?.length &&\n !(\n (configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) &&\n (configTemplateGroup.iconExpand === 'left' || (configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\n )\n \"\n [class.max-w-[calc(100%-24px)]]=\"\n (configTemplateGroup.isViewTree || configTemplateGroup.widthLabelSub24WhenNotTreeView) &&\n (configTemplateGroup.iconExpand === 'left' || (configTemplateGroup.iconExpand === 'right' && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)))\n \"\n [label]=\"item().fieldLabel\"\n [popover]=\"item().dataPopover\"\n [dataComponentOutlet]=\"undefined | LibsUiPipesCallFunctionInTemplatePipe: configTemplateGroup.getDataComponentOutletGroup : item() : fieldKey() : { valueIsEmpty: { item: item() } } | async\"\n [componentOutlet]=\"0 | LibsUiPipesCallFunctionInTemplatePipe: configTemplateGroup.getComponentOutletGroup : item() : fieldKey() : { valueIs0: 0 } | async\"\n [zIndexLabel]=\"configTemplateGroup.zIndexLabel ?? zIndex()\"\n [imgTypeIcon]=\"configTemplateGroup.imgTypeIcon\"\n [linkImage]=\"\n configTemplateGroup.getImage\n ? ('avatar' | LibsUiPipesCallFunctionInTemplatePipe: (item().specific_loadImgError && configTemplateGroup.getLinkImageError ? configTemplateGroup.getLinkImageError : configTemplateGroup.getImage) : item() | async)\n : item()[configTemplateGroup.fieldGetAvatarItem || '']\n \"\n [classLabelInclude]=\"(configTemplateGroup.classLabelItem ? configTemplateGroup.classLabelItem : 'libs-ui-font-h6s ') + (configTemplateGroup.ignoreTextUppercaseLabelGroup ? '' : ' uppercase')\"\n [disable]=\"\n disable() ||\n (configTemplateGroup.disableItemNotLastLevel && !!item()[configTemplateGroup.fieldGetItems]?.()?.length) ||\n configTemplateGroup.ignoreCheckboxGroup ||\n configTemplateGroup.singleSelectItem ||\n (item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe: keysDisableItem() : keysDisableItem()?.length)\n \"\n [active]=\"item()[fieldKey()] | LibsUiCheckSelectedByKeyPipe: keysChecked() : keysChecked().length\"\n (outChange)=\"handlerChangeChecked($event.active, item, true)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outClickLabel)=\"handlerToggleExpand('clickLabel', item, configTemplateGroup.ignoreRadioGroup || configTemplateGroup.singleSelectItem)\" />\n }\n\n @if (item().buttonInGroup; as buttonInGroup) {\n <libs_ui-components-buttons-button\n [type]=\"buttonInGroup.type || 'button-link-primary'\"\n [label]=\"buttonInGroup.label || ' '\"\n [classIconLeft]=\"(buttonInGroup.classIconLeft || '') + ' flex mr-[8px] !text-[8px]'\"\n [classInclude]=\"buttonInGroup.classInclude\"\n [classLabel]=\"buttonInGroup.classLabel || 'libs-ui-font-h5r'\"\n [disable]=\"buttonInGroup.disable || disable() || false\"\n (outClick)=\"handlerClickButtonGroup(buttonInGroup, item())\" />\n }\n </div>\n\n @if (configTemplateGroup.iconExpand === 'right' && !configTemplateGroup.isViewTree && (!configTemplateGroup.searchAllLevel || !!item()[configTemplateGroup.fieldGetItems]?.()?.length)) {\n <i\n class=\"flex items-center cursor-pointer libs-ui-icon-chevron-right before:!text-[16px]\"\n [class.!ml-[8px]]=\"item().dataPopover\"\n [class.rotate-90]=\"item().expand\"\n (click)=\"handlerToggleExpand($event, item)\"></i>\n }\n </div>\n @if (item().expand && calculatorHeighItemSuccess()) {\n <libs_ui-components-list-templates_group-item\n [keySearch]=\"keySearch()\"\n [items]=\"item()[configTemplateGroup.fieldGetItems]()\"\n [parentItem]=\"item()\"\n [fieldKey]=\"fieldKey()\"\n [keysChecked]=\"keysChecked()\"\n [disable]=\"disable()\"\n [keysDisableItem]=\"keysDisableItem() || []\"\n [configTemplateGroup]=\"configTemplateGroup\"\n [config]=\"config()\"\n [keysStillOtherOptions]=\"keysStillOtherOptions()\"\n (outChangeView)=\"handlerChangeView()\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outChange)=\"handlerChangeItemChecked($event.item)\" />\n }\n @if (!last && !configTemplateGroup.ignoreGroupLine && calculatorHeighItemSuccess()) {\n <div\n class=\"libs-ui-list-group-line\"\n [style.marginTop.px]=\"!configTemplateGroup.ignoreGroupLine ? configTemplateGroup.marginTopHasLine || 4 : 0\"></div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (!items() || !items().length) {\n <div\n class=\"libs-ui-font-h5r text-[#c1c1c1] relative {{ configTemplateGroup.classIncludeNodata ? configTemplateGroup.classIncludeNodata : '' }}\"\n [style.marginLeft.px]=\"\n 0\n | LibsUiComponentsListGroupCalculatorMarginLeftItemPipe\n : 2\n : configTemplateGroup.isViewTree || configTemplateGroup.iconExpand === 'left'\n : configTemplateGroup.isViewTreeJson\n : !(configTemplateGroup.ignoreCheckboxItem || configTemplateGroup.ignoreRadioItem || configTemplateGroup.singleSelectItem)\n : true\n \"\n [class.py-[8px]]=\"configTemplateGroup.fieldGetAvatarItem\"\n [class.py-[4px]]=\"!configTemplateGroup.fieldGetAvatarItem\">\n @if (!keySearch() && !loading()) {\n @let constHtmlTextNoData = config()?.textNoData || 'i18n_no_data_yet';\n <div>{{ constHtmlTextNoData | translate }}</div>\n }\n @if (keySearch() && !loading()) {\n @let constHtmlTextSearchNoData = config()?.textSearchNoData || 'i18n_no_result';\n <div>{{ constHtmlTextSearchNoData | translate }}</div>\n }\n </div>\n }\n @if (loading()) {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n </div>\n}\n", styles: [".libs-ui-list-group{display:flex;flex-direction:column;width:100%}.libs-ui-list-group .libs-ui-list-group-line{width:100%;height:1px;background-color:#e6e7ea}.libs-ui-list-group [class*=libs-ui-icon-chevron]:before{color:#6a7383}\n"] }]
787
787
  }] });
788
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2xpc3Qvc3JjL3RlbXBsYXRlcy9ncm91cC9ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL2dyb3VwL2dyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQVUsTUFBTSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUM3RyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEVBQVcsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFB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Q0FBQyxVQUFVLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN0QixPQUFPLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBRXpGLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxXQUFXLElBQUksSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDO0lBQzFDLENBQUM7d0dBdDRCVSxrQ0FBa0M7NEZBQWxDLGtDQUFrQywwSEMzQy9DLDgyZ0JBa09BLGdTRHJNSSxxQkFBcUIsMEJBQ3JCLFNBQVMsNkNBQ1QsZUFBZSw0RkFDZixzQ0FBc0Msc2pCQUN0Qyx1Q0FBdUMsMHBCQUN2QyxvQ0FBb0MsMmhCQUNwQyxnQ0FBZ0MsaUdBQ2hDLHNDQUFzQyx3U0FDdEMsNEJBQTRCLGdFQUM1QixxQ0FBcUMseUVBQ3JDLHFEQUFxRCw4RkFDckQsc0NBQXNDOzs0RkFHN0Isa0NBQWtDO2tCQXRCOUMsU0FBUzsrQkFFRSx5Q0FBeUMsY0FHdkMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLHFCQUFxQjt3QkFDckIsU0FBUzt3QkFDVCxlQUFlO3dCQUNmLHNDQUFzQzt3QkFDdEMsdUNBQXVDO3dCQUN2QyxvQ0FBb0M7d0JBQ3BDLGdDQUFnQzt3QkFDaEMsc0NBQXNDO3dCQUN0Qyw0QkFBNEI7d0JBQzVCLHFDQUFxQzt3QkFDckMscURBQXFEO3dCQUNyRCxzQ0FBc0M7cUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlzU2lnbmFsLCBPbkluaXQsIHNpZ25hbCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxlck1vZHVsZSB9IGZyb20gJ0BpaGFyYmVjay9uZ3gtdmlydHVhbC1zY3JvbGxlcic7XG5pbXBvcnQgeyBJQnV0dG9uLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1JhZGlvU2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1yYWRpby1zaW5nbGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zcGlubmVyJztcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1jYWxsLWZ1bmN0aW9uLWluLXRlbXBsYXRlJztcbmltcG9ydCB7IGNsb25lRGVlcCwgZGVsZXRlVW5pY29kZSwgZXNjYXBlSHRtbCwgaXNFbXB0eSwgaXNOaWwsIHV1aWQsIHNldCwgZ2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyByYW5nZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtR3JvdXAgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2NvbmZpZy1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJTGlzdERhdGFFbWl0S2V5LCBJTGlzdERhdGFFbWl0TXVsdGlLZXkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RhdGEtZW1pdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2NoZWNrLXNlbGVjdGVkLWJ5LWtleS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaXN0VGVtcGxhdGVzQ29tcG9uZW50QWJzdHJhY3QgfSBmcm9tICcuLi90ZW1wbGF0ZXMuY29tcG9uZW50LmFic3RyYWN0JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaXN0R3JvdXBJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9pdGVtL2l0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNMaXN0R3JvdXBDYWxjdWxhdG9yTWFyZ2luTGVmdEl0ZW1QaXBlIH0gZnJvbSAnLi9waXBlcy9jYWxjdWxhdG9yLW1hcmdpbi1sZWZ0LWl0ZW0ucGlwZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1saXN0LXRlbXBsYXRlc19ncm91cCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ncm91cC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dyb3VwLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgVmlydHVhbFNjcm9sbGVyTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNSYWRpb1NpbmdsZUNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSxcbiAgICBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlLFxuICAgIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cENhbGN1bGF0b3JNYXJnaW5MZWZ0SXRlbVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cEl0ZW1Db21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNMaXN0R3JvdXBDb21wb25lbnQgZXh0ZW5kcyBMaWJzVWlDb21wb25lbnRzTGlzdFRlbXBsYXRlc0NvbXBvbmVudEFic3RyYWN0IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gI3JlZ2lvbiBQUk9QRVJUWVxuICBwcm90ZWN0ZWQgY29uZmlnVGVtcGxhdGVHcm91cCA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW1Hcm91cCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxldmVsID0gc2lnbmFsPG51bWJlcj4oMSk7XG4gIHByb3RlY3RlZCBrZXlzQ2hlY2tlZCA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihbXSk7XG4gIHByb3RlY3RlZCBrZXlzU3RpbGxPdGhlck9wdGlvbnMgPSBzaWduYWw8QXJyYXk8c3RyaW5nPj4oW10pO1xuICBwcm90ZWN0ZWQgdG90YWxJdGVtID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCB0b3RhbEl0ZW1DaGVja2VkID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCBjYWxjdWxhdG9ySGVpZ2hJdGVtU3VjY2VzcyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBrZXlGZXRjaCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IFBBVFRFUk5fRkFLRV9JRCA9ICdmYWtlLWlkLSc7XG4gIHByaXZhdGUgbWFwcGluZ0l0ZW1zQ2hlY2tlZCA9IHNpZ25hbDxNYXA8c3RyaW5nLCBhbnk+PihuZXcgTWFwKCkpO1xuICBwcml2YXRlIHNlbGVjdEZpcnN0SXRlbSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgZmlyc3RJdGVtU2VsZWN0ZWQgPSBzaWduYWw8YW55Pih1bmRlZmluZWQpO1xuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5jb25maWcoKT8uY29uZmlnVGVtcGxhdGVHcm91cD8uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAuc2V0KHRoaXMuY29uZmlnKCk/LmNvbmZpZ1RlbXBsYXRlR3JvdXA/LigpKTtcbiAgICB0aGlzLnRpbWVJbnRlcnZhbEludGVydmFsU2V0SGVpZ2h0Vmlld1BvcnQuc2V0KHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy50aW1lSW50ZXJ2YWxDYWxjdWxhdG9ySGVpZ2h0ID8/IDApO1xuICAgIHRoaXMuZmllbGRLZXkuc2V0KHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5maWVsZEtleSA/PyB0aGlzLmZpZWxkS2V5RGVmYXVsdCgpKTtcbiAgICB0aGlzLnNlbGVjdEZpcnN0SXRlbS5zZXQoZmFsc2UpO1xuICAgIGlmICh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8ub25seVNlbGVjdEZpcnN0SXRlbSB8fCAoIXRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGggJiYgdGhpcy5jb25maWcoKT8uYXV0b1NlbGVjdEZpcnN0SXRlbSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0Rmlyc3RJdGVtLnNldCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKCk7XG5cbiAgICB0aGlzLm9uVXBkYXRlTXVsdGlLZXlTZWxlY3RlZEdyb3VwKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdG9yZSgpIHx8ICF0aGlzLnN0b3JlKCkubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMua2V5c0NoZWNrZWQuc2V0KFtdKTtcblxuICAgICAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5jbGVhcigpO1xuICAgICAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICAgICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RvcmUoKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGlzRW1wdHkoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgICAgICBpdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgICBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0gPSBgJHt0aGlzLlBBVFRFUk5fRkFLRV9JRH0ke3V1aWQoKX1gO1xuXG4gICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgICAgICBjb25zdCBpdGVtTWFwID0gY2xvbmVEZWVwKGl0ZW0pIGFzIFdyaXRhYmxlU2lnbmFsPGFueT47XG5cbiAgICAgICAgICBpdGVtTWFwLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5yZWYgPSBpdGVtO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXRlbUdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrZWRHcm91cEl0ZW1zKGl0ZW1Hcm91cCgpLCBpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGggJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/LmZpbmQoKGtleSkgPT4ga2V5ID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgaXRlbU1hcCwgZmFsc2UsICFjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tdWx0aUtleVNlbGVjdGVkLnNldChbXSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoZWNrZWRPclVuQ2hlY2tlZEFsbChjaGVja2VkOiBib29sZWFuKSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY2hlY2tlZCkge1xuICAgICAgdGhpcy5pdGVtcygpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcbiAgICAgICAgY29uc3QgaXRlbXNPZkdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgICAgIGlmIChpdGVtc09mR3JvdXAgJiYgaXRlbXNPZkdyb3VwKCkgJiYgaXRlbXNPZkdyb3VwKCkubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVDaGVja2VkSXRlbXNDaGlsZChpdGVtc09mR3JvdXAoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRLZXlzQ2hlY2tlZEJ5TWFwcGluZ0NoZWNrZWQoZmFsc2UpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pdGVtcygpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLnNldChpdGVtKClbdGhpcy5maWVsZEtleSgpXSwgaXRlbSgpKTtcbiAgICAgIGNvbnN0IGl0ZW1zT2ZHcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgaWYgKGl0ZW1zT2ZHcm91cCAmJiBpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zT2ZHcm91cCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tlZEdyb3VwSXRlbXMoaXRlbXM/OiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+PiwgcGFyZW50PzogV3JpdGFibGVTaWduYWw8YW55Pikge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXNOaWwoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pIHx8IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSAnJykge1xuICAgICAgICBpdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbUdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuICAgICAgY29uc3QgaXRlbU1hcCA9IGNsb25lRGVlcChpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuXG4gICAgICBpdGVtTWFwLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LnJlZiA9IGl0ZW07XG4gICAgICAgIGN1cnJlbnQucGFyZW50SXRlbSA9IHBhcmVudDtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGl0ZW1Hcm91cCkge1xuICAgICAgICB0aGlzLmNoZWNrZWRHcm91cEl0ZW1zKGl0ZW1Hcm91cCgpLCBpdGVtKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKSAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5maW5kKChrZXkpID0+IGtleSA9PT0gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgaXRlbU1hcCwgZmFsc2UsICFjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZChmYWxzZSwgaXRlbU1hcCwgZmFsc2UsICFjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0J1dHRvbkdyb3VwKGJ1dHRvbkluR3JvdXA6IElCdXR0b24sIGl0ZW06IGFueSkge1xuICAgIGJ1dHRvbkluR3JvdXAuYWN0aW9uPy4oaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclRvZ2dsZUV4cGFuZChlOiB1bmtub3duLCBpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+LCBhY2NlcHRFdmVudCA9IHRydWUpIHtcbiAgICBpZiAoIWFjY2VwdEV2ZW50IHx8IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5pZ25vcmVDbGlja0xhYmVsR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgaXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgIGN1cnJlbnQuZXhwYW5kID0gIWN1cnJlbnQuZXhwYW5kO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVZpZXcoKSB7XG4gICAgdGhpcy5yZWZyZXNoVmlldygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZChpdGVtOiBhbnkpIHtcbiAgICBjb25zdCBjaGVja2VkID0gIXRoaXMua2V5c0NoZWNrZWQoKS5zb21lKChrZXkpID0+IGl0ZW1bdGhpcy5maWVsZEtleSgpXSA9PT0ga2V5KTtcblxuICAgIGlmICghY2hlY2tlZCAmJiB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uaXNWaWV3UmFkaW8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZChjaGVja2VkLCBzaWduYWwoaXRlbSksIGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlQ2hlY2tlZChjaGVja2VkOiBib29sZWFuLCBpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+LCBpc0NsaWNrTWFudWFsOiBib29sZWFuLCBpc0NoZWNrZWRCeURlZmF1bHRLZXk/OiBib29sZWFuKSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlSnNvbiAmJiBpdGVtKCkubGV2ZWwgIT09IGl0ZW0oKS5tYXhMZXZlbEdyb3VwICYmIChjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94R3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWZJdGVtID0gKGl0ZW0oKS5yZWYgfHwgaXRlbSkgYXMgV3JpdGFibGVTaWduYWw8YW55PjtcblxuICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pIHtcbiAgICAgIGNoZWNrZWQgPSB0cnVlO1xuICAgICAgY29uc3QgbWFwcGluZ0l0ZW1zQ2hlY2tlZFRlbXAgPSBjbG9uZURlZXAodGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKSBhcyBXcml0YWJsZVNpZ25hbDxNYXA8c3RyaW5nLCBhbnk+PjtcblxuICAgICAgZm9yIChjb25zdCBba2V5LCBpdGVtQ2hlY2tdIG9mIG1hcHBpbmdJdGVtc0NoZWNrZWRUZW1wKCkpIHtcbiAgICAgICAgY29uc3QgaXRlbUJ5S2V5ID0gdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZ2V0KGtleSk7XG5cbiAgICAgICAgaXRlbUJ5S2V5LmlzQ2hlY2tNYW51YWwgPSBmYWxzZTtcbiAgICAgICAgZGVsZXRlIGl0ZW1CeUtleS5yZWYuaXNDaGVja01hbnVhbDtcbiAgICAgICAgaWYgKCFpdGVtQ2hlY2sucmVmLmlzQ2hlY2tlZEJ5RGVmYXVsdEtleSkge1xuICAgICAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmRlbGV0ZShrZXkpO1xuICAgICAgICAgIHRoaXMub3V0VW5TZWxlY3RNdWx0aUtleS5lbWl0KFtrZXldKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgaXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LmlzQ2hlY2tNYW51YWwgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZWZJdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuaXNDaGVja01hbnVhbCA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zT2ZHcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAvLyBi4buPIGNo4buNbiB04bqldCBj4bqjIGPDoWMgaXRlbSDEkeG7gyB0aOG7sWMgaGnhu4duIGNoZWNrIGzhuqFpXG4gICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZUpzb24gfHwgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbUJ5VHJlZSAmJiAhaXNDaGVja2VkQnlEZWZhdWx0S2V5ICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLm5vdENoYW5nZVN0YXRlSXRlbUNoZWNrT3RoZXIpKSB7XG4gICAgICBBcnJheS5mcm9tKHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLnZhbHVlcygpKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGRlbGV0ZSBpdGVtLmlzQ2hlY2tNYW51YWw7XG4gICAgICAgIHJlZkl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgZGVsZXRlIGN1cnJlbnQuaXNDaGVja01hbnVhbDtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLm91dFVuU2VsZWN0TXVsdGlLZXkuZW1pdCh0aGlzLmtleXNDaGVja2VkKCkpO1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuY2xlYXIoKTtcbiAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGlzQ2xpY2tNYW51YWwsIGl0ZW0pO1xuICAgIH1cblxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICB0aGlzLmV4cGFuZEFsbEl0ZW1zSW5Hcm91cChpdGVtKTtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLnNldChpdGVtKClbdGhpcy5maWVsZEtleSgpXSwgaXRlbSgpKTtcbiAgICAgIGlmIChpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgcmVmSXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LmlzQ2hlY2tlZEJ5RGVmYXVsdEtleSA9IGlzQ2hlY2tlZEJ5RGVmYXVsdEtleTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQuaXNDaGVja2VkQnlEZWZhdWx0S2V5ID0gcmVmSXRlbSgpLmlzQ2hlY2tlZEJ5RGVmYXVsdEtleTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2hvb3NlQ2hpbGRUaGVuQXV0b0Nob29zZVBhcmVudCkge1xuICAgICAgICAvLyBjaOG7iSBjaOG7jW4gY8OhYyBjaGEgdHLDqm4gY8O5bmcgdHJlZSwga28gcXVhbiB0w6JtIG5vZGUgY2hhIGPDsyBjw6FjIGNvbiDEkcOjIMSRYyB0w61jaCBo4bq/dCBjaMawYVxuICAgICAgICBpdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuaXNDaGVja01hbnVhbCA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlZkl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWN1cnNpdmVseUNoZWNrZWRQYXJlbnRCeVRyZWUoaXRlbSgpLnBhcmVudEl0ZW0pO1xuXG4gICAgICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaG9vc2VQYXJlbnRUaGVuQXV0b0Nob29zZUNoaWxkcmVuICYmICFpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNPZkdyb3VwPy4oKSB8fCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRLZXlzQ2hlY2tlZEJ5TWFwcGluZ0NoZWNrZWQoaXNDbGlja01hbnVhbCwgaXRlbSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hvb3NlUGFyZW50VGhlbkF1dG9DaG9vc2VDaGlsZHJlbikge1xuICAgICAgICAvLyBs4buxYSBjaOG7jW4gbm9kZSBjaGEgc+G6vSBi4buPIHF1YSB2aeG7h2MgY2jhu41uIHThuqV0IGPhuqMgbm9kZSBjb25cbiAgICAgICAgdGhpcy5zZXRLZXlzQ2hlY2tlZEJ5TWFwcGluZ0NoZWNrZWQoaXNDbGlja01hbnVhbCwgaXRlbSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1zT2ZHcm91cCAmJiBpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGggJiYgIWlzQ2hlY2tlZEJ5RGVmYXVsdEtleSAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlSnNvbikge1xuICAgICAgICBjb25zdCBpdGVtc0NoYW5nZSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hhbmdlQ2hpbGRyZW5EaXNhYmxlV2hlbkNoYW5nZVBhcmVudCA/IGl0ZW1zT2ZHcm91cCgpLmZpbHRlcigoaXRlbTogYW55KSA9PiAhdGhpcy5rZXlzRGlzYWJsZUl0ZW0oKT8uZmluZCgoa2V5KSA9PiBrZXkgPT09IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSkgOiBpdGVtc09mR3JvdXAoKTtcblxuICAgICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNDaGFuZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLm5vdENoYW5nZVN0YXRlSXRlbUNoZWNrT3RoZXIgJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZUpzb24pIHtcbiAgICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc1BhcmVudChpdGVtKCkucGFyZW50SXRlbSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChpc0NsaWNrTWFudWFsLCBpdGVtKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gZmFsc2U7XG5cbiAgICAgIGlmIChpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgY3VycmVudC5pc0NoZWNrZWRCeURlZmF1bHRLZXkgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgcmVmSXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgIGN1cnJlbnQuaXNDaGVja01hbnVhbCA9IGZhbHNlO1xuXG4gICAgICBpZiAoaXNDaGVja2VkQnlEZWZhdWx0S2V5KSB7XG4gICAgICAgIGN1cnJlbnQuaXNDaGVja2VkQnlEZWZhdWx0S2V5ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmRlbGV0ZShpdGVtKClbdGhpcy5maWVsZEtleSgpXSk7XG4gICAgdGhpcy5rZXlzQ2hlY2tlZC5zZXQoQXJyYXkuZnJvbSh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5rZXlzKCkpKTtcblxuICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLm5vdENoYW5nZVN0YXRlSXRlbUNoZWNrT3RoZXIpIHtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmRlbGV0ZShpdGVtKClbdGhpcy5maWVsZEtleSgpXSk7XG4gICAgICB0aGlzLm91dFVuU2VsZWN0TXVsdGlLZXkuZW1pdCghaXNFbXB0eShpdGVtKClbdGhpcy5maWVsZEtleSgpXSkgPyBbaXRlbSgpW3RoaXMuZmllbGRLZXkoKV1dIDogW10pO1xuICAgICAgdGhpcy5zZXRLZXlzQ2hlY2tlZEJ5TWFwcGluZ0NoZWNrZWQoaXNDbGlja01hbnVhbCwgaXRlbSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlVW5zZWxlY3RDaGlsZHJlblJlbW92ZVNlbGVjdFBhcmVudCkge1xuICAgICAgdGhpcy5yZWN1cnNpdmVseUNoZWNrZWRQYXJlbnRCeVRyZWUoaXRlbSgpLnBhcmVudEl0ZW0pO1xuICAgIH1cblxuICAgIC8vIG7hur91IGtvIHBo4bqjaSB0csaw4budbmcgaMahcCBj4bunYSBiYW5rIHbDoCBkYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSB0aMOsIGLhu48gY2hhIHPhur0gYuG7jyBjb25cbiAgICBpZiAoaXRlbXNPZkdyb3VwICYmIGl0ZW1zT2ZHcm91cCgpICYmIGl0ZW1zT2ZHcm91cCgpLmxlbmd0aCkge1xuICAgICAgY29uc3QgaXRlbXNDaGFuZ2UgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoYW5nZUNoaWxkcmVuRGlzYWJsZVdoZW5DaGFuZ2VQYXJlbnQgPyBpdGVtc09mR3JvdXAoKS5maWx0ZXIoKGl0ZW0pID0+ICF0aGlzLmtleXNEaXNhYmxlSXRlbSgpPy5maW5kKChrZXkpID0+IGtleSA9PT0gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pKSA6IGl0ZW1zT2ZHcm91cCgpO1xuXG4gICAgICB0aGlzLnJlbW92ZUNoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zQ2hhbmdlKTtcbiAgICB9XG4gICAgaWYgKGl0ZW0oKS5wYXJlbnRJdGVtICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVVuc2VsZWN0Q2hpbGRyZW5SZW1vdmVTZWxlY3RQYXJlbnQpIHtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmRlbGV0ZShpdGVtKCkucGFyZW50SXRlbVt0aGlzLmZpZWxkS2V5KCldKTtcbiAgICB9XG4gICAgdGhpcy5zZXRLZXlzQ2hlY2tlZEJ5TWFwcGluZ0NoZWNrZWQoaXNDbGlja01hbnVhbCwgaXRlbSk7XG4gIH1cblxuICBwcml2YXRlIGdldEl0ZW1zT2ZHcm91cChpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+LCBzdG9yZXM6IFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+Pikge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhc3RvcmVzIHx8ICFzdG9yZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiBzdG9yZXMoKSkge1xuICAgICAgaWYgKGdyb3VwKClbdGhpcy5maWVsZEtleSgpXSA9PT0gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmdldEl0ZW1zT2ZHcm91cChpdGVtLCBncm91cCgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10pIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBwcml2YXRlIHNldEtleXNTdGlsbE90aGVyT3B0aW9ucyhpdGVtPzogV3JpdGFibGVTaWduYWw8YW55Pikge1xuICAgIGlmICghaXRlbT8uKCkpIHtcbiAgICAgIHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zLnNldChbXSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5c0NoZWNrZWQgPSBBcnJheS5mcm9tKHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmtleXMoKSk7XG4gICAgY29uc3QgaXRlbVBhcmVudCA9IGl0ZW0oKS5wYXJlbnRJdGVtIGFzIFdyaXRhYmxlU2lnbmFsPGFueT47XG4gICAgY29uc3QgaW5kZXhJdGVtID0gdGhpcy5rZXlzU3RpbGxPdGhlck9wdGlvbnMoKS5maW5kSW5kZXgoKGtleSkgPT4ga2V5ID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSk7XG5cbiAgICBpZiAoaW5kZXhJdGVtID49IDApIHtcbiAgICAgIHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpbmRleEl0ZW0sIDEpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFpdGVtUGFyZW50IHx8ICFpdGVtUGFyZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNPZkdyb3VwUGFyZW50ID0gdGhpcy5nZXRJdGVtc09mR3JvdXAoaXRlbVBhcmVudCwgdGhpcy5zdG9yZSk7XG5cbiAgICBpZiAoIWl0ZW1zT2ZHcm91cFBhcmVudCB8fCAhaXRlbXNPZkdyb3VwUGFyZW50KCkgfHwgIWl0ZW1zT2ZHcm91cFBhcmVudCgpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleFBhcmVudCA9IHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zKCkuZmluZEluZGV4KChrZXkpID0+IGtleSA9PT0gaXRlbVBhcmVudCgpW3RoaXMuZmllbGRLZXkoKV0pO1xuXG4gICAgaWYgKGl0ZW1zT2ZHcm91cFBhcmVudCgpLmV2ZXJ5KChlbGVtZW50KSA9PiBrZXlzQ2hlY2tlZC5pbmNsdWRlcyhlbGVtZW50KClbdGhpcy5maWVsZEtleSgpXSkpICYmIGluZGV4UGFyZW50ID49IDApIHtcbiAgICAgIHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpbmRleEl0ZW0sIDEpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGl0ZW1zT2ZHcm91cFBhcmVudCgpLnNvbWUoKGVsZW1lbnQpID0+IGtleXNDaGVja2VkLmluY2x1ZGVzKGVsZW1lbnQoKVt0aGlzLmZpZWxkS2V5KCldKSkgJiYgaW5kZXhQYXJlbnQgPCAwKSB7XG4gICAgICB0aGlzLmtleXNTdGlsbE90aGVyT3B0aW9ucy51cGRhdGUoKGN1cnJlbnQpID0+IFsuLi5jdXJyZW50LCBpdGVtUGFyZW50KClbdGhpcy5maWVsZEtleSgpXV0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmRleFBhcmVudCA+PSAwKSB7XG4gICAgICB0aGlzLmtleXNTdGlsbE90aGVyT3B0aW9ucy51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5zcGxpY2UoaW5kZXhJdGVtLCAxKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGlzQ2xpY2tNYW51YWw6IGJvb2xlYW4sIGl0ZW0/OiBXcml0YWJsZVNpZ25hbDxhbnk+KSB7XG4gICAgdGhpcy5rZXlzQ2hlY2tlZC5zZXQoQXJyYXkuZnJvbSh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5rZXlzKCkpKTtcbiAgICB0aGlzLmVtaXRNdWx0aUtleUNoZWNrZWQoaXNDbGlja01hbnVhbCk7XG4gICAgdGhpcy5zZXRLZXlzU3RpbGxPdGhlck9wdGlvbnMoaXRlbSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRNdWx0aUtleUNoZWNrZWQoaXNDbGlja01hbnVhbCA9IHRydWUpIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGF0YU11bHRpS2V5Q2hlY2tlZDogSUxpc3REYXRhRW1pdE11bHRpS2V5ID0geyBrZXlzOiBuZXcgQXJyYXk8YW55PigpLCBtYXBLZXlzOiBuZXcgQXJyYXk8SUxpc3REYXRhRW1pdEtleT4oKSwgaXNDbGlja01hbnVhbCB9O1xuXG4gICAgaWYgKChjb25maWdUZW1wbGF0ZUdyb3VwLmVtaXRBbGxJdGVtQ2hlY2tlZCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmNob29zZUNoaWxkVGhlbkF1dG9DaG9vc2VQYXJlbnQpICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUVtaXRBbGxJdGVtQ2hlY2tlZFdoZW5DaG9vc2VDaGlsZFRoZW5BdXRvQ2hvb3NlUGFyZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGl0ZW1dIG9mIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpKSB7XG4gICAgICAgIGRhdGFNdWx0aUtleUNoZWNrZWQua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIGRhdGFNdWx0aUtleUNoZWNrZWQubWFwS2V5cy5wdXNoKHsga2V5LCBpdGVtOiBpdGVtLnJlZj8uKCkgfHwgaXRlbSwgaXNDbGlja01hbnVhbCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdChkYXRhTXVsdGlLZXlDaGVja2VkKTtcbiAgICAgIHRoaXMudG90YWxJdGVtQ2hlY2tlZC5zZXQoZGF0YU11bHRpS2V5Q2hlY2tlZC5rZXlzLmxlbmd0aCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGl0ZW1dIG9mIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW1bdGhpcy5maWVsZEtleSgpXSAmJlxuICAgICAgICAhU3RyaW5nKGl0ZW1bdGhpcy5maWVsZEtleSgpXSkuaW5jbHVkZXModGhpcy5QQVRURVJOX0ZBS0VfSUQpICYmXG4gICAgICAgIChpc0VtcHR5KGl0ZW1bY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSkgfHwgIWl0ZW1bY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSgpLnNvbWUoKGl0ZW1Hcm91cDogV3JpdGFibGVTaWduYWw8YW55PikgPT4gdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZ2V0KGl0ZW1Hcm91cCgpW3RoaXMuZmllbGRLZXkoKV0pKSlcbiAgICAgICkge1xuICAgICAgICBkYXRhTXVsdGlLZXlDaGVja2VkLmtleXMucHVzaChrZXkpO1xuICAgICAgICBkYXRhTXVsdGlLZXlDaGVja2VkLm1hcEtleXMucHVzaCh7IGtleSwgaXRlbTogaXRlbS5yZWY/LigpIHx8IGl0ZW0sIGlzQ2xpY2tNYW51YWwgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdChkYXRhTXVsdGlLZXlDaGVja2VkKTtcbiAgICB0aGlzLnRvdGFsSXRlbUNoZWNrZWQuc2V0KGRhdGFNdWx0aUtleUNoZWNrZWQua2V5cy5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWN1cnNpdmVseUNoZWNrZWRQYXJlbnRCeVRyZWUoaXRlbTogYW55KSB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLnNldChpdGVtW3RoaXMuZmllbGRLZXkoKV0sIGl0ZW0oKSk7XG4gICAgdGhpcy5yZWN1cnNpdmVseUNoZWNrZWRQYXJlbnRCeVRyZWUoaXRlbS5wYXJlbnRJdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hlY2tDaGVja2VkSXRlbXNQYXJlbnQoaXRlbTogV3JpdGFibGVTaWduYWw8YW55Pikge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc09mR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICBpZiAoIWl0ZW1zT2ZHcm91cCgpIHx8ICFpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtR3JvdXAgb2YgaXRlbXNPZkdyb3VwKCkpIHtcbiAgICAgIGlmICghdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuaGFzKGl0ZW1Hcm91cCgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuc2V0KGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldLCBpdGVtKCkpO1xuICAgIGlmIChpdGVtKCkucGFyZW50SXRlbSkge1xuICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc1BhcmVudChpdGVtKCkucGFyZW50SXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGVja0NoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pikge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5zZXQoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0sIGl0ZW0oKSk7XG4gICAgICBjb25zdCBpdGVtc09mR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIGlmIChpdGVtc09mR3JvdXAgJiYgaXRlbXNPZkdyb3VwKCkgJiYgaXRlbXNPZkdyb3VwKCkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2V0Q2hlY2tDaGVja2VkSXRlbXNDaGlsZChpdGVtc09mR3JvdXAoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUNoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pikge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LmlzQ2hlY2tNYW51YWwgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcbiAgICAgIHRoaXMub3V0VW5TZWxlY3RNdWx0aUtleS5lbWl0KFtpdGVtKClbdGhpcy5maWVsZEtleSgpXV0pO1xuXG4gICAgICBjb25zdCBpdGVtc09mR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIGlmIChpdGVtc09mR3JvdXAgJiYgaXRlbXNPZkdyb3VwKCkgJiYgaXRlbXNPZkdyb3VwKCkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNPZkdyb3VwKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NTZWFyY2goKSB7XG4gICAgdGhpcy5wcm9jZXNzRGF0YSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NEYXRhKCk6IHZvaWQge1xuICAgIHRoaXMudG90YWxJdGVtLnNldCgwKTtcblxuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpdGVtcyA9IHRoaXMuc3RvcmUoKS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpc05pbChpdGVtKClbdGhpcy5maWVsZEtleSgpXSkgfHwgaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPT09ICcnKSB7XG4gICAgICAgIGl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudFt0aGlzLmZpZWxkS2V5KCldID0gYCR7dGhpcy5QQVRURVJOX0ZBS0VfSUR9JHt1dWlkKCl9YDtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtTWFwID0gY2xvbmVEZWVwKGl0ZW0pIGFzIFdyaXRhYmxlU2lnbmFsPGFueT47XG4gICAgICBpdGVtTWFwLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LnJlZiA9IGl0ZW07XG4gICAgICAgIGN1cnJlbnQuaXNSb290ID0gdHJ1ZTtcbiAgICAgICAgY3VycmVudC5leHBhbmQgPSB0aGlzLmtleVNlYXJjaCgpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBjdXJyZW50Lm1heExldmVsR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TWF4TGV2ZWxHcm91cChpdGVtKCkpO1xuICAgICAgICBjdXJyZW50LmxldmVsID0gdGhpcy5sZXZlbCgpO1xuICAgICAgICBjdXJyZW50LnRleHREZXNjcmlwdGlvbkdyb3VwV2hlbk5vRGF0YSA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXREZXNjcmlwdGlvbkdyb3VwV2hlbk5vRGF0YT8uKGl0ZW0oKSk7XG4gICAgICAgIGN1cnJlbnQuaWNvbkVtcHR5RGF0YUluR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0SWNvbkVtcHR5RGF0YUluR3JvdXA/LihpdGVtKCkpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoKGl0ZW1NYXAoKS5sZXZlbCA9PT0gaXRlbU1hcCgpLm1heExldmVsR3JvdXAgfHwgIXRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5pZ25vcmVDaGVja2JveEdyb3VwKSAmJiAhU3RyaW5nKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKT8uaW5jbHVkZXModGhpcy5QQVRURVJOX0ZBS0VfSUQpKSB7XG4gICAgICAgIHRoaXMudG90YWxJdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4gY3VycmVudCsrKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5rZXlTZWFyY2goKSAmJiB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0RXhwYW5kR3JvdXApIHtcbiAgICAgICAgaXRlbU1hcC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LmV4cGFuZCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRFeHBhbmRHcm91cD8uKGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRQb3BvdmVyR3JvdXApIHtcbiAgICAgICAgaXRlbU1hcC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LmRhdGFQb3BvdmVyID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldFBvcG92ZXJHcm91cD8uKGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRCdXR0b25Hcm91cCkge1xuICAgICAgICBpdGVtTWFwLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuYnV0dG9uSW5Hcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRCdXR0b25Hcm91cD8uKGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdGV4dCA9IGRlbGV0ZVVuaWNvZGUodGhpcy5idWlsZFZhbHVlQnlDb25maWcoaXRlbU1hcCkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB0ZXh0RXNjYXBlID0gZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICAgIGNvbnN0IGtleVNlYXJjaCA9IGRlbGV0ZVVuaWNvZGUoZXNjYXBlSHRtbCgodGhpcy5rZXlTZWFyY2goKSB8fCAnJykudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCkpKTtcblxuICAgICAgaXRlbU1hcC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5kaXNwbGF5QWxsQ2hpbGQgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFrZXlTZWFyY2ggfHwgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5zZWFyY2hBbGxMZXZlbCAmJiAodGV4dC5pbmNsdWRlcyhrZXlTZWFyY2gpIHx8IHRleHRFc2NhcGUuaW5jbHVkZXMoa2V5U2VhcmNoKSkpKSB7XG4gICAgICAgIGl0ZW1NYXAudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5kaXNwbGF5QWxsQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGN1cnJlbnQuaGFzRGlzcGxheSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIGl0ZW1NYXAudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmlsdGVySXRlbXNEaXNwbGF5KHRoaXMuY29udmVydERhdGFCeUdyb3VwSW5JdGVtKGl0ZW1Hcm91cD8uKCkgfHwgW10sIGl0ZW1NYXApKTtcblxuICAgICAgICBjaGlsZHJlbj8uc2V0KGRhdGEpO1xuICAgICAgICBpZiAoY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKSkge1xuICAgICAgICAgIGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXS51cGRhdGUoKGl0ZW1GaWVsZHM6IEFycmF5PGFueT4pID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbUZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1GaWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtRmllbGRzWzBdLmlzRmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gaXRlbUZpZWxkcz8ubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgIGl0ZW1GaWVsZHNbbGFzdEluZGV4XS5pc0xhc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaXRlbUZpZWxkcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmJvbnVzUGFkZGluZ0xlZnQgPSAwO1xuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRCb251c1BhZGRpbmdMZWZ0SXRlbSkge1xuICAgICAgICAgIGN1cnJlbnQuYm9udXNQYWRkaW5nTGVmdCA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Qm9udXNQYWRkaW5nTGVmdEl0ZW0oY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbU5vRGF0YSkge1xuICAgICAgICAgIGN1cnJlbnQuY2xhc3NJbmNsdWRlSXRlbU5vRGF0YSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbU5vRGF0YShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmF2YXRhckNvbmZpZyA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0QXZhdGFyQ29uZmlnKGN1cnJlbnQpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5tdWx0aUtleVNlbGVjdGVkKCkgJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/Lmxlbmd0aCAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8uc29tZSgoa2V5KSA9PiBrZXkgPT09IGl0ZW1NYXAoKVt0aGlzLmZpZWxkS2V5KCldKSkge1xuICAgICAgICB0aGlzLmhhbmRsZXJDaGFuZ2VDaGVja2VkKHRydWUsIGl0ZW1NYXAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYnVpbGRWYWx1ZUJ5Q29uZmlnKGl0ZW1NYXApO1xuXG4gICAgICByZXR1cm4gaXRlbU1hcDtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uc2VhcmNoQWxsTGV2ZWwgJiYgdGhpcy5rZXlTZWFyY2goKSkge1xuICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0oKS5oYXNEaXNwbGF5O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnKCk/LnNvcnQ/LihpdGVtcyk7XG4gICAgdGhpcy5pdGVtcy5zZXQoaXRlbXMpO1xuICAgIHRoaXMubXVsdGlLZXlTZWxlY3RlZC5zZXQoW10pO1xuICAgIGNvbnN0IGNhbGxCYWNrQ2FsY3VsYXRvckhlaWdodFN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNhbGN1bGF0b3JIZWlnaEl0ZW1TdWNjZXNzLnNldCh0cnVlKTtcblxuICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZXhwYW5kRmlyc3RJdGVtICYmIHRoaXMuaXRlbXMoKVswXSkge1xuICAgICAgICB0aGlzLmV4cGFuZEFsbEl0ZW1zSW5Hcm91cCh0aGlzLml0ZW1zKClbMF0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldEhlaWdodFZpZXdQb3J0KCk7XG4gICAgICBpZiAodGhpcy5maXJzdEl0ZW1TZWxlY3RlZCAmJiB0aGlzLmZpcnN0SXRlbVNlbGVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCB0aGlzLmZpcnN0SXRlbVNlbGVjdGVkLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZmlyc3RJdGVtU2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBjaGVja0xvYWRJdGVtID0gKHByZVN0YXRlSGFzU2Nyb2xsOiBib29sZWFuLCBjdXJyZW50SGFzU2Nyb2xsOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAodGhpcy5rZXlzSGlkZGVuSXRlbSgpPy5sZW5ndGggJiYgcHJlU3RhdGVIYXNTY3JvbGwgJiYgIWN1cnJlbnRIYXNTY3JvbGwgJiYgdGhpcy5pc1NlYXJjaE9ubGluZSgpKSB7XG4gICAgICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZShmYWxzZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgICB0aGlzLnJlZnJlc2hWaWV3KGNhbGxCYWNrQ2FsY3VsYXRvckhlaWdodFN1Y2Nlc3MsIGNoZWNrTG9hZEl0ZW0pO1xuICAgICAgdGhpcy5vdXRMb2FkSXRlbXNDb21wbGV0ZS5lbWl0KHsgaXRlbXM6IHRoaXMuaXRlbXMoKSB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFZpZXcoY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2Vzcz86ICgpID0+IHZvaWQsIGNoZWNrTG9hZEl0ZW0/OiAocHJlU3RhdGVIYXNTY3JvbGw6IGJvb2xlYW4sIGN1cnJlbnRIYXNTY3JvbGw6IGJvb2xlYW4pID0+IHZvaWQpIHtcbiAgICB0aGlzLnNldEhlaWdodFZpZXdQb3J0KGNhbGxCYWNrQ2FsY3VsYXRvckhlaWdodFN1Y2Nlc3MpO1xuICAgIHRoaXMuY2hlY2tWaWV3UG9ydFNjcm9sbChjaGVja0xvYWRJdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwYW5kQWxsSXRlbXNJbkdyb3VwKGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0KGl0ZW0sICdleHBhbmQnLCB0cnVlKTtcbiAgICBjb25zdCBpdGVtczogQXJyYXk8YW55PiA9IGl0ZW1bY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXTtcblxuICAgIGlmIChpc0VtcHR5KGl0ZW1zKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtR3JvdXApID0+IHRoaXMuZXhwYW5kQWxsSXRlbXNJbkdyb3VwKGl0ZW1Hcm91cCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YUJ5R3JvdXBJbkl0ZW0oaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+LCBwYXJlbnRJdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc01hcCA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGlzTmlsKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSB8fCBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9PT0gJycpIHtcbiAgICAgICAgaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPSBgJHt0aGlzLlBBVFRFUk5fRkFLRV9JRH0ke3V1aWQoKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbU1hcCA9IGNsb25lRGVlcChpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuXG4gICAgICBpdGVtTWFwLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LnJlZiA9IGl0ZW07XG4gICAgICAgIGN1cnJlbnQucGFyZW50SXRlbSA9IHBhcmVudEl0ZW07XG4gICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldO1xuXG4gICAgICAgIGN1cnJlbnQubWF4TGV2ZWxHcm91cCA9IHBhcmVudEl0ZW0oKS5tYXhMZXZlbEdyb3VwO1xuICAgICAgICBjdXJyZW50LmxldmVsID0gcGFyZW50SXRlbSgpLmxldmVsICsgMTtcbiAgICAgICAgY3VycmVudC5hcnJheUxldmVsID0gcmFuZ2UoMiwgY3VycmVudC5sZXZlbCArIDEpO1xuICAgICAgICBpZiAoKGN1cnJlbnQubGV2ZWwgPT09IGN1cnJlbnQubWF4TGV2ZWxHcm91cCB8fCAhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEl0ZW0pICYmICFTdHJpbmcoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pPy5pbmNsdWRlcyh0aGlzLlBBVFRFUk5fRkFLRV9JRCkpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IGN1cnJlbnQrKyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50LmV4cGFuZCA9IHRoaXMua2V5U2VhcmNoKCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5rZXlTZWFyY2goKSAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEV4cGFuZEl0ZW0pIHtcbiAgICAgICAgICBjdXJyZW50LmV4cGFuZCA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RXhwYW5kSXRlbShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmRpc3BsYXlBbGxDaGlsZCA9IHBhcmVudEl0ZW0oKS5kaXNwbGF5QWxsQ2hpbGQ7XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldFBvcG92ZXJJdGVtKSB7XG4gICAgICAgICAgY3VycmVudC5kYXRhUG9wb3ZlciA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0UG9wb3Zlckl0ZW0oY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SWNvbkltYWdlQ2xhc3MpIHtcbiAgICAgICAgICBjdXJyZW50Lmljb25JbWFnZUNsYXNzID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRJY29uSW1hZ2VDbGFzcyhjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0ID0gZGVsZXRlVW5pY29kZSh0aGlzLmJ1aWxkVmFsdWVCeUNvbmZpZyhpc1NpZ25hbChjdXJyZW50KSA/IChjdXJyZW50IGFzIFdyaXRhYmxlU2lnbmFsPGFueT4pIDogc2lnbmFsKGN1cnJlbnQpKS50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcbiAgICAgICAgY29uc3Qga2V5U2VhcmNoID0gZGVsZXRlVW5pY29kZShlc2NhcGVIdG1sKCh0aGlzLmtleVNlYXJjaCgpIHx8ICcnKS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKSkpO1xuICAgICAgICBjb25zdCB0ZXh0RXNjYXBlID0gZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLmtleXNIaWRkZW5JdGVtKCk/LnNvbWUoKGtleSkgPT4ga2V5ID09PSBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0pICYmXG4gICAgICAgICAgKHBhcmVudEl0ZW0oKS5kaXNwbGF5QWxsQ2hpbGQgfHwgIWtleVNlYXJjaCB8fCAoKGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgIWN1cnJlbnRbdGhpcy5maWVsZEtleSgpXS5pbmNsdWRlcyh0aGlzLlBBVFRFUk5fRkFLRV9JRCkpICYmICh0ZXh0LmluY2x1ZGVzKGtleVNlYXJjaCkgfHwgdGV4dEVzY2FwZS5pbmNsdWRlcyhrZXlTZWFyY2gpKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIGN1cnJlbnQuZGlzcGxheUFsbENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNldERpc3BsYXlJdGVtKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG4gICAgICAgIGlmIChpdGVtR3JvdXA/LigpKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmlsdGVySXRlbXNEaXNwbGF5KHRoaXMuY29udmVydERhdGFCeUdyb3VwSW5JdGVtKGl0ZW1Hcm91cD8uKCksIHNpZ25hbChjdXJyZW50KSkpO1xuICAgICAgICAgIGl0ZW1Hcm91cC5zZXQoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKSkge1xuICAgICAgICAgIGN1cnJlbnRbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXS51cGRhdGUoKGl0ZW1GaWVsZHM6IEFycmF5PGFueT4pID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbUZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1GaWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtRmllbGRzWzBdLmlzRmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gaXRlbUZpZWxkcz8ubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgIGl0ZW1GaWVsZHNbbGFzdEluZGV4XS5pc0xhc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaXRlbUZpZWxkcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LmJvbnVzUGFkZGluZ0xlZnQgPSAwO1xuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRCb251c1BhZGRpbmdMZWZ0SXRlbSkge1xuICAgICAgICAgIGN1cnJlbnQuYm9udXNQYWRkaW5nTGVmdCA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Qm9udXNQYWRkaW5nTGVmdEl0ZW0oY3VycmVudCwgcGFyZW50SXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbU5vRGF0YSkge1xuICAgICAgICAgIGN1cnJlbnQuY2xhc3NJbmNsdWRlSXRlbU5vRGF0YSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbU5vRGF0YShjdXJyZW50LCBwYXJlbnRJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvcikge1xuICAgICAgICAgIGN1cnJlbnQubGlua0ltYWdlRXJyb3IgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldExpbmtJbWFnZUVycm9yKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Db250ZW50KSB7XG4gICAgICAgICAgY3VycmVudC5jbGFzc0luY2x1ZGUgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldENsYXNzSW5jbHVkZUl0ZW1Db250ZW50KGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuYXZhdGFyQ29uZmlnID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRBdmF0YXJDb25maWcgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRBdmF0YXJDb25maWcoY3VycmVudCk7XG4gICAgICAgIGlmICh0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKSAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5zb21lKChrZXkpID0+IGtleSA9PT0gY3VycmVudFt0aGlzLmZpZWxkS2V5KCldKSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgc2lnbmFsKGN1cnJlbnQpLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0Rmlyc3RJdGVtKCkgJiYgY3VycmVudC5sZXZlbCA9PT0gY3VycmVudC5tYXhMZXZlbEdyb3VwKSB7XG4gICAgICAgICAgdGhpcy5maXJzdEl0ZW1TZWxlY3RlZC5zZXQoY3VycmVudCk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RGaXJzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBpdGVtTWFwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0ZW1zTWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREaXNwbGF5SXRlbShpdGVtOiBhbnkpIHtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0KGl0ZW0sICdoYXNEaXNwbGF5JywgdHJ1ZSk7XG5cbiAgICBjb25zdCBwYXJlbnRJdGVtID0gZ2V0KGl0ZW0sICdwYXJlbnRJdGVtJyk7XG4gICAgaWYgKGdldChwYXJlbnRJdGVtLCAnJykpIHtcbiAgICAgIHRoaXMuc2V0RGlzcGxheUl0ZW0ocGFyZW50SXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtc0Rpc3BsYXkoaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+KTogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4ge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgaXRlbXNEaXNwbGF5ID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtKCkuaGFzRGlzcGxheSk7XG5cbiAgICBpdGVtc0Rpc3BsYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgaXRlbUdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc107XG4gICAgICBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uc2V0KHRoaXMuZmlsdGVySXRlbXNEaXNwbGF5KGl0ZW1Hcm91cD8uKCkgfHwgW10pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpdGVtc0Rpc3BsYXk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TGVuZ3RoSXRlbSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGRhdGEgPSB7IGxlbmd0aDogdGhpcy5pdGVtcygpLmxlbmd0aCB9O1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoID4gdGhpcy5tYXhJdGVtU2hvdygpKSB7XG4gICAgICByZXR1cm4gZGF0YS5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuZ2V0TGVuZ3RoQWxsR3JvdXAodGhpcy5pdGVtcygpLCBkYXRhKTtcblxuICAgIHJldHVybiBkYXRhLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGVuZ3RoQWxsR3JvdXAoaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+LCBkYXRhOiB7IGxlbmd0aDogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgIWl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKCFpdGVtKCkuZXhwYW5kKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkYXRhLmxlbmd0aCArPSBncm91cD8uKCk/Lmxlbmd0aCB8fCAwO1xuICAgICAgaWYgKCghZ3JvdXA/LigpIHx8ICFncm91cD8uKCkubGVuZ3RoKSAmJiBpdGVtKCkubGV2ZWwgPT09IDEgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuYXV0b0NvdW50V2hlbkdyb3VwRW1wdHlJdGVtTGV2ZWwxKSkge1xuICAgICAgICBkYXRhLmxlbmd0aCArPSAxO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiB0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5nZXRMZW5ndGhBbGxHcm91cChncm91cCgpLCBkYXRhKTtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IHRoaXMubWF4SXRlbVNob3coKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldEhlaWdodEdyb3VwSGFzTGluZSgpIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cD8uaWdub3JlR3JvdXBMaW5lIHx8ICF0aGlzLml0ZW1zKCk/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGxldCBsZW5ndGggPSAwO1xuICAgIGxldCBjb3VudCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcygpKSB7XG4gICAgICBpZiAobGVuZ3RoID49IHRoaXMubWF4SXRlbVNob3coKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvdW50ICs9IDE7XG4gICAgICBsZW5ndGggKz0gMTtcbiAgICAgIGNvbnN0IGdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuICAgICAgY29uc3QgZGF0YSA9IHsgbGVuZ3RoOiBpdGVtKCkuZXhwYW5kID8gZ3JvdXA/LigpPy5sZW5ndGggfHwgMCA6IDAgfTtcblxuICAgICAgdGhpcy5nZXRMZW5ndGhBbGxHcm91cChncm91cCgpLCBkYXRhKTtcbiAgICAgIGxlbmd0aCArPSBkYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgbWFyZ2luVG9wSGFzTGluZSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAubWFyZ2luVG9wSGFzTGluZSB8fCA0O1xuICAgIGNvbnN0IGhlaWdodCA9IGNvdW50ID09PSAxID8gbWFyZ2luVG9wSGFzTGluZSA6IChjb3VudCAtIDEpICogKG1hcmdpblRvcEhhc0xpbmUgKiAzICsgMSk7XG5cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkVmFsdWVCeUNvbmZpZyhpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+KTogc3RyaW5nIHtcbiAgICBjb25zdCBsYWJlbFNlYXJjaCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbFNlYXJjaD8uKGl0ZW0oKSk7XG5cbiAgICBpZiAoaXRlbSgpLmlzUm9vdCkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRMYWJlbEdyb3VwKSB7XG4gICAgICAgIGl0ZW0oKS5maWVsZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsR3JvdXAoaXRlbSgpKSB8fCAnICcpO1xuXG4gICAgICAgIHJldHVybiBsYWJlbFNlYXJjaCA/PyBpdGVtKCkuZmllbGRMYWJlbDtcbiAgICAgIH1cbiAgICAgIGl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQuZmllbGRMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGN1cnJlbnQubGFiZWwgfHwgY3VycmVudC5uYW1lIHx8ICcgJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGl0ZW0oKS5maWVsZExhYmVsO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsSXRlbSkge1xuICAgICAgaXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5maWVsZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsSXRlbShjdXJyZW50KSB8fCAnICcpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBsYWJlbFNlYXJjaCA/PyBpdGVtKCkuZmllbGRMYWJlbDtcbiAgICB9XG4gICAgaXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgIGN1cnJlbnQuZmllbGRMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGN1cnJlbnQubGFiZWwgfHwgY3VycmVudC5uYW1lIHx8ICcgJyk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhYmVsU2VhcmNoID8/IGl0ZW0oKS5maWVsZExhYmVsO1xuICB9XG59XG4iLCJAaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAoKTsgYXMgY29uZmlnVGVtcGxhdGVHcm91cCkge1xuICBAbGV0IGNvbnN0SHRtbEhlaWdodFZpZXdQb3J0ID0gaGVpZ2h0Vmlld1BvcnQoKSA/IGhlaWdodFZpZXdQb3J0KCkgKyAncHgnIDogJzEwMCUnO1xuICBAbGV0IGNvbnN0SHRtbERpc2FibGUgPSBsb2FkaW5nKCkgfHwgZGlzYWJsZSgpIHx8IGZhbHNlO1xuICA8ZGl2XG4gICAgY2xhc3M9XCJsaWJzLXVpLWxpc3QtZ3JvdXAgb3ZlcmZsb3ctW2hpZGRlbl1cIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY29uc3RIdG1sSGVpZ2h0Vmlld1BvcnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsIHJlbGF0aXZlIG1pbi1oLVsyOHB4XVwiPlxuICAgICAgQGlmIChpdGVtcygpLmxlbmd0aCAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmNvbmZpZ0J1dHRvblNlbGVjdEFuZFVuZFNlbGVjdEl0ZW0/LigpOyBhcyBjb25maWdCdXR0b25TZWxlY3RJdGVtKSB7XG4gICAgICAgIDxkaXYgW2NsYXNzXT1cIidmbGV4IGl0ZW1zLWNlbnRlciBiZy1bI2ZmZmZmZl0gJyArIChjb25maWdCdXR0b25TZWxlY3RJdGVtLmNsYXNzSW5jbHVkZSA/PyAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnKVwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgIFt0eXBlXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uQ2hlY2tBbGw/LnR5cGUgPz8gJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvbkNoZWNrQWxsPy5sYWJlbCA/PyAnaTE4bl9zZWxlY3RfYWxsX3NlYXJjaGVkX3Jlc3VsdHMnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25DaGVja0FsbD8uY2xhc3NJbmNsdWRlIHx8ICdwci1bOHB4XSdcIlxuICAgICAgICAgICAgW2NsYXNzTGFiZWxdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25DaGVja0FsbD8uY2xhc3NMYWJlbCB8fCAnbGlicy11aS1mb250LWg2cidcIlxuICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uc3RIdG1sRGlzYWJsZVwiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNoZWNrZWRPclVuQ2hlY2tlZEFsbCh0cnVlKVwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtWyM5OTk5OTldXCI+fDwvZGl2PlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgIFt0eXBlXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8udHlwZSA/PyAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8ubGFiZWwgPz8gJ2kxOG5fdW5zZWxlY3RfYWxsX3NlYXJjaGVkX3Jlc3VsdHMnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25VbmNoZWNrQWxsPy5jbGFzc0luY2x1ZGUgfHwgJ3BsLVs4cHhdJ1wiXG4gICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvblVuY2hlY2tBbGw/LmNsYXNzTGFiZWwgfHwgJ2xpYnMtdWktZm9udC1oNnMnXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImNvbnN0SHRtbERpc2FibGVcIlxuICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDaGVja2VkT3JVbkNoZWNrZWRBbGwoZmFsc2UpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGl0ZW1zKCkubGVuZ3RoICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuY29uZmlnQ2hlY2tib3hDaGVja0FsbD8uKCk7IGFzIGNvbmZpZ0NoZWNrQm94KSB7XG4gICAgICAgIDxkaXYgW2NsYXNzXT1cIidmbGV4IGxpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsICcgKyAoY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVIYXNDb25maWdDaGVja0JveEFsbCA/PyAnIGJnLVsjZmZmZmZmXScpXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGVcbiAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWdDaGVja0JveC5sYWJlbCA/PyAnaTE4bl9hbGwnXCJcbiAgICAgICAgICAgIFtjbGFzc0xhYmVsSW5jbHVkZV09XCJjb25maWdDaGVja0JveC5jbGFzc0xhYmVsSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJ0b3RhbEl0ZW1DaGVja2VkKCkgPj0gdG90YWxJdGVtKCkgJiYgdG90YWxJdGVtKCkgPiAwXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImNvbnN0SHRtbERpc2FibGVcIlxuICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyKT1cImhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudClcIlxuICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hlY2tlZE9yVW5DaGVja2VkQWxsKCRldmVudC5jaGVja2VkKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChpdGVtcygpICYmIGl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIHJlbGF0aXZlIGZsZXhcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIGFic29sdXRlIHRvcC0wIGxlZnQtMCB7eyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZUdyb3VwID8gY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVHcm91cCA6ICcnIH19XCI+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zKCk7IHRyYWNrIGl0ZW0oKVtmaWVsZEtleSgpXTsgbGV0IGZpcnN0ID0gJGZpcnN0OyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAjaXRlbVJlZlxuICAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW5Ub3AucHhdPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlR3JvdXBMaW5lID8gY29uZmlnVGVtcGxhdGVHcm91cC5tYXJnaW5Ub3BIYXNMaW5lIHx8IDQgOiAwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbFBhZGRpbmcgPSBsZXZlbCgpICogKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSA/IDggOiAxNik7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweS1bNnB4XVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWhvdmVyXT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNsaWNrTGFiZWxHcm91cFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWhvdmVyLWFjdGl2ZV09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDbGlja0xhYmVsR3JvdXBcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLiFjdXJzb3ItcG9pbnRlcl09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDbGlja0xhYmVsR3JvdXAgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nTGVmdC5weF09XCJjb25zdEh0bWxQYWRkaW5nXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nUmlnaHQucHhdPVwiY29uc3RIdG1sUGFkZGluZ1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSA/IGhhbmRsZXJUb2dnbGVFeHBhbmQoJGV2ZW50LCBpdGVtKSA6IHVuZGVmaW5lZFwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IGJlZm9yZTohdGV4dC1bMTZweF1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5yb3RhdGUtOTBdPVwiaXRlbSgpLmV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJUb2dnbGVFeHBhbmQoJGV2ZW50LCBpdGVtKVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnctZnVsbF09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1bY2FsYygxMDAlLTE2cHgpXV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICghY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdSYWRpbykge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXZhdGFyQ29uZmlnXT1cIml0ZW0oKS5hdmF0YXJDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVs4cHhdXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWdub3JlQ2hlY2tib3hdPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVJdGVtIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWF1dG9dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tYXgtdy1bY2FsYygxMDAlLTI0cHgpXV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLndpZHRoTGFiZWxTdWIyNFdoZW5Ob3RUcmVlVmlldykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbSgpLmZpZWxkTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiaXRlbSgpLmRhdGFQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhMYWJlbF09XCJjb25maWdUZW1wbGF0ZUdyb3VwLnpJbmRleExhYmVsID8/IHpJbmRleCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhQ29tcG9uZW50T3V0bGV0XT1cInVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RGF0YUNvbXBvbmVudE91dGxldEdyb3VwIDogaXRlbSgpIDogZmllbGRLZXkoKSA6IHsgdmFsdWVJc0VtcHR5OiB7IGl0ZW06IGl0ZW0oKSB9IH0gfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50T3V0bGV0XT1cIjAgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldENvbXBvbmVudE91dGxldEdyb3VwIDogaXRlbSgpIDogZmllbGRLZXkoKSA6IHsgdmFsdWVJczA6IDAgfSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5rSW1hZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgnYXZhdGFyJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IChpdGVtKCkuc3BlY2lmaWNfbG9hZEltZ0Vycm9yICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IgPyBjb25maWdUZW1wbGF0ZUdyb3VwLmdldExpbmtJbWFnZUVycm9yIDogY29uZmlnVGVtcGxhdGVHcm91cC5nZXRJbWFnZSkgOiBpdGVtKCkgfCBhc3luYylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0QXZhdGFySXRlbSB8fCAnJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW1nVHlwZUljb25dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pbWdUeXBlSWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbEluY2x1ZGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzTGFiZWxJdGVtID8gY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0xhYmVsSXRlbSA6IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSA/ICcgbGlicy11aS1mb250LWg2ciAnIDogJyBsaWJzLXVpLWZvbnQtaDZzICcpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlVGV4dFVwcGVyY2FzZUxhYmVsR3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlID8gJycgOiAnIHRleHQtdXBwZXJjYXNlICcpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IChpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOiBrZXlzRGlzYWJsZUl0ZW0oKSA6IGtleXNEaXNhYmxlSXRlbSgpPy5sZW5ndGgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIml0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6IGtleXNDaGVja2VkKCkgOiBrZXlzQ2hlY2tlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RpbGxPdGhlck9wdGlvbnNdPVwiaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZToga2V5c1N0aWxsT3RoZXJPcHRpb25zKCkgOiBrZXlzU3RpbGxPdGhlck9wdGlvbnMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZCgkZXZlbnQuY2hlY2tlZCwgaXRlbSwgdHJ1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyKT1cImhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENsaWNrTGFiZWwpPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgnY2xpY2tMYWJlbCcsIGl0ZW0sIGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdSYWRpbykge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcmFkaW8tc2luZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWwtWzhweF1dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdmF0YXJDb25maWddPVwiaXRlbSgpLmF2YXRhckNvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWdub3JlUmFkaW9dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVSYWRpb0dyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVJdGVtIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWF1dG9dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC53aWR0aExhYmVsU3ViMjRXaGVuTm90VHJlZVZpZXcpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tYXgtdy1bY2FsYygxMDAlLTI0cHgpXV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLndpZHRoTGFiZWxTdWIyNFdoZW5Ob3RUcmVlVmlldykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbSgpLmZpZWxkTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwiaXRlbSgpLmRhdGFQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhQ29tcG9uZW50T3V0bGV0XT1cInVuZGVmaW5lZCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RGF0YUNvbXBvbmVudE91dGxldEdyb3VwIDogaXRlbSgpIDogZmllbGRLZXkoKSA6IHsgdmFsdWVJc0VtcHR5OiB7IGl0ZW06IGl0ZW0oKSB9IH0gfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50T3V0bGV0XT1cIjAgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldENvbXBvbmVudE91dGxldEdyb3VwIDogaXRlbSgpIDogZmllbGRLZXkoKSA6IHsgdmFsdWVJczA6IDAgfSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhMYWJlbF09XCJjb25maWdUZW1wbGF0ZUdyb3VwLnpJbmRleExhYmVsID8/IHpJbmRleCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbWdUeXBlSWNvbl09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmltZ1R5cGVJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5rSW1hZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0SW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgnYXZhdGFyJyB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IChpdGVtKCkuc3BlY2lmaWNfbG9hZEltZ0Vycm9yICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IgPyBjb25maWdUZW1wbGF0ZUdyb3VwLmdldExpbmtJbWFnZUVycm9yIDogY29uZmlnVGVtcGxhdGVHcm91cC5nZXRJbWFnZSkgOiBpdGVtKCkgfCBhc3luYylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0QXZhdGFySXRlbSB8fCAnJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbEluY2x1ZGVdPVwiKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gPyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzTGFiZWxJdGVtIDogJ2xpYnMtdWktZm9udC1oNnMgJykgKyAoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVUZXh0VXBwZXJjYXNlTGFiZWxHcm91cCA/ICcnIDogJyB1cHBlcmNhc2UnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSgpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maWdUZW1wbGF0ZUdyb3VwLmRpc2FibGVJdGVtTm90TGFzdExldmVsICYmICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6IGtleXNEaXNhYmxlSXRlbSgpIDoga2V5c0Rpc2FibGVJdGVtKCk/Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cIml0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6IGtleXNDaGVja2VkKCkgOiBrZXlzQ2hlY2tlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VDaGVja2VkKCRldmVudC5hY3RpdmUsIGl0ZW0sIHRydWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9XCJoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDbGlja0xhYmVsKT1cImhhbmRsZXJUb2dnbGVFeHBhbmQoJ2NsaWNrTGFiZWwnLCBpdGVtLCBjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVJhZGlvR3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0oKS5idXR0b25Jbkdyb3VwOyBhcyBidXR0b25Jbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiYnV0dG9uSW5Hcm91cC50eXBlIHx8ICdidXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYnV0dG9uSW5Hcm91cC5sYWJlbCB8fCAnICdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiKGJ1dHRvbkluR3JvdXAuY2xhc3NJY29uTGVmdCB8fCAnJykgKyAnIGZsZXggbXItWzhweF0gIXRleHQtWzhweF0nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiYnV0dG9uSW5Hcm91cC5jbGFzc0luY2x1ZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzTGFiZWxdPVwiYnV0dG9uSW5Hcm91cC5jbGFzc0xhYmVsIHx8ICdsaWJzLXVpLWZvbnQtaDVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJidXR0b25Jbkdyb3VwLmRpc2FibGUgfHwgZGlzYWJsZSgpIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tCdXR0b25Hcm91cChidXR0b25Jbkdyb3VwLCBpdGVtKCkpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAncmlnaHQnICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgJiYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLnNlYXJjaEFsbExldmVsIHx8ICEhaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpPy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCBiZWZvcmU6IXRleHQtWzE2cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuIW1sLVs4cHhdXT1cIml0ZW0oKS5kYXRhUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJvdGF0ZS05MF09XCJpdGVtKCkuZXhwYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgkZXZlbnQsIGl0ZW0pXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBpZiAoaXRlbSgpLmV4cGFuZCAmJiBjYWxjdWxhdG9ySGVpZ2hJdGVtU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWxpc3QtdGVtcGxhdGVzX2dyb3VwLWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgW2tleVNlYXJjaF09XCJrZXlTZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW3BhcmVudEl0ZW1dPVwiaXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZpZWxkS2V5XT1cImZpZWxkS2V5KClcIlxuICAgICAgICAgICAgICAgICAgICBba2V5c0NoZWNrZWRdPVwia2V5c0NoZWNrZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtrZXlzRGlzYWJsZUl0ZW1dPVwia2V5c0Rpc2FibGVJdGVtKCkgfHwgW11cIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnVGVtcGxhdGVHcm91cF09XCJjb25maWdUZW1wbGF0ZUdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtrZXlzU3RpbGxPdGhlck9wdGlvbnNdPVwia2V5c1N0aWxsT3RoZXJPcHRpb25zKClcIlxuICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlVmlldyk9XCJoYW5kbGVyQ2hhbmdlVmlldygpXCJcbiAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyKT1cImhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZCgkZXZlbnQuaXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKCFsYXN0ICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUdyb3VwTGluZSAmJiBjYWxjdWxhdG9ySGVpZ2hJdGVtU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1saXN0LWdyb3VwLWxpbmVcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luVG9wLnB4XT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUdyb3VwTGluZSA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAubWFyZ2luVG9wSGFzTGluZSB8fCA0IDogMFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmICghaXRlbXMoKSB8fCAhaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg1ciB0ZXh0LVsjYzFjMWMxXSByZWxhdGl2ZSB7eyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZU5vZGF0YSA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlTm9kYXRhIDogJycgfX1cIlxuICAgICAgICAgIFtzdHlsZS5tYXJnaW5MZWZ0LnB4XT1cIlxuICAgICAgICAgICAgMFxuICAgICAgICAgICAgICB8IExpYnNVaUNvbXBvbmVudHNMaXN0R3JvdXBDYWxjdWxhdG9yTWFyZ2luTGVmdEl0ZW1QaXBlXG4gICAgICAgICAgICAgICAgOiAyXG4gICAgICAgICAgICAgICAgOiBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCdcbiAgICAgICAgICAgICAgICA6IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZUpzb25cbiAgICAgICAgICAgICAgICA6ICEoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEl0ZW0gfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVSYWRpb0l0ZW0gfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtKVxuICAgICAgICAgICAgICAgIDogdHJ1ZVxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2NsYXNzLnB5LVs4cHhdXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtXCJcbiAgICAgICAgICBbY2xhc3MucHktWzRweF1dPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtXCI+XG4gICAgICAgICAgQGlmICgha2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgICAgQGxldCBjb25zdEh0bWxUZXh0Tm9EYXRhID0gY29uZmlnKCk/LnRleHROb0RhdGEgfHwgJ2kxOG5fbm9fZGF0YV95ZXQnO1xuICAgICAgICAgICAgPGRpdj57eyBjb25zdEh0bWxUZXh0Tm9EYXRhIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoa2V5U2VhcmNoKCkgJiYgIWxvYWRpbmcoKSkge1xuICAgICAgICAgICAgQGxldCBjb25zdEh0bWxUZXh0U2VhcmNoTm9EYXRhID0gY29uZmlnKCk/LnRleHRTZWFyY2hOb0RhdGEgfHwgJ2kxOG5fbm9fcmVzdWx0JztcbiAgICAgICAgICAgIDxkaXY+e3sgY29uc3RIdG1sVGV4dFNlYXJjaE5vRGF0YSB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXNwaW5uZXIgW3NpemVdPVwiJ21lZGl1bSdcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbn1cbiJdfQ==
788
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2xpc3Qvc3JjL3RlbXBsYXRlcy9ncm91cC9ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvbGlzdC9zcmMvdGVtcGxhdGVzL2dyb3VwL2dyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQVUsTUFBTSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUM3RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEVBQVcsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxx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QUFFLENBQUMsVUFBVSxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdEIsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztZQUV6RixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQztJQUMxQyxDQUFDO3dHQXQ0QlUsa0NBQWtDOzRGQUFsQyxrQ0FBa0MsMEhDM0MvQyw4MmdCQWtPQSxnU0RyTUkscUJBQXFCLDBCQUNyQixTQUFTLDZDQUNULGVBQWUsNEZBQ2Ysc0NBQXNDLHNqQkFDdEMsdUNBQXVDLDBwQkFDdkMsb0NBQW9DLDJoQkFDcEMsZ0NBQWdDLGlHQUNoQyxzQ0FBc0Msd1NBQ3RDLDRCQUE0QixnRUFDNUIscUNBQXFDLHlFQUNyQyxxREFBcUQsOEZBQ3JELHNDQUFzQzs7NEZBRzdCLGtDQUFrQztrQkF0QjlDLFNBQVM7K0JBRUUseUNBQXlDLGNBR3ZDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDUCxxQkFBcUI7d0JBQ3JCLFNBQVM7d0JBQ1QsZUFBZTt3QkFDZixzQ0FBc0M7d0JBQ3RDLHVDQUF1Qzt3QkFDdkMsb0NBQW9DO3dCQUNwQyxnQ0FBZ0M7d0JBQ2hDLHNDQUFzQzt3QkFDdEMsNEJBQTRCO3dCQUM1QixxQ0FBcUM7d0JBQ3JDLHFEQUFxRDt3QkFDckQsc0NBQXNDO3FCQUN2QyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBpc1NpZ25hbCwgT25Jbml0LCBzaWduYWwsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUgfSBmcm9tICdAaWhhcmJlY2svbmd4LXZpcnR1YWwtc2Nyb2xsZXInO1xuaW1wb3J0IHsgSUJ1dHRvbiwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNDaGVja2JveFNpbmdsZUNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNSYWRpb1NpbmdsZUNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcmFkaW8tc2luZ2xlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU3Bpbm5lckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lcic7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtY2FsbC1mdW5jdGlvbi1pbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGRlbGV0ZVVuaWNvZGUsIGVzY2FwZUh0bWwsIGdldCwgaXNFbXB0eSwgaXNOaWwsIHNldCwgdXVpZCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbUdyb3VwIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb25maWctaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUxpc3REYXRhRW1pdEtleSwgSUxpc3REYXRhRW1pdE11bHRpS2V5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9kYXRhLWVtaXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9jaGVjay1zZWxlY3RlZC1ieS1rZXkucGlwZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzTGlzdFRlbXBsYXRlc0NvbXBvbmVudEFic3RyYWN0IH0gZnJvbSAnLi4vdGVtcGxhdGVzLmNvbXBvbmVudC5hYnN0cmFjdCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzTGlzdEdyb3VwSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vaXRlbS9pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzTGlzdEdyb3VwQ2FsY3VsYXRvck1hcmdpbkxlZnRJdGVtUGlwZSB9IGZyb20gJy4vcGlwZXMvY2FsY3VsYXRvci1tYXJnaW4tbGVmdC1pdGVtLnBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtbGlzdC10ZW1wbGF0ZXNfZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ncm91cC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFZpcnR1YWxTY3JvbGxlck1vZHVsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNDaGVja2JveFNpbmdsZUNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUmFkaW9TaW5nbGVDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1NwaW5uZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsXG4gICAgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSxcbiAgICBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNMaXN0R3JvdXBDYWxjdWxhdG9yTWFyZ2luTGVmdEl0ZW1QaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNMaXN0R3JvdXBJdGVtQ29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzTGlzdEdyb3VwQ29tcG9uZW50IGV4dGVuZHMgTGlic1VpQ29tcG9uZW50c0xpc3RUZW1wbGF0ZXNDb21wb25lbnRBYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtR3JvdXAgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsZXZlbCA9IHNpZ25hbDxudW1iZXI+KDEpO1xuICBwcm90ZWN0ZWQga2V5c0NoZWNrZWQgPSBzaWduYWw8QXJyYXk8c3RyaW5nPj4oW10pO1xuICBwcm90ZWN0ZWQga2V5c1N0aWxsT3RoZXJPcHRpb25zID0gc2lnbmFsPEFycmF5PHN0cmluZz4+KFtdKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbSA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgdG90YWxJdGVtQ2hlY2tlZCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgY2FsY3VsYXRvckhlaWdoSXRlbVN1Y2Nlc3MgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQga2V5RmV0Y2ggPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBQQVRURVJOX0ZBS0VfSUQgPSAnZmFrZS1pZC0nO1xuICBwcml2YXRlIG1hcHBpbmdJdGVtc0NoZWNrZWQgPSBzaWduYWw8TWFwPHN0cmluZywgYW55Pj4obmV3IE1hcCgpKTtcbiAgcHJpdmF0ZSBzZWxlY3RGaXJzdEl0ZW0gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGZpcnN0SXRlbVNlbGVjdGVkID0gc2lnbmFsPGFueT4odW5kZWZpbmVkKTtcblxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKCk/LmNvbmZpZ1RlbXBsYXRlR3JvdXA/LigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwLnNldCh0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZUdyb3VwPy4oKSk7XG4gICAgdGhpcy50aW1lSW50ZXJ2YWxJbnRlcnZhbFNldEhlaWdodFZpZXdQb3J0LnNldCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8udGltZUludGVydmFsQ2FsY3VsYXRvckhlaWdodCA/PyAwKTtcbiAgICB0aGlzLmZpZWxkS2V5LnNldCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZmllbGRLZXkgPz8gdGhpcy5maWVsZEtleURlZmF1bHQoKSk7XG4gICAgdGhpcy5zZWxlY3RGaXJzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/Lm9ubHlTZWxlY3RGaXJzdEl0ZW0gfHwgKCF0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMuY29uZmlnKCk/LmF1dG9TZWxlY3RGaXJzdEl0ZW0pKSB7XG4gICAgICB0aGlzLnNlbGVjdEZpcnN0SXRlbS5zZXQodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSgpO1xuXG4gICAgdGhpcy5vblVwZGF0ZU11bHRpS2V5U2VsZWN0ZWRHcm91cCgpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlKCkgfHwgIXRoaXMuc3RvcmUoKS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5rZXlzQ2hlY2tlZC5zZXQoW10pO1xuXG4gICAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmNsZWFyKCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgICAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdG9yZSgpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXNFbXB0eShpdGVtKClbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgICAgIGl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICAgIGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaXRlbUdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuICAgICAgICAgIGNvbnN0IGl0ZW1NYXAgPSBjbG9uZURlZXAoaXRlbSkgYXMgV3JpdGFibGVTaWduYWw8YW55PjtcblxuICAgICAgICAgIGl0ZW1NYXAudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LnJlZiA9IGl0ZW07XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpdGVtR3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlZEdyb3VwSXRlbXMoaXRlbUdyb3VwKCksIGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5tdWx0aUtleVNlbGVjdGVkKCkgJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/Lmxlbmd0aCAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8uZmluZCgoa2V5KSA9PiBrZXkgPT09IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCBpdGVtTWFwLCBmYWxzZSwgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm11bHRpS2V5U2VsZWN0ZWQuc2V0KFtdKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hlY2tlZE9yVW5DaGVja2VkQWxsKGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFjaGVja2VkKSB7XG4gICAgICB0aGlzLml0ZW1zKCkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5kZWxldGUoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pO1xuICAgICAgICBjb25zdCBpdGVtc09mR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG5cbiAgICAgICAgaWYgKGl0ZW1zT2ZHcm91cCAmJiBpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUNoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zT2ZHcm91cCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChmYWxzZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLml0ZW1zKCkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuc2V0KGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldLCBpdGVtKCkpO1xuICAgICAgY29uc3QgaXRlbXNPZkdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgICBpZiAoaXRlbXNPZkdyb3VwICYmIGl0ZW1zT2ZHcm91cCgpICYmIGl0ZW1zT2ZHcm91cCgpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNPZkdyb3VwKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja2VkR3JvdXBJdGVtcyhpdGVtcz86IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+LCBwYXJlbnQ/OiBXcml0YWJsZVNpZ25hbDxhbnk+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpc05pbChpdGVtKClbdGhpcy5maWVsZEtleSgpXSkgfHwgaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPT09ICcnKSB7XG4gICAgICAgIGl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudFt0aGlzLmZpZWxkS2V5KCldID0gYCR7dGhpcy5QQVRURVJOX0ZBS0VfSUR9JHt1dWlkKCl9YDtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG4gICAgICBjb25zdCBpdGVtTWFwID0gY2xvbmVEZWVwKGl0ZW0pIGFzIFdyaXRhYmxlU2lnbmFsPGFueT47XG5cbiAgICAgIGl0ZW1NYXAudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQucmVmID0gaXRlbTtcbiAgICAgICAgY3VycmVudC5wYXJlbnRJdGVtID0gcGFyZW50O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoaXRlbUdyb3VwKSB7XG4gICAgICAgIHRoaXMuY2hlY2tlZEdyb3VwSXRlbXMoaXRlbUdyb3VwKCksIGl0ZW0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGggJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/LmZpbmQoKGtleSkgPT4ga2V5ID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCBpdGVtTWFwLCBmYWxzZSwgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSkge1xuICAgICAgICB0aGlzLmhhbmRsZXJDaGFuZ2VDaGVja2VkKGZhbHNlLCBpdGVtTWFwLCBmYWxzZSwgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrQnV0dG9uR3JvdXAoYnV0dG9uSW5Hcm91cDogSUJ1dHRvbiwgaXRlbTogYW55KSB7XG4gICAgYnV0dG9uSW5Hcm91cC5hY3Rpb24/LihpdGVtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyVG9nZ2xlRXhwYW5kKGU6IHVua25vd24sIGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4sIGFjY2VwdEV2ZW50ID0gdHJ1ZSkge1xuICAgIGlmICghYWNjZXB0RXZlbnQgfHwgdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/Lmlnbm9yZUNsaWNrTGFiZWxHcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZSBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICBpdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5leHBhbmQgPSAhY3VycmVudC5leHBhbmQ7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMucmVmcmVzaFZpZXcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlVmlldygpIHtcbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUl0ZW1DaGVja2VkKGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGNoZWNrZWQgPSAhdGhpcy5rZXlzQ2hlY2tlZCgpLnNvbWUoKGtleSkgPT4gaXRlbVt0aGlzLmZpZWxkS2V5KCldID09PSBrZXkpO1xuXG4gICAgaWYgKCFjaGVja2VkICYmIHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5pc1ZpZXdSYWRpbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZXJDaGFuZ2VDaGVja2VkKGNoZWNrZWQsIHNpZ25hbChpdGVtKSwgZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VDaGVja2VkKGNoZWNrZWQ6IGJvb2xlYW4sIGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4sIGlzQ2xpY2tNYW51YWw6IGJvb2xlYW4sIGlzQ2hlY2tlZEJ5RGVmYXVsdEtleT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG5cbiAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVKc29uICYmIGl0ZW0oKS5sZXZlbCAhPT0gaXRlbSgpLm1heExldmVsR3JvdXAgJiYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hlY2tib3hHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZkl0ZW0gPSAoaXRlbSgpLnJlZiB8fCBpdGVtKSBhcyBXcml0YWJsZVNpZ25hbDxhbnk+O1xuXG4gICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSkge1xuICAgICAgY2hlY2tlZCA9IHRydWU7XG4gICAgICBjb25zdCBtYXBwaW5nSXRlbXNDaGVja2VkVGVtcCA9IGNsb25lRGVlcCh0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQpIGFzIFdyaXRhYmxlU2lnbmFsPE1hcDxzdHJpbmcsIGFueT4+O1xuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGl0ZW1DaGVja10gb2YgbWFwcGluZ0l0ZW1zQ2hlY2tlZFRlbXAoKSkge1xuICAgICAgICBjb25zdCBpdGVtQnlLZXkgPSB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5nZXQoa2V5KTtcblxuICAgICAgICBpdGVtQnlLZXkuaXNDaGVja01hbnVhbCA9IGZhbHNlO1xuICAgICAgICBkZWxldGUgaXRlbUJ5S2V5LnJlZi5pc0NoZWNrTWFudWFsO1xuICAgICAgICBpZiAoIWl0ZW1DaGVjay5yZWYuaXNDaGVja2VkQnlEZWZhdWx0S2V5KSB7XG4gICAgICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGtleSk7XG4gICAgICAgICAgdGhpcy5vdXRVblNlbGVjdE11bHRpS2V5LmVtaXQoW2tleV0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzQ2hlY2tlZEJ5RGVmYXVsdEtleSkge1xuICAgICAgICBpdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuaXNDaGVja01hbnVhbCA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlZkl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXRlbXNPZkdyb3VwID0gaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuICAgIC8vIGLhu48gY2jhu41uIHThuqV0IGPhuqMgY8OhYyBpdGVtIMSR4buDIHRo4buxYyBoaeG7h24gY2hlY2sgbOG6oWlcbiAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlSnNvbiB8fCAoY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtQnlUcmVlICYmICFpc0NoZWNrZWRCeURlZmF1bHRLZXkgJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAubm90Q2hhbmdlU3RhdGVJdGVtQ2hlY2tPdGhlcikpIHtcbiAgICAgIEFycmF5LmZyb20odGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkudmFsdWVzKCkpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgZGVsZXRlIGl0ZW0uaXNDaGVja01hbnVhbDtcbiAgICAgICAgcmVmSXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBkZWxldGUgY3VycmVudC5pc0NoZWNrTWFudWFsO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMub3V0VW5TZWxlY3RNdWx0aUtleS5lbWl0KHRoaXMua2V5c0NoZWNrZWQoKSk7XG4gICAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5jbGVhcigpO1xuICAgICAgdGhpcy5zZXRLZXlzQ2hlY2tlZEJ5TWFwcGluZ0NoZWNrZWQoaXNDbGlja01hbnVhbCwgaXRlbSk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIHRoaXMuZXhwYW5kQWxsSXRlbXNJbkdyb3VwKGl0ZW0pO1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuc2V0KGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldLCBpdGVtKCkpO1xuICAgICAgaWYgKGlzQ2hlY2tlZEJ5RGVmYXVsdEtleSkge1xuICAgICAgICByZWZJdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuaXNDaGVja2VkQnlEZWZhdWx0S2V5ID0gaXNDaGVja2VkQnlEZWZhdWx0S2V5O1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5pc0NoZWNrZWRCeURlZmF1bHRLZXkgPSByZWZJdGVtKCkuaXNDaGVja2VkQnlEZWZhdWx0S2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5jaG9vc2VDaGlsZFRoZW5BdXRvQ2hvb3NlUGFyZW50KSB7XG4gICAgICAgIC8vIGNo4buJIGNo4buNbiBjw6FjIGNoYSB0csOqbiBjw7luZyB0cmVlLCBrbyBxdWFuIHTDom0gbm9kZSBjaGEgY8OzIGPDoWMgY29uIMSRw6MgxJFjIHTDrWNoIGjhur90IGNoxrBhXG4gICAgICAgIGl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgcmVmSXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LmlzQ2hlY2tNYW51YWwgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlY3Vyc2l2ZWx5Q2hlY2tlZFBhcmVudEJ5VHJlZShpdGVtKCkucGFyZW50SXRlbSk7XG5cbiAgICAgICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNob29zZVBhcmVudFRoZW5BdXRvQ2hvb3NlQ2hpbGRyZW4gJiYgIWlzQ2hlY2tlZEJ5RGVmYXVsdEtleSkge1xuICAgICAgICAgIHRoaXMuc2V0Q2hlY2tDaGVja2VkSXRlbXNDaGlsZChpdGVtc09mR3JvdXA/LigpIHx8IFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChpc0NsaWNrTWFudWFsLCBpdGVtKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaG9vc2VQYXJlbnRUaGVuQXV0b0Nob29zZUNoaWxkcmVuKSB7XG4gICAgICAgIC8vIGzhu7FhIGNo4buNbiBub2RlIGNoYSBz4bq9IGLhu48gcXVhIHZp4buHYyBjaOG7jW4gdOG6pXQgY+G6oyBub2RlIGNvblxuICAgICAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChpc0NsaWNrTWFudWFsLCBpdGVtKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXRlbXNPZkdyb3VwICYmIGl0ZW1zT2ZHcm91cCgpICYmIGl0ZW1zT2ZHcm91cCgpLmxlbmd0aCAmJiAhaXNDaGVja2VkQnlEZWZhdWx0S2V5ICYmICFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVKc29uKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zQ2hhbmdlID0gY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGFuZ2VDaGlsZHJlbkRpc2FibGVXaGVuQ2hhbmdlUGFyZW50ID8gaXRlbXNPZkdyb3VwKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+ICF0aGlzLmtleXNEaXNhYmxlSXRlbSgpPy5maW5kKChrZXkpID0+IGtleSA9PT0gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pKSA6IGl0ZW1zT2ZHcm91cCgpO1xuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tDaGVja2VkSXRlbXNDaGlsZChpdGVtc0NoYW5nZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAubm90Q2hhbmdlU3RhdGVJdGVtQ2hlY2tPdGhlciAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlSnNvbikge1xuICAgICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zUGFyZW50KGl0ZW0oKS5wYXJlbnRJdGVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0S2V5c0NoZWNrZWRCeU1hcHBpbmdDaGVja2VkKGlzQ2xpY2tNYW51YWwsIGl0ZW0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50LmlzQ2hlY2tNYW51YWwgPSBmYWxzZTtcblxuICAgICAgaWYgKGlzQ2hlY2tlZEJ5RGVmYXVsdEtleSkge1xuICAgICAgICBjdXJyZW50LmlzQ2hlY2tlZEJ5RGVmYXVsdEtleSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICByZWZJdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5pc0NoZWNrTWFudWFsID0gZmFsc2U7XG5cbiAgICAgIGlmIChpc0NoZWNrZWRCeURlZmF1bHRLZXkpIHtcbiAgICAgICAgY3VycmVudC5pc0NoZWNrZWRCeURlZmF1bHRLZXkgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcbiAgICB0aGlzLmtleXNDaGVja2VkLnNldChBcnJheS5mcm9tKHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmtleXMoKSkpO1xuXG4gICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAubm90Q2hhbmdlU3RhdGVJdGVtQ2hlY2tPdGhlcikge1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcbiAgICAgIHRoaXMub3V0VW5TZWxlY3RNdWx0aUtleS5lbWl0KCFpc0VtcHR5KGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSA/IFtpdGVtKClbdGhpcy5maWVsZEtleSgpXV0gOiBbXSk7XG4gICAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChpc0NsaWNrTWFudWFsLCBpdGVtKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVVbnNlbGVjdENoaWxkcmVuUmVtb3ZlU2VsZWN0UGFyZW50KSB7XG4gICAgICB0aGlzLnJlY3Vyc2l2ZWx5Q2hlY2tlZFBhcmVudEJ5VHJlZShpdGVtKCkucGFyZW50SXRlbSk7XG4gICAgfVxuXG4gICAgLy8gbuG6v3Uga28gcGjhuqNpIHRyxrDhu51uZyBoxqFwIGPhu6dhIGJhbmsgdsOgIGRhbmggbeG7pWMgc+G6o24gcGjhuqltIHRow6wgYuG7jyBjaGEgc+G6vSBi4buPIGNvblxuICAgIGlmIChpdGVtc09mR3JvdXAgJiYgaXRlbXNPZkdyb3VwKCkgJiYgaXRlbXNPZkdyb3VwKCkubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpdGVtc0NoYW5nZSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2hhbmdlQ2hpbGRyZW5EaXNhYmxlV2hlbkNoYW5nZVBhcmVudCA/IGl0ZW1zT2ZHcm91cCgpLmZpbHRlcigoaXRlbSkgPT4gIXRoaXMua2V5c0Rpc2FibGVJdGVtKCk/LmZpbmQoKGtleSkgPT4ga2V5ID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSkpIDogaXRlbXNPZkdyb3VwKCk7XG5cbiAgICAgIHRoaXMucmVtb3ZlQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXNDaGFuZ2UpO1xuICAgIH1cbiAgICBpZiAoaXRlbSgpLnBhcmVudEl0ZW0gJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlVW5zZWxlY3RDaGlsZHJlblJlbW92ZVNlbGVjdFBhcmVudCkge1xuICAgICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuZGVsZXRlKGl0ZW0oKS5wYXJlbnRJdGVtW3RoaXMuZmllbGRLZXkoKV0pO1xuICAgIH1cbiAgICB0aGlzLnNldEtleXNDaGVja2VkQnlNYXBwaW5nQ2hlY2tlZChpc0NsaWNrTWFudWFsLCBpdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SXRlbXNPZkdyb3VwKGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4sIHN0b3JlczogV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFzdG9yZXMgfHwgIXN0b3Jlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHN0b3JlcygpKSB7XG4gICAgICBpZiAoZ3JvdXAoKVt0aGlzLmZpZWxkS2V5KCldID09PSBpdGVtKClbdGhpcy5maWVsZEtleSgpXSkge1xuICAgICAgICByZXR1cm4gZ3JvdXAoKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0SXRlbXNPZkdyb3VwKGl0ZW0sIGdyb3VwKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSkgYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHByaXZhdGUgc2V0S2V5c1N0aWxsT3RoZXJPcHRpb25zKGl0ZW0/OiBXcml0YWJsZVNpZ25hbDxhbnk+KSB7XG4gICAgaWYgKCFpdGVtPy4oKSkge1xuICAgICAgdGhpcy5rZXlzU3RpbGxPdGhlck9wdGlvbnMuc2V0KFtdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXlzQ2hlY2tlZCA9IEFycmF5LmZyb20odGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkua2V5cygpKTtcbiAgICBjb25zdCBpdGVtUGFyZW50ID0gaXRlbSgpLnBhcmVudEl0ZW0gYXMgV3JpdGFibGVTaWduYWw8YW55PjtcbiAgICBjb25zdCBpbmRleEl0ZW0gPSB0aGlzLmtleXNTdGlsbE90aGVyT3B0aW9ucygpLmZpbmRJbmRleCgoa2V5KSA9PiBrZXkgPT09IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcblxuICAgIGlmIChpbmRleEl0ZW0gPj0gMCkge1xuICAgICAgdGhpcy5rZXlzU3RpbGxPdGhlck9wdGlvbnMudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGluZGV4SXRlbSwgMSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIWl0ZW1QYXJlbnQgfHwgIWl0ZW1QYXJlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc09mR3JvdXBQYXJlbnQgPSB0aGlzLmdldEl0ZW1zT2ZHcm91cChpdGVtUGFyZW50LCB0aGlzLnN0b3JlKTtcblxuICAgIGlmICghaXRlbXNPZkdyb3VwUGFyZW50IHx8ICFpdGVtc09mR3JvdXBQYXJlbnQoKSB8fCAhaXRlbXNPZkdyb3VwUGFyZW50KCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4UGFyZW50ID0gdGhpcy5rZXlzU3RpbGxPdGhlck9wdGlvbnMoKS5maW5kSW5kZXgoKGtleSkgPT4ga2V5ID09PSBpdGVtUGFyZW50KClbdGhpcy5maWVsZEtleSgpXSk7XG5cbiAgICBpZiAoaXRlbXNPZkdyb3VwUGFyZW50KCkuZXZlcnkoKGVsZW1lbnQpID0+IGtleXNDaGVja2VkLmluY2x1ZGVzKGVsZW1lbnQoKVt0aGlzLmZpZWxkS2V5KCldKSkgJiYgaW5kZXhQYXJlbnQgPj0gMCkge1xuICAgICAgdGhpcy5rZXlzU3RpbGxPdGhlck9wdGlvbnMudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGluZGV4SXRlbSwgMSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXRlbXNPZkdyb3VwUGFyZW50KCkuc29tZSgoZWxlbWVudCkgPT4ga2V5c0NoZWNrZWQuaW5jbHVkZXMoZWxlbWVudCgpW3RoaXMuZmllbGRLZXkoKV0pKSAmJiBpbmRleFBhcmVudCA8IDApIHtcbiAgICAgIHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zLnVwZGF0ZSgoY3VycmVudCkgPT4gWy4uLmN1cnJlbnQsIGl0ZW1QYXJlbnQoKVt0aGlzLmZpZWxkS2V5KCldXSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZGV4UGFyZW50ID49IDApIHtcbiAgICAgIHRoaXMua2V5c1N0aWxsT3RoZXJPcHRpb25zLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpbmRleEl0ZW0sIDEpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRLZXlzQ2hlY2tlZEJ5TWFwcGluZ0NoZWNrZWQoaXNDbGlja01hbnVhbDogYm9vbGVhbiwgaXRlbT86IFdyaXRhYmxlU2lnbmFsPGFueT4pIHtcbiAgICB0aGlzLmtleXNDaGVja2VkLnNldChBcnJheS5mcm9tKHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLmtleXMoKSkpO1xuICAgIHRoaXMuZW1pdE11bHRpS2V5Q2hlY2tlZChpc0NsaWNrTWFudWFsKTtcbiAgICB0aGlzLnNldEtleXNTdGlsbE90aGVyT3B0aW9ucyhpdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE11bHRpS2V5Q2hlY2tlZChpc0NsaWNrTWFudWFsID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRhTXVsdGlLZXlDaGVja2VkOiBJTGlzdERhdGFFbWl0TXVsdGlLZXkgPSB7IGtleXM6IG5ldyBBcnJheTxhbnk+KCksIG1hcEtleXM6IG5ldyBBcnJheTxJTGlzdERhdGFFbWl0S2V5PigpLCBpc0NsaWNrTWFudWFsIH07XG5cbiAgICBpZiAoKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZW1pdEFsbEl0ZW1DaGVja2VkIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2hvb3NlQ2hpbGRUaGVuQXV0b0Nob29zZVBhcmVudCkgJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlRW1pdEFsbEl0ZW1DaGVja2VkV2hlbkNob29zZUNoaWxkVGhlbkF1dG9DaG9vc2VQYXJlbnQpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2YgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkpIHtcbiAgICAgICAgZGF0YU11bHRpS2V5Q2hlY2tlZC5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgZGF0YU11bHRpS2V5Q2hlY2tlZC5tYXBLZXlzLnB1c2goeyBrZXksIGl0ZW06IGl0ZW0ucmVmPy4oKSB8fCBpdGVtLCBpc0NsaWNrTWFudWFsIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KGRhdGFNdWx0aUtleUNoZWNrZWQpO1xuICAgICAgdGhpcy50b3RhbEl0ZW1DaGVja2VkLnNldChkYXRhTXVsdGlLZXlDaGVja2VkLmtleXMubGVuZ3RoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2YgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgaXRlbVt0aGlzLmZpZWxkS2V5KCldICYmXG4gICAgICAgICFTdHJpbmcoaXRlbVt0aGlzLmZpZWxkS2V5KCldKS5pbmNsdWRlcyh0aGlzLlBBVFRFUk5fRkFLRV9JRCkgJiZcbiAgICAgICAgKGlzRW1wdHkoaXRlbVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdKSB8fCAhaXRlbVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdKCkuc29tZSgoaXRlbUdyb3VwOiBXcml0YWJsZVNpZ25hbDxhbnk+KSA9PiB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5nZXQoaXRlbUdyb3VwKClbdGhpcy5maWVsZEtleSgpXSkpKVxuICAgICAgKSB7XG4gICAgICAgIGRhdGFNdWx0aUtleUNoZWNrZWQua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIGRhdGFNdWx0aUtleUNoZWNrZWQubWFwS2V5cy5wdXNoKHsga2V5LCBpdGVtOiBpdGVtLnJlZj8uKCkgfHwgaXRlbSwgaXNDbGlja01hbnVhbCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KGRhdGFNdWx0aUtleUNoZWNrZWQpO1xuICAgIHRoaXMudG90YWxJdGVtQ2hlY2tlZC5zZXQoZGF0YU11bHRpS2V5Q2hlY2tlZC5rZXlzLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIHJlY3Vyc2l2ZWx5Q2hlY2tlZFBhcmVudEJ5VHJlZShpdGVtOiBhbnkpIHtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tYXBwaW5nSXRlbXNDaGVja2VkKCkuc2V0KGl0ZW1bdGhpcy5maWVsZEtleSgpXSwgaXRlbSgpKTtcbiAgICB0aGlzLnJlY3Vyc2l2ZWx5Q2hlY2tlZFBhcmVudEJ5VHJlZShpdGVtLnBhcmVudEl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGVja0NoZWNrZWRJdGVtc1BhcmVudChpdGVtOiBXcml0YWJsZVNpZ25hbDxhbnk+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zT2ZHcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgIGlmICghaXRlbXNPZkdyb3VwKCkgfHwgIWl0ZW1zT2ZHcm91cCgpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW1Hcm91cCBvZiBpdGVtc09mR3JvdXAoKSkge1xuICAgICAgaWYgKCF0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5oYXMoaXRlbUdyb3VwKClbdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5zZXQoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0sIGl0ZW0oKSk7XG4gICAgaWYgKGl0ZW0oKS5wYXJlbnRJdGVtKSB7XG4gICAgICB0aGlzLnNldENoZWNrQ2hlY2tlZEl0ZW1zUGFyZW50KGl0ZW0oKS5wYXJlbnRJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldENoZWNrQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHRoaXMubWFwcGluZ0l0ZW1zQ2hlY2tlZCgpLnNldChpdGVtKClbdGhpcy5maWVsZEtleSgpXSwgaXRlbSgpKTtcbiAgICAgIGNvbnN0IGl0ZW1zT2ZHcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgaWYgKGl0ZW1zT2ZHcm91cCAmJiBpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXRDaGVja0NoZWNrZWRJdGVtc0NoaWxkKGl0ZW1zT2ZHcm91cCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQ2hlY2tlZEl0ZW1zQ2hpbGQoaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQuaXNDaGVja01hbnVhbCA9IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1hcHBpbmdJdGVtc0NoZWNrZWQoKS5kZWxldGUoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pO1xuICAgICAgdGhpcy5vdXRVblNlbGVjdE11bHRpS2V5LmVtaXQoW2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldXSk7XG5cbiAgICAgIGNvbnN0IGl0ZW1zT2ZHcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgaWYgKGl0ZW1zT2ZHcm91cCAmJiBpdGVtc09mR3JvdXAoKSAmJiBpdGVtc09mR3JvdXAoKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGVja2VkSXRlbXNDaGlsZChpdGVtc09mR3JvdXAoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc1NlYXJjaCgpIHtcbiAgICB0aGlzLnByb2Nlc3NEYXRhKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0RhdGEoKTogdm9pZCB7XG4gICAgdGhpcy50b3RhbEl0ZW0uc2V0KDApO1xuXG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuXG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGl0ZW1zID0gdGhpcy5zdG9yZSgpLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGlzTmlsKGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKSB8fCBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9PT0gJycpIHtcbiAgICAgICAgaXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0gPSBgJHt0aGlzLlBBVFRFUk5fRkFLRV9JRH0ke3V1aWQoKX1gO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1NYXAgPSBjbG9uZURlZXAoaXRlbSkgYXMgV3JpdGFibGVTaWduYWw8YW55PjtcbiAgICAgIGl0ZW1NYXAudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQucmVmID0gaXRlbTtcbiAgICAgICAgY3VycmVudC5pc1Jvb3QgPSB0cnVlO1xuICAgICAgICBjdXJyZW50LmV4cGFuZCA9IHRoaXMua2V5U2VhcmNoKCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGN1cnJlbnQubWF4TGV2ZWxHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRNYXhMZXZlbEdyb3VwKGl0ZW0oKSk7XG4gICAgICAgIGN1cnJlbnQubGV2ZWwgPSB0aGlzLmxldmVsKCk7XG4gICAgICAgIGN1cnJlbnQudGV4dERlc2NyaXB0aW9uR3JvdXBXaGVuTm9EYXRhID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldERlc2NyaXB0aW9uR3JvdXBXaGVuTm9EYXRhPy4oaXRlbSgpKTtcbiAgICAgICAgY3VycmVudC5pY29uRW1wdHlEYXRhSW5Hcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRJY29uRW1wdHlEYXRhSW5Hcm91cD8uKGl0ZW0oKSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGlmICgoaXRlbU1hcCgpLmxldmVsID09PSBpdGVtTWFwKCkubWF4TGV2ZWxHcm91cCB8fCAhdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/Lmlnbm9yZUNoZWNrYm94R3JvdXApICYmICFTdHJpbmcoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pPy5pbmNsdWRlcyh0aGlzLlBBVFRFUk5fRkFLRV9JRCkpIHtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW0udXBkYXRlKChjdXJyZW50KSA9PiBjdXJyZW50KyspO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmtleVNlYXJjaCgpICYmIHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5nZXRFeHBhbmRHcm91cCkge1xuICAgICAgICBpdGVtTWFwLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuZXhwYW5kID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldEV4cGFuZEdyb3VwPy4oaXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldFBvcG92ZXJHcm91cCkge1xuICAgICAgICBpdGVtTWFwLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuZGF0YVBvcG92ZXIgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0UG9wb3Zlckdyb3VwPy4oaXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldEJ1dHRvbkdyb3VwKSB7XG4gICAgICAgIGl0ZW1NYXAudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5idXR0b25Jbkdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldEJ1dHRvbkdyb3VwPy4oaXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0ZXh0ID0gZGVsZXRlVW5pY29kZSh0aGlzLmJ1aWxkVmFsdWVCeUNvbmZpZyhpdGVtTWFwKSkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHRleHRFc2NhcGUgPSBlc2NhcGVIdG1sKHRleHQpO1xuICAgICAgY29uc3Qga2V5U2VhcmNoID0gZGVsZXRlVW5pY29kZShlc2NhcGVIdG1sKCh0aGlzLmtleVNlYXJjaCgpIHx8ICcnKS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKSkpO1xuXG4gICAgICBpdGVtTWFwLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LmRpc3BsYXlBbGxDaGlsZCA9IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoIWtleVNlYXJjaCB8fCAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LnNlYXJjaEFsbExldmVsICYmICh0ZXh0LmluY2x1ZGVzKGtleVNlYXJjaCkgfHwgdGV4dEVzY2FwZS5pbmNsdWRlcyhrZXlTZWFyY2gpKSkpIHtcbiAgICAgICAgaXRlbU1hcC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LmRpc3BsYXlBbGxDaGlsZCA9IHRydWU7XG4gICAgICAgICAgY3VycmVudC5oYXNEaXNwbGF5ID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgaXRlbU1hcC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10gYXMgV3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+O1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5maWx0ZXJJdGVtc0Rpc3BsYXkodGhpcy5jb252ZXJ0RGF0YUJ5R3JvdXBJbkl0ZW0oaXRlbUdyb3VwPy4oKSB8fCBbXSwgaXRlbU1hcCkpO1xuXG4gICAgICAgIGNoaWxkcmVuPy5zZXQoZGF0YSk7XG4gICAgICAgIGlmIChjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpKSB7XG4gICAgICAgICAgY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdLnVwZGF0ZSgoaXRlbUZpZWxkczogQXJyYXk8YW55PikgPT4ge1xuICAgICAgICAgICAgaWYgKCFpdGVtRmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlbUZpZWxkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW1GaWVsZHNbMF0uaXNGaXJzdCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBpdGVtRmllbGRzPy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICBpZiAobGFzdEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgaXRlbUZpZWxkc1tsYXN0SW5kZXhdLmlzTGFzdCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpdGVtRmllbGRzO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuYm9udXNQYWRkaW5nTGVmdCA9IDA7XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldEJvbnVzUGFkZGluZ0xlZnRJdGVtKSB7XG4gICAgICAgICAgY3VycmVudC5ib251c1BhZGRpbmdMZWZ0ID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRCb251c1BhZGRpbmdMZWZ0SXRlbShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtTm9EYXRhKSB7XG4gICAgICAgICAgY3VycmVudC5jbGFzc0luY2x1ZGVJdGVtTm9EYXRhID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtTm9EYXRhKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuYXZhdGFyQ29uZmlnID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRBdmF0YXJDb25maWcgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRBdmF0YXJDb25maWcoY3VycmVudCk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKSAmJiB0aGlzLm11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5zb21lKChrZXkpID0+IGtleSA9PT0gaXRlbU1hcCgpW3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlckNoYW5nZUNoZWNrZWQodHJ1ZSwgaXRlbU1hcCwgZmFsc2UsIHRydWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5idWlsZFZhbHVlQnlDb25maWcoaXRlbU1hcCk7XG5cbiAgICAgIHJldHVybiBpdGVtTWFwO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpPy5zZWFyY2hBbGxMZXZlbCAmJiB0aGlzLmtleVNlYXJjaCgpKSB7XG4gICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbSgpLmhhc0Rpc3BsYXk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcoKT8uc29ydD8uKGl0ZW1zKTtcbiAgICB0aGlzLml0ZW1zLnNldChpdGVtcyk7XG4gICAgdGhpcy5tdWx0aUtleVNlbGVjdGVkLnNldChbXSk7XG4gICAgY29uc3QgY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2VzcyA9ICgpID0+IHtcbiAgICAgIHRoaXMuY2FsY3VsYXRvckhlaWdoSXRlbVN1Y2Nlc3Muc2V0KHRydWUpO1xuXG4gICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5leHBhbmRGaXJzdEl0ZW0gJiYgdGhpcy5pdGVtcygpWzBdKSB7XG4gICAgICAgIHRoaXMuZXhwYW5kQWxsSXRlbXNJbkdyb3VwKHRoaXMuaXRlbXMoKVswXSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0SGVpZ2h0Vmlld1BvcnQoKTtcbiAgICAgIGlmICh0aGlzLmZpcnN0SXRlbVNlbGVjdGVkICYmIHRoaXMuZmlyc3RJdGVtU2VsZWN0ZWQoKSkge1xuICAgICAgICB0aGlzLmhhbmRsZXJDaGFuZ2VDaGVja2VkKHRydWUsIHRoaXMuZmlyc3RJdGVtU2VsZWN0ZWQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5maXJzdEl0ZW1TZWxlY3RlZC5zZXQodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGNoZWNrTG9hZEl0ZW0gPSAocHJlU3RhdGVIYXNTY3JvbGw6IGJvb2xlYW4sIGN1cnJlbnRIYXNTY3JvbGw6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh0aGlzLmtleXNIaWRkZW5JdGVtKCk/Lmxlbmd0aCAmJiBwcmVTdGF0ZUhhc1Njcm9sbCAmJiAhY3VycmVudEhhc1Njcm9sbCAmJiB0aGlzLmlzU2VhcmNoT25saW5lKCkpIHtcbiAgICAgICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXcoY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2VzcywgY2hlY2tMb2FkSXRlbSk7XG4gICAgICB0aGlzLm91dExvYWRJdGVtc0NvbXBsZXRlLmVtaXQoeyBpdGVtczogdGhpcy5pdGVtcygpIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVmlldyhjYWxsQmFja0NhbGN1bGF0b3JIZWlnaHRTdWNjZXNzPzogKCkgPT4gdm9pZCwgY2hlY2tMb2FkSXRlbT86IChwcmVTdGF0ZUhhc1Njcm9sbDogYm9vbGVhbiwgY3VycmVudEhhc1Njcm9sbDogYm9vbGVhbikgPT4gdm9pZCkge1xuICAgIHRoaXMuc2V0SGVpZ2h0Vmlld1BvcnQoY2FsbEJhY2tDYWxjdWxhdG9ySGVpZ2h0U3VjY2Vzcyk7XG4gICAgdGhpcy5jaGVja1ZpZXdQb3J0U2Nyb2xsKGNoZWNrTG9hZEl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBhbmRBbGxJdGVtc0luR3JvdXAoaXRlbTogYW55KSB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXQoaXRlbSwgJ2V4cGFuZCcsIHRydWUpO1xuICAgIGNvbnN0IGl0ZW1zOiBBcnJheTxhbnk+ID0gaXRlbVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdO1xuXG4gICAgaWYgKGlzRW1wdHkoaXRlbXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW1Hcm91cCkgPT4gdGhpcy5leHBhbmRBbGxJdGVtc0luR3JvdXAoaXRlbUdyb3VwKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREYXRhQnlHcm91cEluSXRlbShpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4sIHBhcmVudEl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4pIHtcbiAgICBjb25zdCBjb25maWdUZW1wbGF0ZUdyb3VwID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk7XG4gICAgaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwIHx8ICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zTWFwID0gaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXNOaWwoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pIHx8IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSAnJykge1xuICAgICAgICBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9IGAke3RoaXMuUEFUVEVSTl9GQUtFX0lEfSR7dXVpZCgpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtTWFwID0gY2xvbmVEZWVwKGl0ZW0pIGFzIFdyaXRhYmxlU2lnbmFsPGFueT47XG5cbiAgICAgIGl0ZW1NYXAudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQucmVmID0gaXRlbTtcbiAgICAgICAgY3VycmVudC5wYXJlbnRJdGVtID0gcGFyZW50SXRlbTtcbiAgICAgICAgY3VycmVudFt0aGlzLmZpZWxkS2V5KCldID0gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV07XG5cbiAgICAgICAgY3VycmVudC5tYXhMZXZlbEdyb3VwID0gcGFyZW50SXRlbSgpLm1heExldmVsR3JvdXA7XG4gICAgICAgIGN1cnJlbnQubGV2ZWwgPSBwYXJlbnRJdGVtKCkubGV2ZWwgKyAxO1xuICAgICAgICBjdXJyZW50LmFycmF5TGV2ZWwgPSByYW5nZSgyLCBjdXJyZW50LmxldmVsICsgMSk7XG4gICAgICAgIGlmICgoY3VycmVudC5sZXZlbCA9PT0gY3VycmVudC5tYXhMZXZlbEdyb3VwIHx8ICFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94SXRlbSkgJiYgIVN0cmluZyhpdGVtKClbdGhpcy5maWVsZEtleSgpXSk/LmluY2x1ZGVzKHRoaXMuUEFUVEVSTl9GQUtFX0lEKSkge1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4gY3VycmVudCsrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnQuZXhwYW5kID0gdGhpcy5rZXlTZWFyY2goKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLmtleVNlYXJjaCgpICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0RXhwYW5kSXRlbSkge1xuICAgICAgICAgIGN1cnJlbnQuZXhwYW5kID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRFeHBhbmRJdGVtKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuZGlzcGxheUFsbENoaWxkID0gcGFyZW50SXRlbSgpLmRpc3BsYXlBbGxDaGlsZDtcbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0UG9wb3Zlckl0ZW0pIHtcbiAgICAgICAgICBjdXJyZW50LmRhdGFQb3BvdmVyID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRQb3BvdmVySXRlbShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRJY29uSW1hZ2VDbGFzcykge1xuICAgICAgICAgIGN1cnJlbnQuaWNvbkltYWdlQ2xhc3MgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEljb25JbWFnZUNsYXNzKGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRleHQgPSBkZWxldGVVbmljb2RlKHRoaXMuYnVpbGRWYWx1ZUJ5Q29uZmlnKGlzU2lnbmFsKGN1cnJlbnQpID8gKGN1cnJlbnQgYXMgV3JpdGFibGVTaWduYWw8YW55PikgOiBzaWduYWwoY3VycmVudCkpLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgICAgICBjb25zdCBrZXlTZWFyY2ggPSBkZWxldGVVbmljb2RlKGVzY2FwZUh0bWwoKHRoaXMua2V5U2VhcmNoKCkgfHwgJycpLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk7XG4gICAgICAgIGNvbnN0IHRleHRFc2NhcGUgPSBlc2NhcGVIdG1sKHRleHQpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRoaXMua2V5c0hpZGRlbkl0ZW0oKT8uc29tZSgoa2V5KSA9PiBrZXkgPT09IGN1cnJlbnRbdGhpcy5maWVsZEtleSgpXSkgJiZcbiAgICAgICAgICAocGFyZW50SXRlbSgpLmRpc3BsYXlBbGxDaGlsZCB8fCAha2V5U2VhcmNoIHx8ICgoY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCAhY3VycmVudFt0aGlzLmZpZWxkS2V5KCldLmluY2x1ZGVzKHRoaXMuUEFUVEVSTl9GQUtFX0lEKSkgJiYgKHRleHQuaW5jbHVkZXMoa2V5U2VhcmNoKSB8fCB0ZXh0RXNjYXBlLmluY2x1ZGVzKGtleVNlYXJjaCkpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3VycmVudC5kaXNwbGF5QWxsQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUl0ZW0oY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbUdyb3VwID0gY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcbiAgICAgICAgaWYgKGl0ZW1Hcm91cD8uKCkpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5maWx0ZXJJdGVtc0Rpc3BsYXkodGhpcy5jb252ZXJ0RGF0YUJ5R3JvdXBJbkl0ZW0oaXRlbUdyb3VwPy4oKSwgc2lnbmFsKGN1cnJlbnQpKSk7XG4gICAgICAgICAgaXRlbUdyb3VwLnNldChkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50W2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRJdGVtc10/LigpKSB7XG4gICAgICAgICAgY3VycmVudFtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdLnVwZGF0ZSgoaXRlbUZpZWxkczogQXJyYXk8YW55PikgPT4ge1xuICAgICAgICAgICAgaWYgKCFpdGVtRmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlbUZpZWxkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW1GaWVsZHNbMF0uaXNGaXJzdCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBpdGVtRmllbGRzPy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICBpZiAobGFzdEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgaXRlbUZpZWxkc1tsYXN0SW5kZXhdLmlzTGFzdCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpdGVtRmllbGRzO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuYm9udXNQYWRkaW5nTGVmdCA9IDA7XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldEJvbnVzUGFkZGluZ0xlZnRJdGVtKSB7XG4gICAgICAgICAgY3VycmVudC5ib251c1BhZGRpbmdMZWZ0ID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRCb251c1BhZGRpbmdMZWZ0SXRlbShjdXJyZW50LCBwYXJlbnRJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtTm9EYXRhKSB7XG4gICAgICAgICAgY3VycmVudC5jbGFzc0luY2x1ZGVJdGVtTm9EYXRhID0gY29uZmlnVGVtcGxhdGVHcm91cC5nZXRDbGFzc0luY2x1ZGVJdGVtTm9EYXRhKGN1cnJlbnQsIHBhcmVudEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmdldExpbmtJbWFnZUVycm9yKSB7XG4gICAgICAgICAgY3VycmVudC5saW5rSW1hZ2VFcnJvciA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IoY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbUNvbnRlbnQpIHtcbiAgICAgICAgICBjdXJyZW50LmNsYXNzSW5jbHVkZSA9IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q2xhc3NJbmNsdWRlSXRlbUNvbnRlbnQoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudC5hdmF0YXJDb25maWcgPSBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEF2YXRhckNvbmZpZyAmJiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEF2YXRhckNvbmZpZyhjdXJyZW50KTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpICYmIHRoaXMubXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGggJiYgdGhpcy5tdWx0aUtleVNlbGVjdGVkKCk/LnNvbWUoKGtleSkgPT4ga2V5ID09PSBjdXJyZW50W3RoaXMuZmllbGRLZXkoKV0pKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVyQ2hhbmdlQ2hlY2tlZCh0cnVlLCBzaWduYWwoY3VycmVudCksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RGaXJzdEl0ZW0oKSAmJiBjdXJyZW50LmxldmVsID09PSBjdXJyZW50Lm1heExldmVsR3JvdXApIHtcbiAgICAgICAgICB0aGlzLmZpcnN0SXRlbVNlbGVjdGVkLnNldChjdXJyZW50KTtcbiAgICAgICAgICB0aGlzLnNlbGVjdEZpcnN0SXRlbS5zZXQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGl0ZW1NYXA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXRlbXNNYXA7XG4gIH1cblxuICBwcml2YXRlIHNldERpc3BsYXlJdGVtKGl0ZW06IGFueSkge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXQoaXRlbSwgJ2hhc0Rpc3BsYXknLCB0cnVlKTtcblxuICAgIGNvbnN0IHBhcmVudEl0ZW0gPSBnZXQoaXRlbSwgJ3BhcmVudEl0ZW0nKTtcbiAgICBpZiAoZ2V0KHBhcmVudEl0ZW0sICcnKSkge1xuICAgICAgdGhpcy5zZXREaXNwbGF5SXRlbShwYXJlbnRJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckl0ZW1zRGlzcGxheShpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4pOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+PiB7XG4gICAgY29uc3QgY29uZmlnVGVtcGxhdGVHcm91cCA9IHRoaXMuY29uZmlnVGVtcGxhdGVHcm91cCgpO1xuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc0Rpc3BsYXkgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0oKS5oYXNEaXNwbGF5KTtcblxuICAgIGl0ZW1zRGlzcGxheS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBpdGVtR3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXTtcbiAgICAgIGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy5zZXQodGhpcy5maWx0ZXJJdGVtc0Rpc3BsYXkoaXRlbUdyb3VwPy4oKSB8fCBbXSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0ZW1zRGlzcGxheTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRMZW5ndGhJdGVtKCk6IG51bWJlciB7XG4gICAgY29uc3QgZGF0YSA9IHsgbGVuZ3RoOiB0aGlzLml0ZW1zKCkubGVuZ3RoIH07XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPiB0aGlzLm1heEl0ZW1TaG93KCkpIHtcbiAgICAgIHJldHVybiBkYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5nZXRMZW5ndGhBbGxHcm91cCh0aGlzLml0ZW1zKCksIGRhdGEpO1xuXG4gICAgcmV0dXJuIGRhdGEubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZW5ndGhBbGxHcm91cChpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4sIGRhdGE6IHsgbGVuZ3RoOiBudW1iZXIgfSkge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCAhaXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoIWl0ZW0oKS5leHBhbmQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IGl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdIGFzIFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+PjtcblxuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRhdGEubGVuZ3RoICs9IGdyb3VwPy4oKT8ubGVuZ3RoIHx8IDA7XG4gICAgICBpZiAoKCFncm91cD8uKCkgfHwgIWdyb3VwPy4oKS5sZW5ndGgpICYmIGl0ZW0oKS5sZXZlbCA9PT0gMSAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5hdXRvQ291bnRXaGVuR3JvdXBFbXB0eUl0ZW1MZXZlbDEpKSB7XG4gICAgICAgIGRhdGEubGVuZ3RoICs9IDE7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IHRoaXMubWF4SXRlbVNob3coKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmdldExlbmd0aEFsbEdyb3VwKGdyb3VwKCksIGRhdGEpO1xuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gdGhpcy5tYXhJdGVtU2hvdygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0SGVpZ2h0R3JvdXBIYXNMaW5lKCkge1xuICAgIGNvbnN0IGNvbmZpZ1RlbXBsYXRlR3JvdXAgPSB0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKTtcblxuICAgIGlmICghY29uZmlnVGVtcGxhdGVHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwPy5pZ25vcmVHcm91cExpbmUgfHwgIXRoaXMuaXRlbXMoKT8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgbGV0IGNvdW50ID0gMDtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKCkpIHtcbiAgICAgIGlmIChsZW5ndGggPj0gdGhpcy5tYXhJdGVtU2hvdygpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY291bnQgKz0gMTtcbiAgICAgIGxlbmd0aCArPSAxO1xuICAgICAgY29uc3QgZ3JvdXAgPSBpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXSBhcyBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+Pj47XG4gICAgICBjb25zdCBkYXRhID0geyBsZW5ndGg6IGl0ZW0oKS5leHBhbmQgPyBncm91cD8uKCk/Lmxlbmd0aCB8fCAwIDogMCB9O1xuXG4gICAgICB0aGlzLmdldExlbmd0aEFsbEdyb3VwKGdyb3VwKCksIGRhdGEpO1xuICAgICAgbGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBtYXJnaW5Ub3BIYXNMaW5lID0gY29uZmlnVGVtcGxhdGVHcm91cC5tYXJnaW5Ub3BIYXNMaW5lIHx8IDQ7XG4gICAgY29uc3QgaGVpZ2h0ID0gY291bnQgPT09IDEgPyBtYXJnaW5Ub3BIYXNMaW5lIDogKGNvdW50IC0gMSkgKiAobWFyZ2luVG9wSGFzTGluZSAqIDMgKyAxKTtcblxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGRWYWx1ZUJ5Q29uZmlnKGl0ZW06IFdyaXRhYmxlU2lnbmFsPGFueT4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhYmVsU2VhcmNoID0gdGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsU2VhcmNoPy4oaXRlbSgpKTtcblxuICAgIGlmIChpdGVtKCkuaXNSb290KSB7XG4gICAgICBpZiAodGhpcy5jb25maWdUZW1wbGF0ZUdyb3VwKCk/LmdldExhYmVsR3JvdXApIHtcbiAgICAgICAgaXRlbSgpLmZpZWxkTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TGFiZWxHcm91cChpdGVtKCkpIHx8ICcgJyk7XG5cbiAgICAgICAgcmV0dXJuIGxhYmVsU2VhcmNoID8/IGl0ZW0oKS5maWVsZExhYmVsO1xuICAgICAgfVxuICAgICAgaXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5maWVsZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoY3VycmVudC5sYWJlbCB8fCBjdXJyZW50Lm5hbWUgfHwgJyAnKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaXRlbSgpLmZpZWxkTGFiZWw7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TGFiZWxJdGVtKSB7XG4gICAgICBpdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LmZpZWxkTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmNvbmZpZ1RlbXBsYXRlR3JvdXAoKT8uZ2V0TGFiZWxJdGVtKGN1cnJlbnQpIHx8ICcgJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGxhYmVsU2VhcmNoID8/IGl0ZW0oKS5maWVsZExhYmVsO1xuICAgIH1cbiAgICBpdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5maWVsZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoY3VycmVudC5sYWJlbCB8fCBjdXJyZW50Lm5hbWUgfHwgJyAnKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGFiZWxTZWFyY2ggPz8gaXRlbSgpLmZpZWxkTGFiZWw7XG4gIH1cbn1cbiIsIkBpZiAoY29uZmlnVGVtcGxhdGVHcm91cCgpOyBhcyBjb25maWdUZW1wbGF0ZUdyb3VwKSB7XG4gIEBsZXQgY29uc3RIdG1sSGVpZ2h0Vmlld1BvcnQgPSBoZWlnaHRWaWV3UG9ydCgpID8gaGVpZ2h0Vmlld1BvcnQoKSArICdweCcgOiAnMTAwJSc7XG4gIEBsZXQgY29uc3RIdG1sRGlzYWJsZSA9IGxvYWRpbmcoKSB8fCBkaXNhYmxlKCkgfHwgZmFsc2U7XG4gIDxkaXZcbiAgICBjbGFzcz1cImxpYnMtdWktbGlzdC1ncm91cCBvdmVyZmxvdy1baGlkZGVuXVwiXG4gICAgW3N0eWxlLmhlaWdodF09XCJjb25zdEh0bWxIZWlnaHRWaWV3UG9ydFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgcmVsYXRpdmUgbWluLWgtWzI4cHhdXCI+XG4gICAgICBAaWYgKGl0ZW1zKCkubGVuZ3RoICYmIGNvbmZpZ1RlbXBsYXRlR3JvdXAuY29uZmlnQnV0dG9uU2VsZWN0QW5kVW5kU2VsZWN0SXRlbT8uKCk7IGFzIGNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0pIHtcbiAgICAgICAgPGRpdiBbY2xhc3NdPVwiJ2ZsZXggaXRlbXMtY2VudGVyIGJnLVsjZmZmZmZmXSAnICsgKGNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uY2xhc3NJbmNsdWRlID8/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCcpXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgW3R5cGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25DaGVja0FsbD8udHlwZSA/PyAnYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uQ2hlY2tBbGw/LmxhYmVsID8/ICdpMThuX3NlbGVjdF9hbGxfc2VhcmNoZWRfcmVzdWx0cydcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvbkNoZWNrQWxsPy5jbGFzc0luY2x1ZGUgfHwgJ3ByLVs4cHhdJ1wiXG4gICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvbkNoZWNrQWxsPy5jbGFzc0xhYmVsIHx8ICdsaWJzLXVpLWZvbnQtaDZyJ1wiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJjb25zdEh0bWxEaXNhYmxlXCJcbiAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2hlY2tlZE9yVW5DaGVja2VkQWxsKHRydWUpXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1bIzk5OTk5OV1cIj58PC9kaXY+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgW3R5cGVdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25VbmNoZWNrQWxsPy50eXBlID8/ICdidXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnQnV0dG9uU2VsZWN0SXRlbS5idXR0b25VbmNoZWNrQWxsPy5sYWJlbCA/PyAnaTE4bl91bnNlbGVjdF9hbGxfc2VhcmNoZWRfcmVzdWx0cydcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjb25maWdCdXR0b25TZWxlY3RJdGVtLmJ1dHRvblVuY2hlY2tBbGw/LmNsYXNzSW5jbHVkZSB8fCAncGwtWzhweF0nXCJcbiAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cImNvbmZpZ0J1dHRvblNlbGVjdEl0ZW0uYnV0dG9uVW5jaGVja0FsbD8uY2xhc3NMYWJlbCB8fCAnbGlicy11aS1mb250LWg2cydcIlxuICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uc3RIdG1sRGlzYWJsZVwiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNoZWNrZWRPclVuQ2hlY2tlZEFsbChmYWxzZSlcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoaXRlbXMoKS5sZW5ndGggJiYgY29uZmlnVGVtcGxhdGVHcm91cC5jb25maWdDaGVja2JveENoZWNrQWxsPy4oKTsgYXMgY29uZmlnQ2hlY2tCb3gpIHtcbiAgICAgICAgPGRpdiBbY2xhc3NdPVwiJ2ZsZXggbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwgJyArIChjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZUhhc0NvbmZpZ0NoZWNrQm94QWxsID8/ICcgYmctWyNmZmZmZmZdJylcIj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LXNpbmdsZVxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZ0NoZWNrQm94LmxhYmVsID8/ICdpMThuX2FsbCdcIlxuICAgICAgICAgICAgW2NsYXNzTGFiZWxJbmNsdWRlXT1cImNvbmZpZ0NoZWNrQm94LmNsYXNzTGFiZWxJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInRvdGFsSXRlbUNoZWNrZWQoKSA+PSB0b3RhbEl0ZW0oKSAmJiB0b3RhbEl0ZW0oKSA+IDBcIlxuICAgICAgICAgICAgW2Rpc2FibGVdPVwiY29uc3RIdG1sRGlzYWJsZVwiXG4gICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPVwiaGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGVja2VkT3JVbkNoZWNrZWRBbGwoJGV2ZW50LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGl0ZW1zKCkgJiYgaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBoLWZ1bGwgcmVsYXRpdmUgZmxleFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgICAgICBjbGFzcz1cInctZnVsbCBoLWZ1bGwgYWJzb2x1dGUgdG9wLTAgbGVmdC0wIHt7IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlR3JvdXAgPyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZUdyb3VwIDogJycgfX1cIj5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXMoKTsgdHJhY2sgaXRlbSgpW2ZpZWxkS2V5KCldOyBsZXQgZmlyc3QgPSAkZmlyc3Q7IGxldCBsYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICNpdGVtUmVmXG4gICAgICAgICAgICAgICAgW3N0eWxlLm1hcmdpblRvcC5weF09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVHcm91cExpbmUgPyBjb25maWdUZW1wbGF0ZUdyb3VwLm1hcmdpblRvcEhhc0xpbmUgfHwgNCA6IDBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sUGFkZGluZyA9IGxldmVsKCkgKiAoY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlID8gOCA6IDE2KTtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHB5LVs2cHhdXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJnLWxpc3QtaG92ZXJdPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlQ2xpY2tMYWJlbEdyb3VwXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJnLWxpc3QtaG92ZXItYWN0aXZlXT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNsaWNrTGFiZWxHcm91cFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuIWN1cnNvci1wb2ludGVyXT1cIiFjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNsaWNrTGFiZWxHcm91cCAmJiAoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSlcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmdMZWZ0LnB4XT1cImNvbnN0SHRtbFBhZGRpbmdcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmdSaWdodC5weF09XCJjb25zdEh0bWxQYWRkaW5nXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94R3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtID8gaGFuZGxlclRvZ2dsZUV4cGFuZCgkZXZlbnQsIGl0ZW0pIDogdW5kZWZpbmVkXCI+XG4gICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSkge1xuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgYmVmb3JlOiF0ZXh0LVsxNnB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJvdGF0ZS05MF09XCJpdGVtKCkuZXhwYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgkZXZlbnQsIGl0ZW0pXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAhY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlICYmICghY29uZmlnVGVtcGxhdGVHcm91cC5zZWFyY2hBbGxMZXZlbCB8fCAhIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKT8ubGVuZ3RoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtMTZweCldXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ2xlZnQnIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1JhZGlvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdmF0YXJDb25maWddPVwiaXRlbSgpLmF2YXRhckNvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWwtWzhweF1dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVDaGVja2JveF09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94R3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZUl0ZW0gfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnctYXV0b109XCJjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnctZnVsbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKT8ubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLndpZHRoTGFiZWxTdWIyNFdoZW5Ob3RUcmVlVmlldykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1heC13LVtjYWxjKDEwMCUtMjRweCldXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAud2lkdGhMYWJlbFN1YjI0V2hlbk5vdFRyZWVWaWV3KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtKCkuZmllbGRMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJpdGVtKCkuZGF0YVBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleExhYmVsXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuekluZGV4TGFiZWwgPz8gekluZGV4KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFDb21wb25lbnRPdXRsZXRdPVwidW5kZWZpbmVkIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogY29uZmlnVGVtcGxhdGVHcm91cC5nZXREYXRhQ29tcG9uZW50T3V0bGV0R3JvdXAgOiBpdGVtKCkgOiBmaWVsZEtleSgpIDogeyB2YWx1ZUlzRW1wdHk6IHsgaXRlbTogaXRlbSgpIH0gfSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRPdXRsZXRdPVwiMCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q29tcG9uZW50T3V0bGV0R3JvdXAgOiBpdGVtKCkgOiBmaWVsZEtleSgpIDogeyB2YWx1ZUlzMDogMCB9IHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xpbmtJbWFnZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRJbWFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKCdhdmF0YXInIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogKGl0ZW0oKS5zcGVjaWZpY19sb2FkSW1nRXJyb3IgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IgOiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlKSA6IGl0ZW0oKSB8IGFzeW5jKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtIHx8ICcnXVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbWdUeXBlSWNvbl09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmltZ1R5cGVJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsSW5jbHVkZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gPyBjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzTGFiZWxJdGVtIDogY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlID8gJyBsaWJzLXVpLWZvbnQtaDZyICcgOiAnIGxpYnMtdWktZm9udC1oNnMgJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVUZXh0VXBwZXJjYXNlTGFiZWxHcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWUgPyAnJyA6ICcgdGV4dC11cHBlcmNhc2UgJylcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgKGl0ZW0oKVtmaWVsZEtleSgpXSB8IExpYnNVaUNoZWNrU2VsZWN0ZWRCeUtleVBpcGU6IGtleXNEaXNhYmxlSXRlbSgpIDoga2V5c0Rpc2FibGVJdGVtKCk/Lmxlbmd0aClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZToga2V5c0NoZWNrZWQoKSA6IGtleXNDaGVja2VkKCkubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdGlsbE90aGVyT3B0aW9uc109XCJpdGVtKClbZmllbGRLZXkoKV0gfCBMaWJzVWlDaGVja1NlbGVjdGVkQnlLZXlQaXBlOiBrZXlzU3RpbGxPdGhlck9wdGlvbnMoKSA6IGtleXNTdGlsbE90aGVyT3B0aW9ucygpLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VDaGVja2VkKCRldmVudC5jaGVja2VkLCBpdGVtLCB0cnVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPVwiaGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2xpY2tMYWJlbCk9XCJoYW5kbGVyVG9nZ2xlRXhwYW5kKCdjbGlja0xhYmVsJywgaXRlbSwgY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEdyb3VwIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1JhZGlvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1yYWRpby1zaW5nbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tbC1bOHB4XV09XCJjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0JyB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F2YXRhckNvbmZpZ109XCJpdGVtKCkuYXZhdGFyQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZ25vcmVSYWRpb109XCJjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVJhZGlvR3JvdXAgfHwgY29uZmlnVGVtcGxhdGVHcm91cC5zaW5nbGVTZWxlY3RJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb25maWdUZW1wbGF0ZUdyb3VwLmNsYXNzSW5jbHVkZUl0ZW0gfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnctYXV0b109XCJjb25maWdUZW1wbGF0ZUdyb3VwLmlzVmlld1RyZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnctZnVsbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWl0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdPy4oKT8ubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLndpZHRoTGFiZWxTdWIyNFdoZW5Ob3RUcmVlVmlldykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1heC13LVtjYWxjKDEwMCUtMjRweCldXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlIHx8IGNvbmZpZ1RlbXBsYXRlR3JvdXAud2lkdGhMYWJlbFN1YjI0V2hlbk5vdFRyZWVWaWV3KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnVGVtcGxhdGVHcm91cC5pY29uRXhwYW5kID09PSAnbGVmdCcgfHwgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWNvbkV4cGFuZCA9PT0gJ3JpZ2h0JyAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtKCkuZmllbGRMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJpdGVtKCkuZGF0YVBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFDb21wb25lbnRPdXRsZXRdPVwidW5kZWZpbmVkIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogY29uZmlnVGVtcGxhdGVHcm91cC5nZXREYXRhQ29tcG9uZW50T3V0bGV0R3JvdXAgOiBpdGVtKCkgOiBmaWVsZEtleSgpIDogeyB2YWx1ZUlzRW1wdHk6IHsgaXRlbTogaXRlbSgpIH0gfSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnRPdXRsZXRdPVwiMCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0Q29tcG9uZW50T3V0bGV0R3JvdXAgOiBpdGVtKCkgOiBmaWVsZEtleSgpIDogeyB2YWx1ZUlzMDogMCB9IHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleExhYmVsXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuekluZGV4TGFiZWwgPz8gekluZGV4KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ltZ1R5cGVJY29uXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXAuaW1nVHlwZUljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xpbmtJbWFnZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRJbWFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKCdhdmF0YXInIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTogKGl0ZW0oKS5zcGVjaWZpY19sb2FkSW1nRXJyb3IgJiYgY29uZmlnVGVtcGxhdGVHcm91cC5nZXRMaW5rSW1hZ2VFcnJvciA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuZ2V0TGlua0ltYWdlRXJyb3IgOiBjb25maWdUZW1wbGF0ZUdyb3VwLmdldEltYWdlKSA6IGl0ZW0oKSB8IGFzeW5jKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbSgpW2NvbmZpZ1RlbXBsYXRlR3JvdXAuZmllbGRHZXRBdmF0YXJJdGVtIHx8ICcnXVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsSW5jbHVkZV09XCIoY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0xhYmVsSXRlbSA/IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NMYWJlbEl0ZW0gOiAnbGlicy11aS1mb250LWg2cyAnKSArIChjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVRleHRVcHBlcmNhc2VMYWJlbEdyb3VwID8gJycgOiAnIHVwcGVyY2FzZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlKCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ1RlbXBsYXRlR3JvdXAuZGlzYWJsZUl0ZW1Ob3RMYXN0TGV2ZWwgJiYgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnVGVtcGxhdGVHcm91cC5pZ25vcmVDaGVja2JveEdyb3VwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1RlbXBsYXRlR3JvdXAuc2luZ2xlU2VsZWN0SXRlbSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZToga2V5c0Rpc2FibGVJdGVtKCkgOiBrZXlzRGlzYWJsZUl0ZW0oKT8ubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiaXRlbSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZToga2V5c0NoZWNrZWQoKSA6IGtleXNDaGVja2VkKCkubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUNoZWNrZWQoJGV2ZW50LmFjdGl2ZSwgaXRlbSwgdHJ1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyKT1cImhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENsaWNrTGFiZWwpPVwiaGFuZGxlclRvZ2dsZUV4cGFuZCgnY2xpY2tMYWJlbCcsIGl0ZW0sIGNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlUmFkaW9Hcm91cCB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbSgpLmJ1dHRvbkluR3JvdXA7IGFzIGJ1dHRvbkluR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJidXR0b25Jbkdyb3VwLnR5cGUgfHwgJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJidXR0b25Jbkdyb3VwLmxhYmVsIHx8ICcgJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCIoYnV0dG9uSW5Hcm91cC5jbGFzc0ljb25MZWZ0IHx8ICcnKSArICcgZmxleCBtci1bOHB4XSAhdGV4dC1bOHB4XSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b25Jbkdyb3VwLmNsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NMYWJlbF09XCJidXR0b25Jbkdyb3VwLmNsYXNzTGFiZWwgfHwgJ2xpYnMtdWktZm9udC1oNXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlXT1cImJ1dHRvbkluR3JvdXAuZGlzYWJsZSB8fCBkaXNhYmxlKCkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0J1dHRvbkdyb3VwKGJ1dHRvbkluR3JvdXAsIGl0ZW0oKSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdyaWdodCcgJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSAmJiAoIWNvbmZpZ1RlbXBsYXRlR3JvdXAuc2VhcmNoQWxsTGV2ZWwgfHwgISFpdGVtKClbY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEl0ZW1zXT8uKCk/Lmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyIGxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IGJlZm9yZTohdGV4dC1bMTZweF1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy4hbWwtWzhweF1dPVwiaXRlbSgpLmRhdGFQb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mucm90YXRlLTkwXT1cIml0ZW0oKS5leHBhbmRcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyVG9nZ2xlRXhwYW5kKCRldmVudCwgaXRlbSlcIj48L2k+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgQGlmIChpdGVtKCkuZXhwYW5kICYmIGNhbGN1bGF0b3JIZWlnaEl0ZW1TdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGlzdC10ZW1wbGF0ZXNfZ3JvdXAtaXRlbVxuICAgICAgICAgICAgICAgICAgICBba2V5U2VhcmNoXT1cImtleVNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW0oKVtjb25maWdUZW1wbGF0ZUdyb3VwLmZpZWxkR2V0SXRlbXNdKClcIlxuICAgICAgICAgICAgICAgICAgICBbcGFyZW50SXRlbV09XCJpdGVtKClcIlxuICAgICAgICAgICAgICAgICAgICBbZmllbGRLZXldPVwiZmllbGRLZXkoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtrZXlzQ2hlY2tlZF09XCJrZXlzQ2hlY2tlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2tleXNEaXNhYmxlSXRlbV09XCJrZXlzRGlzYWJsZUl0ZW0oKSB8fCBbXVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWdUZW1wbGF0ZUdyb3VwXT1cImNvbmZpZ1RlbXBsYXRlR3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2tleXNTdGlsbE90aGVyT3B0aW9uc109XCJrZXlzU3RpbGxPdGhlck9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2VWaWV3KT1cImhhbmRsZXJDaGFuZ2VWaWV3KClcIlxuICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZVBvcG92ZXIpPVwiaGFuZGxlckNoYW5nU3RhZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZUl0ZW1DaGVja2VkKCRldmVudC5pdGVtKVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoIWxhc3QgJiYgIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlR3JvdXBMaW5lICYmIGNhbGN1bGF0b3JIZWlnaEl0ZW1TdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWxpc3QtZ3JvdXAtbGluZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW5Ub3AucHhdPVwiIWNvbmZpZ1RlbXBsYXRlR3JvdXAuaWdub3JlR3JvdXBMaW5lID8gY29uZmlnVGVtcGxhdGVHcm91cC5tYXJnaW5Ub3BIYXNMaW5lIHx8IDQgOiAwXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKCFpdGVtcygpIHx8ICFpdGVtcygpLmxlbmd0aCkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVyIHRleHQtWyNjMWMxYzFdIHJlbGF0aXZlIHt7IGNvbmZpZ1RlbXBsYXRlR3JvdXAuY2xhc3NJbmNsdWRlTm9kYXRhID8gY29uZmlnVGVtcGxhdGVHcm91cC5jbGFzc0luY2x1ZGVOb2RhdGEgOiAnJyB9fVwiXG4gICAgICAgICAgW3N0eWxlLm1hcmdpbkxlZnQucHhdPVwiXG4gICAgICAgICAgICAwXG4gICAgICAgICAgICAgIHwgTGlic1VpQ29tcG9uZW50c0xpc3RHcm91cENhbGN1bGF0b3JNYXJnaW5MZWZ0SXRlbVBpcGVcbiAgICAgICAgICAgICAgICA6IDJcbiAgICAgICAgICAgICAgICA6IGNvbmZpZ1RlbXBsYXRlR3JvdXAuaXNWaWV3VHJlZSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmljb25FeHBhbmQgPT09ICdsZWZ0J1xuICAgICAgICAgICAgICAgIDogY29uZmlnVGVtcGxhdGVHcm91cC5pc1ZpZXdUcmVlSnNvblxuICAgICAgICAgICAgICAgIDogIShjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZUNoZWNrYm94SXRlbSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLmlnbm9yZVJhZGlvSXRlbSB8fCBjb25maWdUZW1wbGF0ZUdyb3VwLnNpbmdsZVNlbGVjdEl0ZW0pXG4gICAgICAgICAgICAgICAgOiB0cnVlXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbY2xhc3MucHktWzhweF1dPVwiY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEF2YXRhckl0ZW1cIlxuICAgICAgICAgIFtjbGFzcy5weS1bNHB4XV09XCIhY29uZmlnVGVtcGxhdGVHcm91cC5maWVsZEdldEF2YXRhckl0ZW1cIj5cbiAgICAgICAgICBAaWYgKCFrZXlTZWFyY2goKSAmJiAhbG9hZGluZygpKSB7XG4gICAgICAgICAgICBAbGV0IGNvbnN0SHRtbFRleHROb0RhdGEgPSBjb25maWcoKT8udGV4dE5vRGF0YSB8fCAnaTE4bl9ub19kYXRhX3lldCc7XG4gICAgICAgICAgICA8ZGl2Pnt7IGNvbnN0SHRtbFRleHROb0RhdGEgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChrZXlTZWFyY2goKSAmJiAhbG9hZGluZygpKSB7XG4gICAgICAgICAgICBAbGV0IGNvbnN0SHRtbFRleHRTZWFyY2hOb0RhdGEgPSBjb25maWcoKT8udGV4dFNlYXJjaE5vRGF0YSB8fCAnaTE4bl9ub19yZXN1bHQnO1xuICAgICAgICAgICAgPGRpdj57eyBjb25zdEh0bWxUZXh0U2VhcmNoTm9EYXRhIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc3Bpbm5lciBbc2l6ZV09XCInbWVkaXVtJ1wiIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufVxuIl19