tnx-shared 5.1.339 → 5.1.342
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/tnx-shared.umd.js +31 -10
- package/bundles/tnx-shared.umd.js.map +1 -1
- package/bundles/tnx-shared.umd.min.js +1 -1
- package/bundles/tnx-shared.umd.min.js.map +1 -1
- package/classes/form-schema.d.ts +1 -0
- package/classes/form-schema.d.ts.map +1 -1
- package/components/common-app-component/app.menu.component.d.ts.map +1 -1
- package/components/common-app-component/common-app-component.d.ts.map +1 -1
- package/components/crud/crud-list/crud-list.component.d.ts +1 -0
- package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
- package/components/mask/mask.component.d.ts +2 -1
- package/components/mask/mask.component.d.ts.map +1 -1
- package/esm2015/classes/form-schema.js +2 -1
- package/esm2015/components/common-app-component/app.menu.component.js +2 -4
- package/esm2015/components/common-app-component/common-app-component.js +3 -2
- package/esm2015/components/crud/crud-form/crud-form.component.js +2 -2
- package/esm2015/components/crud/crud-list/crud-list.component.js +7 -2
- package/esm2015/components/mask/mask.component.js +11 -5
- package/esm2015/components/tn-dialog/tn-dialog.component.js +2 -2
- package/esm2015/models/types.js +5 -0
- package/esm2015/public-api.js +2 -1
- package/esm2015/services/base.service.js +4 -1
- package/esm2015/services/user.service.js +2 -2
- package/fesm2015/tnx-shared.js +30 -12
- package/fesm2015/tnx-shared.js.map +1 -1
- package/models/types.d.ts +15 -0
- package/models/types.d.ts.map +1 -0
- package/package.json +2 -2
- package/public-api.d.ts +1 -0
- package/public-api.d.ts.map +1 -1
- package/services/base.service.d.ts +1 -0
- package/services/base.service.d.ts.map +1 -1
- package/tnx-shared.metadata.json +1 -1
|
@@ -1472,6 +1472,11 @@ export class CrudListComponent extends ComponentBase {
|
|
|
1472
1472
|
copyLinkMultiple() {
|
|
1473
1473
|
this.onCopyLinkMultiple.emit(this.model.selectedItems);
|
|
1474
1474
|
}
|
|
1475
|
+
danhSoThuTuGroupLastest() {
|
|
1476
|
+
this.setting.baseService.sortGroupLastModelBase()
|
|
1477
|
+
.then(res => this.handleResponse(res, 'Đánh lại số thứ tự thành công', f => {
|
|
1478
|
+
}));
|
|
1479
|
+
}
|
|
1475
1480
|
showShareLinkForm(lstItem) {
|
|
1476
1481
|
this.shareLinkModel.showEditForm = true;
|
|
1477
1482
|
this.shareLinkModel.data.lstItem = lstItem;
|
|
@@ -2717,7 +2722,7 @@ CrudListComponent.decorators = [
|
|
|
2717
2722
|
{ type: Component, args: [{
|
|
2718
2723
|
// tslint:disable-next-line: component-selector
|
|
2719
2724
|
selector: 'crud-list',
|
|
2720
|
-
template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-header-area\">\r\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"p-grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('toolbar')\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar\">\r\n <button *ngIf=\"!hiddenAdd\" type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\r\n class=\"p-button-text\" [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\r\n <button *ngIf=\"setting.showExportSelectedItems && model.selectedItems.length > 0\"\r\n type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n type=\"button\" pButton pRipple\r\n [label]=\"'X\u00F3a ' + (model.selectedItems.length) | translate\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n <button *ngIf=\"!setting.disableShare && model.selectedItems.length > 0\"\r\n label=\"Chia s\u1EBB li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\r\n [pTooltip]=\"'Chia s\u1EBB li\u00EAn k\u1EBFt' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\r\n (click)=\"createShareLinkMultiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"p-col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\r\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\r\n (onDelete)=\"onDeleteSettings()\" (onCancel)=\"_showSettings = false\">\r\n</settings>\r\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\r\n (onCancel)=\"_showSettingsRowColor = false\">\r\n</settings-row>\r\n<workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\"></workflow-setting-dialog>\r\n<tn-dialog *ngIf=\"workflowSettingModel.showEditForm\" [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\"\r\n [popupSize]=\"workflowSettingModel.popupSize\" (onHide)=\"workflowSettingModel.showEditForm = false\">\r\n <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettingsNew($event)\"\r\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new>\r\n</tn-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [styleClass]=\"'allow-selected'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%; padding: 1rem\">\r\n <process-workflow-form #formBase [businessSetting]=\"processWorkflowModel.data.setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"choYKienModel.showEditForm\" #dialog [header]=\"choYKienModel.header | translate\"\r\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"choYKienModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <cho-y-kien-form #formBase [bussinessSetting]=\"choYKienModel.data.setting\"\r\n [rowItem]=\"choYKienModel.data.rowData\" (onSaved)=\"choYKienModel.showEditForm = false\"\r\n (onCancel)=\"choYKienModel.showEditForm = false\">\r\n </cho-y-kien-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <workflow-history-new #formBase [businessSetting]=\"workflowHistoryModel.data.setting\"\r\n [tableName]=\"workflowHistoryModel.data.tableName\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"detailTaskModel.showEditForm\" #dialog [header]=\"detailTaskModel.header | translate\"\r\n [popupSize]=\"detailTaskModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"detailTaskModel.showEditForm = false\">\r\n <base-congviec-form #formBase [model]=\"detailTaskModel.data.taskFormModel\" [forceOnlyView]=\"true\"\r\n (onCancel)=\"detailTaskModel.showEditForm = false\">\r\n </base-congviec-form>\r\n</tn-dialog>\r\n\r\n<!-- <tn-dialog *ngIf=\"showDetailForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"setting.popupHeader | translate\" [popupSize]=\"setting.popupSize\" (onHide)=\"showDetailForm = false\">\r\n <base-congviec-form #formBase [parentModel]=\"model\" [parentSetting]=\"setting\" [parentContext]=\"context\"\r\n [model]=\"formModel\" [crudList]=\"crudList\" (onSaved)=\"showDetailForm = false;crudList.reload()\"\r\n (onCancel)=\"_handleCancel($event)\" (onAfterSaved)=\"onAfterSaved($event)\">\r\n </base-congviec-form>\r\n</tn-dialog> -->\r\n\r\n<tn-dialog *ngIf=\"permissionSharingModel.showEditForm\" #dialog [header]=\"permissionSharingModel.header | translate\"\r\n [popupSize]=\"permissionSharingModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"permissionSharingModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <permission-sharing #formBase [item]=\"rowDataCurrent\" [baseService]=\"setting.baseService\"\r\n (onCancel)=\"permissionSharingModel.showEditForm = false\">\r\n </permission-sharing>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"permissionListModel.showEditForm\" #dialog [header]=\"permissionListModel.header | translate\"\r\n [popupSize]=\"permissionListModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"permissionListModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <workflow-permission #formBase [item]=\"rowDataCurrent\" [businessSetting]=\"setting\"\r\n (onCancel)=\"permissionListModel.showEditForm = false\">\r\n </workflow-permission>\r\n </div>\r\n</tn-dialog>\r\n<workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\r\n</workflow-history-dialog>\r\n<tn-dialog *ngIf=\"startWorkflowModel.showEditForm\" #dialog [header]=\"startWorkflowModel.header | translate\"\r\n [popupSize]=\"startWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"startWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\r\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\r\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\r\n </start-workflow>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"congViecModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\r\n (onHide)=\"congViecModel.showEditForm = false\">\r\n <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\r\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\r\n (onCancel)=\"congViecModel.showEditForm = false\">\r\n </base-congviec-form>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"shareLinkModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"shareLinkModel.header | translate\" [popupSize]=\"shareLinkModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"shareLinkModel.showEditForm = false\">\r\n <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"shareLinkModel.data.lstItem\"\r\n (onCancel)=\"congViecModel.showEditForm = false\">\r\n </share-link-by-permission>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"attachedTaskModel.showEditForm\" [header]=\"attachedTaskModel.header | translate\"\r\n [popupSize]=\"attachedTaskModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"attachedTaskModel.showEditForm = false\">\r\n <base-congviec [serviceCode]=\"setting.baseService.serviceCode\" [entity]=\"setting.baseService.entityName\"\r\n [itemIdAttach]=\"rowDataCurrent.id\"></base-congviec>\r\n</tn-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"rowExpansion; context: {rowData: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!rowGroup\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <span class=\"content-row-group\">\r\n <ng-container *ngIf=\"!contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #baseColgroup let-columns>\r\n <colgroup>\r\n <col *ngIf=\"!setting.hiddenCheckbox\" [style.width]=\"widthCheckbox\" />\r\n <col *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" />\r\n <col *ngIf=\"rowExpansion\" style=\"width: 2.5rem\" />\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <col *ngIf=\"col && col.visible && col.field!='function'\" [style.width]=\"col.width\" />\r\n </ng-container>\r\n <col *ngIf=\"enableReorderRow\" style=\"width: 30px\" />\r\n <col *ngIf=\"!setting.hiddenFunctionColumn\" [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\r\n </colgroup>\r\n</ng-template>\r\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n (dblclick)=\"reload()\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\"\r\n [tnSortableColumnDisabled]=\"!col.sort\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n [class.tricheckbox-custom-false]=\"checkedAll === false\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n [disabled]=\"!checkPermissionToUseButton(BUTTON_PHAN_QUYEN)\" (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n [disabled]=\"!checkPermissionToUseButton(BUTTON_CAU_HINH_QUY_TRINH)\"\r\n (click)=\"showSettingsWorkflowNew()\"></button>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\" [ngClass]=\"rowData.objStyleClass\"\r\n [class.ui-state-highlight]=\"rowData._checked\" [pTooltip]=\"rowData.tooltip\" tooltipPosition=\"top\"\r\n [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\" (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <td class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngIf=\"!rowData.hiddenCheckBox\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && (!rowData.hidden || !rowData.hidden[fieldOrder])\" class=\"stt\"\r\n style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"rowData.bookmarkStyle\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"rowExpansion\" class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow\" class=\"no-padding center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\r\n class=\"p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple [disabled]=\"disableEdit(rowData)\"\r\n [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\r\n (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"showMenuButtons && this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <span *ngIf=\"col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\r\n class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy'\" tooltipPosition=\"top\">\r\n {{rowData[field] | tnDate:col.dataType:col.format}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy HH:mm'\"\r\n tooltipPosition=\"top\">\r\n {{rowData[field] | tnDate:col.dataType:col.format}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'fileUpload'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fileUploadColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fileManagerColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span> ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <button *ngIf=\"!rowData.__workflowCode && !rowData.hiddenWorkflowAction && !rowData.hiddenStartWorkflow\" pButton\r\n class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\" style=\"border: 1px solid #7ca9cd;\"\r\n pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\r\n [disabled]=\"rowData.__startingWorkflow && !rowData.__notReadyForStart\"\r\n (click)=\"showFormStartWorkflow(rowData)\"></button>\r\n <ng-container *ngIf=\"rowData.__workflowCode\">\r\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n [disabled]=\"showingActionWorkflow\" (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #viewHistory let-rowData=\"rowData\">\r\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\r\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflow(setting, rowData)\"></button>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton *ngIf=\"!col.minimizeFilter\"\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n <ng-container *ngIf=\"col.minimizeFilter\">\r\n <button *ngIf=\"!filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter-slash\"\r\n class=\"btn-filter-boolean\" (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n <button *ngIf=\"filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter\"\r\n class=\"btn-filter-boolean p-button-primary\"\r\n (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #fileUploadColumn let-field=\"field\" let-rowData let-fileSetting=\"fileSetting\">\r\n <file-upload *ngIf=\"fileSetting.mode == FileUploadMode.usingFileInstanceId\"\r\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\r\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\">\r\n </file-upload>\r\n <service-file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingServiceFile\"\r\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"context\" [entity]=\"fileSetting.control.entity\"\r\n [entityKey]=\"rowData[fileSetting.control.entityKeyField]\" [control]=\"fileSetting.control\"\r\n [fileDataService]=\"fileSetting.control.fileDataService\" [(ngModel)]=\"rowData.field\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #fileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\r\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\r\n [maxFileSize]=\"fileSetting.control.maxFileSize\" [inTaiLieu]=\"fileSetting.control.inTaiLieu\"\r\n [(value)]=\"rowData[field]\">\r\n </file-manager>\r\n</ng-template>",
|
|
2725
|
+
template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-header-area\">\r\n <div *ngIf=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"p-grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('toolbar')\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar\">\r\n <button type=\"button\" pButton label=\"\u0110\u00E1nh STT\" class=\"p-button-text\" style=\"display: none\"\r\n (click)=\"danhSoThuTuGroupLastest()\"></button>\r\n <button *ngIf=\"!hiddenAdd\" type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\r\n class=\"p-button-text\" [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\r\n <button *ngIf=\"setting.showExportSelectedItems && model.selectedItems.length > 0\"\r\n type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n type=\"button\" pButton pRipple\r\n [label]=\"'X\u00F3a ' + (model.selectedItems.length) | translate\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n <button *ngIf=\"!setting.disableShare && model.selectedItems.length > 0\"\r\n label=\"Chia s\u1EBB li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\r\n [pTooltip]=\"'Chia s\u1EBB li\u00EAn k\u1EBFt' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\r\n (click)=\"createShareLinkMultiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"p-col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\r\n <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar [config]=\"configScrollBar\"\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\r\n (onDelete)=\"onDeleteSettings()\" (onCancel)=\"_showSettings = false\">\r\n</settings>\r\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\r\n (onCancel)=\"_showSettingsRowColor = false\">\r\n</settings-row>\r\n<workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\"></workflow-setting-dialog>\r\n<tn-dialog *ngIf=\"workflowSettingModel.showEditForm\" [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\"\r\n [popupSize]=\"workflowSettingModel.popupSize\" (onHide)=\"workflowSettingModel.showEditForm = false\">\r\n <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettingsNew($event)\"\r\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new>\r\n</tn-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [styleClass]=\"'allow-selected'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%; padding: 1rem\">\r\n <process-workflow-form #formBase [businessSetting]=\"processWorkflowModel.data.setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"choYKienModel.showEditForm\" #dialog [header]=\"choYKienModel.header | translate\"\r\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"choYKienModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <cho-y-kien-form #formBase [bussinessSetting]=\"choYKienModel.data.setting\"\r\n [rowItem]=\"choYKienModel.data.rowData\" (onSaved)=\"choYKienModel.showEditForm = false\"\r\n (onCancel)=\"choYKienModel.showEditForm = false\">\r\n </cho-y-kien-form>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <workflow-history-new #formBase [businessSetting]=\"workflowHistoryModel.data.setting\"\r\n [tableName]=\"workflowHistoryModel.data.tableName\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"detailTaskModel.showEditForm\" #dialog [header]=\"detailTaskModel.header | translate\"\r\n [popupSize]=\"detailTaskModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"detailTaskModel.showEditForm = false\">\r\n <base-congviec-form #formBase [model]=\"detailTaskModel.data.taskFormModel\" [forceOnlyView]=\"true\"\r\n (onCancel)=\"detailTaskModel.showEditForm = false\">\r\n </base-congviec-form>\r\n</tn-dialog>\r\n\r\n<!-- <tn-dialog *ngIf=\"showDetailForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"setting.popupHeader | translate\" [popupSize]=\"setting.popupSize\" (onHide)=\"showDetailForm = false\">\r\n <base-congviec-form #formBase [parentModel]=\"model\" [parentSetting]=\"setting\" [parentContext]=\"context\"\r\n [model]=\"formModel\" [crudList]=\"crudList\" (onSaved)=\"showDetailForm = false;crudList.reload()\"\r\n (onCancel)=\"_handleCancel($event)\" (onAfterSaved)=\"onAfterSaved($event)\">\r\n </base-congviec-form>\r\n</tn-dialog> -->\r\n\r\n<tn-dialog *ngIf=\"permissionSharingModel.showEditForm\" #dialog [header]=\"permissionSharingModel.header | translate\"\r\n [popupSize]=\"permissionSharingModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"permissionSharingModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <permission-sharing #formBase [item]=\"rowDataCurrent\" [baseService]=\"setting.baseService\"\r\n (onCancel)=\"permissionSharingModel.showEditForm = false\">\r\n </permission-sharing>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"permissionListModel.showEditForm\" #dialog [header]=\"permissionListModel.header | translate\"\r\n [popupSize]=\"permissionListModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"permissionListModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <workflow-permission #formBase [item]=\"rowDataCurrent\" [businessSetting]=\"setting\"\r\n (onCancel)=\"permissionListModel.showEditForm = false\">\r\n </workflow-permission>\r\n </div>\r\n</tn-dialog>\r\n<workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\r\n</workflow-history-dialog>\r\n<tn-dialog *ngIf=\"startWorkflowModel.showEditForm\" #dialog [header]=\"startWorkflowModel.header | translate\"\r\n [popupSize]=\"startWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"startWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\r\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\r\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\r\n </start-workflow>\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"congViecModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\r\n (onHide)=\"congViecModel.showEditForm = false\">\r\n <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\r\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\r\n (onCancel)=\"congViecModel.showEditForm = false\">\r\n </base-congviec-form>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"shareLinkModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"shareLinkModel.header | translate\" [popupSize]=\"shareLinkModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"shareLinkModel.showEditForm = false\">\r\n <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"shareLinkModel.data.lstItem\"\r\n (onCancel)=\"congViecModel.showEditForm = false\">\r\n </share-link-by-permission>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"attachedTaskModel.showEditForm\" [header]=\"attachedTaskModel.header | translate\"\r\n [popupSize]=\"attachedTaskModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"attachedTaskModel.showEditForm = false\">\r\n <base-congviec [serviceCode]=\"setting.baseService.serviceCode\" [entity]=\"setting.baseService.entityName\"\r\n [itemIdAttach]=\"rowDataCurrent.id\"></base-congviec>\r\n</tn-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"rowExpansion; context: {rowData: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"header, context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!rowGroup\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <span class=\"content-row-group\">\r\n <ng-container *ngIf=\"!contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"rowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #baseColgroup let-columns>\r\n <colgroup>\r\n <col *ngIf=\"!setting.hiddenCheckbox\" [style.width]=\"widthCheckbox\" />\r\n <col *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" />\r\n <col *ngIf=\"rowExpansion\" style=\"width: 2.5rem\" />\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <col *ngIf=\"col && col.visible && col.field!='function'\" [style.width]=\"col.width\" />\r\n </ng-container>\r\n <col *ngIf=\"enableReorderRow\" style=\"width: 30px\" />\r\n <col *ngIf=\"!setting.hiddenFunctionColumn\" [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\r\n </colgroup>\r\n</ng-template>\r\n<ng-template #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n (dblclick)=\"reload()\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\"\r\n [tnSortableColumnDisabled]=\"!col.sort\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n [class.tricheckbox-custom-false]=\"checkedAll === false\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n [disabled]=\"!checkPermissionToUseButton(BUTTON_PHAN_QUYEN)\" (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n [disabled]=\"!checkPermissionToUseButton(BUTTON_CAU_HINH_QUY_TRINH)\"\r\n (click)=\"showSettingsWorkflowNew()\"></button>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\" [ngClass]=\"rowData.objStyleClass\"\r\n [class.ui-state-highlight]=\"rowData._checked\" [pTooltip]=\"rowData.tooltip\" tooltipPosition=\"top\"\r\n [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\" (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <td class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngIf=\"!rowData.hiddenCheckBox\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && (!rowData.hidden || !rowData.hidden[fieldOrder])\" class=\"stt\"\r\n style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"rowData.bookmarkStyle\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"rowExpansion\" class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow\" class=\"no-padding center\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\r\n class=\"p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple [disabled]=\"disableEdit(rowData)\"\r\n [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\r\n (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"showMenuButtons && this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <span *ngIf=\"col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span>\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\r\n class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy'\" tooltipPosition=\"top\">\r\n {{rowData[field] | tnDate:col.dataType:col.format}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy HH:mm'\"\r\n tooltipPosition=\"top\">\r\n {{rowData[field] | tnDate:col.dataType:col.format}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'fileUpload'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fileUploadColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fileManagerColumn; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span> ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <button *ngIf=\"!rowData.__workflowCode && !rowData.hiddenWorkflowAction && !rowData.hiddenStartWorkflow\" pButton\r\n class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\" style=\"border: 1px solid #7ca9cd;\"\r\n pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\r\n [disabled]=\"rowData.__startingWorkflow && !rowData.__notReadyForStart\"\r\n (click)=\"showFormStartWorkflow(rowData)\"></button>\r\n <ng-container *ngIf=\"rowData.__workflowCode\">\r\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n [disabled]=\"showingActionWorkflow\" (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #viewHistory let-rowData=\"rowData\">\r\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\r\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflow(setting, rowData)\"></button>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton *ngIf=\"!col.minimizeFilter\"\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n <ng-container *ngIf=\"col.minimizeFilter\">\r\n <button *ngIf=\"!filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter-slash\"\r\n class=\"btn-filter-boolean\" (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n <button *ngIf=\"filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter\"\r\n class=\"btn-filter-boolean p-button-primary\"\r\n (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #fileUploadColumn let-field=\"field\" let-rowData let-fileSetting=\"fileSetting\">\r\n <file-upload *ngIf=\"fileSetting.mode == FileUploadMode.usingFileInstanceId\"\r\n [sharedFolderType]=\"fileSetting.control.sharedFolderType\" [readonly]=\"fileSetting.control.readonly\"\r\n [accept]=\"fileSetting.control.accept\" [(ngModel)]=\"rowData[field]\">\r\n </file-upload>\r\n <service-file-upload *ngIf=\"fileSetting.control.mode == FileUploadMode.usingServiceFile\"\r\n [serviceCode]=\"fileSetting.control.serviceCode\" [parentContext]=\"context\" [entity]=\"fileSetting.control.entity\"\r\n [entityKey]=\"rowData[fileSetting.control.entityKeyField]\" [control]=\"fileSetting.control\"\r\n [fileDataService]=\"fileSetting.control.fileDataService\" [(ngModel)]=\"rowData.field\">\r\n </service-file-upload>\r\n</ng-template>\r\n<ng-template #fileManagerColumn let-rowData let-fileSetting=\"fileSetting\" let-field=\"field\">\r\n <file-manager [control]=\"fileSetting.control\" [serviceCode]=\"fileSetting.control.serviceCode\"\r\n [entity]=\"fileSetting.control.entity\" [entityKey]=\"rowData[fileSetting.control.entityKeyField]\"\r\n [readonly]=\"fileSetting.control.readonly\" [layout]=\"fileSetting.control.layout\"\r\n [maxFileSize]=\"fileSetting.control.maxFileSize\" [inTaiLieu]=\"fileSetting.control.inTaiLieu\"\r\n [(value)]=\"rowData[field]\">\r\n </file-manager>\r\n</ng-template>",
|
|
2721
2726
|
providers: [DecimalPipe, DatePipe],
|
|
2722
2727
|
styles: [".container-table{display:flex;flex-direction:column;overflow:hidden}.container-table .container-table-inner{display:flex;height:auto;max-height:100%;min-height:60px;position:relative}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{border:1px solid #d1d1d1;border-radius:2px;bottom:0;cursor:pointer;display:flex;flex-wrap:wrap;height:1.4em;left:0;margin:auto;position:absolute;right:0;top:0;width:1.4em}.pick-color-row>div{background:#84d140;border:1px solid #fff;flex:0 0 50%}.pick-color-row>div:nth-child(2){background:#fc6868}.pick-color-row>div:nth-child(3){background:#fbc02d}.pick-color-row>div:nth-child(4){background:#7dc5ff}.cell-header-function{align-items:center;display:flex}.cell-header-function>span{flex:1 1;text-align:center}.cell-header-function button{height:24px;margin:0;padding:0;width:24px}.group-icon{color:#256aa2;font-weight:400}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{height:100%;left:0;position:absolute;top:0;width:5px}.column-function{min-width:100px;padding:0}.custom-search-area{background-color:#f2f2f2;margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em}.main-container-search-inner{margin-bottom:-.5em}.main-title>h1{font-size:1.2em}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{align-items:center;display:flex;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem;left:50%;position:absolute;top:50%;transform:translate(-50%,calc(-50% - 1px));width:2rem}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;font-weight:700;white-space:nowrap}.col-share-permission>div:not(:last-child){margin-bottom:5px}.advance-search-container{display:flex;justify-content:flex-end}.btn-filter-boolean{height:26px;width:26px}.btn-filter-boolean:not(.p-button-primary),.btn-filter-boolean:not(.p-button-primary):hover{background:#f5f6f8;border-color:#ced4da;color:#6c757d}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .main-title>*>h1{font-size:1.2em}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter .fixed-filter{min-width:200px;position:fixed;z-index:10}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{height:0;position:absolute;width:0}::ng-deep crud-list .cell-header-filter{position:relative}::ng-deep crud-list .cell-header-filter .tn-dropdown{height:32px}::ng-deep crud-list .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep crud-list .cell-header-filter .filter-box{background-color:#fff;border-radius:3px;display:flex;min-width:0}::ng-deep crud-list .cell-header-filter .filter-box>div{border:1px solid #ced4da;border-radius:3px 0 0 3px;border-right:none;flex:1;outline:none;overflow:hidden}::ng-deep crud-list .cell-header-filter .filter-box>span{align-items:center;background:#f5f6f8;border:1px solid #ced4da;color:#6c757d;cursor:pointer;display:inline-flex;flex-basis:32px;height:32px;justify-content:center;min-width:unset;outline:none}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep crud-list .cell-header-filter .filter-box input{border:none;box-shadow:none!important;padding-left:5px;padding-right:5px}::ng-deep crud-list .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep crud-list .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep crud-list .cell-header-filter.focus-within,::ng-deep crud-list .cell-header-filter:focus-within{z-index:10!important}::ng-deep crud-list .cell-header-filter.focus-within .filter-boolean-box .p-button,::ng-deep crud-list .cell-header-filter:focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep crud-list .cell-header-filter.focus-within .filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box{box-shadow:5px 0 15px 1px rgba(0,0,0,.27058823529411763);min-width:250px;position:absolute;top:calc(50% - 16px);z-index:2}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>div{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;flex:1;z-index:0}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>span.action-clear,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter>div,::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box,::ng-deep crud-list .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translateX(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{background-color:#eee;position:absolute;z-index:5}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{bottom:0;top:0;width:1px}::ng-deep crud-list .table-border-line.--bottom,::ng-deep crud-list .table-border-line.--top{height:1px;left:0;right:0}::ng-deep crud-list .table-border-line.--left{left:0}::ng-deep crud-list .table-border-line.--right{right:0}::ng-deep crud-list .table-border-line.--top{top:0}::ng-deep crud-list .table-border-line.--bottom{bottom:0}::ng-deep crud-list .filter-boolean-box{text-align:center}::ng-deep crud-list .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep crud-list .custom-search-area crud-form{width:100%}::ng-deep crud-list .custom-search-area .main-container-search-inner .container-control{overflow:hidden}::ng-deep crud-list>p-contextmenu{display:none}@media (max-width:640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}"]
|
|
2723
2728
|
},] }
|
|
@@ -2809,4 +2814,4 @@ CrudListComponent.propDecorators = {
|
|
|
2809
2814
|
onRollbackedWorkflow: [{ type: Output }],
|
|
2810
2815
|
onChangedStatusWorkflow: [{ type: Output }]
|
|
2811
2816
|
};
|
|
2812
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1saXN0L2NydWQtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JILE9BQU8sRUFBcUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xHLE9BQU8sRUFDSCx5QkFBeUIsRUFDekIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLFlBQVks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VUwsS0FBSzs2QkFVTCxLQUFLOzBCQUVMLE1BQU07MEJBQ04sTUFBTTt5QkFDTixNQUFNO3VCQUNOLE1BQU07eUJBQ04sTUFBTTtzQkFDTixNQUFNOzRCQUNOLE1BQU07b0JBQ04sTUFBTTtxQkFDTixNQUFNO3lCQUNOLE1BQU07aUNBQ04sTUFBTTtxQkFDTixNQUFNO3VCQUNOLE1BQU07K0JBQ04sTUFBTTtnQ0FDTixNQUFNOzZCQUNOLE1BQU07Z0NBQ04sTUFBTTtrQ0FDTixNQUFNO21DQUNOLE1BQU07c0NBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlLCBEZWNpbWFsUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgICBBZnRlckNvbnRlbnRJbml0LFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgQ29udGVudENoaWxkLFxyXG4gICAgQ29udGVudENoaWxkcmVuLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBQaXBlVHJhbnNmb3JtLFxyXG4gICAgUXVlcnlMaXN0LFxyXG4gICAgVGVtcGxhdGVSZWYsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9jb250ZXh0bWVudSc7XHJcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvdGFibGUnO1xyXG5cclxuaW1wb3J0IHsgQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb21wb25lbnQtYmFzZSc7XHJcbmltcG9ydCB7IElMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2ktbGlzdC1jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCdXR0b25UZXh0QWN0aW9uQ29uZ1ZpZWMsIEVudW1HZXRSZWZUeXBlLCBGb3JtU3RhdGUsIEtleUZpZWxkR2V0UmVmVHlwZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRW52aXJvbm1lbnRTY2hlbWEsIGlzQXJyYXksIGlzTGl0ZXJhbE9iamVjdCB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZW52aXJvbm1lbnQtc2NoZW1hJztcclxuaW1wb3J0IHtcclxuICAgIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWEsXHJcbiAgICBDb2x1bW5TY2hlbWFCYXNlLFxyXG4gICAgQ29sdW1uU2V0dGluZyxcclxuICAgIENvbnRyb2xUeXBlLFxyXG4gICAgQ3J1ZExpc3RDb25maWcsXHJcbiAgICBDcnVkTGlzdERhdGEsXHJcbiAgICBDcnVkTGlzdFNldHRpbmcsXHJcbiAgICBEYXRhVHlwZSxcclxuICAgIERhdGVUaW1lUmFuZ2VDb250cm9sU2NoZW1hLFxyXG4gICAgRGlhbG9nTW9kZWwsXHJcbiAgICBEcm9wZG93bkNvbnRyb2xTY2hlbWEsXHJcbiAgICBFeHBvcnRJdGVtc01vZGUsXHJcbiAgICBGaWxlVXBsb2FkTW9kZSxcclxuICAgIEZvcm1Db250cm9sQmFzZSxcclxuICAgIEhlaWdodFR5cGUsXHJcbiAgICBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBPcGVyYXRvcixcclxuICAgIFBvcHVwU2l6ZSxcclxuICAgIFRleHRBbGlnbixcclxuICAgIFRleHRDb250cm9sU2NoZW1hLFxyXG59IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xyXG5pbXBvcnQgeyBUbk1lbnVJdGVtIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy90bi1tZW51LWl0ZW0nO1xyXG5pbXBvcnQgeyBBY3Rpb24sIFdvcmtmbG93U2V0dGluZ05ldyB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvd29ya2Zsb3ctc2NoZW1hJztcclxuaW1wb3J0IHsgQnV0dG9uUGVybWlzc2lvbiB9IGZyb20gJy4uLy4uLy4uL2NvbmZpZ3MvY29tcG9uZW50LWNvbnRhbnRzJztcclxuaW1wb3J0IHsgQ29uZ1ZpZWNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29uZ3ZpZWMvY29uZ3ZpZWMvc2VydmljZXMvY29uZ3ZpZWMuc2VydmljZSc7XHJcbmltcG9ydCB7IERtTG9haUNvbmdWaWVjU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2Nvbmd2aWVjL2RtLWxvYWktY29uZ3ZpZWMvc2VydmljZXMvZG0tbG9haS1jb25ndmllYy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtLCBSZWdleFNwbGl0RmllbGRCeUl0ZW0gfSBmcm9tICcuLi8uLi8uLi9jb25zdC9jb21tb24nO1xyXG5pbXBvcnQgeyBGaWVsZE9yZGVyQ3J1ZExpc3QgfSBmcm9tICcuLi8uLi8uLi9lbnVtcy9jb21tb24nO1xyXG5pbXBvcnQgeyBGaWx0ZXIsIEdyaWRJbmZvLCBTb3J0IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IFRuVXNlciB9IGZyb20gJy4uLy4uLy4uL21vZGVscy90bi11c2VyJztcclxuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3J1ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jcnVkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b21Sb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3VzdG9tLXJvdXRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50aXR5TWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZW50aXR5LW1ldGFkYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZXhwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2R1bGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGVybWlzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBtdWx0aXBsZVNvcnQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9hcnJheSc7XHJcbmltcG9ydCB7IFNlYXJjaEluZm8gfSBmcm9tICcuLi8uLi9tb2RlbHMvc2VhcmNoJztcclxuaW1wb3J0IHsgRW51bVN0YXRlVHlwZSB9IGZyb20gJy4uLy4uL3N0YXRlbWFjaGluZXMvbW9kZWxzL2VudW1zJztcclxuaW1wb3J0IHsgU3RhdGVNYWNoaW5lc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zdGF0ZW1hY2hpbmVzL3NlcnZpY2VzL3N0YXRlbWFjaGluZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IFRuQ3VzdG9tU2Nyb2xsYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdG4tY3VzdG9tLXNjcm9sbGJhci90bi1jdXN0b20tc2Nyb2xsYmFyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZpZWxkRGVmaW5lSGFzVGFzaywgTWFBY3Rpb25CYXREYXVRdXlUcmluaCB9IGZyb20gJy4uLy4uL3dvcmtmbG93L21vZGVscy9jb25zdCc7XHJcbmltcG9ydCB7IFdmQWN0aW9uLCBXZkl0ZW0gfSBmcm9tICcuLi8uLi93b3JrZmxvdy9tb2RlbHMvbW9kZWxzJztcclxuaW1wb3J0IHsgQ2FuQm9fSG9Tb1NlcnZpY2UgfSBmcm9tICcuLi8uLi93b3JrZmxvdy9zZXJ2aWNlcy9jYW5iby1ob3NvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vd29ya2Zsb3cvc2VydmljZXMvZW50aXR5LXdvcmtmbG93LWhpc3Rvcnkuc2VydmljZSc7XHJcbmltcG9ydCB7IFdvcmtmbG93SGlzdG9yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi93b3JrZmxvdy9zZXJ2aWNlcy93b3JrZmxvdy1oaXN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXb3JrZmxvd1Blcm1pc3Npb25EZXRhaWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vd29ya2Zsb3cvc2VydmljZXMvd29ya2Zsb3ctcGVybWlzc2lvbi1kZXRhaWwuc2VydmljZSc7XHJcbmltcG9ydCB7IGRhdGFTb3VyY2VJY29uIH0gZnJvbSAnLi4vLi4vd29ya2Zsb3cvd29ya2Zsb3ctc2V0dGluZy93b3JrZmxvdy1zZXR0aW5nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGdldFJlZ2V4UmVzdWx0LCByZW5kZXJUZXh0VGVtcGxhdGUgfSBmcm9tICcuLi91dGlscyc7XHJcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4vLi4vLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuZGVjbGFyZSBsZXQgJDogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxyXG4gICAgc2VsZWN0b3I6ICdjcnVkLWxpc3QnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NydWQtbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jcnVkLWxpc3QuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0RlY2ltYWxQaXBlLCBEYXRlUGlwZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENydWRMaXN0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIElMaXN0Q29tcG9uZW50LCBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XHJcbiAgICB0YWJsZTogVGFibGU7XHJcblxyXG4gICAgQFZpZXdDaGlsZChUYWJsZSwgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCBfdGFibGUodjogVGFibGUpIHtcclxuICAgICAgICB0aGlzLnRhYmxlID0gdjtcclxuICAgICAgICB0aGlzLnRhYmxlUmVhZHkubmV4dCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBjb250YWluZXI6IEVsZW1lbnRSZWY8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ2ljb25Ub2dnbGVSb3dHcm91cCcsIHsgc3RhdGljOiB0cnVlIH0pIGljb25Ub2dnbGVSb3dHcm91cDogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ2ljb25Ub2dnbGVSb3dEYXRhJywgeyBzdGF0aWM6IHRydWUgfSkgaWNvblRvZ2dsZVJvd0RhdGE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAVmlld0NoaWxkKCd0cmFuZ1RoYWlWNScsIHsgc3RhdGljOiB0cnVlIH0pIHRlbXBsYXRlVHJhbmdUaGFpVjU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAVmlld0NoaWxkKCd2aWV3SGlzdG9yeScsIHsgc3RhdGljOiB0cnVlIH0pIHRlbXBsYXRlQ29sVmlld0hpc3Rvcnk6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAVmlld0NoaWxkKCd3b3JrZmxvd0NvcmVTdGF0dXMnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0ZW1wbGF0ZVdvcmtmbG93Q29yZVN0YXR1czogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbGJhcicsIHsgc3RhdGljOiB0cnVlIH0pIHNjcm9sbGJhcjogVG5DdXN0b21TY3JvbGxiYXJDb21wb25lbnQ7XHJcbiAgICBAVmlld0NoaWxkKCdjb250ZXh0TWVudScsIHsgc3RhdGljOiBmYWxzZSB9KSBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XHJcbiAgICBAQ29udGVudENoaWxkKCdzZWFyY2hDdXN0b20nLCB7IHN0YXRpYzogdHJ1ZSB9KSBzZWFyY2hDdXN0b206IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBoZWFkZXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXJGaWx0ZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBoZWFkZXJGaWx0ZXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdyb3dFeHBhbnNpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSByb3dFeHBhbnNpb246IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdzdW1tYXJ5JywgeyBzdGF0aWM6IHRydWUgfSkgc3VtbWFyeTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBDb250ZW50Q2hpbGQoJ2Zvb3RlcicsIHsgc3RhdGljOiB0cnVlIH0pIGZvb3RlcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBDb250ZW50Q2hpbGQoJ2NvbGdyb3VwJywgeyBzdGF0aWM6IHRydWUgfSkgY29sZ3JvdXA6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdyb3dHcm91cCcsIHsgc3RhdGljOiB0cnVlIH0pIHJvd0dyb3VwOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQENvbnRlbnRDaGlsZCgnY29udGVudFJvd0dyb3VwJywgeyBzdGF0aWM6IHRydWUgfSkgY29udGVudFJvd0dyb3VwOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZVJlZikgY2hpbGRyZW46IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuXHJcbiAgICBASW5wdXQoKSBtb2RlbDogQ3J1ZExpc3REYXRhID0gbmV3IENydWRMaXN0RGF0YSgpO1xyXG4gICAgQElucHV0KCkgc2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nID0gbmV3IENydWRMaXN0U2V0dGluZygpO1xyXG4gICAgQElucHV0KCkgZmlsZU5hbWUgPSAnZXhwb3J0JztcclxuICAgIEBJbnB1dCgpIGxhenkgPSB0cnVlOyAvLyDEkeG6t3QgZ2nDoSB0cuG7iyBuw6B5IGLhurFuZyBmYWxzZSB0aMOsIHPhur0gZmlsdGVyIMSRYyBjbGllbnRcclxuXHJcbiAgICAvLyBkdW5nIGRvbiB2aSByZW0gZGUgd2lkdGgga2hvbmcgYmkgYW5oIGh1b25nIGJvaSBmb250IHNpemUgY3VhIHRoLCBubyBzZSBsYXkgdGhlbyBmb250IHNpemUgY3VhIHRoZSBodG1sXHJcbiAgICBASW5wdXQoKSB3aWR0aENoZWNrYm94ID0gJzIuNXJlbSc7XHJcbiAgICBASW5wdXQoKSB3aWR0aE9yZGVyQ29sdW1uID0gJzMuNXJlbSc7XHJcbiAgICBfZGVmYXVsdFdpdGhGdW5jdGlvbkNvbHVtbiA9IDgxO1xyXG4gICAgX3dpZHRoRnVuY3Rpb25Db2x1bW4gPSBgJHt0aGlzLl9kZWZhdWx0V2l0aEZ1bmN0aW9uQ29sdW1ufXB4YDtcclxuICAgIEBJbnB1dCgpIHdpZHRoRnVuY3Rpb25Db2x1bW46IHN0cmluZztcclxuICAgIF9jbGFzc1Jvd0dyb3VwID0gJ25vLXBhZGRpbmcnO1xyXG4gICAgQElucHV0KCkgc2V0IGNsYXNzUm93R3JvdXAodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbGFzc1Jvd0dyb3VwID0gYG5vLXBhZGRpbmcgJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xhc3NSb3dHcm91cCA9IGBuby1wYWRkaW5nYDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgc2hvd1Njcm9sbEJhciA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBwVGFibGVTY3JvbGxhYmxlID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwVGFibGVTY3JvbGxIZWlnaHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBASW5wdXQoKSByZXNwb25zaXZlID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGNvbmZpZ1Njcm9sbEJhcjogYW55ID0geyBzdXBwcmVzc1Njcm9sbFg6IHRydWUsIHN1cHByZXNzU2Nyb2xsWTogZmFsc2UgfTtcclxuICAgIEBJbnB1dCgpIHNob3dTY3JvbGxIb3Jpem9udGFsID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBzaG93TWVudUJ1dHRvbnMgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgc2hvd1JhZGlvID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBoaWRkZW5BZGQgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGhpZGRlbkRlbGV0ZSA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgaGlkZGVuRWRpdCA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgaGlkZGVuQ29weUxpbmsgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGhpZGRlblZpZXcgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVLZXlwcmVzc0NvbnRyb2wgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBlc2NhcGUgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgc2VsZWN0aW9uTW9kZTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgY29uZmlnOiBDcnVkTGlzdENvbmZpZyA9IG5ldyBDcnVkTGlzdENvbmZpZygpO1xyXG4gICAgQElucHV0KCkgZW5hYmxlUmVvcmRlclJvdyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgdGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgICBASW5wdXQoKSB0ZW1wbGF0ZXNGcm9tUGFyZW50OiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgICBASW5wdXQoKSBjaGlsZHJlbkZyb21QYXJlbnQ6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuICAgIEBJbnB1dCgpIG1lbnVCdXR0b25zOiAoKHJvd0RhdGEpID0+IFByb21pc2U8VG5NZW51SXRlbVtdPikgfCAoKHJvd0RhdGEpID0+IFRuTWVudUl0ZW1bXSk7XHJcbiAgICBASW5wdXQoKSBmaWVsZE9yZGVyOiBzdHJpbmcgPSBGaWVsZE9yZGVyQ3J1ZExpc3Q7XHJcblxyXG4gICAgX3N0eWxlOiBhbnkgPSB7fTtcclxuICAgIEBJbnB1dCgpIHNldCBzdHlsZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpIHNldCB0YWJsZUNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl90YWJsZUNsYXNzID0gdGhpcy5fZGVmYXVsdFRhYmxlQ2xhc3M7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudHJpbSgpICE9ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2xhc3MgKz0gYCAke3ZhbHVlfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldHVwVGFibGVDbGFzcygpO1xyXG4gICAgfVxyXG5cclxuICAgIF9kYXRhU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gICAgQElucHV0KCkgc2V0IGRhdGFTb3VyY2UodmFsdWU6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IGRhdGFTb3VyY2UgPSBbXTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgZGF0YVNvdXJjZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByb2Nlc3NEYXRhU291cmNlKGRhdGFTb3VyY2UpO1xyXG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZpbHRlciBt4bq3YyDEkeG7i25oIGNobyBkZXYgY29kZVxyXG4gICAgQElucHV0KCkgZmlsdGVyX2RlZmF1bHQ6IEZpbHRlcltdID0gW107XHJcblxyXG4gICAgQE91dHB1dCgpIG9uUm93U2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uUmVvcmRlcmVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ2hlY2tBbGw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25SZWxvYWQ6IEV2ZW50RW1pdHRlcjxHcmlkSW5mbz4gPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRJbmZvPigpO1xyXG4gICAgQE91dHB1dCgpIG9uUmVsb2FkZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25SZWFkeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNvbnRlbnRJbml0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWRkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uRWRpdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNvcHlMaW5rOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ29weUxpbmtNdWx0aXBsZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblZpZXc6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25EZWxldGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25EZWxldGVNdWx0aXBsZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkludmFsaWRXb3JrZmxvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkFmdGVyVHJpbmhLeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblN0YXJ0ZWRXb3JrZmxvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblByb2Nlc3NlZFdvcmtmbG93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uUm9sbGJhY2tlZFdvcmtmbG93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlZFN0YXR1c1dvcmtmbG93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgcHJpdmF0ZSB0YWJsZVJlYWR5ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gICAgdGFibGVSZWFkeVNvdXJjZSQgPSB0aGlzLnRhYmxlUmVhZHkuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgY2hlY2tlZEFsbCA9IG51bGw7XHJcbiAgICByb3dHcm91cENoZWNrZWQ6IGFueSA9IHt9O1xyXG4gICAgcm93R3JvdXBNZXRhZGF0YTogYW55ID0ge307XHJcbiAgICBkYXRhU291cmNlSW50ZXJuYWw6IGFueVtdO1xyXG4gICAgY2xhc3NUb29sYmFyID0gJyc7XHJcbiAgICBpdGVtU2V0dGluZ3M6IGFueSA9IHt9O1xyXG4gICAgc29ydEhpc3Rvcnk6IFNvcnRbXSA9IFtdO1xyXG4gICAgc29ydENsaWVudEhpc3Rvcnk6IGFueSA9IHt9O1xyXG4gICAgX2dyb3VwRmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBfZ3JvdXBJbkNsaWVudCA9IGZhbHNlO1xyXG4gICAgZW5hYmxlZFdmMSA9IHVuZGVmaW5lZDtcclxuICAgIHNob3dpbmdBY3Rpb25Xb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgYnV0dG9uQ29udGV4dHM6IE1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgICBfZGVmYXVsdFRhYmxlQ2xhc3MgPSAnbmV3LXRhYmxlIHNjci10YWJsZSBjcnVkLWxpc3QtdGFibGUnO1xyXG4gICAgX3RhYmxlQ2xhc3MgPSAnJztcclxuICAgIF9zaG93U2V0dGluZ3NSb3dDb2xvciA9IGZhbHNlO1xyXG4gICAgX3Nob3dTZXR0aW5ncyA9IGZhbHNlO1xyXG4gICAgX3Nob3dTZXR0aW5nc1dvcmtmbG93ID0gZmFsc2U7XHJcbiAgICBfc2hvd1NldHRpbmdzUGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgX2NvbG9yRmlsdGVyVGFibGUgPSBbXTtcclxuICAgIF9zb3J0RmllbGQgPSAnJztcclxuICAgIF9zb3J0RGlyOiAtMSB8IDAgfCAxIHwgMiA9IC0xO1xyXG5cclxuICAgIHRlbXBsYXRlOiBhbnkgPSB7fTtcclxuICAgIHByaXZhdGUgdGVtcGxhdGVGaWx0ZXI6IEZpbHRlcltdID0gW107XHJcbiAgICB0ZW1wbGF0ZUhlYWRlckNvbnRlbnQ6IGFueSA9IHt9O1xyXG5cclxuICAgIGNhY2hlZFRyYW5zZm9ybXMgPSB7fTtcclxuXHJcbiAgICBmaWx0ZXJTY2hlbWE6IGFueSA9IHt9O1xyXG4gICAgZmlsdGVyRGF0YTogYW55ID0ge307XHJcbiAgICBjdXJyZW50RmllbGRGaWx0ZXI6IHN0cmluZztcclxuICAgIGNoZWNrQm94Q29udGV4dE1lbnU6IE1lbnVJdGVtW10gPSBbXHJcbiAgICAgICAgeyBsYWJlbDogYEPDs2AsIGljb246ICdwaSBwaS1jaGVjaycsIGNvbW1hbmQ6ICgpID0+IHRoaXMuY2hhbmdlRmlsdGVyQm9vbGVhbih0cnVlKSB9LFxyXG4gICAgICAgIHsgbGFiZWw6IGBLaMO0bmdgLCBpY29uOiAncGkgcGktdGltZXMnLCBjb21tYW5kOiAoKSA9PiB0aGlzLmNoYW5nZUZpbHRlckJvb2xlYW4oZmFsc2UpIH0sXHJcbiAgICAgICAgeyBsYWJlbDogYEjhu6d5IGLhu49gLCBpY29uOiAncGkgcGktdW5kbycsIGNvbW1hbmQ6ICgpID0+IHRoaXMuY2hhbmdlRmlsdGVyQm9vbGVhbihudWxsKSB9XHJcbiAgICBdO1xyXG4gICAgc2VhcmNoSW5mbzogU2VhcmNoSW5mbyA9IG5ldyBTZWFyY2hJbmZvKCk7XHJcbiAgICBjcmVhdGluZ1NlYXJjaEluZm8gPSBmYWxzZTtcclxuXHJcbiAgICBmaWx0ZXJfY3VzdG9tOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgLy8gZmlsdGVyIGPhu6dhIGFkdmFuY2Ugc2VhcmNoIHRy4bqjIHbhu4FcclxuICAgIGZpbHRlcl9hZHZhbmNlU2VhcmNoOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgLy8gZmlsdGVyIHRoZW8gY8OhYyBmaWx0ZXIgaGnhu4NuIHRo4buLIHRyb25nIGPhu5l0IGPhu6dhIGdyaWRcclxuICAgIGZpbHRlcl9jb2x1bW46IEZpbHRlcltdID0gW107XHJcblxyXG4gICAgdGltZW91dDogYW55O1xyXG4gICAgaW50ZXJ2YWw6IGFueTtcclxuICAgIGRhdGFBZHZhbmNlOiBhbnkgPSB7fTtcclxuXHJcbiAgICBjdXJyZW50SXRlbTogYW55O1xyXG4gICAgc2hvd0Zvcm1Xb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgaGVhZGVyV29ya2Zsb3cgPSAnJztcclxuICAgIGFjdGlvbldvcmtmbG93OiBBY3Rpb247XHJcbiAgICBwb3B1cFNpemVXb3JrZmxvdzogUG9wdXBTaXplID0gbmV3IFBvcHVwU2l6ZSh7IHdpZHRoOiA5NTAsIGhlaWdodDogNTQwIH0pO1xyXG4gICAgc2hvd0hpc3RvcnlXb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgLy8gQmnhur9uIMSR4buDIGtp4buDbSB0cmEgbOG6p24gY2xpY2sgxJHhuqd1IHRpw6puIGPhu6dhIHVzZXIgdsOgbyBkw7JuZyB0csOqbiBncmlkXHJcbiAgICAvLyBT4butIGThu6VuZyDEkeG7gyBmaXggYnVnIHNldCBzZWxlY3RlZCByb3cgdOG7qyBmb3JtIGNoYSwgbmjGsG5nIHbDoG8gZm9ybSBjb24g4bqlbiBzYW5nIHJvdyBraMOhYyBuw7MgayBi4buPIHNlbGVjdGVkIHJvdyDEkcOjIHNldCB04burIGLDqm4gbmdvw6BpXHJcbiAgICBmaXJzdFJvd0NsaWNrID0gdHJ1ZTtcclxuXHJcbiAgICBzdGFydFdvcmtmbG93TW9kZWw6IERpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKHtcclxuICAgICAgICBoZWFkZXI6ICdDaOG7jW4gcXV5IHRyw6xuaCBuZ2hp4buHcCB24bulIHPhu60gZOG7pW5nJ1xyXG4gICAgfSk7XHJcbiAgICBwcm9jZXNzV29ya2Zsb3dNb2RlbDogRGlhbG9nTW9kZWwgPSBuZXcgRGlhbG9nTW9kZWwoKTtcclxuICAgIGNob1lLaWVuTW9kZWw6IERpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKHtcclxuICAgICAgICBoZWFkZXI6ICdDaG8gw70ga2nhur9uJyxcclxuICAgICAgICBwb3B1cFNpemU6IG5ldyBQb3B1cFNpemUoeyB3aWR0aDogMTEwMCwgaGVpZ2h0OiA2NTAgfSlcclxuICAgIH0pO1xyXG4gICAgd29ya2Zsb3dTZXR0aW5nTW9kZWw6IERpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKCk7XHJcbiAgICB3b3JrZmxvd0hpc3RvcnlNb2RlbDogRGlhbG9nTW9kZWwgPSBuZXcgRGlhbG9nTW9kZWwoe1xyXG4gICAgICAgIGhlYWRlcjogJ1hlbSBs4buLY2ggc+G7rSdcclxuICAgIH0pO1xyXG4gICAgcGVybWlzc2lvblNoYXJpbmdNb2RlbDogRGlhbG9nTW9kZWwgPSBuZXcgRGlhbG9nTW9kZWwoe1xyXG4gICAgICAgIGhlYWRlcjogJ1hlbSBkYW5oIHPDoWNoIGxpbmsgY2hpYSBz4bq7JyxcclxuICAgICAgICBwb3B1cFNpemU6IG5ldyBQb3B1cFNpemUoeyB3aWR0aDogMTEwMCwgaGVpZ2h0OiA2NTAgfSksXHJcbiAgICB9KTtcclxuICAgIHBlcm1pc3Npb25MaXN0TW9kZWw6IERpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKHtcclxuICAgICAgICBoZWFkZXI6ICdYZW0gZGFuaCBzw6FjaCBjw7MgcXV54buBbicsXHJcbiAgICAgICAgcG9wdXBTaXplOiBuZXcgUG9wdXBTaXplKHsgd2lkdGg6IDExMDAsIGhlaWdodDogNjUwIH0pLFxyXG4gICAgfSk7XHJcbiAgICBjb25nVmllY01vZGVsOiBEaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XHJcbiAgICAgICAgaGVhZGVyOiAnQ2jhuqF5IHF1eSB0csOsbmggY8O0bmcgdmnhu4djJyxcclxuICAgICAgICBwb3B1cFNpemU6IG5ldyBQb3B1cFNpemUoeyB3aWR0aDogMTEwMCwgaGVpZ2h0OiA2NTAgfSksXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICBjb25nVmllY1NldHRpbmc6IG5ldyBDcnVkTGlzdFNldHRpbmcoKVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgZGV0YWlsVGFza01vZGVsOiBEaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XHJcbiAgICAgICAgaGVhZGVyOiAnQ2hpIHRp4bq/dCBjw7RuZyB2aeG7h2MnXHJcbiAgICB9KTtcclxuICAgIHNoYXJlTGlua01vZGVsOiBEaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XHJcbiAgICAgICAgaGVhZGVyOiAnQ2hpYSBz4bq7IHF1eeG7gW4nLFxyXG4gICAgICAgIHBvcHVwU2l6ZTogbmV3IFBvcHVwU2l6ZSh7IHdpZHRoOiA2NTAsIGhlaWdodDogMzEwIH0pXHJcbiAgICB9KTtcclxuICAgIGF0dGFjaGVkVGFza01vZGVsOiBEaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XHJcbiAgICAgICAgaGVhZGVyOiAnRGFuaCBzw6FjaCBjw7RuZyB2aeG7h2MgxJHDrW5oIGvDqG0nXHJcbiAgICB9KTtcclxuXHJcbiAgICBCVVRUT05fUEhBTl9RVVlFTiA9IEJ1dHRvblBlcm1pc3Npb24uQlVUVE9OX1BIQU5fUVVZRU47XHJcbiAgICBCVVRUT05fQ0FVX0hJTkhfUVVZX1RSSU5IID0gQnV0dG9uUGVybWlzc2lvbi5CVVRUT05fQ0FVX0hJTkhfUVVZX1RSSU5IO1xyXG4gICAgbHN0QnV0dG9uUGVybWlzc2lvbiA9IFtdO1xyXG4gICAgYnV0dG9uUGVybWlzc2lvbk1hcDogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgZW50aXR5TWV0YWRhdGFTZXJ2aWNlOiBFbnRpdHlNZXRhZGF0YVNlcnZpY2U7XHJcbiAgICBlbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlOiBFbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlO1xyXG5cclxuICAgIHN0YXRlTWFjaGluZXNTZXJ2aWNlOiBTdGF0ZU1hY2hpbmVzU2VydmljZTtcclxuXHJcbiAgICBjYW5Cb19Ib1NvU2VydmljZTogQ2FuQm9fSG9Tb1NlcnZpY2U7XHJcblxyXG4gICAgc291cmNlSWNvbjogYW55ID0ge307XHJcbiAgICBzdG9wQ2FsY3VsYXRpbmdGdW5jdGlvbkNvbHVtbldpZHRoID0gZmFsc2U7XHJcbiAgICBzZWxlY3RlZEl0ZW1MYXN0OiBhbnk7XHJcblxyXG4gICAgcm93RGF0YUN1cnJlbnQ6IGFueTtcclxuICAgIGVudmlyb25tZW50OiBFbnZpcm9ubWVudFNjaGVtYTtcclxuICAgIEZpbGVVcGxvYWRNb2RlID0gRmlsZVVwbG9hZE1vZGU7XHJcbiAgICBjdXJyZW50VXNlcjogVG5Vc2VyO1xyXG5cclxuICAgIHB1YmxpYyBfcm91dGVyOiBSb3V0ZXI7XHJcbiAgICBwdWJsaWMgX2FjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZTtcclxuICAgIHB1YmxpYyBfY3VzdG9tUm91dGVyU2VydmljZTogQ3VzdG9tUm91dGVyU2VydmljZTtcclxuICAgIHB1YmxpYyBfdW5TdWJzY3JpYmVBbGwgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgICBwdWJsaWMgX25vdGlmaWVyU2VydmljZTogTm90aWZpZXJTZXJ2aWNlO1xyXG4gICAgcHVibGljIF9leHBvcnRTZXJ2aWNlOiBFeHBvcnRTZXJ2aWNlO1xyXG4gICAgcHVibGljIF9sb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xyXG4gICAgcHVibGljIF9jb25nVmllY1NlcnZpY2U6IENvbmdWaWVjU2VydmljZTtcclxuICAgIHB1YmxpYyBfZG1Mb2FpQ29uZ1ZpZWNTZXJ2aWNlOiBEbUxvYWlDb25nVmllY1NlcnZpY2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2NvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9jcnVkU2VydmljZTogQ3J1ZFNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9zYW50aWxpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICAgICAgcHVibGljIF9kYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICAgICAgcHJpdmF0ZSBfbW9kdWxlQ29uZmlnU2VydmljZTogTW9kdWxlQ29uZmlnU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9wZXJtaXNzaW9uU2VydmljZTogUGVybWlzc2lvblNlcnZpY2UsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEFjdGl2YXRlZFJvdXRlKTtcclxuICAgICAgICB0aGlzLl9yb3V0ZXIgPSB0aGlzLl9pbmplY3Rvci5nZXQoUm91dGVyKTtcclxuICAgICAgICB0aGlzLl9jdXN0b21Sb3V0ZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEN1c3RvbVJvdXRlclNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChOb3RpZmllclNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoRXhwb3J0U2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fbG9nZ2VyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChMb2dnZXJTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmVudGl0eVdvcmtmbG93SGlzdG9yeVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoRW50aXR5V29ya2Zsb3dIaXN0b3J5U2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZU1hY2hpbmVzU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChTdGF0ZU1hY2hpbmVzU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5jYW5Cb19Ib1NvU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChDYW5Cb19Ib1NvU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fY29uZ1ZpZWNTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KENvbmdWaWVjU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fZG1Mb2FpQ29uZ1ZpZWNTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KERtTG9haUNvbmdWaWVjU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVDaGVja0FsbCA9IHRoaXMuaGFuZGxlQ2hlY2tBbGwuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUNoZWNrQWxsX0dyb3VwID0gdGhpcy5oYW5kbGVDaGVja0FsbF9Hcm91cC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLl9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpLmVudmlyb25tZW50O1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5DT01NT04uRU5USVRZX01FVEFEQVRBX1JFTE9BREVELCBzZXJ2aWNlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHlNZXRhZGF0YVNlcnZpY2UgPSBzZXJ2aWNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmZpbHRlclNjaGVtYS5kYXRlUmFuZ2UgPSBuZXcgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEoeyBhcHBlbmRUbzogJ2JvZHknIH0pO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyU2NoZW1hLmRyb3Bkb3duID0ge307XHJcblxyXG4gICAgICAgIGRhdGFTb3VyY2VJY29uLmZvckVhY2goc291cmNlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2VJY29uW3NvdXJjZS5pZF0gPSBzb3VyY2UudGVuO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnRlbXBsYXRlRmlsdGVyID0gW107XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fdGFibGVDbGFzcykge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJsZUNsYXNzID0gdGhpcy5fZGVmYXVsdFRhYmxlQ2xhc3M7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldHVwVGFibGVDbGFzcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluaXRDb2x1bW5TY2hlbWEodGhpcy5zZXR0aW5nLmNvbHMpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU2VhcmNoU2NoZW1hKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuaGlkZGVuVHJpbmhLeSB8fCAhdGhpcy5zZXR0aW5nLmRpc2FibGVTaGFyZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubWVudUJ1dHRvbnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVudUJ1dHRvbnMgPSBhc3luYyAoKSA9PiBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTuG6v3UgbcOgIOG6qW4gYWR2YW5jZXNlYXJjaCA9PiBz4bq9IGtow7RuZyBjw7MgdHJpZ2dlciBsb2FkIGRhdGEgdOG7qyBhZHZhbmNlIHNlYXJjaCA9PiBwaOG6o2kgdOG7sSBn4buNaSBnZXREYXRhIOG7nyBPbkluaXRcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmhpZGRlbkFkdmFuY2VTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChVc2VyU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHVzZXJTZXJ2aWNlLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgaWYgKCh0aGlzLmN1cnJlbnRVc2VyLmlzQWRtaW4oKSAmJiB0aGlzLl9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpLmVudmlyb25tZW50Lmlnbm9yZUFkbWluID09PSBmYWxzZSlcclxuICAgICAgICAgICAgfHwgdGhpcy5jdXJyZW50VXNlci5pc3N1cGVydXNlci50b0xvd2VyQ2FzZSgpICE9ICd0cnVlJykge1xyXG4gICAgICAgICAgICB0aGlzLl9wZXJtaXNzaW9uU2VydmljZS5nZXRTZXJ2aWNlUGVybWlzc2lvbih0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2Uuc2VydmljZUNvZGUpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxzdEJhc2VQZXJtaXNzaW9uID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sc3RCdXR0b25QZXJtaXNzaW9uID0gdGhpcy5fbW9kdWxlQ29uZmlnU2VydmljZS5nZXRDb25maWcoKS5lbnZpcm9ubWVudC5idXR0b25QZXJtaXNzaW9ucyBhcyBzdHJpbmdbXSA/PyBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYnV0dG9uUGVybWlzc2lvbkNvZGUgb2YgdGhpcy5sc3RCdXR0b25QZXJtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnV0dG9uUGVybWlzc2lvbiA9IGAke3RoaXMuc2V0dGluZy5iYXNlU2VydmljZS5zZXJ2aWNlQ29kZX0vJHt0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UuZW50aXR5TmFtZX0vJHtidXR0b25QZXJtaXNzaW9uQ29kZX1gLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idXR0b25QZXJtaXNzaW9uTWFwLnNldChidXR0b25QZXJtaXNzaW9uLCBsc3RCYXNlUGVybWlzc2lvbi5pbmNsdWRlcyhidXR0b25QZXJtaXNzaW9uKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sLmZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZmluZFRlbXBsYXRlKGBoZWFkZXIke2NvbC5maWVsZC5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKX0ke2NvbC5maWVsZC5zdWJzdHJpbmcoMSl9YCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlSGVhZGVyQ29udGVudFtjb2wuZmllbGRdID0gdGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9uQ29udGVudEluaXQuZW1pdCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cFRhYmxlQ2xhc3MoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5tdWx0aXBsZUNoZWNrV2hlbkNsaWNrUm93IHx8ICF0aGlzLnNldHRpbmcuaGlkZGVuQ2hlY2tib3gpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDbGFzcyArPSAnIG11bHRpLWNoZWNrJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2xhc3MgKz0gJyBzaW5nbGUtY2hlY2snO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zdGlja3lDb2x1bW4pIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDbGFzcyArPSAnIHN0aWNreS1jb2x1bW5zLWFjdGl2ZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmhpZGRlbkNoZWNrYm94KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2xhc3MgKz0gJyBoaWRkZW4tY29sdW1uLWNoZWNrYm94JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuaGlkZGVuT3JkZXJDb2x1bW4pIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDbGFzcyArPSAnIGhpZGRlbi1jb2x1bW4tb3JkZXInO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0Q29sdW1uU2NoZW1hKGNvbHM6IENvbHVtblNjaGVtYUJhc2VbXSkge1xyXG4gICAgICAgIGlmIChjb2xzKSB7XHJcbiAgICAgICAgICAgIGxldCBjb2xGdW5jdGlvbiA9IG51bGwsIGNvbEdyb3VwID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbC5maWVsZCA9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sRnVuY3Rpb24gPSBjb2w7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2wuZ3JvdXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBjb2xHcm91cCA9IGNvbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChjb2xGdW5jdGlvbiAmJiAhY29sRnVuY3Rpb24ud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dpZHRoRnVuY3Rpb25Db2x1bW4gPSBjb2xGdW5jdGlvbi53aWR0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmdldENvbG9yU2V0dGluZygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbHVtblNldHRpbmcoY29sR3JvdXApO1xyXG4gICAgICAgICAgICB0aGlzLmdldFBhZ2VTZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sdW1ucyh0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0Q29sdW1ucyh0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlDb2x1bW5TZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYnVpbGRGaWx0ZXJDb2x1bW4odGhpcy5zZXR0aW5nLmNvbHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4dGVuZENvbHVtbnMoY29sczogQ29sdW1uU2NoZW1hQmFzZVtdLCBhcHBlbmRDb2wgPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFjb2xzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZiA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCB0ZW1wOiBDb2x1bW5TY2hlbWFCYXNlW10gPSBbXTtcclxuICAgICAgICBjb25zdCB0bXBDb2xzID0gWy4uLmNvbHNdO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5kZXRhaWxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMuZm9yRWFjaChjb2xSZW9yZGVyID0+IHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xzW2ldLmZpZWxkID09IGNvbFJlb3JkZXIuY29sdW1uQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLnB1c2goY29sc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDw7JuIGzhuqFpIG5o4buvbmcgY29kZSBtw6Aga2jDtG5nIMSRxrDhu6NjIGPhuqV1IGjDrG5oIHRow6wgZ2jDqXAgbOG6oWkgdGhlbyBpbmRleCDEkcaw4bujYyBraGFpIGLDoW9cclxuICAgICAgICAgICAgbGV0IHRlbXBDb2xzOiBDb2x1bW5TY2hlbWFCYXNlW10gPSBbXTtcclxuICAgICAgICAgICAgY29scy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXhDb2xPbGQgPSB0bXBDb2xzLmZpbmRJbmRleChwID0+IHAuZmllbGQgPT0gY29sLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleENvbE9sZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcC5zcGxpY2UoMCwgMCwgY29sKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFTDrG0gduG7iyB0csOtIGPhu6dhIGPhu5l0IHBow61hIHRyxrDhu5tjIHRyb25nIGxpc3QgcmVvcmRlciBt4bubaVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleENvbEJlZm9yZU5ldyA9IHRlbXAuZmluZEluZGV4KHAgPT4gcC5maWVsZCA9PSB0bXBDb2xzW2luZGV4Q29sT2xkIC0gMV0uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleENvbEJlZm9yZU5ldyA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29scy5zcGxpY2UoMCwgMCwgY29sKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVMOsbSB24buLIHRyw60gY+G7p2EgY+G7mXQgdHLGsOG7m2MgY+G7mXQgxJFhbmcga2nhu4NtIHRyYSB0cm9uZyBsaXN0IGPhu5l0IGfhu5FjXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q29sT2xkID0gdG1wQ29scy5maW5kSW5kZXgocCA9PiBwLmZpZWxkID09IHRtcENvbHNbaW5kZXhDb2xPbGQgLSAxXS5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q29sQmVmb3JlTmV3ID0gdGVtcC5maW5kSW5kZXgocCA9PiBwLmZpZWxkID09IHRtcENvbHNbaW5kZXhDb2xPbGQgLSAxXS5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vID0+IMSQ4bq/biBraGkgdGjhuqV5IHRow6wgYWRkIGPhu5l0IGhp4buHbiB04bqhaSB2w6AgbGlzdCB04bqhbSB2w6BvIHbhu4sgdHLDrSBjaMOoblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleENvbEJlZm9yZU5ldyA9PSB0ZW1wLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5wdXNoKGNvbCwgLi4udGVtcENvbHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5zcGxpY2UoaW5kZXhDb2xCZWZvcmVOZXcgKyAxLCAwLCBjb2wsIC4uLnRlbXBDb2xzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgY29scy5zcGxpY2UoMCwgY29scy5sZW5ndGgpO1xyXG4gICAgICAgIGNvbHMuc3BsaWNlKDAsIDAsIC4uLnRlbXApO1xyXG5cclxuICAgICAgICBsZXQgZmlyc3RDb2xWaXNpYmxlID0gbnVsbDtcclxuICAgICAgICBsZXQgZm91bmRJdGVtU2hvd0VkaXRMaW5rID0gZmFsc2U7XHJcbiAgICAgICAgdGVtcC5zcGxpY2UoMCwgdGVtcC5sZW5ndGgpO1xyXG4gICAgICAgIGxldCB0bXBDb2w6IENvbHVtblNjaGVtYUJhc2UgPSBudWxsO1xyXG4gICAgICAgIGZvciAoY29uc3QgaW5kIGluIGNvbHMpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbHNbaW5kXTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucmF3Q29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0ZW1wLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMuZmluZChwID0+IHAuY29sdW1uQ29kZSA9PSBlbGVtZW50LmZpZWxkKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnZpc2libGUgIT09IHVuZGVmaW5lZCAmJiBjb25maWcudmlzaWJsZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC52aXNpYmxlID0gY29uZmlnLnZpc2libGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmxhYmVsID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGVsZW1lbnQubGFiZWwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy50ZXh0QWxpZ24gIT09IHVuZGVmaW5lZCAmJiBjb25maWcudGV4dEFsaWduICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnRleHRBbGlnbiA9IGNvbmZpZy50ZXh0QWxpZ247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLndpZHRoICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLndpZHRoICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LndpZHRoID0gY29uZmlnLndpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kYXRhVHlwZSA9PSBudWxsIHx8IGVsZW1lbnQuZGF0YVR5cGUgPT0gdW5kZWZpbmVkIHx8IGVsZW1lbnQuZGF0YVR5cGUgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YVR5cGUgPSBEYXRhVHlwZS5zdHJpbmc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnZpc2libGVcclxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50LmZpZWxkID09IHRoaXMuc2V0dGluZy5ncm91cENvbHVtbi5maWVsZFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmJhc2VTZXJ2aWNlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnRyb2xUeXBlID0gQ29udHJvbFR5cGUuZHJvcGRvd247XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LnJhd0NvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGROZWVkR2V0UmVmLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRbS2V5RmllbGRHZXRSZWZUeXBlXSA9IEVudW1HZXRSZWZUeXBlLlNFUlZFUjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWVGaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnZhbHVlRmllbGQgPSAnaWQnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXlGaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BsYXlGaWVsZCA9ICd0ZW4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcENvbCA9IG5ldyBDb2x1bW5TY2hlbWFCYXNlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdDb2x1bW46IGVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sVHlwZTogQ29udHJvbFR5cGUuZHJvcGRvd24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogZWxlbWVudC5kYXRhVHlwZVJlZkZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdzdHInICsgZWxlbWVudC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93RmlsdGVyOiBlbGVtZW50LmFsbG93RmlsdGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25maWdSZWZGaWVsZCA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMuZmluZChwID0+IHAuY29sdW1uQ29kZSA9PSB0bXBDb2wuZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnUmVmRmllbGQgJiYgY29uZmlnUmVmRmllbGQudmlzaWJsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBDb2wudmlzaWJsZSA9IGNvbmZpZ1JlZkZpZWxkLnZpc2libGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5wdXNoKHRtcENvbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Q29sVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb2xWaXNpYmxlID0gdG1wQ29sO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5kYXRhU291cmNlICYmIGVsZW1lbnQuZGF0YVNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb250cm9sVHlwZSA9IENvbnRyb2xUeXBlLmRyb3Bkb3duO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5yYXdDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZi5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50W0tleUZpZWxkR2V0UmVmVHlwZV0gPSBFbnVtR2V0UmVmVHlwZS5MT0NBTDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG1wQ29sID0gbmV3IENvbHVtblNjaGVtYUJhc2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd0NvbHVtbjogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xUeXBlOiBDb250cm9sVHlwZS5kcm9wZG93bixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBlbGVtZW50LmRhdGFUeXBlUmVmRmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlU2VydmljZTogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnc3RyJyArIGVsZW1lbnQuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0ZpbHRlcjogZWxlbWVudC5hbGxvd0ZpbHRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUmVmRmllbGQgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5kZXRhaWxzLmZpbmQocCA9PiBwLmNvbHVtbkNvZGUgPT0gdG1wQ29sLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ1JlZkZpZWxkICYmIGNvbmZpZ1JlZkZpZWxkLnZpc2libGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wQ29sLnZpc2libGUgPSBjb25maWdSZWZGaWVsZC52aXNpYmxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAucHVzaCh0bXBDb2wpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdENvbFZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29sVmlzaWJsZSA9IHRtcENvbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFmaXJzdENvbFZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbFZpc2libGUgPSBlbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQuZm9yY2VHZXREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5iYXNlU2VydmljZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZi5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRbS2V5RmllbGRHZXRSZWZUeXBlXSA9IEVudW1HZXRSZWZUeXBlLlNFUlZFUjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC52YWx1ZUZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZUZpZWxkID0gJ2lkJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheUZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kaXNwbGF5RmllbGQgPSAndGVuJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2hvd0VkaXRMaW5rKSB7XHJcbiAgICAgICAgICAgICAgICBmb3VuZEl0ZW1TaG93RWRpdExpbmsgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZm91bmRJdGVtU2hvd0VkaXRMaW5rICYmIGZpcnN0Q29sVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBmaXJzdENvbFZpc2libGUuc2hvd0VkaXRMaW5rID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29scy5sZW5ndGggPSAwO1xyXG4gICAgICAgIGNvbHMucHVzaCguLi50ZW1wKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZi5zb3J0KFxyXG4gICAgICAgICAgICBtdWx0aXBsZVNvcnQoeyBuYW1lOiAnc29ydCcsIHByaW1lcjogYSA9PiBhID09IG51bGwgfSwgJ29yZGVyJylcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtTGVuZ3RoID0gW107XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkSGFzTWF4aW11bVdvcmQgPSBbXTtcclxuICAgICAgICBjb2xzLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjb2wudmlzaWJsZSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAoY29sLm1heFdvcmREaXNwbGF5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtV29yZC5wdXNoKGNvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY29sLm1heExlbmd0aERpc3BsYXkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hZHZhbmNlRGF0YS5maWVsZEhhc01heGltdW1MZW5ndGgucHVzaChjb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZvcm1hdENvbHVtbnMoY29sczogQ29sdW1uU2NoZW1hQmFzZVtdKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29scykge1xyXG4gICAgICAgICAgICBpZiAoY29sLmRhdGFUeXBlID09ICdkYXRlJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wuZm9ybWF0KSBjb2wuZm9ybWF0ID0gJ25vcm1hbCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29sLmV4dGVuZERhdGEuc3R5bGUgPSB0aGlzLmdldENvbHVtblN0eWxlKGNvbCk7XHJcbiAgICAgICAgICAgIGNvbC5leHRlbmREYXRhLmhlYWRlclN0eWxlID0gdGhpcy5nZXRDb2x1bW5TdHlsZShjb2wsIHRydWUpO1xyXG4gICAgICAgICAgICBjb2wuZXh0ZW5kRGF0YS5oZWFkZXJDbGFzcyA9IHRoaXMuZ2V0Q2VsbENsYXNzSGVhZGVyKGNvbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q29sdW1uU2V0dGluZyhjb2xHcm91cDogQ29sdW1uU2NoZW1hQmFzZSkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5ncm91cENvbHVtbiA9IGNvbEdyb3VwO1xyXG4gICAgICAgIGNvbnN0IGRhdGFTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MVU1OX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhU2V0dGluZykge1xyXG4gICAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZGF0YVNldHRpbmcpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldHRpbmdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc2V0dGluZ3NbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wYXRobmFtZSA9PT0gcGF0aE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQgPSBlbGVtZW50LnNldHRpbmcuc29ydEZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnREaXIgPSBlbGVtZW50LnNldHRpbmcuc29ydERpciA/IGVsZW1lbnQuc2V0dGluZy5zb3J0RGlyIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydERpciA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnRGaWVsZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwRmllbGQgPSBlbGVtZW50LnNldHRpbmcuZ3JvdXBGaWVsZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEluQ2xpZW50ID0gZWxlbWVudC5zZXR0aW5nLmdyb3VwSW5DbGllbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEZpZWxkICYmIGNvbEdyb3VwICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRHcm91cEZpZWxkKGNvbEdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZGV0YWlscyA9IGVsZW1lbnQuc2V0dGluZy5kZXRhaWxzO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbEdyb3VwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0R3JvdXBGaWVsZChjb2xHcm91cCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0R3JvdXBGaWVsZChjb2xHcm91cCkge1xyXG4gICAgICAgIGlmICgoY29sR3JvdXAuZGF0YVNvdXJjZSAmJiBjb2xHcm91cC5kYXRhU291cmNlLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHx8IGNvbEdyb3VwLmJhc2VTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwRmllbGQgPSBgc3RyJHtjb2xHcm91cC5maWVsZH1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZCA9IGNvbEdyb3VwLmZpZWxkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhdmVDb2x1bW5TZXR0aW5nKCkge1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuc2V0dGluZ0tleSkge1xyXG4gICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbHVtblNldHRpbmcgPSBbXTtcclxuICAgICAgICBsZXQgY2hlY2tFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGRhdGFTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MVU1OX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhU2V0dGluZykge1xyXG4gICAgICAgICAgICBjb2x1bW5TZXR0aW5nID0gSlNPTi5wYXJzZShkYXRhU2V0dGluZyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1TZXR0aW5nID0gY29sdW1uU2V0dGluZy5maW5kKHEgPT4gcS5wYXRobmFtZSA9PSBwYXRoTmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtU2V0dGluZykge1xyXG4gICAgICAgICAgICAgICAgaXRlbVNldHRpbmcuc2V0dGluZy5zb3J0RmllbGQgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpdGVtU2V0dGluZy5zZXR0aW5nLnNvcnREaXIgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RGlyO1xyXG4gICAgICAgICAgICAgICAgaXRlbVNldHRpbmcuc2V0dGluZy5ncm91cEZpZWxkID0gdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZDtcclxuICAgICAgICAgICAgICAgIGl0ZW1TZXR0aW5nLnNldHRpbmcuZ3JvdXBJbkNsaWVudCA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwSW5DbGllbnQ7XHJcbiAgICAgICAgICAgICAgICBpdGVtU2V0dGluZy5zZXR0aW5nLmRldGFpbHMgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5kZXRhaWxzO1xyXG4gICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY2hlY2tFeGlzdCkge1xyXG4gICAgICAgICAgICBjb2x1bW5TZXR0aW5nLnB1c2goeyBwYXRobmFtZTogcGF0aE5hbWUsIHNldHRpbmc6IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MVU1OX1NFVFRJTkcsIEpTT04uc3RyaW5naWZ5KGNvbHVtblNldHRpbmcpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlbGV0ZUNvbHVtblNldHRpbmcoKSB7XHJcbiAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgIHBhdGhOYW1lICs9ICcvJyArIHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY29sdW1uU2V0dGluZyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGRhdGFTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MVU1OX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhU2V0dGluZykge1xyXG4gICAgICAgICAgICBjb2x1bW5TZXR0aW5nID0gSlNPTi5wYXJzZShkYXRhU2V0dGluZyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY29sdW1uU2V0dGluZy5maW5kSW5kZXgocSA9PiBxLnBhdGhuYW1lID09IHBhdGhOYW1lKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIGNvbHVtblNldHRpbmcuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkNPTFVNTl9TRVRUSU5HLCBKU09OLnN0cmluZ2lmeShjb2x1bW5TZXR0aW5nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb2xvclNldHRpbmcoKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YVBhZ2VTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MT1JfU0VUVElORyk7XHJcbiAgICAgICAgaWYgKGRhdGFQYWdlU2V0dGluZykge1xyXG4gICAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZGF0YVBhZ2VTZXR0aW5nKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXR0aW5ncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHNldHRpbmdzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyRmllbGQgPSBlbGVtZW50LmNvbG9yRmlsdGVyRmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyVGFibGUgPSBlbGVtZW50LmNvbG9yRmlsdGVyVGFibGU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWNoZUNvbG9yU2V0dGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FjaGVDb2xvclNldHRpbmcoKSB7XHJcbiAgICAgICAgdGhpcy5fY29sb3JGaWx0ZXJUYWJsZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJUYWJsZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyVGFibGVbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1WYWx1ZXMgPSBbXTtcclxuICAgICAgICAgICAgaXRlbVZhbHVlc1swXSA9IGl0ZW0uY29tcGFyZVR5cGU7XHJcbiAgICAgICAgICAgIGl0ZW1WYWx1ZXNbMV0gPSBpdGVtLmZpbHRlclZhbHVlO1xyXG4gICAgICAgICAgICBpdGVtVmFsdWVzWzJdID0gdGhpcy5jb252ZXJ0VG9EYXRlKGl0ZW0uZmlsdGVyVmFsdWUpO1xyXG4gICAgICAgICAgICBpdGVtVmFsdWVzWzNdID0gTnVtYmVyKGl0ZW0uZmlsdGVyVmFsdWUpO1xyXG4gICAgICAgICAgICBpdGVtVmFsdWVzWzRdID0gKC90cnVlL2kpLnRlc3QoaXRlbS5maWx0ZXJWYWx1ZSk7XHJcbiAgICAgICAgICAgIGl0ZW1WYWx1ZXNbNV0gPSBpdGVtLmNvbG9yO1xyXG4gICAgICAgICAgICB0aGlzLl9jb2xvckZpbHRlclRhYmxlLnB1c2goaXRlbVZhbHVlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Q29sb3JTZXR0aW5nKCkge1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuc2V0dGluZ0tleSkge1xyXG4gICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbG9yU2V0dGluZyA9IFtdO1xyXG4gICAgICAgIGxldCBjaGVja0V4aXN0ID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgZGF0YUNvbG9yU2V0dGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkNPTE9SX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhQ29sb3JTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIGNvbG9yU2V0dGluZyA9IEpTT04ucGFyc2UoZGF0YUNvbG9yU2V0dGluZyk7XHJcbiAgICAgICAgICAgIGNvbG9yU2V0dGluZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb2xvckZpbHRlckZpZWxkID0gdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyRmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb2xvckZpbHRlclRhYmxlID0gdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyVGFibGU7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjaGVja0V4aXN0KSB7XHJcbiAgICAgICAgICAgIGNvbG9yU2V0dGluZy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBwYXRoTmFtZSxcclxuICAgICAgICAgICAgICAgIGNvbG9yRmlsdGVyRmllbGQ6IHRoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkLFxyXG4gICAgICAgICAgICAgICAgY29sb3JGaWx0ZXJUYWJsZTogdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyVGFibGVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5DT0xPUl9TRVRUSU5HLCBKU09OLnN0cmluZ2lmeShjb2xvclNldHRpbmcpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFBhZ2VTZXR0aW5nKCkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFQYWdlU2V0dGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLlBBR0VfU0VUVElORyk7XHJcbiAgICAgICAgaWYgKGRhdGFQYWdlU2V0dGluZykge1xyXG4gICAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBwYWdlU2V0dGluZ3MgPSBKU09OLnBhcnNlKGRhdGFQYWdlU2V0dGluZyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFnZVNldHRpbmdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcGFnZVNldHRpbmdzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2VTaXplID0gZWxlbWVudC5wYWdlU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhdmVQYWdlU2V0dGluZygpIHtcclxuICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNldHRpbmdLZXkpIHtcclxuICAgICAgICAgICAgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5zZXR0aW5nLnNldHRpbmdLZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwYWdlU2V0dGluZyA9IFtdO1xyXG4gICAgICAgIGxldCBjaGVja0V4aXN0ID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgZGF0YVBhZ2VTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuUEFHRV9TRVRUSU5HKTtcclxuICAgICAgICBpZiAoZGF0YVBhZ2VTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIHBhZ2VTZXR0aW5nID0gSlNPTi5wYXJzZShkYXRhUGFnZVNldHRpbmcpO1xyXG4gICAgICAgICAgICBwYWdlU2V0dGluZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wYWdlU2l6ZSA9IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0V4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNoZWNrRXhpc3QpIHtcclxuICAgICAgICAgICAgcGFnZVNldHRpbmcucHVzaCh7IHBhdGhuYW1lOiBwYXRoTmFtZSwgcGFnZVNpemU6IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlU2l6ZSB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLlBBR0VfU0VUVElORywgSlNPTi5zdHJpbmdpZnkocGFnZVNldHRpbmcpKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lzSW5zaWRlRGlhbG9nKCkge1xyXG4gICAgICAgIGNvbnN0ICRkaWFsb2cgPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsb3Nlc3QoJy5wLWRpYWxvZycpO1xyXG4gICAgICAgIHJldHVybiAhISRkaWFsb2c7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUmVhZHkoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5maXhIZWlnaHRUeXBlSW5EaWFsb2cpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tJc0luc2lkZURpYWxvZygpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuaGVpZ2h0VHlwZSA9IEhlaWdodFR5cGUuY3VzdG9tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25SZWFkeS5lbWl0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tBbGxvd1NlbGVjdFJvdyhldnQsIHJvd0RhdGEpIHtcclxuICAgICAgICBpZiAodGhpcy5jb25maWcuZGlzYWJsZVJvd1NlbGVjdFdoZW5DbGlja0FjdGlvblxyXG4gICAgICAgICAgICAmJiAoZXZ0LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJy5saW5rLW9yLWFjdGlvbicpXHJcbiAgICAgICAgICAgICAgICB8fCBldnQudGFyZ2V0LmNsb3Nlc3QoJy5saW5rLW9yLWFjdGlvbicpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDbGljayB2w6BvIGNoZWNrYm94XHJcbiAgICAgICAgaWYgKGV2dC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwLWNoZWNrYm94LWJveCcpIHx8IGV2dC50YXJnZXQuY2xvc2VzdCgnLnAtY2hlY2tib3gtYm94JykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNoZWNrQWxsb3dTZWxlY3RSb3cgJiYgIXRoaXMuc2V0dGluZy5jaGVja0FsbG93U2VsZWN0Um93KHJvd0RhdGEsIGV2dCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVTZWxlY3RSb3cgPSAoZXZ0LCBkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5oYXNDdXN0b21IYW5kbGVDbGlja1Jvdykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tBbGxvd1NlbGVjdFJvdyhldnQsIGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb2xkQ2hlY2tlZCA9IGRhdGEuX2NoZWNrZWQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcubXVsdGlwbGVDaGVja1doZW5DbGlja1Jvdykge1xyXG4gICAgICAgICAgICBsZXQgZGF0YVRvQ2xlYXJDaGVja2VkID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RSb3dDbGljaykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdFJvd0NsaWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBkYXRhVG9DbGVhckNoZWNrZWQgPSB0aGlzLm1vZGVsLmRhdGFTb3VyY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhVG9DbGVhckNoZWNrZWQgPSB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGF0YVRvQ2xlYXJDaGVja2VkLmZvckVhY2goKHAsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwLl9jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YS5fY2hlY2tlZCA9ICFvbGRDaGVja2VkO1xyXG4gICAgICAgIGxldCBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmZpcmVFdmVudFdoZW5SZVNlbGVjdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1MYXN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtTGFzdCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YShkYXRhLCBldnQudGFyZ2V0LmNsb3Nlc3QoJ3RyJyksIGZpcmVFdmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGhhbmRsZVNlbGVjdFJvd0dyb3VwID0gKGV2dCwgZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0FsbG93U2VsZWN0Um93KGV2dCwgZGF0YSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5tdWx0aXBsZUNoZWNrV2hlbkNsaWNrUm93KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zTW9kaWZpZWQgPSBbLi4udGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zXTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmZvckVhY2goKHAsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwLl9jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIWl0ZW1zTW9kaWZpZWQuc29tZShxID0+IHEuaWQgPT0gZGF0YS5pZCkpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zTW9kaWZpZWQucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpdGVtc01vZGlmaWVkLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cChpdGVtLCBudWxsLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhLl9jaGVja2VkID0gIWRhdGEuX2NoZWNrZWQ7XHJcblxyXG4gICAgICAgIGxldCBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmZpcmVFdmVudFdoZW5SZVNlbGVjdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1MYXN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtTGFzdCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cChkYXRhLCBldnQudGFyZ2V0LmNsb3Nlc3QoJ3RyJyksIGZpcmVFdmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgc2V0TGFzdEl0ZW1TZWxlY3RlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1MYXN0ID0gdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zW3RoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtTGFzdCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2VtaXRSb3dTZWxlY3QodHJFbGVtZW50LCBkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHtcclxuICAgICAgICAgICAgZWxlbWVudDogdHJFbGVtZW50LFxyXG4gICAgICAgICAgICBkYXRhXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVRvZ2dsZVJvdyhyb3dEYXRhLCBldnQpIHtcclxuICAgICAgICB0aGlzLnRhYmxlLnRvZ2dsZVJvdyhyb3dEYXRhLCBldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRJdGVtV29ya2Zsb3dTZXR0aW5nKHNldHRpbmc6IENydWRMaXN0U2V0dGluZywgcm93RGF0YSkge1xyXG4gICAgICAgIGxldCB3b3JrZmxvd1NldHRpbmcgPSBzZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldztcclxuICAgICAgICBpZiAoc2V0dGluZy5pc1dvcmtmbG93VHJlZVxyXG4gICAgICAgICAgICAmJiBzZXR0aW5nLndvcmtmbG93Q29uZmlnQWR2YW5jZVxyXG4gICAgICAgICAgICAmJiBzZXR0aW5nLndvcmtmbG93Q29uZmlnQWR2YW5jZS5nZXRXb3JrZmxvd1NldHRpbmdcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgd29ya2Zsb3dTZXR0aW5nID0gYXdhaXQgc2V0dGluZy53b3JrZmxvd0NvbmZpZ0FkdmFuY2UuZ2V0V29ya2Zsb3dTZXR0aW5nKHJvd0RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXdvcmtmbG93U2V0dGluZyB8fCB3b3JrZmxvd1NldHRpbmcud29ya2Zsb3dzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ8SQ4buRaSB0xrDhu6NuZyBjaMawYSDEkcaw4bujYyBj4bqldSBow6xuaCBxdXkgdHLDrG5oIG5naGnhu4dwIHbhu6UnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHdvcmtmbG93U2V0dGluZztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaG93Rm9ybVN0YXJ0V29ya2Zsb3cocm93RGF0YSkge1xyXG4gICAgICAgIHJvd0RhdGEuX19zdGFydGluZ1dvcmtmbG93ID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCB3b3JrZmxvd1NldHRpbmcgPSBhd2FpdCB0aGlzLmdldEl0ZW1Xb3JrZmxvd1NldHRpbmcodGhpcy5zZXR0aW5nLCByb3dEYXRhKTtcclxuICAgICAgICBpZiAoIXdvcmtmbG93U2V0dGluZykge1xyXG4gICAgICAgICAgICByb3dEYXRhLl9fc3RhcnRpbmdXb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE7hur91IGNyZWF0ZSB0YXNrIHRoYXkgdsOsIGNo4bqheSBxdXkgdHLDrG5oIHbhu5tpIMSR4buRaSB0xrDhu6NuZyBjaMOtbmggdGjDrCBt4bufIGZvcm0gdGjDqm0gY8O0bmcgdmnhu4djXHJcbiAgICAgICAgaWYgKHdvcmtmbG93U2V0dGluZy5jcmVhdGVUYXNrSW5zdGVhZCkge1xyXG4gICAgICAgICAgICAvLyBLaeG7g20gdHJhIMSRw6MgdOG6oW8gY8O0bmcgdmnhu4djIGfhuq9uIHbhu5tpIGLhuqNuIGdoaSBjaMawYVxyXG4gICAgICAgICAgICAvLyBO4bq/dSBjw7MgcuG7k2kgdGjDrCBiw6FvXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdENoZWNrRXhpc3QgPSAoYXdhaXQgdGhpcy5fY29uZ1ZpZWNTZXJ2aWNlLmNoZWNrRXhpc3RCeUZpbHRlcihbXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5ld0ZpbHRlcignc2VydmljZUNvZGUnLCBPcGVyYXRvci5lcXVhbCwgdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnNlcnZpY2VDb2RlKSxcclxuICAgICAgICAgICAgICAgIHRoaXMubmV3RmlsdGVyKCdlbnRpdHknLCBPcGVyYXRvci5lcXVhbCwgdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLmVudGl0eU5hbWUpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uZXdGaWx0ZXIoJ2VudGl0eUtleScsIE9wZXJhdG9yLmVxdWFsLCByb3dEYXRhLmlkKVxyXG4gICAgICAgICAgICBdKSk7XHJcbiAgICAgICAgICAgIGlmICghcmVzdWx0Q2hlY2tFeGlzdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICByb3dEYXRhLl9fc3RhcnRpbmdXb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBraeG7g20gdHJhIHRy4bqhbmcgdGjDoWkgxJHDoyB04bqhbyBjw7RuZyB2aeG7h2MgaGF5IGNoxrBhJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJlc3VsdENoZWNrRXhpc3QuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgcm93RGF0YS5fX3N0YXJ0aW5nV29ya2Zsb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0LhuqNuIGdoaSDEkcOjIMSRxrDhu6NjIHThuqFvIGPDtG5nIHZp4buHYycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcubW9kaWZ5Um93RGF0YUZvclRhc2spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0dGluZy5tb2RpZnlSb3dEYXRhRm9yVGFzayhyb3dEYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBtb2RlbFRhc2sgPSB7XHJcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5fY29tbW9uU2VydmljZS5ndWlkKCksIC8vIElkIG7DoHkgY+G6p24gdGhp4bq/dCB2w6wgc+G6vSBkw7luZyB0cm9uZyBow6BtIGluc2VydFRhc2tBbmRSZWxvYWRcclxuICAgICAgICAgICAgICAgIGNoZWNrVW5pcXVlVGFza0ZvckVudGl0eTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIC8vIGF1dG9OZXh0U3RlcDogd29ya2Zsb3dTZXR0aW5nLmF1dG9OZXh0U3RlcCxcclxuICAgICAgICAgICAgICAgIGlkTG9haUNvbmdWaWVjOiB3b3JrZmxvd1NldHRpbmcuaWRMb2FpQ29uZ1ZpZWNEZWZhdWx0LFxyXG4gICAgICAgICAgICAgICAgc2VydmljZUNvZGU6IHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5zZXJ2aWNlQ29kZSxcclxuICAgICAgICAgICAgICAgIGVudGl0eTogdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLmVudGl0eU5hbWUsXHJcbiAgICAgICAgICAgICAgICBlbnRpdHlLZXk6IHJvd0RhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICB0ZW46IHRoaXMuZ2V0VGVuQ29uZ1ZpZWMod29ya2Zsb3dTZXR0aW5nLnRlbXBsYXRlVGFza05hbWUsIHJvd0RhdGEpLFxyXG4gICAgICAgICAgICAgICAgZGluaEtlbU5naGllcFZ1RHRvczogW11cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIC8vIFThu5VuZyBo4bujcCBtb2RlbCDEkcOtbmgga8OobSBuZ2hp4buHcCB24bulIGVudGl0eVxyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50TGluayA9IGF3YWl0IHRoaXMuZ2V0Q29weVBhdGgodGhpcy5zZXR0aW5nLCByb3dEYXRhKTtcclxuICAgICAgICAgICAgaWYgKGNvbnRlbnRMaW5rKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEVudGl0eSA9IHRoaXMucGFyc2VBdHRhY2hMaW5rKGNvbnRlbnRMaW5rKTtcclxuICAgICAgICAgICAgICAgIG1vZGVsVGFzay5kaW5oS2VtTmdoaWVwVnVEdG9zID0gbW9kZWxFbnRpdHk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5tb2RpZnlJdGVtVGFzaykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXR0aW5nLm1vZGlmeUl0ZW1UYXNrKG1vZGVsVGFzaywgcm93RGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEtp4buDbSB0cmEgbuG6v3UgY8OzIGPhuqV1IGjDrG5oIHThu7EgxJHhu5luZyBi4bqvdCDEkeG6p3UgdGFzaywgdsOgIHBo4bqjaSBjw7MgbG/huqFpIGPDtG5nIHZp4buHYyBt4bq3YyDEkeG7i25oXHJcbiAgICAgICAgICAgIGlmICh3b3JrZmxvd1NldHRpbmcuYXV0b1N0YXJ0VGFza1xyXG4gICAgICAgICAgICAgICAgJiYgd29ya2Zsb3dTZXR0aW5nLmlkTG9haUNvbmdWaWVjRGVmYXVsdFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIC8vID0+IFRow6wgbOG6pXkgdGjDqm0gdGjDtG5nIHRpbiBxdXkgdHLDrG5oIG3hurdjIMSR4buLbmggY2hvIHRhc2tcclxuICAgICAgICAgICAgICAgIC8vIE7hur91IGzhuqV5IMSRxrDhu6NjIHRow6wgdOG7sSDEkeG7mW5nIGLhuq90IMSR4bqndSwgbuG6v3Uga2jDtG5nIHRow6wgduG6q24gcGjhuqNpIG3hu58gbMOqbiBmb3JtIGPDtG5nIHZp4buHY1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFza1dvcmtmbG93U2V0dGluZyA9IGF3YWl0IHRoaXMuX2RtTG9haUNvbmdWaWVjU2VydmljZS5nZXRXb3JrZmxvd1NldHRpbmdCeUlkTG9haUNvbmdWaWVjKHdvcmtmbG93U2V0dGluZy5pZExvYWlDb25nVmllY0RlZmF1bHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRhc2tXb3JrZmxvd1NldHRpbmcgIT0gbnVsbCAmJiB0YXNrV29ya2Zsb3dTZXR0aW5nLndvcmtmbG93Q29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsVGFza1tGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm1dID0gdGFza1dvcmtmbG93U2V0dGluZy53b3JrZmxvd0NvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRUYXNrQW5kUmVsb2FkKG1vZGVsVGFzaywgcm93RGF0YSwgdGFza1dvcmtmbG93U2V0dGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5fX3N0YXJ0aW5nV29ya2Zsb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jb25nVmllY01vZGVsLmRhdGEuY29uZ1ZpZWNTZXR0aW5nLmlzV29ya2Zsb3dUcmVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jb25nVmllY01vZGVsLmRhdGEubW9kZWwgPSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtU3RhdGU6IEZvcm1TdGF0ZS5BREQsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBtb2RlbFRhc2tcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5jb25nVmllY01vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAod29ya2Zsb3dTZXR0aW5nLndvcmtmbG93cy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGFydFdvcmtmbG93KHJvd0RhdGEsIHdvcmtmbG93U2V0dGluZy53b3JrZmxvd3NbMF0pO1xyXG4gICAgICAgICAgICAgICAgcm93RGF0YS5fX3N0YXJ0aW5nV29ya2Zsb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGFydFdvcmtmbG93TW9kZWwuZGF0YS53b3JrZmxvd3MgPSB3b3JrZmxvd1NldHRpbmcud29ya2Zsb3dzO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0V29ya2Zsb3dNb2RlbC5kYXRhLmRlZmF1bHRXb3JrZmxvdyA9IHdvcmtmbG93U2V0dGluZy53b3JrZmxvd0NvZGU7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRXb3JrZmxvd01vZGVsLmRhdGEuaXRlbSA9IHJvd0RhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRXb3JrZmxvd01vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJvd0RhdGEuX19zdGFydGluZ1dvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFRlbkNvbmdWaWVjKHRlbXBsYXRlVGV4dDogc3RyaW5nLCByb3dEYXRhOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gcmVuZGVyVGV4dFRlbXBsYXRlKFxyXG4gICAgICAgICAgICBnZXRSZWdleFJlc3VsdCh0ZW1wbGF0ZVRleHQsIFJlZ2V4U3BsaXRGaWVsZEJ5SXRlbSwgZXhlY1Jlc3VsdCA9PiBleGVjUmVzdWx0WzFdKSxcclxuICAgICAgICAgICAgdGVtcGxhdGVUZXh0LCByb3dEYXRhXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvbmdIb3BXb3JrZmxvd0hpc3RvcnlGb3JOZXh0Rmlyc3RTdGVwKFxyXG4gICAgICAgIGl0ZW1Xb3JrZmxvd0hpc3Rvcnk6IGFueSwgaXRlbVRhc2s6IGFueSwgd29ya2Zsb3dTZXR0aW5nOiBXb3JrZmxvd1NldHRpbmdOZXcsIHdvcmtmbG93Q29kZTogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgICBpZiAoaXRlbVdvcmtmbG93SGlzdG9yeSA9PSBudWxsKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBpZiAoaXRlbVdvcmtmbG93SGlzdG9yeSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93ID0gd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93cy5maW5kKHEgPT4gcS5jb2RlID09IHdvcmtmbG93Q29kZSk7XHJcbiAgICAgICAgICAgIGlmICh3b3JrZmxvdyA9PSBudWxsKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGVTdGFydCA9IHdvcmtmbG93LmRhdGEubWFjaGluZXMuZmluZChxID0+IHEudHlwZSA9PSBFbnVtU3RhdGVUeXBlLlNUQVJUKTtcclxuICAgICAgICAgICAgaWYgKHN0YXRlU3RhcnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvZGUgPSBpdGVtV29ya2Zsb3dIaXN0b3J5LmFjdGlvbkNvZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0QWN0aW9uID0gd29ya2Zsb3cuZGF0YS5jb25uZWN0aW9ucy5zb21lKHggPT4geC5zb3VyY2UgPT0gc3RhdGVTdGFydC5pZFxyXG4gICAgICAgICAgICAgICAgJiYgeC5jb2RlID09IGFjdGlvbkNvZGVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKCFleGlzdEFjdGlvbikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGNydWRMaXN0U2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nID0gbmV3IENydWRMaXN0U2V0dGluZygpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb25nVmllY1NlcnZpY2UuYWRqdXN0U2V0dGluZ1dvcmtmbG93Rm9yQ3J1ZExpc3QoY3J1ZExpc3RTZXR0aW5nKTtcclxuICAgICAgICAgICAgbGV0IG5hbWUgPSAnJztcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnVkTGlzdFNldHRpbmcuZGlzcGxheUZpZWxkID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gaXRlbVRhc2tbPHN0cmluZz4oY3J1ZExpc3RTZXR0aW5nLmRpc3BsYXlGaWVsZCldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmFtZSA9ICg8RnVuY3Rpb24+KGNydWRMaXN0U2V0dGluZy5kaXNwbGF5RmllbGQpKShpdGVtVGFzayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmFtZSA9IGAke2NydWRMaXN0U2V0dGluZy5iYXNlU2VydmljZS5vYmplY3ROYW1lfSAke25hbWV9YDtcclxuICAgICAgICAgICAgaXRlbVdvcmtmbG93SGlzdG9yeS50YWJsZU5hbWUgPSB0aGlzLl9jb25nVmllY1NlcnZpY2UuZW50aXR5TmFtZTtcclxuICAgICAgICAgICAgaXRlbVdvcmtmbG93SGlzdG9yeS5vYmplY3RGdWxsTmFtZSA9IG5hbWU7XHJcbiAgICAgICAgICAgIGl0ZW1Xb3JrZmxvd0hpc3Rvcnkub2JqZWN0TmFtZSA9IG5hbWU7XHJcbiAgICAgICAgICAgIGl0ZW1Xb3JrZmxvd0hpc3Rvcnkud29ya2Zsb3dDb2RlID0gd29ya2Zsb3dDb2RlO1xyXG4gICAgICAgICAgICBpdGVtV29ya2Zsb3dIaXN0b3J5Lml0ZW1JZCA9IGl0ZW1UYXNrLmlkO1xyXG4gICAgICAgICAgICBpdGVtV29ya2Zsb3dIaXN0b3J5LnNvdXJjZVN0YXR1c0NvZGUgPSBzdGF0ZVN0YXJ0LmNvZGU7XHJcbiAgICAgICAgICAgIGl0ZW1Xb3JrZmxvd0hpc3RvcnkuYWN0aW9uQ29kZSA9IGFjdGlvbkNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtV29ya2Zsb3dIaXN0b3J5O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgaW5zZXJ0VGFza0FuZFJlbG9hZChtb2RlbFRhc2ssIHJvd0RhdGEsIHdvcmtmbG93U2V0dGluZzogV29ya2Zsb3dTZXR0aW5nTmV3KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5nZXREYXRhRm9yTmV4dEZpcnN0U3RlcFRhc2spIHtcclxuICAgICAgICAgICAgbW9kZWxUYXNrLml0ZW1Xb3JrZmxvd0hpc3RvcnkgPSBhd2FpdCB0aGlzLnNldHRpbmcuZ2V0RGF0YUZvck5leHRGaXJzdFN0ZXBUYXNrKHJvd0RhdGEpO1xyXG4gICAgICAgICAgICBtb2RlbFRhc2suaXRlbVdvcmtmbG93SGlzdG9yeSA9IHRoaXMudG9uZ0hvcFdvcmtmbG93SGlzdG9yeUZvck5leHRGaXJzdFN0ZXAoXHJcbiAgICAgICAgICAgICAgICBtb2RlbFRhc2suaXRlbVdvcmtmbG93SGlzdG9yeSwgbW9kZWxUYXNrLCB3b3JrZmxvd1NldHRpbmcsIG1vZGVsVGFza1tGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm1dXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2NvbmdWaWVjU2VydmljZS5wb3N0KG1vZGVsVGFzaylcclxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCAnJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY2FsbCBiYWNrIGtoaSDhuqVuIGzGsHUgdHLDqm4gZm9ybSBi4bqvdCDEkeG6p3UgcXV5IHRyw6xuaFxyXG4gICAgICogY3J1ZC1saXN0IHPhur0gZ+G7jWkgaMOgbSBsxrB1IGNo4bupIGZvcm0gc3RhcnQgd29ya2Zsb3cgayBsw6BtIGfDrCBj4bqjXHJcbiAgICAgKiDEkOG7giBU4bqsTiBE4bukTkcgTOG6oEkgSMOATSBzdGFydFdvcmtmbG93IGPhu6dhIGNydWQtbGlzdFxyXG4gICAgICovXHJcbiAgICBoYW5kbGVTdGFydFdvcmtmbG93RnJvbURpYWxvZyh3b3JrZmxvdzogV2ZJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydFdvcmtmbG93TW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zdGFydFdvcmtmbG93KHRoaXMuc3RhcnRXb3JrZmxvd01vZGVsLmRhdGEuaXRlbSwgd29ya2Zsb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzaG93QWN0aW9uV29ya2Zsb3coZXZ0LCByb3dEYXRhKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd2luZ0FjdGlvbldvcmtmbG93KSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5zaG93aW5nQWN0aW9uV29ya2Zsb3cgPSB0cnVlO1xyXG4gICAgICAgIGxldCByZXN1bHRHZXRBY3Rpb25Xb3JrZmxvdyA9IG51bGw7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuaXNXb3JrZmxvd1RyZWUgJiYgdGhpcy5zZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy5jcmVhdGVUYXNrSW5zdGVhZCkge1xyXG4gICAgICAgICAgICByZXN1bHRHZXRBY3Rpb25Xb3JrZmxvdyA9IGF3YWl0IHRoaXMuZ2V0QWN0aW9uV29ya2Zsb3dCeVRhc2socm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHRHZXRBY3Rpb25Xb3JrZmxvdyA9IGF3YWl0IHRoaXMuZ2V0QWN0aW9uV29ya2Zsb3cocm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hvd2luZ0FjdGlvbldvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdEdldEFjdGlvbldvcmtmbG93KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdLaMO0bmcgY8OzIGjDoG5oIMSR4buZbmcga2jhuqMgZOG7pW5nJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRleHRzID0gcmVzdWx0R2V0QWN0aW9uV29ya2Zsb3c7XHJcbiAgICAgICAgLy8gTuG6v3UgbMOgIGLhuqNuIGdoaSBuZ2hp4buHcCB24bulIG3DoCBjw7MgZ+G6r24gdGjDtG5nIHRpbiB0YXNrIHRow6wgYuG7lSBzdW5nIHRow6ptIG1lbnUgeGVtIGPDtG5nIHZp4buHY1xyXG4gICAgICAgIGlmIChyb3dEYXRhW0ZpZWxkRGVmaW5lSGFzVGFza10pIHtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMudW5zaGlmdChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogYFhlbSBjw7RuZyB2aeG7h2NgLFxyXG4gICAgICAgICAgICAgICAgICAgIGljb246ICdwaSBwaS1tYXAnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudmlld1Rhc2tEZXRhaWwocm93RGF0YSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5idXR0b25Db250ZXh0cyA9IGJ1dHRvbkNvbnRleHRzO1xyXG4gICAgICAgIHRoaXMuX3Nob3dDb250ZXh0TWVudShldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEFjdGlvbldvcmtmbG93KHJvd0RhdGEpOiBQcm9taXNlPGFueVtdIHwgdm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHdvcmtmbG93U2V0dGluZyA9IGF3YWl0IHRoaXMuZ2V0SXRlbVdvcmtmbG93U2V0dGluZyh0aGlzLnNldHRpbmcsIHJvd0RhdGEpO1xyXG4gICAgICAgIGlmICghd29ya2Zsb3dTZXR0aW5nKSByZXR1cm47XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFjdGlvbldvcmtmbG93QmFzZSh0aGlzLnNldHRpbmcsIHJvd0RhdGEsIHdvcmtmbG93U2V0dGluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0QWN0aW9uV29ya2Zsb3dCeVRhc2socm93RGF0YSk6IFByb21pc2U8YW55W10gfCB2b2lkPiB7XHJcbiAgICAgICAgaWYgKCFyb3dEYXRhLl9faXNHb3RDb25nVmllYykge1xyXG4gICAgICAgICAgICByb3dEYXRhLl9faXRlbUNvbmdWaWVjID0gKGF3YWl0IHRoaXMuX2NvbmdWaWVjU2VydmljZS5nZXREZXRhaWxCeUZpbHRlcihcclxuICAgICAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0ZpbHRlcignc2VydmljZUNvZGUnLCBPcGVyYXRvci5lcXVhbCwgdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnNlcnZpY2VDb2RlKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0ZpbHRlcignZW50aXR5JywgT3BlcmF0b3IuZXF1YWwsIHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5lbnRpdHlOYW1lKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0ZpbHRlcignZW50aXR5S2V5JywgT3BlcmF0b3IuZXF1YWwsIHJvd0RhdGEuaWQpXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICkpLmRhdGE7XHJcbiAgICAgICAgICAgIHJvd0RhdGEuX19pc0dvdENvbmdWaWVjID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcm93RGF0YSA9IHJvd0RhdGEuX19pdGVtQ29uZ1ZpZWM7XHJcbiAgICAgICAgaWYgKCFyb3dEYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd2luZ0FjdGlvbldvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0tow7RuZyB0w6xtIHRo4bqleSBi4bqjbiBnaGkgY8O0bmcgdmnhu4djIGfhuq9uIHbhu5tpIGLhuqNuIGdoaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByb3dEYXRhLl9fd29ya2Zsb3dDb2RlID0gcm93RGF0YS53b3JrZmxvd0NvZGU7XHJcblxyXG4gICAgICAgIGNvbnN0IHdvcmtmbG93UGVybWlzc2lvbkRldGFpbFNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoV29ya2Zsb3dQZXJtaXNzaW9uRGV0YWlsU2VydmljZSk7XHJcbiAgICAgICAgY29uc3QgdXNlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoVXNlclNlcnZpY2UpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmtmbG93UGVybWlzc2lvbkRldGFpbFNlcnZpY2UuY2hhbmdlRW5kcG9pbnQodGhpcy5fY29uZ1ZpZWNTZXJ2aWNlKVxyXG4gICAgICAgICAgICAuYXBwZW5kSW5mb0ZvcldvcmtmbG93KFxyXG4gICAgICAgICAgICAgICAgdXNlclNlcnZpY2UuZ2V0VXNlcklkQ29tYmluZSgpLCBbcm93RGF0YV1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICBpZiAocmVzdWx0ICE9PSB0cnVlKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dTZXR0aW5nID0gYXdhaXQgdGhpcy5fZG1Mb2FpQ29uZ1ZpZWNTZXJ2aWNlLmdldFdvcmtmbG93U2V0dGluZ0J5SWRMb2FpQ29uZ1ZpZWMocm93RGF0YS5pZExvYWlDb25nVmllYyk7XHJcblxyXG4gICAgICAgIGlmICh3b3JrZmxvd1NldHRpbmcgPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNydWRMaXN0U2V0dGluZyA9IG5ldyBDcnVkTGlzdFNldHRpbmcoKTtcclxuICAgICAgICB0aGlzLl9jb25nVmllY1NlcnZpY2UuYWRqdXN0U2V0dGluZ1dvcmtmbG93Rm9yQ3J1ZExpc3QoY3J1ZExpc3RTZXR0aW5nKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QWN0aW9uV29ya2Zsb3dCYXNlKGNydWRMaXN0U2V0dGluZywgcm93RGF0YSwgd29ya2Zsb3dTZXR0aW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXRBY3Rpb25Xb3JrZmxvd0Jhc2UoY3J1ZExpc3RTZXR0aW5nOiBDcnVkTGlzdFNldHRpbmcsIHJvd0RhdGEsIHdvcmtmbG93U2V0dGluZzogV29ya2Zsb3dTZXR0aW5nTmV3KTogUHJvbWlzZTxhbnlbXSB8IHZvaWQ+IHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRJdGVtID0gcm93RGF0YTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzID0gW107XHJcbiAgICAgICAgY29uc3QgYnV0dG9uQ29udGV4dHMgPSBbXTtcclxuICAgICAgICAvLyBO4bq/dSBrIGPDsyB3b3JrZmxvdyBjb2RlIG5naMSpYSBsw6AgY2jGsGEgY2jhuqF5IHF1eSB0csOsbmggaG/hurdjIHF1eSB0csOsbmggbOG7l2kgPT4gQ2hvIGNo4bqheSBs4bqhaVxyXG4gICAgICAgIGlmICghcm93RGF0YS5fX3dvcmtmbG93Q29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtV29ya2Zsb3dTZXR0aW5nID0gd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93cy5maW5kKHEgPT4gcS5jb2RlID09IHJvd0RhdGEuX193b3JrZmxvd0NvZGUpO1xyXG4gICAgICAgICAgICBpZiAoIWl0ZW1Xb3JrZmxvd1NldHRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoYEtow7RuZyB0w6xtIHRo4bqleSBxdXkgdHLDrG5oIGPDsyBtw6MgJHtyb3dEYXRhLl9fd29ya2Zsb3dDb2RlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBpdGVtV29ya2Zsb3dTZXR0aW5nLmRhdGEuYWN0aW9uc1tyb3dEYXRhLl9fdHJhbmdUaGFpXTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQWxsb3dzID0gKGF3YWl0IGNydWRMaXN0U2V0dGluZy5iYXNlU2VydmljZS5nZXRBY3Rpb25BbGxvdyhyb3dEYXRhLmlkKSkuZGF0YTtcclxuICAgICAgICAgICAgaWYgKGFjdGlvbkFsbG93cykge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uQWxsb3dzLmZvckVhY2goYWN0aW9uQ29kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gYWN0aW9ucy5maW5kKHEgPT4gcS5jb2RlID09IGFjdGlvbkNvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb1RodVR1OiBhY3Rpb24uc29UaHVUdSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkNvZGU6IGFjdGlvbi5jb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogdGhpcy5zb3VyY2VJY29uW2FjdGlvbi5pY29uXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb24ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMucHJvY2Vzc1dvcmtmbG93KGNydWRMaXN0U2V0dGluZywgaXRlbVdvcmtmbG93U2V0dGluZywgYWN0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIEzhu5dpIGsgbOG6pXkgxJHGsOG7o2MgYWN0aW9uIGFsbG93XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMuc29ydChtdWx0aXBsZVNvcnQoJ3NvVGh1VHUnKSk7XHJcbiAgICAgICAgICAgIC8vIEtp4buDbSB0cmEgbmfGsOG7nWkgY3Xhu5FpIGPDuW5nIHRo4buxYyBoaeG7h24gY8OzIHBo4bqjaSBuZ8aw4budaSBoaeG7h24gdOG6oWkga2jDtG5nIHRow6wgY2hvIHBow6lwIHJvbGxiYWNrXHJcbiAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93SGlzdG9yeVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoV29ya2Zsb3dIaXN0b3J5U2VydmljZSk7XHJcbiAgICAgICAgICAgIHdvcmtmbG93SGlzdG9yeVNlcnZpY2UuY2hhbmdlRW5kcG9pbnQodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcclxuICAgICAgICAgICAgY29uc3QgdXNlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoVXNlclNlcnZpY2UpO1xyXG4gICAgICAgICAgICBjb25zdCB1c2VySWQgPSB1c2VyU2VydmljZS5nZXRJZCgpO1xyXG4gICAgICAgICAgICBsZXQgdXNlcklkU3RyaW5nVXBwZXIgPSAnJztcclxuICAgICAgICAgICAgaWYgKHVzZXJJZCkge1xyXG4gICAgICAgICAgICAgICAgdXNlcklkU3RyaW5nVXBwZXIgPSB1c2VySWQudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgaXRlbVdvcmtmbG93SGlzdG9yeUxhc3QgPSAoYXdhaXQgd29ya2Zsb3dIaXN0b3J5U2VydmljZS5jaGFuZ2VFbmRwb2ludChjcnVkTGlzdFNldHRpbmcuYmFzZVNlcnZpY2UpLmdldExhc3RCeUl0ZW1JZChyb3dEYXRhLmlkKSkuZGF0YTtcclxuICAgICAgICAgICAgaWYgKGl0ZW1Xb3JrZmxvd0hpc3RvcnlMYXN0XHJcbiAgICAgICAgICAgICAgICAmJiBpdGVtV29ya2Zsb3dIaXN0b3J5TGFzdC5hY3Rpb25Db2RlICE9IE1hQWN0aW9uQmF0RGF1UXV5VHJpbmhcclxuICAgICAgICAgICAgICAgICYmIGl0ZW1Xb3JrZmxvd0hpc3RvcnlMYXN0LnVzZXJJZENyZWF0ZWQudG9VcHBlckNhc2UoKSA9PSB1c2VySWRTdHJpbmdVcHBlclxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRleHRzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAncGkgcGktcmVwbGF5JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdUaHUgaOG7k2knLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnJvbGxiYWNrV29ya2Zsb3coY3J1ZExpc3RTZXR0aW5nLCByb3dEYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMucHVzaChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpY29uOiAncGkgcGktY29tbWVudHMnLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ2hvIMO9IGtp4bq/bicsXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy5zaG93Rm9ybUNob1lLaWVuKGNydWRMaXN0U2V0dGluZywgcm93RGF0YSlcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3BpIHBpLWNhbGVuZGFyJyxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogQnV0dG9uVGV4dEFjdGlvbkNvbmdWaWVjLlhFTV9MSUNIX1NVLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudmlld0hpc3RvcnlXb3JrZmxvdyhjcnVkTGlzdFNldHRpbmcsIHJvd0RhdGEpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBidXR0b25Db250ZXh0cztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB2aWV3VGFza0RldGFpbChyb3dEYXRhKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbVRhc2sgPSAoYXdhaXQgdGhpcy5fY29uZ1ZpZWNTZXJ2aWNlLmdldERldGFpbEJ5RmlsdGVyKFtcclxuICAgICAgICAgICAgdGhpcy5uZXdGaWx0ZXIoJ2VudGl0eUtleScsIE9wZXJhdG9yLmVxdWFsLCByb3dEYXRhLmlkKVxyXG4gICAgICAgIF0pKS5kYXRhO1xyXG4gICAgICAgIGlmIChpdGVtVGFzayA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0tow7RuZyB0w6xtIHRo4bqleSBjw7RuZyB2aeG7h2MgZ+G6r24gduG7m2kgYuG6o24gZ2hpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhc2tGb3JtTW9kZWw6IGFueSA9IHt9O1xyXG4gICAgICAgIHRhc2tGb3JtTW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLlZJRVc7XHJcbiAgICAgICAgdGFza0Zvcm1Nb2RlbC5kYXRhID0gaXRlbVRhc2s7XHJcbiAgICAgICAgdGhpcy5kZXRhaWxUYXNrTW9kZWwuZGF0YS50YXNrRm9ybU1vZGVsID0gdGFza0Zvcm1Nb2RlbDtcclxuICAgICAgICB0aGlzLmRldGFpbFRhc2tNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Nob3dDb250ZXh0TWVudShldnQpIHtcclxuICAgICAgICAvLyBzZXRUaW1lb3V0IMSR4buDIGZpeCBidWcgaGnhu4NuIHRo4buLIGNvbnRleHQgbWVudSB0csOgbiByYSBuZ2/DoGkgbcOgbiBow6xuaFxyXG4gICAgICAgIHNldFRpbWVvdXQoZiA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdyhldnQpO1xyXG4gICAgICAgIH0sIDEwKTtcclxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcm9sbGJhY2tXb3JrZmxvdyhjcnVkTGlzdFNldHRpbmc6IENydWRMaXN0U2V0dGluZywgcm93RGF0YSkge1xyXG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93Q29uZmlybSgnQuG6oW4gY8OzIGNo4bqvYyBjaOG6r24gbXXhu5FuIGtow7RpIHBo4bulYyB0cuG6oW5nIHRow6FpIHRyxrDhu5tjIMSRw7MnKVxyXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXMpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNydWRMaXN0U2V0dGluZy5kaXNwbGF5RmllbGQgPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gcm93RGF0YVs8c3RyaW5nPihjcnVkTGlzdFNldHRpbmcuZGlzcGxheUZpZWxkKV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gKDxGdW5jdGlvbj4oY3J1ZExpc3RTZXR0aW5nLmRpc3BsYXlGaWVsZCkpKHJvd0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY3J1ZExpc3RTZXR0aW5nLmJhc2VTZXJ2aWNlLnJvbGxiYWNrKHJvd0RhdGEsIFtjcnVkTGlzdFNldHRpbmcub2JqZWN0TmFtZSwgbmFtZV0pXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCAnS2jDtGkgcGjhu6VjIHRy4bqhbmcgdGjDoWkgdHLGsOG7m2MgdGjDoG5oIGPDtG5nJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Sb2xsYmFja2VkV29ya2Zsb3cuZW1pdChyb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZWRTdGF0dXNXb3JrZmxvdy5lbWl0KHJvd0RhdGEuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHZpZXdIaXN0b3J5V29ya2Zsb3coY3J1ZExpc3RTZXR0aW5nOiBDcnVkTGlzdFNldHRpbmcsIHJvd0RhdGE6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHdvcmtmbG93U2V0dGluZyA9IGF3YWl0IHRoaXMuZ2V0SXRlbVdvcmtmbG93U2V0dGluZyhjcnVkTGlzdFNldHRpbmcsIHJvd0RhdGEpO1xyXG4gICAgICAgIGlmICghd29ya2Zsb3dTZXR0aW5nKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SXRlbSA9IHJvd0RhdGE7XHJcbiAgICAgICAgdGhpcy53b3JrZmxvd0hpc3RvcnlNb2RlbC5kYXRhID0ge307XHJcbiAgICAgICAgdGhpcy53b3JrZmxvd0hpc3RvcnlNb2RlbC5kYXRhLnNldHRpbmcgPSBjcnVkTGlzdFNldHRpbmc7XHJcbiAgICAgICAgdGhpcy53b3JrZmxvd0hpc3RvcnlNb2RlbC5kYXRhLndvcmtmbG93U2V0dGluZyA9IHdvcmtmbG93U2V0dGluZztcclxuICAgICAgICB0aGlzLndvcmtmbG93SGlzdG9yeU1vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlSGlkZUhpc3RvcnlXb3JrZmxvdygpIHtcclxuICAgICAgICB0aGlzLnNob3dIaXN0b3J5V29ya2Zsb3cgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwcm9jZXNzV29ya2Zsb3coY3J1ZExpc3RTZXR0aW5nOiBDcnVkTGlzdFNldHRpbmcsIGl0ZW1Xb3JrZmxvd1NldHRpbmc6IGFueSwgd29ya2Zsb3dBY3Rpb246IFdmQWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKHdvcmtmbG93QWN0aW9uLm9wZW5OZXdUYWIpIHtcclxuICAgICAgICAgICAgbGV0IGRvbWFpbk5ld1RhYiA9IHdvcmtmbG93QWN0aW9uLmRvbWFpbk5ld1RhYjtcclxuICAgICAgICAgICAgaWYgKCFkb21haW5OZXdUYWIpIGRvbWFpbk5ld1RhYiA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKGAke2RvbWFpbk5ld1RhYn0vJHt3b3JrZmxvd0FjdGlvbi5saW5rTmV3VGFifSNfaXRlbUlkPSR7dGhpcy5jdXJyZW50SXRlbS5pZH1gLCAnX2JsYW5rJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF3b3JrZmxvd0FjdGlvbi5vcGVuUG9wdXApIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93V2FpdEJveCgpO1xyXG4gICAgICAgICAgICBjcnVkTGlzdFNldHRpbmcuYmFzZVNlcnZpY2UuY2hhbmdlU3RhdGVCYXNlQnlBY3Rpb24odGhpcy5jdXJyZW50SXRlbS5pZCwgd29ya2Zsb3dBY3Rpb24uY29kZSlcclxuICAgICAgICAgICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLmhhbmRsZVJlc3BvbnNlV2l0aFdhaXRCb3gocmVzLCAnJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9jZXNzZWRXb3JrZmxvd0Jhc2UoKTtcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhpZGVXYWl0Qm94KCkpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJvY2Vzc1dvcmtmbG93TW9kZWwuc2hvd0VkaXRGb3JtID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnByb2Nlc3NXb3JrZmxvd01vZGVsLmhlYWRlciA9IHdvcmtmbG93QWN0aW9uLm5hbWU7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzV29ya2Zsb3dNb2RlbC5kYXRhLnNldHRpbmcgPSBjcnVkTGlzdFNldHRpbmc7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzV29ya2Zsb3dNb2RlbC5kYXRhLmFjdGlvbiA9IHdvcmtmbG93QWN0aW9uO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc1dvcmtmbG93TW9kZWwuZGF0YS53b3JrZmxvdyA9IGl0ZW1Xb3JrZmxvd1NldHRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0Zvcm1DaG9ZS2llbihjcnVkTGlzdFNldHRpbmc6IENydWRMaXN0U2V0dGluZywgcm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jaG9ZS2llbk1vZGVsLmRhdGEucm93RGF0YSA9IHJvd0RhdGE7XHJcbiAgICAgICAgdGhpcy5jaG9ZS2llbk1vZGVsLmRhdGEuc2V0dGluZyA9IGNydWRMaXN0U2V0dGluZztcclxuICAgICAgICB0aGlzLmNob1lLaWVuTW9kZWwuc2hvd0VkaXRGb3JtID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdGFydFdvcmtmbG93KHJvd0RhdGEsIHdvcmtmbG93OiBXZkl0ZW0pIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2Uuc3RhcnRXb3JrZmxvdyhyb3dEYXRhLmlkLCB3b3JrZmxvdy5jb2RlKVxyXG4gICAgICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShyZXMsICdDaOG6oXkgcXV5IHRyw6xuaCB0aMOgbmggY8O0bmcnLCBmID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25TdGFydGVkV29ya2Zsb3cuZW1pdChyb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2VkU3RhdHVzV29ya2Zsb3cuZW1pdChyb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUHJvY2Vzc2VkV29ya2Zsb3dCYXNlKCkge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc1dvcmtmbG93TW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vblByb2Nlc3NlZFdvcmtmbG93LmVtaXQodGhpcy5jdXJyZW50SXRlbS5pZCk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZWRTdGF0dXNXb3JrZmxvdy5lbWl0KHRoaXMuY3VycmVudEl0ZW0uaWQpO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRCeVR5cGUoY29udHJvbFR5cGU6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChjb250cm9sVHlwZSA9PSAndHJhbmdUaGFpVjUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVHJhbmdUaGFpVjU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sVHlwZSA9PSAnX192aWV3SGlzdG9yeScpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVDb2xWaWV3SGlzdG9yeTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLl9jb21tb25TZXJ2aWNlLmZpbmRUZW1wbGF0ZUZyb21MaXN0KHRoaXMuY2hpbGRyZW4sIGNvbnRyb2xUeXBlKTtcclxuICAgICAgICBpZiAoIWl0ZW0gJiYgdGhpcy50ZW1wbGF0ZXMpIHtcclxuICAgICAgICAgICAgaXRlbSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZmluZFRlbXBsYXRlRnJvbUxpc3QodGhpcy50ZW1wbGF0ZXMsIGNvbnRyb2xUeXBlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0RmlsdGVycygpOiBGaWx0ZXJbXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyX2RlZmF1bHQpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5maWx0ZXJfZGVmYXVsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcl9jdXN0b20pIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5maWx0ZXJfY3VzdG9tKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyX2NvbHVtbikge1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmZpbHRlcl9jb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJfYWR2YW5jZVNlYXJjaCkge1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmZpbHRlcl9hZHZhbmNlU2VhcmNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRHcmlkSW5mbygpIHtcclxuICAgICAgICBjb25zdCBncmlkSW5mbyA9IG5ldyBHcmlkSW5mbyh7XHJcbiAgICAgICAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSxcclxuICAgICAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZVNpemVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5nZXRGaWx0ZXJzKCksXHJcbiAgICAgICAgICAgIHNvcnRzOiBbXSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdXBGaWVsZCAmJiAhdGhpcy5fZ3JvdXBJbkNsaWVudCkge1xyXG4gICAgICAgICAgICBncmlkSW5mby5zb3J0cy51bnNoaWZ0KHsgZmllbGQ6IHRoaXMuX2dyb3VwRmllbGQsIGRpcjogMSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3NvcnRGaWVsZCAmJiB0aGlzLl9zb3J0RGlyICE9PSAwKSB7XHJcbiAgICAgICAgICAgIGdyaWRJbmZvLnNvcnRzLnB1c2goeyBmaWVsZDogdGhpcy5fc29ydEZpZWxkLCBkaXI6IHRoaXMuX3NvcnREaXIgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZ3JpZEluZm87XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVNlYXJjaEFkdnMoZmlsdGVyczogRmlsdGVyW10pIHtcclxuICAgICAgICB0aGlzLmZpbHRlcl9hZHZhbmNlU2VhcmNoID0gZmlsdGVycztcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IDE7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlSW5pdEFkdmFuY2VTZWFyY2goZmlsdGVyczogRmlsdGVyW10pIHtcclxuICAgICAgICB0aGlzLmZpbHRlcl9hZHZhbmNlU2VhcmNoID0gZmlsdGVycztcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RGF0YSgpIHtcclxuICAgICAgICBjb25zdCBpbmZvR2V0RGF0YSA9IHRoaXMuZ2V0R3JpZEluZm8oKTtcclxuICAgICAgICB0aGlzLm9uUmVsb2FkLmVtaXQoaW5mb0dldERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZChmaWx0ZXJfY3VzdG9tPzogRmlsdGVyW10sIHBhZ2UgPSAxKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfY3VzdG9tID0gZmlsdGVyX2N1c3RvbTtcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZCgpIHtcclxuICAgICAgICB0aGlzLm9uQWRkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICB4dWF0Q2FjTXVjRGFDaG9uKCkge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5zZXR0aW5nLmV4cG9ydEl0ZW1zTW9kZSkge1xyXG4gICAgICAgICAgICBjYXNlIEV4cG9ydEl0ZW1zTW9kZS5Gcm9tSHRtbDpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0QnlSZWFkaW5nSHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRXhwb3J0SXRlbXNNb2RlLk1hbnVhbEdldERhdGE6XHJcbiAgICAgICAgICAgIGNhc2UgRXhwb3J0SXRlbXNNb2RlLkF1dG9HZXREYXRhOlxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdUaGUgZnVuY3Rpb24gaGF2ZW5cXCd0IHN1cHBvcnRlZCB5ZXQnKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZXhwb3J0QnlSZWFkaW5nSHRtbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0NoxrBhIGjhu5cgdHLhu6MgeHXhuqV0IGPDsyBuaMOzbSBk4buvIGxp4buHdSEnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMudGFibGUuZWwubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJsZUVsZSA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcigndGFibGUnKTtcclxuICAgICAgICBjb25zdCBoZWFkRWxlID0gdGFibGVFbGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgICAgICBjb25zdCBib2R5RWxlID0gdGFibGVFbGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuXHJcbiAgICAgICAgLy8gaGVhZGVyLlxyXG4gICAgICAgIGNvbnN0IGFyckhlYWQgPSB0aGlzLmdldEFyckhlYWRCeUh0bWwoaGVhZEVsZSk7XHJcbiAgICAgICAgaWYgKCFhcnJIZWFkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGJvZHkuXHJcbiAgICAgICAgY29uc3QgYXJyUm93RGF0YSA9IHRoaXMuZ2V0QXJyUm93RGF0YUJ5SHRtbChib2R5RWxlLCBhcnJIZWFkKTtcclxuXHJcbiAgICAgICAgLy8gZXhwb3J0LlxyXG4gICAgICAgIGNvbnN0IGRhdGFFeHBvcnQgPSBbYXJySGVhZC5tYXAoaSA9PiBpLnZhbHVlKSwgLi4uYXJyUm93RGF0YV07XHJcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBgRGFuaCBzw6FjaCAke3RoaXMuc2V0dGluZy5vYmplY3ROYW1lfWA7XHJcbiAgICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5vYmplY3RUb0V4Y2VsKGRhdGFFeHBvcnQsIGZpbGVOYW1lKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFyckhlYWRCeUh0bWwoaGVhZGVyKSB7XHJcbiAgICAgICAgY29uc3QgZmlyc3RSb3cgPSBoZWFkZXIucXVlcnlTZWxlY3RvcigndHInKTtcclxuICAgICAgICBpZiAoIWZpcnN0Um93KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhcnJUaCA9IGZpcnN0Um93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLnNldHRpbmcuaGlkZGVuQ2hlY2tib3ggPyAwIDogMTtcclxuICAgICAgICBjb25zdCBlbmRJbmRleCA9IGFyclRoLmxlbmd0aCAtICh0aGlzLnNldHRpbmcuaGlkZGVuRnVuY3Rpb25Db2x1bW4gPyAwIDogMSkgLSAxO1xyXG4gICAgICAgIGlmIChzdGFydEluZGV4ID4gZW5kSW5kZXgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhcnJIZWFkZXIgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChhcnJUaFtpXS5pbm5lclRleHQpIHtcclxuICAgICAgICAgICAgICAgIGFyckhlYWRlci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYXJyVGhbaV0uaW5uZXJUZXh0XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFyckhlYWRlcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QXJyUm93RGF0YUJ5SHRtbChib2R5RWxlLCBhcnJIZWFkKSB7XHJcbiAgICAgICAgY29uc3QgYXJyUm93ID0gYm9keUVsZS5xdWVyeVNlbGVjdG9yQWxsKCd0ci51aS1zdGF0ZS1oaWdobGlnaHQnKTtcclxuICAgICAgICBpZiAoIWFyclJvdy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYXJyUm93RGF0YSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyUm93Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGFyclJvd1tpXTtcclxuICAgICAgICAgICAgY29uc3QgYXJyVGQgPSByb3cucXVlcnlTZWxlY3RvckFsbCgndGQnKTtcclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRUZDtcclxuICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgYXJySGVhZC5mb3JFYWNoKGhlYWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFRkID0gYXJyVGRbaGVhZC5pbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRkLmlubmVyVGV4dCA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnB1c2godGhpcy5nZXRWYWx1ZUNoZWNrYm94Rm9ybWF0KGN1cnJlbnRUZCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wdXNoKGN1cnJlbnRUZC5pbm5lclRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGFyclJvd0RhdGEucHVzaChyb3dEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgO1xyXG5cclxuICAgICAgICByZXR1cm4gYXJyUm93RGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRWYWx1ZUNoZWNrYm94Rm9ybWF0KGRhdGEpIHtcclxuICAgICAgICBjb25zdCBjaGVja0JveCA9IGRhdGEucXVlcnlTZWxlY3RvcigncC1jaGVja2JveCcpO1xyXG4gICAgICAgIGlmIChjaGVja0JveCkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGEucXVlcnlTZWxlY3Rvcignc3Bhbi5waS1jaGVjaycpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnQ8OzJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnS2jDtG5nJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZpZXcocm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vblZpZXcuZW1pdChyb3dEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29weUxpbmsocm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vbkNvcHlMaW5rLmVtaXQocm93RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVkaXQocm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vbkVkaXQuZW1pdChyb3dEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlKHJvd0RhdGE6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25EZWxldGUuZW1pdChyb3dEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlTXV0aXBsZSgpIHtcclxuICAgICAgICB0aGlzLm9uRGVsZXRlTXVsdGlwbGUuZW1pdCh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb3B5TGlua011bHRpcGxlKCkge1xyXG4gICAgICAgIHRoaXMub25Db3B5TGlua011bHRpcGxlLmVtaXQodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U2hhcmVMaW5rRm9ybShsc3RJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5zaGFyZUxpbmtNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2hhcmVMaW5rTW9kZWwuZGF0YS5sc3RJdGVtID0gbHN0SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjcmVhdGVTaGFyZUxpbmsoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuY2hlY2tSZWFkeVRvVHJpbmhLeSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ8SQYW5nIHThuqNpIGThu68gbGnhu4d1IGRhbmggc8OhY2gsIGNo4budIG3hu5l0IGzDumMgcuG7k2kgdGjhu60gbOG6oWknKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgcm93RGF0YSA9IHRoaXMucm93RGF0YUN1cnJlbnQ7XHJcbiAgICAgICAgdGhpcy5zaG93U2hhcmVMaW5rRm9ybShbcm93RGF0YV0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNyZWF0ZVNoYXJlTGlua011bHRpcGxlKCkge1xyXG4gICAgICAgIHRoaXMuc2hvd1NoYXJlTGlua0Zvcm0odGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaG93QXR0YWNoZWRUYXNrKCkge1xyXG4gICAgICAgIHRoaXMuYXR0YWNoZWRUYXNrTW9kZWwuc2hvd0VkaXRGb3JtID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaG93Q29udGV4dE1lbnUoZXZ0LCByb3dEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5yb3dEYXRhQ3VycmVudCA9IHJvd0RhdGE7XHJcbiAgICAgICAgdGhpcy5idXR0b25Db250ZXh0cyA9IHRoaXMuZ2V0TWVudUJ1dHRvbkF1dGhvcml6ZWQoYXdhaXQgdGhpcy5tZW51QnV0dG9ucyhyb3dEYXRhKSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuZGlzYWJsZVNoYXJlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlQnV0dG9ucyA9IFtcclxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdDaGlhIHPhursnLCBpY29uOiAncGkgcGktbGluaycsIGNvbW1hbmQ6IHRoaXMuY3JlYXRlU2hhcmVMaW5rLmJpbmQodGhpcykgfSxcclxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEYW5oIHPDoWNoIGNoaWEgc+G6uycsIGljb246ICdwaSBwaS1saXN0JywgY29tbWFuZDogdGhpcy5zaG93TGlua1NoYXJpbmcuYmluZCh0aGlzKSB9LFxyXG4gICAgICAgICAgICAgICAgLy8geyBsYWJlbDogJ0Rhbmggc8OhY2ggbmjDrG4gdGjhuqV5JywgaWNvbjogJ3BpIHBpLWxpc3QnLCBjb21tYW5kOiB0aGlzLnNob3dMaXN0UGVybWlzc2lvbkJ5SXRlbS5iaW5kKHRoaXMpIH1cclxuICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgdGhpcy5idXR0b25Db250ZXh0cy5wdXNoKC4uLnNoYXJlQnV0dG9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNob3dXb3JrZmxvd0F0dGFjaCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdfX3Nob3dXb3JrZmxvd0F0dGFjaCcpO1xyXG4gICAgICAgIGlmIChzaG93V29ya2Zsb3dBdHRhY2ggPT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uQ29udGV4dHMucHVzaChcclxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEYW5oIHPDoWNoIGPDtG5nIHZp4buHYycsIGljb246ICdwaSBwaS1saXN0JywgY29tbWFuZDogdGhpcy5zaG93QXR0YWNoZWRUYXNrLmJpbmQodGhpcykgfSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuYnV0dG9uQ29udGV4dHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zaG93Q29udGV4dE1lbnUoZXZ0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnS2jDtG5nIGPDsyBow6BuaCDEkeG7mW5nIGto4bqjIGThu6VuZycpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1lbnVCdXR0b25BdXRob3JpemVkKG1lbnVCdXR0b25zOiBUbk1lbnVJdGVtW10pIHtcclxuICAgICAgICBjb25zdCBhdXRob3JpemVkQnV0dG9uczogVG5NZW51SXRlbVtdID0gW107XHJcbiAgICAgICAgY29uc3Qgc2VydmljZUNvZGVCeUJhc2UgPSB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UgIT0gbnVsbCA/IHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5zZXJ2aWNlQ29kZSA6ICcnO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBtZW51QnV0dG9ucykge1xyXG4gICAgICAgICAgICBpZiAoIWl0ZW0uYXV0aG9yaXphdGlvblBlcm1pc3Npb24pIHtcclxuICAgICAgICAgICAgICAgIGF1dGhvcml6ZWRCdXR0b25zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlQ29kZSA9IGl0ZW0uYXV0aG9yaXphdGlvblNlcnZpY2VDb2RlID8gaXRlbS5hdXRob3JpemF0aW9uU2VydmljZUNvZGUgOiBzZXJ2aWNlQ29kZUJ5QmFzZTtcclxuICAgICAgICAgICAgY29uc3QgYXV0aG9yaXplZCA9IHRoaXMuX3Blcm1pc3Npb25TZXJ2aWNlLmlzQXV0aG9yaXplZChzZXJ2aWNlQ29kZSwgaXRlbS5hdXRob3JpemF0aW9uUGVybWlzc2lvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmICghYXV0aG9yaXplZCkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXV0aG9yaXplZEJ1dHRvbnMucHVzaChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF1dGhvcml6ZWRCdXR0b25zO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUNoZWNrQWxsX0dyb3VwID0gKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWRBbGwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zID0gWy4uLnRoaXMubW9kZWwuZGF0YVNvdXJjZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja2VkQWxsID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRMYXN0SXRlbVNlbGVjdGVkKCk7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uX2NoZWNrZWQgPSB0aGlzLmNoZWNrZWRBbGw7XHJcbiAgICAgICAgICAgIHRoaXMucm93R3JvdXBDaGVja2VkW2l0ZW1bdGhpcy5fZ3JvdXBGaWVsZF1dID0gdGhpcy5jaGVja2VkQWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMub25DaGVja0FsbC5lbWl0KHRoaXMuY2hlY2tlZEFsbCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGhhbmRsZUNoZWNrUm93R3JvdXAgPSAocm93RGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwQ2hlY2tlZCA9IHRoaXMucm93R3JvdXBDaGVja2VkW3Jvd0RhdGFbdGhpcy5fZ3JvdXBGaWVsZF1dID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGFTb3VyY2VbaV1bdGhpcy5fZ3JvdXBGaWVsZF0gPT0gcm93RGF0YVt0aGlzLl9ncm91cEZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlW2ldLl9jaGVja2VkID0gZ3JvdXBDaGVja2VkO1xyXG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGZvdW5kKSBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGFTb3VyY2VbaV0uX2NoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5wdXNoKHRoaXMubW9kZWwuZGF0YVNvdXJjZVtpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRMYXN0SXRlbVNlbGVjdGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDaGVja2VkQWxsKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cCA9IChyb3dEYXRhLCB0ckVsZW1lbnQgPSBudWxsLCBmaXJlRXZlbnQgPSB0cnVlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFyb3dEYXRhLl9jaGVja2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5yb3dHcm91cENoZWNrZWRbcm93RGF0YVt0aGlzLl9ncm91cEZpZWxkXV0gPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMuZmluZEluZGV4KHAgPT4gcC5pZCA9PSByb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgY2hlY2tHcm91cCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5wdXNoKHJvd0RhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbSA9IHJvd0RhdGE7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubW9kZWwuZGF0YVNvdXJjZVtpXS5fY2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGFTb3VyY2VbaV1bdGhpcy5fZ3JvdXBGaWVsZF0gPT0gcm93RGF0YVt0aGlzLl9ncm91cEZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0dyb3VwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucm93R3JvdXBDaGVja2VkW3Jvd0RhdGFbdGhpcy5fZ3JvdXBGaWVsZF1dID0gY2hlY2tHcm91cDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRMYXN0SXRlbVNlbGVjdGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDaGVja2VkQWxsKCk7XHJcbiAgICAgICAgaWYgKGZpcmVFdmVudCkge1xyXG4gICAgICAgICAgICBpZiAoIXRyRWxlbWVudCkgdHJFbGVtZW50ID0gdGhpcy5nZXRUckJ5Um93RGF0YShyb3dEYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5fZW1pdFJvd1NlbGVjdCh0ckVsZW1lbnQsIHJvd0RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaGFuZGxlQ2hlY2tBbGwgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZEFsbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMgPSBbLi4udGhpcy5tb2RlbC5kYXRhU291cmNlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZWRBbGwgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRMYXN0SXRlbVNlbGVjdGVkKCk7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uX2NoZWNrZWQgPSB0aGlzLmNoZWNrZWRBbGwgPT09IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5vbkNoZWNrQWxsLmVtaXQodGhpcy5jaGVja2VkQWxsKTtcclxuICAgIH07XHJcblxyXG4gICAgaGFuZGxlQ2hlY2tSb3dEYXRhID0gKHJvd0RhdGEsIHRyRWxlbWVudCA9IG51bGwsIGZpcmVFdmVudCA9IHRydWUpID0+IHtcclxuICAgICAgICBpZiAoIXJvd0RhdGEuX2NoZWNrZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5maW5kSW5kZXgocCA9PiBwLmlkID09IHJvd0RhdGEuaWQpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghcm93RGF0YS5oaWRkZW5DaGVja0JveCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLnB1c2gocm93RGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbSA9IHJvd0RhdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0TGFzdEl0ZW1TZWxlY3RlZCgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hlY2tlZEFsbCgpO1xyXG4gICAgICAgIGlmICghdHJFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRyRWxlbWVudCA9IHRoaXMuZ2V0VHJCeVJvd0RhdGEocm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaXJlRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZW1pdFJvd1NlbGVjdCh0ckVsZW1lbnQsIHJvd0RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDaGVja2VkQWxsKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoID09IHRoaXMubW9kZWwuZGF0YVNvdXJjZS5sZW5ndGggJiYgdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja2VkQWxsID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja2VkQWxsID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZWRBbGwgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VsZWN0Um93KGRhdGFzOiBhbnlbXSA9IFtdKSB7XHJcbiAgICAgICAgaWYgKCFkYXRhcyB8fCBkYXRhcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuaGlkZGVuQ2hlY2tib3gpIHtcclxuICAgICAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBkYXRhc1tkYXRhcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgbGFzdEl0ZW0uX2NoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGVja1Jvd0RhdGFfR3JvdXAobGFzdEl0ZW0sIHRoaXMuZ2V0VHJCeVJvd0RhdGEobGFzdEl0ZW0pLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hlY2tSb3dEYXRhKGxhc3RJdGVtLCB0aGlzLmdldFRyQnlSb3dEYXRhKGxhc3RJdGVtKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLl9jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ncm91cEZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGVja1Jvd0RhdGFfR3JvdXAoZGF0YSwgdGhpcy5nZXRUckJ5Um93RGF0YShkYXRhKSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YShkYXRhLCB0aGlzLmdldFRyQnlSb3dEYXRhKGRhdGEpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNvcnQoZXZlbnQ6IGFueSwgX3RhYmxlOiBUYWJsZSkge1xyXG4gICAgICAgIHRoaXMuc29ydFdpdGhBcGkoZXZlbnQsIF90YWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzb3J0V2l0aEFwaShldmVudDogYW55LCBfdGFibGU6IFRhYmxlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLmxvYWRpbmcpIHtcclxuICAgICAgICAgICAgX3RhYmxlLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNvcnRIaXN0b3J5Lmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0RmllbGQgPSBldmVudC5maWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvcnREaXIgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc29ydEhpc3RvcnlbMF0uZmllbGQgPT0gZXZlbnQuZmllbGQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvcnRGaWVsZCA9IGV2ZW50LmZpZWxkO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvcnREaXIgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb3J0RGlyID0gLTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9zb3J0RGlyID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvcnREaXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29ydERpciA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQuZmllbGQgIT0gdGhpcy5zb3J0SGlzdG9yeVswXS5maWVsZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydEZpZWxkID0gZXZlbnQuZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0RGlyID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICAgICAgdGhpcy5zb3J0SGlzdG9yeS51bnNoaWZ0KHsgZmllbGQ6IHRoaXMuX3NvcnRGaWVsZCwgZGlyOiB0aGlzLl9zb3J0RGlyIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2Vzc0RhdGFTb3VyY2UoZGF0YVNvdXJjZSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tlZEFsbCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5yb3dHcm91cENoZWNrZWQgPSB7fTtcclxuICAgICAgICBpZiAoIWRhdGFTb3VyY2UpIHJldHVybjtcclxuICAgICAgICBkYXRhU291cmNlLmZvckVhY2goc291cmNlID0+IHtcclxuICAgICAgICAgICAgaWYgKHNvdXJjZS5pZCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5pZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNvdXJjZS5vYmpTdHlsZUNsYXNzID0ge307XHJcbiAgICAgICAgICAgIGlmICghc291cmNlLmNvbFNwYW4pIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5jb2xTcGFuID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFzb3VyY2Uucm93U3Bhbikge1xyXG4gICAgICAgICAgICAgICAgc291cmNlLnJvd1NwYW4gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5oaWRkZW4gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc291cmNlLmlzTmV3KSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2Uub2JqU3R5bGVDbGFzcy5pc05ldyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNvdXJjZS5pc0V4cGlyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2Uub2JqU3R5bGVDbGFzcy5leHBpcmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNvdXJjZS5jbGFzcykge1xyXG4gICAgICAgICAgICAgICAgc291cmNlLmNsYXNzLnNwbGl0KCcgJykuZmlsdGVyKHAgPT4gcCkuZm9yRWFjaChjbHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5vYmpTdHlsZUNsYXNzW2Nsc10gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc291cmNlLmJvb2ttYXJrU3R5bGUgPSB0aGlzLmdldEJvb2ttYXJrQ29sb3Ioc291cmNlLCB0aGlzLnNldHRpbmcuY29scyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtTGVuZ3RoLmZvckVhY2goX2NvbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSA8Q29sdW1uU2NoZW1hQmFzZT5fY29sO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzb3VyY2VbY29sLmZpZWxkXTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5zdWJzdHJpbmcgJiYgdmFsdWUubGVuZ3RoID4gY29sLm1heExlbmd0aERpc3BsYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdjogc2hvcnQgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VbYCR7Y29sLmZpZWxkfV9fc3ZgXSA9IGAke3ZhbHVlLnN1YnN0cmluZygwLCBjb2wubWF4TGVuZ3RoRGlzcGxheSl9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtV29yZC5mb3JFYWNoKF9jb2wgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gPENvbHVtblNjaGVtYUJhc2U+X2NvbDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlU2hvcnRXb3JkID0gdGhpcy5zdWJXb3JkKHNvdXJjZVtjb2wuZmllbGRdLCBjb2wubWF4V29yZERpc3BsYXkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlU2hvcnRXb3JkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3Y6IHNob3J0IHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlW2Ake2NvbC5maWVsZH1fX3N2YF0gPSBgJHt2YWx1ZVNob3J0V29yZH1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVJvd0dyb3VwTWV0YURhdGEoZGF0YVNvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN1YldvcmQodmFsdWU6IHN0cmluZywgd29yZENvdW50OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoIXZhbHVlIHx8ICF2YWx1ZS50cmltKSByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gLTEsIGJlZm9yZUNoYXIgPSAnYSc7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodmFsdWVbaV0gPT0gJycgJiYgYmVmb3JlQ2hhciAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgd29yZENvdW50LS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYmVmb3JlQ2hhciA9IHZhbHVlW2ldO1xyXG4gICAgICAgICAgICBpZiAod29yZENvdW50ID09IDApIHtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4KTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVTaG93RnVsbChyb3dEYXRhLCBmaWVsZCkge1xyXG4gICAgICAgIHJvd0RhdGFbZmllbGQgKyAnX19zaG93RnVsbCddID0gIXJvd0RhdGFbZmllbGQgKyAnX19zaG93RnVsbCddO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtZXJnZUNsYXNzT2JqKHNvdXJjZSwgb3RoZXJPYmogPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IHNvdXJjZS5vYmpTdHlsZUNsYXNzO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG90aGVyT2JqKSB7XHJcbiAgICAgICAgICAgIG9ialtrZXldID0gb3RoZXJPYmpba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29udGV4dFJvd0dyb3VwKHJvd0RhdGEpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByb3dEYXRhLFxyXG4gICAgICAgICAgICByb3dHcm91cE1ldGFkYXRhOiB0aGlzLnJvd0dyb3VwTWV0YWRhdGEsXHJcbiAgICAgICAgICAgIGdyb3VwQ29sOiB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4sXHJcbiAgICAgICAgICAgIGdyb3VwRmllbGQ6IHRoaXMuX2dyb3VwRmllbGQsXHJcbiAgICAgICAgICAgIGdyb3VwSW5DbGllbnQ6IHRoaXMuX2dyb3VwSW5DbGllbnRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250ZXh0Um93R3JvdXBSb290KHJvd0RhdGEsIGV4cGFuZGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4udGhpcy5nZXRDb250ZXh0Um93R3JvdXAocm93RGF0YSksXHJcbiAgICAgICAgICAgIGV4cGFuZGVkLFxyXG4gICAgICAgICAgICBoYW5kbGVDaGVja1Jvd0dyb3VwOiB0aGlzLmhhbmRsZUNoZWNrUm93R3JvdXAsXHJcbiAgICAgICAgICAgIGdldENvbFNwYW5Hcm91cDogdGhpcy5nZXRDb2xTcGFuR3JvdXAsXHJcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxyXG4gICAgICAgICAgICBjbGFzc1Jvd0dyb3VwOiB0aGlzLl9jbGFzc1Jvd0dyb3VwLFxyXG4gICAgICAgICAgICBpY29uVG9nZ2xlUm93R3JvdXA6IHRoaXMuaWNvblRvZ2dsZVJvd0dyb3VwXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29udGV4dENlbGwocm93RGF0YSwgcm93SW5kZXgsIGNvbCwgZXhwYW5kZWQsICR0aGlzKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY3J1ZExpc3Q6ICR0aGlzLFxyXG4gICAgICAgICAgICByb3dEYXRhLFxyXG4gICAgICAgICAgICByb3dJbmRleCxcclxuICAgICAgICAgICAgY29sLFxyXG4gICAgICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICBleHBhbmRlZCxcclxuICAgICAgICAgICAgaWNvblRvZ2dsZVJvd0RhdGE6IHRoaXMuaWNvblRvZ2dsZVJvd0RhdGFcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDbGFzc1Jvd0RhdGFPZkdyb3VwKHJvd0RhdGEpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpblNlbGVjdEl0ZW0ocm93RGF0YSkpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9ICcgdWktc3RhdGUtaGlnaGxpZ2h0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VwRmllbGQgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSAnIGlzLWNoaWxkLWdyb3VwJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJvd0RhdGEuY2xhc3MpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9ICcgJyArIHJvd0RhdGEuY2xhc3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQudHJpbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb250YWluU2VsZWN0SXRlbShpdGVtKSB7XHJcbiAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmZpbmRJbmRleCh4ID0+IHggJiYgeFt0aGlzLnNldHRpbmcuZW50aXR5S2V5XSA9PT0gaXRlbVt0aGlzLnNldHRpbmcuZW50aXR5S2V5XSkgPiAtMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsVG9wKCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zY3JvbGxiYXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsYmFyLnNjcm9sbFRvVG9wKDAsIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsVG9Cb3R0b20oKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGJhcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxiYXIuc2Nyb2xsVG9Cb3R0b20oMCwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25OZXh0KGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgPSB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSArIDE7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25QcmV2KGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlID4gMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25PbGRlc3QoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IE1hdGguY2VpbCh0aGlzLm1vZGVsLnRvdGFsIC8gdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2VTaXplKTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkxhdGVzdChldmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlID0gMTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0VtcHR5VG9vbGJhcihlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IG5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLml0ZW0oaSk7XHJcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSA4ICYmIG5vZGVzLml0ZW0oaSkudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0VtcHR5RnVuY3Rpb25CdXR0b25zKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZXMuaXRlbShpKTtcclxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDggJiYgbm9kZXMuaXRlbShpKS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29tbW9uU2VydmljZS5maW5kVGVtcGxhdGVGcm9tTGlzdCh0aGlzLmNoaWxkcmVuLCB0ZW1wbGF0ZU5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlW3RlbXBsYXRlTmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlW3RlbXBsYXRlTmFtZV0gPSB0aGlzLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVt0ZW1wbGF0ZU5hbWVdICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFRlbXBsYXRlKHRlbXBsYXRlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVbdGVtcGxhdGVOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVbdGVtcGxhdGVOYW1lXSA9IHRoaXMuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlW3RlbXBsYXRlTmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVJvd0dyb3VwTWV0YURhdGEoZGF0YVNvdXJjZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5yb3dHcm91cE1ldGFkYXRhID0ge307XHJcbiAgICAgICAgbGV0IGluZGV4R3JvdXAgPSAwO1xyXG4gICAgICAgIGNvbnN0IGdyb3VwRmllbGROYW1lOiBzdHJpbmcgPSB0aGlzLl9ncm91cEZpZWxkO1xyXG4gICAgICAgIC8vIFThuqFvIGLhu6thIDEgZ3JvdXAgdmFsdWUgYmVmb3JlXHJcbiAgICAgICAgbGV0IHByZXZpb3VzR3JvdXBWYWx1ZSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xyXG4gICAgICAgIGlmIChncm91cEZpZWxkTmFtZSAmJiBncm91cEZpZWxkTmFtZSAhPSAnJykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFTb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSBkYXRhU291cmNlW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBWYWx1ZSA9IHJvd0RhdGFbZ3JvdXBGaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwVmFsdWUgIT09IHByZXZpb3VzR3JvdXBWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93R3JvdXBNZXRhZGF0YVtncm91cFZhbHVlXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGksIGluZGV4R3JvdXA6IGluZGV4R3JvdXArKywgc2l6ZTogMSwgaXRlbVJvb3Q6IHJvd0RhdGEsIGl0ZW1zOiBbcm93RGF0YV1cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZXhwYW5kZWRSb3dLZXlzW2dyb3VwVmFsdWVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0dyb3VwVmFsdWUgPSBncm91cFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbUdyb3VwID0gdGhpcy5yb3dHcm91cE1ldGFkYXRhW2dyb3VwVmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1Hcm91cC5zaXplKys7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbUdyb3VwLml0ZW1zLnB1c2gocm93RGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByb3dEYXRhW3RoaXMuZmllbGRPcmRlcl0gPSB0aGlzLnJvd0dyb3VwTWV0YWRhdGFbZ3JvdXBWYWx1ZV0uc2l6ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd1NldHRpbmdzKCkge1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5ncyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2F2ZUNvbG9yU2V0dGluZ3MoZGF0YSkge1xyXG4gICAgICAgIGlmIChkYXRhLmNvbG9yRmlsdGVyVGFibGUpIHtcclxuICAgICAgICAgICAgY29uc3QgY2xvbmVBcnIgPSBkYXRhLmNvbG9yRmlsdGVyVGFibGUuc2xpY2UoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNsb25lQXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVBcnJbaV0uZmlsdGVyVmFsdWUgPT0gJycgfHwgY2xvbmVBcnJbaV0uZmlsdGVyVmFsdWUgPT0gbnVsbCB8fCBjbG9uZUFycltpXS5maWx0ZXJWYWx1ZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbG9yRmlsdGVyVGFibGUuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJGaWVsZCA9IGRhdGEuY29sb3JGaWx0ZXJGaWVsZDtcclxuICAgICAgICB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJUYWJsZSA9IGRhdGEuY29sb3JGaWx0ZXJUYWJsZTtcclxuICAgICAgICB0aGlzLl9zaG93U2V0dGluZ3NSb3dDb2xvciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2FjaGVDb2xvclNldHRpbmcoKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yU2V0dGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNhdmVTZXR0aW5ncyhldmVudCkge1xyXG4gICAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5kZXRhaWxzID0gZXZlbnQuZGV0YWlscztcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydEZpZWxkID0gZXZlbnQuc29ydEZpZWxkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydEZpZWxkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnREaXIgPSBldmVudC5zb3J0RGlyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydERpciA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZCA9IGV2ZW50Lmdyb3VwRmllbGQ7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwSW5DbGllbnQgPSBldmVudC5ncm91cEluQ2xpZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwRmllbGQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5ncm91cENvbHVtbiA9IHRoaXMuc2V0dGluZy5jb2xzLmZpbmQocCA9PiBwLmZpZWxkID09IGV2ZW50Lmdyb3VwRmllbGQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5ncm91cENvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5ncm91cENvbHVtbi52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uLmZvcmNlR2V0RGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4gPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNvbHVtblNldHRpbmcoKTtcclxuICAgICAgICAgICAgdGhpcy5leHRlbmRDb2x1bW5zKHRoaXMuc2V0dGluZy5jb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtYXRDb2x1bW5zKHRoaXMuc2V0dGluZy5jb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBseUNvbHVtblNldHRpbmcoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5ncyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkRlbGV0ZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5ncyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nID0gbmV3IENvbHVtblNldHRpbmcoKTtcclxuICAgICAgICB0aGlzLmRlbGV0ZUNvbHVtblNldHRpbmcoKTtcclxuICAgICAgICB0aGlzLmV4dGVuZENvbHVtbnModGhpcy5zZXR0aW5nLmNvbHMpO1xyXG4gICAgICAgIHRoaXMuZm9ybWF0Q29sdW1ucyh0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgdGhpcy5hcHBseUNvbHVtblNldHRpbmcoKTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHlDb2x1bW5TZXR0aW5nKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEZpZWxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5ncm91cENvbHVtbiA9IHRoaXMuc2V0dGluZy5jb2xzLmZpbmQocCA9PiBwLmZpZWxkID09IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwRmllbGQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4uZm9yY2VHZXREYXRhID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uLnJhd0NvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VwRmllbGQgPSB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4ucmF3Q29sdW1uLmZpZWxkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3JvdXBGaWVsZCA9IHRoaXMuc2V0dGluZy5ncm91cENvbHVtbi5maWVsZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VwRmllbGQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VwSW5DbGllbnQgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEluQ2xpZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZ3JvdXBGaWVsZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zb3J0RmllbGQgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQ7XHJcbiAgICAgICAgdGhpcy5fc29ydERpciA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnREaXI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsICYmIHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZyAmJiB0aGlzLl9zb3J0RmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5zb3J0SGlzdG9yeSA9IFt7IGZpZWxkOiB0aGlzLl9zb3J0RmllbGQsIGRpcjogdGhpcy5fc29ydERpciA/IHRoaXMuX3NvcnREaXIgOiAwIH1dO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zb3J0SGlzdG9yeSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENlbGxDbGFzc0hlYWRlcihjb2wpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgaWYgKGNvbC5jZWxsQ2xhc3MpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IGNvbC5jZWxsQ2xhc3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY29sLnNvcnQpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9ICcgTm9Tb3J0Q29sdW1uJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbC5maWVsZCA9PSB0aGlzLl9zb3J0RmllbGQpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9ICcgcC1zb3J0YWJsZS1jb2x1bW4nO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc29ydERpciAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJyBwLWhpZ2hsaWdodCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb2x1bW5TdHlsZShjb2w6IGFueSwgZm9ySGVhZGVyID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBzdHlsZTogYW55ID0ge307XHJcbiAgICAgICAgaWYgKGNvbC5maWVsZCA9PSAnbWV0YWRhdGFTdGF0dXMnKSB7XHJcbiAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAnY2VudGVyJztcclxuICAgICAgICAgICAgY29sLndpZHRoID0gJzhlbSc7XHJcbiAgICAgICAgICAgIHJldHVybiBzdHlsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb2wudGV4dEFsaWduID09IFRleHRBbGlnbi5MZWZ0KSB7XHJcbiAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAnbGVmdCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbC50ZXh0QWxpZ24gPT0gVGV4dEFsaWduLkNlbnRlcikge1xyXG4gICAgICAgICAgICBzdHlsZVsndGV4dC1hbGlnbiddID0gJ2NlbnRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbC50ZXh0QWxpZ24gPT0gVGV4dEFsaWduLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAncmlnaHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFsaWduQ2VudGVyQ29sdW1uKGNvbCkpIHtcclxuICAgICAgICAgICAgc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdjZW50ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFsaWduUmlnaHRDb2x1bW4oY29sKSkge1xyXG4gICAgICAgICAgICBzdHlsZVsndGV4dC1hbGlnbiddID0gJ3JpZ2h0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChmb3JIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAnY2VudGVyJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAnbGVmdCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Qm9va21hcmtDb2xvcihyb3dEYXRhLCBjb2x1bW5zKSB7XHJcbiAgICAgICAgY29uc3QgcjogYW55ID0geyBkaXNwbGF5OiAnbm9uZScgfTtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyRmllbGQgJiYgdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyVGFibGUpIHtcclxuICAgICAgICAgICAgbGV0IGNvbDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjIGluIGNvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zW2NdLmZpZWxkID09IHRoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sID0gY29sdW1uc1tjXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGZvckRhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IGZvck51bWJlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgZm9yQm9vbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSByb3dEYXRhW3RoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkXTtcclxuICAgICAgICAgICAgaWYgKGNvbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kYXRlIHx8IGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kYXRldGltZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jb252ZXJ0VG9EYXRlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3JEYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5pbnQgfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRlY2ltYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yTnVtYmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5ib29sZWFuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoL3RydWUvaSkudGVzdCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yQm9vbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9jb2xvckZpbHRlclRhYmxlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fY29sb3JGaWx0ZXJUYWJsZVtpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVUeXBlID0gaXRlbVswXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gaXRlbVs1XTtcclxuICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJWYWx1ZTogYW55ID0gaXRlbVsxXTtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVmFsdWUgPSBpdGVtWzJdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZSA9PSBudWxsKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvck51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlID0gaXRlbVszXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oZmlsdGVyVmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvckJvb2wpIGZpbHRlclZhbHVlID0gaXRlbVs0XTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcGFyZVR5cGUgPT0gJ3JlZ2V4Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGZpbHRlclZhbHVlLCAnaScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubWF0Y2gocmUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmJhY2tncm91bmQgPSB0aGlzLmJ1aWxkR3JhZGllbnRDb2xvcihjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wYXJlVHlwZSA9PSAnZXF1YWxzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmJhY2tncm91bmQgPSB0aGlzLmJ1aWxkR3JhZGllbnRDb2xvcihjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29tcGFyZVR5cGUgPT0gJ25vdEVxdWFscycpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gZmlsdGVyVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5iYWNrZ3JvdW5kID0gdGhpcy5idWlsZEdyYWRpZW50Q29sb3IoY29sb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBhcmVUeXBlID09ICdjb250YWlucycpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGZpbHRlclZhbHVlLCAnaScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5tYXRjaChyZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5iYWNrZ3JvdW5kID0gdGhpcy5idWlsZEdyYWRpZW50Q29sb3IoY29sb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBhcmVUeXBlID09ICdub3RDb250YWlucycpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGZpbHRlclZhbHVlLCAnaScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUubWF0Y2gocmUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuYmFja2dyb3VuZCA9IHRoaXMuYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wYXJlVHlwZSA9PSAnZ3JlYXRlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiBmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmJhY2tncm91bmQgPSB0aGlzLmJ1aWxkR3JhZGllbnRDb2xvcihjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29tcGFyZVR5cGUgPT0gJ2xpdHRlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmJhY2tncm91bmQgPSB0aGlzLmJ1aWxkR3JhZGllbnRDb2xvcihjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29udmVydFRvRGF0ZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ3tub3d9JykgcmV0dXJuIERhdGUoKTtcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3snKSAmJiB2YWx1ZS5lbmRzV2l0aCgnZH0nKSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZS5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ2R9JywgJycpKTtcclxuICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgneycpICYmIHZhbHVlLmVuZHNXaXRoKCdofScpKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlLnJlcGxhY2UoJ3snLCAnJykucmVwbGFjZSgnaH0nLCAnJykpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBkYXRlLnNldEhvdXJzKGRhdGUuZ2V0SG91cnMoKSArIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3snKSAmJiB2YWx1ZS5lbmRzV2l0aCgnbX0nKSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZS5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ219JywgJycpKTtcclxuICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRNaW51dGVzKGRhdGUuZ2V0TWludXRlcygpICsgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignLycpID4gLTEpIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHBhcnRzWzJdICsgJy0nICsgcGFydHNbMV0gKyAnLScgKyBwYXJ0c1swXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgIGlmICghaXNOYU4oZGF0ZS5nZXREYXRlKCkpKSByZXR1cm4gZGF0ZTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ1aWxkR3JhZGllbnRDb2xvcihjb2xvcikge1xyXG4gICAgICAgIHJldHVybiBgbGluZWFyLWdyYWRpZW50KDkwZGVnLCAke2NvbG9yfSAwJSwgJHtjb2xvcn00ZCAzNSUsICR7Y29sb3J9MWEgNjAlLCB0cmFuc3BhcmVudCAxMDAlKWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhbGlnbkNlbnRlckNvbHVtbihjb2wpIHtcclxuICAgICAgICByZXR1cm4gY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRhdGV0aW1lIHx8IGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kYXRlIHx8IGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5ib29sZWFuIHx8IGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5lbnVtO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWxpZ25SaWdodENvbHVtbihjb2wpIHtcclxuICAgICAgICByZXR1cm4gY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmludCB8fCBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZGVjaW1hbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29sU3Bhbkdyb3VwID0gKG51bU9mQ29sQ3VzdG9tOiBudW1iZXIgPSAwKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZy5jb2xzLmZpbHRlcih4ID0+IHgudmlzaWJsZSA9PT0gbnVsbCB8fCB4LnZpc2libGUgPT09IHVuZGVmaW5lZCB8fCB4LnZpc2libGUgPT09IHRydWUpLmxlbmd0aFxyXG4gICAgICAgICAgICArICh0aGlzLnNldHRpbmcuaGlkZGVuT3JkZXJDb2x1bW4gPyAwIDogMSlcclxuICAgICAgICAgICAgKyAodGhpcy5zZXR0aW5nLmhpZGRlbkZ1bmN0aW9uQ29sdW1uID8gMCA6IDEpXHJcbiAgICAgICAgICAgIC0gbnVtT2ZDb2xDdXN0b207XHJcbiAgICB9O1xyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlS2V5cHJlc3NDb250cm9sKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQgJiYgdGhpcy5jb250ZXh0LnJvb3QuZGF0YS5saXN0UXVldWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RRdWV1ZSA9IHRoaXMuY29udGV4dC5yb290LmRhdGEubGlzdFF1ZXVlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0UXVldWUuaW5kZXhPZih0aGlzKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdFF1ZXVlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMudGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2FibGVNdWx0aXBsZURlbGV0ZSgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVEZWxldGUoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZU11bHRpcGxlQ29weUxpbmsoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlQ29weUxpbmsoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZUVkaXQocm93RGF0YSkge1xyXG4gICAgICAgIGlmIChyb3dEYXRhLl9fZGlzYWJsZUVkaXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmhpZGRlbkVkaXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyb3dEYXRhWydtZXRhZGF0YVN0YXR1cyddICYmIHJvd0RhdGFbJ21ldGFkYXRhU3RhdHVzJ10gIT0gJzAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2FibGVDb3B5TGluayhyb3dEYXRhKSB7XHJcbiAgICAgICAgaWYgKHJvd0RhdGEuX19kaXNhYmxlQ29weUxpbmspIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmhpZGRlbkNvcHlMaW5rKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocm93RGF0YVsnbWV0YWRhdGFTdGF0dXMnXSAmJiByb3dEYXRhWydtZXRhZGF0YVN0YXR1cyddICE9ICcwJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNhYmxlRGVsZXRlKHJvd0RhdGEpIHtcclxuICAgICAgICBpZiAocm93RGF0YS5fX2Rpc2FibGVEZWxldGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmhpZGRlbkRlbGV0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJvd0RhdGFbJ21ldGFkYXRhU3RhdHVzJ10gJiYgcm93RGF0YVsnbWV0YWRhdGFTdGF0dXMnXSAhPSAnMCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd0hpc3Rvcnkocm93RGF0YSkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5zaG93SGlzdG9yeSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmhpc3RvcnkgPSByb3dEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93TGlzdFZlcnNpb24ocm93RGF0YSkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy52ZXJzaW9uTW9kZWwuc2hvd0VkaXRGb3JtID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldHRpbmcudmVyc2lvbk1vZGVsLml0ZW1EYXRhID0gcm93RGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFdpZHRoRnVuY3Rpb24odGFibGUpIHtcclxuICAgICAgICBpZiAodGhpcy53aWR0aEZ1bmN0aW9uQ29sdW1uKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB3aWR0aEluUGl4ZWwgPSB0aGlzLl9kZWZhdWx0V2l0aEZ1bmN0aW9uQ29sdW1uO1xyXG4gICAgICAgIGNvbnN0IHRkID0gdGFibGUuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0ZFtjbGFzcyo9XCJjb2x1bW4tZnVuY3Rpb25cIl0nKTtcclxuICAgICAgICBpZiAodGQpIHtcclxuICAgICAgICAgICAgY29uc3QgZW1Ub1BpeGNlbCA9IHRoaXMuZ2V0Rm9udFNpemVJblBpeGVsKHRkKTtcclxuICAgICAgICAgICAgY29uc3QgYnV0dG9ucyA9IHRkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKTtcclxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBidXR0b25zLmxlbmd0aCAqIDIuNDsgLy8gYnV0dG9uIHdpZHRoOiAyLjRyZW1cclxuICAgICAgICAgICAgY29uc3QgdG1wV2lkdGhJblBpeGVsID0gd2lkdGggKiBlbVRvUGl4Y2VsICsgNjsgLy8gNiBsYSB0b25nIHBhZGRpbmcgbGVmdCwgcmlnaHQgY3VhIHRoXHJcbiAgICAgICAgICAgIGlmICh3aWR0aEluUGl4ZWwgPCB0bXBXaWR0aEluUGl4ZWwpIHtcclxuICAgICAgICAgICAgICAgIHdpZHRoSW5QaXhlbCA9IHRtcFdpZHRoSW5QaXhlbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGggPSB0YWJsZS5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RoW2NsYXNzKj1cInNldHRpbmctY2VsbFwiXScpO1xyXG4gICAgICAgIGlmICh0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbVRvUGl4Y2VsID0gdGhpcy5nZXRGb250U2l6ZUluUGl4ZWwodGgpO1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b25zID0gdGguZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGJ1dHRvbnMubGVuZ3RoICogMi40IC8gMC44NTsgLy8gYnV0dG9uIHdpZHRoOiAyLjRyZW0sIGZvbnQtc2l6ZSB0aCAwLjg1cmVtXHJcbiAgICAgICAgICAgIGNvbnN0IHRtcFdpZHRoSW5QaXhlbCA9IHdpZHRoICogZW1Ub1BpeGNlbCArIDY7IC8vIDYgbGEgdG9uZyBwYWRkaW5nIGxlZnQsIHJpZ2h0IGN1YSB0aFxyXG4gICAgICAgICAgICBpZiAod2lkdGhJblBpeGVsIDwgdG1wV2lkdGhJblBpeGVsKSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aEluUGl4ZWwgPSB0bXBXaWR0aEluUGl4ZWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3dpZHRoRnVuY3Rpb25Db2x1bW4gPSBgJHt3aWR0aEluUGl4ZWx9cHggYDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEZvbnRTaXplSW5QaXhlbChlbCkge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIoZ2V0Q29tcHV0ZWRTdHlsZShlbCwgJycpLmZvbnRTaXplLm1hdGNoKC8oKFxcZHwuKSspcHgvKVsxXSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcHJvY2Vzc0Jhc2VEYXRhKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucHJlUHJvY2Vzc0RhdGEodGhpcy5tb2RlbC5kYXRhU291cmNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHByZVByb2Nlc3NEYXRhKGRhdGFTb3VyY2UpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbEhhc1BpcGUgPSB0aGlzLnNldHRpbmcuY29scy5maWx0ZXIoeCA9PiB4LnBpcGUpO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGNvbEhhc1BpcGUpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGFTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKDxQaXBlVHJhbnNmb3JtPmNvbC5waXBlLCBjb2wuYXN5bmNQaXBlLCBpdGVtW2NvbC5maWVsZF0pLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1bYHBpcGVfXyR7Y29sLmZpZWxkfSBgXSA9IHJzO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyB0cmFuc2Zvcm0ocGlwZTogUGlwZVRyYW5zZm9ybSwgYXN5bmNQaXBlOiBib29sZWFuLCB2YWx1ZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVkVHJhbnNmb3Jtc1t2YWx1ZV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkVHJhbnNmb3Jtc1t2YWx1ZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYXN5bmNQaXBlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGF3YWl0IHBpcGUudHJhbnNmb3JtKHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZWRUcmFuc2Zvcm1zW3ZhbHVlXSA9IHZhbDtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHBpcGUudHJhbnNmb3JtKHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZWRUcmFuc2Zvcm1zW3ZhbHVlXSA9IHZhbDtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVJvd09yZGVyZWQoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5vblJlb3JkZXJlZC5lbWl0KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dTZXR0aW5nUm93Q29sb3IoKSB7XHJcbiAgICAgICAgdGhpcy5fc2hvd1NldHRpbmdzUm93Q29sb3IgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBidWlsZEZpbHRlckNvbHVtbihjb2xzOiBDb2x1bW5TY2hlbWFCYXNlW10pIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZUZpbHRlciA9IHRoaXMudGVtcGxhdGVGaWx0ZXI7XHJcbiAgICAgICAgY29scy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2wuY29udHJvbFR5cGUgPT0gQ29udHJvbFR5cGUuZHJvcGRvd24pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2wuYmFzZVNlcnZpY2UgfHwgKGNvbC5kYXRhU291cmNlICYmIGNvbC5kYXRhU291cmNlLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5pc0FycmF5RmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGaWx0ZXIucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdldEZpZWxkRmlsdGVyKGNvbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBcnJheUZpZWxkOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGaWx0ZXIucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdldEZpZWxkRmlsdGVyKGNvbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkOiBjb2wuZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyU2NoZW1hLmRyb3Bkb3duW2NvbC5maWVsZF0gPSBuZXcgRHJvcGRvd25Db250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29sLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbzogJ2JvZHknLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogYENo4buNbiAke2NvbC5sYWJlbH1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE9uSW5pdDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJMb2FkOiBjb2wuaXNTZXJ2ZXJMb2FkXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoYENoxrBhIGPhuqV1IGjDrG5oIGJhc2VTZXJ2aWNlIGhv4bq3YyBkYXRhU291cmNlIGNobyBj4buZdCAke2NvbC5maWVsZH06ICR7Y29sLmxhYmVsfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5pbnQgfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRlY2ltYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpbHRlci5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdldEZpZWxkRmlsdGVyKGNvbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IuZ3JlYXRlclRoYW5FcXVhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJGaWVsZDogMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogdGhpcy5nZXRGaWVsZEZpbHRlcihjb2wpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmxvd2VyVGhhbkVxdWFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkZpZWxkOiAxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kYXRlIHx8IGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kYXRldGltZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRmlsdGVyLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHRoaXMuZ2V0RmllbGRGaWx0ZXIoY29sKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkZpZWxkOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY0dldFZhbHVlOiBpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGFkZERheShpdGVtLCAxLCAtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdldEZpZWxkRmlsdGVyKGNvbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IubG93ZXJUaGFuRXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRmllbGQ6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jR2V0VmFsdWU6IGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpICsgMSwgMCwgMCwgLTEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuYm9vbGVhbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRmlsdGVyLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHRoaXMuZ2V0RmllbGRGaWx0ZXIoY29sKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5pbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkOiBjb2wuZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGaWx0ZXIucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogdGhpcy5nZXRGaWVsZEZpbHRlcihjb2wpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmNvbnRhaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWVsZDogY29sLmZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0RmllbGRGaWx0ZXIoY29sKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbC5maWVsZEZpbHRlciA/IGNvbC5maWVsZEZpbHRlciA6IGNvbC5maWVsZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29udGV4dEN1c3RvbUZpbHRlcigpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdEZpbHRlcihkZWZhdWx0RmlsdGVyKSB7XHJcbiAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXIpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdEZpbHRlcikuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhW2tleV0gPSBkZWZhdWx0RmlsdGVyW2tleV07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcl9jb2x1bW4gPSB0aGlzLl9jcnVkU2VydmljZS5nZXRGaWx0ZXJGcm9tVGVtcGxhdGUodGhpcy50ZW1wbGF0ZUZpbHRlciwgdGhpcy5nZXRNaW5pbWl6ZURhdGEodGhpcy5maWx0ZXJEYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNlYXJjaCA9IChub2RlPykgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICB0aGlzLmhhbmRsZUZpbHRlckJveEZvY3VzKG5vZGUpO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyX2NvbHVtbiA9IHRoaXMuX2NydWRTZXJ2aWNlLmdldEZpbHRlckZyb21UZW1wbGF0ZSh0aGlzLnRlbXBsYXRlRmlsdGVyLCB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLmZpbHRlckRhdGEpKTtcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IDE7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgZ2V0TWluaW1pemVEYXRhKG1vZGVsKSB7XHJcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcclxuICAgICAgICAgICAgaWYgKG1vZGVsLl9kcm9wZG93bnZhbHVlICE9IG51bGwgJiYgbW9kZWwuX2Ryb3Bkb3dudmFsdWUgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbbW9kZWwuX2Ryb3Bkb3dudmFsdWVdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9ICdfc3RhdHVzJyAmJiBrZXkgIT0gJ19lcnJvcnMnICYmIGtleSAhPSAnX3NvdXJjZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKG1vZGVsW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSBkYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheShtb2RlbCkpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJyID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2godGhpcy5nZXRNaW5pbWl6ZURhdGEoaXRlbSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG1vZGVsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1vZGVsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25DbGVhclNlYXJjaChub2RlLCBmaWVsZCkge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJEYXRhW2ZpZWxkXSAhPSBudWxsICYmIHRoaXMuZmlsdGVyRGF0YVtmaWVsZF0gIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YVtmaWVsZF0gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoKG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWx0ZXJCb3hGb2N1cyhub2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ2xlYXJOdW1iZXJTZWFyY2gobm9kZSwgY29udHJvbCkge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5jbGVhcigpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBubyBuZWVkIGNsZWFyIGRhdGEgYmVjYXVzZSBpdCdzIDIgd2F5cyBiaW5kaW5nXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VhcmNoKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWx0ZXJCb3hGb2N1cyhub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25DbGVhckRhdGVTZWFyY2gobm9kZSwgY29udHJvbCwgZmllbGQpIHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5sb2FkaW5nKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wuY2xlYXIoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gbmVlZCBjbGVhciBkYXRhIGJlY2F1c2Ugbm90IDIgd2F5cyBiaW5kaW5nXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckRhdGFbZmllbGRdID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWFyY2gobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUZpbHRlckJveEZvY3VzKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNoYW5nZURhdGVUaW1lKGV2dCwgZmllbGQpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckRhdGFbZmllbGRdID0gZXZ0LnZhbHVlO1xyXG4gICAgICAgIHRoaXMub25TZWFyY2goKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25DaGFuZ2VCb29sZWFuKGV2dCwgZmllbGQpIHtcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJEYXRhW2ZpZWxkXS5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlckRhdGFbZmllbGRdLnNwbGljZSgwLCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vblNlYXJjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dDaGVja0JveEZpbHRlck1lbnUoZXZ0LCBmaWVsZCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZpZWxkRmlsdGVyID0gZmllbGQ7XHJcbiAgICAgICAgdGhpcy5idXR0b25Db250ZXh0cyA9IFsuLi50aGlzLmNoZWNrQm94Q29udGV4dE1lbnVdO1xyXG4gICAgICAgIHRoaXMuX3Nob3dDb250ZXh0TWVudShldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaGFuZ2VGaWx0ZXJCb29sZWFuKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YVt0aGlzLmN1cnJlbnRGaWVsZEZpbHRlcl0gPSBbdmFsdWVdO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQm94Q29udGV4dE1lbnUuZm9yRWFjaChtZW51ID0+IG1lbnUuc3R5bGVDbGFzcyA9IG51bGwpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tCb3hDb250ZXh0TWVudVswXS5zdHlsZUNsYXNzID0gJ2FjdGl2ZSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQm94Q29udGV4dE1lbnVbMV0uc3R5bGVDbGFzcyA9ICdhY3RpdmUnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlckRhdGFbdGhpcy5jdXJyZW50RmllbGRGaWx0ZXJdID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vblNlYXJjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVGaWx0ZXJCb3hGb2N1cyhub2RlKSB7XHJcbiAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlRWw6IGFueSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluU2FtZUJveCA9IHRoaXMuY2hlY2tJbk5vZGUoYWN0aXZlRWwsIG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpblNhbWVCb3ggfHwgKGFjdGl2ZUVsICYmIGFjdGl2ZUVsLm5vZGVOYW1lICE9ICdJTlBVVCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0KSBpbnB1dC5zZWxlY3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluU2FtZUJveCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUVsLnNlbGVjdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25TaG93RmlsdGVyRHJvcGRvd25QYW5lbChldmVudCkge1xyXG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93biA9IGV2ZW50LmNvbXBvbmVudC5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNlbGxIZWFkZXJGaWx0ZXIgPSBkcm9wZG93bi5jbG9zZXN0KCd0aCcpO1xyXG5cclxuICAgICAgICAvLyB0aGVtIGNsYXNzIGZvY3VzLXdpdGhpbiBkZSBkcm9wZG93biBpbnB1dCBsdWMgZm9jdXMga2hvbmcgYmkgZGUgYm9pIGNhYyBzdGlja3kgY29sdW1uXHJcbiAgICAgICAgY2VsbEhlYWRlckZpbHRlciAmJiBjZWxsSGVhZGVyRmlsdGVyLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzLXdpdGhpbicpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSGlkZUZpbHRlckRyb3Bkb3duUGFuZWwoZXZlbnQpIHtcclxuICAgICAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZHJvcGRvd24gPSBldmVudC5jb21wb25lbnQuZWwubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjZWxsSGVhZGVyRmlsdGVyID0gZHJvcGRvd24uY2xvc2VzdCgndGgnKTtcclxuICAgICAgICBjZWxsSGVhZGVyRmlsdGVyICYmIGNlbGxIZWFkZXJGaWx0ZXIuY2xhc3NMaXN0LnJlbW92ZSgnZm9jdXMtd2l0aGluJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRGaWx0ZXJCb3hGb2N1cyhub2RlKSB7XHJcbiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUub2Zmc2V0V2lkdGggPCAyNTApIHtcclxuICAgICAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnc2hvcnQtZmlsdGVyLWJveCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdzaG9ydC1maWx0ZXItYm94Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja0luTm9kZShjaGlsZCwgcGFyZW50KSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0gY2hpbGQ7XHJcbiAgICAgICAgd2hpbGUgKHN0YXJ0ICYmIHN0YXJ0LnBhcmVudE5vZGUgIT0gcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzdGFydCAhPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzYXZlUGFnZVNpemUoKSB7XHJcbiAgICAgICAgdGhpcy5zYXZlUGFnZVNldHRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlVGFibGVSZW5kZXJlZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc3RvcENhbGN1bGF0aW5nRnVuY3Rpb25Db2x1bW5XaWR0aCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50YWJsZSkgdGhpcy5nZXRXaWR0aEZ1bmN0aW9uKHRoaXMudGFibGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdG9wQ2FsY3VsYXRpbmdGdW5jdGlvbkNvbHVtbldpZHRoID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgJHRoRmlyc3QgPSB0aGlzLnRhYmxlLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQnKTtcclxuICAgICAgICBjb25zdCBvZmZzZXRUb3AgPSAkdGhGaXJzdC5vZmZzZXRUb3A7XHJcbiAgICAgICAgY29uc3QgJHRocyA9IHRoaXMudGFibGUuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0aGVhZCB0cjpub3QoOmZpcnN0LWNoaWxkKSB0aCcpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgJHRocy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICAkdGhzW2ldLnN0eWxlLnRvcCA9IGAkeyR0aHNbaV0ub2Zmc2V0VG9wIC0gb2Zmc2V0VG9wfXB4YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2VsZWN0IGzhuqFpIGl0ZW0gY3Xhu5FpIGPDuW5nIMSRxrDhu6NjIHNlbGVjdCB0csaw4bubYyDEkcOzXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5yZVNlbGVjdExhc3RJdGVtKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbUxhc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICR0ciA9IHRoaXMuZ2V0VHJCeVJvd0RhdGEodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1MYXN0KTtcclxuICAgICAgICAgICAgICAgIGlmICgkdHIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUxhc3QgPSB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbUxhc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgJHRyLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vblJlbG9hZGVkLmVtaXQodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRUckJ5Um93RGF0YShyb3dEYXRhKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGFibGUpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1vZGVsLmRhdGFTb3VyY2UuZmluZEluZGV4KHAgPT4gcC5pZCA9PSByb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRyID0gdGhpcy50YWJsZS5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYHRib2R5IHRyW3Jvd0luZGV4PVwiJHtpbmRleH1cIl1gKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2hvd1NldHRpbmdzUGVybWlzc2lvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5jcmVhdGluZ1NlYXJjaEluZm8pIHJldHVybjtcclxuICAgICAgICB0aGlzLl9zaG93U2V0dGluZ3NQZXJtaXNzaW9uID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZVNlYXJjaFNjaGVtYSgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNvbHMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdC4bqhbiBjaMawYSBj4bqldSBow6xuaCBj4buZdCBjaG8gZGFuaCBzw6FjaCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNyZWF0aW5nU2VhcmNoSW5mbyA9IHRydWU7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoSW5mbyA9IG5ldyBTZWFyY2hJbmZvKCk7XHJcbiAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEgPSA8Rm9ybUNvbnRyb2xCYXNlW10+W107XHJcbiAgICAgICAgc2VhcmNoSW5mby5maWVsZERyb3Bkb3duID0ge307XHJcbiAgICAgICAgc2VhcmNoSW5mby5maWVsZFNlYXJjaFRleHQgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLnNldHRpbmcuY29scykge1xyXG4gICAgICAgICAgICBpZiAoY29sLmFsbG93RmlsdGVyICE9IGZhbHNlICYmIGNvbC5yYXdDb2x1bW4gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbC5mdWxsVGV4dFNlYXJjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2hJbmZvLmZpZWxkU2VhcmNoVGV4dC5pbmRleE9mKGNvbC5maWVsZCkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5maWVsZFNlYXJjaFRleHQucHVzaChjb2wuZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQgPSAnVMOsbSBraeG6v20gdGhlbyBjw6FjIHRyxrDhu51uZzonO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQgKz0gYCBcIiR7Y29sLmxhYmVsID8gY29sLmxhYmVsIDogY29sLmZpZWxkfVwiLGA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IGF3YWl0IHRoaXMuc2V0dGluZy5mdW5jdGlvbi5nZXRTZWFyY2hDb250cm9sKGNvbC5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEucHVzaCguLi5jb250cm9sKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2wuYmFzZVNlcnZpY2UgfHwgKGNvbC5kYXRhU291cmNlICYmIGNvbC5kYXRhU291cmNlLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8uZmllbGREcm9wZG93bltjb2wuZmllbGRdID0gbmV3IERyb3Bkb3duQ29udHJvbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jb2wsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29sLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IGNvbC5tdWx0aXBsZSA/IE9wZXJhdG9yLmluIDogT3BlcmF0b3IuZXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZFdpZHRoOiBjb2wubWRXaWR0aCA/IGNvbC5tZFdpZHRoIDogMTAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkT25Jbml0OiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5maWVsZERyb3Bkb3duW2NvbC5maWVsZF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09ICdpbnQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8uc2NoZW1hLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTnVtYmVyUmFuZ2VDb250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2wubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1R5cGU6ICdpbnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IDZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSAnZGVjaW1hbCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbC5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrVHlwZTogJ2RlY2ltYWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IDZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSAnZGF0ZScgfHwgY29sLmRhdGFUeXBlID09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlVGltZVJhbmdlQ29udHJvbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29sLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IDZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDaGVja0JveExpc3RDb250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2wubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZTogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZhbHVlOiB0cnVlLCBsYWJlbDogYEPDs2AgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB2YWx1ZTogZmFsc2UsIGxhYmVsOiBgS2jDtG5nYCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmVxdWFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IGNvbC5tZFdpZHRoID8gY29sLm1kV2lkdGggOiAxMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2wuZmllbGQgIT0gY29sLmRhdGFUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0Q29udHJvbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2wubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5jb250YWluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZFdpZHRoOiBjb2wubWRXaWR0aCA/IGNvbC5tZFdpZHRoIDogMTBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlYXJjaEluZm8uZmllbGRTZWFyY2hUZXh0KSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VhcmNoSW5mby5maWVsZFNlYXJjaFRleHQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWFyY2hJbmZvLmZpZWxkU2VhcmNoVGV4dC5pbmRleE9mKGZpZWxkKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8uZmllbGRTZWFyY2hUZXh0LnB1c2goZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnRvb2x0aXBTZWFyY2hUZXh0ID0gJ1TDrG0ga2nhur9tIHRoZW8gY8OhYyB0csaw4budbmc6JztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5zZXR0aW5nLm1vZGVsU2NoZW1hcy5maW5kKHAgPT4gcC5maWVsZCA9PSBmaWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQgKz0gYCBcIiR7Y29sLm5hbWV9XCIsYDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWFyY2hJbmZvLnRvb2x0aXBTZWFyY2hUZXh0KSB7XHJcbiAgICAgICAgICAgIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQgPSBzZWFyY2hJbmZvLnRvb2x0aXBTZWFyY2hUZXh0LnN1YnN0cmluZygwLCBzZWFyY2hJbmZvLnRvb2x0aXBTZWFyY2hUZXh0Lmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlYXJjaEluZm8gPSBzZWFyY2hJbmZvO1xyXG4gICAgICAgIHRoaXMuY3JlYXRpbmdTZWFyY2hJbmZvID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dTZXR0aW5nc1dvcmtmbG93KCkge1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5nc1dvcmtmbG93ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd1NldHRpbmdzV29ya2Zsb3dOZXcoKSB7XHJcbiAgICAgICAgdGhpcy53b3JrZmxvd1NldHRpbmdNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93TGlua1NoYXJpbmcoKSB7XHJcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uU2hhcmluZ01vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dMaXN0UGVybWlzc2lvbkJ5SXRlbSgpIHtcclxuICAgICAgICB0aGlzLnBlcm1pc3Npb25MaXN0TW9kZWwuc2hvd0VkaXRGb3JtID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TYXZlV29ya2Zsb3dTZXR0aW5ncyhldmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy53b3JrZmxvd1NldHRpbmcgPSBldmVudDtcclxuICAgICAgICB0aGlzLl9jb21tb25TZXJ2aWNlLnJlbG9hZFBhZ2UoKTtcclxuICAgICAgICB0aGlzLl9zaG93U2V0dGluZ3NXb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNhdmVXb3JrZmxvd1NldHRpbmdzTmV3KGV2dCkge1xyXG4gICAgICAgIHRoaXMud29ya2Zsb3dTZXR0aW5nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fY29tbW9uU2VydmljZS5yZWxvYWRQYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uUmVtb3ZlV29ya2Zsb3dTZXR0aW5ncyhldnQpIHtcclxuICAgICAgICB0aGlzLl9zaG93U2V0dGluZ3NXb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdvVG9UYXNrKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdDaOG7qWMgbsSDbmcgeGVtIGNoaSB0aeG6v3QgY8O0bmcgdmnhu4djIHjhu60gbMO9IHThu50gdHLDrG5oIMSRYW5nIMSRxrDhu6NjIGhvw6BuIHRoaeG7h24uLi4nKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGp1c3RQb3NpdGlvbkxvYWRpbmdNYXNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmludGVydmFsKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5tb2RlbC5sb2FkaW5nIHx8IHRoaXMubW9kZWwuYWRqdXN0ZWRQb3NpdGlvbkxvYWRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoZiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRhYmxlLmNvbnRhaW5lclZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGF0YWJsZS1sb2FkaW5nLW92ZXJsYXknKTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQuY2xvc2VzdCgncC10YWJsZScpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVTY3JvbGxCYXJDb250ZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlU2Nyb2xsQmFyQ29udGVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3BzLWNvbnRlbnQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG5vZGVTY3JvbGxCYXJDb250ZW50LnBhcmVudE5vZGUucHJlcGVuZChlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RUaCA9IGVsZW1lbnQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCdwLXRhYmxlIHRoZWFkIHRyOmZpcnN0LWNoaWxkID4gdGgnKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFRoU2l6ZSA9IGZpcnN0VGguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGluZ0ljb24gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGF0YWJsZS1sb2FkaW5nLWljb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShsb2FkaW5nSWNvbikuZm9udFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IChmaXJzdFRoU2l6ZS5oZWlnaHQgLSBmb250U2l6ZSkgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSAoZmlyc3RUaFNpemUud2lkdGggLSBmb250U2l6ZSkgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmdJY29uLnN0eWxlLm1hcmdpblRvcCA9IGAke3RvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZ0ljb24uc3R5bGUubWFyZ2luTGVmdCA9IGAke2xlZnR9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuYWRqdXN0ZWRQb3NpdGlvbkxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSwgMjApO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0UG9zaXRpb25Mb2FkaW5nTWFzaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMjApO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrUGVybWlzc2lvblRvVXNlQnV0dG9uKGJ1dHRvblBlcm1pc3Npb25Db2RlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB1c2VyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChVc2VyU2VydmljZSk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFVzZXIgPSB1c2VyU2VydmljZS5nZXRDdXJyZW50VXNlcigpO1xyXG4gICAgICAgIGlmIChjdXJyZW50VXNlci5pc3N1cGVydXNlci50b0xvd2VyQ2FzZSgpID09ICd0cnVlJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmJ1dHRvblBlcm1pc3Npb25NYXAuZ2V0KGAke3RoaXMuc2V0dGluZy5iYXNlU2VydmljZS5zZXJ2aWNlQ29kZX0vJHt0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UuZW50aXR5TmFtZX0vJHtidXR0b25QZXJtaXNzaW9uQ29kZX1gKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREcm9wZG93bkRhdGFzb3VyY2UoZmllbGQsIGRhdGFTb3VyY2UpIHtcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJTY2hlbWEuZHJvcGRvd25bZmllbGRdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyU2NoZW1hLmRyb3Bkb3duW2ZpZWxkXS5kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
2817
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1saXN0L2NydWQtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JILE9BQU8sRUFBcUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xHLE9BQU8sRUFDSCx5QkFBeUIsRUFDekIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLFlBQVks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QkFDTCxLQUFLO3lCQUNMLEtBQUs7NkJBQ0wsS0FBSzt5QkFDTCxLQUFLO3FDQUNMLEtBQUs7MkJBQ0wsS0FBSztxQkFDTCxLQUFLOzRCQUNMLEtBQUs7cUJBQ0wsS0FBSzsrQkFDTCxLQUFLO3dCQUNMLEtBQUs7a0NBQ0wsS0FBSztpQ0FDTCxLQUFLOzBCQUNMLEtBQUs7eUJBQ0wsS0FBSztvQkFHTCxLQUFLO3lCQU1MLEtBQUs7eUJBVUwsS0FBSzs2QkFVTCxLQUFLOzBCQUVMLE1BQU07MEJBQ04sTUFBTTt5QkFDTixNQUFNO3VCQUNOLE1BQU07eUJBQ04sTUFBTTtzQkFDTixNQUFNOzRCQUNOLE1BQU07b0JBQ04sTUFBTTtxQkFDTixNQUFNO3lCQUNOLE1BQU07aUNBQ04sTUFBTTtxQkFDTixNQUFNO3VCQUNOLE1BQU07K0JBQ04sTUFBTTtnQ0FDTixNQUFNOzZCQUNOLE1BQU07Z0NBQ04sTUFBTTtrQ0FDTixNQUFNO21DQUNOLE1BQU07c0NBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlLCBEZWNpbWFsUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgICBBZnRlckNvbnRlbnRJbml0LFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgQ29udGVudENoaWxkLFxyXG4gICAgQ29udGVudENoaWxkcmVuLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBQaXBlVHJhbnNmb3JtLFxyXG4gICAgUXVlcnlMaXN0LFxyXG4gICAgVGVtcGxhdGVSZWYsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9jb250ZXh0bWVudSc7XHJcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvdGFibGUnO1xyXG5cclxuaW1wb3J0IHsgQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb21wb25lbnQtYmFzZSc7XHJcbmltcG9ydCB7IElMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2ktbGlzdC1jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCdXR0b25UZXh0QWN0aW9uQ29uZ1ZpZWMsIEVudW1HZXRSZWZUeXBlLCBGb3JtU3RhdGUsIEtleUZpZWxkR2V0UmVmVHlwZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRW52aXJvbm1lbnRTY2hlbWEsIGlzQXJyYXksIGlzTGl0ZXJhbE9iamVjdCB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZW52aXJvbm1lbnQtc2NoZW1hJztcclxuaW1wb3J0IHtcclxuICAgIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWEsXHJcbiAgICBDb2x1bW5TY2hlbWFCYXNlLFxyXG4gICAgQ29sdW1uU2V0dGluZyxcclxuICAgIENvbnRyb2xUeXBlLFxyXG4gICAgQ3J1ZExpc3RDb25maWcsXHJcbiAgICBDcnVkTGlzdERhdGEsXHJcbiAgICBDcnVkTGlzdFNldHRpbmcsXHJcbiAgICBEYXRhVHlwZSxcclxuICAgIERhdGVUaW1lUmFuZ2VDb250cm9sU2NoZW1hLFxyXG4gICAgRGlhbG9nTW9kZWwsXHJcbiAgICBEcm9wZG93bkNvbnRyb2xTY2hlbWEsXHJcbiAgICBFeHBvcnRJdGVtc01vZGUsXHJcbiAgICBGaWxlVXBsb2FkTW9kZSxcclxuICAgIEZvcm1Db250cm9sQmFzZSxcclxuICAgIEhlaWdodFR5cGUsXHJcbiAgICBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEsXHJcbiAgICBPcGVyYXRvcixcclxuICAgIFBvcHVwU2l6ZSxcclxuICAgIFRleHRBbGlnbixcclxuICAgIFRleHRDb250cm9sU2NoZW1hLFxyXG59IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xyXG5pbXBvcnQgeyBUbk1lbnVJdGVtIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy90bi1tZW51LWl0ZW0nO1xyXG5pbXBvcnQgeyBBY3Rpb24sIFdvcmtmbG93U2V0dGluZ05ldyB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvd29ya2Zsb3ctc2NoZW1hJztcclxuaW1wb3J0IHsgQnV0dG9uUGVybWlzc2lvbiB9IGZyb20gJy4uLy4uLy4uL2NvbmZpZ3MvY29tcG9uZW50LWNvbnRhbnRzJztcclxuaW1wb3J0IHsgQ29uZ1ZpZWNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29uZ3ZpZWMvY29uZ3ZpZWMvc2VydmljZXMvY29uZ3ZpZWMuc2VydmljZSc7XHJcbmltcG9ydCB7IERtTG9haUNvbmdWaWVjU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2Nvbmd2aWVjL2RtLWxvYWktY29uZ3ZpZWMvc2VydmljZXMvZG0tbG9haS1jb25ndmllYy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmllbGRXb3JrZmxvd0NvZGVJbkNydWRGb3JtLCBSZWdleFNwbGl0RmllbGRCeUl0ZW0gfSBmcm9tICcuLi8uLi8uLi9jb25zdC9jb21tb24nO1xyXG5pbXBvcnQgeyBGaWVsZE9yZGVyQ3J1ZExpc3QgfSBmcm9tICcuLi8uLi8uLi9lbnVtcy9jb21tb24nO1xyXG5pbXBvcnQgeyBGaWx0ZXIsIEdyaWRJbmZvLCBTb3J0IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IFRuVXNlciB9IGZyb20gJy4uLy4uLy4uL21vZGVscy90bi11c2VyJztcclxuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3J1ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jcnVkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b21Sb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3VzdG9tLXJvdXRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50aXR5TWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZW50aXR5LW1ldGFkYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZXhwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2R1bGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGVybWlzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBtdWx0aXBsZVNvcnQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9hcnJheSc7XHJcbmltcG9ydCB7IFNlYXJjaEluZm8gfSBmcm9tICcuLi8uLi9tb2RlbHMvc2VhcmNoJztcclxuaW1wb3J0IHsgRW51bVN0YXRlVHlwZSB9IGZyb20gJy4uLy4uL3N0YXRlbWFjaGluZXMvbW9kZWxzL2VudW1zJztcclxuaW1wb3J0IHsgU3RhdGVNYWNoaW5lc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zdGF0ZW1hY2hpbmVzL3NlcnZpY2VzL3N0YXRlbWFjaGluZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IFRuQ3VzdG9tU2Nyb2xsYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdG4tY3VzdG9tLXNjcm9sbGJhci90bi1jdXN0b20tc2Nyb2xsYmFyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZpZWxkRGVmaW5lSGFzVGFzaywgTWFBY3Rpb25CYXREYXVRdXlUcmluaCB9IGZyb20gJy4uLy4uL3dvcmtmbG93L21vZGVscy9jb25zdCc7XHJcbmltcG9ydCB7IFdmQWN0aW9uLCBXZkl0ZW0gfSBmcm9tICcuLi8uLi93b3JrZmxvdy9tb2RlbHMvbW9kZWxzJztcclxuaW1wb3J0IHsgQ2FuQm9fSG9Tb1NlcnZpY2UgfSBmcm9tICcuLi8uLi93b3JrZmxvdy9zZXJ2aWNlcy9jYW5iby1ob3NvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vd29ya2Zsb3cvc2VydmljZXMvZW50aXR5LXdvcmtmbG93LWhpc3Rvcnkuc2VydmljZSc7XHJcbmltcG9ydCB7IFdvcmtmbG93SGlzdG9yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi93b3JrZmxvdy9zZXJ2aWNlcy93b3JrZmxvdy1oaXN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXb3JrZmxvd1Blcm1pc3Npb25EZXRhaWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vd29ya2Zsb3cvc2VydmljZXMvd29ya2Zsb3ctcGVybWlzc2lvbi1kZXRhaWwuc2VydmljZSc7XHJcbmltcG9ydCB7IGRhdGFTb3VyY2VJY29uIH0gZnJvbSAnLi4vLi4vd29ya2Zsb3cvd29ya2Zsb3ctc2V0dGluZy93b3JrZmxvdy1zZXR0aW5nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGdldFJlZ2V4UmVzdWx0LCByZW5kZXJUZXh0VGVtcGxhdGUgfSBmcm9tICcuLi91dGlscyc7XHJcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4vLi4vLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuZGVjbGFyZSBsZXQgJDogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxyXG4gICAgc2VsZWN0b3I6ICdjcnVkLWxpc3QnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NydWQtbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jcnVkLWxpc3QuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0RlY2ltYWxQaXBlLCBEYXRlUGlwZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENydWRMaXN0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIElMaXN0Q29tcG9uZW50LCBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XHJcbiAgICB0YWJsZTogVGFibGU7XHJcblxyXG4gICAgQFZpZXdDaGlsZChUYWJsZSwgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCBfdGFibGUodjogVGFibGUpIHtcclxuICAgICAgICB0aGlzLnRhYmxlID0gdjtcclxuICAgICAgICB0aGlzLnRhYmxlUmVhZHkubmV4dCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBjb250YWluZXI6IEVsZW1lbnRSZWY8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ2ljb25Ub2dnbGVSb3dHcm91cCcsIHsgc3RhdGljOiB0cnVlIH0pIGljb25Ub2dnbGVSb3dHcm91cDogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ2ljb25Ub2dnbGVSb3dEYXRhJywgeyBzdGF0aWM6IHRydWUgfSkgaWNvblRvZ2dsZVJvd0RhdGE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAVmlld0NoaWxkKCd0cmFuZ1RoYWlWNScsIHsgc3RhdGljOiB0cnVlIH0pIHRlbXBsYXRlVHJhbmdUaGFpVjU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAVmlld0NoaWxkKCd2aWV3SGlzdG9yeScsIHsgc3RhdGljOiB0cnVlIH0pIHRlbXBsYXRlQ29sVmlld0hpc3Rvcnk6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAVmlld0NoaWxkKCd3b3JrZmxvd0NvcmVTdGF0dXMnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0ZW1wbGF0ZVdvcmtmbG93Q29yZVN0YXR1czogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbGJhcicsIHsgc3RhdGljOiB0cnVlIH0pIHNjcm9sbGJhcjogVG5DdXN0b21TY3JvbGxiYXJDb21wb25lbnQ7XHJcbiAgICBAVmlld0NoaWxkKCdjb250ZXh0TWVudScsIHsgc3RhdGljOiBmYWxzZSB9KSBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XHJcbiAgICBAQ29udGVudENoaWxkKCdzZWFyY2hDdXN0b20nLCB7IHN0YXRpYzogdHJ1ZSB9KSBzZWFyY2hDdXN0b206IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBoZWFkZXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXJGaWx0ZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBoZWFkZXJGaWx0ZXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdyb3dFeHBhbnNpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSByb3dFeHBhbnNpb246IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdzdW1tYXJ5JywgeyBzdGF0aWM6IHRydWUgfSkgc3VtbWFyeTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBDb250ZW50Q2hpbGQoJ2Zvb3RlcicsIHsgc3RhdGljOiB0cnVlIH0pIGZvb3RlcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBDb250ZW50Q2hpbGQoJ2NvbGdyb3VwJywgeyBzdGF0aWM6IHRydWUgfSkgY29sZ3JvdXA6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdyb3dHcm91cCcsIHsgc3RhdGljOiB0cnVlIH0pIHJvd0dyb3VwOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQENvbnRlbnRDaGlsZCgnY29udGVudFJvd0dyb3VwJywgeyBzdGF0aWM6IHRydWUgfSkgY29udGVudFJvd0dyb3VwOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZVJlZikgY2hpbGRyZW46IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuXHJcbiAgICBASW5wdXQoKSBtb2RlbDogQ3J1ZExpc3REYXRhID0gbmV3IENydWRMaXN0RGF0YSgpO1xyXG4gICAgQElucHV0KCkgc2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nID0gbmV3IENydWRMaXN0U2V0dGluZygpO1xyXG4gICAgQElucHV0KCkgZmlsZU5hbWUgPSAnZXhwb3J0JztcclxuICAgIEBJbnB1dCgpIGxhenkgPSB0cnVlOyAvLyDEkeG6t3QgZ2nDoSB0cuG7iyBuw6B5IGLhurFuZyBmYWxzZSB0aMOsIHPhur0gZmlsdGVyIMSRYyBjbGllbnRcclxuXHJcbiAgICAvLyBkdW5nIGRvbiB2aSByZW0gZGUgd2lkdGgga2hvbmcgYmkgYW5oIGh1b25nIGJvaSBmb250IHNpemUgY3VhIHRoLCBubyBzZSBsYXkgdGhlbyBmb250IHNpemUgY3VhIHRoZSBodG1sXHJcbiAgICBASW5wdXQoKSB3aWR0aENoZWNrYm94ID0gJzIuNXJlbSc7XHJcbiAgICBASW5wdXQoKSB3aWR0aE9yZGVyQ29sdW1uID0gJzMuNXJlbSc7XHJcbiAgICBfZGVmYXVsdFdpdGhGdW5jdGlvbkNvbHVtbiA9IDgxO1xyXG4gICAgX3dpZHRoRnVuY3Rpb25Db2x1bW4gPSBgJHt0aGlzLl9kZWZhdWx0V2l0aEZ1bmN0aW9uQ29sdW1ufXB4YDtcclxuICAgIEBJbnB1dCgpIHdpZHRoRnVuY3Rpb25Db2x1bW46IHN0cmluZztcclxuICAgIF9jbGFzc1Jvd0dyb3VwID0gJ25vLXBhZGRpbmcnO1xyXG4gICAgQElucHV0KCkgc2V0IGNsYXNzUm93R3JvdXAodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbGFzc1Jvd0dyb3VwID0gYG5vLXBhZGRpbmcgJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xhc3NSb3dHcm91cCA9IGBuby1wYWRkaW5nYDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgc2hvd1Njcm9sbEJhciA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBwVGFibGVTY3JvbGxhYmxlID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwVGFibGVTY3JvbGxIZWlnaHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBASW5wdXQoKSByZXNwb25zaXZlID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGNvbmZpZ1Njcm9sbEJhcjogYW55ID0geyBzdXBwcmVzc1Njcm9sbFg6IHRydWUsIHN1cHByZXNzU2Nyb2xsWTogZmFsc2UgfTtcclxuICAgIEBJbnB1dCgpIHNob3dTY3JvbGxIb3Jpem9udGFsID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBzaG93TWVudUJ1dHRvbnMgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgc2hvd1JhZGlvID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBoaWRkZW5BZGQgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGhpZGRlbkRlbGV0ZSA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgaGlkZGVuRWRpdCA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgaGlkZGVuQ29weUxpbmsgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGhpZGRlblZpZXcgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVLZXlwcmVzc0NvbnRyb2wgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBlc2NhcGUgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgc2VsZWN0aW9uTW9kZTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgY29uZmlnOiBDcnVkTGlzdENvbmZpZyA9IG5ldyBDcnVkTGlzdENvbmZpZygpO1xyXG4gICAgQElucHV0KCkgZW5hYmxlUmVvcmRlclJvdyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgdGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgICBASW5wdXQoKSB0ZW1wbGF0ZXNGcm9tUGFyZW50OiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgICBASW5wdXQoKSBjaGlsZHJlbkZyb21QYXJlbnQ6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuICAgIEBJbnB1dCgpIG1lbnVCdXR0b25zOiAoKHJvd0RhdGEpID0+IFByb21pc2U8VG5NZW51SXRlbVtdPikgfCAoKHJvd0RhdGEpID0+IFRuTWVudUl0ZW1bXSk7XHJcbiAgICBASW5wdXQoKSBmaWVsZE9yZGVyOiBzdHJpbmcgPSBGaWVsZE9yZGVyQ3J1ZExpc3Q7XHJcblxyXG4gICAgX3N0eWxlOiBhbnkgPSB7fTtcclxuICAgIEBJbnB1dCgpIHNldCBzdHlsZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpIHNldCB0YWJsZUNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl90YWJsZUNsYXNzID0gdGhpcy5fZGVmYXVsdFRhYmxlQ2xhc3M7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudHJpbSgpICE9ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2xhc3MgKz0gYCAke3ZhbHVlfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldHVwVGFibGVDbGFzcygpO1xyXG4gICAgfVxyXG5cclxuICAgIF9kYXRhU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gICAgQElucHV0KCkgc2V0IGRhdGFTb3VyY2UodmFsdWU6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IGRhdGFTb3VyY2UgPSBbXTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgZGF0YVNvdXJjZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByb2Nlc3NEYXRhU291cmNlKGRhdGFTb3VyY2UpO1xyXG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZpbHRlciBt4bq3YyDEkeG7i25oIGNobyBkZXYgY29kZVxyXG4gICAgQElucHV0KCkgZmlsdGVyX2RlZmF1bHQ6IEZpbHRlcltdID0gW107XHJcblxyXG4gICAgQE91dHB1dCgpIG9uUm93U2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uUmVvcmRlcmVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ2hlY2tBbGw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25SZWxvYWQ6IEV2ZW50RW1pdHRlcjxHcmlkSW5mbz4gPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRJbmZvPigpO1xyXG4gICAgQE91dHB1dCgpIG9uUmVsb2FkZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25SZWFkeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNvbnRlbnRJbml0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWRkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uRWRpdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNvcHlMaW5rOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ29weUxpbmtNdWx0aXBsZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblZpZXc6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25EZWxldGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25EZWxldGVNdWx0aXBsZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkludmFsaWRXb3JrZmxvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkFmdGVyVHJpbmhLeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblN0YXJ0ZWRXb3JrZmxvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblByb2Nlc3NlZFdvcmtmbG93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uUm9sbGJhY2tlZFdvcmtmbG93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlZFN0YXR1c1dvcmtmbG93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgcHJpdmF0ZSB0YWJsZVJlYWR5ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gICAgdGFibGVSZWFkeVNvdXJjZSQgPSB0aGlzLnRhYmxlUmVhZHkuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgY2hlY2tlZEFsbCA9IG51bGw7XHJcbiAgICByb3dHcm91cENoZWNrZWQ6IGFueSA9IHt9O1xyXG4gICAgcm93R3JvdXBNZXRhZGF0YTogYW55ID0ge307XHJcbiAgICBkYXRhU291cmNlSW50ZXJuYWw6IGFueVtdO1xyXG4gICAgY2xhc3NUb29sYmFyID0gJyc7XHJcbiAgICBpdGVtU2V0dGluZ3M6IGFueSA9IHt9O1xyXG4gICAgc29ydEhpc3Rvcnk6IFNvcnRbXSA9IFtdO1xyXG4gICAgc29ydENsaWVudEhpc3Rvcnk6IGFueSA9IHt9O1xyXG4gICAgX2dyb3VwRmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBfZ3JvdXBJbkNsaWVudCA9IGZhbHNlO1xyXG4gICAgZW5hYmxlZFdmMSA9IHVuZGVmaW5lZDtcclxuICAgIHNob3dpbmdBY3Rpb25Xb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgYnV0dG9uQ29udGV4dHM6IE1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgICBfZGVmYXVsdFRhYmxlQ2xhc3MgPSAnbmV3LXRhYmxlIHNjci10YWJsZSBjcnVkLWxpc3QtdGFibGUnO1xyXG4gICAgX3RhYmxlQ2xhc3MgPSAnJztcclxuICAgIF9zaG93U2V0dGluZ3NSb3dDb2xvciA9IGZhbHNlO1xyXG4gICAgX3Nob3dTZXR0aW5ncyA9IGZhbHNlO1xyXG4gICAgX3Nob3dTZXR0aW5nc1dvcmtmbG93ID0gZmFsc2U7XHJcbiAgICBfc2hvd1NldHRpbmdzUGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgX2NvbG9yRmlsdGVyVGFibGUgPSBbXTtcclxuICAgIF9zb3J0RmllbGQgPSAnJztcclxuICAgIF9zb3J0RGlyOiAtMSB8IDAgfCAxIHwgMiA9IC0xO1xyXG5cclxuICAgIHRlbXBsYXRlOiBhbnkgPSB7fTtcclxuICAgIHByaXZhdGUgdGVtcGxhdGVGaWx0ZXI6IEZpbHRlcltdID0gW107XHJcbiAgICB0ZW1wbGF0ZUhlYWRlckNvbnRlbnQ6IGFueSA9IHt9O1xyXG5cclxuICAgIGNhY2hlZFRyYW5zZm9ybXMgPSB7fTtcclxuXHJcbiAgICBmaWx0ZXJTY2hlbWE6IGFueSA9IHt9O1xyXG4gICAgZmlsdGVyRGF0YTogYW55ID0ge307XHJcbiAgICBjdXJyZW50RmllbGRGaWx0ZXI6IHN0cmluZztcclxuICAgIGNoZWNrQm94Q29udGV4dE1lbnU6IE1lbnVJdGVtW10gPSBbXHJcbiAgICAgICAgeyBsYWJlbDogYEPDs2AsIGljb246ICdwaSBwaS1jaGVjaycsIGNvbW1hbmQ6ICgpID0+IHRoaXMuY2hhbmdlRmlsdGVyQm9vbGVhbih0cnVlKSB9LFxyXG4gICAgICAgIHsgbGFiZWw6IGBLaMO0bmdgLCBpY29uOiAncGkgcGktdGltZXMnLCBjb21tYW5kOiAoKSA9PiB0aGlzLmNoYW5nZUZpbHRlckJvb2xlYW4oZmFsc2UpIH0sXHJcbiAgICAgICAgeyBsYWJlbDogYEjhu6d5IGLhu49gLCBpY29uOiAncGkgcGktdW5kbycsIGNvbW1hbmQ6ICgpID0+IHRoaXMuY2hhbmdlRmlsdGVyQm9vbGVhbihudWxsKSB9XHJcbiAgICBdO1xyXG4gICAgc2VhcmNoSW5mbzogU2VhcmNoSW5mbyA9IG5ldyBTZWFyY2hJbmZvKCk7XHJcbiAgICBjcmVhdGluZ1NlYXJjaEluZm8gPSBmYWxzZTtcclxuXHJcbiAgICBmaWx0ZXJfY3VzdG9tOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgLy8gZmlsdGVyIGPhu6dhIGFkdmFuY2Ugc2VhcmNoIHRy4bqjIHbhu4FcclxuICAgIGZpbHRlcl9hZHZhbmNlU2VhcmNoOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgLy8gZmlsdGVyIHRoZW8gY8OhYyBmaWx0ZXIgaGnhu4NuIHRo4buLIHRyb25nIGPhu5l0IGPhu6dhIGdyaWRcclxuICAgIGZpbHRlcl9jb2x1bW46IEZpbHRlcltdID0gW107XHJcblxyXG4gICAgdGltZW91dDogYW55O1xyXG4gICAgaW50ZXJ2YWw6IGFueTtcclxuICAgIGRhdGFBZHZhbmNlOiBhbnkgPSB7fTtcclxuXHJcbiAgICBjdXJyZW50SXRlbTogYW55O1xyXG4gICAgc2hvd0Zvcm1Xb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgaGVhZGVyV29ya2Zsb3cgPSAnJztcclxuICAgIGFjdGlvbldvcmtmbG93OiBBY3Rpb247XHJcbiAgICBwb3B1cFNpemVXb3JrZmxvdzogUG9wdXBTaXplID0gbmV3IFBvcHVwU2l6ZSh7IHdpZHRoOiA5NTAsIGhlaWdodDogNTQwIH0pO1xyXG4gICAgc2hvd0hpc3RvcnlXb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgLy8gQmnhur9uIMSR4buDIGtp4buDbSB0cmEgbOG6p24gY2xpY2sgxJHhuqd1IHRpw6puIGPhu6dhIHVzZXIgdsOgbyBkw7JuZyB0csOqbiBncmlkXHJcbiAgICAvLyBT4butIGThu6VuZyDEkeG7gyBmaXggYnVnIHNldCBzZWxlY3RlZCByb3cgdOG7qyBmb3JtIGNoYSwgbmjGsG5nIHbDoG8gZm9ybSBjb24g4bqlbiBzYW5nIHJvdyBraMOhYyBuw7MgayBi4buPIHNlbGVjdGVkIHJvdyDEkcOjIHNldCB04burIGLDqm4gbmdvw6BpXHJcbiAgICBmaXJzdFJvd0NsaWNrID0gdHJ1ZTtcclxuXHJcbiAgICBzdGFydFdvcmtmbG93TW9kZWw6IERpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKHtcclxuICAgICAgICBoZWFkZXI6ICdDaOG7jW4gcXV5IHRyw6xuaCBuZ2hp4buHcCB24bulIHPhu60gZOG7pW5nJ1xyXG4gICAgfSk7XHJcbiAgICBwcm9jZXNzV29ya2Zsb3dNb2RlbDogRGlhbG9nTW9kZWwgPSBuZXcgRGlhbG9nTW9kZWwoKTtcclxuICAgIGNob1lLaWVuTW9kZWw6IERpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKHtcclxuICAgICAgICBoZWFkZXI6ICdDaG8gw70ga2nhur9uJyxcclxuICAgICAgICBwb3B1cFNpemU6IG5ldyBQb3B1cFNpemUoeyB3aWR0aDogMTEwMCwgaGVpZ2h0OiA2NTAgfSlcclxuICAgIH0pO1xyXG4gICAgd29ya2Zsb3dTZXR0aW5nTW9kZWw6IERpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKCk7XHJcbiAgICB3b3JrZmxvd0hpc3RvcnlNb2RlbDogRGlhbG9nTW9kZWwgPSBuZXcgRGlhbG9nTW9kZWwoe1xyXG4gICAgICAgIGhlYWRlcjogJ1hlbSBs4buLY2ggc+G7rSdcclxuICAgIH0pO1xyXG4gICAgcGVybWlzc2lvblNoYXJpbmdNb2RlbDogRGlhbG9nTW9kZWwgPSBuZXcgRGlhbG9nTW9kZWwoe1xyXG4gICAgICAgIGhlYWRlcjogJ1hlbSBkYW5oIHPDoWNoIGxpbmsgY2hpYSBz4bq7JyxcclxuICAgICAgICBwb3B1cFNpemU6IG5ldyBQb3B1cFNpemUoeyB3aWR0aDogMTEwMCwgaGVpZ2h0OiA2NTAgfSksXHJcbiAgICB9KTtcclxuICAgIHBlcm1pc3Npb25MaXN0TW9kZWw6IERpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKHtcclxuICAgICAgICBoZWFkZXI6ICdYZW0gZGFuaCBzw6FjaCBjw7MgcXV54buBbicsXHJcbiAgICAgICAgcG9wdXBTaXplOiBuZXcgUG9wdXBTaXplKHsgd2lkdGg6IDExMDAsIGhlaWdodDogNjUwIH0pLFxyXG4gICAgfSk7XHJcbiAgICBjb25nVmllY01vZGVsOiBEaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XHJcbiAgICAgICAgaGVhZGVyOiAnQ2jhuqF5IHF1eSB0csOsbmggY8O0bmcgdmnhu4djJyxcclxuICAgICAgICBwb3B1cFNpemU6IG5ldyBQb3B1cFNpemUoeyB3aWR0aDogMTEwMCwgaGVpZ2h0OiA2NTAgfSksXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICBjb25nVmllY1NldHRpbmc6IG5ldyBDcnVkTGlzdFNldHRpbmcoKVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgZGV0YWlsVGFza01vZGVsOiBEaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XHJcbiAgICAgICAgaGVhZGVyOiAnQ2hpIHRp4bq/dCBjw7RuZyB2aeG7h2MnXHJcbiAgICB9KTtcclxuICAgIHNoYXJlTGlua01vZGVsOiBEaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XHJcbiAgICAgICAgaGVhZGVyOiAnQ2hpYSBz4bq7IHF1eeG7gW4nLFxyXG4gICAgICAgIHBvcHVwU2l6ZTogbmV3IFBvcHVwU2l6ZSh7IHdpZHRoOiA2NTAsIGhlaWdodDogMzEwIH0pXHJcbiAgICB9KTtcclxuICAgIGF0dGFjaGVkVGFza01vZGVsOiBEaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XHJcbiAgICAgICAgaGVhZGVyOiAnRGFuaCBzw6FjaCBjw7RuZyB2aeG7h2MgxJHDrW5oIGvDqG0nXHJcbiAgICB9KTtcclxuXHJcbiAgICBCVVRUT05fUEhBTl9RVVlFTiA9IEJ1dHRvblBlcm1pc3Npb24uQlVUVE9OX1BIQU5fUVVZRU47XHJcbiAgICBCVVRUT05fQ0FVX0hJTkhfUVVZX1RSSU5IID0gQnV0dG9uUGVybWlzc2lvbi5CVVRUT05fQ0FVX0hJTkhfUVVZX1RSSU5IO1xyXG4gICAgbHN0QnV0dG9uUGVybWlzc2lvbiA9IFtdO1xyXG4gICAgYnV0dG9uUGVybWlzc2lvbk1hcDogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgZW50aXR5TWV0YWRhdGFTZXJ2aWNlOiBFbnRpdHlNZXRhZGF0YVNlcnZpY2U7XHJcbiAgICBlbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlOiBFbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlO1xyXG5cclxuICAgIHN0YXRlTWFjaGluZXNTZXJ2aWNlOiBTdGF0ZU1hY2hpbmVzU2VydmljZTtcclxuXHJcbiAgICBjYW5Cb19Ib1NvU2VydmljZTogQ2FuQm9fSG9Tb1NlcnZpY2U7XHJcblxyXG4gICAgc291cmNlSWNvbjogYW55ID0ge307XHJcbiAgICBzdG9wQ2FsY3VsYXRpbmdGdW5jdGlvbkNvbHVtbldpZHRoID0gZmFsc2U7XHJcbiAgICBzZWxlY3RlZEl0ZW1MYXN0OiBhbnk7XHJcblxyXG4gICAgcm93RGF0YUN1cnJlbnQ6IGFueTtcclxuICAgIGVudmlyb25tZW50OiBFbnZpcm9ubWVudFNjaGVtYTtcclxuICAgIEZpbGVVcGxvYWRNb2RlID0gRmlsZVVwbG9hZE1vZGU7XHJcbiAgICBjdXJyZW50VXNlcjogVG5Vc2VyO1xyXG5cclxuICAgIHB1YmxpYyBfcm91dGVyOiBSb3V0ZXI7XHJcbiAgICBwdWJsaWMgX2FjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZTtcclxuICAgIHB1YmxpYyBfY3VzdG9tUm91dGVyU2VydmljZTogQ3VzdG9tUm91dGVyU2VydmljZTtcclxuICAgIHB1YmxpYyBfdW5TdWJzY3JpYmVBbGwgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgICBwdWJsaWMgX25vdGlmaWVyU2VydmljZTogTm90aWZpZXJTZXJ2aWNlO1xyXG4gICAgcHVibGljIF9leHBvcnRTZXJ2aWNlOiBFeHBvcnRTZXJ2aWNlO1xyXG4gICAgcHVibGljIF9sb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlO1xyXG4gICAgcHVibGljIF9jb25nVmllY1NlcnZpY2U6IENvbmdWaWVjU2VydmljZTtcclxuICAgIHB1YmxpYyBfZG1Mb2FpQ29uZ1ZpZWNTZXJ2aWNlOiBEbUxvYWlDb25nVmllY1NlcnZpY2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2NvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9jcnVkU2VydmljZTogQ3J1ZFNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9zYW50aWxpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICAgICAgcHVibGljIF9kYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICAgICAgcHJpdmF0ZSBfbW9kdWxlQ29uZmlnU2VydmljZTogTW9kdWxlQ29uZmlnU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9wZXJtaXNzaW9uU2VydmljZTogUGVybWlzc2lvblNlcnZpY2UsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEFjdGl2YXRlZFJvdXRlKTtcclxuICAgICAgICB0aGlzLl9yb3V0ZXIgPSB0aGlzLl9pbmplY3Rvci5nZXQoUm91dGVyKTtcclxuICAgICAgICB0aGlzLl9jdXN0b21Sb3V0ZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEN1c3RvbVJvdXRlclNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChOb3RpZmllclNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoRXhwb3J0U2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fbG9nZ2VyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChMb2dnZXJTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmVudGl0eVdvcmtmbG93SGlzdG9yeVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoRW50aXR5V29ya2Zsb3dIaXN0b3J5U2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZU1hY2hpbmVzU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChTdGF0ZU1hY2hpbmVzU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5jYW5Cb19Ib1NvU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChDYW5Cb19Ib1NvU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fY29uZ1ZpZWNTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KENvbmdWaWVjU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fZG1Mb2FpQ29uZ1ZpZWNTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KERtTG9haUNvbmdWaWVjU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVDaGVja0FsbCA9IHRoaXMuaGFuZGxlQ2hlY2tBbGwuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUNoZWNrQWxsX0dyb3VwID0gdGhpcy5oYW5kbGVDaGVja0FsbF9Hcm91cC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLl9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpLmVudmlyb25tZW50O1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5DT01NT04uRU5USVRZX01FVEFEQVRBX1JFTE9BREVELCBzZXJ2aWNlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHlNZXRhZGF0YVNlcnZpY2UgPSBzZXJ2aWNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmZpbHRlclNjaGVtYS5kYXRlUmFuZ2UgPSBuZXcgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEoeyBhcHBlbmRUbzogJ2JvZHknIH0pO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyU2NoZW1hLmRyb3Bkb3duID0ge307XHJcblxyXG4gICAgICAgIGRhdGFTb3VyY2VJY29uLmZvckVhY2goc291cmNlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2VJY29uW3NvdXJjZS5pZF0gPSBzb3VyY2UudGVuO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnRlbXBsYXRlRmlsdGVyID0gW107XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fdGFibGVDbGFzcykge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJsZUNsYXNzID0gdGhpcy5fZGVmYXVsdFRhYmxlQ2xhc3M7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldHVwVGFibGVDbGFzcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluaXRDb2x1bW5TY2hlbWEodGhpcy5zZXR0aW5nLmNvbHMpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU2VhcmNoU2NoZW1hKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuaGlkZGVuVHJpbmhLeSB8fCAhdGhpcy5zZXR0aW5nLmRpc2FibGVTaGFyZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubWVudUJ1dHRvbnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVudUJ1dHRvbnMgPSBhc3luYyAoKSA9PiBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTuG6v3UgbcOgIOG6qW4gYWR2YW5jZXNlYXJjaCA9PiBz4bq9IGtow7RuZyBjw7MgdHJpZ2dlciBsb2FkIGRhdGEgdOG7qyBhZHZhbmNlIHNlYXJjaCA9PiBwaOG6o2kgdOG7sSBn4buNaSBnZXREYXRhIOG7nyBPbkluaXRcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmhpZGRlbkFkdmFuY2VTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChVc2VyU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHVzZXJTZXJ2aWNlLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgaWYgKCh0aGlzLmN1cnJlbnRVc2VyLmlzQWRtaW4oKSAmJiB0aGlzLl9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpLmVudmlyb25tZW50Lmlnbm9yZUFkbWluID09PSBmYWxzZSlcclxuICAgICAgICAgICAgfHwgdGhpcy5jdXJyZW50VXNlci5pc3N1cGVydXNlci50b0xvd2VyQ2FzZSgpICE9ICd0cnVlJykge1xyXG4gICAgICAgICAgICB0aGlzLl9wZXJtaXNzaW9uU2VydmljZS5nZXRTZXJ2aWNlUGVybWlzc2lvbih0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2Uuc2VydmljZUNvZGUpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxzdEJhc2VQZXJtaXNzaW9uID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sc3RCdXR0b25QZXJtaXNzaW9uID0gdGhpcy5fbW9kdWxlQ29uZmlnU2VydmljZS5nZXRDb25maWcoKS5lbnZpcm9ubWVudC5idXR0b25QZXJtaXNzaW9ucyBhcyBzdHJpbmdbXSA/PyBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYnV0dG9uUGVybWlzc2lvbkNvZGUgb2YgdGhpcy5sc3RCdXR0b25QZXJtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnV0dG9uUGVybWlzc2lvbiA9IGAke3RoaXMuc2V0dGluZy5iYXNlU2VydmljZS5zZXJ2aWNlQ29kZX0vJHt0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UuZW50aXR5TmFtZX0vJHtidXR0b25QZXJtaXNzaW9uQ29kZX1gLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idXR0b25QZXJtaXNzaW9uTWFwLnNldChidXR0b25QZXJtaXNzaW9uLCBsc3RCYXNlUGVybWlzc2lvbi5pbmNsdWRlcyhidXR0b25QZXJtaXNzaW9uKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sLmZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZmluZFRlbXBsYXRlKGBoZWFkZXIke2NvbC5maWVsZC5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKX0ke2NvbC5maWVsZC5zdWJzdHJpbmcoMSl9YCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlSGVhZGVyQ29udGVudFtjb2wuZmllbGRdID0gdGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9uQ29udGVudEluaXQuZW1pdCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cFRhYmxlQ2xhc3MoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5tdWx0aXBsZUNoZWNrV2hlbkNsaWNrUm93IHx8ICF0aGlzLnNldHRpbmcuaGlkZGVuQ2hlY2tib3gpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDbGFzcyArPSAnIG11bHRpLWNoZWNrJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2xhc3MgKz0gJyBzaW5nbGUtY2hlY2snO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zdGlja3lDb2x1bW4pIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDbGFzcyArPSAnIHN0aWNreS1jb2x1bW5zLWFjdGl2ZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmhpZGRlbkNoZWNrYm94KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2xhc3MgKz0gJyBoaWRkZW4tY29sdW1uLWNoZWNrYm94JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuaGlkZGVuT3JkZXJDb2x1bW4pIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDbGFzcyArPSAnIGhpZGRlbi1jb2x1bW4tb3JkZXInO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0Q29sdW1uU2NoZW1hKGNvbHM6IENvbHVtblNjaGVtYUJhc2VbXSkge1xyXG4gICAgICAgIGlmIChjb2xzKSB7XHJcbiAgICAgICAgICAgIGxldCBjb2xGdW5jdGlvbiA9IG51bGwsIGNvbEdyb3VwID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbC5maWVsZCA9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sRnVuY3Rpb24gPSBjb2w7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2wuZ3JvdXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBjb2xHcm91cCA9IGNvbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChjb2xGdW5jdGlvbiAmJiAhY29sRnVuY3Rpb24ud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dpZHRoRnVuY3Rpb25Db2x1bW4gPSBjb2xGdW5jdGlvbi53aWR0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmdldENvbG9yU2V0dGluZygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbHVtblNldHRpbmcoY29sR3JvdXApO1xyXG4gICAgICAgICAgICB0aGlzLmdldFBhZ2VTZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sdW1ucyh0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0Q29sdW1ucyh0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlDb2x1bW5TZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYnVpbGRGaWx0ZXJDb2x1bW4odGhpcy5zZXR0aW5nLmNvbHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4dGVuZENvbHVtbnMoY29sczogQ29sdW1uU2NoZW1hQmFzZVtdLCBhcHBlbmRDb2wgPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFjb2xzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZiA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCB0ZW1wOiBDb2x1bW5TY2hlbWFCYXNlW10gPSBbXTtcclxuICAgICAgICBjb25zdCB0bXBDb2xzID0gWy4uLmNvbHNdO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5kZXRhaWxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMuZm9yRWFjaChjb2xSZW9yZGVyID0+IHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xzW2ldLmZpZWxkID09IGNvbFJlb3JkZXIuY29sdW1uQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLnB1c2goY29sc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDw7JuIGzhuqFpIG5o4buvbmcgY29kZSBtw6Aga2jDtG5nIMSRxrDhu6NjIGPhuqV1IGjDrG5oIHRow6wgZ2jDqXAgbOG6oWkgdGhlbyBpbmRleCDEkcaw4bujYyBraGFpIGLDoW9cclxuICAgICAgICAgICAgbGV0IHRlbXBDb2xzOiBDb2x1bW5TY2hlbWFCYXNlW10gPSBbXTtcclxuICAgICAgICAgICAgY29scy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXhDb2xPbGQgPSB0bXBDb2xzLmZpbmRJbmRleChwID0+IHAuZmllbGQgPT0gY29sLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleENvbE9sZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcC5zcGxpY2UoMCwgMCwgY29sKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFTDrG0gduG7iyB0csOtIGPhu6dhIGPhu5l0IHBow61hIHRyxrDhu5tjIHRyb25nIGxpc3QgcmVvcmRlciBt4bubaVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleENvbEJlZm9yZU5ldyA9IHRlbXAuZmluZEluZGV4KHAgPT4gcC5maWVsZCA9PSB0bXBDb2xzW2luZGV4Q29sT2xkIC0gMV0uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleENvbEJlZm9yZU5ldyA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29scy5zcGxpY2UoMCwgMCwgY29sKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVMOsbSB24buLIHRyw60gY+G7p2EgY+G7mXQgdHLGsOG7m2MgY+G7mXQgxJFhbmcga2nhu4NtIHRyYSB0cm9uZyBsaXN0IGPhu5l0IGfhu5FjXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q29sT2xkID0gdG1wQ29scy5maW5kSW5kZXgocCA9PiBwLmZpZWxkID09IHRtcENvbHNbaW5kZXhDb2xPbGQgLSAxXS5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q29sQmVmb3JlTmV3ID0gdGVtcC5maW5kSW5kZXgocCA9PiBwLmZpZWxkID09IHRtcENvbHNbaW5kZXhDb2xPbGQgLSAxXS5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vID0+IMSQ4bq/biBraGkgdGjhuqV5IHRow6wgYWRkIGPhu5l0IGhp4buHbiB04bqhaSB2w6AgbGlzdCB04bqhbSB2w6BvIHbhu4sgdHLDrSBjaMOoblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleENvbEJlZm9yZU5ldyA9PSB0ZW1wLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5wdXNoKGNvbCwgLi4udGVtcENvbHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5zcGxpY2UoaW5kZXhDb2xCZWZvcmVOZXcgKyAxLCAwLCBjb2wsIC4uLnRlbXBDb2xzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgY29scy5zcGxpY2UoMCwgY29scy5sZW5ndGgpO1xyXG4gICAgICAgIGNvbHMuc3BsaWNlKDAsIDAsIC4uLnRlbXApO1xyXG5cclxuICAgICAgICBsZXQgZmlyc3RDb2xWaXNpYmxlID0gbnVsbDtcclxuICAgICAgICBsZXQgZm91bmRJdGVtU2hvd0VkaXRMaW5rID0gZmFsc2U7XHJcbiAgICAgICAgdGVtcC5zcGxpY2UoMCwgdGVtcC5sZW5ndGgpO1xyXG4gICAgICAgIGxldCB0bXBDb2w6IENvbHVtblNjaGVtYUJhc2UgPSBudWxsO1xyXG4gICAgICAgIGZvciAoY29uc3QgaW5kIGluIGNvbHMpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbHNbaW5kXTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucmF3Q29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0ZW1wLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMuZmluZChwID0+IHAuY29sdW1uQ29kZSA9PSBlbGVtZW50LmZpZWxkKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnZpc2libGUgIT09IHVuZGVmaW5lZCAmJiBjb25maWcudmlzaWJsZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC52aXNpYmxlID0gY29uZmlnLnZpc2libGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmxhYmVsID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGVsZW1lbnQubGFiZWwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy50ZXh0QWxpZ24gIT09IHVuZGVmaW5lZCAmJiBjb25maWcudGV4dEFsaWduICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnRleHRBbGlnbiA9IGNvbmZpZy50ZXh0QWxpZ247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLndpZHRoICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLndpZHRoICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LndpZHRoID0gY29uZmlnLndpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kYXRhVHlwZSA9PSBudWxsIHx8IGVsZW1lbnQuZGF0YVR5cGUgPT0gdW5kZWZpbmVkIHx8IGVsZW1lbnQuZGF0YVR5cGUgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YVR5cGUgPSBEYXRhVHlwZS5zdHJpbmc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnZpc2libGVcclxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50LmZpZWxkID09IHRoaXMuc2V0dGluZy5ncm91cENvbHVtbi5maWVsZFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmJhc2VTZXJ2aWNlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnRyb2xUeXBlID0gQ29udHJvbFR5cGUuZHJvcGRvd247XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LnJhd0NvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGROZWVkR2V0UmVmLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRbS2V5RmllbGRHZXRSZWZUeXBlXSA9IEVudW1HZXRSZWZUeXBlLlNFUlZFUjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWVGaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnZhbHVlRmllbGQgPSAnaWQnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXlGaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BsYXlGaWVsZCA9ICd0ZW4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcENvbCA9IG5ldyBDb2x1bW5TY2hlbWFCYXNlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdDb2x1bW46IGVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sVHlwZTogQ29udHJvbFR5cGUuZHJvcGRvd24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogZWxlbWVudC5kYXRhVHlwZVJlZkZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdzdHInICsgZWxlbWVudC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93RmlsdGVyOiBlbGVtZW50LmFsbG93RmlsdGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25maWdSZWZGaWVsZCA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMuZmluZChwID0+IHAuY29sdW1uQ29kZSA9PSB0bXBDb2wuZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnUmVmRmllbGQgJiYgY29uZmlnUmVmRmllbGQudmlzaWJsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBDb2wudmlzaWJsZSA9IGNvbmZpZ1JlZkZpZWxkLnZpc2libGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5wdXNoKHRtcENvbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Q29sVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb2xWaXNpYmxlID0gdG1wQ29sO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5kYXRhU291cmNlICYmIGVsZW1lbnQuZGF0YVNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb250cm9sVHlwZSA9IENvbnRyb2xUeXBlLmRyb3Bkb3duO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5yYXdDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZi5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50W0tleUZpZWxkR2V0UmVmVHlwZV0gPSBFbnVtR2V0UmVmVHlwZS5MT0NBTDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG1wQ29sID0gbmV3IENvbHVtblNjaGVtYUJhc2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd0NvbHVtbjogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xUeXBlOiBDb250cm9sVHlwZS5kcm9wZG93bixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBlbGVtZW50LmRhdGFUeXBlUmVmRmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlU2VydmljZTogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnc3RyJyArIGVsZW1lbnQuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0ZpbHRlcjogZWxlbWVudC5hbGxvd0ZpbHRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUmVmRmllbGQgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5kZXRhaWxzLmZpbmQocCA9PiBwLmNvbHVtbkNvZGUgPT0gdG1wQ29sLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ1JlZkZpZWxkICYmIGNvbmZpZ1JlZkZpZWxkLnZpc2libGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wQ29sLnZpc2libGUgPSBjb25maWdSZWZGaWVsZC52aXNpYmxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAucHVzaCh0bXBDb2wpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdENvbFZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29sVmlzaWJsZSA9IHRtcENvbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFmaXJzdENvbFZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbFZpc2libGUgPSBlbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQuZm9yY2VHZXREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5iYXNlU2VydmljZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZi5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRbS2V5RmllbGRHZXRSZWZUeXBlXSA9IEVudW1HZXRSZWZUeXBlLlNFUlZFUjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC52YWx1ZUZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZUZpZWxkID0gJ2lkJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheUZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kaXNwbGF5RmllbGQgPSAndGVuJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2hvd0VkaXRMaW5rKSB7XHJcbiAgICAgICAgICAgICAgICBmb3VuZEl0ZW1TaG93RWRpdExpbmsgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZm91bmRJdGVtU2hvd0VkaXRMaW5rICYmIGZpcnN0Q29sVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBmaXJzdENvbFZpc2libGUuc2hvd0VkaXRMaW5rID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29scy5sZW5ndGggPSAwO1xyXG4gICAgICAgIGNvbHMucHVzaCguLi50ZW1wKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZi5zb3J0KFxyXG4gICAgICAgICAgICBtdWx0aXBsZVNvcnQoeyBuYW1lOiAnc29ydCcsIHByaW1lcjogYSA9PiBhID09IG51bGwgfSwgJ29yZGVyJylcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtTGVuZ3RoID0gW107XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkSGFzTWF4aW11bVdvcmQgPSBbXTtcclxuICAgICAgICBjb2xzLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjb2wudmlzaWJsZSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAoY29sLm1heFdvcmREaXNwbGF5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtV29yZC5wdXNoKGNvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY29sLm1heExlbmd0aERpc3BsYXkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hZHZhbmNlRGF0YS5maWVsZEhhc01heGltdW1MZW5ndGgucHVzaChjb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZvcm1hdENvbHVtbnMoY29sczogQ29sdW1uU2NoZW1hQmFzZVtdKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29scykge1xyXG4gICAgICAgICAgICBpZiAoY29sLmRhdGFUeXBlID09ICdkYXRlJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wuZm9ybWF0KSBjb2wuZm9ybWF0ID0gJ25vcm1hbCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29sLmV4dGVuZERhdGEuc3R5bGUgPSB0aGlzLmdldENvbHVtblN0eWxlKGNvbCk7XHJcbiAgICAgICAgICAgIGNvbC5leHRlbmREYXRhLmhlYWRlclN0eWxlID0gdGhpcy5nZXRDb2x1bW5TdHlsZShjb2wsIHRydWUpO1xyXG4gICAgICAgICAgICBjb2wuZXh0ZW5kRGF0YS5oZWFkZXJDbGFzcyA9IHRoaXMuZ2V0Q2VsbENsYXNzSGVhZGVyKGNvbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q29sdW1uU2V0dGluZyhjb2xHcm91cDogQ29sdW1uU2NoZW1hQmFzZSkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5ncm91cENvbHVtbiA9IGNvbEdyb3VwO1xyXG4gICAgICAgIGNvbnN0IGRhdGFTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MVU1OX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhU2V0dGluZykge1xyXG4gICAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZGF0YVNldHRpbmcpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldHRpbmdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc2V0dGluZ3NbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wYXRobmFtZSA9PT0gcGF0aE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQgPSBlbGVtZW50LnNldHRpbmcuc29ydEZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnREaXIgPSBlbGVtZW50LnNldHRpbmcuc29ydERpciA/IGVsZW1lbnQuc2V0dGluZy5zb3J0RGlyIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydERpciA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnRGaWVsZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwRmllbGQgPSBlbGVtZW50LnNldHRpbmcuZ3JvdXBGaWVsZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEluQ2xpZW50ID0gZWxlbWVudC5zZXR0aW5nLmdyb3VwSW5DbGllbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEZpZWxkICYmIGNvbEdyb3VwICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRHcm91cEZpZWxkKGNvbEdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZGV0YWlscyA9IGVsZW1lbnQuc2V0dGluZy5kZXRhaWxzO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbEdyb3VwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0R3JvdXBGaWVsZChjb2xHcm91cCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0R3JvdXBGaWVsZChjb2xHcm91cCkge1xyXG4gICAgICAgIGlmICgoY29sR3JvdXAuZGF0YVNvdXJjZSAmJiBjb2xHcm91cC5kYXRhU291cmNlLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHx8IGNvbEdyb3VwLmJhc2VTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwRmllbGQgPSBgc3RyJHtjb2xHcm91cC5maWVsZH1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZCA9IGNvbEdyb3VwLmZpZWxkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhdmVDb2x1bW5TZXR0aW5nKCkge1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuc2V0dGluZ0tleSkge1xyXG4gICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbHVtblNldHRpbmcgPSBbXTtcclxuICAgICAgICBsZXQgY2hlY2tFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGRhdGFTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MVU1OX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhU2V0dGluZykge1xyXG4gICAgICAgICAgICBjb2x1bW5TZXR0aW5nID0gSlNPTi5wYXJzZShkYXRhU2V0dGluZyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1TZXR0aW5nID0gY29sdW1uU2V0dGluZy5maW5kKHEgPT4gcS5wYXRobmFtZSA9PSBwYXRoTmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtU2V0dGluZykge1xyXG4gICAgICAgICAgICAgICAgaXRlbVNldHRpbmcuc2V0dGluZy5zb3J0RmllbGQgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpdGVtU2V0dGluZy5zZXR0aW5nLnNvcnREaXIgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RGlyO1xyXG4gICAgICAgICAgICAgICAgaXRlbVNldHRpbmcuc2V0dGluZy5ncm91cEZpZWxkID0gdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZDtcclxuICAgICAgICAgICAgICAgIGl0ZW1TZXR0aW5nLnNldHRpbmcuZ3JvdXBJbkNsaWVudCA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwSW5DbGllbnQ7XHJcbiAgICAgICAgICAgICAgICBpdGVtU2V0dGluZy5zZXR0aW5nLmRldGFpbHMgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5kZXRhaWxzO1xyXG4gICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY2hlY2tFeGlzdCkge1xyXG4gICAgICAgICAgICBjb2x1bW5TZXR0aW5nLnB1c2goeyBwYXRobmFtZTogcGF0aE5hbWUsIHNldHRpbmc6IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MVU1OX1NFVFRJTkcsIEpTT04uc3RyaW5naWZ5KGNvbHVtblNldHRpbmcpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlbGV0ZUNvbHVtblNldHRpbmcoKSB7XHJcbiAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgIHBhdGhOYW1lICs9ICcvJyArIHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY29sdW1uU2V0dGluZyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGRhdGFTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MVU1OX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhU2V0dGluZykge1xyXG4gICAgICAgICAgICBjb2x1bW5TZXR0aW5nID0gSlNPTi5wYXJzZShkYXRhU2V0dGluZyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY29sdW1uU2V0dGluZy5maW5kSW5kZXgocSA9PiBxLnBhdGhuYW1lID09IHBhdGhOYW1lKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIGNvbHVtblNldHRpbmcuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkNPTFVNTl9TRVRUSU5HLCBKU09OLnN0cmluZ2lmeShjb2x1bW5TZXR0aW5nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb2xvclNldHRpbmcoKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YVBhZ2VTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MT1JfU0VUVElORyk7XHJcbiAgICAgICAgaWYgKGRhdGFQYWdlU2V0dGluZykge1xyXG4gICAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZGF0YVBhZ2VTZXR0aW5nKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXR0aW5ncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHNldHRpbmdzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyRmllbGQgPSBlbGVtZW50LmNvbG9yRmlsdGVyRmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyVGFibGUgPSBlbGVtZW50LmNvbG9yRmlsdGVyVGFibGU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWNoZUNvbG9yU2V0dGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FjaGVDb2xvclNldHRpbmcoKSB7XHJcbiAgICAgICAgdGhpcy5fY29sb3JGaWx0ZXJUYWJsZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJUYWJsZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyVGFibGVbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1WYWx1ZXMgPSBbXTtcclxuICAgICAgICAgICAgaXRlbVZhbHVlc1swXSA9IGl0ZW0uY29tcGFyZVR5cGU7XHJcbiAgICAgICAgICAgIGl0ZW1WYWx1ZXNbMV0gPSBpdGVtLmZpbHRlclZhbHVlO1xyXG4gICAgICAgICAgICBpdGVtVmFsdWVzWzJdID0gdGhpcy5jb252ZXJ0VG9EYXRlKGl0ZW0uZmlsdGVyVmFsdWUpO1xyXG4gICAgICAgICAgICBpdGVtVmFsdWVzWzNdID0gTnVtYmVyKGl0ZW0uZmlsdGVyVmFsdWUpO1xyXG4gICAgICAgICAgICBpdGVtVmFsdWVzWzRdID0gKC90cnVlL2kpLnRlc3QoaXRlbS5maWx0ZXJWYWx1ZSk7XHJcbiAgICAgICAgICAgIGl0ZW1WYWx1ZXNbNV0gPSBpdGVtLmNvbG9yO1xyXG4gICAgICAgICAgICB0aGlzLl9jb2xvckZpbHRlclRhYmxlLnB1c2goaXRlbVZhbHVlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Q29sb3JTZXR0aW5nKCkge1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuc2V0dGluZ0tleSkge1xyXG4gICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbG9yU2V0dGluZyA9IFtdO1xyXG4gICAgICAgIGxldCBjaGVja0V4aXN0ID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgZGF0YUNvbG9yU2V0dGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkNPTE9SX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhQ29sb3JTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIGNvbG9yU2V0dGluZyA9IEpTT04ucGFyc2UoZGF0YUNvbG9yU2V0dGluZyk7XHJcbiAgICAgICAgICAgIGNvbG9yU2V0dGluZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb2xvckZpbHRlckZpZWxkID0gdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyRmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb2xvckZpbHRlclRhYmxlID0gdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyVGFibGU7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjaGVja0V4aXN0KSB7XHJcbiAgICAgICAgICAgIGNvbG9yU2V0dGluZy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBwYXRoTmFtZSxcclxuICAgICAgICAgICAgICAgIGNvbG9yRmlsdGVyRmllbGQ6IHRoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkLFxyXG4gICAgICAgICAgICAgICAgY29sb3JGaWx0ZXJUYWJsZTogdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyVGFibGVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5DT0xPUl9TRVRUSU5HLCBKU09OLnN0cmluZ2lmeShjb2xvclNldHRpbmcpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFBhZ2VTZXR0aW5nKCkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFQYWdlU2V0dGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLlBBR0VfU0VUVElORyk7XHJcbiAgICAgICAgaWYgKGRhdGFQYWdlU2V0dGluZykge1xyXG4gICAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBwYWdlU2V0dGluZ3MgPSBKU09OLnBhcnNlKGRhdGFQYWdlU2V0dGluZyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFnZVNldHRpbmdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcGFnZVNldHRpbmdzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2VTaXplID0gZWxlbWVudC5wYWdlU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhdmVQYWdlU2V0dGluZygpIHtcclxuICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNldHRpbmdLZXkpIHtcclxuICAgICAgICAgICAgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5zZXR0aW5nLnNldHRpbmdLZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwYWdlU2V0dGluZyA9IFtdO1xyXG4gICAgICAgIGxldCBjaGVja0V4aXN0ID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgZGF0YVBhZ2VTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuUEFHRV9TRVRUSU5HKTtcclxuICAgICAgICBpZiAoZGF0YVBhZ2VTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIHBhZ2VTZXR0aW5nID0gSlNPTi5wYXJzZShkYXRhUGFnZVNldHRpbmcpO1xyXG4gICAgICAgICAgICBwYWdlU2V0dGluZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wYWdlU2l6ZSA9IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0V4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNoZWNrRXhpc3QpIHtcclxuICAgICAgICAgICAgcGFnZVNldHRpbmcucHVzaCh7IHBhdGhuYW1lOiBwYXRoTmFtZSwgcGFnZVNpemU6IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlU2l6ZSB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLlBBR0VfU0VUVElORywgSlNPTi5zdHJpbmdpZnkocGFnZVNldHRpbmcpKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lzSW5zaWRlRGlhbG9nKCkge1xyXG4gICAgICAgIGNvbnN0ICRkaWFsb2cgPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsb3Nlc3QoJy5wLWRpYWxvZycpO1xyXG4gICAgICAgIHJldHVybiAhISRkaWFsb2c7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUmVhZHkoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5maXhIZWlnaHRUeXBlSW5EaWFsb2cpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tJc0luc2lkZURpYWxvZygpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuaGVpZ2h0VHlwZSA9IEhlaWdodFR5cGUuY3VzdG9tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25SZWFkeS5lbWl0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tBbGxvd1NlbGVjdFJvdyhldnQsIHJvd0RhdGEpIHtcclxuICAgICAgICBpZiAodGhpcy5jb25maWcuZGlzYWJsZVJvd1NlbGVjdFdoZW5DbGlja0FjdGlvblxyXG4gICAgICAgICAgICAmJiAoZXZ0LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJy5saW5rLW9yLWFjdGlvbicpXHJcbiAgICAgICAgICAgICAgICB8fCBldnQudGFyZ2V0LmNsb3Nlc3QoJy5saW5rLW9yLWFjdGlvbicpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDbGljayB2w6BvIGNoZWNrYm94XHJcbiAgICAgICAgaWYgKGV2dC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwLWNoZWNrYm94LWJveCcpIHx8IGV2dC50YXJnZXQuY2xvc2VzdCgnLnAtY2hlY2tib3gtYm94JykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNoZWNrQWxsb3dTZWxlY3RSb3cgJiYgIXRoaXMuc2V0dGluZy5jaGVja0FsbG93U2VsZWN0Um93KHJvd0RhdGEsIGV2dCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVTZWxlY3RSb3cgPSAoZXZ0LCBkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5oYXNDdXN0b21IYW5kbGVDbGlja1Jvdykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tBbGxvd1NlbGVjdFJvdyhldnQsIGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb2xkQ2hlY2tlZCA9IGRhdGEuX2NoZWNrZWQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcubXVsdGlwbGVDaGVja1doZW5DbGlja1Jvdykge1xyXG4gICAgICAgICAgICBsZXQgZGF0YVRvQ2xlYXJDaGVja2VkID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RSb3dDbGljaykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdFJvd0NsaWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBkYXRhVG9DbGVhckNoZWNrZWQgPSB0aGlzLm1vZGVsLmRhdGFTb3VyY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhVG9DbGVhckNoZWNrZWQgPSB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGF0YVRvQ2xlYXJDaGVja2VkLmZvckVhY2goKHAsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwLl9jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YS5fY2hlY2tlZCA9ICFvbGRDaGVja2VkO1xyXG4gICAgICAgIGxldCBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmZpcmVFdmVudFdoZW5SZVNlbGVjdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1MYXN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtTGFzdCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YShkYXRhLCBldnQudGFyZ2V0LmNsb3Nlc3QoJ3RyJyksIGZpcmVFdmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGhhbmRsZVNlbGVjdFJvd0dyb3VwID0gKGV2dCwgZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0FsbG93U2VsZWN0Um93KGV2dCwgZGF0YSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5tdWx0aXBsZUNoZWNrV2hlbkNsaWNrUm93KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zTW9kaWZpZWQgPSBbLi4udGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zXTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmZvckVhY2goKHAsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwLl9jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIWl0ZW1zTW9kaWZpZWQuc29tZShxID0+IHEuaWQgPT0gZGF0YS5pZCkpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zTW9kaWZpZWQucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpdGVtc01vZGlmaWVkLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cChpdGVtLCBudWxsLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhLl9jaGVja2VkID0gIWRhdGEuX2NoZWNrZWQ7XHJcblxyXG4gICAgICAgIGxldCBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmZpcmVFdmVudFdoZW5SZVNlbGVjdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1MYXN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtTGFzdCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cChkYXRhLCBldnQudGFyZ2V0LmNsb3Nlc3QoJ3RyJyksIGZpcmVFdmVudCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgc2V0TGFzdEl0ZW1TZWxlY3RlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1MYXN0ID0gdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zW3RoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtTGFzdCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2VtaXRSb3dTZWxlY3QodHJFbGVtZW50LCBkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHtcclxuICAgICAgICAgICAgZWxlbWVudDogdHJFbGVtZW50LFxyXG4gICAgICAgICAgICBkYXRhXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVRvZ2dsZVJvdyhyb3dEYXRhLCBldnQpIHtcclxuICAgICAgICB0aGlzLnRhYmxlLnRvZ2dsZVJvdyhyb3dEYXRhLCBldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRJdGVtV29ya2Zsb3dTZXR0aW5nKHNldHRpbmc6IENydWRMaXN0U2V0dGluZywgcm93RGF0YSkge1xyXG4gICAgICAgIGxldCB3b3JrZmxvd1NldHRpbmcgPSBzZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldztcclxuICAgICAgICBpZiAoc2V0dGluZy5pc1dvcmtmbG93VHJlZVxyXG4gICAgICAgICAgICAmJiBzZXR0aW5nLndvcmtmbG93Q29uZmlnQWR2YW5jZVxyXG4gICAgICAgICAgICAmJiBzZXR0aW5nLndvcmtmbG93Q29uZmlnQWR2YW5jZS5nZXRXb3JrZmxvd1NldHRpbmdcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgd29ya2Zsb3dTZXR0aW5nID0gYXdhaXQgc2V0dGluZy53b3JrZmxvd0NvbmZpZ0FkdmFuY2UuZ2V0V29ya2Zsb3dTZXR0aW5nKHJvd0RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXdvcmtmbG93U2V0dGluZyB8fCB3b3JrZmxvd1NldHRpbmcud29ya2Zsb3dzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ8SQ4buRaSB0xrDhu6NuZyBjaMawYSDEkcaw4bujYyBj4bqldSBow6xuaCBxdXkgdHLDrG5oIG5naGnhu4dwIHbhu6UnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHdvcmtmbG93U2V0dGluZztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaG93Rm9ybVN0YXJ0V29ya2Zsb3cocm93RGF0YSkge1xyXG4gICAgICAgIHJvd0RhdGEuX19zdGFydGluZ1dvcmtmbG93ID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCB3b3JrZmxvd1NldHRpbmcgPSBhd2FpdCB0aGlzLmdldEl0ZW1Xb3JrZmxvd1NldHRpbmcodGhpcy5zZXR0aW5nLCByb3dEYXRhKTtcclxuICAgICAgICBpZiAoIXdvcmtmbG93U2V0dGluZykge1xyXG4gICAgICAgICAgICByb3dEYXRhLl9fc3RhcnRpbmdXb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE7hur91IGNyZWF0ZSB0YXNrIHRoYXkgdsOsIGNo4bqheSBxdXkgdHLDrG5oIHbhu5tpIMSR4buRaSB0xrDhu6NuZyBjaMOtbmggdGjDrCBt4bufIGZvcm0gdGjDqm0gY8O0bmcgdmnhu4djXHJcbiAgICAgICAgaWYgKHdvcmtmbG93U2V0dGluZy5jcmVhdGVUYXNrSW5zdGVhZCkge1xyXG4gICAgICAgICAgICAvLyBLaeG7g20gdHJhIMSRw6MgdOG6oW8gY8O0bmcgdmnhu4djIGfhuq9uIHbhu5tpIGLhuqNuIGdoaSBjaMawYVxyXG4gICAgICAgICAgICAvLyBO4bq/dSBjw7MgcuG7k2kgdGjDrCBiw6FvXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdENoZWNrRXhpc3QgPSAoYXdhaXQgdGhpcy5fY29uZ1ZpZWNTZXJ2aWNlLmNoZWNrRXhpc3RCeUZpbHRlcihbXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5ld0ZpbHRlcignc2VydmljZUNvZGUnLCBPcGVyYXRvci5lcXVhbCwgdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnNlcnZpY2VDb2RlKSxcclxuICAgICAgICAgICAgICAgIHRoaXMubmV3RmlsdGVyKCdlbnRpdHknLCBPcGVyYXRvci5lcXVhbCwgdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLmVudGl0eU5hbWUpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uZXdGaWx0ZXIoJ2VudGl0eUtleScsIE9wZXJhdG9yLmVxdWFsLCByb3dEYXRhLmlkKVxyXG4gICAgICAgICAgICBdKSk7XHJcbiAgICAgICAgICAgIGlmICghcmVzdWx0Q2hlY2tFeGlzdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICByb3dEYXRhLl9fc3RhcnRpbmdXb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBraeG7g20gdHJhIHRy4bqhbmcgdGjDoWkgxJHDoyB04bqhbyBjw7RuZyB2aeG7h2MgaGF5IGNoxrBhJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJlc3VsdENoZWNrRXhpc3QuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgcm93RGF0YS5fX3N0YXJ0aW5nV29ya2Zsb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0LhuqNuIGdoaSDEkcOjIMSRxrDhu6NjIHThuqFvIGPDtG5nIHZp4buHYycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcubW9kaWZ5Um93RGF0YUZvclRhc2spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0dGluZy5tb2RpZnlSb3dEYXRhRm9yVGFzayhyb3dEYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBtb2RlbFRhc2sgPSB7XHJcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5fY29tbW9uU2VydmljZS5ndWlkKCksIC8vIElkIG7DoHkgY+G6p24gdGhp4bq/dCB2w6wgc+G6vSBkw7luZyB0cm9uZyBow6BtIGluc2VydFRhc2tBbmRSZWxvYWRcclxuICAgICAgICAgICAgICAgIGNoZWNrVW5pcXVlVGFza0ZvckVudGl0eTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIC8vIGF1dG9OZXh0U3RlcDogd29ya2Zsb3dTZXR0aW5nLmF1dG9OZXh0U3RlcCxcclxuICAgICAgICAgICAgICAgIGlkTG9haUNvbmdWaWVjOiB3b3JrZmxvd1NldHRpbmcuaWRMb2FpQ29uZ1ZpZWNEZWZhdWx0LFxyXG4gICAgICAgICAgICAgICAgc2VydmljZUNvZGU6IHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5zZXJ2aWNlQ29kZSxcclxuICAgICAgICAgICAgICAgIGVudGl0eTogdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLmVudGl0eU5hbWUsXHJcbiAgICAgICAgICAgICAgICBlbnRpdHlLZXk6IHJvd0RhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICB0ZW46IHRoaXMuZ2V0VGVuQ29uZ1ZpZWMod29ya2Zsb3dTZXR0aW5nLnRlbXBsYXRlVGFza05hbWUsIHJvd0RhdGEpLFxyXG4gICAgICAgICAgICAgICAgZGluaEtlbU5naGllcFZ1RHRvczogW11cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIC8vIFThu5VuZyBo4bujcCBtb2RlbCDEkcOtbmgga8OobSBuZ2hp4buHcCB24bulIGVudGl0eVxyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50TGluayA9IGF3YWl0IHRoaXMuZ2V0Q29weVBhdGgodGhpcy5zZXR0aW5nLCByb3dEYXRhKTtcclxuICAgICAgICAgICAgaWYgKGNvbnRlbnRMaW5rKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEVudGl0eSA9IHRoaXMucGFyc2VBdHRhY2hMaW5rKGNvbnRlbnRMaW5rKTtcclxuICAgICAgICAgICAgICAgIG1vZGVsVGFzay5kaW5oS2VtTmdoaWVwVnVEdG9zID0gbW9kZWxFbnRpdHk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5tb2RpZnlJdGVtVGFzaykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXR0aW5nLm1vZGlmeUl0ZW1UYXNrKG1vZGVsVGFzaywgcm93RGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEtp4buDbSB0cmEgbuG6v3UgY8OzIGPhuqV1IGjDrG5oIHThu7EgxJHhu5luZyBi4bqvdCDEkeG6p3UgdGFzaywgdsOgIHBo4bqjaSBjw7MgbG/huqFpIGPDtG5nIHZp4buHYyBt4bq3YyDEkeG7i25oXHJcbiAgICAgICAgICAgIGlmICh3b3JrZmxvd1NldHRpbmcuYXV0b1N0YXJ0VGFza1xyXG4gICAgICAgICAgICAgICAgJiYgd29ya2Zsb3dTZXR0aW5nLmlkTG9haUNvbmdWaWVjRGVmYXVsdFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIC8vID0+IFRow6wgbOG6pXkgdGjDqm0gdGjDtG5nIHRpbiBxdXkgdHLDrG5oIG3hurdjIMSR4buLbmggY2hvIHRhc2tcclxuICAgICAgICAgICAgICAgIC8vIE7hur91IGzhuqV5IMSRxrDhu6NjIHRow6wgdOG7sSDEkeG7mW5nIGLhuq90IMSR4bqndSwgbuG6v3Uga2jDtG5nIHRow6wgduG6q24gcGjhuqNpIG3hu58gbMOqbiBmb3JtIGPDtG5nIHZp4buHY1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFza1dvcmtmbG93U2V0dGluZyA9IGF3YWl0IHRoaXMuX2RtTG9haUNvbmdWaWVjU2VydmljZS5nZXRXb3JrZmxvd1NldHRpbmdCeUlkTG9haUNvbmdWaWVjKHdvcmtmbG93U2V0dGluZy5pZExvYWlDb25nVmllY0RlZmF1bHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRhc2tXb3JrZmxvd1NldHRpbmcgIT0gbnVsbCAmJiB0YXNrV29ya2Zsb3dTZXR0aW5nLndvcmtmbG93Q29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsVGFza1tGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm1dID0gdGFza1dvcmtmbG93U2V0dGluZy53b3JrZmxvd0NvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRUYXNrQW5kUmVsb2FkKG1vZGVsVGFzaywgcm93RGF0YSwgdGFza1dvcmtmbG93U2V0dGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5fX3N0YXJ0aW5nV29ya2Zsb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jb25nVmllY01vZGVsLmRhdGEuY29uZ1ZpZWNTZXR0aW5nLmlzV29ya2Zsb3dUcmVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jb25nVmllY01vZGVsLmRhdGEubW9kZWwgPSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtU3RhdGU6IEZvcm1TdGF0ZS5BREQsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBtb2RlbFRhc2tcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5jb25nVmllY01vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAod29ya2Zsb3dTZXR0aW5nLndvcmtmbG93cy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGFydFdvcmtmbG93KHJvd0RhdGEsIHdvcmtmbG93U2V0dGluZy53b3JrZmxvd3NbMF0pO1xyXG4gICAgICAgICAgICAgICAgcm93RGF0YS5fX3N0YXJ0aW5nV29ya2Zsb3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGFydFdvcmtmbG93TW9kZWwuZGF0YS53b3JrZmxvd3MgPSB3b3JrZmxvd1NldHRpbmcud29ya2Zsb3dzO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0V29ya2Zsb3dNb2RlbC5kYXRhLmRlZmF1bHRXb3JrZmxvdyA9IHdvcmtmbG93U2V0dGluZy53b3JrZmxvd0NvZGU7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRXb3JrZmxvd01vZGVsLmRhdGEuaXRlbSA9IHJvd0RhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRXb3JrZmxvd01vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJvd0RhdGEuX19zdGFydGluZ1dvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFRlbkNvbmdWaWVjKHRlbXBsYXRlVGV4dDogc3RyaW5nLCByb3dEYXRhOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gcmVuZGVyVGV4dFRlbXBsYXRlKFxyXG4gICAgICAgICAgICBnZXRSZWdleFJlc3VsdCh0ZW1wbGF0ZVRleHQsIFJlZ2V4U3BsaXRGaWVsZEJ5SXRlbSwgZXhlY1Jlc3VsdCA9PiBleGVjUmVzdWx0WzFdKSxcclxuICAgICAgICAgICAgdGVtcGxhdGVUZXh0LCByb3dEYXRhXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvbmdIb3BXb3JrZmxvd0hpc3RvcnlGb3JOZXh0Rmlyc3RTdGVwKFxyXG4gICAgICAgIGl0ZW1Xb3JrZmxvd0hpc3Rvcnk6IGFueSwgaXRlbVRhc2s6IGFueSwgd29ya2Zsb3dTZXR0aW5nOiBXb3JrZmxvd1NldHRpbmdOZXcsIHdvcmtmbG93Q29kZTogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgICBpZiAoaXRlbVdvcmtmbG93SGlzdG9yeSA9PSBudWxsKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBpZiAoaXRlbVdvcmtmbG93SGlzdG9yeSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93ID0gd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93cy5maW5kKHEgPT4gcS5jb2RlID09IHdvcmtmbG93Q29kZSk7XHJcbiAgICAgICAgICAgIGlmICh3b3JrZmxvdyA9PSBudWxsKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGVTdGFydCA9IHdvcmtmbG93LmRhdGEubWFjaGluZXMuZmluZChxID0+IHEudHlwZSA9PSBFbnVtU3RhdGVUeXBlLlNUQVJUKTtcclxuICAgICAgICAgICAgaWYgKHN0YXRlU3RhcnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvZGUgPSBpdGVtV29ya2Zsb3dIaXN0b3J5LmFjdGlvbkNvZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0QWN0aW9uID0gd29ya2Zsb3cuZGF0YS5jb25uZWN0aW9ucy5zb21lKHggPT4geC5zb3VyY2UgPT0gc3RhdGVTdGFydC5pZFxyXG4gICAgICAgICAgICAgICAgJiYgeC5jb2RlID09IGFjdGlvbkNvZGVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKCFleGlzdEFjdGlvbikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGNydWRMaXN0U2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nID0gbmV3IENydWRMaXN0U2V0dGluZygpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb25nVmllY1NlcnZpY2UuYWRqdXN0U2V0dGluZ1dvcmtmbG93Rm9yQ3J1ZExpc3QoY3J1ZExpc3RTZXR0aW5nKTtcclxuICAgICAgICAgICAgbGV0IG5hbWUgPSAnJztcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnVkTGlzdFNldHRpbmcuZGlzcGxheUZpZWxkID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gaXRlbVRhc2tbPHN0cmluZz4oY3J1ZExpc3RTZXR0aW5nLmRpc3BsYXlGaWVsZCldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmFtZSA9ICg8RnVuY3Rpb24+KGNydWRMaXN0U2V0dGluZy5kaXNwbGF5RmllbGQpKShpdGVtVGFzayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmFtZSA9IGAke2NydWRMaXN0U2V0dGluZy5iYXNlU2VydmljZS5vYmplY3ROYW1lfSAke25hbWV9YDtcclxuICAgICAgICAgICAgaXRlbVdvcmtmbG93SGlzdG9yeS50YWJsZU5hbWUgPSB0aGlzLl9jb25nVmllY1NlcnZpY2UuZW50aXR5TmFtZTtcclxuICAgICAgICAgICAgaXRlbVdvcmtmbG93SGlzdG9yeS5vYmplY3RGdWxsTmFtZSA9IG5hbWU7XHJcbiAgICAgICAgICAgIGl0ZW1Xb3JrZmxvd0hpc3Rvcnkub2JqZWN0TmFtZSA9IG5hbWU7XHJcbiAgICAgICAgICAgIGl0ZW1Xb3JrZmxvd0hpc3Rvcnkud29ya2Zsb3dDb2RlID0gd29ya2Zsb3dDb2RlO1xyXG4gICAgICAgICAgICBpdGVtV29ya2Zsb3dIaXN0b3J5Lml0ZW1JZCA9IGl0ZW1UYXNrLmlkO1xyXG4gICAgICAgICAgICBpdGVtV29ya2Zsb3dIaXN0b3J5LnNvdXJjZVN0YXR1c0NvZGUgPSBzdGF0ZVN0YXJ0LmNvZGU7XHJcbiAgICAgICAgICAgIGl0ZW1Xb3JrZmxvd0hpc3RvcnkuYWN0aW9uQ29kZSA9IGFjdGlvbkNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtV29ya2Zsb3dIaXN0b3J5O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgaW5zZXJ0VGFza0FuZFJlbG9hZChtb2RlbFRhc2ssIHJvd0RhdGEsIHdvcmtmbG93U2V0dGluZzogV29ya2Zsb3dTZXR0aW5nTmV3KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5nZXREYXRhRm9yTmV4dEZpcnN0U3RlcFRhc2spIHtcclxuICAgICAgICAgICAgbW9kZWxUYXNrLml0ZW1Xb3JrZmxvd0hpc3RvcnkgPSBhd2FpdCB0aGlzLnNldHRpbmcuZ2V0RGF0YUZvck5leHRGaXJzdFN0ZXBUYXNrKHJvd0RhdGEpO1xyXG4gICAgICAgICAgICBtb2RlbFRhc2suaXRlbVdvcmtmbG93SGlzdG9yeSA9IHRoaXMudG9uZ0hvcFdvcmtmbG93SGlzdG9yeUZvck5leHRGaXJzdFN0ZXAoXHJcbiAgICAgICAgICAgICAgICBtb2RlbFRhc2suaXRlbVdvcmtmbG93SGlzdG9yeSwgbW9kZWxUYXNrLCB3b3JrZmxvd1NldHRpbmcsIG1vZGVsVGFza1tGaWVsZFdvcmtmbG93Q29kZUluQ3J1ZEZvcm1dXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2NvbmdWaWVjU2VydmljZS5wb3N0KG1vZGVsVGFzaylcclxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCAnJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY2FsbCBiYWNrIGtoaSDhuqVuIGzGsHUgdHLDqm4gZm9ybSBi4bqvdCDEkeG6p3UgcXV5IHRyw6xuaFxyXG4gICAgICogY3J1ZC1saXN0IHPhur0gZ+G7jWkgaMOgbSBsxrB1IGNo4bupIGZvcm0gc3RhcnQgd29ya2Zsb3cgayBsw6BtIGfDrCBj4bqjXHJcbiAgICAgKiDEkOG7giBU4bqsTiBE4bukTkcgTOG6oEkgSMOATSBzdGFydFdvcmtmbG93IGPhu6dhIGNydWQtbGlzdFxyXG4gICAgICovXHJcbiAgICBoYW5kbGVTdGFydFdvcmtmbG93RnJvbURpYWxvZyh3b3JrZmxvdzogV2ZJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydFdvcmtmbG93TW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zdGFydFdvcmtmbG93KHRoaXMuc3RhcnRXb3JrZmxvd01vZGVsLmRhdGEuaXRlbSwgd29ya2Zsb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzaG93QWN0aW9uV29ya2Zsb3coZXZ0LCByb3dEYXRhKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd2luZ0FjdGlvbldvcmtmbG93KSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5zaG93aW5nQWN0aW9uV29ya2Zsb3cgPSB0cnVlO1xyXG4gICAgICAgIGxldCByZXN1bHRHZXRBY3Rpb25Xb3JrZmxvdyA9IG51bGw7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuaXNXb3JrZmxvd1RyZWUgJiYgdGhpcy5zZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldy5jcmVhdGVUYXNrSW5zdGVhZCkge1xyXG4gICAgICAgICAgICByZXN1bHRHZXRBY3Rpb25Xb3JrZmxvdyA9IGF3YWl0IHRoaXMuZ2V0QWN0aW9uV29ya2Zsb3dCeVRhc2socm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHRHZXRBY3Rpb25Xb3JrZmxvdyA9IGF3YWl0IHRoaXMuZ2V0QWN0aW9uV29ya2Zsb3cocm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hvd2luZ0FjdGlvbldvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdEdldEFjdGlvbldvcmtmbG93KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdLaMO0bmcgY8OzIGjDoG5oIMSR4buZbmcga2jhuqMgZOG7pW5nJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRleHRzID0gcmVzdWx0R2V0QWN0aW9uV29ya2Zsb3c7XHJcbiAgICAgICAgLy8gTuG6v3UgbMOgIGLhuqNuIGdoaSBuZ2hp4buHcCB24bulIG3DoCBjw7MgZ+G6r24gdGjDtG5nIHRpbiB0YXNrIHRow6wgYuG7lSBzdW5nIHRow6ptIG1lbnUgeGVtIGPDtG5nIHZp4buHY1xyXG4gICAgICAgIGlmIChyb3dEYXRhW0ZpZWxkRGVmaW5lSGFzVGFza10pIHtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMudW5zaGlmdChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogYFhlbSBjw7RuZyB2aeG7h2NgLFxyXG4gICAgICAgICAgICAgICAgICAgIGljb246ICdwaSBwaS1tYXAnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudmlld1Rhc2tEZXRhaWwocm93RGF0YSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5idXR0b25Db250ZXh0cyA9IGJ1dHRvbkNvbnRleHRzO1xyXG4gICAgICAgIHRoaXMuX3Nob3dDb250ZXh0TWVudShldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEFjdGlvbldvcmtmbG93KHJvd0RhdGEpOiBQcm9taXNlPGFueVtdIHwgdm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHdvcmtmbG93U2V0dGluZyA9IGF3YWl0IHRoaXMuZ2V0SXRlbVdvcmtmbG93U2V0dGluZyh0aGlzLnNldHRpbmcsIHJvd0RhdGEpO1xyXG4gICAgICAgIGlmICghd29ya2Zsb3dTZXR0aW5nKSByZXR1cm47XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFjdGlvbldvcmtmbG93QmFzZSh0aGlzLnNldHRpbmcsIHJvd0RhdGEsIHdvcmtmbG93U2V0dGluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0QWN0aW9uV29ya2Zsb3dCeVRhc2socm93RGF0YSk6IFByb21pc2U8YW55W10gfCB2b2lkPiB7XHJcbiAgICAgICAgaWYgKCFyb3dEYXRhLl9faXNHb3RDb25nVmllYykge1xyXG4gICAgICAgICAgICByb3dEYXRhLl9faXRlbUNvbmdWaWVjID0gKGF3YWl0IHRoaXMuX2NvbmdWaWVjU2VydmljZS5nZXREZXRhaWxCeUZpbHRlcihcclxuICAgICAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0ZpbHRlcignc2VydmljZUNvZGUnLCBPcGVyYXRvci5lcXVhbCwgdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnNlcnZpY2VDb2RlKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0ZpbHRlcignZW50aXR5JywgT3BlcmF0b3IuZXF1YWwsIHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5lbnRpdHlOYW1lKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0ZpbHRlcignZW50aXR5S2V5JywgT3BlcmF0b3IuZXF1YWwsIHJvd0RhdGEuaWQpXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICkpLmRhdGE7XHJcbiAgICAgICAgICAgIHJvd0RhdGEuX19pc0dvdENvbmdWaWVjID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcm93RGF0YSA9IHJvd0RhdGEuX19pdGVtQ29uZ1ZpZWM7XHJcbiAgICAgICAgaWYgKCFyb3dEYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd2luZ0FjdGlvbldvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0tow7RuZyB0w6xtIHRo4bqleSBi4bqjbiBnaGkgY8O0bmcgdmnhu4djIGfhuq9uIHbhu5tpIGLhuqNuIGdoaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByb3dEYXRhLl9fd29ya2Zsb3dDb2RlID0gcm93RGF0YS53b3JrZmxvd0NvZGU7XHJcblxyXG4gICAgICAgIGNvbnN0IHdvcmtmbG93UGVybWlzc2lvbkRldGFpbFNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoV29ya2Zsb3dQZXJtaXNzaW9uRGV0YWlsU2VydmljZSk7XHJcbiAgICAgICAgY29uc3QgdXNlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoVXNlclNlcnZpY2UpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmtmbG93UGVybWlzc2lvbkRldGFpbFNlcnZpY2UuY2hhbmdlRW5kcG9pbnQodGhpcy5fY29uZ1ZpZWNTZXJ2aWNlKVxyXG4gICAgICAgICAgICAuYXBwZW5kSW5mb0ZvcldvcmtmbG93KFxyXG4gICAgICAgICAgICAgICAgdXNlclNlcnZpY2UuZ2V0VXNlcklkQ29tYmluZSgpLCBbcm93RGF0YV1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICBpZiAocmVzdWx0ICE9PSB0cnVlKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dTZXR0aW5nID0gYXdhaXQgdGhpcy5fZG1Mb2FpQ29uZ1ZpZWNTZXJ2aWNlLmdldFdvcmtmbG93U2V0dGluZ0J5SWRMb2FpQ29uZ1ZpZWMocm93RGF0YS5pZExvYWlDb25nVmllYyk7XHJcblxyXG4gICAgICAgIGlmICh3b3JrZmxvd1NldHRpbmcgPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNydWRMaXN0U2V0dGluZyA9IG5ldyBDcnVkTGlzdFNldHRpbmcoKTtcclxuICAgICAgICB0aGlzLl9jb25nVmllY1NlcnZpY2UuYWRqdXN0U2V0dGluZ1dvcmtmbG93Rm9yQ3J1ZExpc3QoY3J1ZExpc3RTZXR0aW5nKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QWN0aW9uV29ya2Zsb3dCYXNlKGNydWRMaXN0U2V0dGluZywgcm93RGF0YSwgd29ya2Zsb3dTZXR0aW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXRBY3Rpb25Xb3JrZmxvd0Jhc2UoY3J1ZExpc3RTZXR0aW5nOiBDcnVkTGlzdFNldHRpbmcsIHJvd0RhdGEsIHdvcmtmbG93U2V0dGluZzogV29ya2Zsb3dTZXR0aW5nTmV3KTogUHJvbWlzZTxhbnlbXSB8IHZvaWQ+IHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRJdGVtID0gcm93RGF0YTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzID0gW107XHJcbiAgICAgICAgY29uc3QgYnV0dG9uQ29udGV4dHMgPSBbXTtcclxuICAgICAgICAvLyBO4bq/dSBrIGPDsyB3b3JrZmxvdyBjb2RlIG5naMSpYSBsw6AgY2jGsGEgY2jhuqF5IHF1eSB0csOsbmggaG/hurdjIHF1eSB0csOsbmggbOG7l2kgPT4gQ2hvIGNo4bqheSBs4bqhaVxyXG4gICAgICAgIGlmICghcm93RGF0YS5fX3dvcmtmbG93Q29kZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtV29ya2Zsb3dTZXR0aW5nID0gd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93cy5maW5kKHEgPT4gcS5jb2RlID09IHJvd0RhdGEuX193b3JrZmxvd0NvZGUpO1xyXG4gICAgICAgICAgICBpZiAoIWl0ZW1Xb3JrZmxvd1NldHRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoYEtow7RuZyB0w6xtIHRo4bqleSBxdXkgdHLDrG5oIGPDsyBtw6MgJHtyb3dEYXRhLl9fd29ya2Zsb3dDb2RlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBpdGVtV29ya2Zsb3dTZXR0aW5nLmRhdGEuYWN0aW9uc1tyb3dEYXRhLl9fdHJhbmdUaGFpXTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQWxsb3dzID0gKGF3YWl0IGNydWRMaXN0U2V0dGluZy5iYXNlU2VydmljZS5nZXRBY3Rpb25BbGxvdyhyb3dEYXRhLmlkKSkuZGF0YTtcclxuICAgICAgICAgICAgaWYgKGFjdGlvbkFsbG93cykge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uQWxsb3dzLmZvckVhY2goYWN0aW9uQ29kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gYWN0aW9ucy5maW5kKHEgPT4gcS5jb2RlID09IGFjdGlvbkNvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb1RodVR1OiBhY3Rpb24uc29UaHVUdSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkNvZGU6IGFjdGlvbi5jb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogdGhpcy5zb3VyY2VJY29uW2FjdGlvbi5pY29uXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb24ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMucHJvY2Vzc1dvcmtmbG93KGNydWRMaXN0U2V0dGluZywgaXRlbVdvcmtmbG93U2V0dGluZywgYWN0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIEzhu5dpIGsgbOG6pXkgxJHGsOG7o2MgYWN0aW9uIGFsbG93XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMuc29ydChtdWx0aXBsZVNvcnQoJ3NvVGh1VHUnKSk7XHJcbiAgICAgICAgICAgIC8vIEtp4buDbSB0cmEgbmfGsOG7nWkgY3Xhu5FpIGPDuW5nIHRo4buxYyBoaeG7h24gY8OzIHBo4bqjaSBuZ8aw4budaSBoaeG7h24gdOG6oWkga2jDtG5nIHRow6wgY2hvIHBow6lwIHJvbGxiYWNrXHJcbiAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93SGlzdG9yeVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoV29ya2Zsb3dIaXN0b3J5U2VydmljZSk7XHJcbiAgICAgICAgICAgIHdvcmtmbG93SGlzdG9yeVNlcnZpY2UuY2hhbmdlRW5kcG9pbnQodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcclxuICAgICAgICAgICAgY29uc3QgdXNlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoVXNlclNlcnZpY2UpO1xyXG4gICAgICAgICAgICBjb25zdCB1c2VySWQgPSB1c2VyU2VydmljZS5nZXRJZCgpO1xyXG4gICAgICAgICAgICBsZXQgdXNlcklkU3RyaW5nVXBwZXIgPSAnJztcclxuICAgICAgICAgICAgaWYgKHVzZXJJZCkge1xyXG4gICAgICAgICAgICAgICAgdXNlcklkU3RyaW5nVXBwZXIgPSB1c2VySWQudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgaXRlbVdvcmtmbG93SGlzdG9yeUxhc3QgPSAoYXdhaXQgd29ya2Zsb3dIaXN0b3J5U2VydmljZS5jaGFuZ2VFbmRwb2ludChjcnVkTGlzdFNldHRpbmcuYmFzZVNlcnZpY2UpLmdldExhc3RCeUl0ZW1JZChyb3dEYXRhLmlkKSkuZGF0YTtcclxuICAgICAgICAgICAgaWYgKGl0ZW1Xb3JrZmxvd0hpc3RvcnlMYXN0XHJcbiAgICAgICAgICAgICAgICAmJiBpdGVtV29ya2Zsb3dIaXN0b3J5TGFzdC5hY3Rpb25Db2RlICE9IE1hQWN0aW9uQmF0RGF1UXV5VHJpbmhcclxuICAgICAgICAgICAgICAgICYmIGl0ZW1Xb3JrZmxvd0hpc3RvcnlMYXN0LnVzZXJJZENyZWF0ZWQudG9VcHBlckNhc2UoKSA9PSB1c2VySWRTdHJpbmdVcHBlclxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRleHRzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAncGkgcGktcmVwbGF5JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdUaHUgaOG7k2knLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnJvbGxiYWNrV29ya2Zsb3coY3J1ZExpc3RTZXR0aW5nLCByb3dEYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMucHVzaChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpY29uOiAncGkgcGktY29tbWVudHMnLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ2hvIMO9IGtp4bq/bicsXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy5zaG93Rm9ybUNob1lLaWVuKGNydWRMaXN0U2V0dGluZywgcm93RGF0YSlcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3BpIHBpLWNhbGVuZGFyJyxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogQnV0dG9uVGV4dEFjdGlvbkNvbmdWaWVjLlhFTV9MSUNIX1NVLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudmlld0hpc3RvcnlXb3JrZmxvdyhjcnVkTGlzdFNldHRpbmcsIHJvd0RhdGEpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBidXR0b25Db250ZXh0cztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB2aWV3VGFza0RldGFpbChyb3dEYXRhKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbVRhc2sgPSAoYXdhaXQgdGhpcy5fY29uZ1ZpZWNTZXJ2aWNlLmdldERldGFpbEJ5RmlsdGVyKFtcclxuICAgICAgICAgICAgdGhpcy5uZXdGaWx0ZXIoJ2VudGl0eUtleScsIE9wZXJhdG9yLmVxdWFsLCByb3dEYXRhLmlkKVxyXG4gICAgICAgIF0pKS5kYXRhO1xyXG4gICAgICAgIGlmIChpdGVtVGFzayA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0tow7RuZyB0w6xtIHRo4bqleSBjw7RuZyB2aeG7h2MgZ+G6r24gduG7m2kgYuG6o24gZ2hpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRhc2tGb3JtTW9kZWw6IGFueSA9IHt9O1xyXG4gICAgICAgIHRhc2tGb3JtTW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLlZJRVc7XHJcbiAgICAgICAgdGFza0Zvcm1Nb2RlbC5kYXRhID0gaXRlbVRhc2s7XHJcbiAgICAgICAgdGhpcy5kZXRhaWxUYXNrTW9kZWwuZGF0YS50YXNrRm9ybU1vZGVsID0gdGFza0Zvcm1Nb2RlbDtcclxuICAgICAgICB0aGlzLmRldGFpbFRhc2tNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Nob3dDb250ZXh0TWVudShldnQpIHtcclxuICAgICAgICAvLyBzZXRUaW1lb3V0IMSR4buDIGZpeCBidWcgaGnhu4NuIHRo4buLIGNvbnRleHQgbWVudSB0csOgbiByYSBuZ2/DoGkgbcOgbiBow6xuaFxyXG4gICAgICAgIHNldFRpbWVvdXQoZiA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvdyhldnQpO1xyXG4gICAgICAgIH0sIDEwKTtcclxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcm9sbGJhY2tXb3JrZmxvdyhjcnVkTGlzdFNldHRpbmc6IENydWRMaXN0U2V0dGluZywgcm93RGF0YSkge1xyXG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93Q29uZmlybSgnQuG6oW4gY8OzIGNo4bqvYyBjaOG6r24gbXXhu5FuIGtow7RpIHBo4bulYyB0cuG6oW5nIHRow6FpIHRyxrDhu5tjIMSRw7MnKVxyXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXMpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNydWRMaXN0U2V0dGluZy5kaXNwbGF5RmllbGQgPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gcm93RGF0YVs8c3RyaW5nPihjcnVkTGlzdFNldHRpbmcuZGlzcGxheUZpZWxkKV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gKDxGdW5jdGlvbj4oY3J1ZExpc3RTZXR0aW5nLmRpc3BsYXlGaWVsZCkpKHJvd0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY3J1ZExpc3RTZXR0aW5nLmJhc2VTZXJ2aWNlLnJvbGxiYWNrKHJvd0RhdGEsIFtjcnVkTGlzdFNldHRpbmcub2JqZWN0TmFtZSwgbmFtZV0pXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCAnS2jDtGkgcGjhu6VjIHRy4bqhbmcgdGjDoWkgdHLGsOG7m2MgdGjDoG5oIGPDtG5nJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Sb2xsYmFja2VkV29ya2Zsb3cuZW1pdChyb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZWRTdGF0dXNXb3JrZmxvdy5lbWl0KHJvd0RhdGEuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHZpZXdIaXN0b3J5V29ya2Zsb3coY3J1ZExpc3RTZXR0aW5nOiBDcnVkTGlzdFNldHRpbmcsIHJvd0RhdGE6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHdvcmtmbG93U2V0dGluZyA9IGF3YWl0IHRoaXMuZ2V0SXRlbVdvcmtmbG93U2V0dGluZyhjcnVkTGlzdFNldHRpbmcsIHJvd0RhdGEpO1xyXG4gICAgICAgIGlmICghd29ya2Zsb3dTZXR0aW5nKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5jdXJyZW50SXRlbSA9IHJvd0RhdGE7XHJcbiAgICAgICAgdGhpcy53b3JrZmxvd0hpc3RvcnlNb2RlbC5kYXRhID0ge307XHJcbiAgICAgICAgdGhpcy53b3JrZmxvd0hpc3RvcnlNb2RlbC5kYXRhLnNldHRpbmcgPSBjcnVkTGlzdFNldHRpbmc7XHJcbiAgICAgICAgdGhpcy53b3JrZmxvd0hpc3RvcnlNb2RlbC5kYXRhLndvcmtmbG93U2V0dGluZyA9IHdvcmtmbG93U2V0dGluZztcclxuICAgICAgICB0aGlzLndvcmtmbG93SGlzdG9yeU1vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlSGlkZUhpc3RvcnlXb3JrZmxvdygpIHtcclxuICAgICAgICB0aGlzLnNob3dIaXN0b3J5V29ya2Zsb3cgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwcm9jZXNzV29ya2Zsb3coY3J1ZExpc3RTZXR0aW5nOiBDcnVkTGlzdFNldHRpbmcsIGl0ZW1Xb3JrZmxvd1NldHRpbmc6IGFueSwgd29ya2Zsb3dBY3Rpb246IFdmQWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKHdvcmtmbG93QWN0aW9uLm9wZW5OZXdUYWIpIHtcclxuICAgICAgICAgICAgbGV0IGRvbWFpbk5ld1RhYiA9IHdvcmtmbG93QWN0aW9uLmRvbWFpbk5ld1RhYjtcclxuICAgICAgICAgICAgaWYgKCFkb21haW5OZXdUYWIpIGRvbWFpbk5ld1RhYiA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKGAke2RvbWFpbk5ld1RhYn0vJHt3b3JrZmxvd0FjdGlvbi5saW5rTmV3VGFifSNfaXRlbUlkPSR7dGhpcy5jdXJyZW50SXRlbS5pZH1gLCAnX2JsYW5rJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF3b3JrZmxvd0FjdGlvbi5vcGVuUG9wdXApIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93V2FpdEJveCgpO1xyXG4gICAgICAgICAgICBjcnVkTGlzdFNldHRpbmcuYmFzZVNlcnZpY2UuY2hhbmdlU3RhdGVCYXNlQnlBY3Rpb24odGhpcy5jdXJyZW50SXRlbS5pZCwgd29ya2Zsb3dBY3Rpb24uY29kZSlcclxuICAgICAgICAgICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLmhhbmRsZVJlc3BvbnNlV2l0aFdhaXRCb3gocmVzLCAnJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9jZXNzZWRXb3JrZmxvd0Jhc2UoKTtcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhpZGVXYWl0Qm94KCkpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJvY2Vzc1dvcmtmbG93TW9kZWwuc2hvd0VkaXRGb3JtID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnByb2Nlc3NXb3JrZmxvd01vZGVsLmhlYWRlciA9IHdvcmtmbG93QWN0aW9uLm5hbWU7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzV29ya2Zsb3dNb2RlbC5kYXRhLnNldHRpbmcgPSBjcnVkTGlzdFNldHRpbmc7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzV29ya2Zsb3dNb2RlbC5kYXRhLmFjdGlvbiA9IHdvcmtmbG93QWN0aW9uO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc1dvcmtmbG93TW9kZWwuZGF0YS53b3JrZmxvdyA9IGl0ZW1Xb3JrZmxvd1NldHRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0Zvcm1DaG9ZS2llbihjcnVkTGlzdFNldHRpbmc6IENydWRMaXN0U2V0dGluZywgcm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jaG9ZS2llbk1vZGVsLmRhdGEucm93RGF0YSA9IHJvd0RhdGE7XHJcbiAgICAgICAgdGhpcy5jaG9ZS2llbk1vZGVsLmRhdGEuc2V0dGluZyA9IGNydWRMaXN0U2V0dGluZztcclxuICAgICAgICB0aGlzLmNob1lLaWVuTW9kZWwuc2hvd0VkaXRGb3JtID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdGFydFdvcmtmbG93KHJvd0RhdGEsIHdvcmtmbG93OiBXZkl0ZW0pIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2Uuc3RhcnRXb3JrZmxvdyhyb3dEYXRhLmlkLCB3b3JrZmxvdy5jb2RlKVxyXG4gICAgICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShyZXMsICdDaOG6oXkgcXV5IHRyw6xuaCB0aMOgbmggY8O0bmcnLCBmID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25TdGFydGVkV29ya2Zsb3cuZW1pdChyb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2VkU3RhdHVzV29ya2Zsb3cuZW1pdChyb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUHJvY2Vzc2VkV29ya2Zsb3dCYXNlKCkge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc1dvcmtmbG93TW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vblByb2Nlc3NlZFdvcmtmbG93LmVtaXQodGhpcy5jdXJyZW50SXRlbS5pZCk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZWRTdGF0dXNXb3JrZmxvdy5lbWl0KHRoaXMuY3VycmVudEl0ZW0uaWQpO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRCeVR5cGUoY29udHJvbFR5cGU6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChjb250cm9sVHlwZSA9PSAndHJhbmdUaGFpVjUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVHJhbmdUaGFpVjU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sVHlwZSA9PSAnX192aWV3SGlzdG9yeScpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVDb2xWaWV3SGlzdG9yeTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLl9jb21tb25TZXJ2aWNlLmZpbmRUZW1wbGF0ZUZyb21MaXN0KHRoaXMuY2hpbGRyZW4sIGNvbnRyb2xUeXBlKTtcclxuICAgICAgICBpZiAoIWl0ZW0gJiYgdGhpcy50ZW1wbGF0ZXMpIHtcclxuICAgICAgICAgICAgaXRlbSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZmluZFRlbXBsYXRlRnJvbUxpc3QodGhpcy50ZW1wbGF0ZXMsIGNvbnRyb2xUeXBlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0RmlsdGVycygpOiBGaWx0ZXJbXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyX2RlZmF1bHQpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5maWx0ZXJfZGVmYXVsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcl9jdXN0b20pIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5maWx0ZXJfY3VzdG9tKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyX2NvbHVtbikge1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmZpbHRlcl9jb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJfYWR2YW5jZVNlYXJjaCkge1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmZpbHRlcl9hZHZhbmNlU2VhcmNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRHcmlkSW5mbygpIHtcclxuICAgICAgICBjb25zdCBncmlkSW5mbyA9IG5ldyBHcmlkSW5mbyh7XHJcbiAgICAgICAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSxcclxuICAgICAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZVNpemVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5nZXRGaWx0ZXJzKCksXHJcbiAgICAgICAgICAgIHNvcnRzOiBbXSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdXBGaWVsZCAmJiAhdGhpcy5fZ3JvdXBJbkNsaWVudCkge1xyXG4gICAgICAgICAgICBncmlkSW5mby5zb3J0cy51bnNoaWZ0KHsgZmllbGQ6IHRoaXMuX2dyb3VwRmllbGQsIGRpcjogMSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3NvcnRGaWVsZCAmJiB0aGlzLl9zb3J0RGlyICE9PSAwKSB7XHJcbiAgICAgICAgICAgIGdyaWRJbmZvLnNvcnRzLnB1c2goeyBmaWVsZDogdGhpcy5fc29ydEZpZWxkLCBkaXI6IHRoaXMuX3NvcnREaXIgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZ3JpZEluZm87XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVNlYXJjaEFkdnMoZmlsdGVyczogRmlsdGVyW10pIHtcclxuICAgICAgICB0aGlzLmZpbHRlcl9hZHZhbmNlU2VhcmNoID0gZmlsdGVycztcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IDE7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlSW5pdEFkdmFuY2VTZWFyY2goZmlsdGVyczogRmlsdGVyW10pIHtcclxuICAgICAgICB0aGlzLmZpbHRlcl9hZHZhbmNlU2VhcmNoID0gZmlsdGVycztcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RGF0YSgpIHtcclxuICAgICAgICBjb25zdCBpbmZvR2V0RGF0YSA9IHRoaXMuZ2V0R3JpZEluZm8oKTtcclxuICAgICAgICB0aGlzLm9uUmVsb2FkLmVtaXQoaW5mb0dldERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZChmaWx0ZXJfY3VzdG9tPzogRmlsdGVyW10sIHBhZ2UgPSAxKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfY3VzdG9tID0gZmlsdGVyX2N1c3RvbTtcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZCgpIHtcclxuICAgICAgICB0aGlzLm9uQWRkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICB4dWF0Q2FjTXVjRGFDaG9uKCkge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5zZXR0aW5nLmV4cG9ydEl0ZW1zTW9kZSkge1xyXG4gICAgICAgICAgICBjYXNlIEV4cG9ydEl0ZW1zTW9kZS5Gcm9tSHRtbDpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0QnlSZWFkaW5nSHRtbCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRXhwb3J0SXRlbXNNb2RlLk1hbnVhbEdldERhdGE6XHJcbiAgICAgICAgICAgIGNhc2UgRXhwb3J0SXRlbXNNb2RlLkF1dG9HZXREYXRhOlxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdUaGUgZnVuY3Rpb24gaGF2ZW5cXCd0IHN1cHBvcnRlZCB5ZXQnKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZXhwb3J0QnlSZWFkaW5nSHRtbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0NoxrBhIGjhu5cgdHLhu6MgeHXhuqV0IGPDsyBuaMOzbSBk4buvIGxp4buHdSEnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMudGFibGUuZWwubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJsZUVsZSA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcigndGFibGUnKTtcclxuICAgICAgICBjb25zdCBoZWFkRWxlID0gdGFibGVFbGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgICAgICBjb25zdCBib2R5RWxlID0gdGFibGVFbGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuXHJcbiAgICAgICAgLy8gaGVhZGVyLlxyXG4gICAgICAgIGNvbnN0IGFyckhlYWQgPSB0aGlzLmdldEFyckhlYWRCeUh0bWwoaGVhZEVsZSk7XHJcbiAgICAgICAgaWYgKCFhcnJIZWFkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGJvZHkuXHJcbiAgICAgICAgY29uc3QgYXJyUm93RGF0YSA9IHRoaXMuZ2V0QXJyUm93RGF0YUJ5SHRtbChib2R5RWxlLCBhcnJIZWFkKTtcclxuXHJcbiAgICAgICAgLy8gZXhwb3J0LlxyXG4gICAgICAgIGNvbnN0IGRhdGFFeHBvcnQgPSBbYXJySGVhZC5tYXAoaSA9PiBpLnZhbHVlKSwgLi4uYXJyUm93RGF0YV07XHJcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBgRGFuaCBzw6FjaCAke3RoaXMuc2V0dGluZy5vYmplY3ROYW1lfWA7XHJcbiAgICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5vYmplY3RUb0V4Y2VsKGRhdGFFeHBvcnQsIGZpbGVOYW1lKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFyckhlYWRCeUh0bWwoaGVhZGVyKSB7XHJcbiAgICAgICAgY29uc3QgZmlyc3RSb3cgPSBoZWFkZXIucXVlcnlTZWxlY3RvcigndHInKTtcclxuICAgICAgICBpZiAoIWZpcnN0Um93KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhcnJUaCA9IGZpcnN0Um93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLnNldHRpbmcuaGlkZGVuQ2hlY2tib3ggPyAwIDogMTtcclxuICAgICAgICBjb25zdCBlbmRJbmRleCA9IGFyclRoLmxlbmd0aCAtICh0aGlzLnNldHRpbmcuaGlkZGVuRnVuY3Rpb25Db2x1bW4gPyAwIDogMSkgLSAxO1xyXG4gICAgICAgIGlmIChzdGFydEluZGV4ID4gZW5kSW5kZXgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhcnJIZWFkZXIgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChhcnJUaFtpXS5pbm5lclRleHQpIHtcclxuICAgICAgICAgICAgICAgIGFyckhlYWRlci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYXJyVGhbaV0uaW5uZXJUZXh0XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFyckhlYWRlcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QXJyUm93RGF0YUJ5SHRtbChib2R5RWxlLCBhcnJIZWFkKSB7XHJcbiAgICAgICAgY29uc3QgYXJyUm93ID0gYm9keUVsZS5xdWVyeVNlbGVjdG9yQWxsKCd0ci51aS1zdGF0ZS1oaWdobGlnaHQnKTtcclxuICAgICAgICBpZiAoIWFyclJvdy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYXJyUm93RGF0YSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyUm93Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGFyclJvd1tpXTtcclxuICAgICAgICAgICAgY29uc3QgYXJyVGQgPSByb3cucXVlcnlTZWxlY3RvckFsbCgndGQnKTtcclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRUZDtcclxuICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgYXJySGVhZC5mb3JFYWNoKGhlYWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFRkID0gYXJyVGRbaGVhZC5pbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRkLmlubmVyVGV4dCA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnB1c2godGhpcy5nZXRWYWx1ZUNoZWNrYm94Rm9ybWF0KGN1cnJlbnRUZCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wdXNoKGN1cnJlbnRUZC5pbm5lclRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGFyclJvd0RhdGEucHVzaChyb3dEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgO1xyXG5cclxuICAgICAgICByZXR1cm4gYXJyUm93RGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRWYWx1ZUNoZWNrYm94Rm9ybWF0KGRhdGEpIHtcclxuICAgICAgICBjb25zdCBjaGVja0JveCA9IGRhdGEucXVlcnlTZWxlY3RvcigncC1jaGVja2JveCcpO1xyXG4gICAgICAgIGlmIChjaGVja0JveCkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGEucXVlcnlTZWxlY3Rvcignc3Bhbi5waS1jaGVjaycpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnQ8OzJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnS2jDtG5nJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZpZXcocm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vblZpZXcuZW1pdChyb3dEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29weUxpbmsocm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vbkNvcHlMaW5rLmVtaXQocm93RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVkaXQocm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vbkVkaXQuZW1pdChyb3dEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlKHJvd0RhdGE6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25EZWxldGUuZW1pdChyb3dEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlTXV0aXBsZSgpIHtcclxuICAgICAgICB0aGlzLm9uRGVsZXRlTXVsdGlwbGUuZW1pdCh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb3B5TGlua011bHRpcGxlKCkge1xyXG4gICAgICAgIHRoaXMub25Db3B5TGlua011bHRpcGxlLmVtaXQodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGFuaFNvVGh1VHVHcm91cExhc3Rlc3QoKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnNvcnRHcm91cExhc3RNb2RlbEJhc2UoKVxyXG4gICAgICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShyZXMsICfEkMOhbmggbOG6oWkgc+G7kSB0aOG7qSB04buxIHRow6BuaCBjw7RuZycsIGYgPT4ge1xyXG5cclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dTaGFyZUxpbmtGb3JtKGxzdEl0ZW0pIHtcclxuICAgICAgICB0aGlzLnNoYXJlTGlua01vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaGFyZUxpbmtNb2RlbC5kYXRhLmxzdEl0ZW0gPSBsc3RJdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNyZWF0ZVNoYXJlTGluaygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5jaGVja1JlYWR5VG9UcmluaEt5KCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnxJBhbmcgdOG6o2kgZOG7ryBsaeG7h3UgZGFuaCBzw6FjaCwgY2jhu50gbeG7mXQgbMO6YyBy4buTaSB0aOG7rSBs4bqhaScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByb3dEYXRhID0gdGhpcy5yb3dEYXRhQ3VycmVudDtcclxuICAgICAgICB0aGlzLnNob3dTaGFyZUxpbmtGb3JtKFtyb3dEYXRhXSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY3JlYXRlU2hhcmVMaW5rTXVsdGlwbGUoKSB7XHJcbiAgICAgICAgdGhpcy5zaG93U2hhcmVMaW5rRm9ybSh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dBdHRhY2hlZFRhc2soKSB7XHJcbiAgICAgICAgdGhpcy5hdHRhY2hlZFRhc2tNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dDb250ZXh0TWVudShldnQsIHJvd0RhdGEpIHtcclxuICAgICAgICB0aGlzLnJvd0RhdGFDdXJyZW50ID0gcm93RGF0YTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzID0gdGhpcy5nZXRNZW51QnV0dG9uQXV0aG9yaXplZChhd2FpdCB0aGlzLm1lbnVCdXR0b25zKHJvd0RhdGEpKTtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5kaXNhYmxlU2hhcmUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hhcmVCdXR0b25zID0gW1xyXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0NoaWEgc+G6uycsIGljb246ICdwaSBwaS1saW5rJywgY29tbWFuZDogdGhpcy5jcmVhdGVTaGFyZUxpbmsuYmluZCh0aGlzKSB9LFxyXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0Rhbmggc8OhY2ggY2hpYSBz4bq7JywgaWNvbjogJ3BpIHBpLWxpc3QnLCBjb21tYW5kOiB0aGlzLnNob3dMaW5rU2hhcmluZy5iaW5kKHRoaXMpIH0sXHJcbiAgICAgICAgICAgICAgICAvLyB7IGxhYmVsOiAnRGFuaCBzw6FjaCBuaMOsbiB0aOG6pXknLCBpY29uOiAncGkgcGktbGlzdCcsIGNvbW1hbmQ6IHRoaXMuc2hvd0xpc3RQZXJtaXNzaW9uQnlJdGVtLmJpbmQodGhpcykgfVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzLnB1c2goLi4uc2hhcmVCdXR0b25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2hvd1dvcmtmbG93QXR0YWNoID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ19fc2hvd1dvcmtmbG93QXR0YWNoJyk7XHJcbiAgICAgICAgaWYgKHNob3dXb3JrZmxvd0F0dGFjaCA9PSAndHJ1ZScpIHtcclxuICAgICAgICAgICAgdGhpcy5idXR0b25Db250ZXh0cy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0Rhbmggc8OhY2ggY8O0bmcgdmnhu4djJywgaWNvbjogJ3BpIHBpLWxpc3QnLCBjb21tYW5kOiB0aGlzLnNob3dBdHRhY2hlZFRhc2suYmluZCh0aGlzKSB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5idXR0b25Db250ZXh0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nob3dDb250ZXh0TWVudShldnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdLaMO0bmcgY8OzIGjDoG5oIMSR4buZbmcga2jhuqMgZOG7pW5nJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TWVudUJ1dHRvbkF1dGhvcml6ZWQobWVudUJ1dHRvbnM6IFRuTWVudUl0ZW1bXSkge1xyXG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZWRCdXR0b25zOiBUbk1lbnVJdGVtW10gPSBbXTtcclxuICAgICAgICBjb25zdCBzZXJ2aWNlQ29kZUJ5QmFzZSA9IHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSAhPSBudWxsID8gdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnNlcnZpY2VDb2RlIDogJyc7XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1lbnVCdXR0b25zKSB7XHJcbiAgICAgICAgICAgIGlmICghaXRlbS5hdXRob3JpemF0aW9uUGVybWlzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgYXV0aG9yaXplZEJ1dHRvbnMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VDb2RlID0gaXRlbS5hdXRob3JpemF0aW9uU2VydmljZUNvZGUgPyBpdGVtLmF1dGhvcml6YXRpb25TZXJ2aWNlQ29kZSA6IHNlcnZpY2VDb2RlQnlCYXNlO1xyXG4gICAgICAgICAgICBjb25zdCBhdXRob3JpemVkID0gdGhpcy5fcGVybWlzc2lvblNlcnZpY2UuaXNBdXRob3JpemVkKHNlcnZpY2VDb2RlLCBpdGVtLmF1dGhvcml6YXRpb25QZXJtaXNzaW9uLCB0cnVlKTtcclxuICAgICAgICAgICAgaWYgKCFhdXRob3JpemVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhdXRob3JpemVkQnV0dG9ucy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXV0aG9yaXplZEJ1dHRvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2hlY2tBbGxfR3JvdXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZEFsbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMgPSBbLi4udGhpcy5tb2RlbC5kYXRhU291cmNlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZWRBbGwgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldExhc3RJdGVtU2VsZWN0ZWQoKTtcclxuICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2UuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS5fY2hlY2tlZCA9IHRoaXMuY2hlY2tlZEFsbDtcclxuICAgICAgICAgICAgdGhpcy5yb3dHcm91cENoZWNrZWRbaXRlbVt0aGlzLl9ncm91cEZpZWxkXV0gPSB0aGlzLmNoZWNrZWRBbGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5vbkNoZWNrQWxsLmVtaXQodGhpcy5jaGVja2VkQWxsKTtcclxuICAgIH07XHJcblxyXG4gICAgaGFuZGxlQ2hlY2tSb3dHcm91cCA9IChyb3dEYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBDaGVja2VkID0gdGhpcy5yb3dHcm91cENoZWNrZWRbcm93RGF0YVt0aGlzLl9ncm91cEZpZWxkXV0gPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1vZGVsLmRhdGFTb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuZGF0YVNvdXJjZVtpXVt0aGlzLl9ncm91cEZpZWxkXSA9PSByb3dEYXRhW3RoaXMuX2dyb3VwRmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2VbaV0uX2NoZWNrZWQgPSBncm91cENoZWNrZWQ7XHJcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZm91bmQpIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1vZGVsLmRhdGFTb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuZGF0YVNvdXJjZVtpXS5fY2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLnB1c2godGhpcy5tb2RlbC5kYXRhU291cmNlW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldExhc3RJdGVtU2VsZWN0ZWQoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUNoZWNrZWRBbGwoKTtcclxuICAgIH07XHJcblxyXG4gICAgaGFuZGxlQ2hlY2tSb3dEYXRhX0dyb3VwID0gKHJvd0RhdGEsIHRyRWxlbWVudCA9IG51bGwsIGZpcmVFdmVudCA9IHRydWUpID0+IHtcclxuICAgICAgICBpZiAoIXJvd0RhdGEuX2NoZWNrZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnJvd0dyb3VwQ2hlY2tlZFtyb3dEYXRhW3RoaXMuX2dyb3VwRmllbGRdXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5maW5kSW5kZXgocCA9PiBwLmlkID09IHJvd0RhdGEuaWQpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBjaGVja0dyb3VwID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLnB1c2gocm93RGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtID0gcm93RGF0YTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1vZGVsLmRhdGFTb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tb2RlbC5kYXRhU291cmNlW2ldLl9jaGVja2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuZGF0YVNvdXJjZVtpXVt0aGlzLl9ncm91cEZpZWxkXSA9PSByb3dEYXRhW3RoaXMuX2dyb3VwRmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrR3JvdXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yb3dHcm91cENoZWNrZWRbcm93RGF0YVt0aGlzLl9ncm91cEZpZWxkXV0gPSBjaGVja0dyb3VwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldExhc3RJdGVtU2VsZWN0ZWQoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUNoZWNrZWRBbGwoKTtcclxuICAgICAgICBpZiAoZmlyZUV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdHJFbGVtZW50KSB0ckVsZW1lbnQgPSB0aGlzLmdldFRyQnlSb3dEYXRhKHJvd0RhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbWl0Um93U2VsZWN0KHRyRWxlbWVudCwgcm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBoYW5kbGVDaGVja0FsbCA9ICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jaGVja2VkQWxsID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyA9IFsuLi50aGlzLm1vZGVsLmRhdGFTb3VyY2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlZEFsbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldExhc3RJdGVtU2VsZWN0ZWQoKTtcclxuICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2UuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS5fY2hlY2tlZCA9IHRoaXMuY2hlY2tlZEFsbCA9PT0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9uQ2hlY2tBbGwuZW1pdCh0aGlzLmNoZWNrZWRBbGwpO1xyXG4gICAgfTtcclxuXHJcbiAgICBoYW5kbGVDaGVja1Jvd0RhdGEgPSAocm93RGF0YSwgdHJFbGVtZW50ID0gbnVsbCwgZmlyZUV2ZW50ID0gdHJ1ZSkgPT4ge1xyXG4gICAgICAgIGlmICghcm93RGF0YS5fY2hlY2tlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbSA9IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmZpbmRJbmRleChwID0+IHAuaWQgPT0gcm93RGF0YS5pZCk7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFyb3dEYXRhLmhpZGRlbkNoZWNrQm94KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMucHVzaChyb3dEYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtID0gcm93RGF0YTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRMYXN0SXRlbVNlbGVjdGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDaGVja2VkQWxsKCk7XHJcbiAgICAgICAgaWYgKCF0ckVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdHJFbGVtZW50ID0gdGhpcy5nZXRUckJ5Um93RGF0YShyb3dEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpcmVFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbWl0Um93U2VsZWN0KHRyRWxlbWVudCwgcm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUNoZWNrZWRBbGwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aCAmJiB0aGlzLm1vZGVsLmRhdGFTb3VyY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZWRBbGwgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlZEFsbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZWxlY3RSb3coZGF0YXM6IGFueVtdID0gW10pIHtcclxuICAgICAgICBpZiAoIWRhdGFzIHx8IGRhdGFzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5oaWRkZW5DaGVja2JveCkge1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0SXRlbSA9IGRhdGFzW2RhdGFzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICBsYXN0SXRlbS5fY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ncm91cEZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cChsYXN0SXRlbSwgdGhpcy5nZXRUckJ5Um93RGF0YShsYXN0SXRlbSksIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGVja1Jvd0RhdGEobGFzdEl0ZW0sIHRoaXMuZ2V0VHJCeVJvd0RhdGEobGFzdEl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YXMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgIGRhdGEuX2NoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VwRmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cChkYXRhLCB0aGlzLmdldFRyQnlSb3dEYXRhKGRhdGEpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hlY2tSb3dEYXRhKGRhdGEsIHRoaXMuZ2V0VHJCeVJvd0RhdGEoZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU29ydChldmVudDogYW55LCBfdGFibGU6IFRhYmxlKSB7XHJcbiAgICAgICAgdGhpcy5zb3J0V2l0aEFwaShldmVudCwgX3RhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNvcnRXaXRoQXBpKGV2ZW50OiBhbnksIF90YWJsZTogVGFibGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMubW9kZWwubG9hZGluZykge1xyXG4gICAgICAgICAgICBfdGFibGUucmVzZXQoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc29ydEhpc3RvcnkubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvcnRGaWVsZCA9IGV2ZW50LmZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydERpciA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zb3J0SGlzdG9yeVswXS5maWVsZCA9PSBldmVudC5maWVsZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydEZpZWxkID0gZXZlbnQuZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29ydERpciA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvcnREaXIgPSAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3NvcnREaXIgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29ydERpciA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb3J0RGlyID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChldmVudC5maWVsZCAhPSB0aGlzLnNvcnRIaXN0b3J5WzBdLmZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0RmllbGQgPSBldmVudC5maWVsZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvcnREaXIgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRIaXN0b3J5LnVuc2hpZnQoeyBmaWVsZDogdGhpcy5fc29ydEZpZWxkLCBkaXI6IHRoaXMuX3NvcnREaXIgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNzRGF0YVNvdXJjZShkYXRhU291cmNlKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja2VkQWxsID0gbnVsbDtcclxuICAgICAgICB0aGlzLnJvd0dyb3VwQ2hlY2tlZCA9IHt9O1xyXG4gICAgICAgIGlmICghZGF0YVNvdXJjZSkgcmV0dXJuO1xyXG4gICAgICAgIGRhdGFTb3VyY2UuZm9yRWFjaChzb3VyY2UgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc291cmNlLmlkID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgc291cmNlLmlkID0gdGhpcy5fY29tbW9uU2VydmljZS5ndWlkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc291cmNlLm9ialN0eWxlQ2xhc3MgPSB7fTtcclxuICAgICAgICAgICAgaWYgKCFzb3VyY2UuY29sU3Bhbikge1xyXG4gICAgICAgICAgICAgICAgc291cmNlLmNvbFNwYW4gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5yb3dTcGFuKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2Uucm93U3BhbiA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghc291cmNlLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgc291cmNlLmhpZGRlbiA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2UuaXNOZXcpIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5vYmpTdHlsZUNsYXNzLmlzTmV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc291cmNlLmlzRXhwaXJpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5vYmpTdHlsZUNsYXNzLmV4cGlyaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc291cmNlLmNsYXNzKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2UuY2xhc3Muc3BsaXQoJyAnKS5maWx0ZXIocCA9PiBwKS5mb3JFYWNoKGNscyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLm9ialN0eWxlQ2xhc3NbY2xzXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzb3VyY2UuYm9va21hcmtTdHlsZSA9IHRoaXMuZ2V0Qm9va21hcmtDb2xvcihzb3VyY2UsIHRoaXMuc2V0dGluZy5jb2xzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hZHZhbmNlRGF0YS5maWVsZEhhc01heGltdW1MZW5ndGguZm9yRWFjaChfY29sID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IDxDb2x1bW5TY2hlbWFCYXNlPl9jb2w7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtjb2wuZmllbGRdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnN1YnN0cmluZyAmJiB2YWx1ZS5sZW5ndGggPiBjb2wubWF4TGVuZ3RoRGlzcGxheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHN2OiBzaG9ydCB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVtgJHtjb2wuZmllbGR9X19zdmBdID0gYCR7dmFsdWUuc3Vic3RyaW5nKDAsIGNvbC5tYXhMZW5ndGhEaXNwbGF5KX1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hZHZhbmNlRGF0YS5maWVsZEhhc01heGltdW1Xb3JkLmZvckVhY2goX2NvbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSA8Q29sdW1uU2NoZW1hQmFzZT5fY29sO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVTaG9ydFdvcmQgPSB0aGlzLnN1YldvcmQoc291cmNlW2NvbC5maWVsZF0sIGNvbC5tYXhXb3JkRGlzcGxheSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVTaG9ydFdvcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdjogc2hvcnQgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VbYCR7Y29sLmZpZWxkfV9fc3ZgXSA9IGAke3ZhbHVlU2hvcnRXb3JkfWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlUm93R3JvdXBNZXRhRGF0YShkYXRhU291cmNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3ViV29yZCh2YWx1ZTogc3RyaW5nLCB3b3JkQ291bnQ6IG51bWJlcikge1xyXG4gICAgICAgIGlmICghdmFsdWUgfHwgIXZhbHVlLnRyaW0pIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcclxuICAgICAgICBsZXQgaW5kZXggPSAtMSwgYmVmb3JlQ2hhciA9ICdhJztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZVtpXSA9PSAnJyAmJiBiZWZvcmVDaGFyICE9ICcnKSB7XHJcbiAgICAgICAgICAgICAgICB3b3JkQ291bnQtLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBiZWZvcmVDaGFyID0gdmFsdWVbaV07XHJcbiAgICAgICAgICAgIGlmICh3b3JkQ291bnQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMCwgaW5kZXgpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZVNob3dGdWxsKHJvd0RhdGEsIGZpZWxkKSB7XHJcbiAgICAgICAgcm93RGF0YVtmaWVsZCArICdfX3Nob3dGdWxsJ10gPSAhcm93RGF0YVtmaWVsZCArICdfX3Nob3dGdWxsJ107XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1lcmdlQ2xhc3NPYmooc291cmNlLCBvdGhlck9iaiA9IHt9KSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gc291cmNlLm9ialN0eWxlQ2xhc3M7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb3RoZXJPYmopIHtcclxuICAgICAgICAgICAgb2JqW2tleV0gPSBvdGhlck9ialtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250ZXh0Um93R3JvdXAocm93RGF0YSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJvd0RhdGEsXHJcbiAgICAgICAgICAgIHJvd0dyb3VwTWV0YWRhdGE6IHRoaXMucm93R3JvdXBNZXRhZGF0YSxcclxuICAgICAgICAgICAgZ3JvdXBDb2w6IHRoaXMuc2V0dGluZy5ncm91cENvbHVtbixcclxuICAgICAgICAgICAgZ3JvdXBGaWVsZDogdGhpcy5fZ3JvdXBGaWVsZCxcclxuICAgICAgICAgICAgZ3JvdXBJbkNsaWVudDogdGhpcy5fZ3JvdXBJbkNsaWVudFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbnRleHRSb3dHcm91cFJvb3Qocm93RGF0YSwgZXhwYW5kZWQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmdldENvbnRleHRSb3dHcm91cChyb3dEYXRhKSxcclxuICAgICAgICAgICAgZXhwYW5kZWQsXHJcbiAgICAgICAgICAgIGhhbmRsZUNoZWNrUm93R3JvdXA6IHRoaXMuaGFuZGxlQ2hlY2tSb3dHcm91cCxcclxuICAgICAgICAgICAgZ2V0Q29sU3Bhbkdyb3VwOiB0aGlzLmdldENvbFNwYW5Hcm91cCxcclxuICAgICAgICAgICAgdGFibGU6IHRoaXMudGFibGUsXHJcbiAgICAgICAgICAgIGNsYXNzUm93R3JvdXA6IHRoaXMuX2NsYXNzUm93R3JvdXAsXHJcbiAgICAgICAgICAgIGljb25Ub2dnbGVSb3dHcm91cDogdGhpcy5pY29uVG9nZ2xlUm93R3JvdXBcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250ZXh0Q2VsbChyb3dEYXRhLCByb3dJbmRleCwgY29sLCBleHBhbmRlZCwgJHRoaXMpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjcnVkTGlzdDogJHRoaXMsXHJcbiAgICAgICAgICAgIHJvd0RhdGEsXHJcbiAgICAgICAgICAgIHJvd0luZGV4LFxyXG4gICAgICAgICAgICBjb2wsXHJcbiAgICAgICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgIGV4cGFuZGVkLFxyXG4gICAgICAgICAgICBpY29uVG9nZ2xlUm93RGF0YTogdGhpcy5pY29uVG9nZ2xlUm93RGF0YVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENsYXNzUm93RGF0YU9mR3JvdXAocm93RGF0YSkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcclxuICAgICAgICBpZiAodGhpcy5jb250YWluU2VsZWN0SXRlbShyb3dEYXRhKSkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gJyB1aS1zdGF0ZS1oaWdobGlnaHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fZ3JvdXBGaWVsZCAhPT0gJycpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9ICcgaXMtY2hpbGQtZ3JvdXAnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocm93RGF0YS5jbGFzcykge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gJyAnICsgcm93RGF0YS5jbGFzcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC50cmltKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbnRhaW5TZWxlY3RJdGVtKGl0ZW0pIHtcclxuICAgICAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMuZmluZEluZGV4KHggPT4geCAmJiB4W3RoaXMuc2V0dGluZy5lbnRpdHlLZXldID09PSBpdGVtW3RoaXMuc2V0dGluZy5lbnRpdHlLZXldKSA+IC0xO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxUb3AoKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGJhcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxiYXIuc2Nyb2xsVG9Ub3AoMCwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxUb0JvdHRvbSgpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsYmFyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbGJhci5zY3JvbGxUb0JvdHRvbSgwLCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbk5leHQoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlICsgMTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblByZXYoZXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgPiAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlID0gdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgLSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbk9sZGVzdChldmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlID0gTWF0aC5jZWlsKHRoaXMubW9kZWwudG90YWwgLyB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZVNpemUpO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTGF0ZXN0KGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgPSAxO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRW1wdHlUb29sYmFyKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZXMuaXRlbShpKTtcclxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDggJiYgbm9kZXMuaXRlbShpKS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRW1wdHlGdW5jdGlvbkJ1dHRvbnMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBub2RlcyA9IGVsZW1lbnQuY2hpbGROb2RlcztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5pdGVtKGkpO1xyXG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gOCAmJiBub2Rlcy5pdGVtKGkpLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggIT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb21tb25TZXJ2aWNlLmZpbmRUZW1wbGF0ZUZyb21MaXN0KHRoaXMuY2hpbGRyZW4sIHRlbXBsYXRlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhc1RlbXBsYXRlKHRlbXBsYXRlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVbdGVtcGxhdGVOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVbdGVtcGxhdGVOYW1lXSA9IHRoaXMuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlW3RlbXBsYXRlTmFtZV0gIT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGVtcGxhdGUodGVtcGxhdGVOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZVt0ZW1wbGF0ZU5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVt0ZW1wbGF0ZU5hbWVdID0gdGhpcy5maW5kVGVtcGxhdGUodGVtcGxhdGVOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVbdGVtcGxhdGVOYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlUm93R3JvdXBNZXRhRGF0YShkYXRhU291cmNlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnJvd0dyb3VwTWV0YWRhdGEgPSB7fTtcclxuICAgICAgICBsZXQgaW5kZXhHcm91cCA9IDA7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBGaWVsZE5hbWU6IHN0cmluZyA9IHRoaXMuX2dyb3VwRmllbGQ7XHJcbiAgICAgICAgLy8gVOG6oW8gYuG7q2EgMSBncm91cCB2YWx1ZSBiZWZvcmVcclxuICAgICAgICBsZXQgcHJldmlvdXNHcm91cFZhbHVlID0gdGhpcy5fY29tbW9uU2VydmljZS5ndWlkKCk7XHJcbiAgICAgICAgaWYgKGdyb3VwRmllbGROYW1lICYmIGdyb3VwRmllbGROYW1lICE9ICcnKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IGRhdGFTb3VyY2VbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cFZhbHVlID0gcm93RGF0YVtncm91cEZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBWYWx1ZSAhPT0gcHJldmlvdXNHcm91cFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dHcm91cE1ldGFkYXRhW2dyb3VwVmFsdWVdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaSwgaW5kZXhHcm91cDogaW5kZXhHcm91cCsrLCBzaXplOiAxLCBpdGVtUm9vdDogcm93RGF0YSwgaXRlbXM6IFtyb3dEYXRhXVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5leHBhbmRlZFJvd0tleXNbZ3JvdXBWYWx1ZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzR3JvdXBWYWx1ZSA9IGdyb3VwVmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtR3JvdXAgPSB0aGlzLnJvd0dyb3VwTWV0YWRhdGFbZ3JvdXBWYWx1ZV07XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbUdyb3VwLnNpemUrKztcclxuICAgICAgICAgICAgICAgICAgICBpdGVtR3JvdXAuaXRlbXMucHVzaChyb3dEYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJvd0RhdGFbdGhpcy5maWVsZE9yZGVyXSA9IHRoaXMucm93R3JvdXBNZXRhZGF0YVtncm91cFZhbHVlXS5zaXplO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93U2V0dGluZ3MoKSB7XHJcbiAgICAgICAgdGhpcy5fc2hvd1NldHRpbmdzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TYXZlQ29sb3JTZXR0aW5ncyhkYXRhKSB7XHJcbiAgICAgICAgaWYgKGRhdGEuY29sb3JGaWx0ZXJUYWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjbG9uZUFyciA9IGRhdGEuY29sb3JGaWx0ZXJUYWJsZS5zbGljZSgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gY2xvbmVBcnIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjbG9uZUFycltpXS5maWx0ZXJWYWx1ZSA9PSAnJyB8fCBjbG9uZUFycltpXS5maWx0ZXJWYWx1ZSA9PSBudWxsIHx8IGNsb25lQXJyW2ldLmZpbHRlclZhbHVlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29sb3JGaWx0ZXJUYWJsZS5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkID0gZGF0YS5jb2xvckZpbHRlckZpZWxkO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5jb2xvckZpbHRlclRhYmxlID0gZGF0YS5jb2xvckZpbHRlclRhYmxlO1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5nc1Jvd0NvbG9yID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYWNoZUNvbG9yU2V0dGluZygpO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3JTZXR0aW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2F2ZVNldHRpbmdzKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMgPSBldmVudC5kZXRhaWxzO1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQgPSBldmVudC5zb3J0RmllbGQ7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydERpciA9IGV2ZW50LnNvcnREaXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RGlyID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEZpZWxkID0gZXZlbnQuZ3JvdXBGaWVsZDtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBJbkNsaWVudCA9IGV2ZW50Lmdyb3VwSW5DbGllbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uID0gdGhpcy5zZXR0aW5nLmNvbHMuZmluZChwID0+IHAuZmllbGQgPT0gZXZlbnQuZ3JvdXBGaWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4uZm9yY2VHZXREYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5ncm91cENvbHVtbiA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zYXZlQ29sdW1uU2V0dGluZygpO1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuZENvbHVtbnModGhpcy5zZXR0aW5nLmNvbHMpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1hdENvbHVtbnModGhpcy5zZXR0aW5nLmNvbHMpO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5Q29sdW1uU2V0dGluZygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2hvd1NldHRpbmdzID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRGVsZXRlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgdGhpcy5fc2hvd1NldHRpbmdzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcgPSBuZXcgQ29sdW1uU2V0dGluZygpO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlQ29sdW1uU2V0dGluZygpO1xyXG4gICAgICAgIHRoaXMuZXh0ZW5kQ29sdW1ucyh0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgdGhpcy5mb3JtYXRDb2x1bW5zKHRoaXMuc2V0dGluZy5jb2xzKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29sdW1uU2V0dGluZygpO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcHBseUNvbHVtblNldHRpbmcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwRmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uID0gdGhpcy5zZXR0aW5nLmNvbHMuZmluZChwID0+IHAuZmllbGQgPT0gdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5ncm91cENvbHVtbi5mb3JjZUdldERhdGEgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4ucmF3Q29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3JvdXBGaWVsZCA9IHRoaXMuc2V0dGluZy5ncm91cENvbHVtbi5yYXdDb2x1bW4uZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ncm91cEZpZWxkID0gdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uLmZpZWxkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdXBGaWVsZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fZ3JvdXBJbkNsaWVudCA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwSW5DbGllbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9ncm91cEZpZWxkID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NvcnRGaWVsZCA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnRGaWVsZDtcclxuICAgICAgICB0aGlzLl9zb3J0RGlyID0gdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydERpcjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwgJiYgdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nICYmIHRoaXMuX3NvcnRGaWVsZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRIaXN0b3J5ID0gW3sgZmllbGQ6IHRoaXMuX3NvcnRGaWVsZCwgZGlyOiB0aGlzLl9zb3J0RGlyID8gdGhpcy5fc29ydERpciA6IDAgfV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRIaXN0b3J5ID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q2VsbENsYXNzSGVhZGVyKGNvbCkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcclxuICAgICAgICBpZiAoY29sLmNlbGxDbGFzcykge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gY29sLmNlbGxDbGFzcztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb2wuc29ydCkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gJyBOb1NvcnRDb2x1bW4nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29sLmZpZWxkID09IHRoaXMuX3NvcnRGaWVsZCkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gJyBwLXNvcnRhYmxlLWNvbHVtbic7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb3J0RGlyICE9IDApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnIHAtaGlnaGxpZ2h0JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENvbHVtblN0eWxlKGNvbDogYW55LCBmb3JIZWFkZXIgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlOiBhbnkgPSB7fTtcclxuICAgICAgICBpZiAoY29sLmZpZWxkID09ICdtZXRhZGF0YVN0YXR1cycpIHtcclxuICAgICAgICAgICAgc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdjZW50ZXInO1xyXG4gICAgICAgICAgICBjb2wud2lkdGggPSAnOGVtJztcclxuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbC50ZXh0QWxpZ24gPT0gVGV4dEFsaWduLkxlZnQpIHtcclxuICAgICAgICAgICAgc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdsZWZ0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sLnRleHRBbGlnbiA9PSBUZXh0QWxpZ24uQ2VudGVyKSB7XHJcbiAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAnY2VudGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sLnRleHRBbGlnbiA9PSBUZXh0QWxpZ24uUmlnaHQpIHtcclxuICAgICAgICAgICAgc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdyaWdodCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWxpZ25DZW50ZXJDb2x1bW4oY29sKSkge1xyXG4gICAgICAgICAgICBzdHlsZVsndGV4dC1hbGlnbiddID0gJ2NlbnRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWxpZ25SaWdodENvbHVtbihjb2wpKSB7XHJcbiAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAncmlnaHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGZvckhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdjZW50ZXInO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdsZWZ0JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3R5bGU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRCb29rbWFya0NvbG9yKHJvd0RhdGEsIGNvbHVtbnMpIHtcclxuICAgICAgICBjb25zdCByOiBhbnkgPSB7IGRpc3BsYXk6ICdub25lJyB9O1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJGaWVsZCAmJiB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJUYWJsZSkge1xyXG4gICAgICAgICAgICBsZXQgY29sO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGMgaW4gY29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbnNbY10uZmllbGQgPT0gdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyRmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2wgPSBjb2x1bW5zW2NdO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZm9yRGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgZm9yTnVtYmVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBmb3JCb29sID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHJvd0RhdGFbdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyRmllbGRdO1xyXG4gICAgICAgICAgICBpZiAoY29sKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRhdGUgfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRhdGV0aW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmNvbnZlcnRUb0RhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvckRhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmludCB8fCBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZGVjaW1hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3JOdW1iZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmJvb2xlYW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgvdHJ1ZS9pKS50ZXN0KHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3JCb29sID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX2NvbG9yRmlsdGVyVGFibGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9jb2xvckZpbHRlclRhYmxlW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcGFyZVR5cGUgPSBpdGVtWzBdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3IgPSBpdGVtWzVdO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbHRlclZhbHVlOiBhbnkgPSBpdGVtWzFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvckRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZSA9IGl0ZW1bMl07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlID09IG51bGwpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9yTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVmFsdWUgPSBpdGVtWzNdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihmaWx0ZXJWYWx1ZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9yQm9vbCkgZmlsdGVyVmFsdWUgPSBpdGVtWzRdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb21wYXJlVHlwZSA9PSAncmVnZXgnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSArICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoZmlsdGVyVmFsdWUsICdpJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5tYXRjaChyZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYmFja2dyb3VuZCA9IHRoaXMuYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBhcmVUeXBlID09ICdlcXVhbHMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGZpbHRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuYmFja2dyb3VuZCA9IHRoaXMuYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wYXJlVHlwZSA9PSAnbm90RXF1YWxzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmJhY2tncm91bmQgPSB0aGlzLmJ1aWxkR3JhZGllbnRDb2xvcihjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29tcGFyZVR5cGUgPT0gJ2NvbnRhaW5zJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAnJztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoZmlsdGVyVmFsdWUsICdpJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLm1hdGNoKHJlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmJhY2tncm91bmQgPSB0aGlzLmJ1aWxkR3JhZGllbnRDb2xvcihjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29tcGFyZVR5cGUgPT0gJ25vdENvbnRhaW5zJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAnJztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoZmlsdGVyVmFsdWUsICdpJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5tYXRjaChyZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5iYWNrZ3JvdW5kID0gdGhpcy5idWlsZEdyYWRpZW50Q29sb3IoY29sb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBhcmVUeXBlID09ICdncmVhdGVyJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IGZpbHRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuYmFja2dyb3VuZCA9IHRoaXMuYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wYXJlVHlwZSA9PSAnbGl0dGVyJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IGZpbHRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuYmFja2dyb3VuZCA9IHRoaXMuYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb252ZXJ0VG9EYXRlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSAne25vd30nKSByZXR1cm4gRGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgneycpICYmIHZhbHVlLmVuZHNXaXRoKCdkfScpKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlLnJlcGxhY2UoJ3snLCAnJykucmVwbGFjZSgnZH0nLCAnJykpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCd7JykgJiYgdmFsdWUuZW5kc1dpdGgoJ2h9JykpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUucmVwbGFjZSgneycsICcnKS5yZXBsYWNlKCdofScsICcnKSk7XHJcbiAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIGRhdGUuc2V0SG91cnMoZGF0ZS5nZXRIb3VycygpICsgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgneycpICYmIHZhbHVlLmVuZHNXaXRoKCdtfScpKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlLnJlcGxhY2UoJ3snLCAnJykucmVwbGFjZSgnbX0nLCAnJykpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMoZGF0ZS5nZXRNaW51dGVzKCkgKyB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcvJykgPiAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUocGFydHNbMl0gKyAnLScgKyBwYXJ0c1sxXSArICctJyArIHBhcnRzWzBdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKCFpc05hTihkYXRlLmdldERhdGUoKSkpIHJldHVybiBkYXRlO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICR7Y29sb3J9IDAlLCAke2NvbG9yfTRkIDM1JSwgJHtjb2xvcn0xYSA2MCUsIHRyYW5zcGFyZW50IDEwMCUpYDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFsaWduQ2VudGVyQ29sdW1uKGNvbCkge1xyXG4gICAgICAgIHJldHVybiBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZGF0ZXRpbWUgfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRhdGUgfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmJvb2xlYW4gfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmVudW07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhbGlnblJpZ2h0Q29sdW1uKGNvbCkge1xyXG4gICAgICAgIHJldHVybiBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuaW50IHx8IGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kZWNpbWFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb2xTcGFuR3JvdXAgPSAobnVtT2ZDb2xDdXN0b206IG51bWJlciA9IDApID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nLmNvbHMuZmlsdGVyKHggPT4geC52aXNpYmxlID09PSBudWxsIHx8IHgudmlzaWJsZSA9PT0gdW5kZWZpbmVkIHx8IHgudmlzaWJsZSA9PT0gdHJ1ZSkubGVuZ3RoXHJcbiAgICAgICAgICAgICsgKHRoaXMuc2V0dGluZy5oaWRkZW5PcmRlckNvbHVtbiA/IDAgOiAxKVxyXG4gICAgICAgICAgICArICh0aGlzLnNldHRpbmcuaGlkZGVuRnVuY3Rpb25Db2x1bW4gPyAwIDogMSlcclxuICAgICAgICAgICAgLSBudW1PZkNvbEN1c3RvbTtcclxuICAgIH07XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVLZXlwcmVzc0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dCAmJiB0aGlzLmNvbnRleHQucm9vdC5kYXRhLmxpc3RRdWV1ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdFF1ZXVlID0gdGhpcy5jb250ZXh0LnJvb3QuZGF0YS5saXN0UXVldWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RRdWV1ZS5pbmRleE9mKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0UXVldWUuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy50aW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZU11bHRpcGxlRGVsZXRlKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZURlbGV0ZShpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNhYmxlTXVsdGlwbGVDb3B5TGluaygpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVDb3B5TGluayhpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNhYmxlRWRpdChyb3dEYXRhKSB7XHJcbiAgICAgICAgaWYgKHJvd0RhdGEuX19kaXNhYmxlRWRpdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuRWRpdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJvd0RhdGFbJ21ldGFkYXRhU3RhdHVzJ10gJiYgcm93RGF0YVsnbWV0YWRhdGFTdGF0dXMnXSAhPSAnMCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZUNvcHlMaW5rKHJvd0RhdGEpIHtcclxuICAgICAgICBpZiAocm93RGF0YS5fX2Rpc2FibGVDb3B5TGluaykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuQ29weUxpbmspIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyb3dEYXRhWydtZXRhZGF0YVN0YXR1cyddICYmIHJvd0RhdGFbJ21ldGFkYXRhU3RhdHVzJ10gIT0gJzAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2FibGVEZWxldGUocm93RGF0YSkge1xyXG4gICAgICAgIGlmIChyb3dEYXRhLl9fZGlzYWJsZURlbGV0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuRGVsZXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocm93RGF0YVsnbWV0YWRhdGFTdGF0dXMnXSAmJiByb3dEYXRhWydtZXRhZGF0YVN0YXR1cyddICE9ICcwJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93SGlzdG9yeShyb3dEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnNob3dIaXN0b3J5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldHRpbmcuaGlzdG9yeSA9IHJvd0RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dMaXN0VmVyc2lvbihyb3dEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnZlcnNpb25Nb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy52ZXJzaW9uTW9kZWwuaXRlbURhdGEgPSByb3dEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0V2lkdGhGdW5jdGlvbih0YWJsZSkge1xyXG4gICAgICAgIGlmICh0aGlzLndpZHRoRnVuY3Rpb25Db2x1bW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHdpZHRoSW5QaXhlbCA9IHRoaXMuX2RlZmF1bHRXaXRoRnVuY3Rpb25Db2x1bW47XHJcbiAgICAgICAgY29uc3QgdGQgPSB0YWJsZS5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RkW2NsYXNzKj1cImNvbHVtbi1mdW5jdGlvblwiXScpO1xyXG4gICAgICAgIGlmICh0ZCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbVRvUGl4Y2VsID0gdGhpcy5nZXRGb250U2l6ZUluUGl4ZWwodGQpO1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b25zID0gdGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGJ1dHRvbnMubGVuZ3RoICogMi40OyAvLyBidXR0b24gd2lkdGg6IDIuNHJlbVxyXG4gICAgICAgICAgICBjb25zdCB0bXBXaWR0aEluUGl4ZWwgPSB3aWR0aCAqIGVtVG9QaXhjZWwgKyA2OyAvLyA2IGxhIHRvbmcgcGFkZGluZyBsZWZ0LCByaWdodCBjdWEgdGhcclxuICAgICAgICAgICAgaWYgKHdpZHRoSW5QaXhlbCA8IHRtcFdpZHRoSW5QaXhlbCkge1xyXG4gICAgICAgICAgICAgICAgd2lkdGhJblBpeGVsID0gdG1wV2lkdGhJblBpeGVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0aCA9IHRhYmxlLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGhbY2xhc3MqPVwic2V0dGluZy1jZWxsXCJdJyk7XHJcbiAgICAgICAgaWYgKHRoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVtVG9QaXhjZWwgPSB0aGlzLmdldEZvbnRTaXplSW5QaXhlbCh0aCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbnMgPSB0aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gYnV0dG9ucy5sZW5ndGggKiAyLjQgLyAwLjg1OyAvLyBidXR0b24gd2lkdGg6IDIuNHJlbSwgZm9udC1zaXplIHRoIDAuODVyZW1cclxuICAgICAgICAgICAgY29uc3QgdG1wV2lkdGhJblBpeGVsID0gd2lkdGggKiBlbVRvUGl4Y2VsICsgNjsgLy8gNiBsYSB0b25nIHBhZGRpbmcgbGVmdCwgcmlnaHQgY3VhIHRoXHJcbiAgICAgICAgICAgIGlmICh3aWR0aEluUGl4ZWwgPCB0bXBXaWR0aEluUGl4ZWwpIHtcclxuICAgICAgICAgICAgICAgIHdpZHRoSW5QaXhlbCA9IHRtcFdpZHRoSW5QaXhlbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd2lkdGhGdW5jdGlvbkNvbHVtbiA9IGAke3dpZHRoSW5QaXhlbH1weCBgO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Rm9udFNpemVJblBpeGVsKGVsKSB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcihnZXRDb21wdXRlZFN0eWxlKGVsLCAnJykuZm9udFNpemUubWF0Y2goLygoXFxkfC4pKylweC8pWzFdKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwcm9jZXNzQmFzZURhdGEoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wcmVQcm9jZXNzRGF0YSh0aGlzLm1vZGVsLmRhdGFTb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgcHJlUHJvY2Vzc0RhdGEoZGF0YVNvdXJjZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgY29sSGFzUGlwZSA9IHRoaXMuc2V0dGluZy5jb2xzLmZpbHRlcih4ID0+IHgucGlwZSk7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29sSGFzUGlwZSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0oPFBpcGVUcmFuc2Zvcm0+Y29sLnBpcGUsIGNvbC5hc3luY1BpcGUsIGl0ZW1bY29sLmZpZWxkXSkudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbVtgcGlwZV9fJHtjb2wuZmllbGR9IGBdID0gcnM7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHRyYW5zZm9ybShwaXBlOiBQaXBlVHJhbnNmb3JtLCBhc3luY1BpcGU6IGJvb2xlYW4sIHZhbHVlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICBpZiAodGhpcy5jYWNoZWRUcmFuc2Zvcm1zW3ZhbHVlXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRUcmFuc2Zvcm1zW3ZhbHVlXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhc3luY1BpcGUpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsID0gYXdhaXQgcGlwZS50cmFuc2Zvcm0odmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZFRyYW5zZm9ybXNbdmFsdWVdID0gdmFsO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsID0gcGlwZS50cmFuc2Zvcm0odmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZFRyYW5zZm9ybXNbdmFsdWVdID0gdmFsO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlUm93T3JkZXJlZChldnQpIHtcclxuICAgICAgICB0aGlzLm9uUmVvcmRlcmVkLmVtaXQoZXZ0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd1NldHRpbmdSb3dDb2xvcigpIHtcclxuICAgICAgICB0aGlzLl9zaG93U2V0dGluZ3NSb3dDb2xvciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJ1aWxkRmlsdGVyQ29sdW1uKGNvbHM6IENvbHVtblNjaGVtYUJhc2VbXSkge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlRmlsdGVyID0gdGhpcy50ZW1wbGF0ZUZpbHRlcjtcclxuICAgICAgICBjb2xzLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbC5jb250cm9sVHlwZSA9PSBDb250cm9sVHlwZS5kcm9wZG93bikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbC5iYXNlU2VydmljZSB8fCAoY29sLmRhdGFTb3VyY2UgJiYgY29sLmRhdGFTb3VyY2UubGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sLmlzQXJyYXlGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpbHRlci5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHRoaXMuZ2V0RmllbGRGaWx0ZXIoY29sKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IuaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5RmllbGQ6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpbHRlci5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHRoaXMuZ2V0RmllbGRGaWx0ZXIoY29sKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IuaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGQ6IGNvbC5maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJTY2hlbWEuZHJvcGRvd25bY29sLmZpZWxkXSA9IG5ldyBEcm9wZG93bkNvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jb2wsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAnYm9keScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBgQ2jhu41uICR7Y29sLmxhYmVsfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkT25Jbml0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZlckxvYWQ6IGNvbC5pc1NlcnZlckxvYWRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhgQ2jGsGEgY+G6pXUgaMOsbmggYmFzZVNlcnZpY2UgaG/hurdjIGRhdGFTb3VyY2UgY2hvIGPhu5l0ICR7Y29sLmZpZWxkfTogJHtjb2wubGFiZWx9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmludCB8fCBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZGVjaW1hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRmlsdGVyLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHRoaXMuZ2V0RmllbGRGaWx0ZXIoY29sKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkZpZWxkOiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdldEZpZWxkRmlsdGVyKGNvbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IubG93ZXJUaGFuRXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRmllbGQ6IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRhdGUgfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRhdGV0aW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGaWx0ZXIucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogdGhpcy5nZXRGaWVsZEZpbHRlcihjb2wpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRmllbGQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jR2V0VmFsdWU6IGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gYWRkRGF5KGl0ZW0sIDEsIC0xKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHRoaXMuZ2V0RmllbGRGaWx0ZXIoY29sKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5sb3dlclRoYW5FcXVhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJGaWVsZDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNHZXRWYWx1ZTogaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkgKyAxLCAwLCAwLCAtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5ib29sZWFuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGaWx0ZXIucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogdGhpcy5nZXRGaWVsZEZpbHRlcihjb2wpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGQ6IGNvbC5maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpbHRlci5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdldEZpZWxkRmlsdGVyKGNvbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IuY29udGFpbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkOiBjb2wuZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRGaWVsZEZpbHRlcihjb2wpIHtcclxuICAgICAgICByZXR1cm4gY29sLmZpZWxkRmlsdGVyID8gY29sLmZpZWxkRmlsdGVyIDogY29sLmZpZWxkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250ZXh0Q3VzdG9tRmlsdGVyKCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0RmlsdGVyKGRlZmF1bHRGaWx0ZXIpIHtcclxuICAgICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkZWZhdWx0RmlsdGVyKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckRhdGFba2V5XSA9IGRlZmF1bHRGaWx0ZXJba2V5XTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyX2NvbHVtbiA9IHRoaXMuX2NydWRTZXJ2aWNlLmdldEZpbHRlckZyb21UZW1wbGF0ZSh0aGlzLnRlbXBsYXRlRmlsdGVyLCB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLmZpbHRlckRhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2VhcmNoID0gKG5vZGU/KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwubG9hZGluZykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlRmlsdGVyQm94Rm9jdXMobm9kZSk7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfY29sdW1uID0gdGhpcy5fY3J1ZFNlcnZpY2UuZ2V0RmlsdGVyRnJvbVRlbXBsYXRlKHRoaXMudGVtcGxhdGVGaWx0ZXIsIHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuZmlsdGVyRGF0YSkpO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlID0gMTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNaW5pbWl6ZURhdGEobW9kZWwpIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBpZiAobW9kZWwuX2Ryb3Bkb3dudmFsdWUgIT0gbnVsbCAmJiBtb2RlbC5fZHJvcGRvd252YWx1ZSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFttb2RlbC5fZHJvcGRvd252YWx1ZV07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gJ19zdGF0dXMnICYmIGtleSAhPSAnX2Vycm9ycycgJiYga2V5ICE9ICdfc291cmNlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRNaW5pbWl6ZURhdGEobW9kZWxba2V5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIGRhdGFba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnIgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLmdldE1pbmltaXplRGF0YShpdGVtKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobW9kZWwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kZWw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNsZWFyU2VhcmNoKG5vZGUsIGZpZWxkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwubG9hZGluZykgcmV0dXJuO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckRhdGFbZmllbGRdICE9IG51bGwgJiYgdGhpcy5maWx0ZXJEYXRhW2ZpZWxkXSAhPT0gJycpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhW2ZpZWxkXSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2gobm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZpbHRlckJveEZvY3VzKG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25DbGVhck51bWJlclNlYXJjaChub2RlLCBjb250cm9sKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwubG9hZGluZykgcmV0dXJuO1xyXG4gICAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLmNsZWFyKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgY2xlYXIgZGF0YSBiZWNhdXNlIGl0J3MgMiB3YXlzIGJpbmRpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWFyY2gobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUZpbHRlckJveEZvY3VzKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNsZWFyRGF0ZVNlYXJjaChub2RlLCBjb250cm9sLCBmaWVsZCkge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5jbGVhcigpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBuZWVkIGNsZWFyIGRhdGEgYmVjYXVzZSBub3QgMiB3YXlzIGJpbmRpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YVtmaWVsZF0gPSBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlYXJjaChub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmlsdGVyQm94Rm9jdXMobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ2hhbmdlRGF0ZVRpbWUoZXZ0LCBmaWVsZCkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyRGF0YVtmaWVsZF0gPSBldnQudmFsdWU7XHJcbiAgICAgICAgdGhpcy5vblNlYXJjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNoYW5nZUJvb2xlYW4oZXZ0LCBmaWVsZCkge1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckRhdGFbZmllbGRdLmxlbmd0aCA9PSAyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YVtmaWVsZF0uc3BsaWNlKDAsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uU2VhcmNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0NoZWNrQm94RmlsdGVyTWVudShldnQsIGZpZWxkKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50RmllbGRGaWx0ZXIgPSBmaWVsZDtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzID0gWy4uLnRoaXMuY2hlY2tCb3hDb250ZXh0TWVudV07XHJcbiAgICAgICAgdGhpcy5fc2hvd0NvbnRleHRNZW51KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoYW5nZUZpbHRlckJvb2xlYW4odmFsdWUpIHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhW3RoaXMuY3VycmVudEZpZWxkRmlsdGVyXSA9IFt2YWx1ZV07XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tCb3hDb250ZXh0TWVudS5mb3JFYWNoKG1lbnUgPT4gbWVudS5zdHlsZUNsYXNzID0gbnVsbCk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0JveENvbnRleHRNZW51WzBdLnN0eWxlQ2xhc3MgPSAnYWN0aXZlJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tCb3hDb250ZXh0TWVudVsxXS5zdHlsZUNsYXNzID0gJ2FjdGl2ZSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YVt0aGlzLmN1cnJlbnRGaWVsZEZpbHRlcl0gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uU2VhcmNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUZpbHRlckJveEZvY3VzKG5vZGUpIHtcclxuICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVFbDogYW55ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5TYW1lQm94ID0gdGhpcy5jaGVja0luTm9kZShhY3RpdmVFbCwgbm9kZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWluU2FtZUJveCB8fCAoYWN0aXZlRWwgJiYgYWN0aXZlRWwubm9kZU5hbWUgIT0gJ0lOUFVUJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5vZGUucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQpIGlucHV0LnNlbGVjdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5TYW1lQm94KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlRWwuc2VsZWN0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblNob3dGaWx0ZXJEcm9wZG93blBhbmVsKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKCFldmVudCB8fCAhZXZlbnQuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duID0gZXZlbnQuY29tcG9uZW50LmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY2VsbEhlYWRlckZpbHRlciA9IGRyb3Bkb3duLmNsb3Nlc3QoJ3RoJyk7XHJcblxyXG4gICAgICAgIC8vIHRoZW0gY2xhc3MgZm9jdXMtd2l0aGluIGRlIGRyb3Bkb3duIGlucHV0IGx1YyBmb2N1cyBraG9uZyBiaSBkZSBib2kgY2FjIHN0aWNreSBjb2x1bW5cclxuICAgICAgICBjZWxsSGVhZGVyRmlsdGVyICYmIGNlbGxIZWFkZXJGaWx0ZXIuY2xhc3NMaXN0LmFkZCgnZm9jdXMtd2l0aGluJyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25IaWRlRmlsdGVyRHJvcGRvd25QYW5lbChldmVudCkge1xyXG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93biA9IGV2ZW50LmNvbXBvbmVudC5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNlbGxIZWFkZXJGaWx0ZXIgPSBkcm9wZG93bi5jbG9zZXN0KCd0aCcpO1xyXG4gICAgICAgIGNlbGxIZWFkZXJGaWx0ZXIgJiYgY2VsbEhlYWRlckZpbHRlci5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1cy13aXRoaW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdEZpbHRlckJveEZvY3VzKG5vZGUpIHtcclxuICAgICAgICBpZiAobm9kZSAmJiBub2RlLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZS5vZmZzZXRXaWR0aCA8IDI1MCkge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdzaG9ydC1maWx0ZXItYm94Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3J0LWZpbHRlci1ib3gnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrSW5Ob2RlKGNoaWxkLCBwYXJlbnQpIHtcclxuICAgICAgICBsZXQgc3RhcnQgPSBjaGlsZDtcclxuICAgICAgICB3aGlsZSAoc3RhcnQgJiYgc3RhcnQucGFyZW50Tm9kZSAhPSBwYXJlbnQpIHtcclxuICAgICAgICAgICAgc3RhcnQgPSBzdGFydC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNhdmVQYWdlU2l6ZSgpIHtcclxuICAgICAgICB0aGlzLnNhdmVQYWdlU2V0dGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVUYWJsZVJlbmRlcmVkKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zdG9wQ2FsY3VsYXRpbmdGdW5jdGlvbkNvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlKSB0aGlzLmdldFdpZHRoRnVuY3Rpb24odGhpcy50YWJsZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b3BDYWxjdWxhdGluZ0Z1bmN0aW9uQ29sdW1uV2lkdGggPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCAkdGhGaXJzdCA9IHRoaXMudGFibGUuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCcpO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFRvcCA9ICR0aEZpcnN0Lm9mZnNldFRvcDtcclxuICAgICAgICBjb25zdCAkdGhzID0gdGhpcy50YWJsZS5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoZWFkIHRyOm5vdCg6Zmlyc3QtY2hpbGQpIHRoJyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkdGhzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICAgICR0aHNbaV0uc3R5bGUudG9wID0gYCR7JHRoc1tpXS5vZmZzZXRUb3AgLSBvZmZzZXRUb3B9cHhgO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTZWxlY3QgbOG6oWkgaXRlbSBjdeG7kWkgY8O5bmcgxJHGsOG7o2Mgc2VsZWN0IHRyxrDhu5tjIMSRw7NcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnJlU2VsZWN0TGFzdEl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtTGFzdCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJHRyID0gdGhpcy5nZXRUckJ5Um93RGF0YSh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbUxhc3QpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCR0cikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtTGFzdCA9IHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtTGFzdDtcclxuICAgICAgICAgICAgICAgICAgICAkdHIuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uUmVsb2FkZWQuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFRyQnlSb3dEYXRhKHJvd0RhdGEpIHtcclxuICAgICAgICBpZiAodGhpcy50YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubW9kZWwuZGF0YVNvdXJjZS5maW5kSW5kZXgocCA9PiBwLmlkID09IHJvd0RhdGEuaWQpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRhYmxlLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgdGJvZHkgdHJbcm93SW5kZXg9XCIke2luZGV4fVwiXWApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzaG93U2V0dGluZ3NQZXJtaXNzaW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNyZWF0aW5nU2VhcmNoSW5mbykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5nc1Blcm1pc3Npb24gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlU2VhcmNoU2NoZW1hKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29scyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0LhuqFuIGNoxrBhIGPhuqV1IGjDrG5oIGPhu5l0IGNobyBkYW5oIHPDoWNoJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3JlYXRpbmdTZWFyY2hJbmZvID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBzZWFyY2hJbmZvID0gbmV3IFNlYXJjaEluZm8oKTtcclxuICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYSA9IDxGb3JtQ29udHJvbEJhc2VbXT5bXTtcclxuICAgICAgICBzZWFyY2hJbmZvLmZpZWxkRHJvcGRvd24gPSB7fTtcclxuICAgICAgICBzZWFyY2hJbmZvLmZpZWxkU2VhcmNoVGV4dCA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuc2V0dGluZy5jb2xzKSB7XHJcbiAgICAgICAgICAgIGlmIChjb2wuYWxsb3dGaWx0ZXIgIT0gZmFsc2UgJiYgY29sLnJhd0NvbHVtbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLmZ1bGxUZXh0U2VhcmNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaEluZm8uZmllbGRTZWFyY2hUZXh0LmluZGV4T2YoY29sLmZpZWxkKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLmZpZWxkU2VhcmNoVGV4dC5wdXNoKGNvbC5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCA9ICdUw6xtIGtp4bq/bSB0aGVvIGPDoWMgdHLGsOG7nW5nOic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCArPSBgIFwiJHtjb2wubGFiZWwgPyBjb2wubGFiZWwgOiBjb2wuZmllbGR9XCIsYDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gYXdhaXQgdGhpcy5zZXR0aW5nLmZ1bmN0aW9uLmdldFNlYXJjaENvbnRyb2woY29sLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKC4uLmNvbnRyb2wpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5iYXNlU2VydmljZSB8fCAoY29sLmRhdGFTb3VyY2UgJiYgY29sLmRhdGFTb3VyY2UubGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5maWVsZERyb3Bkb3duW2NvbC5maWVsZF0gPSBuZXcgRHJvcGRvd25Db250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNvbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2wubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogY29sLm11bHRpcGxlID8gT3BlcmF0b3IuaW4gOiBPcGVyYXRvci5lcXVhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IGNvbC5tZFdpZHRoID8gY29sLm1kV2lkdGggOiAxMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRPbkluaXQ6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8uc2NoZW1hLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLmZpZWxkRHJvcGRvd25bY29sLmZpZWxkXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZGF0YVR5cGUgPT0gJ2ludCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbC5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrVHlwZTogJ2ludCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogNlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09ICdkZWNpbWFsJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29sLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tUeXBlOiAnZGVjaW1hbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogNlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09ICdkYXRlJyB8fCBjb2wuZGF0YVR5cGUgPT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGVUaW1lUmFuZ2VDb250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2wubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogNlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbC5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdmFsdWU6IHRydWUsIGxhYmVsOiBgQ8OzYCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZhbHVlOiBmYWxzZSwgbGFiZWw6IGBLaMO0bmdgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IuZXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogY29sLm1kV2lkdGggPyBjb2wubWRXaWR0aCA6IDEwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5maWVsZCAhPSBjb2wuZGF0YVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8uc2NoZW1hLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRDb250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbC5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmNvbnRhaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IGNvbC5tZFdpZHRoID8gY29sLm1kV2lkdGggOiAxMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VhcmNoSW5mby5maWVsZFNlYXJjaFRleHQpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBzZWFyY2hJbmZvLmZpZWxkU2VhcmNoVGV4dCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlYXJjaEluZm8uZmllbGRTZWFyY2hUZXh0LmluZGV4T2YoZmllbGQpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5maWVsZFNlYXJjaFRleHQucHVzaChmaWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWFyY2hJbmZvLnRvb2x0aXBTZWFyY2hUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQgPSAnVMOsbSBraeG6v20gdGhlbyBjw6FjIHRyxrDhu51uZzonO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLnNldHRpbmcubW9kZWxTY2hlbWFzLmZpbmQocCA9PiBwLmZpZWxkID09IGZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCArPSBgIFwiJHtjb2wubmFtZX1cIixgO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQpIHtcclxuICAgICAgICAgICAgc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCA9IHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQuc3Vic3RyaW5nKDAsIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VhcmNoSW5mbyA9IHNlYXJjaEluZm87XHJcbiAgICAgICAgdGhpcy5jcmVhdGluZ1NlYXJjaEluZm8gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd1NldHRpbmdzV29ya2Zsb3coKSB7XHJcbiAgICAgICAgdGhpcy5fc2hvd1NldHRpbmdzV29ya2Zsb3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93U2V0dGluZ3NXb3JrZmxvd05ldygpIHtcclxuICAgICAgICB0aGlzLndvcmtmbG93U2V0dGluZ01vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dMaW5rU2hhcmluZygpIHtcclxuICAgICAgICB0aGlzLnBlcm1pc3Npb25TaGFyaW5nTW9kZWwuc2hvd0VkaXRGb3JtID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd0xpc3RQZXJtaXNzaW9uQnlJdGVtKCkge1xyXG4gICAgICAgIHRoaXMucGVybWlzc2lvbkxpc3RNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNhdmVXb3JrZmxvd1NldHRpbmdzKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLndvcmtmbG93U2V0dGluZyA9IGV2ZW50O1xyXG4gICAgICAgIHRoaXMuX2NvbW1vblNlcnZpY2UucmVsb2FkUGFnZSgpO1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5nc1dvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2F2ZVdvcmtmbG93U2V0dGluZ3NOZXcoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy53b3JrZmxvd1NldHRpbmdNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jb21tb25TZXJ2aWNlLnJlbG9hZFBhZ2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25SZW1vdmVXb3JrZmxvd1NldHRpbmdzKGV2dCkge1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5nc1dvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ29Ub1Rhc2soZXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0No4bupYyBuxINuZyB4ZW0gY2hpIHRp4bq/dCBjw7RuZyB2aeG7h2MgeOG7rSBsw70gdOG7nSB0csOsbmggxJFhbmcgxJHGsOG7o2MgaG/DoG4gdGhp4buHbi4uLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkanVzdFBvc2l0aW9uTG9hZGluZ01hc2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLmxvYWRpbmcgfHwgdGhpcy5tb2RlbC5hZGp1c3RlZFBvc2l0aW9uTG9hZGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMudGFibGUuY29udGFpbmVyVmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGF0YXRhYmxlLWxvYWRpbmctb3ZlcmxheScpO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5jbG9zZXN0KCdwLXRhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZVNjcm9sbEJhckNvbnRlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVTY3JvbGxCYXJDb250ZW50LmNsYXNzTGlzdC5jb250YWlucygncHMtY29udGVudCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZVNjcm9sbEJhckNvbnRlbnQucGFyZW50Tm9kZS5wcmVwZW5kKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LnBhcmVudE5vZGUpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFRoID0gZWxlbWVudC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJ3AtdGFibGUgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgPiB0aCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0VGhTaXplID0gZmlyc3RUaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkaW5nSWNvbiA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGF0YXRhYmxlLWxvYWRpbmctaWNvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKGxvYWRpbmdJY29uKS5mb250U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wID0gKGZpcnN0VGhTaXplLmhlaWdodCAtIGZvbnRTaXplKSAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IChmaXJzdFRoU2l6ZS53aWR0aCAtIGZvbnRTaXplKSAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZ0ljb24uc3R5bGUubWFyZ2luVG9wID0gYCR7dG9wfXB4YDtcclxuICAgICAgICAgICAgICAgICAgICBsb2FkaW5nSWNvbi5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7bGVmdH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5hZGp1c3RlZFBvc2l0aW9uTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9LCAyMCk7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RQb3NpdGlvbkxvYWRpbmdNYXNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAyMCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tQZXJtaXNzaW9uVG9Vc2VCdXR0b24oYnV0dG9uUGVybWlzc2lvbkNvZGU6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHVzZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFVzZXJTZXJ2aWNlKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50VXNlciA9IHVzZXJTZXJ2aWNlLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRVc2VyLmlzc3VwZXJ1c2VyLnRvTG93ZXJDYXNlKCkgPT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYnV0dG9uUGVybWlzc2lvbk1hcC5nZXQoYCR7dGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnNlcnZpY2VDb2RlfS8ke3RoaXMuc2V0dGluZy5iYXNlU2VydmljZS5lbnRpdHlOYW1lfS8ke2J1dHRvblBlcm1pc3Npb25Db2RlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERyb3Bkb3duRGF0YXNvdXJjZShmaWVsZCwgZGF0YVNvdXJjZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlclNjaGVtYS5kcm9wZG93bltmaWVsZF0pIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJTY2hlbWEuZHJvcGRvd25bZmllbGRdLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|