@mediusinc/mng-commons 4.0.0-rc.1 → 4.0.0-rc.3
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/esm2022/index.mjs +12 -2
- package/esm2022/lib/api/utils/medius-rest.util.mjs +15 -7
- package/esm2022/lib/api/utils/object-serializer.util.mjs +8 -4
- package/esm2022/lib/components/action/action.component.mjs +16 -45
- package/esm2022/lib/components/action/editor/action-editor.component.mjs +60 -434
- package/esm2022/lib/components/action/editor/injector-context/action-editor-injector-context.component.mjs +394 -0
- package/esm2022/lib/components/action/index.mjs +2 -1
- package/esm2022/lib/components/action/localization/data-language-dropdown.component.mjs +6 -7
- package/esm2022/lib/components/action/models/action-component.model.mjs +1 -1
- package/esm2022/lib/components/action/models/action-execution.model.mjs +3 -6
- package/esm2022/lib/components/action/models/index.mjs +1 -2
- package/esm2022/lib/components/action/route/action-route.component.mjs +14 -30
- package/esm2022/lib/components/action/table/action-table.component.mjs +154 -0
- package/esm2022/lib/components/form/editor/form-editor.component.mjs +5 -11
- package/esm2022/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.mjs +1 -1
- package/esm2022/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +5 -5
- package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +6 -7
- package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +5 -5
- package/esm2022/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +1 -1
- package/esm2022/lib/components/layout/main-layout.component.mjs +21 -25
- package/esm2022/lib/components/layout/topbar.component.mjs +8 -8
- package/esm2022/lib/components/layoutV2/main-layout.component.mjs +13 -10
- package/esm2022/lib/components/layoutV2/menu-item.component.mjs +48 -5
- package/esm2022/lib/components/layoutV2/menu.component.mjs +13 -4
- package/esm2022/lib/components/layoutV2/services/main-layout.component.service.mjs +11 -2
- package/esm2022/lib/components/layoutV2/sidebar.component.mjs +5 -5
- package/esm2022/lib/components/layoutV2/topbar.component.mjs +7 -12
- package/esm2022/lib/components/notification/notification-wrapper.component.mjs +50 -0
- package/esm2022/lib/components/table/column-filter-full/column-filter-full.component.mjs +466 -0
- package/esm2022/lib/components/table/column-value/column-value.component.mjs +87 -0
- package/esm2022/lib/components/table/models/table.event.mjs +16 -0
- package/esm2022/lib/components/table/models/table.interface.mjs +2 -0
- package/esm2022/lib/components/table/table-column-filter-class/table-column-filter-class.pipe.mjs +25 -0
- package/esm2022/lib/components/table/table.component.mjs +717 -0
- package/esm2022/lib/components/tableview/index.mjs +1 -4
- package/esm2022/lib/components/tableview/route/tableview-route.abstract.component.mjs +5 -5
- package/esm2022/lib/components/tableview/route/tableview-route.component.mjs +3 -9
- package/esm2022/lib/components/tableview/tableview.component.mjs +18 -78
- package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +1 -1
- package/esm2022/lib/descriptors/editor/field-lookup.descriptor.mjs +1 -2
- package/esm2022/lib/descriptors/filter/filter.descriptor.mjs +20 -20
- package/esm2022/lib/descriptors/table/table.descriptor.mjs +16 -17
- package/esm2022/lib/descriptors/tableview/tableview.descriptor.mjs +1 -1
- package/esm2022/lib/directives/component.directive.mjs +8 -4
- package/esm2022/lib/helpers/coercion.mjs +8 -1
- package/esm2022/lib/models/action-editor.model.mjs +1 -1
- package/esm2022/lib/models/config.model.mjs +1 -1
- package/esm2022/lib/models/index.mjs +2 -2
- package/esm2022/lib/models/layout-config.model.mjs +2 -0
- package/esm2022/lib/models/view-container.model.mjs +1 -1
- package/esm2022/lib/provide-commons.mjs +7 -1
- package/esm2022/lib/registry/type.registry.mjs +2 -3
- package/esm2022/lib/router/route-builder.mjs +1 -1
- package/esm2022/lib/services/action/action-executor.service.mjs +725 -0
- package/esm2022/lib/services/action/component-action-executor.service.mjs +19 -0
- package/esm2022/lib/services/action/index.mjs +5 -0
- package/esm2022/lib/services/action/provide-action-executor.mjs +9 -0
- package/esm2022/lib/services/action/root-action-executor.service.mjs +18 -0
- package/esm2022/lib/services/commons.service.mjs +5 -5
- package/esm2022/lib/services/index.mjs +1 -3
- package/esm2022/lib/services/logger.service.mjs +2 -2
- package/esm2022/lib/services/view/index.mjs +3 -0
- package/esm2022/lib/services/view/provide-view-container.mjs +17 -0
- package/esm2022/lib/services/view/view-container.service.mjs +59 -0
- package/esm2022/lib/utils/date.util.mjs +33 -23
- package/esm2022/lib/utils/notification.util.mjs +9 -16
- package/esm2022/lib/utils/string.util.mjs +2 -2
- package/esm2022/lib/utils/tableview.util.mjs +2 -2
- package/fesm2022/mediusinc-mng-commons.mjs +4305 -4121
- package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
- package/index.d.ts +10 -1
- package/lib/components/action/action.component.d.ts +11 -17
- package/lib/components/action/editor/action-editor.component.d.ts +20 -80
- package/lib/components/action/editor/injector-context/action-editor-injector-context.component.d.ts +80 -0
- package/lib/components/action/index.d.ts +1 -0
- package/lib/components/action/localization/data-language-dropdown.component.d.ts +2 -3
- package/lib/components/action/models/action-component.model.d.ts +0 -2
- package/lib/components/action/models/action-execution.model.d.ts +6 -6
- package/lib/components/action/models/index.d.ts +0 -1
- package/lib/components/action/route/action-route.component.d.ts +6 -12
- package/lib/components/action/table/action-table.component.d.ts +50 -0
- package/lib/components/form/editor/form-editor.component.d.ts +4 -7
- package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +2 -4
- package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +0 -2
- package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +1 -3
- package/lib/components/layout/main-layout.component.d.ts +4 -7
- package/lib/components/layoutV2/main-layout.component.d.ts +4 -3
- package/lib/components/layoutV2/menu-item.component.d.ts +7 -3
- package/lib/components/layoutV2/menu.component.d.ts +2 -0
- package/lib/components/layoutV2/services/main-layout.component.service.d.ts +3 -0
- package/lib/components/layoutV2/sidebar.component.d.ts +1 -1
- package/lib/components/layoutV2/topbar.component.d.ts +2 -3
- package/lib/components/notification/notification-wrapper.component.d.ts +12 -0
- package/lib/components/{tableview/table → table}/column-filter-full/column-filter-full.component.d.ts +2 -2
- package/lib/components/{tableview/table → table}/column-value/column-value.component.d.ts +3 -3
- package/lib/components/{tableview/table → table}/models/table.interface.d.ts +3 -1
- package/lib/components/table/table-column-filter-class/table-column-filter-class.pipe.d.ts +8 -0
- package/lib/components/table/table.component.d.ts +122 -0
- package/lib/components/tableview/index.d.ts +0 -3
- package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +2 -3
- package/lib/components/tableview/route/tableview-route.component.d.ts +0 -3
- package/lib/components/tableview/tableview.component.d.ts +4 -20
- package/lib/descriptors/editor/editor.descriptor.d.ts +1 -1
- package/lib/descriptors/filter/filter.descriptor.d.ts +7 -7
- package/lib/descriptors/table/table.descriptor.d.ts +15 -12
- package/lib/descriptors/tableview/tableview.descriptor.d.ts +1 -1
- package/lib/directives/component.directive.d.ts +3 -2
- package/lib/models/action-editor.model.d.ts +11 -0
- package/lib/models/config.model.d.ts +3 -13
- package/lib/models/index.d.ts +1 -1
- package/lib/models/layout-config.model.d.ts +33 -0
- package/lib/models/view-container.model.d.ts +0 -25
- package/lib/router/route-builder.d.ts +1 -1
- package/lib/services/{action-executor.service.d.ts → action/action-executor.service.d.ts} +32 -31
- package/lib/services/action/component-action-executor.service.d.ts +9 -0
- package/lib/services/action/index.d.ts +4 -0
- package/lib/services/action/provide-action-executor.d.ts +2 -0
- package/lib/services/action/root-action-executor.service.d.ts +9 -0
- package/lib/services/index.d.ts +0 -2
- package/lib/services/view/index.d.ts +2 -0
- package/lib/services/view/provide-view-container.d.ts +2 -0
- package/lib/services/view/view-container.service.d.ts +32 -0
- package/lib/utils/date.util.d.ts +12 -2
- package/lib/utils/notification.util.d.ts +6 -6
- package/openapi/angular/README.mustache +226 -0
- package/openapi/angular/api.module.mustache +39 -0
- package/openapi/angular/api.service.mustache +253 -0
- package/openapi/angular/apiInterface.mustache +47 -0
- package/openapi/angular/apis.mustache +12 -0
- package/openapi/angular/configuration.mustache +128 -0
- package/openapi/angular/custom/base-api.service.mustache +14 -0
- package/openapi/angular/custom/helpers.mustache +71 -0
- package/openapi/angular/custom/modelSchema.mustache +46 -0
- package/openapi/angular/custom/schema.mustache +18 -0
- package/openapi/angular/encoder.mustache +20 -0
- package/openapi/angular/git_push.sh.mustache +57 -0
- package/openapi/angular/index.mustache +0 -0
- package/openapi/angular/licenseInfo.mustache +11 -0
- package/openapi/angular/model.mustache +16 -0
- package/openapi/angular/modelAlias.mustache +1 -0
- package/openapi/angular/modelEnum.mustache +24 -0
- package/openapi/angular/modelGeneric.mustache +14 -0
- package/openapi/angular/modelGenericAdditionalProperties.mustache +5 -0
- package/openapi/angular/modelGenericEnums.mustache +30 -0
- package/openapi/angular/modelOneOf.mustache +14 -0
- package/openapi/angular/modelTaggedUnion.mustache +21 -0
- package/openapi/angular/models.mustache +5 -0
- package/openapi/angular/ng-package.mustache +6 -0
- package/openapi/angular/package.mustache +39 -0
- package/openapi/angular/param.mustache +69 -0
- package/openapi/angular/tsconfig.mustache +28 -0
- package/openapi/angular/variables.mustache +9 -0
- package/openapi/{templates → node}/model.mustache +3 -17
- package/package.json +2 -2
- package/scss/mng-commons-dark-v2.scss +1 -1
- package/scss/mng-commons-light-v2.scss +1 -1
- package/scss/mng-overrides/_theme_datatable.scss +24 -10
- package/scss/v2/layout/layout.scss +2 -2
- package/scss/v2/layout/mng/_mng_layout_topbar.scss +2 -0
- package/scss/v2/layout/preloading.scss +8 -8
- package/scss/v2/theme/theme-base/mng/_mng_theme_datatable.scss +24 -9
- package/scss/v2/theme/theme-dark/_variables.scss +24 -12
- package/scss/v2/theme/theme-dark/blue/theme.scss +4 -4
- package/scss/v2/theme/theme-light/_variables.scss +23 -11
- package/scss/v2/theme/theme-light/blue/theme.scss +2 -2
- package/esm2022/lib/components/action/models/action-confirmation-service.model.mjs +0 -2
- package/esm2022/lib/components/tableview/models/index.mjs +0 -2
- package/esm2022/lib/components/tableview/models/table.event.mjs +0 -16
- package/esm2022/lib/components/tableview/table/column-filter-full/column-filter-full.component.mjs +0 -467
- package/esm2022/lib/components/tableview/table/column-value/column-value.component.mjs +0 -87
- package/esm2022/lib/components/tableview/table/models/index.mjs +0 -2
- package/esm2022/lib/components/tableview/table/models/table.interface.mjs +0 -2
- package/esm2022/lib/components/tableview/table/table.component.mjs +0 -752
- package/esm2022/lib/models/menu-config.model.mjs +0 -2
- package/esm2022/lib/services/action-executor.service.mjs +0 -747
- package/esm2022/lib/services/view-container.component.service.mjs +0 -65
- package/lib/components/action/models/action-confirmation-service.model.d.ts +0 -6
- package/lib/components/tableview/models/index.d.ts +0 -1
- package/lib/components/tableview/table/models/index.d.ts +0 -1
- package/lib/components/tableview/table/table.component.d.ts +0 -147
- package/lib/models/menu-config.model.d.ts +0 -15
- package/lib/services/view-container.component.service.d.ts +0 -36
- /package/lib/components/{tableview → table}/models/table.event.d.ts +0 -0
- /package/openapi/{templates → node}/models.mustache +0 -0
|
@@ -1,752 +0,0 @@
|
|
|
1
|
-
import { AsyncPipe, NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Injector, Input, Optional, Output, QueryList, Type, ViewChild, ViewChildren, inject } from '@angular/core';
|
|
3
|
-
import { FormsModule } from '@angular/forms';
|
|
4
|
-
import { ActivatedRoute, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';
|
|
5
|
-
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
6
|
-
import { FilterMatchMode } from 'primeng/api';
|
|
7
|
-
import { ButtonModule } from 'primeng/button';
|
|
8
|
-
import { MultiSelectModule } from 'primeng/multiselect';
|
|
9
|
-
import { SkeletonModule } from 'primeng/skeleton';
|
|
10
|
-
import { Table, TableModule } from 'primeng/table';
|
|
11
|
-
import { TooltipModule } from 'primeng/tooltip';
|
|
12
|
-
import { BehaviorSubject, Observable, ReplaySubject, isObservable, of } from 'rxjs';
|
|
13
|
-
import { filter, map } from 'rxjs/operators';
|
|
14
|
-
import { MediusQueryParam, MediusQueryParamBuilder, MediusQueryResult } from '../../../api/models';
|
|
15
|
-
import { MediusRestUtil } from '../../../api/utils';
|
|
16
|
-
import { TableDescriptorInst, TableDynamicDescriptorInst } from '../../../descriptors/table';
|
|
17
|
-
import { ActionPositionEnum, FilterMatchModeEnum, FilterTypeEnum, TablePaginationModeEnum, TableSizeEnum } from '../../../descriptors/types';
|
|
18
|
-
import { MngComponentDirective, MngTemplateDirective } from '../../../directives';
|
|
19
|
-
import { toObservable } from '../../../helpers/coercion';
|
|
20
|
-
import { MngClassMapPipe, MngI18nPropertyPipe, MngLocaleDefaultRowClassPipe } from '../../../pipes';
|
|
21
|
-
import { MngActionExecutorService, MngCommonsService, MngLocalStorageService, MngLoggerService } from '../../../services';
|
|
22
|
-
import { StylesUtil } from '../../../styles';
|
|
23
|
-
import { ErrorUtil, NotificationUtil } from '../../../utils';
|
|
24
|
-
import { TableviewUtil } from '../../../utils/tableview.util';
|
|
25
|
-
import { MngActionComponent } from '../../action';
|
|
26
|
-
import { ActionParameters } from '../../action/models';
|
|
27
|
-
import { MngTableCellClickEvent, MngTableLoadEvent } from '../models';
|
|
28
|
-
import { MngTableColumnFilterFullComponent } from './column-filter-full/column-filter-full.component';
|
|
29
|
-
import { MngTableColumnValueComponent } from './column-value/column-value.component';
|
|
30
|
-
import * as i0 from "@angular/core";
|
|
31
|
-
import * as i1 from "@angular/router";
|
|
32
|
-
import * as i2 from "@ngx-translate/core";
|
|
33
|
-
import * as i3 from "../../../services";
|
|
34
|
-
import * as i4 from "primeng/table";
|
|
35
|
-
import * as i5 from "primeng/api";
|
|
36
|
-
import * as i6 from "primeng/skeleton";
|
|
37
|
-
import * as i7 from "primeng/multiselect";
|
|
38
|
-
import * as i8 from "primeng/button";
|
|
39
|
-
import * as i9 from "primeng/tooltip";
|
|
40
|
-
import * as i10 from "@angular/forms";
|
|
41
|
-
export class MngTableComponent {
|
|
42
|
-
get filterMetadata() {
|
|
43
|
-
return this.filterMetadataSubject.value;
|
|
44
|
-
}
|
|
45
|
-
get filterMetadata$() {
|
|
46
|
-
return this.filterMetadataSubject.asObservable();
|
|
47
|
-
}
|
|
48
|
-
constructor(injector, router, route, translate, mngCommonsService, actionExecutor, viewContainerService, localStorageService) {
|
|
49
|
-
this.injector = injector;
|
|
50
|
-
this.router = router;
|
|
51
|
-
this.route = route;
|
|
52
|
-
this.translate = translate;
|
|
53
|
-
this.mngCommonsService = mngCommonsService;
|
|
54
|
-
this.actionExecutor = actionExecutor;
|
|
55
|
-
this.viewContainerService = viewContainerService;
|
|
56
|
-
this.localStorageService = localStorageService;
|
|
57
|
-
this.cmpTypeName = 'MngTableComponent';
|
|
58
|
-
this.logger = inject(MngLoggerService).create(this.cmpTypeName);
|
|
59
|
-
this.useQueryParams = false;
|
|
60
|
-
// extra features input
|
|
61
|
-
this.selectionMode = 'multiple';
|
|
62
|
-
this.selectionEnabled = false;
|
|
63
|
-
// actions
|
|
64
|
-
this.actions = []; // can be anything
|
|
65
|
-
this.columnActionMinWidth = null;
|
|
66
|
-
// event outputs
|
|
67
|
-
this.loadEventEmitter = new EventEmitter();
|
|
68
|
-
this.cellClickEventEmitter = new EventEmitter();
|
|
69
|
-
this.selectionChangeEventEmitter = new EventEmitter();
|
|
70
|
-
this.captionCmpInstEventEmitter = new EventEmitter();
|
|
71
|
-
this.columnActionCmpInstEventEmitter = new EventEmitter();
|
|
72
|
-
// data provider and items
|
|
73
|
-
this.isLazy = false;
|
|
74
|
-
this.isPagination = false;
|
|
75
|
-
this.useDataProvider = false;
|
|
76
|
-
this.useQueryParamsInitializedSubject = new BehaviorSubject(false);
|
|
77
|
-
this.useQueryParamsInitialized$ = this.useQueryParamsInitializedSubject.asObservable();
|
|
78
|
-
this.dataProviderInfiniteScrollItems = [];
|
|
79
|
-
this.itemsSubject = new ReplaySubject(1);
|
|
80
|
-
this.offset = 0;
|
|
81
|
-
this.multiSortMeta = null;
|
|
82
|
-
this.filterMetadataSubject = new BehaviorSubject({});
|
|
83
|
-
this.globalFilterFields = [];
|
|
84
|
-
// infinite scroll
|
|
85
|
-
this.infiniteScroll = false;
|
|
86
|
-
this.tableFullHeightOffset = null;
|
|
87
|
-
// selection
|
|
88
|
-
this.selection = [];
|
|
89
|
-
// data provider
|
|
90
|
-
this.dataProviderService = null;
|
|
91
|
-
this.dataProviderQueryResultSubject = new ReplaySubject(1);
|
|
92
|
-
this.dataProviderLoadingSubject = new ReplaySubject(1);
|
|
93
|
-
this.dataProviderLatestLazyLoadEventVersion = 0;
|
|
94
|
-
this.dataProviderLatestQueryParamVersion = 0;
|
|
95
|
-
// filter, sort
|
|
96
|
-
this.hasColumnFilters = false;
|
|
97
|
-
this.isFilterChanged = false;
|
|
98
|
-
this.isSortChanged = false;
|
|
99
|
-
this.filterDescriptors = [];
|
|
100
|
-
// actions
|
|
101
|
-
this.showInlineActionsColumn = false;
|
|
102
|
-
this.rowClickActions = [];
|
|
103
|
-
this.rowInlineActions = [];
|
|
104
|
-
// other
|
|
105
|
-
this.routerIsNavigationOutsideInProgress = false;
|
|
106
|
-
this.subscriptions = [];
|
|
107
|
-
this.areColumnsReorderable = false;
|
|
108
|
-
this.areColumnsToggleable = false;
|
|
109
|
-
this.columns = [];
|
|
110
|
-
this.visibleColumns = [];
|
|
111
|
-
this.layoutPreferences = { columnWidths: {} };
|
|
112
|
-
this.localstorageKey = '';
|
|
113
|
-
}
|
|
114
|
-
ngOnInit() {
|
|
115
|
-
this.initializeViewContainer();
|
|
116
|
-
// Used for configs within this method and is not dynamically set by TableDynamicDescriptor
|
|
117
|
-
const baseConfigDescriptor = this.initialDescriptor;
|
|
118
|
-
if (!(this.initialDescriptor instanceof TableDynamicDescriptorInst)) {
|
|
119
|
-
this.setMainAndRelatedDescriptors(this.initialDescriptor);
|
|
120
|
-
}
|
|
121
|
-
// map row settings
|
|
122
|
-
this.rows = baseConfigDescriptor?.defaultNumRows ?? 25;
|
|
123
|
-
this.rowsPerPageOptions = baseConfigDescriptor?.rowsPerPageOptions ?? [25, 50, 100];
|
|
124
|
-
// process actions
|
|
125
|
-
for (const action of this.actions) {
|
|
126
|
-
switch (action.position) {
|
|
127
|
-
case ActionPositionEnum.RowClick:
|
|
128
|
-
this.rowClickActions.push(action);
|
|
129
|
-
break;
|
|
130
|
-
case ActionPositionEnum.RowInline:
|
|
131
|
-
this.rowInlineActions.push(action);
|
|
132
|
-
break;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
this.showInlineActionsColumn = typeof this.columnActionComponent !== 'undefined' || this.rowInlineActions.length > 0;
|
|
136
|
-
// define all styles
|
|
137
|
-
this.className = baseConfigDescriptor?.className ?? '';
|
|
138
|
-
this.tableFullHeightOffset = baseConfigDescriptor?.tableFullHeightOffset ?? null;
|
|
139
|
-
this.rowHeight = baseConfigDescriptor?.rowHeight;
|
|
140
|
-
if (typeof this.isColumnClickable === 'undefined') {
|
|
141
|
-
// define if cell click is being observed via output
|
|
142
|
-
this.isColumnClickable = this.rowClickActions.length > 0 || this.cellClickEventEmitter.observed;
|
|
143
|
-
}
|
|
144
|
-
switch (baseConfigDescriptor?.size) {
|
|
145
|
-
case TableSizeEnum.Small:
|
|
146
|
-
this.className += ' p-datatable-sm';
|
|
147
|
-
break;
|
|
148
|
-
case TableSizeEnum.Large:
|
|
149
|
-
this.className += ' p-datatable-lg';
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
if (baseConfigDescriptor?.hasGridlines) {
|
|
153
|
-
this.className += ' p-datatable-gridlines';
|
|
154
|
-
}
|
|
155
|
-
if (baseConfigDescriptor && !this.columnActionMinWidth) {
|
|
156
|
-
this.columnActionMinWidth = StylesUtil.calculateTableColumnActionWidth(baseConfigDescriptor, this.rowInlineActions);
|
|
157
|
-
}
|
|
158
|
-
// check if infinite scroll
|
|
159
|
-
let paginationMode = TablePaginationModeEnum.None;
|
|
160
|
-
if (typeof baseConfigDescriptor?.paginationMode !== 'undefined') {
|
|
161
|
-
// descriptor choice is the most strong - if defined, use this value
|
|
162
|
-
paginationMode = baseConfigDescriptor.paginationMode;
|
|
163
|
-
}
|
|
164
|
-
else if (typeof this.dataProvider !== 'undefined') {
|
|
165
|
-
// when data provider is used, use pagination
|
|
166
|
-
paginationMode = TablePaginationModeEnum.Pagination;
|
|
167
|
-
}
|
|
168
|
-
if (paginationMode === TablePaginationModeEnum.InfiniteScroll) {
|
|
169
|
-
this.infiniteScroll = true;
|
|
170
|
-
this.tableFullHeightOffset = baseConfigDescriptor?.tableFullHeightOffset ?? 315;
|
|
171
|
-
this.rowHeight = baseConfigDescriptor?.rowHeight ?? 45;
|
|
172
|
-
this.useQueryParams = false;
|
|
173
|
-
}
|
|
174
|
-
else if (paginationMode === TablePaginationModeEnum.Pagination) {
|
|
175
|
-
this.isPagination = true;
|
|
176
|
-
}
|
|
177
|
-
// check if data provider is supplied, if is, use it primarily
|
|
178
|
-
if (this.dataProvider) {
|
|
179
|
-
// map subjects to observables and initiate data
|
|
180
|
-
this.useDataProvider = true;
|
|
181
|
-
this.isLazy = this.dataProvider.isLazy;
|
|
182
|
-
this.queryResult$ = this.dataProviderQueryResultSubject.asObservable();
|
|
183
|
-
this.loading$ = this.dataProviderLoadingSubject.asObservable();
|
|
184
|
-
const emptyQueryResult = new MediusQueryResult();
|
|
185
|
-
emptyQueryResult.pageData = [];
|
|
186
|
-
emptyQueryResult.allDataCount = 0;
|
|
187
|
-
this.dataProviderLoadingSubject.next(false);
|
|
188
|
-
this.dataProviderQueryResultSubject.next(emptyQueryResult);
|
|
189
|
-
// inject service
|
|
190
|
-
if (this.dataProvider.serviceType) {
|
|
191
|
-
this.dataProviderService = this.injector.get(this.dataProvider.serviceType);
|
|
192
|
-
}
|
|
193
|
-
const reloadSubscription = this.dataProvider.getAllReload$.subscribe({
|
|
194
|
-
next: () => {
|
|
195
|
-
this.reload();
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
this.subscriptions.push(reloadSubscription);
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
// if query result is provided, use it as secondary source or else try to use items
|
|
202
|
-
if (this.queryResult) {
|
|
203
|
-
this.queryResult$ = this.queryResult instanceof Observable ? this.queryResult : of(this.queryResult);
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
this.queryResult$ = (isObservable(this.items) ? this.items : this.itemsSubject.asObservable()).pipe(
|
|
207
|
-
// distinctUntilChanged((v1, v2) => v1.length === v2.length &&
|
|
208
|
-
// v1.every((v1i, idx) => v1i[this.descriptor.dataKeyProperty] === v2[idx][this.descriptor.dataKeyProperty])),
|
|
209
|
-
map(items => {
|
|
210
|
-
const queryResult = new MediusQueryResult();
|
|
211
|
-
queryResult.pageData = items;
|
|
212
|
-
queryResult.allDataCount = items.length;
|
|
213
|
-
return queryResult;
|
|
214
|
-
}));
|
|
215
|
-
if (!isObservable(this.items)) {
|
|
216
|
-
this.itemsSubject.next(this.items ?? []);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
if (typeof this.loading !== 'undefined') {
|
|
220
|
-
this.loading$ = this.loading instanceof Observable ? this.loading : of(this.loading);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
if (this.useQueryParams) {
|
|
224
|
-
const rowParams = this.route.snapshot.queryParamMap.get('rows');
|
|
225
|
-
const rows = rowParams ? parseInt(rowParams) : this.rows;
|
|
226
|
-
const mediusQueryParam = MediusRestUtil.get().fromAngularQueryParamsToMediusQueryParams(this.route.snapshot.queryParams, this.filterDescriptors, this.rows);
|
|
227
|
-
const event = {};
|
|
228
|
-
event.multiSortMeta = this.createSortMeta(mediusQueryParam) ?? undefined;
|
|
229
|
-
event.filters = this.createFilterMeta(mediusQueryParam);
|
|
230
|
-
event.rows = rows;
|
|
231
|
-
// first navigate to correct url with default filters/sorts
|
|
232
|
-
this.router
|
|
233
|
-
.navigate([], {
|
|
234
|
-
relativeTo: this.route,
|
|
235
|
-
replaceUrl: true,
|
|
236
|
-
queryParams: MediusRestUtil.get().fromPrimeLazyLoadEventToAngularQueryParams(event)
|
|
237
|
-
})
|
|
238
|
-
.then(() => {
|
|
239
|
-
this.initializeDataLoadingTriggers();
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
this.initializeDataLoadingTriggers();
|
|
244
|
-
}
|
|
245
|
-
this.queryResultSubscription = this.queryResult$.subscribe(e => (this.queryResult = e));
|
|
246
|
-
}
|
|
247
|
-
ngAfterContentInit() {
|
|
248
|
-
this.templates.forEach(template => {
|
|
249
|
-
switch (template.getType()) {
|
|
250
|
-
case 'caption':
|
|
251
|
-
this.captionTemplate = template.template;
|
|
252
|
-
break;
|
|
253
|
-
case 'columnAction':
|
|
254
|
-
this.columnActionTemplate = template.template;
|
|
255
|
-
if (!this.showInlineActionsColumn) {
|
|
256
|
-
this.showInlineActionsColumn = true;
|
|
257
|
-
}
|
|
258
|
-
break;
|
|
259
|
-
case 'footer':
|
|
260
|
-
this.footerTemplate = template.template;
|
|
261
|
-
break;
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
ngOnChanges(changes) {
|
|
266
|
-
if (changes['items'] && !changes['items'].firstChange && Array.isArray(changes['items'].currentValue)) {
|
|
267
|
-
this.itemsSubject.next(changes['items'].currentValue);
|
|
268
|
-
}
|
|
269
|
-
if (changes['viewContainerInit'] && !changes['viewContainerInit'].firstChange) {
|
|
270
|
-
this.initializeViewContainer();
|
|
271
|
-
}
|
|
272
|
-
if (this.globalFilterFieldsInit) {
|
|
273
|
-
this.globalFilterFields = this.globalFilterFieldsInit;
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
this.globalFilterFields = (this.descriptor || this.initialDescriptor).columns.map((el) => el.property);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
ngOnDestroy() {
|
|
280
|
-
this.dataProviderSubscription?.unsubscribe();
|
|
281
|
-
this.queryResultSubscription?.unsubscribe();
|
|
282
|
-
this.subscriptions.forEach(s => s.unsubscribe());
|
|
283
|
-
this.filterMetadataSubject.complete();
|
|
284
|
-
}
|
|
285
|
-
reload(emitEvent = false, resetParams = false) {
|
|
286
|
-
const queryParamsBuilder = resetParams
|
|
287
|
-
? MediusQueryParamBuilder.create(this.rows, 0)
|
|
288
|
-
: MediusQueryParamBuilder.createFromExisting(this.dataProviderLatestQueryParam ?? new MediusQueryParam())
|
|
289
|
-
.withItemsPerPage(this.rows)
|
|
290
|
-
.withItemsOffset(this.offset);
|
|
291
|
-
this.loadTableWithDataProvider(queryParamsBuilder.build(), emitEvent);
|
|
292
|
-
}
|
|
293
|
-
onTableLazyLoad(event) {
|
|
294
|
-
this.dataProviderLatestLazyLoadEvent = event;
|
|
295
|
-
this.dataProviderLatestLazyLoadEventVersion++;
|
|
296
|
-
if (this.useQueryParams) {
|
|
297
|
-
if (!event.multiSortMeta || event.multiSortMeta.length === 0) {
|
|
298
|
-
// add default sort meta to event if not multisort meta is present
|
|
299
|
-
event.multiSortMeta = this.createSortMeta() ?? undefined;
|
|
300
|
-
}
|
|
301
|
-
if (!event.filters) {
|
|
302
|
-
event.filters = this.createFilterMeta();
|
|
303
|
-
}
|
|
304
|
-
if (!this.routerIsNavigationOutsideInProgress) {
|
|
305
|
-
// this check is necessary: from some reason, primeNG commits one last lazy load event whenever any angular router navigation occurs
|
|
306
|
-
this.router.navigate([], {
|
|
307
|
-
relativeTo: this.route,
|
|
308
|
-
replaceUrl: true,
|
|
309
|
-
queryParams: MediusRestUtil.get().fromPrimeLazyLoadEventToAngularQueryParams(event)
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
const mediusQueryParams = event ? MediusRestUtil.get().fromPrimeLazyLoadEventToMediusQueryParams(event) : new MediusQueryParam();
|
|
315
|
-
this.loadTableWithDataProvider(mediusQueryParams);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
319
|
-
onTableSort(event) {
|
|
320
|
-
this.isSortChanged = true;
|
|
321
|
-
}
|
|
322
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
323
|
-
onTableFilter(event) {
|
|
324
|
-
this.isFilterChanged = true;
|
|
325
|
-
}
|
|
326
|
-
onCellClick(event, col, item, idx) {
|
|
327
|
-
const mngEvent = new MngTableCellClickEvent(col, item, idx);
|
|
328
|
-
this.cellClickEventEmitter.next(mngEvent);
|
|
329
|
-
if (this.rowClickActions.length) {
|
|
330
|
-
for (const action of this.rowClickActions) {
|
|
331
|
-
const idProp = this.descriptor?.trackProperty ?? action?.model?.idProperty;
|
|
332
|
-
const parameters = new ActionParameters(idProp ? item[idProp] : undefined, item)
|
|
333
|
-
.withRoute(this.route)
|
|
334
|
-
.withViewContainer(this.viewContainer)
|
|
335
|
-
.withSourceComponent(this);
|
|
336
|
-
this.actionExecutor.triggerAction(action, parameters, true);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
onSelectionChange(event) {
|
|
341
|
-
this.selectionChangeEventEmitter.emit(event);
|
|
342
|
-
}
|
|
343
|
-
onCaptionCmpInst(instance) {
|
|
344
|
-
this.captionCmpInstEventEmitter.next(instance);
|
|
345
|
-
}
|
|
346
|
-
onColumnActionCmpInst(instance) {
|
|
347
|
-
this.columnActionCmpInstEventEmitter.next(instance);
|
|
348
|
-
}
|
|
349
|
-
onActionFinish(runResult) {
|
|
350
|
-
if (!runResult.error) {
|
|
351
|
-
this.reload();
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* Method is called on column resize
|
|
356
|
-
* @param element event's element
|
|
357
|
-
*/
|
|
358
|
-
onTableColumnResize({ element }) {
|
|
359
|
-
const fieldId = element.id;
|
|
360
|
-
const width = element.offsetWidth;
|
|
361
|
-
const col = this.columns.find(el => el.descriptor.property === fieldId);
|
|
362
|
-
if (col)
|
|
363
|
-
col.width = width;
|
|
364
|
-
if (!this.layoutPreferences.columnWidths)
|
|
365
|
-
this.layoutPreferences.columnWidths = {};
|
|
366
|
-
this.layoutPreferences.columnWidths[fieldId] = width;
|
|
367
|
-
this.saveLayoutPreferences();
|
|
368
|
-
}
|
|
369
|
-
loadTableWithDataProvider(queryParam = null, emitEvent = true) {
|
|
370
|
-
if (!this.useDataProvider) {
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
this.dataProviderSubscription?.unsubscribe();
|
|
374
|
-
this.dataProviderLoadingSubject.next(true);
|
|
375
|
-
if (!queryParam) {
|
|
376
|
-
queryParam = MediusQueryParamBuilder.create(this.rows).build();
|
|
377
|
-
}
|
|
378
|
-
this.dataProviderLatestQueryParam = queryParam;
|
|
379
|
-
this.dataProviderLatestQueryParamVersion++;
|
|
380
|
-
MediusRestUtil.get().modifyFilterProperties(queryParam, this.filterDescriptors);
|
|
381
|
-
MediusRestUtil.get().modifySortProperties(queryParam, this.descriptor?.columns);
|
|
382
|
-
this.dataProviderSubscription = toObservable(this.dataProvider?.getAll(queryParam, this.dataProviderService, this.descriptor?.isLocalized ? this.mngCommonsService.appDataLanguage ?? undefined : undefined)).subscribe({
|
|
383
|
-
next: res => {
|
|
384
|
-
if (this.initialDescriptor instanceof TableDynamicDescriptorInst) {
|
|
385
|
-
this.setMainAndRelatedDescriptors(this.initialDescriptor.toTableDescriptorFromData(res ?? MediusQueryResult.fromArray([])));
|
|
386
|
-
}
|
|
387
|
-
if (this.infiniteScroll) {
|
|
388
|
-
if (this.isFilterChanged || this.isSortChanged) {
|
|
389
|
-
this.dataProviderInfiniteScrollItems = [];
|
|
390
|
-
}
|
|
391
|
-
this.dataProviderInfiniteScrollItems.splice(queryParam.itemsOffset ?? 0, queryParam.itemsPerPage ?? this.rows, ...(res?.pageData ?? []));
|
|
392
|
-
this.dataProviderInfiniteScrollItems = [...this.dataProviderInfiniteScrollItems];
|
|
393
|
-
}
|
|
394
|
-
else {
|
|
395
|
-
this.dataProviderQueryResultSubject.next(res ?? MediusQueryResult.fromArray([]));
|
|
396
|
-
}
|
|
397
|
-
this.isFilterChanged = false;
|
|
398
|
-
this.isSortChanged = false;
|
|
399
|
-
this.dataProviderLoadingSubject.next(false);
|
|
400
|
-
},
|
|
401
|
-
error: err => {
|
|
402
|
-
// TODO: check what happens on error with no model iniside descriptor
|
|
403
|
-
NotificationUtil.tableNotificationError(this.translate, this.descriptor, err, this.viewContainer);
|
|
404
|
-
const emptyQueryResult = new MediusQueryResult();
|
|
405
|
-
emptyQueryResult.pageData = [];
|
|
406
|
-
emptyQueryResult.allDataCount = 0;
|
|
407
|
-
this.dataProviderQueryResultSubject.next(emptyQueryResult);
|
|
408
|
-
this.dataProviderLoadingSubject.next(false);
|
|
409
|
-
const mngError = ErrorUtil.fromSubscribeError(err, 'MngTableComponentError', {
|
|
410
|
-
queryParam: queryParam
|
|
411
|
-
});
|
|
412
|
-
this.logger.log(mngError, ErrorUtil.getErrorLogLevel(mngError));
|
|
413
|
-
}
|
|
414
|
-
});
|
|
415
|
-
if (emitEvent) {
|
|
416
|
-
const mngEvent = new MngTableLoadEvent();
|
|
417
|
-
mngEvent.originalEvent = this.dataProviderLatestLazyLoadEvent;
|
|
418
|
-
mngEvent.queryParam = queryParam;
|
|
419
|
-
this.loadEventEmitter.next(mngEvent);
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
loadTableFromRouteUpdate(params) {
|
|
423
|
-
const mediusQueryParam = MediusRestUtil.get().fromAngularQueryParamsToMediusQueryParams(params, this.filterDescriptors, this.rows);
|
|
424
|
-
if (this.dataProviderLatestLazyLoadEventVersion < this.dataProviderLatestQueryParamVersion + 1) {
|
|
425
|
-
// update only if new version from query params will be higher
|
|
426
|
-
this.updatePrimeSortAndFilter(mediusQueryParam);
|
|
427
|
-
}
|
|
428
|
-
this.useQueryParamsInitializedSubject.next(true);
|
|
429
|
-
this.loadTableWithDataProvider(mediusQueryParam);
|
|
430
|
-
}
|
|
431
|
-
setMainAndRelatedDescriptors(descriptor) {
|
|
432
|
-
this.descriptor = descriptor;
|
|
433
|
-
this.filterDescriptors = this.descriptor?.columns.filter(c => typeof c.filterDescriptor !== 'undefined').map(c => c.filterDescriptor) ?? [];
|
|
434
|
-
this.hasColumnFilters = this.filterDescriptors.length > 0;
|
|
435
|
-
// get layout preferences if they exist
|
|
436
|
-
if (this.descriptor?.model.typeName) {
|
|
437
|
-
this.localstorageKey = TableviewUtil.generateTableLayoutPrefsKey(this.descriptor?.model.typeName, this.router.url, this.descriptor?.trackProperty);
|
|
438
|
-
const preferences = this.localStorageService.getItem(this.cmpTypeName, this.localstorageKey);
|
|
439
|
-
if (preferences && typeof preferences === 'object') {
|
|
440
|
-
if (preferences.columnWidths) {
|
|
441
|
-
this.layoutPreferences.columnWidths = preferences.columnWidths;
|
|
442
|
-
}
|
|
443
|
-
if (preferences.columnOrder && Array.isArray(preferences.columnOrder) && preferences.columnOrder.every((el) => typeof el === 'string')) {
|
|
444
|
-
this.layoutPreferences.columnOrder = preferences.columnOrder;
|
|
445
|
-
}
|
|
446
|
-
if (preferences.columnVisibility && Array.isArray(preferences.columnVisibility) && preferences.columnVisibility.every((el) => typeof el === 'string')) {
|
|
447
|
-
this.layoutPreferences.columnVisibility = preferences.columnVisibility;
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
// initialize columns with additional properties
|
|
452
|
-
if (this.descriptor?.columns) {
|
|
453
|
-
this.areColumnsReorderable = this.descriptor.columns.some(value => value.isReorderable);
|
|
454
|
-
this.areColumnsToggleable = this.descriptor.columns.some(value => value.isToggleable);
|
|
455
|
-
this.columns = this.descriptor.columns.map(col => ({
|
|
456
|
-
descriptor: col,
|
|
457
|
-
disabled: !col.isToggleable,
|
|
458
|
-
isVisible: this.layoutPreferences.columnVisibility ? this.layoutPreferences.columnVisibility.includes(col.property) : col.isVisible,
|
|
459
|
-
width: this.layoutPreferences.columnWidths?.[col.property]
|
|
460
|
-
}));
|
|
461
|
-
if (this.layoutPreferences.columnOrder) {
|
|
462
|
-
const newColumnOrder = [];
|
|
463
|
-
for (const colName of this.layoutPreferences.columnOrder) {
|
|
464
|
-
const foundCol = this.columns.find(el => el.descriptor.property === colName);
|
|
465
|
-
if (foundCol) {
|
|
466
|
-
newColumnOrder.push(foundCol);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
if (newColumnOrder.length === this.columns.length)
|
|
470
|
-
this.columns = newColumnOrder;
|
|
471
|
-
}
|
|
472
|
-
this.visibleColumns = this.columns.filter(el => el.isVisible);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
updatePrimeSortAndFilter(mediusQueryParam) {
|
|
476
|
-
this.multiSortMeta = this.createSortMeta(mediusQueryParam);
|
|
477
|
-
this.filterMetadataSubject.next(this.createFilterMeta(mediusQueryParam));
|
|
478
|
-
this.rows = mediusQueryParam?.itemsPerPage ?? this.rows;
|
|
479
|
-
this.offset = mediusQueryParam?.itemsOffset ?? 0;
|
|
480
|
-
}
|
|
481
|
-
createFilterMeta(mediusQueryParam) {
|
|
482
|
-
let params;
|
|
483
|
-
if (!mediusQueryParam) {
|
|
484
|
-
params = new MediusQueryParam();
|
|
485
|
-
}
|
|
486
|
-
else {
|
|
487
|
-
params = mediusQueryParam;
|
|
488
|
-
}
|
|
489
|
-
const primeFilterMeta = {};
|
|
490
|
-
// if any filter is present, no default filters should be applied!
|
|
491
|
-
const applyDefaultFilters = (params.filterParams?.length ?? 0) === 0;
|
|
492
|
-
this.filterDescriptors.forEach(f => {
|
|
493
|
-
let matchMode;
|
|
494
|
-
switch (f.filterType) {
|
|
495
|
-
case FilterTypeEnum.String:
|
|
496
|
-
matchMode = FilterMatchMode.CONTAINS;
|
|
497
|
-
break;
|
|
498
|
-
case FilterTypeEnum.Date:
|
|
499
|
-
matchMode = FilterMatchMode.DATE_IS;
|
|
500
|
-
break;
|
|
501
|
-
case FilterTypeEnum.Lookup:
|
|
502
|
-
case FilterTypeEnum.LookupEnum: {
|
|
503
|
-
const lookupFilter = f;
|
|
504
|
-
if (lookupFilter.multiselect) {
|
|
505
|
-
matchMode = FilterMatchMode.IN;
|
|
506
|
-
}
|
|
507
|
-
else {
|
|
508
|
-
matchMode = FilterMatchMode.EQUALS;
|
|
509
|
-
}
|
|
510
|
-
break;
|
|
511
|
-
}
|
|
512
|
-
default:
|
|
513
|
-
matchMode = FilterMatchMode.EQUALS;
|
|
514
|
-
break;
|
|
515
|
-
}
|
|
516
|
-
if (f.defaultFilterMatchMode) {
|
|
517
|
-
matchMode = f.defaultFilterMatchMode;
|
|
518
|
-
}
|
|
519
|
-
if (f.matchModes && !f.matchModes?.includes(matchMode)) {
|
|
520
|
-
matchMode = f.matchModes[0];
|
|
521
|
-
}
|
|
522
|
-
let value = null;
|
|
523
|
-
if (applyDefaultFilters) {
|
|
524
|
-
if (f.defaultValueTo && f.defaultValue) {
|
|
525
|
-
value = [f.defaultValue, f.defaultValueTo];
|
|
526
|
-
}
|
|
527
|
-
else if (f.defaultValue) {
|
|
528
|
-
value = f.defaultValue;
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
primeFilterMeta[f.property] = {
|
|
532
|
-
value: value,
|
|
533
|
-
matchMode: matchMode
|
|
534
|
-
};
|
|
535
|
-
});
|
|
536
|
-
params.filterParams?.forEach(f => {
|
|
537
|
-
const descriptor = this.filterDescriptors.find(fd => fd.filterProperty === f.property || fd.property === f.property);
|
|
538
|
-
const matchMode = f.filterMatchType && descriptor ? MediusRestUtil.get().getMapping(f.filterMatchType, descriptor.filterType, 2)?.[0] : FilterMatchModeEnum.Equals;
|
|
539
|
-
if (descriptor && matchMode) {
|
|
540
|
-
let filterValue = f.filterValue;
|
|
541
|
-
if (descriptor.filterType === FilterTypeEnum.Date && typeof filterValue !== 'undefined') {
|
|
542
|
-
if (typeof filterValue === 'string' || typeof filterValue === 'number') {
|
|
543
|
-
filterValue = new Date(filterValue);
|
|
544
|
-
}
|
|
545
|
-
// if range is provided, take that into account
|
|
546
|
-
if (typeof f.filterValueTo === 'string' || typeof f.filterValueTo === 'number') {
|
|
547
|
-
const filterValueTo = new Date(f.filterValueTo);
|
|
548
|
-
filterValue = [filterValue, filterValueTo];
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
primeFilterMeta[descriptor.property] = {
|
|
552
|
-
value: filterValue,
|
|
553
|
-
matchMode: matchMode
|
|
554
|
-
};
|
|
555
|
-
}
|
|
556
|
-
});
|
|
557
|
-
return primeFilterMeta;
|
|
558
|
-
}
|
|
559
|
-
createSortMeta(mediusQueryParam) {
|
|
560
|
-
let params;
|
|
561
|
-
if (!mediusQueryParam) {
|
|
562
|
-
params = new MediusQueryParam();
|
|
563
|
-
}
|
|
564
|
-
else {
|
|
565
|
-
params = mediusQueryParam;
|
|
566
|
-
}
|
|
567
|
-
let sortMeta;
|
|
568
|
-
const applyDefaultSorts = (params.sortProperty?.length ?? 0) === 0;
|
|
569
|
-
if (applyDefaultSorts && this.descriptor?.hasDefaultSort) {
|
|
570
|
-
sortMeta = this.descriptor.defaultSortProperty.map((p, idx) => ({
|
|
571
|
-
field: p,
|
|
572
|
-
order: this.descriptor.defaultSortAsc[idx] ? 1 : -1
|
|
573
|
-
}));
|
|
574
|
-
}
|
|
575
|
-
else {
|
|
576
|
-
sortMeta = [];
|
|
577
|
-
}
|
|
578
|
-
params.sortProperty?.forEach((s, idx) => {
|
|
579
|
-
const existingIndex = sortMeta.findIndex(value => value.field === s);
|
|
580
|
-
if (existingIndex > -1) {
|
|
581
|
-
sortMeta[existingIndex].order = params.sortAsc?.[idx] ?? true ? 1 : -1;
|
|
582
|
-
}
|
|
583
|
-
else {
|
|
584
|
-
sortMeta.push({
|
|
585
|
-
field: s,
|
|
586
|
-
order: params.sortAsc?.[idx] ?? true ? 1 : -1
|
|
587
|
-
});
|
|
588
|
-
}
|
|
589
|
-
});
|
|
590
|
-
return sortMeta.length === 0 ? null : sortMeta;
|
|
591
|
-
}
|
|
592
|
-
initializeDataLoadingTriggers() {
|
|
593
|
-
if (this.useQueryParams) {
|
|
594
|
-
// trigger table loads from route updates
|
|
595
|
-
const routeQpSubscription = this.route.queryParams.subscribe(qp => {
|
|
596
|
-
this.loadTableFromRouteUpdate(qp);
|
|
597
|
-
});
|
|
598
|
-
const routerEvSubscription = this.router.events
|
|
599
|
-
.pipe(filter(e => (e instanceof NavigationStart && e.url.split('?')[0].split('#')[0] !== this.router.url.split('?')[0].split('#')[0]) ||
|
|
600
|
-
e instanceof NavigationEnd ||
|
|
601
|
-
e instanceof NavigationCancel ||
|
|
602
|
-
e instanceof NavigationError))
|
|
603
|
-
.subscribe(e => {
|
|
604
|
-
this.routerIsNavigationOutsideInProgress = e instanceof NavigationStart;
|
|
605
|
-
});
|
|
606
|
-
this.subscriptions.push(routeQpSubscription);
|
|
607
|
-
this.subscriptions.push(routerEvSubscription);
|
|
608
|
-
}
|
|
609
|
-
else {
|
|
610
|
-
// load data immediately by creating default sorts and filters (primeng will trigger onLazyLoad event on sort&filter metadata change)
|
|
611
|
-
const defaultSort = this.createSortMeta();
|
|
612
|
-
if (!defaultSort || defaultSort.length > 0) {
|
|
613
|
-
this.multiSortMeta = defaultSort;
|
|
614
|
-
}
|
|
615
|
-
const defaultFilter = this.createFilterMeta();
|
|
616
|
-
if (defaultFilter) {
|
|
617
|
-
this.filterMetadataSubject.next(defaultFilter);
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
initializeViewContainer() {
|
|
622
|
-
this.viewContainer = this.viewContainerInit ?? this.viewContainerService ?? undefined;
|
|
623
|
-
}
|
|
624
|
-
onColumnToggle(event) {
|
|
625
|
-
if (event.itemValue) {
|
|
626
|
-
event.itemValue.isVisible = !event.itemValue.isVisible;
|
|
627
|
-
}
|
|
628
|
-
else {
|
|
629
|
-
for (const col of this.columns) {
|
|
630
|
-
col.isVisible = event.value.includes(col);
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
this.layoutPreferences.columnVisibility = this.visibleColumns.map(el => el.descriptor.property);
|
|
634
|
-
this.saveLayoutPreferences();
|
|
635
|
-
}
|
|
636
|
-
/**
|
|
637
|
-
* Propagates the column move from the this.visibleColumns array to this.columns array
|
|
638
|
-
* @param event: MultiSelectChangeEvent
|
|
639
|
-
*/
|
|
640
|
-
onColumnReorder(event) {
|
|
641
|
-
const col = this.visibleColumns[event.dropIndex];
|
|
642
|
-
const colIndex = this.columns.findIndex(el => el === col);
|
|
643
|
-
if (colIndex > -1) {
|
|
644
|
-
this.columns.splice(colIndex, 1);
|
|
645
|
-
const dropIndex = event.dropIndex > 0 ? this.columns.findIndex(el => el === this.visibleColumns[event.dropIndex - 1]) + 1 : 0;
|
|
646
|
-
this.columns = [...this.columns.slice(0, dropIndex), col, ...this.columns.slice(dropIndex)];
|
|
647
|
-
this.layoutPreferences.columnOrder = this.columns.map(el => el.descriptor.property);
|
|
648
|
-
this.saveLayoutPreferences();
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
saveLayoutPreferences() {
|
|
652
|
-
if (this.descriptor?.model.typeName) {
|
|
653
|
-
this.localStorageService.setItem(this.cmpTypeName, this.localstorageKey, this.layoutPreferences);
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
/**
|
|
657
|
-
* Reset column order and column visibility to default settings
|
|
658
|
-
*/
|
|
659
|
-
resetDefaultLayout() {
|
|
660
|
-
this.columns = this.descriptor ? this.descriptor.columns.map(col => ({ descriptor: col, disabled: !col.isToggleable, isVisible: col.isVisible })) : [];
|
|
661
|
-
this.visibleColumns = this.columns.filter(el => el.isVisible);
|
|
662
|
-
if (this.descriptor?.model.typeName) {
|
|
663
|
-
this.localStorageService.removeItem(this.cmpTypeName, this.localstorageKey);
|
|
664
|
-
}
|
|
665
|
-
this.layoutPreferences = {};
|
|
666
|
-
}
|
|
667
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: MngTableComponent, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.TranslateService }, { token: i3.MngCommonsService }, { token: i3.MngActionExecutorService }, { token: i3.MngViewContainerComponentService, optional: true }, { token: i3.MngLocalStorageService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
668
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.8", type: MngTableComponent, isStandalone: true, selector: "mng-table", inputs: { initialDescriptor: ["descriptor", "initialDescriptor"], items: "items", queryResult: "queryResult", loading: "loading", dataProvider: "dataProvider", useQueryParams: "useQueryParams", selectionMode: "selectionMode", selectionEnabled: "selectionEnabled", actions: "actions", isColumnClickable: "isColumnClickable", viewContainerInit: ["viewContainer", "viewContainerInit"], captionComponent: "captionComponent", columnActionComponent: "columnActionComponent", columnActionMinWidth: "columnActionMinWidth", globalFilterFieldsInit: ["globalFilterFields", "globalFilterFieldsInit"] }, outputs: { loadEventEmitter: "tableLoad", cellClickEventEmitter: "cellClick", selectionChangeEventEmitter: "selectionChange", captionCmpInstEventEmitter: "captionComponentInstance", columnActionCmpInstEventEmitter: "columnActionComponentInstance" }, queries: [{ propertyName: "templates", predicate: MngTemplateDirective }], viewQueries: [{ propertyName: "primeTable", first: true, predicate: Table, descendants: true }, { propertyName: "components", predicate: MngComponentDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [style.height]=\"tableFullHeightOffset ? 'calc(100vh - ' + tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n @if (!useQueryParams || (useQueryParamsInitialized$ | async)) {\n <p-table\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : (queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"descriptor?.trackProperty\"\n [lazy]=\"isLazy\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"isPagination && !infiniteScroll\"\n [rows]=\"infiniteScroll ? 20 : rows\"\n [first]=\"infiniteScroll ? 0 : offset\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"infiniteScroll ? undefined : rowsPerPageOptions\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"multiSortMeta\"\n [filters]=\"filterMetadata\"\n [globalFilterFields]=\"globalFilterFields\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled ? selectionMode : null\"\n [scrollable]=\"true\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualScrollItemSize]=\"rowHeight\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor?.hasHover ?? true\"\n [styleClass]=\"className\"\n [resizableColumns]=\"descriptor?.hasResizableColumns ?? false\"\n [columnResizeMode]=\"descriptor?.columnResizeMode ?? 'fit'\"\n [reorderableColumns]=\"areColumnsReorderable\"\n paginatorDropdownAppendTo=\"body\"\n [columns]=\"visibleColumns\"\n (onColResize)=\"onTableColumnResize($event)\"\n (onColReorder)=\"onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\">\n @if (captionTemplate || captionComponent || descriptor?.title) {\n <ng-template pTemplate=\"caption\">\n @if (captionTemplate) {\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n } @else if (captionComponent) {\n <div [mngComponent]=\"captionComponent\" (instanceCreated)=\"onCaptionCmpInst($event)\"></div>\n } @else {\n <h5 class=\"p-0 m-0\">{{ descriptor?.title }}</h5>\n }\n </ng-template>\n }\n <ng-template pTemplate=\"header\">\n @if (!descriptor?.hideHeader) {\n <tr class=\"mng-table-header\" [class]=\"descriptor?.headerClassName\">\n @if (selectionEnabled) {\n @if (selectionMode === 'multiple') {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n } @else {\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n }\n }\n @for (col of columns; track col) {\n @if (col.isVisible) {\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty: descriptor!.model) | translate }}\n <p-sortIcon [field]=\"col.descriptor.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty: descriptor!.model) | translate }}\n </ng-template>\n @if (col.descriptor.isReorderable) {\n <th\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (hasColumnFilters && col.descriptor.filterDescriptor ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n } @else {\n <th\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (hasColumnFilters && col.descriptor.filterDescriptor ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n }\n }\n }\n @if (showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable) {\n <th [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn [frozen]=\"descriptor?.actionColumnFrozen ?? true\" alignFrozen=\"right\" class=\"text-right\">\n @if (areColumnsToggleable || areColumnsReorderable || descriptor?.hasResizableColumns) {\n <p-multiSelect\n #columnToggleMultiselect\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n optionDisabled=\"disabled\"\n [filter]=\"false\"\n [options]=\"columns\"\n [(ngModel)]=\"visibleColumns\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n tooltipPosition=\"left\"\n placeholder=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\" [ngClass]=\"{'p-checkbox-disabled': !areColumnsToggleable}\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allSelected\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.onToggleAll($event)\"\n [disabled]=\"!areColumnsToggleable\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allSelected\"\n [ngClass]=\"{\n 'p-highlight': columnToggleMultiselect.allSelected,\n 'p-focus': columnToggleMultiselect.headerCheckboxFocus,\n 'p-disabled': !areColumnsToggleable\n }\"\n (click)=\"columnToggleMultiselect.onToggleAll($event)\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': columnToggleMultiselect.allSelected}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"resetDefaultLayout()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{ item.descriptor.title ?? (item.descriptor.property | i18nProperty: descriptor!.model) | translate }}\n </ng-template>\n </p-multiSelect>\n }\n </th>\n }\n </tr>\n }\n @if (hasColumnFilters) {\n <tr class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n @if (selectionEnabled) {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n }\n @for (col of columns; track col) {\n @if (col.isVisible) {\n <th\n [class]=\"\n (col.descriptor.filterDescriptor ? 'mng-column-filter-' + col.descriptor.filterDescriptor.filterType + ' ' : ' ') +\n col.descriptor.filterDescriptor?.columnClassName\n \"\n [style.width.%]=\"col.descriptor.filterDescriptor?.columnWidth ?? col.descriptor.width\"\n [style.min-width.px]=\"col.descriptor.filterDescriptor?.columnMinWidth ?? col.descriptor.minWidth\"\n [style.max-width.px]=\"col.descriptor.maxWidth\">\n @if (col.descriptor.filterDescriptor) {\n <div class=\"flex\">\n <mng-table-column-filter-full [descriptor]=\"col.descriptor.filterDescriptor\"></mng-table-column-filter-full>\n </div>\n }\n </th>\n }\n }\n @if (showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable) {\n <th [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn [frozen]=\"descriptor?.actionColumnFrozen ?? true\" alignFrozen=\"right\"></th>\n }\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr\n [style.height.px]=\"rowHeight\"\n [ngClass]=\"descriptor?.rowClassName | mngClassMapPipe: descriptor?.rowClassNameMapFn : item | mngLocaleDefaultRowClass: descriptor : item\">\n @if (selectionEnabled) {\n @if (selectionMode === 'multiple') {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n } @else {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n }\n }\n @for (col of columns; track col) {\n @if (col.isVisible) {\n <td\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n (col.descriptor.className | mngClassMapPipe: col.descriptor.classNameMapFn : item) +\n (hasColumnFilters && col.descriptor.filterDescriptor ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType : '')\n \"\n [class.clickable]=\"isColumnClickable\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">{{ col.descriptor.title ?? (col.descriptor.property | i18nProperty: descriptor!.model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n }\n }\n @if (showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable) {\n <td\n class=\"column-action justify-content-end text-right\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n @if (columnActionTemplate) {\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: {rowItem: item, rowIndex: idx}\"></ng-container>\n } @else if(columnActionComponent) {\n <span [mngComponent]=\"columnActionComponent!\" (instanceCreated)=\"onColumnActionCmpInst($event)\"></span>\n } @else {\n @for (action of rowInlineActions; track action) {\n <mng-action\n [action]=\"action\"\n [item]=\"item\"\n [viewContainer]=\"viewContainer\"\n [hostComponent]=\"this\"\n [itemId]=\"descriptor?.model?.idProperty ? item[descriptor!.model!.idProperty!] : null\"\n [actionData]=\"{itemIndex: idx}\"\n (finish)=\"onActionFinish($event)\">\n </mng-action>\n }\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n @if (descriptor?.loadingIcon) {\n <i [class]=\"'text-white text-4xl pi-spin ' + descriptor?.loadingIcon\"></i>\n }\n @if (descriptor?.loadingText) {\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': descriptor?.loadingIcon}\">\n {{ descriptor?.loadingText ?? '' | translate }}\n </div>\n }\n </div>\n </ng-template>\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n @if (footerTemplate) {\n <ng-template pTemplate=\"summary\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" [ngTemplateOutletContext]=\"{queryResult: queryResult}\"></ng-container>\n </ng-template>\n }\n </p-table>\n }\n</div>\n", dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i4.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i4.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i4.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i4.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i4.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i4.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: MngComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "inputs", "attachToHost"], outputs: ["instanceCreated"] }, { kind: "pipe", type: MngI18nPropertyPipe, name: "i18nProperty" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MngTableColumnValueComponent, selector: "mng-table-column-value", inputs: ["descriptor", "item"] }, { kind: "pipe", type: MngClassMapPipe, name: "mngClassMapPipe" }, { kind: "pipe", type: MngLocaleDefaultRowClassPipe, name: "mngLocaleDefaultRowClass" }, { kind: "component", type: MngActionComponent, selector: "mng-action", inputs: ["action", "item", "itemId", "actionData", "queryParam", "dataProvider", "hostComponent", "route", "disabled", "loading", "viewContainer", "selectedItems"], outputs: ["finish"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i6.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i7.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i8.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "size", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i9.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MngTableColumnFilterFullComponent, selector: "mng-table-column-filter-full", inputs: ["descriptor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
669
|
-
}
|
|
670
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: MngTableComponent, decorators: [{
|
|
671
|
-
type: Component,
|
|
672
|
-
args: [{ standalone: true, selector: 'mng-table', imports: [
|
|
673
|
-
AsyncPipe,
|
|
674
|
-
TableModule,
|
|
675
|
-
TranslateModule,
|
|
676
|
-
MngComponentDirective,
|
|
677
|
-
MngI18nPropertyPipe,
|
|
678
|
-
NgClass,
|
|
679
|
-
NgStyle,
|
|
680
|
-
NgTemplateOutlet,
|
|
681
|
-
MngTableColumnValueComponent,
|
|
682
|
-
MngClassMapPipe,
|
|
683
|
-
MngLocaleDefaultRowClassPipe,
|
|
684
|
-
MngActionComponent,
|
|
685
|
-
SkeletonModule,
|
|
686
|
-
MultiSelectModule,
|
|
687
|
-
ButtonModule,
|
|
688
|
-
TooltipModule,
|
|
689
|
-
FormsModule,
|
|
690
|
-
MngTableColumnFilterFullComponent
|
|
691
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [style.height]=\"tableFullHeightOffset ? 'calc(100vh - ' + tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n @if (!useQueryParams || (useQueryParamsInitialized$ | async)) {\n <p-table\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : (queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"descriptor?.trackProperty\"\n [lazy]=\"isLazy\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"isPagination && !infiniteScroll\"\n [rows]=\"infiniteScroll ? 20 : rows\"\n [first]=\"infiniteScroll ? 0 : offset\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"infiniteScroll ? undefined : rowsPerPageOptions\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"multiSortMeta\"\n [filters]=\"filterMetadata\"\n [globalFilterFields]=\"globalFilterFields\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled ? selectionMode : null\"\n [scrollable]=\"true\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualScrollItemSize]=\"rowHeight\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor?.hasHover ?? true\"\n [styleClass]=\"className\"\n [resizableColumns]=\"descriptor?.hasResizableColumns ?? false\"\n [columnResizeMode]=\"descriptor?.columnResizeMode ?? 'fit'\"\n [reorderableColumns]=\"areColumnsReorderable\"\n paginatorDropdownAppendTo=\"body\"\n [columns]=\"visibleColumns\"\n (onColResize)=\"onTableColumnResize($event)\"\n (onColReorder)=\"onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\">\n @if (captionTemplate || captionComponent || descriptor?.title) {\n <ng-template pTemplate=\"caption\">\n @if (captionTemplate) {\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n } @else if (captionComponent) {\n <div [mngComponent]=\"captionComponent\" (instanceCreated)=\"onCaptionCmpInst($event)\"></div>\n } @else {\n <h5 class=\"p-0 m-0\">{{ descriptor?.title }}</h5>\n }\n </ng-template>\n }\n <ng-template pTemplate=\"header\">\n @if (!descriptor?.hideHeader) {\n <tr class=\"mng-table-header\" [class]=\"descriptor?.headerClassName\">\n @if (selectionEnabled) {\n @if (selectionMode === 'multiple') {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n } @else {\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n }\n }\n @for (col of columns; track col) {\n @if (col.isVisible) {\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty: descriptor!.model) | translate }}\n <p-sortIcon [field]=\"col.descriptor.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty: descriptor!.model) | translate }}\n </ng-template>\n @if (col.descriptor.isReorderable) {\n <th\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (hasColumnFilters && col.descriptor.filterDescriptor ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n } @else {\n <th\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (hasColumnFilters && col.descriptor.filterDescriptor ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n }\n }\n }\n @if (showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable) {\n <th [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn [frozen]=\"descriptor?.actionColumnFrozen ?? true\" alignFrozen=\"right\" class=\"text-right\">\n @if (areColumnsToggleable || areColumnsReorderable || descriptor?.hasResizableColumns) {\n <p-multiSelect\n #columnToggleMultiselect\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n optionDisabled=\"disabled\"\n [filter]=\"false\"\n [options]=\"columns\"\n [(ngModel)]=\"visibleColumns\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n tooltipPosition=\"left\"\n placeholder=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\" [ngClass]=\"{'p-checkbox-disabled': !areColumnsToggleable}\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allSelected\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.onToggleAll($event)\"\n [disabled]=\"!areColumnsToggleable\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allSelected\"\n [ngClass]=\"{\n 'p-highlight': columnToggleMultiselect.allSelected,\n 'p-focus': columnToggleMultiselect.headerCheckboxFocus,\n 'p-disabled': !areColumnsToggleable\n }\"\n (click)=\"columnToggleMultiselect.onToggleAll($event)\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': columnToggleMultiselect.allSelected}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"resetDefaultLayout()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{ item.descriptor.title ?? (item.descriptor.property | i18nProperty: descriptor!.model) | translate }}\n </ng-template>\n </p-multiSelect>\n }\n </th>\n }\n </tr>\n }\n @if (hasColumnFilters) {\n <tr class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n @if (selectionEnabled) {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n }\n @for (col of columns; track col) {\n @if (col.isVisible) {\n <th\n [class]=\"\n (col.descriptor.filterDescriptor ? 'mng-column-filter-' + col.descriptor.filterDescriptor.filterType + ' ' : ' ') +\n col.descriptor.filterDescriptor?.columnClassName\n \"\n [style.width.%]=\"col.descriptor.filterDescriptor?.columnWidth ?? col.descriptor.width\"\n [style.min-width.px]=\"col.descriptor.filterDescriptor?.columnMinWidth ?? col.descriptor.minWidth\"\n [style.max-width.px]=\"col.descriptor.maxWidth\">\n @if (col.descriptor.filterDescriptor) {\n <div class=\"flex\">\n <mng-table-column-filter-full [descriptor]=\"col.descriptor.filterDescriptor\"></mng-table-column-filter-full>\n </div>\n }\n </th>\n }\n }\n @if (showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable) {\n <th [style.min-width.px]=\"columnActionMinWidth\" pFrozenColumn [frozen]=\"descriptor?.actionColumnFrozen ?? true\" alignFrozen=\"right\"></th>\n }\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr\n [style.height.px]=\"rowHeight\"\n [ngClass]=\"descriptor?.rowClassName | mngClassMapPipe: descriptor?.rowClassNameMapFn : item | mngLocaleDefaultRowClass: descriptor : item\">\n @if (selectionEnabled) {\n @if (selectionMode === 'multiple') {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n } @else {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n }\n }\n @for (col of columns; track col) {\n @if (col.isVisible) {\n <td\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n (col.descriptor.className | mngClassMapPipe: col.descriptor.classNameMapFn : item) +\n (hasColumnFilters && col.descriptor.filterDescriptor ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType : '')\n \"\n [class.clickable]=\"isColumnClickable\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">{{ col.descriptor.title ?? (col.descriptor.property | i18nProperty: descriptor!.model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n }\n }\n @if (showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable) {\n <td\n class=\"column-action justify-content-end text-right\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n @if (columnActionTemplate) {\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: {rowItem: item, rowIndex: idx}\"></ng-container>\n } @else if(columnActionComponent) {\n <span [mngComponent]=\"columnActionComponent!\" (instanceCreated)=\"onColumnActionCmpInst($event)\"></span>\n } @else {\n @for (action of rowInlineActions; track action) {\n <mng-action\n [action]=\"action\"\n [item]=\"item\"\n [viewContainer]=\"viewContainer\"\n [hostComponent]=\"this\"\n [itemId]=\"descriptor?.model?.idProperty ? item[descriptor!.model!.idProperty!] : null\"\n [actionData]=\"{itemIndex: idx}\"\n (finish)=\"onActionFinish($event)\">\n </mng-action>\n }\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n @if (descriptor?.loadingIcon) {\n <i [class]=\"'text-white text-4xl pi-spin ' + descriptor?.loadingIcon\"></i>\n }\n @if (descriptor?.loadingText) {\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': descriptor?.loadingIcon}\">\n {{ descriptor?.loadingText ?? '' | translate }}\n </div>\n }\n </div>\n </ng-template>\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n @if (footerTemplate) {\n <ng-template pTemplate=\"summary\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" [ngTemplateOutletContext]=\"{queryResult: queryResult}\"></ng-container>\n </ng-template>\n }\n </p-table>\n }\n</div>\n" }]
|
|
692
|
-
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.TranslateService }, { type: i3.MngCommonsService }, { type: i3.MngActionExecutorService }, { type: i3.MngViewContainerComponentService, decorators: [{
|
|
693
|
-
type: Optional
|
|
694
|
-
}] }, { type: i3.MngLocalStorageService }], propDecorators: { initialDescriptor: [{
|
|
695
|
-
type: Input,
|
|
696
|
-
args: [{ required: true, alias: 'descriptor' }]
|
|
697
|
-
}], items: [{
|
|
698
|
-
type: Input
|
|
699
|
-
}], queryResult: [{
|
|
700
|
-
type: Input
|
|
701
|
-
}], loading: [{
|
|
702
|
-
type: Input
|
|
703
|
-
}], dataProvider: [{
|
|
704
|
-
type: Input
|
|
705
|
-
}], useQueryParams: [{
|
|
706
|
-
type: Input
|
|
707
|
-
}], selectionMode: [{
|
|
708
|
-
type: Input
|
|
709
|
-
}], selectionEnabled: [{
|
|
710
|
-
type: Input
|
|
711
|
-
}], actions: [{
|
|
712
|
-
type: Input
|
|
713
|
-
}], isColumnClickable: [{
|
|
714
|
-
type: Input
|
|
715
|
-
}], viewContainerInit: [{
|
|
716
|
-
type: Input,
|
|
717
|
-
args: ['viewContainer']
|
|
718
|
-
}], captionComponent: [{
|
|
719
|
-
type: Input
|
|
720
|
-
}], columnActionComponent: [{
|
|
721
|
-
type: Input
|
|
722
|
-
}], columnActionMinWidth: [{
|
|
723
|
-
type: Input
|
|
724
|
-
}], globalFilterFieldsInit: [{
|
|
725
|
-
type: Input,
|
|
726
|
-
args: ['globalFilterFields']
|
|
727
|
-
}], loadEventEmitter: [{
|
|
728
|
-
type: Output,
|
|
729
|
-
args: ['tableLoad']
|
|
730
|
-
}], cellClickEventEmitter: [{
|
|
731
|
-
type: Output,
|
|
732
|
-
args: ['cellClick']
|
|
733
|
-
}], selectionChangeEventEmitter: [{
|
|
734
|
-
type: Output,
|
|
735
|
-
args: ['selectionChange']
|
|
736
|
-
}], captionCmpInstEventEmitter: [{
|
|
737
|
-
type: Output,
|
|
738
|
-
args: ['captionComponentInstance']
|
|
739
|
-
}], columnActionCmpInstEventEmitter: [{
|
|
740
|
-
type: Output,
|
|
741
|
-
args: ['columnActionComponentInstance']
|
|
742
|
-
}], templates: [{
|
|
743
|
-
type: ContentChildren,
|
|
744
|
-
args: [MngTemplateDirective]
|
|
745
|
-
}], components: [{
|
|
746
|
-
type: ViewChildren,
|
|
747
|
-
args: [MngComponentDirective]
|
|
748
|
-
}], primeTable: [{
|
|
749
|
-
type: ViewChild,
|
|
750
|
-
args: [Table]
|
|
751
|
-
}] } });
|
|
752
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3RhYmxldmlldy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdGFibGV2aWV3L3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULGVBQWUsRUFDZixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFHVCxJQUFJLEVBQ0osU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQVUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFbEksT0FBTyxFQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxlQUFlLEVBQTBDLE1BQU0sYUFBYSxDQUFDO0FBQ3JGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLEtBQUssRUFBc0IsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FB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QyxxQkFBcUI7Z0JBQ1YsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBc3luY1BpcGUsIE5nQ2xhc3MsIE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFR5cGUsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Zvcm1zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uQ2FuY2VsLCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uRXJyb3IsIE5hdmlnYXRpb25TdGFydCwgUGFyYW1zLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7RmlsdGVyTWF0Y2hNb2RlLCBGaWx0ZXJNZXRhZGF0YSwgTGF6eUxvYWRFdmVudCwgU29ydE1ldGF9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7QnV0dG9uTW9kdWxlfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQge011bHRpU2VsZWN0TW9kdWxlfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0JztcbmltcG9ydCB7U2tlbGV0b25Nb2R1bGV9IGZyb20gJ3ByaW1lbmcvc2tlbGV0b24nO1xuaW1wb3J0IHtUYWJsZSwgVGFibGVMYXp5TG9hZEV2ZW50LCBUYWJsZU1vZHVsZX0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5pbXBvcnQge1Rvb2x0aXBNb2R1bGV9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3Vic2NyaXB0aW9uLCBpc09ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyLCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtNZWRpdXNRdWVyeVBhcmFtLCBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlciwgTWVkaXVzUXVlcnlSZXN1bHR9IGZyb20gJy4uLy4uLy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtNZWRpdXNSZXN0VXRpbH0gZnJvbSAnLi4vLi4vLi4vYXBpL3V0aWxzJztcbmltcG9ydCB7SVRhYmxlRGF0YVByb3ZpZGVyfSBmcm9tICcuLi8uLi8uLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge0FjdGlvbkRlc2NyaXB0b3JJbnN0fSBmcm9tICcuLi8uLi8uLi9kZXNjcmlwdG9ycy9hY3Rpb24nO1xuaW1wb3J0IHtGaWx0ZXJEZXNjcmlwdG9yLCBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yfSBmcm9tICcuLi8uLi8uLi9kZXNjcmlwdG9ycy9maWx0ZXInO1xuaW1wb3J0IHtDb2x1bW5EZXNjcmlwdG9yLCBUYWJsZURlc2NyaXB0b3JJbnN0LCBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdH0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMvdGFibGUnO1xuaW1wb3J0IHtBY3Rpb25Qb3NpdGlvbkVudW0sIEZpbHRlck1hdGNoTW9kZUVudW0sIEZpbHRlclR5cGVFbnVtLCBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bSwgVGFibGVTaXplRW51bX0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMvdHlwZXMnO1xuaW1wb3J0IHtNbmdDb21wb25lbnREaXJlY3RpdmUsIE1uZ1RlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7dG9PYnNlcnZhYmxlfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2NvZXJjaW9uJztcbmltcG9ydCB7SVZpZXdDb250YWluZXJ9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge01uZ0NsYXNzTWFwUGlwZSwgTW5nSTE4blByb3BlcnR5UGlwZSwgTW5nTG9jYWxlRGVmYXVsdFJvd0NsYXNzUGlwZX0gZnJvbSAnLi4vLi4vLi4vcGlwZXMnO1xuaW1wb3J0IHtNbmdBY3Rpb25FeGVjdXRvclNlcnZpY2UsIE1uZ0NvbW1vbnNTZXJ2aWNlLCBNbmdMb2NhbFN0b3JhZ2VTZXJ2aWNlLCBNbmdMb2dnZXJTZXJ2aWNlLCBNbmdWaWV3Q29udGFpbmVyQ29tcG9uZW50U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtTdHlsZXNVdGlsfSBmcm9tICcuLi8uLi8uLi9zdHlsZXMnO1xuaW1wb3J0IHtFcnJvclV0aWwsIE5vdGlmaWNhdGlvblV0aWx9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7VGFibGV2aWV3VXRpbH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdGFibGV2aWV3LnV0aWwnO1xuaW1wb3J0IHtNbmdBY3Rpb25Db21wb25lbnR9IGZyb20gJy4uLy4uL2FjdGlvbic7XG5pbXBvcnQge0FjdGlvbkluc3RhbmNlLCBBY3Rpb25QYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9hY3Rpb24vbW9kZWxzJztcbmltcG9ydCB7TW5nVGFibGVDZWxsQ2xpY2tFdmVudCwgTW5nVGFibGVMb2FkRXZlbnR9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge01uZ1RhYmxlQ29sdW1uRmlsdGVyRnVsbENvbXBvbmVudH0gZnJvbSAnLi9jb2x1bW4tZmlsdGVyLWZ1bGwvY29sdW1uLWZpbHRlci1mdWxsLmNvbXBvbmVudCc7XG5pbXBvcnQge01uZ1RhYmxlQ29sdW1uVmFsdWVDb21wb25lbnR9IGZyb20gJy4vY29sdW1uLXZhbHVlL2NvbHVtbi12YWx1ZS5jb21wb25lbnQnO1xuaW1wb3J0IHtDb2x1bW5XaXRoUHJlZmVyZW5jZXMsIFRhYmxlTGF5b3V0UHJlZmVyZW5jZXN9IGZyb20gJy4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy10YWJsZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEFzeW5jUGlwZSxcbiAgICAgICAgVGFibGVNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgTW5nQ29tcG9uZW50RGlyZWN0aXZlLFxuICAgICAgICBNbmdJMThuUHJvcGVydHlQaXBlLFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBOZ1N0eWxlLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBNbmdUYWJsZUNvbHVtblZhbHVlQ29tcG9uZW50LFxuICAgICAgICBNbmdDbGFzc01hcFBpcGUsXG4gICAgICAgIE1uZ0xvY2FsZURlZmF1bHRSb3dDbGFzc1BpcGUsXG4gICAgICAgIE1uZ0FjdGlvbkNvbXBvbmVudCxcbiAgICAgICAgU2tlbGV0b25Nb2R1bGUsXG4gICAgICAgIE11bHRpU2VsZWN0TW9kdWxlLFxuICAgICAgICBCdXR0b25Nb2R1bGUsXG4gICAgICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBNbmdUYWJsZUNvbHVtbkZpbHRlckZ1bGxDb21wb25lbnRcbiAgICBdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1uZ1RhYmxlQ29tcG9uZW50PFQgPSBhbnksIFMgPSBhbnk+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgcHVibGljIHJlYWRvbmx5IGNtcFR5cGVOYW1lID0gJ01uZ1RhYmxlQ29tcG9uZW50JztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gaW5qZWN0KE1uZ0xvZ2dlclNlcnZpY2UpLmNyZWF0ZSh0aGlzLmNtcFR5cGVOYW1lKTtcblxuICAgIC8vIG1ldGFkYXRhIGlucHV0XG4gICAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZSwgYWxpYXM6ICdkZXNjcmlwdG9yJ30pIHB1YmxpYyBpbml0aWFsRGVzY3JpcHRvciE6IFRhYmxlRGVzY3JpcHRvckluc3Q8VD47XG4gICAgcHVibGljIGRlc2NyaXB0b3I/OiBUYWJsZURlc2NyaXB0b3JJbnN0PFQ+O1xuXG4gICAgLy8gZGF0YSBzb3VyY2UgaW5wdXRzXG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zPzogT2JzZXJ2YWJsZTxBcnJheTxUPj4gfCBBcnJheTxUPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgcXVlcnlSZXN1bHQ/OiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PiB8IE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nPzogT2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGRhdGFQcm92aWRlcj86IElUYWJsZURhdGFQcm92aWRlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgdXNlUXVlcnlQYXJhbXMgPSBmYWxzZTtcblxuICAgIC8vIGV4dHJhIGZlYXR1cmVzIGlucHV0XG4gICAgQElucHV0KCkgcHVibGljIHNlbGVjdGlvbk1vZGU6ICdzaW5nbGUnIHwgJ211bHRpcGxlJyA9ICdtdWx0aXBsZSc7XG4gICAgQElucHV0KCkgcHVibGljIHNlbGVjdGlvbkVuYWJsZWQgPSBmYWxzZTtcblxuICAgIC8vIGFjdGlvbnNcbiAgICBASW5wdXQoKSBwdWJsaWMgYWN0aW9uczogQXJyYXk8QWN0aW9uRGVzY3JpcHRvckluc3Q8YW55Pj4gPSBbXTsgLy8gY2FuIGJlIGFueXRoaW5nXG5cbiAgICAvLyB2aXN1YWxcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNDb2x1bW5DbGlja2FibGU/OiBib29sZWFuO1xuXG4gICAgLy8gY29tcG9uZW50IGlucHV0c1xuICAgIEBJbnB1dCgndmlld0NvbnRhaW5lcicpIHB1YmxpYyB2aWV3Q29udGFpbmVySW5pdD86IElWaWV3Q29udGFpbmVyPFQsIFM+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjYXB0aW9uQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjb2x1bW5BY3Rpb25Db21wb25lbnQ/OiBUeXBlPGFueT47XG4gICAgQElucHV0KCkgcHVibGljIGNvbHVtbkFjdGlvbk1pbldpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoJ2dsb2JhbEZpbHRlckZpZWxkcycpIHB1YmxpYyBnbG9iYWxGaWx0ZXJGaWVsZHNJbml0Pzogc3RyaW5nW107XG5cbiAgICAvLyBldmVudCBvdXRwdXRzXG4gICAgQE91dHB1dCgndGFibGVMb2FkJykgcHVibGljIGxvYWRFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPE1uZ1RhYmxlTG9hZEV2ZW50PigpO1xuICAgIEBPdXRwdXQoJ2NlbGxDbGljaycpIHB1YmxpYyBjZWxsQ2xpY2tFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPE1uZ1RhYmxlQ2VsbENsaWNrRXZlbnQ8VD4+KCk7XG4gICAgQE91dHB1dCgnc2VsZWN0aW9uQ2hhbmdlJykgcHVibGljIHNlbGVjdGlvbkNoYW5nZUV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8VD4+KCk7XG4gICAgQE91dHB1dCgnY2FwdGlvbkNvbXBvbmVudEluc3RhbmNlJykgcHVibGljIGNhcHRpb25DbXBJbnN0RXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgnY29sdW1uQWN0aW9uQ29tcG9uZW50SW5zdGFuY2UnKSBwdWJsaWMgY29sdW1uQWN0aW9uQ21wSW5zdEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLy8gY29udGVudCBhbmQgdmlldyBxdWVyaWVzXG4gICAgQENvbnRlbnRDaGlsZHJlbihNbmdUZW1wbGF0ZURpcmVjdGl2ZSkgcHVibGljIHRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxNbmdUZW1wbGF0ZURpcmVjdGl2ZT47XG4gICAgQFZpZXdDaGlsZHJlbihNbmdDb21wb25lbnREaXJlY3RpdmUpIHB1YmxpYyBjb21wb25lbnRzITogUXVlcnlMaXN0PE1uZ0NvbXBvbmVudERpcmVjdGl2ZTxhbnk+PjtcbiAgICBAVmlld0NoaWxkKFRhYmxlKSBwdWJsaWMgcHJpbWVUYWJsZSE6IFRhYmxlO1xuXG4gICAgLy8gdGVtcGxhdGVzXG4gICAgcHVibGljIGNhcHRpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gICAgcHVibGljIGNvbHVtbkFjdGlvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwdWJsaWMgZm9vdGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLy8gZGF0YSBwcm92aWRlciBhbmQgaXRlbXNcbiAgICBwdWJsaWMgaXNMYXp5ID0gZmFsc2U7XG4gICAgcHVibGljIGlzUGFnaW5hdGlvbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgdXNlRGF0YVByb3ZpZGVyID0gZmFsc2U7XG4gICAgcHJpdmF0ZSB1c2VRdWVyeVBhcmFtc0luaXRpYWxpemVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICAgIHB1YmxpYyB1c2VRdWVyeVBhcmFtc0luaXRpYWxpemVkJCA9IHRoaXMudXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHF1ZXJ5UmVzdWx0JD86IE9ic2VydmFibGU8TWVkaXVzUXVlcnlSZXN1bHQ8VD4+O1xuICAgIHB1YmxpYyBsb2FkaW5nJD86IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHVibGljIGRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXM6IEFycmF5PFQ+ID0gW107XG4gICAgcHJpdmF0ZSBpdGVtc1N1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxBcnJheTxUPj4oMSk7XG5cbiAgICBwcml2YXRlIHF1ZXJ5UmVzdWx0U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gcGFnaW5hdGlvbiwgc29ydCBhbmQgZmlsdGVyc1xuICAgIHB1YmxpYyByb3dzUGVyUGFnZU9wdGlvbnMhOiBBcnJheTxudW1iZXI+O1xuICAgIHB1YmxpYyByb3dzITogbnVtYmVyO1xuICAgIHB1YmxpYyBvZmZzZXQgPSAwO1xuICAgIHB1YmxpYyBtdWx0aVNvcnRNZXRhOiBTb3J0TWV0YVtdIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBmaWx0ZXJNZXRhZGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtbcDogc3RyaW5nXTogRmlsdGVyTWV0YWRhdGF9Pih7fSk7XG4gICAgcHVibGljIGdsb2JhbEZpbHRlckZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAgIHB1YmxpYyBnZXQgZmlsdGVyTWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlck1ldGFkYXRhU3ViamVjdC52YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbHRlck1ldGFkYXRhJCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyTWV0YWRhdGFTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8vIGluZmluaXRlIHNjcm9sbFxuICAgIHB1YmxpYyBpbmZpbml0ZVNjcm9sbCA9IGZhbHNlO1xuXG4gICAgLy8gdmlzdWFsXG4gICAgcHVibGljIGNsYXNzTmFtZSE6IHN0cmluZztcbiAgICBwdWJsaWMgdGFibGVGdWxsSGVpZ2h0T2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgcm93SGVpZ2h0PzogbnVtYmVyO1xuXG4gICAgLy8gc2VsZWN0aW9uXG4gICAgcHVibGljIHNlbGVjdGlvbjogQXJyYXk8VD4gPSBbXTtcblxuICAgIC8vIGRhdGEgcHJvdmlkZXJcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlclNlcnZpY2U6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxNZWRpdXNRdWVyeVJlc3VsdDxUPj4oMSk7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudD86IFRhYmxlTGF6eUxvYWRFdmVudDtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlckxhdGVzdExhenlMb2FkRXZlbnRWZXJzaW9uID0gMDtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbVZlcnNpb24gPSAwO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gZmlsdGVyLCBzb3J0XG4gICAgcHVibGljIGhhc0NvbHVtbkZpbHRlcnMgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzRmlsdGVyQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgaXNTb3J0Q2hhbmdlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgZmlsdGVyRGVzY3JpcHRvcnM6IEFycmF5PEZpbHRlckRlc2NyaXB0b3I8YW55Pj4gPSBbXTtcblxuICAgIC8vIGFjdGlvbnNcbiAgICBwdWJsaWMgc2hvd0lubGluZUFjdGlvbnNDb2x1bW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgcm93Q2xpY2tBY3Rpb25zOiBBY3Rpb25EZXNjcmlwdG9ySW5zdDxUPltdID0gW107XG4gICAgcHVibGljIHJvd0lubGluZUFjdGlvbnM6IEFjdGlvbkRlc2NyaXB0b3JJbnN0PFQ+W10gPSBbXTtcblxuICAgIC8vIG90aGVyXG4gICAgcHJpdmF0ZSByb3V0ZXJJc05hdmlnYXRpb25PdXRzaWRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHB1YmxpYyB2aWV3Q29udGFpbmVyPzogSVZpZXdDb250YWluZXI8VCwgUz47XG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICAgIHB1YmxpYyBhcmVDb2x1bW5zUmVvcmRlcmFibGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgYXJlQ29sdW1uc1RvZ2dsZWFibGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgY29sdW1uczogQ29sdW1uV2l0aFByZWZlcmVuY2VzW10gPSBbXTtcbiAgICBwdWJsaWMgdmlzaWJsZUNvbHVtbnM6IENvbHVtbldpdGhQcmVmZXJlbmNlc1tdID0gW107XG4gICAgcHJpdmF0ZSBsYXlvdXRQcmVmZXJlbmNlczogVGFibGVMYXlvdXRQcmVmZXJlbmNlcyA9IHtjb2x1bW5XaWR0aHM6IHt9fTtcbiAgICBwcml2YXRlIGxvY2Fsc3RvcmFnZUtleSA9ICcnO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbW5nQ29tbW9uc1NlcnZpY2U6IE1uZ0NvbW1vbnNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFjdGlvbkV4ZWN1dG9yOiBNbmdBY3Rpb25FeGVjdXRvclNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgdmlld0NvbnRhaW5lclNlcnZpY2U6IE1uZ1ZpZXdDb250YWluZXJDb21wb25lbnRTZXJ2aWNlPFQsIFM+IHwgbnVsbCxcbiAgICAgICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBNbmdMb2NhbFN0b3JhZ2VTZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVWaWV3Q29udGFpbmVyKCk7XG4gICAgICAgIC8vIFVzZWQgZm9yIGNvbmZpZ3Mgd2l0aGluIHRoaXMgbWV0aG9kIGFuZCBpcyBub3QgZHluYW1pY2FsbHkgc2V0IGJ5IFRhYmxlRHluYW1pY0Rlc2NyaXB0b3JcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZ0Rlc2NyaXB0b3IgPSB0aGlzLmluaXRpYWxEZXNjcmlwdG9yO1xuXG4gICAgICAgIGlmICghKHRoaXMuaW5pdGlhbERlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9ySW5zdCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TWFpbkFuZFJlbGF0ZWREZXNjcmlwdG9ycyh0aGlzLmluaXRpYWxEZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1hcCByb3cgc2V0dGluZ3NcbiAgICAgICAgdGhpcy5yb3dzID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LmRlZmF1bHROdW1Sb3dzID8/IDI1O1xuICAgICAgICB0aGlzLnJvd3NQZXJQYWdlT3B0aW9ucyA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy5yb3dzUGVyUGFnZU9wdGlvbnMgPz8gWzI1LCA1MCwgMTAwXTtcblxuICAgICAgICAvLyBwcm9jZXNzIGFjdGlvbnNcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5hY3Rpb25zKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbi5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgQWN0aW9uUG9zaXRpb25FbnVtLlJvd0NsaWNrOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0NsaWNrQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQWN0aW9uUG9zaXRpb25FbnVtLlJvd0lubGluZTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dJbmxpbmVBY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93SW5saW5lQWN0aW9uc0NvbHVtbiA9IHR5cGVvZiB0aGlzLmNvbHVtbkFjdGlvbkNvbXBvbmVudCAhPT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5yb3dJbmxpbmVBY3Rpb25zLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgLy8gZGVmaW5lIGFsbCBzdHlsZXNcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBiYXNlQ29uZmlnRGVzY3JpcHRvcj8uY2xhc3NOYW1lID8/ICcnO1xuICAgICAgICB0aGlzLnRhYmxlRnVsbEhlaWdodE9mZnNldCA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy50YWJsZUZ1bGxIZWlnaHRPZmZzZXQgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSBiYXNlQ29uZmlnRGVzY3JpcHRvcj8ucm93SGVpZ2h0O1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaXNDb2x1bW5DbGlja2FibGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBkZWZpbmUgaWYgY2VsbCBjbGljayBpcyBiZWluZyBvYnNlcnZlZCB2aWEgb3V0cHV0XG4gICAgICAgICAgICB0aGlzLmlzQ29sdW1uQ2xpY2thYmxlID0gdGhpcy5yb3dDbGlja0FjdGlvbnMubGVuZ3RoID4gMCB8fCB0aGlzLmNlbGxDbGlja0V2ZW50RW1pdHRlci5vYnNlcnZlZDtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKGJhc2VDb25maWdEZXNjcmlwdG9yPy5zaXplKSB7XG4gICAgICAgICAgICBjYXNlIFRhYmxlU2l6ZUVudW0uU21hbGw6XG4gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgKz0gJyBwLWRhdGF0YWJsZS1zbSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRhYmxlU2l6ZUVudW0uTGFyZ2U6XG4gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgKz0gJyBwLWRhdGF0YWJsZS1sZyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2VDb25maWdEZXNjcmlwdG9yPy5oYXNHcmlkbGluZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lICs9ICcgcC1kYXRhdGFibGUtZ3JpZGxpbmVzJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFzZUNvbmZpZ0Rlc2NyaXB0b3IgJiYgIXRoaXMuY29sdW1uQWN0aW9uTWluV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uQWN0aW9uTWluV2lkdGggPSBTdHlsZXNVdGlsLmNhbGN1bGF0ZVRhYmxlQ29sdW1uQWN0aW9uV2lkdGgoXG4gICAgICAgICAgICAgICAgYmFzZUNvbmZpZ0Rlc2NyaXB0b3IgYXMgVGFibGVEZXNjcmlwdG9ySW5zdDxhbnk+LFxuICAgICAgICAgICAgICAgIHRoaXMucm93SW5saW5lQWN0aW9ucyBhcyBBcnJheTxBY3Rpb25EZXNjcmlwdG9ySW5zdDxhbnk+PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGluZmluaXRlIHNjcm9sbFxuICAgICAgICBsZXQgcGFnaW5hdGlvbk1vZGUgPSBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5Ob25lO1xuICAgICAgICBpZiAodHlwZW9mIGJhc2VDb25maWdEZXNjcmlwdG9yPy5wYWdpbmF0aW9uTW9kZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IgY2hvaWNlIGlzIHRoZSBtb3N0IHN0cm9uZyAtIGlmIGRlZmluZWQsIHVzZSB0aGlzIHZhbHVlXG4gICAgICAgICAgICBwYWdpbmF0aW9uTW9kZSA9IGJhc2VDb25maWdEZXNjcmlwdG9yLnBhZ2luYXRpb25Nb2RlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmRhdGFQcm92aWRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIHdoZW4gZGF0YSBwcm92aWRlciBpcyB1c2VkLCB1c2UgcGFnaW5hdGlvblxuICAgICAgICAgICAgcGFnaW5hdGlvbk1vZGUgPSBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5QYWdpbmF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhZ2luYXRpb25Nb2RlID09PSBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5JbmZpbml0ZVNjcm9sbCkge1xuICAgICAgICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRhYmxlRnVsbEhlaWdodE9mZnNldCA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy50YWJsZUZ1bGxIZWlnaHRPZmZzZXQgPz8gMzE1O1xuICAgICAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSBiYXNlQ29uZmlnRGVzY3JpcHRvcj8ucm93SGVpZ2h0ID8/IDQ1O1xuICAgICAgICAgICAgdGhpcy51c2VRdWVyeVBhcmFtcyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHBhZ2luYXRpb25Nb2RlID09PSBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5QYWdpbmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmlzUGFnaW5hdGlvbiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBkYXRhIHByb3ZpZGVyIGlzIHN1cHBsaWVkLCBpZiBpcywgdXNlIGl0IHByaW1hcmlseVxuICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIC8vIG1hcCBzdWJqZWN0cyB0byBvYnNlcnZhYmxlcyBhbmQgaW5pdGlhdGUgZGF0YVxuICAgICAgICAgICAgdGhpcy51c2VEYXRhUHJvdmlkZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5pc0xhenkgPSB0aGlzLmRhdGFQcm92aWRlci5pc0xhenk7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0JCA9IHRoaXMuZGF0YVByb3ZpZGVyUXVlcnlSZXN1bHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nJCA9IHRoaXMuZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgICAgICBjb25zdCBlbXB0eVF1ZXJ5UmVzdWx0ID0gbmV3IE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+KCk7XG4gICAgICAgICAgICBlbXB0eVF1ZXJ5UmVzdWx0LnBhZ2VEYXRhID0gW107XG4gICAgICAgICAgICBlbXB0eVF1ZXJ5UmVzdWx0LmFsbERhdGFDb3VudCA9IDA7XG4gICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QubmV4dChlbXB0eVF1ZXJ5UmVzdWx0KTtcblxuICAgICAgICAgICAgLy8gaW5qZWN0IHNlcnZpY2VcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0PGFueT4odGhpcy5kYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGFQcm92aWRlci5nZXRBbGxSZWxvYWQkLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2gocmVsb2FkU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHF1ZXJ5IHJlc3VsdCBpcyBwcm92aWRlZCwgdXNlIGl0IGFzIHNlY29uZGFyeSBzb3VyY2Ugb3IgZWxzZSB0cnkgdG8gdXNlIGl0ZW1zXG4gICAgICAgICAgICBpZiAodGhpcy5xdWVyeVJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSZXN1bHQkID0gdGhpcy5xdWVyeVJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyB0aGlzLnF1ZXJ5UmVzdWx0IDogb2YodGhpcy5xdWVyeVJlc3VsdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSZXN1bHQkID0gKGlzT2JzZXJ2YWJsZSh0aGlzLml0ZW1zKSA/IHRoaXMuaXRlbXMgOiB0aGlzLml0ZW1zU3ViamVjdC5hc09ic2VydmFibGUoKSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluY3RVbnRpbENoYW5nZWQoKHYxLCB2MikgPT4gdjEubGVuZ3RoID09PSB2Mi5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHYxLmV2ZXJ5KCh2MWksIGlkeCkgPT4gdjFpW3RoaXMuZGVzY3JpcHRvci5kYXRhS2V5UHJvcGVydHldID09PSB2MltpZHhdW3RoaXMuZGVzY3JpcHRvci5kYXRhS2V5UHJvcGVydHldKSksXG4gICAgICAgICAgICAgICAgICAgIG1hcChpdGVtcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IG5ldyBNZWRpdXNRdWVyeVJlc3VsdDxUPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHQucGFnZURhdGEgPSBpdGVtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0LmFsbERhdGFDb3VudCA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeVJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICghaXNPYnNlcnZhYmxlKHRoaXMuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNTdWJqZWN0Lm5leHQodGhpcy5pdGVtcyA/PyBbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvYWRpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nJCA9IHRoaXMubG9hZGluZyBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyB0aGlzLmxvYWRpbmcgOiBvZih0aGlzLmxvYWRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudXNlUXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd1BhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ3Jvd3MnKTtcbiAgICAgICAgICAgIGNvbnN0IHJvd3MgPSByb3dQYXJhbXMgPyBwYXJzZUludChyb3dQYXJhbXMpIDogdGhpcy5yb3dzO1xuXG4gICAgICAgICAgICBjb25zdCBtZWRpdXNRdWVyeVBhcmFtID0gTWVkaXVzUmVzdFV0aWwuZ2V0KCkuZnJvbUFuZ3VsYXJRdWVyeVBhcmFtc1RvTWVkaXVzUXVlcnlQYXJhbXModGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcywgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycywgdGhpcy5yb3dzKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBMYXp5TG9hZEV2ZW50ID0ge307XG4gICAgICAgICAgICBldmVudC5tdWx0aVNvcnRNZXRhID0gdGhpcy5jcmVhdGVTb3J0TWV0YShtZWRpdXNRdWVyeVBhcmFtKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICBldmVudC5maWx0ZXJzID0gdGhpcy5jcmVhdGVGaWx0ZXJNZXRhKG1lZGl1c1F1ZXJ5UGFyYW0pO1xuICAgICAgICAgICAgZXZlbnQucm93cyA9IHJvd3M7XG5cbiAgICAgICAgICAgIC8vIGZpcnN0IG5hdmlnYXRlIHRvIGNvcnJlY3QgdXJsIHdpdGggZGVmYXVsdCBmaWx0ZXJzL3NvcnRzXG4gICAgICAgICAgICB0aGlzLnJvdXRlclxuICAgICAgICAgICAgICAgIC5uYXZpZ2F0ZShbXSwge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogTWVkaXVzUmVzdFV0aWwuZ2V0KCkuZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvQW5ndWxhclF1ZXJ5UGFyYW1zKGV2ZW50KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVEYXRhTG9hZGluZ1RyaWdnZXJzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVEYXRhTG9hZGluZ1RyaWdnZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWVyeVJlc3VsdFN1YnNjcmlwdGlvbiA9IHRoaXMucXVlcnlSZXN1bHQkLnN1YnNjcmliZShlID0+ICh0aGlzLnF1ZXJ5UmVzdWx0ID0gZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVzLmZvckVhY2godGVtcGxhdGUgPT4ge1xuICAgICAgICAgICAgc3dpdGNoICh0ZW1wbGF0ZS5nZXRUeXBlKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjYXB0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXB0aW9uVGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29sdW1uQWN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5BY3Rpb25UZW1wbGF0ZSA9IHRlbXBsYXRlLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0lubGluZUFjdGlvbnNDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0lubGluZUFjdGlvbnNDb2x1bW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Zvb3Rlcic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9vdGVyVGVtcGxhdGUgPSB0ZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2l0ZW1zJ10gJiYgIWNoYW5nZXNbJ2l0ZW1zJ10uZmlyc3RDaGFuZ2UgJiYgQXJyYXkuaXNBcnJheShjaGFuZ2VzWydpdGVtcyddLmN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNTdWJqZWN0Lm5leHQoY2hhbmdlc1snaXRlbXMnXS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXNbJ3ZpZXdDb250YWluZXJJbml0J10gJiYgIWNoYW5nZXNbJ3ZpZXdDb250YWluZXJJbml0J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVZpZXdDb250YWluZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlckZpZWxkc0luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVyRmllbGRzID0gdGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHNJbml0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHMgPSAodGhpcy5kZXNjcmlwdG9yIHx8IHRoaXMuaW5pdGlhbERlc2NyaXB0b3IpLmNvbHVtbnMubWFwKChlbDogQ29sdW1uRGVzY3JpcHRvcjxhbnksIFQ+KSA9PiBlbC5wcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuZmlsdGVyTWV0YWRhdGFTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZChlbWl0RXZlbnQgPSBmYWxzZSwgcmVzZXRQYXJhbXMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtc0J1aWxkZXIgPSByZXNldFBhcmFtc1xuICAgICAgICAgICAgPyBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlci5jcmVhdGUodGhpcy5yb3dzLCAwKVxuICAgICAgICAgICAgOiBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlci5jcmVhdGVGcm9tRXhpc3RpbmcodGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RRdWVyeVBhcmFtID8/IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCkpXG4gICAgICAgICAgICAgICAgICAud2l0aEl0ZW1zUGVyUGFnZSh0aGlzLnJvd3MpXG4gICAgICAgICAgICAgICAgICAud2l0aEl0ZW1zT2Zmc2V0KHRoaXMub2Zmc2V0KTtcblxuICAgICAgICB0aGlzLmxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIocXVlcnlQYXJhbXNCdWlsZGVyLmJ1aWxkKCksIGVtaXRFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVGFibGVMYXp5TG9hZChldmVudDogVGFibGVMYXp5TG9hZEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudCA9IGV2ZW50O1xuICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxhdGVzdExhenlMb2FkRXZlbnRWZXJzaW9uKys7XG5cbiAgICAgICAgaWYgKHRoaXMudXNlUXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgIGlmICghZXZlbnQubXVsdGlTb3J0TWV0YSB8fCBldmVudC5tdWx0aVNvcnRNZXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCBkZWZhdWx0IHNvcnQgbWV0YSB0byBldmVudCBpZiBub3QgbXVsdGlzb3J0IG1ldGEgaXMgcHJlc2VudFxuICAgICAgICAgICAgICAgIGV2ZW50Lm11bHRpU29ydE1ldGEgPSB0aGlzLmNyZWF0ZVNvcnRNZXRhKCkgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFldmVudC5maWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQuZmlsdGVycyA9IHRoaXMuY3JlYXRlRmlsdGVyTWV0YSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMucm91dGVySXNOYXZpZ2F0aW9uT3V0c2lkZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGNoZWNrIGlzIG5lY2Vzc2FyeTogZnJvbSBzb21lIHJlYXNvbiwgcHJpbWVORyBjb21taXRzIG9uZSBsYXN0IGxhenkgbG9hZCBldmVudCB3aGVuZXZlciBhbnkgYW5ndWxhciByb3V0ZXIgbmF2aWdhdGlvbiBvY2N1cnNcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogTWVkaXVzUmVzdFV0aWwuZ2V0KCkuZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvQW5ndWxhclF1ZXJ5UGFyYW1zKGV2ZW50KVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWVkaXVzUXVlcnlQYXJhbXMgPSBldmVudCA/IE1lZGl1c1Jlc3RVdGlsLmdldCgpLmZyb21QcmltZUxhenlMb2FkRXZlbnRUb01lZGl1c1F1ZXJ5UGFyYW1zKGV2ZW50KSA6IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIobWVkaXVzUXVlcnlQYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBvblRhYmxlU29ydChldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuaXNTb3J0Q2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBvblRhYmxlRmlsdGVyKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5pc0ZpbHRlckNoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNlbGxDbGljayhldmVudDogRXZlbnQsIGNvbDogQ29sdW1uRGVzY3JpcHRvcjxhbnksIFQ+LCBpdGVtOiBULCBpZHg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBtbmdFdmVudCA9IG5ldyBNbmdUYWJsZUNlbGxDbGlja0V2ZW50PFQ+KGNvbCwgaXRlbSwgaWR4KTtcbiAgICAgICAgdGhpcy5jZWxsQ2xpY2tFdmVudEVtaXR0ZXIubmV4dChtbmdFdmVudCk7XG4gICAgICAgIGlmICh0aGlzLnJvd0NsaWNrQWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHRoaXMucm93Q2xpY2tBY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRQcm9wID0gdGhpcy5kZXNjcmlwdG9yPy50cmFja1Byb3BlcnR5ID8/IGFjdGlvbj8ubW9kZWw/LmlkUHJvcGVydHk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IG5ldyBBY3Rpb25QYXJhbWV0ZXJzKGlkUHJvcCA/IGl0ZW1baWRQcm9wIGFzIGtleW9mIG9iamVjdF0gOiB1bmRlZmluZWQsIGl0ZW0pXG4gICAgICAgICAgICAgICAgICAgIC53aXRoUm91dGUodGhpcy5yb3V0ZSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhWaWV3Q29udGFpbmVyKHRoaXMudmlld0NvbnRhaW5lcilcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3VyY2VDb21wb25lbnQodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25FeGVjdXRvci50cmlnZ2VyQWN0aW9uKGFjdGlvbiwgcGFyYW1ldGVycywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IEFycmF5PFQ+KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnRFbWl0dGVyLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNhcHRpb25DbXBJbnN0PEM+KGluc3RhbmNlOiBDKSB7XG4gICAgICAgIHRoaXMuY2FwdGlvbkNtcEluc3RFdmVudEVtaXR0ZXIubmV4dChpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ29sdW1uQWN0aW9uQ21wSW5zdDxDPihpbnN0YW5jZTogQykge1xuICAgICAgICB0aGlzLmNvbHVtbkFjdGlvbkNtcEluc3RFdmVudEVtaXR0ZXIubmV4dChpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQWN0aW9uRmluaXNoKHJ1blJlc3VsdDogQWN0aW9uSW5zdGFuY2U8VCwgUz4pIHtcbiAgICAgICAgaWYgKCFydW5SZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgaXMgY2FsbGVkIG9uIGNvbHVtbiByZXNpemVcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBldmVudCdzIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgb25UYWJsZUNvbHVtblJlc2l6ZSh7ZWxlbWVudH06IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZElkOiBzdHJpbmcgPSBlbGVtZW50LmlkO1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcblxuICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbnMuZmluZChlbCA9PiBlbC5kZXNjcmlwdG9yLnByb3BlcnR5ID09PSBmaWVsZElkKTtcbiAgICAgICAgaWYgKGNvbCkgY29sLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5XaWR0aHMpIHRoaXMubGF5b3V0UHJlZmVyZW5jZXMuY29sdW1uV2lkdGhzID0ge307XG5cbiAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5XaWR0aHNbZmllbGRJZF0gPSB3aWR0aDtcbiAgICAgICAgdGhpcy5zYXZlTGF5b3V0UHJlZmVyZW5jZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIocXVlcnlQYXJhbTogTWVkaXVzUXVlcnlQYXJhbSB8IG51bGwgPSBudWxsLCBlbWl0RXZlbnQgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VEYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG5cbiAgICAgICAgaWYgKCFxdWVyeVBhcmFtKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtID0gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKHRoaXMucm93cykuYnVpbGQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtO1xuICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW1WZXJzaW9uKys7XG5cbiAgICAgICAgTWVkaXVzUmVzdFV0aWwuZ2V0KCkubW9kaWZ5RmlsdGVyUHJvcGVydGllcyhxdWVyeVBhcmFtLCB0aGlzLmZpbHRlckRlc2NyaXB0b3JzKTtcbiAgICAgICAgTWVkaXVzUmVzdFV0aWwuZ2V0KCkubW9kaWZ5U29ydFByb3BlcnRpZXMocXVlcnlQYXJhbSwgdGhpcy5kZXNjcmlwdG9yPy5jb2x1bW5zKTtcblxuICAgICAgICB0aGlzLmRhdGFQcm92aWRlclN1YnNjcmlwdGlvbiA9IHRvT2JzZXJ2YWJsZShcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyPy5nZXRBbGwocXVlcnlQYXJhbSwgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlLCB0aGlzLmRlc2NyaXB0b3I/LmlzTG9jYWxpemVkID8gdGhpcy5tbmdDb21tb25zU2VydmljZS5hcHBEYXRhTGFuZ3VhZ2UgPz8gdW5kZWZpbmVkIDogdW5kZWZpbmVkKVxuICAgICAgICApLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxEZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFibGVEeW5hbWljRGVzY3JpcHRvckluc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRNYWluQW5kUmVsYXRlZERlc2NyaXB0b3JzKHRoaXMuaW5pdGlhbERlc2NyaXB0b3IudG9UYWJsZURlc2NyaXB0b3JGcm9tRGF0YShyZXMgPz8gTWVkaXVzUXVlcnlSZXN1bHQuZnJvbUFycmF5KFtdKSkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZmluaXRlU2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRmlsdGVyQ2hhbmdlZCB8fCB0aGlzLmlzU29ydENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtcy5zcGxpY2UocXVlcnlQYXJhbSEuaXRlbXNPZmZzZXQgPz8gMCwgcXVlcnlQYXJhbSEuaXRlbXNQZXJQYWdlID8/IHRoaXMucm93cywgLi4uKHJlcz8ucGFnZURhdGEgPz8gW10pKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zID0gWy4uLnRoaXMuZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtc107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QubmV4dChyZXMgPz8gTWVkaXVzUXVlcnlSZXN1bHQuZnJvbUFycmF5KFtdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaXNGaWx0ZXJDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NvcnRDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayB3aGF0IGhhcHBlbnMgb24gZXJyb3Igd2l0aCBubyBtb2RlbCBpbmlzaWRlIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25VdGlsLnRhYmxlTm90aWZpY2F0aW9uRXJyb3IodGhpcy50cmFuc2xhdGUsIHRoaXMuZGVzY3JpcHRvciEsIGVyciwgdGhpcy52aWV3Q29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVF1ZXJ5UmVzdWx0ID0gbmV3IE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+KCk7XG4gICAgICAgICAgICAgICAgZW1wdHlRdWVyeVJlc3VsdC5wYWdlRGF0YSA9IFtdO1xuICAgICAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQuYWxsRGF0YUNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclF1ZXJ5UmVzdWx0U3ViamVjdC5uZXh0KGVtcHR5UXVlcnlSZXN1bHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtbmdFcnJvciA9IEVycm9yVXRpbC5mcm9tU3Vic2NyaWJlRXJyb3IoZXJyLCAnTW5nVGFibGVDb21wb25lbnRFcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbTogcXVlcnlQYXJhbVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhtbmdFcnJvciwgRXJyb3JVdGlsLmdldEVycm9yTG9nTGV2ZWwobW5nRXJyb3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgICAgICAgY29uc3QgbW5nRXZlbnQgPSBuZXcgTW5nVGFibGVMb2FkRXZlbnQoKTtcbiAgICAgICAgICAgIG1uZ0V2ZW50Lm9yaWdpbmFsRXZlbnQgPSB0aGlzLmRhdGFQcm92aWRlckxhdGVzdExhenlMb2FkRXZlbnQ7XG4gICAgICAgICAgICBtbmdFdmVudC5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTtcbiAgICAgICAgICAgIHRoaXMubG9hZEV2ZW50RW1pdHRlci5uZXh0KG1uZ0V2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFRhYmxlRnJvbVJvdXRlVXBkYXRlKHBhcmFtczogUGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IG1lZGl1c1F1ZXJ5UGFyYW0gPSBNZWRpdXNSZXN0VXRpbC5nZXQoKS5mcm9tQW5ndWxhclF1ZXJ5UGFyYW1zVG9NZWRpdXNRdWVyeVBhcmFtcyhwYXJhbXMsIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMsIHRoaXMucm93cyk7XG4gICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlckxhdGVzdExhenlMb2FkRXZlbnRWZXJzaW9uIDwgdGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RRdWVyeVBhcmFtVmVyc2lvbiArIDEpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBvbmx5IGlmIG5ldyB2ZXJzaW9uIGZyb20gcXVlcnkgcGFyYW1zIHdpbGwgYmUgaGlnaGVyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVByaW1lU29ydEFuZEZpbHRlcihtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldE1haW5BbmRSZWxhdGVkRGVzY3JpcHRvcnMoZGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxUPikge1xuICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLmZpbHRlckRlc2NyaXB0b3JzID0gdGhpcy5kZXNjcmlwdG9yPy5jb2x1bW5zLmZpbHRlcihjID0+IHR5cGVvZiBjLmZpbHRlckRlc2NyaXB0b3IgIT09ICd1bmRlZmluZWQnKS5tYXAoYyA9PiBjLmZpbHRlckRlc2NyaXB0b3IhKSA/PyBbXTtcbiAgICAgICAgdGhpcy5oYXNDb2x1bW5GaWx0ZXJzID0gdGhpcy5maWx0ZXJEZXNjcmlwdG9ycy5sZW5ndGggPiAwO1xuXG4gICAgICAgIC8vIGdldCBsYXlvdXQgcHJlZmVyZW5jZXMgaWYgdGhleSBleGlzdFxuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdG9yPy5tb2RlbC50eXBlTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5sb2NhbHN0b3JhZ2VLZXkgPSBUYWJsZXZpZXdVdGlsLmdlbmVyYXRlVGFibGVMYXlvdXRQcmVmc0tleSh0aGlzLmRlc2NyaXB0b3I/Lm1vZGVsLnR5cGVOYW1lLCB0aGlzLnJvdXRlci51cmwsIHRoaXMuZGVzY3JpcHRvcj8udHJhY2tQcm9wZXJ0eSk7XG4gICAgICAgICAgICBjb25zdCBwcmVmZXJlbmNlcyA9IHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5nZXRJdGVtPFRhYmxlTGF5b3V0UHJlZmVyZW5jZXM+KHRoaXMuY21wVHlwZU5hbWUsIHRoaXMubG9jYWxzdG9yYWdlS2V5KTtcbiAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlcyAmJiB0eXBlb2YgcHJlZmVyZW5jZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VzLmNvbHVtbldpZHRocykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtbldpZHRocyA9IHByZWZlcmVuY2VzLmNvbHVtbldpZHRocyBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJlZmVyZW5jZXMuY29sdW1uT3JkZXIgJiYgQXJyYXkuaXNBcnJheShwcmVmZXJlbmNlcy5jb2x1bW5PcmRlcikgJiYgcHJlZmVyZW5jZXMuY29sdW1uT3JkZXIuZXZlcnkoKGVsOiBhbnkpID0+IHR5cGVvZiBlbCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0UHJlZmVyZW5jZXMuY29sdW1uT3JkZXIgPSBwcmVmZXJlbmNlcy5jb2x1bW5PcmRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VzLmNvbHVtblZpc2liaWxpdHkgJiYgQXJyYXkuaXNBcnJheShwcmVmZXJlbmNlcy5jb2x1bW5WaXNpYmlsaXR5KSAmJiBwcmVmZXJlbmNlcy5jb2x1bW5WaXNpYmlsaXR5LmV2ZXJ5KChlbDogYW55KSA9PiB0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtblZpc2liaWxpdHkgPSBwcmVmZXJlbmNlcy5jb2x1bW5WaXNpYmlsaXR5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGluaXRpYWxpemUgY29sdW1ucyB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdG9yPy5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFyZUNvbHVtbnNSZW9yZGVyYWJsZSA9IHRoaXMuZGVzY3JpcHRvci5jb2x1bW5zLnNvbWUodmFsdWUgPT4gdmFsdWUuaXNSZW9yZGVyYWJsZSk7XG4gICAgICAgICAgICB0aGlzLmFyZUNvbHVtbnNUb2dnbGVhYmxlID0gdGhpcy5kZXNjcmlwdG9yLmNvbHVtbnMuc29tZSh2YWx1ZSA9PiB2YWx1ZS5pc1RvZ2dsZWFibGUpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRlc2NyaXB0b3IuY29sdW1ucy5tYXAoY29sID0+ICh7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvcjogY29sLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY29sLmlzVG9nZ2xlYWJsZSxcbiAgICAgICAgICAgICAgICBpc1Zpc2libGU6IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMuY29sdW1uVmlzaWJpbGl0eSA/IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMuY29sdW1uVmlzaWJpbGl0eS5pbmNsdWRlcyhjb2wucHJvcGVydHkpIDogY29sLmlzVmlzaWJsZSxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5XaWR0aHM/Lltjb2wucHJvcGVydHldXG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtbk9yZGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29sdW1uT3JkZXI6IENvbHVtbldpdGhQcmVmZXJlbmNlc1tdID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb2xOYW1lIG9mIHRoaXMubGF5b3V0UHJlZmVyZW5jZXMuY29sdW1uT3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRDb2wgPSB0aGlzLmNvbHVtbnMuZmluZChlbCA9PiBlbC5kZXNjcmlwdG9yLnByb3BlcnR5ID09PSBjb2xOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kQ29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2x1bW5PcmRlci5wdXNoKGZvdW5kQ29sKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXdDb2x1bW5PcmRlci5sZW5ndGggPT09IHRoaXMuY29sdW1ucy5sZW5ndGgpIHRoaXMuY29sdW1ucyA9IG5ld0NvbHVtbk9yZGVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihlbCA9PiBlbC5pc1Zpc2libGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVQcmltZVNvcnRBbmRGaWx0ZXIobWVkaXVzUXVlcnlQYXJhbTogTWVkaXVzUXVlcnlQYXJhbSkge1xuICAgICAgICB0aGlzLm11bHRpU29ydE1ldGEgPSB0aGlzLmNyZWF0ZVNvcnRNZXRhKG1lZGl1c1F1ZXJ5UGFyYW0pO1xuICAgICAgICB0aGlzLmZpbHRlck1ldGFkYXRhU3ViamVjdC5uZXh0KHRoaXMuY3JlYXRlRmlsdGVyTWV0YShtZWRpdXNRdWVyeVBhcmFtKSk7XG4gICAgICAgIHRoaXMucm93cyA9IG1lZGl1c1F1ZXJ5UGFyYW0/Lml0ZW1zUGVyUGFnZSA/PyB0aGlzLnJvd3M7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gbWVkaXVzUXVlcnlQYXJhbT8uaXRlbXNPZmZzZXQgPz8gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUZpbHRlck1ldGEobWVkaXVzUXVlcnlQYXJhbT86IE1lZGl1c1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgbGV0IHBhcmFtczogTWVkaXVzUXVlcnlQYXJhbTtcbiAgICAgICAgaWYgKCFtZWRpdXNRdWVyeVBhcmFtKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBuZXcgTWVkaXVzUXVlcnlQYXJhbSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyYW1zID0gbWVkaXVzUXVlcnlQYXJhbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1lRmlsdGVyTWV0YToge1tzOiBzdHJpbmddOiBGaWx0ZXJNZXRhZGF0YX0gPSB7fTtcbiAgICAgICAgLy8gaWYgYW55IGZpbHRlciBpcyBwcmVzZW50LCBubyBkZWZhdWx0IGZpbHRlcnMgc2hvdWxkIGJlIGFwcGxpZWQhXG4gICAgICAgIGNvbnN0IGFwcGx5RGVmYXVsdEZpbHRlcnMgPSAocGFyYW1zLmZpbHRlclBhcmFtcz8ubGVuZ3RoID8/IDApID09PSAwO1xuXG4gICAgICAgIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIGxldCBtYXRjaE1vZGU7XG4gICAgICAgICAgICBzd2l0Y2ggKGYuZmlsdGVyVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRmlsdGVyVHlwZUVudW0uU3RyaW5nOlxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuQ09OVEFJTlM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRmlsdGVyVHlwZUVudW0uRGF0ZTpcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlID0gRmlsdGVyTWF0Y2hNb2RlLkRBVEVfSVM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRmlsdGVyVHlwZUVudW0uTG9va3VwOlxuICAgICAgICAgICAgICAgIGNhc2UgRmlsdGVyVHlwZUVudW0uTG9va3VwRW51bToge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb29rdXBGaWx0ZXIgPSBmIGFzIEZpbHRlckxvb2t1cERlc2NyaXB0b3I8YW55PjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvb2t1cEZpbHRlci5tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlID0gRmlsdGVyTWF0Y2hNb2RlLklOO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlID0gRmlsdGVyTWF0Y2hNb2RlLkVRVUFMUztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlID0gRmlsdGVyTWF0Y2hNb2RlLkVRVUFMUztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmLmRlZmF1bHRGaWx0ZXJNYXRjaE1vZGUpIHtcbiAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBmLmRlZmF1bHRGaWx0ZXJNYXRjaE1vZGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmLm1hdGNoTW9kZXMgJiYgIWYubWF0Y2hNb2Rlcz8uaW5jbHVkZXMobWF0Y2hNb2RlKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IGYubWF0Y2hNb2Rlc1swXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChhcHBseURlZmF1bHRGaWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGYuZGVmYXVsdFZhbHVlVG8gJiYgZi5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbZi5kZWZhdWx0VmFsdWUsIGYuZGVmYXVsdFZhbHVlVG9dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZi5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByaW1lRmlsdGVyTWV0YVtmLnByb3BlcnR5XSA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgbWF0Y2hNb2RlOiBtYXRjaE1vZGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBhcmFtcy5maWx0ZXJQYXJhbXM/LmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5maWx0ZXJEZXNjcmlwdG9ycy5maW5kKGZkID0+IGZkLmZpbHRlclByb3BlcnR5ID09PSBmLnByb3BlcnR5IHx8IGZkLnByb3BlcnR5ID09PSBmLnByb3BlcnR5KTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoTW9kZSA9IGYuZmlsdGVyTWF0Y2hUeXBlICYmIGRlc2NyaXB0b3IgPyBNZWRpdXNSZXN0VXRpbC5nZXQoKS5nZXRNYXBwaW5nKGYuZmlsdGVyTWF0Y2hUeXBlLCBkZXNjcmlwdG9yLmZpbHRlclR5cGUsIDIpPy5bMF0gOiBGaWx0ZXJNYXRjaE1vZGVFbnVtLkVxdWFscztcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICYmIG1hdGNoTW9kZSkge1xuICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJWYWx1ZSA9IGYuZmlsdGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uRGF0ZSAmJiB0eXBlb2YgZmlsdGVyVmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsdGVyVmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBmaWx0ZXJWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlID0gbmV3IERhdGUoZmlsdGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHJhbmdlIGlzIHByb3ZpZGVkLCB0YWtlIHRoYXQgaW50byBhY2NvdW50XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZi5maWx0ZXJWYWx1ZVRvID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZi5maWx0ZXJWYWx1ZVRvID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWVUbyA9IG5ldyBEYXRlKGYuZmlsdGVyVmFsdWVUbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZSA9IFtmaWx0ZXJWYWx1ZSwgZmlsdGVyVmFsdWVUb107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJpbWVGaWx0ZXJNZXRhW2Rlc2NyaXB0b3IucHJvcGVydHldID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZTogbWF0Y2hNb2RlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHByaW1lRmlsdGVyTWV0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVNvcnRNZXRhKG1lZGl1c1F1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtKTogU29ydE1ldGFbXSB8IG51bGwge1xuICAgICAgICBsZXQgcGFyYW1zOiBNZWRpdXNRdWVyeVBhcmFtO1xuICAgICAgICBpZiAoIW1lZGl1c1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBtZWRpdXNRdWVyeVBhcmFtO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNvcnRNZXRhOiBTb3J0TWV0YVtdO1xuICAgICAgICBjb25zdCBhcHBseURlZmF1bHRTb3J0cyA9IChwYXJhbXMuc29ydFByb3BlcnR5Py5sZW5ndGggPz8gMCkgPT09IDA7XG5cbiAgICAgICAgaWYgKGFwcGx5RGVmYXVsdFNvcnRzICYmIHRoaXMuZGVzY3JpcHRvcj8uaGFzRGVmYXVsdFNvcnQpIHtcbiAgICAgICAgICAgIHNvcnRNZXRhID0gdGhpcy5kZXNjcmlwdG9yLmRlZmF1bHRTb3J0UHJvcGVydHkubWFwKFxuICAgICAgICAgICAgICAgIChwLCBpZHgpID0+XG4gICAgICAgICAgICAgICAgICAgIDxTb3J0TWV0YT57XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiB0aGlzLmRlc2NyaXB0b3IhLmRlZmF1bHRTb3J0QXNjW2lkeF0gPyAxIDogLTFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvcnRNZXRhID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBwYXJhbXMuc29ydFByb3BlcnR5Py5mb3JFYWNoKChzLCBpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBzb3J0TWV0YS5maW5kSW5kZXgodmFsdWUgPT4gdmFsdWUuZmllbGQgPT09IHMpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIHNvcnRNZXRhW2V4aXN0aW5nSW5kZXhdLm9yZGVyID0gcGFyYW1zLnNvcnRBc2M/LltpZHhdID8/IHRydWUgPyAxIDogLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvcnRNZXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogcyxcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6IHBhcmFtcy5zb3J0QXNjPy5baWR4XSA/PyB0cnVlID8gMSA6IC0xXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3J0TWV0YS5sZW5ndGggPT09IDAgPyBudWxsIDogc29ydE1ldGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRGF0YUxvYWRpbmdUcmlnZ2VycygpIHtcbiAgICAgICAgaWYgKHRoaXMudXNlUXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgdGFibGUgbG9hZHMgZnJvbSByb3V0ZSB1cGRhdGVzXG4gICAgICAgICAgICBjb25zdCByb3V0ZVFwU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUocXAgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFRhYmxlRnJvbVJvdXRlVXBkYXRlKHFwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgcm91dGVyRXZTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgZSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0ICYmIGUudXJsLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXSAhPT0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uQ2FuY2VsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvclxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVySXNOYXZpZ2F0aW9uT3V0c2lkZUluUHJvZ3Jlc3MgPSBlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0O1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChyb3V0ZVFwU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHJvdXRlckV2U3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxvYWQgZGF0YSBpbW1lZGlhdGVseSBieSBjcmVhdGluZyBkZWZhdWx0IHNvcnRzIGFuZCBmaWx0ZXJzIChwcmltZW5nIHdpbGwgdHJpZ2dlciBvbkxhenlMb2FkIGV2ZW50IG9uIHNvcnQmZmlsdGVyIG1ldGFkYXRhIGNoYW5nZSlcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTb3J0ID0gdGhpcy5jcmVhdGVTb3J0TWV0YSgpO1xuICAgICAgICAgICAgaWYgKCFkZWZhdWx0U29ydCB8fCBkZWZhdWx0U29ydC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tdWx0aVNvcnRNZXRhID0gZGVmYXVsdFNvcnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSB0aGlzLmNyZWF0ZUZpbHRlck1ldGEoKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0RmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJNZXRhZGF0YVN1YmplY3QubmV4dChkZWZhdWx0RmlsdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVZpZXdDb250YWluZXIoKSB7XG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lciA9IHRoaXMudmlld0NvbnRhaW5lckluaXQgPz8gdGhpcy52aWV3Q29udGFpbmVyU2VydmljZSA/PyB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ29sdW1uVG9nZ2xlKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKGV2ZW50Lml0ZW1WYWx1ZSkge1xuICAgICAgICAgICAgZXZlbnQuaXRlbVZhbHVlLmlzVmlzaWJsZSA9ICFldmVudC5pdGVtVmFsdWUuaXNWaXNpYmxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgY29sLmlzVmlzaWJsZSA9IGV2ZW50LnZhbHVlLmluY2x1ZGVzKGNvbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5WaXNpYmlsaXR5ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5tYXAoZWwgPT4gZWwuZGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuc2F2ZUxheW91dFByZWZlcmVuY2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvcGFnYXRlcyB0aGUgY29sdW1uIG1vdmUgZnJvbSB0aGUgdGhpcy52aXNpYmxlQ29sdW1ucyBhcnJheSB0byB0aGlzLmNvbHVtbnMgYXJyYXlcbiAgICAgKiBAcGFyYW0gZXZlbnQ6IE11bHRpU2VsZWN0Q2hhbmdlRXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db2x1bW5SZW9yZGVyKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy52aXNpYmxlQ29sdW1uc1tldmVudC5kcm9wSW5kZXhdO1xuICAgICAgICBjb25zdCBjb2xJbmRleCA9IHRoaXMuY29sdW1ucy5maW5kSW5kZXgoZWwgPT4gZWwgPT09IGNvbCk7XG5cbiAgICAgICAgaWYgKGNvbEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5zcGxpY2UoY29sSW5kZXgsIDEpO1xuICAgICAgICAgICAgY29uc3QgZHJvcEluZGV4ID0gZXZlbnQuZHJvcEluZGV4ID4gMCA/IHRoaXMuY29sdW1ucy5maW5kSW5kZXgoZWwgPT4gZWwgPT09IHRoaXMudmlzaWJsZUNvbHVtbnNbZXZlbnQuZHJvcEluZGV4IC0gMV0pICsgMSA6IDA7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5zLnNsaWNlKDAsIGRyb3BJbmRleCksIGNvbCwgLi4udGhpcy5jb2x1bW5zLnNsaWNlKGRyb3BJbmRleCldO1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5PcmRlciA9IHRoaXMuY29sdW1ucy5tYXAoZWwgPT4gZWwuZGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgICAgICB0aGlzLnNhdmVMYXlvdXRQcmVmZXJlbmNlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYXZlTGF5b3V0UHJlZmVyZW5jZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmRlc2NyaXB0b3I/Lm1vZGVsLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSh0aGlzLmNtcFR5cGVOYW1lLCB0aGlzLmxvY2Fsc3RvcmFnZUtleSwgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBjb2x1bW4gb3JkZXIgYW5kIGNvbHVtbiB2aXNpYmlsaXR5IHRvIGRlZmF1bHQgc2V0dGluZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXREZWZhdWx0TGF5b3V0KCkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRlc2NyaXB0b3IgPyB0aGlzLmRlc2NyaXB0b3IuY29sdW1ucy5tYXAoY29sID0+ICh7ZGVzY3JpcHRvcjogY29sLCBkaXNhYmxlZDogIWNvbC5pc1RvZ2dsZWFibGUsIGlzVmlzaWJsZTogY29sLmlzVmlzaWJsZX0pKSA6IFtdO1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihlbCA9PiBlbC5pc1Zpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdG9yPy5tb2RlbC50eXBlTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0odGhpcy5jbXBUeXBlTmFtZSwgdGhpcy5sb2NhbHN0b3JhZ2VLZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcyA9IHt9O1xuICAgIH1cbn1cbiIsIjxkaXYgW3N0eWxlLmhlaWdodF09XCJ0YWJsZUZ1bGxIZWlnaHRPZmZzZXQgPyAnY2FsYygxMDB2aCAtICcgKyB0YWJsZUZ1bGxIZWlnaHRPZmZzZXQgKyAncHgpJyA6IG51bGxcIj5cbiAgICA8IS0tIE1VU1QgTk9UIHVzZSBvYnNlcnZhYmxlIGZvciB2YWx1ZSB3aGVuIHVzaW5nIHZpcnR1YWwgc2Nyb2xsIC0gZG9lcyBub3Qgd29yayBmb3Igc29tZSByZWFzb24gLS0+XG4gICAgQGlmICghdXNlUXVlcnlQYXJhbXMgfHwgKHVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWQkIHwgYXN5bmMpKSB7XG4gICAgICAgIDxwLXRhYmxlXG4gICAgICAgICAgICBbdmFsdWVdPVwiaW5maW5pdGVTY3JvbGwgPyBkYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zIDogKHF1ZXJ5UmVzdWx0JCB8IGFzeW5jKT8ucGFnZURhdGEgPz8gW11cIlxuICAgICAgICAgICAgW2RhdGFLZXldPVwiZGVzY3JpcHRvcj8udHJhY2tQcm9wZXJ0eVwiXG4gICAgICAgICAgICBbbGF6eV09XCJpc0xhenlcIlxuICAgICAgICAgICAgW2xvYWRpbmddPVwiKGxvYWRpbmckIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwiaXNQYWdpbmF0aW9uICYmICFpbmZpbml0ZVNjcm9sbFwiXG4gICAgICAgICAgICBbcm93c109XCJpbmZpbml0ZVNjcm9sbCA/IDIwIDogcm93c1wiXG4gICAgICAgICAgICBbZmlyc3RdPVwiaW5maW5pdGVTY3JvbGwgPyAwIDogb2Zmc2V0XCJcbiAgICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwiJGFueShpbmZpbml0ZVNjcm9sbCA/IG51bGwgOiAocXVlcnlSZXN1bHQkIHwgYXN5bmMpPy5hbGxEYXRhQ291bnQgPz8gMClcIlxuICAgICAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJpbmZpbml0ZVNjcm9sbCA/IHVuZGVmaW5lZCA6IHJvd3NQZXJQYWdlT3B0aW9uc1wiXG4gICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cIiFpbmZpbml0ZVNjcm9sbFwiXG4gICAgICAgICAgICBbY3VycmVudFBhZ2VSZXBvcnRUZW1wbGF0ZV09XCInbW5nVGFibGUucGFnaW5hdGlvbk1zZycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW211bHRpU29ydE1ldGFdPVwibXVsdGlTb3J0TWV0YVwiXG4gICAgICAgICAgICBbZmlsdGVyc109XCJmaWx0ZXJNZXRhZGF0YVwiXG4gICAgICAgICAgICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cImdsb2JhbEZpbHRlckZpZWxkc1wiXG4gICAgICAgICAgICBzb3J0TW9kZT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3Rpb25cIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbkVuYWJsZWQgPyBzZWxlY3Rpb25Nb2RlIDogbnVsbFwiXG4gICAgICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cImluZmluaXRlU2Nyb2xsXCJcbiAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsSXRlbVNpemVdPVwicm93SGVpZ2h0XCJcbiAgICAgICAgICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgICAgICAgICAgW3Jvd0hvdmVyXT1cImRlc2NyaXB0b3I/Lmhhc0hvdmVyID8/IHRydWVcIlxuICAgICAgICAgICAgW3N0eWxlQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgICAgICAgICAgIFtyZXNpemFibGVDb2x1bW5zXT1cImRlc2NyaXB0b3I/Lmhhc1Jlc2l6YWJsZUNvbHVtbnMgPz8gZmFsc2VcIlxuICAgICAgICAgICAgW2NvbHVtblJlc2l6ZU1vZGVdPVwiZGVzY3JpcHRvcj8uY29sdW1uUmVzaXplTW9kZSA/PyAnZml0J1wiXG4gICAgICAgICAgICBbcmVvcmRlcmFibGVDb2x1bW5zXT1cImFyZUNvbHVtbnNSZW9yZGVyYWJsZVwiXG4gICAgICAgICAgICBwYWdpbmF0b3JEcm9wZG93bkFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uc1wiXG4gICAgICAgICAgICAob25Db2xSZXNpemUpPVwib25UYWJsZUNvbHVtblJlc2l6ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkNvbFJlb3JkZXIpPVwib25Db2x1bW5SZW9yZGVyKCRldmVudClcIlxuICAgICAgICAgICAgKG9uTGF6eUxvYWQpPVwib25UYWJsZUxhenlMb2FkKCRldmVudClcIlxuICAgICAgICAgICAgKG9uU29ydCk9XCJvblRhYmxlU29ydCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkZpbHRlcik9XCJvblRhYmxlRmlsdGVyKCRldmVudClcIj5cbiAgICAgICAgICAgIEBpZiAoY2FwdGlvblRlbXBsYXRlIHx8IGNhcHRpb25Db21wb25lbnQgfHwgZGVzY3JpcHRvcj8udGl0bGUpIHtcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNhcHRpb25UZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhcHRpb25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChjYXB0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFttbmdDb21wb25lbnRdPVwiY2FwdGlvbkNvbXBvbmVudFwiIChpbnN0YW5jZUNyZWF0ZWQpPVwib25DYXB0aW9uQ21wSW5zdCgkZXZlbnQpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwicC0wIG0tMFwiPnt7IGRlc2NyaXB0b3I/LnRpdGxlIH19PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgQGlmICghZGVzY3JpcHRvcj8uaGlkZUhlYWRlcikge1xuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJtbmctdGFibGUtaGVhZGVyXCIgW2NsYXNzXT1cImRlc2NyaXB0b3I/LmhlYWRlckNsYXNzTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3Rpb25FbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIm1pbi13aWR0aDogMzZweFwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJkZXNjcmlwdG9yPy5zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSBuZWVkIHRoZSBsaW5lIGJlbG93LCBiZWNhdXNlIG90aGVyd2lzZSBwLXRhYmxlUmFkaW9CdXR0b24gc2hpZnRzIHRoZSByZXN0IG9mIHRoZSBjb2x1bW5zIGluIHRhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcj8uc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzb3J0YWJsZUNvbHVtblRIVGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2wuZGVzY3JpcHRvci50aXRsZSA/PyAoY29sLmRlc2NyaXB0b3IucHJvcGVydHkgfCBpMThuUHJvcGVydHk6IGRlc2NyaXB0b3IhLm1vZGVsKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eVwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vblNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbC5kZXNjcmlwdG9yLnRpdGxlID8/IChjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eSB8IGkxOG5Qcm9wZXJ0eTogZGVzY3JpcHRvciEubW9kZWwpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmRlc2NyaXB0b3IuaXNSZW9yZGVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlc2l6YWJsZUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW9yZGVyYWJsZUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbkRpc2FibGVkXT1cIiFjb2wuZGVzY3JpcHRvci5pc1NvcnRFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoID8gY29sLndpZHRoICsgJ3B4JyA6IGNvbC5kZXNjcmlwdG9yLndpZHRoICsgJyUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC5kZXNjcmlwdG9yLm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC53aWR0aCA/PyBjb2wuZGVzY3JpcHRvci5tYXhXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuZGVzY3JpcHRvci5oZWFkZXJDbGFzc05hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGFzQ29sdW1uRmlsdGVycyAmJiBjb2wuZGVzY3JpcHRvci5maWx0ZXJEZXNjcmlwdG9yID8gJyBtbmctY29sdW1uLWZpbHRlci0nICsgY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvci5maWx0ZXJUeXBlIDogJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbC5kZXNjcmlwdG9yLmlzU29ydEVuYWJsZWQgPyBzb3J0YWJsZUNvbHVtblRIVGVtcGxhdGUgOiBub25Tb3J0YWJsZUNvbHVtblRIVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlc2l6YWJsZUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbkRpc2FibGVkXT1cIiFjb2wuZGVzY3JpcHRvci5pc1NvcnRFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoID8gY29sLndpZHRoICsgJ3B4JyA6IGNvbC5kZXNjcmlwdG9yLndpZHRoICsgJyUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC5kZXNjcmlwdG9yLm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC53aWR0aCA/PyBjb2wuZGVzY3JpcHRvci5tYXhXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuZGVzY3JpcHRvci5oZWFkZXJDbGFzc05hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGFzQ29sdW1uRmlsdGVycyAmJiBjb2wuZGVzY3JpcHRvci5maWx0ZXJEZXNjcmlwdG9yID8gJyBtbmctY29sdW1uLWZpbHRlci0nICsgY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvci5maWx0ZXJUeXBlIDogJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbC5kZXNjcmlwdG9yLmlzU29ydEVuYWJsZWQgPyBzb3J0YWJsZUNvbHVtblRIVGVtcGxhdGUgOiBub25Tb3J0YWJsZUNvbHVtblRIVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dJbmxpbmVBY3Rpb25zQ29sdW1uIHx8IGFyZUNvbHVtbnNUb2dnbGVhYmxlIHx8IGFyZUNvbHVtbnNSZW9yZGVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkFjdGlvbk1pbldpZHRoXCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImRlc2NyaXB0b3I/LmFjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCIgYWxpZ25Gcm96ZW49XCJyaWdodFwiIGNsYXNzPVwidGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGFyZUNvbHVtbnNUb2dnbGVhYmxlIHx8IGFyZUNvbHVtbnNSZW9yZGVyYWJsZSB8fCBkZXNjcmlwdG9yPy5oYXNSZXNpemFibGVDb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1wcmltYXJ5IG1uZy10YWJsZS1jb2x1bW5zLW11bHRpc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmlzaWJsZUNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCInbW5nVGFibGUuYWRqdXN0VGFibGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd25JY29uPVwicGkgcGktc2xpZGVycy1oXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVNlbGVjdGVkTGFiZWxdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNvbHVtblRvZ2dsZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jaGVja2JveCBwLWNvbXBvbmVudCBtbC0xXCIgW25nQ2xhc3NdPVwieydwLWNoZWNrYm94LWRpc2FibGVkJzogIWFyZUNvbHVtbnNUb2dnbGVhYmxlfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtaGlkZGVuLWFjY2Vzc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk9XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImNvbHVtblRvZ2dsZU11bHRpc2VsZWN0LmFsbFNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cImNvbHVtblRvZ2dsZU11bHRpc2VsZWN0Lm9uSGVhZGVyQ2hlY2tib3hGb2N1cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3Qub25IZWFkZXJDaGVja2JveEJsdXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cImNvbHVtblRvZ2dsZU11bHRpc2VsZWN0Lm9uVG9nZ2xlQWxsKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWFyZUNvbHVtbnNUb2dnbGVhYmxlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1jaGVja2JveC1ib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImNvbHVtblRvZ2dsZU11bHRpc2VsZWN0LmFsbFNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwLWhpZ2hsaWdodCc6IGNvbHVtblRvZ2dsZU11bHRpc2VsZWN0LmFsbFNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncC1mb2N1cyc6IGNvbHVtblRvZ2dsZU11bHRpc2VsZWN0LmhlYWRlckNoZWNrYm94Rm9jdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwLWRpc2FibGVkJzogIWFyZUNvbHVtbnNUb2dnbGVhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbHVtblRvZ2dsZU11bHRpc2VsZWN0Lm9uVG9nZ2xlQWxsKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY2hlY2tib3gtaWNvblwiIFtuZ0NsYXNzXT1cInsncGkgcGktY2hlY2snOiBjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC5hbGxTZWxlY3RlZH1cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXJlcGxheVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCInbW5nVGFibGUucmVzZXRMYXlvdXQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0RGVmYXVsdExheW91dCgpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGVzY3JpcHRvci50aXRsZSA/PyAoaXRlbS5kZXNjcmlwdG9yLnByb3BlcnR5IHwgaTE4blByb3BlcnR5OiBkZXNjcmlwdG9yIS5tb2RlbCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChoYXNDb2x1bW5GaWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIm1uZy1jb2x1bW4tZmlsdGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSBuZWVkIHRoZSBsaW5lIGJlbG93LCBiZWNhdXNlIG90aGVyd2lzZSBwLXRhYmxlUmFkaW9CdXR0b24gc2hpZnRzIHRoZSByZXN0IG9mIHRoZSBjb2x1bW5zIGluIHRhYmxlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3Rpb25FbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImRlc2NyaXB0b3I/LnNlbGVjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbC5kZXNjcmlwdG9yLmZpbHRlckRlc2NyaXB0b3IgPyAnbW5nLWNvbHVtbi1maWx0ZXItJyArIGNvbC5kZXNjcmlwdG9yLmZpbHRlckRlc2NyaXB0b3IuZmlsdGVyVHlwZSArICcgJyA6ICcgJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5kZXNjcmlwdG9yLmZpbHRlckRlc2NyaXB0b3I/LmNvbHVtbkNsYXNzTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImNvbC5kZXNjcmlwdG9yLmZpbHRlckRlc2NyaXB0b3I/LmNvbHVtbldpZHRoID8/IGNvbC5kZXNjcmlwdG9yLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvcj8uY29sdW1uTWluV2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWluV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wuZGVzY3JpcHRvci5tYXhXaWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuZGVzY3JpcHRvci5maWx0ZXJEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy10YWJsZS1jb2x1bW4tZmlsdGVyLWZ1bGwgW2Rlc2NyaXB0b3JdPVwiY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvclwiPjwvbW5nLXRhYmxlLWNvbHVtbi1maWx0ZXItZnVsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dJbmxpbmVBY3Rpb25zQ29sdW1uIHx8IGFyZUNvbHVtbnNUb2dnbGVhYmxlIHx8IGFyZUNvbHVtbnNSZW9yZGVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkFjdGlvbk1pbldpZHRoXCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImRlc2NyaXB0b3I/LmFjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCIgYWxpZ25Gcm96ZW49XCJyaWdodFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWlkeD1cInJvd0luZGV4XCI+XG4gICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicm93SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZGVzY3JpcHRvcj8ucm93Q2xhc3NOYW1lIHwgbW5nQ2xhc3NNYXBQaXBlOiBkZXNjcmlwdG9yPy5yb3dDbGFzc05hbWVNYXBGbiA6IGl0ZW0gfCBtbmdMb2NhbGVEZWZhdWx0Um93Q2xhc3M6IGRlc2NyaXB0b3IgOiBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImRlc2NyaXB0b3I/LnNlbGVjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cIml0ZW1cIj48L3AtdGFibGVDaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImRlc2NyaXB0b3I/LnNlbGVjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlUmFkaW9CdXR0b24gW3ZhbHVlXT1cIml0ZW1cIj48L3AtdGFibGVSYWRpb0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmlzVmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DZWxsQ2xpY2soJGV2ZW50LCBjb2wuZGVzY3JpcHRvciwgaXRlbSwgaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2wuZGVzY3JpcHRvci5jbGFzc05hbWUgfCBtbmdDbGFzc01hcFBpcGU6IGNvbC5kZXNjcmlwdG9yLmNsYXNzTmFtZU1hcEZuIDogaXRlbSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhc0NvbHVtbkZpbHRlcnMgJiYgY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvciA/ICcgbW5nLWNvbHVtbi1maWx0ZXItJyArIGNvbC5kZXNjcmlwdG9yLmZpbHRlckRlc2NyaXB0b3IuZmlsdGVyVHlwZSA6ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpY2thYmxlXT1cImlzQ29sdW1uQ2xpY2thYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCA/IGNvbC53aWR0aCArICdweCcgOiBjb2wuZGVzY3JpcHRvci53aWR0aCArICclJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLmRlc2NyaXB0b3IubWluV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC53aWR0aCA/PyBjb2wuZGVzY3JpcHRvci5tYXhXaWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmRlc2NyaXB0b3IudGl0bGUgPz8gKGNvbC5kZXNjcmlwdG9yLnByb3BlcnR5IHwgaTE4blByb3BlcnR5OiBkZXNjcmlwdG9yIS5tb2RlbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLXZhbHVlIFtkZXNjcmlwdG9yXT1cImNvbC5kZXNjcmlwdG9yXCIgW2l0ZW1dPVwiaXRlbVwiPjwvbW5nLXRhYmxlLWNvbHVtbi12YWx1ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd0lubGluZUFjdGlvbnNDb2x1bW4gfHwgYXJlQ29sdW1uc1RvZ2dsZWFibGUgfHwgYXJlQ29sdW1uc1Jlb3JkZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbi1hY3Rpb24ganVzdGlmeS1jb250ZW50LWVuZCB0ZXh0LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkFjdGlvbk1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJkZXNjcmlwdG9yPy5hY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25Gcm96ZW49XCJyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uQWN0aW9uVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbkFjdGlvblRlbXBsYXRlOyBjb250ZXh0OiB7cm93SXRlbTogaXRlbSwgcm93SW5kZXg6IGlkeH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmKGNvbHVtbkFjdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbW5nQ29tcG9uZW50XT1cImNvbHVtbkFjdGlvbkNvbXBvbmVudCFcIiAoaW5zdGFuY2VDcmVhdGVkKT1cIm9uQ29sdW1uQWN0aW9uQ21wSW5zdCgkZXZlbnQpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChhY3Rpb24gb2Ygcm93SW5saW5lQWN0aW9uczsgdHJhY2sgYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW5nLWFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25dPVwiYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlld0NvbnRhaW5lcl09XCJ2aWV3Q29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaG9zdENvbXBvbmVudF09XCJ0aGlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbUlkXT1cImRlc2NyaXB0b3I/Lm1vZGVsPy5pZFByb3BlcnR5ID8gaXRlbVtkZXNjcmlwdG9yIS5tb2RlbCEuaWRQcm9wZXJ0eSFdIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie2l0ZW1JbmRleDogaWR4fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCk9XCJvbkFjdGlvbkZpbmlzaCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21uZy1hY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwibG9hZGluZ2ljb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChkZXNjcmlwdG9yPy5sb2FkaW5nSWNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIid0ZXh0LXdoaXRlIHRleHQtNHhsIHBpLXNwaW4gJyArIGRlc2NyaXB0b3I/LmxvYWRpbmdJY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoZGVzY3JpcHRvcj8ubG9hZGluZ1RleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IHRleHQtd2hpdGUgdGV4dC1sZyBmb250LXNlbWlib2xkXCIgW25nQ2xhc3NdPVwieydtdC0zJzogZGVzY3JpcHRvcj8ubG9hZGluZ0ljb259XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGVzY3JpcHRvcj8ubG9hZGluZ1RleHQgPz8gJycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImxvYWRpbmdib2R5XCI+XG4gICAgICAgICAgICAgICAgPHRyIFtzdHlsZS5oZWlnaHQucHhdPVwicm93SGVpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cIihkZXNjcmlwdG9yPy5jb2x1bW5zPy5sZW5ndGggPz8gMCkgKyAoc2hvd0lubGluZUFjdGlvbnNDb2x1bW4gPyAxIDogMCkgKyAoc2VsZWN0aW9uRW5hYmxlZCA/IDEgOiAwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctdGV4dFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gW25nU3R5bGVdPVwie3dpZHRoOiAnMTAwJSd9XCI+PC9wLXNrZWxldG9uPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgIDx0ciBbc3R5bGUuaGVpZ2h0LnB4XT1cInJvd0hlaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCIoZGVzY3JpcHRvcj8uY29sdW1ucz8ubGVuZ3RoID8/IDApICsgKHNob3dJbmxpbmVBY3Rpb25zQ29sdW1uID8gMSA6IDApICsgKHNlbGVjdGlvbkVuYWJsZWQgPyAxIDogMClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdtbmdUYWJsZS5ub0l0ZW1zJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgQGlmIChmb290ZXJUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJzdW1tYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZm9vdGVyVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3F1ZXJ5UmVzdWx0OiBxdWVyeVJlc3VsdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L3AtdGFibGU+XG4gICAgfVxuPC9kaXY+XG4iXX0=
|