@firestitch/list 9.9.9 → 9.10.0
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/app/classes/actions-controller.d.ts +20 -20
- package/app/classes/columns-controller.d.ts +65 -65
- package/app/classes/data-controller.d.ts +89 -89
- package/app/classes/external-params-controller.d.ts +31 -31
- package/app/classes/index.d.ts +2 -2
- package/app/classes/list-controller.d.ts +166 -166
- package/app/classes/pagination-controller.d.ts +185 -185
- package/app/classes/persistance-controller.d.ts +7 -7
- package/app/classes/reorder-controller.d.ts +56 -56
- package/app/classes/selection-controller.d.ts +141 -141
- package/app/classes/sorting-controller.d.ts +64 -63
- package/app/components/body/body.component.d.ts +29 -29
- package/app/components/body/row/actions/actions.component.d.ts +32 -32
- package/app/components/body/row/cell/cell.component.d.ts +20 -20
- package/app/components/body/row/inline-action/inline-action.component.d.ts +10 -10
- package/app/components/body/row/row.component.d.ts +66 -66
- package/app/components/customize-cols/customize-cols.component.d.ts +14 -14
- package/app/components/footer/footer-row/footer-cell/footer-cell.component.d.ts +7 -4
- package/app/components/footer/footer-row/footer-row.component.d.ts +10 -8
- package/app/components/footer/footer.component.d.ts +10 -8
- package/app/components/head/head-cell/head-cell.component.d.ts +11 -11
- package/app/components/head/head.component.d.ts +40 -40
- package/app/components/list/list.component.d.ts +108 -108
- package/app/components/loader/loader.component.d.ts +11 -11
- package/app/components/manage-saved-filters/manage-saved-filters.component.d.ts +10 -10
- package/app/components/pagination/pagination.component.d.ts +11 -11
- package/app/components/saved-filters/saved-filters.component.d.ts +12 -12
- package/app/components/status/status.component.d.ts +18 -18
- package/app/directives/cell/cell.directive.d.ts +5 -5
- package/app/directives/column/column.directive.d.ts +24 -23
- package/app/directives/draggable-list/draggable-list.directive.d.ts +77 -77
- package/app/directives/draggable-row/draggable-row.directive.d.ts +18 -18
- package/app/directives/empty-state/empty-state.directive.d.ts +2 -2
- package/app/directives/footer/footer.directive.d.ts +5 -5
- package/app/directives/group-cell/group-cell.directive.d.ts +3 -3
- package/app/directives/group-expand-trigger/group-expand-trigger.directive.d.ts +7 -7
- package/app/directives/header/header.directive.d.ts +5 -5
- package/app/enums/button-type.enum.d.ts +7 -7
- package/app/enums/page-change-type.enum.d.ts +4 -4
- package/app/enums/pagination-strategy.enum.d.ts +5 -5
- package/app/enums/row-type.enum.d.ts +5 -5
- package/app/enums/state.enum.d.ts +9 -9
- package/app/fs-list.module.d.ts +6 -6
- package/app/fs-list.providers.d.ts +3 -3
- package/app/interfaces/cellconfig.interface.d.ts +5 -5
- package/app/interfaces/draggable-list.interface.d.ts +7 -7
- package/app/interfaces/external-params.interface.d.ts +13 -13
- package/app/interfaces/index.d.ts +3 -3
- package/app/interfaces/listconfig.interface.d.ts +220 -220
- package/app/interfaces/pagination.interface.d.ts +13 -13
- package/app/models/column.model.d.ts +48 -46
- package/app/models/row/base-row.d.ts +13 -13
- package/app/models/row/child-row.d.ts +12 -12
- package/app/models/row/group-row.d.ts +14 -14
- package/app/models/row/simple-row.d.ts +5 -5
- package/app/models/row-action.model.d.ts +29 -29
- package/app/models/row.d.ts +28 -28
- package/app/models/styleConfig.model.d.ts +31 -31
- package/app/services/group-expand-notifier.service.d.ts +8 -8
- package/bundles/firestitch-list.umd.js +5832 -5783
- package/bundles/firestitch-list.umd.js.map +1 -1
- package/bundles/firestitch-list.umd.min.js +1 -1
- package/bundles/firestitch-list.umd.min.js.map +1 -1
- package/esm2015/app/classes/actions-controller.js +55 -55
- package/esm2015/app/classes/columns-controller.js +185 -185
- package/esm2015/app/classes/data-controller.js +318 -311
- package/esm2015/app/classes/external-params-controller.js +155 -155
- package/esm2015/app/classes/index.js +3 -3
- package/esm2015/app/classes/list-controller.js +730 -730
- package/esm2015/app/classes/pagination-controller.js +461 -461
- package/esm2015/app/classes/persistance-controller.js +22 -22
- package/esm2015/app/classes/reorder-controller.js +161 -161
- package/esm2015/app/classes/selection-controller.js +444 -444
- package/esm2015/app/classes/sorting-controller.js +177 -167
- package/esm2015/app/components/body/body.component.js +103 -103
- package/esm2015/app/components/body/row/actions/actions.component.js +110 -110
- package/esm2015/app/components/body/row/cell/cell.component.js +93 -93
- package/esm2015/app/components/body/row/inline-action/inline-action.component.js +34 -34
- package/esm2015/app/components/body/row/row.component.js +267 -267
- package/esm2015/app/components/customize-cols/customize-cols.component.js +67 -67
- package/esm2015/app/components/footer/footer-row/footer-cell/footer-cell.component.js +27 -18
- package/esm2015/app/components/footer/footer-row/footer-row.component.js +39 -35
- package/esm2015/app/components/footer/footer.component.js +34 -30
- package/esm2015/app/components/head/head-cell/head-cell.component.js +35 -35
- package/esm2015/app/components/head/head.component.js +99 -99
- package/esm2015/app/components/list/list.component.js +357 -357
- package/esm2015/app/components/loader/loader.component.js +46 -46
- package/esm2015/app/components/manage-saved-filters/manage-saved-filters.component.js +75 -75
- package/esm2015/app/components/pagination/pagination.component.js +44 -44
- package/esm2015/app/components/saved-filters/saved-filters.component.js +36 -36
- package/esm2015/app/components/status/status.component.js +77 -77
- package/esm2015/app/directives/cell/cell.directive.js +21 -21
- package/esm2015/app/directives/column/column.directive.js +97 -93
- package/esm2015/app/directives/draggable-list/draggable-list.directive.js +264 -264
- package/esm2015/app/directives/draggable-row/draggable-row.directive.js +81 -81
- package/esm2015/app/directives/empty-state/empty-state.directive.js +11 -11
- package/esm2015/app/directives/footer/footer.directive.js +21 -21
- package/esm2015/app/directives/group-cell/group-cell.directive.js +12 -12
- package/esm2015/app/directives/group-expand-trigger/group-expand-trigger.directive.js +32 -32
- package/esm2015/app/directives/header/header.directive.js +21 -21
- package/esm2015/app/enums/button-type.enum.js +9 -9
- package/esm2015/app/enums/page-change-type.enum.js +6 -6
- package/esm2015/app/enums/pagination-strategy.enum.js +7 -7
- package/esm2015/app/enums/row-type.enum.js +7 -7
- package/esm2015/app/enums/state.enum.js +11 -11
- package/esm2015/app/fs-list.module.js +140 -140
- package/esm2015/app/fs-list.providers.js +4 -4
- package/esm2015/app/interfaces/cellconfig.interface.js +1 -1
- package/esm2015/app/interfaces/draggable-list.interface.js +1 -1
- package/esm2015/app/interfaces/external-params.interface.js +1 -1
- package/esm2015/app/interfaces/index.js +1 -1
- package/esm2015/app/interfaces/listconfig.interface.js +1 -1
- package/esm2015/app/interfaces/pagination.interface.js +1 -1
- package/esm2015/app/models/column.model.js +185 -175
- package/esm2015/app/models/row/base-row.js +23 -23
- package/esm2015/app/models/row/child-row.js +28 -28
- package/esm2015/app/models/row/group-row.js +41 -41
- package/esm2015/app/models/row/simple-row.js +10 -10
- package/esm2015/app/models/row-action.model.js +115 -115
- package/esm2015/app/models/row.js +77 -77
- package/esm2015/app/models/styleConfig.model.js +86 -86
- package/esm2015/app/services/group-expand-notifier.service.js +25 -25
- package/esm2015/firestitch-list.js +17 -17
- package/esm2015/public_api.js +40 -40
- package/esm5/app/classes/actions-controller.js +71 -71
- package/esm5/app/classes/columns-controller.js +236 -236
- package/esm5/app/classes/data-controller.js +374 -365
- package/esm5/app/classes/external-params-controller.js +185 -185
- package/esm5/app/classes/index.js +3 -3
- package/esm5/app/classes/list-controller.js +749 -749
- package/esm5/app/classes/pagination-controller.js +568 -568
- package/esm5/app/classes/persistance-controller.js +25 -25
- package/esm5/app/classes/reorder-controller.js +195 -195
- package/esm5/app/classes/selection-controller.js +465 -465
- package/esm5/app/classes/sorting-controller.js +204 -194
- package/esm5/app/components/body/body.component.js +104 -104
- package/esm5/app/components/body/row/actions/actions.component.js +113 -113
- package/esm5/app/components/body/row/cell/cell.component.js +95 -95
- package/esm5/app/components/body/row/inline-action/inline-action.component.js +35 -35
- package/esm5/app/components/body/row/row.component.js +295 -295
- package/esm5/app/components/customize-cols/customize-cols.component.js +69 -69
- package/esm5/app/components/footer/footer-row/footer-cell/footer-cell.component.js +29 -20
- package/esm5/app/components/footer/footer-row/footer-row.component.js +42 -38
- package/esm5/app/components/footer/footer.component.js +35 -31
- package/esm5/app/components/head/head-cell/head-cell.component.js +38 -38
- package/esm5/app/components/head/head.component.js +106 -106
- package/esm5/app/components/list/list.component.js +391 -391
- package/esm5/app/components/loader/loader.component.js +47 -47
- package/esm5/app/components/manage-saved-filters/manage-saved-filters.component.js +81 -81
- package/esm5/app/components/pagination/pagination.component.js +46 -46
- package/esm5/app/components/saved-filters/saved-filters.component.js +41 -41
- package/esm5/app/components/status/status.component.js +79 -79
- package/esm5/app/directives/cell/cell.directive.js +24 -24
- package/esm5/app/directives/column/column.directive.js +98 -94
- package/esm5/app/directives/draggable-list/draggable-list.directive.js +281 -281
- package/esm5/app/directives/draggable-row/draggable-row.directive.js +83 -83
- package/esm5/app/directives/empty-state/empty-state.directive.js +14 -14
- package/esm5/app/directives/footer/footer.directive.js +24 -24
- package/esm5/app/directives/group-cell/group-cell.directive.js +17 -17
- package/esm5/app/directives/group-expand-trigger/group-expand-trigger.directive.js +33 -33
- package/esm5/app/directives/header/header.directive.js +24 -24
- package/esm5/app/enums/button-type.enum.js +9 -9
- package/esm5/app/enums/page-change-type.enum.js +6 -6
- package/esm5/app/enums/pagination-strategy.enum.js +7 -7
- package/esm5/app/enums/row-type.enum.js +7 -7
- package/esm5/app/enums/state.enum.js +11 -11
- package/esm5/app/fs-list.module.js +145 -145
- package/esm5/app/fs-list.providers.js +4 -4
- package/esm5/app/interfaces/cellconfig.interface.js +1 -1
- package/esm5/app/interfaces/draggable-list.interface.js +1 -1
- package/esm5/app/interfaces/external-params.interface.js +1 -1
- package/esm5/app/interfaces/index.js +1 -1
- package/esm5/app/interfaces/listconfig.interface.js +1 -1
- package/esm5/app/interfaces/pagination.interface.js +1 -1
- package/esm5/app/models/column.model.js +204 -194
- package/esm5/app/models/row/base-row.js +35 -35
- package/esm5/app/models/row/child-row.js +43 -43
- package/esm5/app/models/row/group-row.js +61 -61
- package/esm5/app/models/row/simple-row.js +15 -15
- package/esm5/app/models/row-action.model.js +126 -126
- package/esm5/app/models/row.js +126 -126
- package/esm5/app/models/styleConfig.model.js +91 -91
- package/esm5/app/services/group-expand-notifier.service.js +30 -30
- package/esm5/firestitch-list.js +17 -17
- package/esm5/public_api.js +40 -40
- package/fesm2015/firestitch-list.js +5188 -5141
- package/fesm2015/firestitch-list.js.map +1 -1
- package/fesm5/firestitch-list.js +5817 -5768
- package/fesm5/firestitch-list.js.map +1 -1
- package/firestitch-list.d.ts +18 -18
- package/firestitch-list.metadata.json +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +33 -33
|
@@ -1,749 +1,749 @@
|
|
|
1
|
-
import { __decorate, __extends, __metadata, __read, __spread } from "tslib";
|
|
2
|
-
import { ItemType } from '@firestitch/filter';
|
|
3
|
-
import { Alias, Model } from 'tsmodels';
|
|
4
|
-
import { BehaviorSubject, combineLatest, from, Observable, of, Subject } from 'rxjs';
|
|
5
|
-
import { catchError, debounceTime, map, mapTo, switchMap, take, takeUntil, tap, } from 'rxjs/operators';
|
|
6
|
-
import { cloneDeep } from 'lodash-es';
|
|
7
|
-
import { SortingDirection } from '../models/column.model';
|
|
8
|
-
import { StyleConfig } from '../models/styleConfig.model';
|
|
9
|
-
import { RowAction } from '../models/row-action.model';
|
|
10
|
-
import { ColumnsController } from './columns-controller';
|
|
11
|
-
import { PageChangeType } from '../enums/page-change-type.enum';
|
|
12
|
-
import { ActionsController } from './index';
|
|
13
|
-
import { DataController } from './data-controller';
|
|
14
|
-
import { PaginationController } from './pagination-controller';
|
|
15
|
-
import { SelectionController } from './selection-controller';
|
|
16
|
-
import { SortingController } from './sorting-controller';
|
|
17
|
-
import { FsListState } from '../enums/state.enum';
|
|
18
|
-
import { ExternalParamsController } from './external-params-controller';
|
|
19
|
-
var SHOW_DELETED_FILTERS_KEY = '$$_show_deleted_$$';
|
|
20
|
-
var List = /** @class */ (function (_super) {
|
|
21
|
-
__extends(List, _super);
|
|
22
|
-
function List(el, config, fsScroll, selectionDialog, router, route, persistance, inDialog) {
|
|
23
|
-
if (config === void 0) { config = {}; }
|
|
24
|
-
var _this = _super.call(this) || this;
|
|
25
|
-
_this.el = el;
|
|
26
|
-
_this.config = config;
|
|
27
|
-
_this.fsScroll = fsScroll;
|
|
28
|
-
_this.selectionDialog = selectionDialog;
|
|
29
|
-
_this.router = router;
|
|
30
|
-
_this.route = route;
|
|
31
|
-
_this.persistance = persistance;
|
|
32
|
-
_this.inDialog = inDialog;
|
|
33
|
-
_this.filters = [];
|
|
34
|
-
_this.scrollable = false;
|
|
35
|
-
// @Alias('rows') private _rows: any;
|
|
36
|
-
_this.initialized$ = new BehaviorSubject(false);
|
|
37
|
-
_this.loading$ = new BehaviorSubject(false);
|
|
38
|
-
_this.paging = new PaginationController();
|
|
39
|
-
_this.columns = new ColumnsController();
|
|
40
|
-
_this.actions = new ActionsController();
|
|
41
|
-
_this.dataController = new DataController();
|
|
42
|
-
_this.sorting = new SortingController();
|
|
43
|
-
_this.filterConfig = null;
|
|
44
|
-
_this.fetch$ = new Subject();
|
|
45
|
-
_this.fetchComplete$ = new Subject();
|
|
46
|
-
_this.filtersReady$ = new Subject();
|
|
47
|
-
_this.status = true;
|
|
48
|
-
_this.chips = false;
|
|
49
|
-
_this.filterInput = true;
|
|
50
|
-
_this.queryParam = false;
|
|
51
|
-
_this.restoreMode = false;
|
|
52
|
-
_this.initialFetch = true;
|
|
53
|
-
// Empty state
|
|
54
|
-
_this.emptyStateEnabled = false;
|
|
55
|
-
_this.onDestroy$ = new Subject();
|
|
56
|
-
_this._fromJSON(config);
|
|
57
|
-
_this.initialize(config);
|
|
58
|
-
_this._headerConfig = new StyleConfig(config.header);
|
|
59
|
-
_this._groupCellConfig = new StyleConfig(config.cell);
|
|
60
|
-
_this._cellConfig = new StyleConfig(config.cell);
|
|
61
|
-
_this._footerConfig = new StyleConfig(config.footer);
|
|
62
|
-
_this.initialized$.next(true);
|
|
63
|
-
_this.subscribe();
|
|
64
|
-
if (_this.initialFetch) {
|
|
65
|
-
_this.dataController.setOperation(FsListState.Load);
|
|
66
|
-
_this.fetch$.next();
|
|
67
|
-
}
|
|
68
|
-
return _this;
|
|
69
|
-
}
|
|
70
|
-
Object.defineProperty(List.prototype, "hasSavedFilters", {
|
|
71
|
-
get: function () {
|
|
72
|
-
return !!this.filterConfig.savedFilters;
|
|
73
|
-
},
|
|
74
|
-
enumerable: true,
|
|
75
|
-
configurable: true
|
|
76
|
-
});
|
|
77
|
-
List.prototype.fetchRemote = function (query) {
|
|
78
|
-
var options = {
|
|
79
|
-
state: this.dataController.operation,
|
|
80
|
-
};
|
|
81
|
-
var result = this.fetchFn(query, options);
|
|
82
|
-
return result instanceof Promise ? from(result) : result;
|
|
83
|
-
};
|
|
84
|
-
// public loadLocal() {
|
|
85
|
-
// this.paging.updatePagingManual(this._rows);
|
|
86
|
-
// const from = (this.paging.page - 1) * this.paging.limit;
|
|
87
|
-
// const to = (this.paging.page === 1) ? this.paging.limit : this.paging.limit * this.paging.page;
|
|
88
|
-
// const sliceOfRows = this._rows.slice(from, to);
|
|
89
|
-
// this.data$.next(sliceOfRows);
|
|
90
|
-
// }
|
|
91
|
-
/**
|
|
92
|
-
* Transform templates for using
|
|
93
|
-
* @param templates
|
|
94
|
-
*/
|
|
95
|
-
List.prototype.tranformTemplatesToColumns = function (templates) {
|
|
96
|
-
var _this = this;
|
|
97
|
-
var defaultConfigs = {
|
|
98
|
-
header: this._headerConfig,
|
|
99
|
-
groupCell: this._groupCellConfig,
|
|
100
|
-
cell: this._cellConfig,
|
|
101
|
-
footer: this._footerConfig,
|
|
102
|
-
};
|
|
103
|
-
this.columns.setDefaults(defaultConfigs);
|
|
104
|
-
this.columns.initializeColumns(templates);
|
|
105
|
-
// Set sortBy default column
|
|
106
|
-
this.sorting.clearSortableColumns();
|
|
107
|
-
this.columns.columns
|
|
108
|
-
.filter(function (column) { return column.sortable && column.show; })
|
|
109
|
-
.forEach(function (column) {
|
|
110
|
-
_this.sorting.addSortableColumn(column);
|
|
111
|
-
});
|
|
112
|
-
// Default sort by
|
|
113
|
-
var externalSorting = this.externalParams.externalSorting;
|
|
114
|
-
var initialSortConfig = externalSorting || this.config.sort;
|
|
115
|
-
this.sorting.initialSortBy(initialSortConfig);
|
|
116
|
-
if (externalSorting && !this.sorting.isDefined) {
|
|
117
|
-
this.externalParams.clearSortingParams();
|
|
118
|
-
console.warn('Not able to restore persisted sorting params.', externalSorting);
|
|
119
|
-
}
|
|
120
|
-
this.initFilters();
|
|
121
|
-
this.initInfinityScroll();
|
|
122
|
-
};
|
|
123
|
-
List.prototype.reload = function () {
|
|
124
|
-
this.loading$.next(true);
|
|
125
|
-
this.dataController.setOperation(FsListState.Reload);
|
|
126
|
-
if (this.fsScrollInstance) {
|
|
127
|
-
this.paging.resetPaging();
|
|
128
|
-
this.dataController.clearRows();
|
|
129
|
-
this.fsScrollInstance.reload();
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
this.fetch$.next();
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
/**
|
|
136
|
-
* Watch page changes
|
|
137
|
-
*/
|
|
138
|
-
List.prototype.subscribe = function () {
|
|
139
|
-
var _this = this;
|
|
140
|
-
this.paging.pageChanged$
|
|
141
|
-
.pipe(takeUntil(this.onDestroy$))
|
|
142
|
-
.subscribe(function (event) {
|
|
143
|
-
_this.dataController.setOperation(FsListState.PageChange);
|
|
144
|
-
// Remove all rows if limits was changed
|
|
145
|
-
if (event.type === PageChangeType.LimitChanged && _this.paging.hasPageStrategy) {
|
|
146
|
-
_this.dataController.clearRows();
|
|
147
|
-
}
|
|
148
|
-
if (_this.paging.hasOffsetStrategy) {
|
|
149
|
-
_this.paging.updatePagination();
|
|
150
|
-
if (_this.selection) {
|
|
151
|
-
_this.selection.updateVisibleRecordsCount(_this.paging.getVisibleRecords());
|
|
152
|
-
_this.selection.updateTotalRecordsCount(_this.paging.records);
|
|
153
|
-
_this.selection.pageChanged(_this.scrollable);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
if (!_this.scrollable && !_this.paging.loadMoreEnabled) {
|
|
157
|
-
var contains = [].slice.call(document.querySelectorAll('.cdk-overlay-container')).some(function (overlay) {
|
|
158
|
-
return _this.el.nativeElement.contains(overlay);
|
|
159
|
-
});
|
|
160
|
-
var el_1 = _this.el.nativeElement;
|
|
161
|
-
if (!contains) {
|
|
162
|
-
var rect = _this.el.nativeElement.getBoundingClientRect();
|
|
163
|
-
if ((rect.top + window.pageYOffset) < window.innerHeight) {
|
|
164
|
-
el_1 = document.body;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
_this.fetchComplete$.asObservable()
|
|
168
|
-
.pipe(take(1), takeUntil(_this.onDestroy$))
|
|
169
|
-
.subscribe(function () {
|
|
170
|
-
el_1.scrollIntoView({ behavior: 'smooth' });
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
_this.fetch$.next();
|
|
174
|
-
});
|
|
175
|
-
this.sorting.sortingChanged$
|
|
176
|
-
.pipe(takeUntil(this.onDestroy$))
|
|
177
|
-
.subscribe(function () {
|
|
178
|
-
_this.dataController.setOperation(FsListState.Sort);
|
|
179
|
-
_this.paging.page = 1;
|
|
180
|
-
if (_this.fsScrollInstance) {
|
|
181
|
-
_this.dataController.clearRows();
|
|
182
|
-
_this.fsScrollInstance.reload();
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
_this.fetch$.next();
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
this.listenRowsRemove();
|
|
189
|
-
this.listenFetch();
|
|
190
|
-
};
|
|
191
|
-
List.prototype.getData = function (trackBy) {
|
|
192
|
-
var rowsData = this.dataController
|
|
193
|
-
.visibleRowsData;
|
|
194
|
-
if (trackBy) {
|
|
195
|
-
rowsData = rowsData
|
|
196
|
-
.filter(trackBy);
|
|
197
|
-
}
|
|
198
|
-
return rowsData
|
|
199
|
-
.map(function (data) {
|
|
200
|
-
return cloneDeep(data);
|
|
201
|
-
});
|
|
202
|
-
};
|
|
203
|
-
List.prototype.hasData = function (trackBy) {
|
|
204
|
-
return this.dataController.visibleRowsData.some(trackBy);
|
|
205
|
-
};
|
|
206
|
-
/**
|
|
207
|
-
* Toggle group mode status
|
|
208
|
-
* @param value
|
|
209
|
-
*/
|
|
210
|
-
List.prototype.groupEnabled = function (value) {
|
|
211
|
-
if (this.dataController.groupEnabled !== value) {
|
|
212
|
-
this.dataController.groupEnabled = value;
|
|
213
|
-
// Commented out because Ray wants to change group status in fetch map pipe
|
|
214
|
-
// and it triggers extra requests
|
|
215
|
-
// this.reload();
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
List.prototype.destroy = function () {
|
|
219
|
-
if (this._fsScrollSubscription) {
|
|
220
|
-
this._fsScrollSubscription.unsubscribe();
|
|
221
|
-
}
|
|
222
|
-
if (this.paging) {
|
|
223
|
-
this.paging.destroy();
|
|
224
|
-
}
|
|
225
|
-
if (this.sorting) {
|
|
226
|
-
this.sorting.destroy();
|
|
227
|
-
}
|
|
228
|
-
if (this.selection) {
|
|
229
|
-
this.selection.destroy();
|
|
230
|
-
}
|
|
231
|
-
if (this.filterConfig) {
|
|
232
|
-
this.filterConfig = null;
|
|
233
|
-
}
|
|
234
|
-
if (this.externalParams) {
|
|
235
|
-
this.externalParams.destroy();
|
|
236
|
-
}
|
|
237
|
-
this.columns.destroy();
|
|
238
|
-
this.onDestroy$.next();
|
|
239
|
-
this.onDestroy$.complete();
|
|
240
|
-
this.dataController.destroy();
|
|
241
|
-
};
|
|
242
|
-
/**
|
|
243
|
-
* Do initialization of table
|
|
244
|
-
* @param config
|
|
245
|
-
*/
|
|
246
|
-
List.prototype.initialize = function (config) {
|
|
247
|
-
this.columns.initConfig(config.column);
|
|
248
|
-
this.initDefaultOptions(config);
|
|
249
|
-
this.initRestore();
|
|
250
|
-
this.initActions(config.actions);
|
|
251
|
-
this.initPaging(config.paging, config.loadMore);
|
|
252
|
-
this.initSelection(config.selection, this.selectionDialog);
|
|
253
|
-
this.initGroups(config.group);
|
|
254
|
-
this.initExternalParamsController();
|
|
255
|
-
this.initializeData();
|
|
256
|
-
};
|
|
257
|
-
/**
|
|
258
|
-
* Just init options by default it it wasn't specified
|
|
259
|
-
* @param config
|
|
260
|
-
*/
|
|
261
|
-
List.prototype.initDefaultOptions = function (config) {
|
|
262
|
-
// We should prevent initial fetch in cases when it will be fetched in any case
|
|
263
|
-
// As ex. scrollable or filter will do fetch in any cases
|
|
264
|
-
if (config.initialFetch === false || config.scrollable) { // TODO fixme after tsmodel version update
|
|
265
|
-
this.initialFetch = false;
|
|
266
|
-
}
|
|
267
|
-
if (config.status === false) {
|
|
268
|
-
this.status = false;
|
|
269
|
-
}
|
|
270
|
-
if (config.chips) {
|
|
271
|
-
this.chips = config.chips;
|
|
272
|
-
}
|
|
273
|
-
if (config.filterInput === false) {
|
|
274
|
-
this.filterInput = false;
|
|
275
|
-
}
|
|
276
|
-
if (this.inDialog) {
|
|
277
|
-
this.queryParam = false;
|
|
278
|
-
}
|
|
279
|
-
else {
|
|
280
|
-
this.queryParam = (config.queryParam === void 0)
|
|
281
|
-
? true
|
|
282
|
-
: config.queryParam;
|
|
283
|
-
}
|
|
284
|
-
if (config.sorts) {
|
|
285
|
-
this.sorting.initFakeColumns(config.sorts);
|
|
286
|
-
}
|
|
287
|
-
if (!config.trackBy) {
|
|
288
|
-
this.trackBy = 'id';
|
|
289
|
-
}
|
|
290
|
-
};
|
|
291
|
-
/**
|
|
292
|
-
* Init restore row action and append Show Deleted option into filters
|
|
293
|
-
*/
|
|
294
|
-
List.prototype.initRestore = function () {
|
|
295
|
-
var _this = this;
|
|
296
|
-
if (this.restore) {
|
|
297
|
-
var restoreAction = new RowAction({
|
|
298
|
-
label: this.restore.menuLabel || 'Restore',
|
|
299
|
-
menu: true,
|
|
300
|
-
click: function (row) { _this.restoreClick(_this.restore.click, row); },
|
|
301
|
-
restore: true
|
|
302
|
-
});
|
|
303
|
-
if (!this.rowActionsRaw) {
|
|
304
|
-
this.rowActionsRaw = [];
|
|
305
|
-
}
|
|
306
|
-
this.rowActionsRaw.push(restoreAction);
|
|
307
|
-
if (!this.filters) {
|
|
308
|
-
this.filters = [];
|
|
309
|
-
}
|
|
310
|
-
if (this.restore.filter !== false) {
|
|
311
|
-
this.filters.push({
|
|
312
|
-
name: SHOW_DELETED_FILTERS_KEY,
|
|
313
|
-
type: ItemType.Checkbox,
|
|
314
|
-
label: this.restore.filterLabel || 'Show Deleted'
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
};
|
|
319
|
-
/**
|
|
320
|
-
* Init paging
|
|
321
|
-
* @param pagingConfig
|
|
322
|
-
* @param loadMore
|
|
323
|
-
*/
|
|
324
|
-
List.prototype.initPaging = function (pagingConfig, loadMore) {
|
|
325
|
-
this.paging.initWithConfig(pagingConfig, loadMore, !!this.scrollable);
|
|
326
|
-
};
|
|
327
|
-
/**
|
|
328
|
-
* Split actions by categories
|
|
329
|
-
*/
|
|
330
|
-
List.prototype.initActions = function (actions) {
|
|
331
|
-
if (actions) {
|
|
332
|
-
this.actions.setActions(actions);
|
|
333
|
-
}
|
|
334
|
-
this.hasRowActions =
|
|
335
|
-
(this.rowActionsRaw && this.rowActionsRaw.length > 0)
|
|
336
|
-
|| (this.groupActionsRaw && this.groupActionsRaw.length > 0);
|
|
337
|
-
};
|
|
338
|
-
List.prototype.initSelection = function (selectionConfig, selectionDialog) {
|
|
339
|
-
var _this = this;
|
|
340
|
-
if (selectionConfig) {
|
|
341
|
-
this.selection = new SelectionController(selectionConfig, this.trackBy, selectionDialog);
|
|
342
|
-
this.selection.setRowsCallback(function () { return _this.dataController.visibleRows; });
|
|
343
|
-
}
|
|
344
|
-
};
|
|
345
|
-
List.prototype.initializeData = function () {
|
|
346
|
-
this.dataController.setAdditionalConfigs({
|
|
347
|
-
scrollable: !!this.scrollable,
|
|
348
|
-
loadMoreEnabled: this.paging.loadMoreEnabled
|
|
349
|
-
});
|
|
350
|
-
};
|
|
351
|
-
List.prototype.initGroups = function (groupConfig) {
|
|
352
|
-
if (groupConfig) {
|
|
353
|
-
this.dataController.setGroupConfig(groupConfig);
|
|
354
|
-
this.groupActionsRaw = groupConfig.actions;
|
|
355
|
-
}
|
|
356
|
-
};
|
|
357
|
-
List.prototype.initExternalParamsController = function () {
|
|
358
|
-
this.externalParams = new ExternalParamsController(this.router, this.route, this.persistance, this.paging, this.sorting, this.queryParam);
|
|
359
|
-
};
|
|
360
|
-
/**
|
|
361
|
-
* Subscribe to fetch$ event with debounce
|
|
362
|
-
*/
|
|
363
|
-
List.prototype.listenFetch = function () {
|
|
364
|
-
var _this = this;
|
|
365
|
-
var fetch$ = this.fetch$.asObservable();
|
|
366
|
-
// Should wait until saved filters not loaded
|
|
367
|
-
if (!!this.filters && !!this.savedFilters) {
|
|
368
|
-
fetch$ = combineLatest([fetch$, this.filtersReady$])
|
|
369
|
-
.pipe(map(function (_a) {
|
|
370
|
-
var _b = __read(_a, 1), params = _b[0];
|
|
371
|
-
return params;
|
|
372
|
-
}));
|
|
373
|
-
}
|
|
374
|
-
fetch$
|
|
375
|
-
.pipe(debounceTime(50), tap(function () {
|
|
376
|
-
_this.loading$.next(true);
|
|
377
|
-
}), tap(function () {
|
|
378
|
-
var _a;
|
|
379
|
-
(_a = _this.selection) === null || _a === void 0 ? void 0 : _a.closeSelectionDialog();
|
|
380
|
-
}), map(function (params) {
|
|
381
|
-
var query = _this.paging.hasOffsetStrategy && params && params.loadOffset
|
|
382
|
-
? Object.assign({}, _this.filtersQuery, _this.paging.loadDeletedOffsetQuery)
|
|
383
|
-
: Object.assign({}, _this.filtersQuery, _this.paging.query);
|
|
384
|
-
if (_this.sorting.sortingColumn) {
|
|
385
|
-
Object.assign(query, {
|
|
386
|
-
order: _this.sorting.sortingColumn.name + "," + _this.sorting.sortingColumn.direction
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
return query;
|
|
390
|
-
}), switchMap(function (query) {
|
|
391
|
-
if (_this.columns.loadFnConfigured && !_this.columns.columnsFetched) {
|
|
392
|
-
return _this.columns.loadRemoteColumnConfigs()
|
|
393
|
-
.pipe(mapTo(query));
|
|
394
|
-
}
|
|
395
|
-
else {
|
|
396
|
-
return of(query);
|
|
397
|
-
}
|
|
398
|
-
}), switchMap(function (query) {
|
|
399
|
-
if (_this.columns.configured) {
|
|
400
|
-
Object.assign(query, {
|
|
401
|
-
columns: _this.columns.visibleColumnsNames,
|
|
402
|
-
});
|
|
403
|
-
}
|
|
404
|
-
return combineLatest([of(query), _this.fetchRemote(query)]);
|
|
405
|
-
}), catchError(function (error, source$) {
|
|
406
|
-
console.error(error);
|
|
407
|
-
return source$;
|
|
408
|
-
}), takeUntil(this.onDestroy$))
|
|
409
|
-
.subscribe(function (response) {
|
|
410
|
-
_this.completeFetch(response);
|
|
411
|
-
});
|
|
412
|
-
};
|
|
413
|
-
List.prototype.listenRowsRemove = function () {
|
|
414
|
-
var _this = this;
|
|
415
|
-
this.dataController.rowsRemoved$
|
|
416
|
-
.pipe(takeUntil(this.onDestroy$))
|
|
417
|
-
.subscribe(function (rows) {
|
|
418
|
-
if (_this.paging.enabled) {
|
|
419
|
-
var removedCount = rows.length;
|
|
420
|
-
if (_this.paging.hasPageStrategy) {
|
|
421
|
-
_this.noDataPaginationUpdate(removedCount);
|
|
422
|
-
}
|
|
423
|
-
else {
|
|
424
|
-
// Fetch more if has something for fetch
|
|
425
|
-
if (_this.dataController.hasData || _this.paging.hasNextPage) {
|
|
426
|
-
_this.dataController.setOperation(FsListState.LoadMore);
|
|
427
|
-
_this.paging.removeRows(removedCount);
|
|
428
|
-
_this.fetch$.next({ loadOffset: true });
|
|
429
|
-
}
|
|
430
|
-
else {
|
|
431
|
-
_this.noDataPaginationUpdate(removedCount);
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
// Remove from selection
|
|
436
|
-
if (_this.selection) {
|
|
437
|
-
rows.forEach(function (row) {
|
|
438
|
-
_this.selection.removeRow(row.data);
|
|
439
|
-
});
|
|
440
|
-
}
|
|
441
|
-
});
|
|
442
|
-
};
|
|
443
|
-
List.prototype.initInfinityScroll = function () {
|
|
444
|
-
var _this = this;
|
|
445
|
-
if (this.fsScrollInstance) {
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
if (this.scrollable) {
|
|
449
|
-
// Scrollable status by default
|
|
450
|
-
if (this.scrollable.status === void 0) {
|
|
451
|
-
this.scrollable.status = true;
|
|
452
|
-
}
|
|
453
|
-
this.fsScroll
|
|
454
|
-
.component(this.scrollable.name)
|
|
455
|
-
.pipe(takeUntil(this.onDestroy$))
|
|
456
|
-
.subscribe(function (fsScrollInstance) {
|
|
457
|
-
_this.fsScrollInstance = fsScrollInstance;
|
|
458
|
-
_this._fsScrollSubscription = fsScrollInstance
|
|
459
|
-
.subscribe(function () {
|
|
460
|
-
var startLoading = false;
|
|
461
|
-
var operation = _this.dataController.operation;
|
|
462
|
-
// Initial loading if initialFetch equals false
|
|
463
|
-
if (!_this.initialFetch
|
|
464
|
-
&& !_this.paging.initialized
|
|
465
|
-
&& operation !== FsListState.Reload) {
|
|
466
|
-
_this.dataController.setOperation(FsListState.Load);
|
|
467
|
-
startLoading = true;
|
|
468
|
-
}
|
|
469
|
-
else if (operation === FsListState.Reload ||
|
|
470
|
-
operation === FsListState.Filter ||
|
|
471
|
-
operation === FsListState.Sort) {
|
|
472
|
-
startLoading = true;
|
|
473
|
-
}
|
|
474
|
-
else if (_this.paging.initialized && _this.paging.hasNextPage) {
|
|
475
|
-
// Loading if content has been scrolled
|
|
476
|
-
startLoading = true;
|
|
477
|
-
_this.dataController.setOperation(FsListState.Load);
|
|
478
|
-
_this.paging.goNext();
|
|
479
|
-
}
|
|
480
|
-
if (startLoading) {
|
|
481
|
-
_this.fetch$.next();
|
|
482
|
-
fsScrollInstance.loading();
|
|
483
|
-
}
|
|
484
|
-
});
|
|
485
|
-
_this.dataController.remoteRowsChange$
|
|
486
|
-
.pipe(takeUntil(_this.onDestroy$))
|
|
487
|
-
.subscribe(function () {
|
|
488
|
-
fsScrollInstance.loaded();
|
|
489
|
-
});
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
};
|
|
493
|
-
/**
|
|
494
|
-
* Update and watch filter changes
|
|
495
|
-
*/
|
|
496
|
-
List.prototype.initFilters = function () {
|
|
497
|
-
var _this = this;
|
|
498
|
-
if (this.filterConfig) {
|
|
499
|
-
return;
|
|
500
|
-
}
|
|
501
|
-
// Merge sorting and fake sorting cols
|
|
502
|
-
// Fake sorting cols it's cols which don't represented in table cols, like abstract cols
|
|
503
|
-
var sortValues = __spread(this.sorting.sortingColumns, this.sorting.fakeSortingColumns).reduce(function (acc, column) {
|
|
504
|
-
var sortingItem = {
|
|
505
|
-
name: column.title,
|
|
506
|
-
value: column.name,
|
|
507
|
-
default: _this.sorting.sortingColumn && _this.sorting.sortingColumn.name === column.name
|
|
508
|
-
};
|
|
509
|
-
acc.push(sortingItem);
|
|
510
|
-
return acc;
|
|
511
|
-
}, []);
|
|
512
|
-
var sortConfig = this.sorting.sortingColumn
|
|
513
|
-
? { value: this.sorting.sortingColumn.name, direction: this.sorting.sortingColumn.direction }
|
|
514
|
-
: null;
|
|
515
|
-
// Config
|
|
516
|
-
this.filterConfig = {
|
|
517
|
-
persist: this.persist,
|
|
518
|
-
items: this.filters || [],
|
|
519
|
-
savedFilters: this.savedFilters,
|
|
520
|
-
inline: this.inlineFilters,
|
|
521
|
-
actions: this.actions.actions,
|
|
522
|
-
queryParam: this.queryParam,
|
|
523
|
-
sorts: sortValues,
|
|
524
|
-
sort: sortConfig,
|
|
525
|
-
chips: this.chips,
|
|
526
|
-
init: this.filterInit.bind(this),
|
|
527
|
-
change: this.filterChange.bind(this),
|
|
528
|
-
reload: this.reload.bind(this),
|
|
529
|
-
sortChange: this.filterSort.bind(this),
|
|
530
|
-
};
|
|
531
|
-
};
|
|
532
|
-
/**
|
|
533
|
-
* Callback when Filter has been initialized
|
|
534
|
-
* @param filters
|
|
535
|
-
*/
|
|
536
|
-
List.prototype.filterInit = function (filters) {
|
|
537
|
-
if (this.filterInitCb) {
|
|
538
|
-
this.filterInitCb(filters);
|
|
539
|
-
}
|
|
540
|
-
this.filtersQuery = filters;
|
|
541
|
-
this.checkRestoreFilter();
|
|
542
|
-
};
|
|
543
|
-
/**
|
|
544
|
-
* Callback when Filter has been changed
|
|
545
|
-
* @param filterQuery
|
|
546
|
-
* @param filterSort
|
|
547
|
-
*/
|
|
548
|
-
List.prototype.filterChange = function (filterQuery, filterSort) {
|
|
549
|
-
if (this.filterChangeCb) {
|
|
550
|
-
this.filterChangeCb(filterQuery, filterSort);
|
|
551
|
-
}
|
|
552
|
-
this.filtersQuery = filterQuery;
|
|
553
|
-
this.restoreMode = false;
|
|
554
|
-
// Restore option
|
|
555
|
-
this.checkRestoreFilter();
|
|
556
|
-
if (this.restore && this.restore.reload) {
|
|
557
|
-
this.reload();
|
|
558
|
-
}
|
|
559
|
-
this.dataController.setOperation(FsListState.Filter);
|
|
560
|
-
// Reset paging for request with correct offset
|
|
561
|
-
this.paging.resetPaging();
|
|
562
|
-
if (this.fsScrollInstance) {
|
|
563
|
-
this.dataController.clearRows();
|
|
564
|
-
this.fsScrollInstance.reload();
|
|
565
|
-
}
|
|
566
|
-
else {
|
|
567
|
-
this.fetch$.next();
|
|
568
|
-
}
|
|
569
|
-
};
|
|
570
|
-
List.prototype.checkRestoreFilter = function () {
|
|
571
|
-
// Restore option
|
|
572
|
-
if (this.restore && this.filtersQuery[SHOW_DELETED_FILTERS_KEY]) {
|
|
573
|
-
delete this.filtersQuery[SHOW_DELETED_FILTERS_KEY];
|
|
574
|
-
Object.assign(this.filtersQuery, this.restore.query);
|
|
575
|
-
this.restoreMode = true;
|
|
576
|
-
}
|
|
577
|
-
};
|
|
578
|
-
// Callback when Filter sort has been changed
|
|
579
|
-
List.prototype.filterSort = function (filterQuery, filterSort) {
|
|
580
|
-
if (filterSort) {
|
|
581
|
-
this.sorting.sortByColumnWithName(filterSort.value);
|
|
582
|
-
var sortDirection = filterSort.direction === 'asc' ? SortingDirection.asc : SortingDirection.desc;
|
|
583
|
-
this.sorting.sortDirection(sortDirection);
|
|
584
|
-
}
|
|
585
|
-
else {
|
|
586
|
-
// FIXME need to be refactored...
|
|
587
|
-
this.sorting.sortingColumn = void 0;
|
|
588
|
-
this.reload();
|
|
589
|
-
}
|
|
590
|
-
};
|
|
591
|
-
List.prototype.completeFetch = function (_a) {
|
|
592
|
-
var _b = __read(_a, 2), query = _b[0], response = _b[1];
|
|
593
|
-
var _c;
|
|
594
|
-
if (!this.paging.page) {
|
|
595
|
-
this.paging.page = 1;
|
|
596
|
-
}
|
|
597
|
-
if (response.paging) {
|
|
598
|
-
var displayed = (Array.isArray(response.data) && response.data.length) || 0;
|
|
599
|
-
this.paging.updatePaging(response.paging, displayed, this.dataController.operation === FsListState.LoadMore);
|
|
600
|
-
}
|
|
601
|
-
else if (this.paging.enabled) {
|
|
602
|
-
console.log('%c FsList Warning ', 'color: white; background-color: #ffcc0b', 'Pagination does not configured properly. ' +
|
|
603
|
-
'Pagination is enabled, but http response does not contain "paging" field. ' +
|
|
604
|
-
'You have to set "paging: false" in config or add "paging" field to response.');
|
|
605
|
-
}
|
|
606
|
-
/// must be before selection, because seletion use records
|
|
607
|
-
this.dataController.setRowsFromResponse(response.data);
|
|
608
|
-
///
|
|
609
|
-
// Update selection params
|
|
610
|
-
if (this.selection) {
|
|
611
|
-
if (this.paging.enabled) {
|
|
612
|
-
this.selection.pageChanged(this.scrollable);
|
|
613
|
-
this.selection.updateVisibleRecordsCount(this.paging.getVisibleRecords());
|
|
614
|
-
this.selection.updateTotalRecordsCount(this.paging.records);
|
|
615
|
-
}
|
|
616
|
-
else {
|
|
617
|
-
var count = response.paging && response.paging.records
|
|
618
|
-
|| Array.isArray(response.data) && response.data.length;
|
|
619
|
-
this.selection.updateVisibleRecordsCount(count);
|
|
620
|
-
this.selection.updateTotalRecordsCount(count);
|
|
621
|
-
}
|
|
622
|
-
this.selection.selectedRowsIntersection(this.dataController.visibleRowsData);
|
|
623
|
-
}
|
|
624
|
-
if (((_c = this.emptyState) === null || _c === void 0 ? void 0 : _c.validate) && this.emptyStateTemplate) {
|
|
625
|
-
this.emptyStateEnabled = this.emptyState.validate(query, cloneDeep(response.data));
|
|
626
|
-
}
|
|
627
|
-
this.fetchComplete$.next();
|
|
628
|
-
this.loading$.next(false);
|
|
629
|
-
};
|
|
630
|
-
/**
|
|
631
|
-
* Will do some actions if you removed item and item was last on his own page
|
|
632
|
-
*
|
|
633
|
-
* Ex: if list has 3 pages and on third page you have only one item. And you just deleted this item.
|
|
634
|
-
* You must go to second page, but if it was last page and you can't go back -> just reload
|
|
635
|
-
*
|
|
636
|
-
* @param deletedCount
|
|
637
|
-
*/
|
|
638
|
-
List.prototype.noDataPaginationUpdate = function (deletedCount) {
|
|
639
|
-
if (!this.dataController.hasData) {
|
|
640
|
-
if (this.paging.page > 1) {
|
|
641
|
-
this.paging.goToPage(this.paging.page - 1 || 1);
|
|
642
|
-
}
|
|
643
|
-
else {
|
|
644
|
-
this.reload();
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
this.paging.records -= deletedCount;
|
|
648
|
-
this.paging.updatePagination();
|
|
649
|
-
if (this.dataController.hasData && this.selection) {
|
|
650
|
-
this.selection.updateVisibleRecordsCount(this.dataController.visibleRowsCount);
|
|
651
|
-
this.selection.updateTotalRecordsCount(this.paging.records);
|
|
652
|
-
}
|
|
653
|
-
};
|
|
654
|
-
/**
|
|
655
|
-
* Temporary solution, will do auto subscribe if was returned Observable.
|
|
656
|
-
*
|
|
657
|
-
* TODO: MOVE THIS PEACE OF CODE TO SPECIAL PLACE
|
|
658
|
-
*
|
|
659
|
-
* @param restoreClickCallback
|
|
660
|
-
* @param row
|
|
661
|
-
*/
|
|
662
|
-
List.prototype.restoreClick = function (restoreClickCallback, row) {
|
|
663
|
-
var _this = this;
|
|
664
|
-
var restoreClickResult = restoreClickCallback(row);
|
|
665
|
-
if (restoreClickResult instanceof Observable) {
|
|
666
|
-
restoreClickResult
|
|
667
|
-
.pipe(take(1), takeUntil(this.onDestroy$))
|
|
668
|
-
.subscribe({
|
|
669
|
-
next: function () { return _this.reload(); },
|
|
670
|
-
error: function () { },
|
|
671
|
-
});
|
|
672
|
-
}
|
|
673
|
-
};
|
|
674
|
-
__decorate([
|
|
675
|
-
Alias(),
|
|
676
|
-
__metadata("design:type", String)
|
|
677
|
-
], List.prototype, "heading", void 0);
|
|
678
|
-
__decorate([
|
|
679
|
-
Alias(),
|
|
680
|
-
__metadata("design:type", String)
|
|
681
|
-
], List.prototype, "trackBy", void 0);
|
|
682
|
-
__decorate([
|
|
683
|
-
Alias(),
|
|
684
|
-
__metadata("design:type", String)
|
|
685
|
-
], List.prototype, "subheading", void 0);
|
|
686
|
-
__decorate([
|
|
687
|
-
Alias(),
|
|
688
|
-
__metadata("design:type", Object)
|
|
689
|
-
], List.prototype, "inlineFilters", void 0);
|
|
690
|
-
__decorate([
|
|
691
|
-
Alias('rowActions'),
|
|
692
|
-
__metadata("design:type", Array)
|
|
693
|
-
], List.prototype, "rowActionsRaw", void 0);
|
|
694
|
-
__decorate([
|
|
695
|
-
Alias('rowClass'),
|
|
696
|
-
__metadata("design:type", Object)
|
|
697
|
-
], List.prototype, "rowClass", void 0);
|
|
698
|
-
__decorate([
|
|
699
|
-
Alias(),
|
|
700
|
-
__metadata("design:type", Object)
|
|
701
|
-
], List.prototype, "rowEvents", void 0);
|
|
702
|
-
__decorate([
|
|
703
|
-
Alias(),
|
|
704
|
-
__metadata("design:type", Object)
|
|
705
|
-
], List.prototype, "restore", void 0);
|
|
706
|
-
__decorate([
|
|
707
|
-
Alias(),
|
|
708
|
-
__metadata("design:type", Object)
|
|
709
|
-
], List.prototype, "columnTemplates", void 0);
|
|
710
|
-
__decorate([
|
|
711
|
-
Alias(),
|
|
712
|
-
__metadata("design:type", Boolean)
|
|
713
|
-
], List.prototype, "persist", void 0);
|
|
714
|
-
__decorate([
|
|
715
|
-
Alias(),
|
|
716
|
-
__metadata("design:type", Object)
|
|
717
|
-
], List.prototype, "filters", void 0);
|
|
718
|
-
__decorate([
|
|
719
|
-
Alias('filterInit'),
|
|
720
|
-
__metadata("design:type", Function)
|
|
721
|
-
], List.prototype, "filterInitCb", void 0);
|
|
722
|
-
__decorate([
|
|
723
|
-
Alias('filterChange'),
|
|
724
|
-
__metadata("design:type", Function)
|
|
725
|
-
], List.prototype, "filterChangeCb", void 0);
|
|
726
|
-
__decorate([
|
|
727
|
-
Alias(),
|
|
728
|
-
__metadata("design:type", Object)
|
|
729
|
-
], List.prototype, "savedFilters", void 0);
|
|
730
|
-
__decorate([
|
|
731
|
-
Alias(),
|
|
732
|
-
__metadata("design:type", Object)
|
|
733
|
-
], List.prototype, "scrollable", void 0);
|
|
734
|
-
__decorate([
|
|
735
|
-
Alias(),
|
|
736
|
-
__metadata("design:type", Object)
|
|
737
|
-
], List.prototype, "noResults", void 0);
|
|
738
|
-
__decorate([
|
|
739
|
-
Alias(),
|
|
740
|
-
__metadata("design:type", Object)
|
|
741
|
-
], List.prototype, "emptyState", void 0);
|
|
742
|
-
__decorate([
|
|
743
|
-
Alias('fetch'),
|
|
744
|
-
__metadata("design:type", Function)
|
|
745
|
-
], List.prototype, "fetchFn", void 0);
|
|
746
|
-
return List;
|
|
747
|
-
}(Model));
|
|
748
|
-
export { List };
|
|
749
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvbGlzdC8iLCJzb3VyY2VzIjpbImFwcC9jbGFzc2VzL2xpc3QtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFxRCxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUlqRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV4QyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixJQUFJLEVBQ0osVUFBVSxFQUNWLEVBQUUsRUFDRixPQUFPLEVBRVIsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFlBQVksRUFDWixHQUFHLEVBQ0gsS0FBSyxFQUNMLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFpQjFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlC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QUFSLEtBQUssRUFBRTs7NENBQTJCO0lBQzFCO1FBQVIsS0FBSyxFQUFFOzsrQ0FBMkI7SUFFZDtRQUFwQixLQUFLLENBQUMsWUFBWSxDQUFDOzsrQ0FBNkI7SUFFOUI7UUFBbEIsS0FBSyxDQUFDLFVBQVUsQ0FBQzs7MENBQWlCO0lBQzFCO1FBQVIsS0FBSyxFQUFFOzsyQ0FBdUI7SUFDdEI7UUFBUixLQUFLLEVBQUU7O3lDQUFxQztJQUNwQztRQUFSLEtBQUssRUFBRTs7aURBQTZCO0lBQzVCO1FBQVIsS0FBSyxFQUFFOzt5Q0FBeUI7SUFDeEI7UUFBUixLQUFLLEVBQUU7O3lDQUFxQjtJQUNSO1FBQXBCLEtBQUssQ0FBQyxZQUFZLENBQUM7OzhDQUErQjtJQUM1QjtRQUF0QixLQUFLLENBQUMsY0FBYyxDQUFDOztnREFBaUM7SUFDOUM7UUFBUixLQUFLLEVBQUU7OzhDQUFnRDtJQUMvQztRQUFSLEtBQUssRUFBRTs7NENBQTJEO0lBQzFEO1FBQVIsS0FBSyxFQUFFOzsyQ0FBeUM7SUFDeEM7UUFBUixLQUFLLEVBQUU7OzRDQUEyQztJQUVuQztRQUFmLEtBQUssQ0FBQyxPQUFPLENBQUM7O3lDQUErQjtJQTZ6QmhELFdBQUM7Q0FBQSxBQWwxQkQsQ0FBMEIsS0FBSyxHQWsxQjlCO1NBbDFCWSxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IENoYW5nZUZuLCBGaWx0ZXJDb25maWcsIElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWcsIEl0ZW1UeXBlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcclxuaW1wb3J0IHsgRnNTY3JvbGxJbnN0YW5jZSwgRnNTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvc2Nyb2xsJztcclxuaW1wb3J0IHsgU2VsZWN0aW9uRGlhbG9nIH0gZnJvbSAnQGZpcmVzdGl0Y2gvc2VsZWN0aW9uJztcclxuXHJcbmltcG9ydCB7IEFsaWFzLCBNb2RlbCB9IGZyb20gJ3RzbW9kZWxzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmVoYXZpb3JTdWJqZWN0LFxyXG4gIGNvbWJpbmVMYXRlc3QsXHJcbiAgZnJvbSxcclxuICBPYnNlcnZhYmxlLFxyXG4gIG9mLFxyXG4gIFN1YmplY3QsXHJcbiAgU3Vic2NyaXB0aW9uXHJcbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7XHJcbiAgY2F0Y2hFcnJvcixcclxuICBkZWJvdW5jZVRpbWUsXHJcbiAgbWFwLFxyXG4gIG1hcFRvLFxyXG4gIHN3aXRjaE1hcCxcclxuICB0YWtlLFxyXG4gIHRha2VVbnRpbCxcclxuICB0YXAsXHJcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5cclxuaW1wb3J0IHsgU29ydGluZ0RpcmVjdGlvbiB9IGZyb20gJy4uL21vZGVscy9jb2x1bW4ubW9kZWwnO1xyXG5cclxuLy8gSW50ZXJmYWNlc1xyXG5pbXBvcnQge1xyXG4gIEZzTGlzdENvbmZpZyxcclxuICBGc0xpc3RFbXB0eVN0YXRlQ29uZmlnLCBGc0xpc3RGZXRjaEZuLCBGc0xpc3RGZXRjaE9wdGlvbnMsXHJcbiAgRnNMaXN0RmV0Y2hTdWJzY3JpcHRpb24sXHJcbiAgRnNMaXN0R3JvdXBDb25maWcsXHJcbiAgRnNMaXN0TG9hZE1vcmVDb25maWcsXHJcbiAgRnNMaXN0Tm9SZXN1bHRzQ29uZmlnLFxyXG4gIEZzTGlzdFJlc3RvcmVDb25maWcsXHJcbiAgRnNMaXN0U2Nyb2xsYWJsZUNvbmZpZyxcclxuICBGc0xpc3RTZWxlY3Rpb25Db25maWcsXHJcbiAgRnNMaXN0VHJhY2tCeUZuLFxyXG4gIEZzUGFnaW5nLFxyXG4gIFBhZ2VDaGFuZ2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgU3R5bGVDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvc3R5bGVDb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBSb3dBY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvcm93LWFjdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IENvbHVtbnNDb250cm9sbGVyIH0gZnJvbSAnLi9jb2x1bW5zLWNvbnRyb2xsZXInO1xyXG5pbXBvcnQgeyBQYWdlQ2hhbmdlVHlwZSB9IGZyb20gJy4uL2VudW1zL3BhZ2UtY2hhbmdlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IEFjdGlvbnNDb250cm9sbGVyIH0gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCB7IERhdGFDb250cm9sbGVyIH0gZnJvbSAnLi9kYXRhLWNvbnRyb2xsZXInO1xyXG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29udHJvbGxlciB9IGZyb20gJy4vcGFnaW5hdGlvbi1jb250cm9sbGVyJztcclxuaW1wb3J0IHsgU2VsZWN0aW9uQ29udHJvbGxlciB9IGZyb20gJy4vc2VsZWN0aW9uLWNvbnRyb2xsZXInO1xyXG5pbXBvcnQgeyBTb3J0aW5nQ29udHJvbGxlciB9IGZyb20gJy4vc29ydGluZy1jb250cm9sbGVyJztcclxuXHJcbmltcG9ydCB7IEZzTGlzdFN0YXRlIH0gZnJvbSAnLi4vZW51bXMvc3RhdGUuZW51bSc7XHJcbmltcG9ydCB7IFBlcnNpc3RhbmNlQ29udHJvbGxlciB9IGZyb20gJy4vcGVyc2lzdGFuY2UtY29udHJvbGxlcic7XHJcbmltcG9ydCB7IEV4dGVybmFsUGFyYW1zQ29udHJvbGxlciB9IGZyb20gJy4vZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXInO1xyXG5cclxuY29uc3QgU0hPV19ERUxFVEVEX0ZJTFRFUlNfS0VZID0gJyQkX3Nob3dfZGVsZXRlZF8kJCc7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIExpc3QgZXh0ZW5kcyBNb2RlbCB7XHJcbiAgQEFsaWFzKCkgcHVibGljIGhlYWRpbmc6IHN0cmluZztcclxuICBAQWxpYXMoKSBwdWJsaWMgdHJhY2tCeTogc3RyaW5nO1xyXG4gIEBBbGlhcygpIHB1YmxpYyBzdWJoZWFkaW5nOiBzdHJpbmc7XHJcbiAgQEFsaWFzKCkgcHVibGljIGlubGluZUZpbHRlcnM6IGFueTtcclxuICAvLyBAQWxpYXMoJ2FjdGlvbnMnLCBBY3Rpb24pIHB1YmxpYyBhY3Rpb25zOiBBY3Rpb25bXTtcclxuICBAQWxpYXMoJ3Jvd0FjdGlvbnMnKSBwdWJsaWMgcm93QWN0aW9uc1JhdzogYW55W107XHJcbiAgcHVibGljIGdyb3VwQWN0aW9uc1JhdzogYW55W107XHJcbiAgQEFsaWFzKCdyb3dDbGFzcycpIHB1YmxpYyByb3dDbGFzcztcclxuICBAQWxpYXMoKSBwdWJsaWMgcm93RXZlbnRzOiBhbnk7XHJcbiAgQEFsaWFzKCkgcHVibGljIHJlc3RvcmU6IEZzTGlzdFJlc3RvcmVDb25maWc7XHJcbiAgQEFsaWFzKCkgcHVibGljIGNvbHVtblRlbXBsYXRlczogYW55O1xyXG4gIEBBbGlhcygpIHB1YmxpYyBwZXJzaXN0OiBib29sZWFuO1xyXG4gIEBBbGlhcygpIHB1YmxpYyBmaWx0ZXJzID0gW107XHJcbiAgQEFsaWFzKCdmaWx0ZXJJbml0JykgcHVibGljIGZpbHRlckluaXRDYjogQ2hhbmdlRm47XHJcbiAgQEFsaWFzKCdmaWx0ZXJDaGFuZ2UnKSBwdWJsaWMgZmlsdGVyQ2hhbmdlQ2I6IENoYW5nZUZuO1xyXG4gIEBBbGlhcygpIHB1YmxpYyBzYXZlZEZpbHRlcnM6IElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWc7XHJcbiAgQEFsaWFzKCkgcHVibGljIHNjcm9sbGFibGU6IEZzTGlzdFNjcm9sbGFibGVDb25maWcgfCBmYWxzZSA9IGZhbHNlO1xyXG4gIEBBbGlhcygpIHB1YmxpYyBub1Jlc3VsdHM6IEZzTGlzdE5vUmVzdWx0c0NvbmZpZztcclxuICBAQWxpYXMoKSBwdWJsaWMgZW1wdHlTdGF0ZTogRnNMaXN0RW1wdHlTdGF0ZUNvbmZpZztcclxuICAvLyBAQWxpYXMoKSBwdWJsaWMgaW5pdGlhbEZldGNoID0gdHJ1ZTsgLy9UT0RPIGZpeG1lXHJcbiAgQEFsaWFzKCdmZXRjaCcpIHB1YmxpYyBmZXRjaEZuOiBGc0xpc3RGZXRjaEZuO1xyXG4gIC8vIEBBbGlhcygncm93cycpIHByaXZhdGUgX3Jvd3M6IGFueTtcclxuXHJcbiAgcHVibGljIGluaXRpYWxpemVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xyXG4gIHB1YmxpYyBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xyXG5cclxuICAvLyBwdWJsaWMgb3BlcmF0aW9uOiBPcGVyYXRpb247XHJcbiAgcHVibGljIGZpbHRlcnNRdWVyeTogYW55O1xyXG5cclxuICBwdWJsaWMgaGFzUm93QWN0aW9ucztcclxuICBwdWJsaWMgcGFnaW5nID0gbmV3IFBhZ2luYXRpb25Db250cm9sbGVyKCk7XHJcblxyXG4gIHB1YmxpYyBjb2x1bW5zID0gbmV3IENvbHVtbnNDb250cm9sbGVyKCk7XHJcbiAgcHVibGljIGFjdGlvbnMgPSBuZXcgQWN0aW9uc0NvbnRyb2xsZXIoKTtcclxuICBwdWJsaWMgZGF0YUNvbnRyb2xsZXIgPSBuZXcgRGF0YUNvbnRyb2xsZXIoKTtcclxuICBwdWJsaWMgc29ydGluZyA9IG5ldyBTb3J0aW5nQ29udHJvbGxlcigpO1xyXG4gIHB1YmxpYyBleHRlcm5hbFBhcmFtczogRXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyO1xyXG4gIHB1YmxpYyBzZWxlY3Rpb246IFNlbGVjdGlvbkNvbnRyb2xsZXI7XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJDb25maWc6IEZpbHRlckNvbmZpZyA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBmZXRjaCQgPSBuZXcgU3ViamVjdDxGc0xpc3RGZXRjaFN1YnNjcmlwdGlvbiB8IHZvaWQ+KCk7XHJcbiAgcHVibGljIGZldGNoQ29tcGxldGUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwdWJsaWMgZmlsdGVyc1JlYWR5JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIHB1YmxpYyBzdGF0dXMgPSB0cnVlO1xyXG4gIHB1YmxpYyBjaGlwcyA9IGZhbHNlO1xyXG4gIHB1YmxpYyBmaWx0ZXJJbnB1dCA9IHRydWU7XHJcbiAgcHVibGljIHF1ZXJ5UGFyYW0gPSBmYWxzZTtcclxuICBwdWJsaWMgcmVzdG9yZU1vZGUgPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGluaXRpYWxGZXRjaCA9IHRydWU7XHJcblxyXG4gIC8vIEVtcHR5IHN0YXRlXHJcbiAgcHVibGljIGVtcHR5U3RhdGVFbmFibGVkID0gZmFsc2U7XHJcbiAgcHVibGljIGVtcHR5U3RhdGVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgcHVibGljIGZzU2Nyb2xsSW5zdGFuY2U6IEZzU2Nyb2xsSW5zdGFuY2U7XHJcblxyXG4gIHB1YmxpYyBvbkRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGVyQ29uZmlnOiBTdHlsZUNvbmZpZztcclxuICBwcml2YXRlIHJlYWRvbmx5IF9ncm91cENlbGxDb25maWc6IFN0eWxlQ29uZmlnO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NlbGxDb25maWc6IFN0eWxlQ29uZmlnO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Zvb3RlckNvbmZpZzogU3R5bGVDb25maWc7XHJcblxyXG4gIHByaXZhdGUgX2ZzU2Nyb2xsU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgY29uZmlnOiBGc0xpc3RDb25maWcgPSB7fSxcclxuICAgIHByaXZhdGUgZnNTY3JvbGw6IEZzU2Nyb2xsU2VydmljZSxcclxuICAgIHByaXZhdGUgc2VsZWN0aW9uRGlhbG9nOiBTZWxlY3Rpb25EaWFsb2csXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHBlcnNpc3RhbmNlOiBQZXJzaXN0YW5jZUNvbnRyb2xsZXIsXHJcbiAgICBwcml2YXRlIGluRGlhbG9nOiBib29sZWFuLFxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuX2Zyb21KU09OKGNvbmZpZyk7XHJcblxyXG4gICAgdGhpcy5pbml0aWFsaXplKGNvbmZpZyk7XHJcblxyXG4gICAgdGhpcy5faGVhZGVyQ29uZmlnID0gbmV3IFN0eWxlQ29uZmlnKGNvbmZpZy5oZWFkZXIpO1xyXG4gICAgdGhpcy5fZ3JvdXBDZWxsQ29uZmlnID0gbmV3IFN0eWxlQ29uZmlnKGNvbmZpZy5jZWxsKTtcclxuICAgIHRoaXMuX2NlbGxDb25maWcgPSBuZXcgU3R5bGVDb25maWcoY29uZmlnLmNlbGwpO1xyXG4gICAgdGhpcy5fZm9vdGVyQ29uZmlnID0gbmV3IFN0eWxlQ29uZmlnKGNvbmZpZy5mb290ZXIpO1xyXG5cclxuICAgIHRoaXMuaW5pdGlhbGl6ZWQkLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pbml0aWFsRmV0Y2gpIHtcclxuICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuTG9hZCk7XHJcbiAgICAgIHRoaXMuZmV0Y2gkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGhhc1NhdmVkRmlsdGVycygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMuZmlsdGVyQ29uZmlnLnNhdmVkRmlsdGVycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmZXRjaFJlbW90ZShxdWVyeSkge1xyXG4gICAgY29uc3Qgb3B0aW9uczogRnNMaXN0RmV0Y2hPcHRpb25zID0ge1xyXG4gICAgICBzdGF0ZTogdGhpcy5kYXRhQ29udHJvbGxlci5vcGVyYXRpb24sXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHJlc3VsdDogYW55ID0gdGhpcy5mZXRjaEZuKHF1ZXJ5LCBvcHRpb25zKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSA/IGZyb20ocmVzdWx0KSA6IHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBsb2FkTG9jYWwoKSB7XHJcbiAgLy8gICB0aGlzLnBhZ2luZy51cGRhdGVQYWdpbmdNYW51YWwodGhpcy5fcm93cyk7XHJcbiAgLy8gICBjb25zdCBmcm9tID0gKHRoaXMucGFnaW5nLnBhZ2UgLSAxKSAqIHRoaXMucGFnaW5nLmxpbWl0O1xyXG4gIC8vICAgY29uc3QgdG8gPSAodGhpcy5wYWdpbmcucGFnZSA9PT0gMSkgPyB0aGlzLnBhZ2luZy5saW1pdCA6IHRoaXMucGFnaW5nLmxpbWl0ICogdGhpcy5wYWdpbmcucGFnZTtcclxuICAvLyAgIGNvbnN0IHNsaWNlT2ZSb3dzID0gdGhpcy5fcm93cy5zbGljZShmcm9tLCB0byk7XHJcbiAgLy8gICB0aGlzLmRhdGEkLm5leHQoc2xpY2VPZlJvd3MpO1xyXG4gIC8vIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhbnNmb3JtIHRlbXBsYXRlcyBmb3IgdXNpbmdcclxuICAgKiBAcGFyYW0gdGVtcGxhdGVzXHJcbiAgICovXHJcbiAgcHVibGljIHRyYW5mb3JtVGVtcGxhdGVzVG9Db2x1bW5zKHRlbXBsYXRlcykge1xyXG4gICAgY29uc3QgZGVmYXVsdENvbmZpZ3MgPSB7XHJcbiAgICAgIGhlYWRlcjogdGhpcy5faGVhZGVyQ29uZmlnLFxyXG4gICAgICBncm91cENlbGw6IHRoaXMuX2dyb3VwQ2VsbENvbmZpZyxcclxuICAgICAgY2VsbDogdGhpcy5fY2VsbENvbmZpZyxcclxuICAgICAgZm9vdGVyOiB0aGlzLl9mb290ZXJDb25maWcsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuY29sdW1ucy5zZXREZWZhdWx0cyhkZWZhdWx0Q29uZmlncyk7XHJcbiAgICB0aGlzLmNvbHVtbnMuaW5pdGlhbGl6ZUNvbHVtbnModGVtcGxhdGVzKTtcclxuXHJcbiAgICAvLyBTZXQgc29ydEJ5IGRlZmF1bHQgY29sdW1uXHJcbiAgICB0aGlzLnNvcnRpbmcuY2xlYXJTb3J0YWJsZUNvbHVtbnMoKTtcclxuICAgIHRoaXMuY29sdW1ucy5jb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zaG93KVxyXG4gICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zb3J0aW5nLmFkZFNvcnRhYmxlQ29sdW1uKGNvbHVtbik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIERlZmF1bHQgc29ydCBieVxyXG4gICAgY29uc3QgZXh0ZXJuYWxTb3J0aW5nID0gdGhpcy5leHRlcm5hbFBhcmFtcy5leHRlcm5hbFNvcnRpbmc7XHJcbiAgICBjb25zdCBpbml0aWFsU29ydENvbmZpZyA9IGV4dGVybmFsU29ydGluZyB8fCB0aGlzLmNvbmZpZy5zb3J0O1xyXG4gICAgdGhpcy5zb3J0aW5nLmluaXRpYWxTb3J0QnkoaW5pdGlhbFNvcnRDb25maWcpO1xyXG5cclxuICAgIGlmIChleHRlcm5hbFNvcnRpbmcgJiYgIXRoaXMuc29ydGluZy5pc0RlZmluZWQpIHtcclxuICAgICAgdGhpcy5leHRlcm5hbFBhcmFtcy5jbGVhclNvcnRpbmdQYXJhbXMoKTtcclxuXHJcbiAgICAgIGNvbnNvbGUud2FybignTm90IGFibGUgdG8gcmVzdG9yZSBwZXJzaXN0ZWQgc29ydGluZyBwYXJhbXMuJywgZXh0ZXJuYWxTb3J0aW5nKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXRGaWx0ZXJzKCk7XHJcbiAgICB0aGlzLmluaXRJbmZpbml0eVNjcm9sbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbG9hZCgpIHtcclxuICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcclxuXHJcbiAgICB0aGlzLmRhdGFDb250cm9sbGVyLnNldE9wZXJhdGlvbihGc0xpc3RTdGF0ZS5SZWxvYWQpO1xyXG5cclxuICAgIGlmICh0aGlzLmZzU2Nyb2xsSW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5wYWdpbmcucmVzZXRQYWdpbmcoKTtcclxuICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5jbGVhclJvd3MoKTtcclxuICAgICAgdGhpcy5mc1Njcm9sbEluc3RhbmNlLnJlbG9hZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mZXRjaCQubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2F0Y2ggcGFnZSBjaGFuZ2VzXHJcbiAgICovXHJcbiAgcHVibGljIHN1YnNjcmliZSgpIHtcclxuICAgIHRoaXMucGFnaW5nLnBhZ2VDaGFuZ2VkJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogUGFnZUNoYW5nZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLlBhZ2VDaGFuZ2UpO1xyXG5cclxuICAgICAgICAvLyBSZW1vdmUgYWxsIHJvd3MgaWYgbGltaXRzIHdhcyBjaGFuZ2VkXHJcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFBhZ2VDaGFuZ2VUeXBlLkxpbWl0Q2hhbmdlZCAmJiB0aGlzLnBhZ2luZy5oYXNQYWdlU3RyYXRlZ3kpIHtcclxuICAgICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuY2xlYXJSb3dzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5wYWdpbmcuaGFzT2Zmc2V0U3RyYXRlZ3kpIHtcclxuICAgICAgICAgIHRoaXMucGFnaW5nLnVwZGF0ZVBhZ2luYXRpb24oKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVmlzaWJsZVJlY29yZHNDb3VudCh0aGlzLnBhZ2luZy5nZXRWaXNpYmxlUmVjb3JkcygpKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVG90YWxSZWNvcmRzQ291bnQodGhpcy5wYWdpbmcucmVjb3Jkcyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnBhZ2VDaGFuZ2VkKHRoaXMuc2Nyb2xsYWJsZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsYWJsZSAmJiAhdGhpcy5wYWdpbmcubG9hZE1vcmVFbmFibGVkKSB7XHJcblxyXG4gICAgICAgICAgY29uc3QgY29udGFpbnMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jZGstb3ZlcmxheS1jb250YWluZXInKSkuc29tZShvdmVybGF5ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWwubmF0aXZlRWxlbWVudC5jb250YWlucyhvdmVybGF5KTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGxldCBlbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgICBpZiAoIWNvbnRhaW5zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGlmICgocmVjdC50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQpIDwgd2luZG93LmlubmVySGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgZWwgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5mZXRjaENvbXBsZXRlJC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmV0Y2gkLm5leHQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5zb3J0aW5nLnNvcnRpbmdDaGFuZ2VkJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFDb250cm9sbGVyLnNldE9wZXJhdGlvbihGc0xpc3RTdGF0ZS5Tb3J0KTtcclxuICAgICAgICB0aGlzLnBhZ2luZy5wYWdlID0gMTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZnNTY3JvbGxJbnN0YW5jZSkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5jbGVhclJvd3MoKTtcclxuICAgICAgICAgIHRoaXMuZnNTY3JvbGxJbnN0YW5jZS5yZWxvYWQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5mZXRjaCQubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5saXN0ZW5Sb3dzUmVtb3ZlKCk7XHJcbiAgICB0aGlzLmxpc3RlbkZldGNoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YSh0cmFja0J5PzogRnNMaXN0VHJhY2tCeUZuKSB7XHJcbiAgICBsZXQgcm93c0RhdGEgPSB0aGlzLmRhdGFDb250cm9sbGVyXHJcbiAgICAgIC52aXNpYmxlUm93c0RhdGE7XHJcblxyXG4gICAgaWYgKHRyYWNrQnkpIHtcclxuICAgICAgcm93c0RhdGEgPSByb3dzRGF0YVxyXG4gICAgICAgIC5maWx0ZXIodHJhY2tCeSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJvd3NEYXRhXHJcbiAgICAgIC5tYXAoKGRhdGEpID0+IHtcclxuICAgICAgICByZXR1cm4gY2xvbmVEZWVwKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYXNEYXRhKHRyYWNrQnk6IEZzTGlzdFRyYWNrQnlGbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YUNvbnRyb2xsZXIudmlzaWJsZVJvd3NEYXRhLnNvbWUodHJhY2tCeSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUb2dnbGUgZ3JvdXAgbW9kZSBzdGF0dXNcclxuICAgKiBAcGFyYW0gdmFsdWVcclxuICAgKi9cclxuICBwdWJsaWMgZ3JvdXBFbmFibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhQ29udHJvbGxlci5ncm91cEVuYWJsZWQgIT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuZ3JvdXBFbmFibGVkID0gdmFsdWU7XHJcblxyXG4gICAgICAvLyBDb21tZW50ZWQgb3V0IGJlY2F1c2UgUmF5IHdhbnRzIHRvIGNoYW5nZSBncm91cCBzdGF0dXMgaW4gZmV0Y2ggbWFwIHBpcGVcclxuICAgICAgLy8gYW5kIGl0IHRyaWdnZXJzIGV4dHJhIHJlcXVlc3RzXHJcbiAgICAgIC8vIHRoaXMucmVsb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLl9mc1Njcm9sbFN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLl9mc1Njcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBhZ2luZykge1xyXG4gICAgICB0aGlzLnBhZ2luZy5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydGluZykge1xyXG4gICAgICB0aGlzLnNvcnRpbmcuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZmlsdGVyQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyQ29uZmlnID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5leHRlcm5hbFBhcmFtcykge1xyXG4gICAgICB0aGlzLmV4dGVybmFsUGFyYW1zLmRlc3Ryb3koKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29sdW1ucy5kZXN0cm95KCk7XHJcblxyXG4gICAgdGhpcy5vbkRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMub25EZXN0cm95JC5jb21wbGV0ZSgpO1xyXG5cclxuICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuZGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG8gaW5pdGlhbGl6YXRpb24gb2YgdGFibGVcclxuICAgKiBAcGFyYW0gY29uZmlnXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplKGNvbmZpZzogRnNMaXN0Q29uZmlnKSB7XHJcbiAgICB0aGlzLmNvbHVtbnMuaW5pdENvbmZpZyhjb25maWcuY29sdW1uKTtcclxuICAgIHRoaXMuaW5pdERlZmF1bHRPcHRpb25zKGNvbmZpZyk7XHJcbiAgICB0aGlzLmluaXRSZXN0b3JlKCk7XHJcbiAgICB0aGlzLmluaXRBY3Rpb25zKGNvbmZpZy5hY3Rpb25zKTtcclxuICAgIHRoaXMuaW5pdFBhZ2luZyhjb25maWcucGFnaW5nLCBjb25maWcubG9hZE1vcmUpO1xyXG4gICAgdGhpcy5pbml0U2VsZWN0aW9uKGNvbmZpZy5zZWxlY3Rpb24sIHRoaXMuc2VsZWN0aW9uRGlhbG9nKTtcclxuICAgIHRoaXMuaW5pdEdyb3Vwcyhjb25maWcuZ3JvdXApO1xyXG4gICAgdGhpcy5pbml0RXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyKCk7XHJcblxyXG4gICAgdGhpcy5pbml0aWFsaXplRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSnVzdCBpbml0IG9wdGlvbnMgYnkgZGVmYXVsdCBpdCBpdCB3YXNuJ3Qgc3BlY2lmaWVkXHJcbiAgICogQHBhcmFtIGNvbmZpZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgaW5pdERlZmF1bHRPcHRpb25zKGNvbmZpZykge1xyXG4gICAgLy8gV2Ugc2hvdWxkIHByZXZlbnQgaW5pdGlhbCBmZXRjaCBpbiBjYXNlcyB3aGVuIGl0IHdpbGwgYmUgZmV0Y2hlZCBpbiBhbnkgY2FzZVxyXG4gICAgLy8gQXMgZXguIHNjcm9sbGFibGUgb3IgZmlsdGVyIHdpbGwgZG8gZmV0Y2ggaW4gYW55IGNhc2VzXHJcbiAgICBpZiAoY29uZmlnLmluaXRpYWxGZXRjaCA9PT0gZmFsc2UgfHwgY29uZmlnLnNjcm9sbGFibGUpIHsgLy8gVE9ETyBmaXhtZSBhZnRlciB0c21vZGVsIHZlcnNpb24gdXBkYXRlXHJcbiAgICAgIHRoaXMuaW5pdGlhbEZldGNoID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoY29uZmlnLnN0YXR1cyA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChjb25maWcuY2hpcHMpIHtcclxuICAgICAgdGhpcy5jaGlwcyA9IGNvbmZpZy5jaGlwcztcclxuICAgIH1cclxuICAgIGlmIChjb25maWcuZmlsdGVySW5wdXQgPT09IGZhbHNlKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVySW5wdXQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pbkRpYWxvZykge1xyXG4gICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucXVlcnlQYXJhbSA9IChjb25maWcucXVlcnlQYXJhbSA9PT0gdm9pZCAwKVxyXG4gICAgICAgID8gdHJ1ZVxyXG4gICAgICAgIDogY29uZmlnLnF1ZXJ5UGFyYW07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5zb3J0cykge1xyXG4gICAgICB0aGlzLnNvcnRpbmcuaW5pdEZha2VDb2x1bW5zKGNvbmZpZy5zb3J0cyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbmZpZy50cmFja0J5KSB7XHJcbiAgICAgIHRoaXMudHJhY2tCeSA9ICdpZCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0IHJlc3RvcmUgcm93IGFjdGlvbiBhbmQgYXBwZW5kIFNob3cgRGVsZXRlZCBvcHRpb24gaW50byBmaWx0ZXJzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0UmVzdG9yZSgpIHtcclxuICAgIGlmICh0aGlzLnJlc3RvcmUpIHtcclxuICAgICAgY29uc3QgcmVzdG9yZUFjdGlvbiA9IG5ldyBSb3dBY3Rpb24oe1xyXG4gICAgICAgIGxhYmVsOiB0aGlzLnJlc3RvcmUubWVudUxhYmVsIHx8ICdSZXN0b3JlJyxcclxuICAgICAgICBtZW51OiB0cnVlLFxyXG4gICAgICAgIGNsaWNrOiAocm93KSA9PiB7IHRoaXMucmVzdG9yZUNsaWNrKHRoaXMucmVzdG9yZS5jbGljaywgcm93KSB9LCAvLyBUT0RPIGZpeCBtZSwgbW92ZSB0byBzcGVjaWFsIGZpbGVcclxuICAgICAgICByZXN0b3JlOiB0cnVlXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnJvd0FjdGlvbnNSYXcpIHtcclxuICAgICAgICB0aGlzLnJvd0FjdGlvbnNSYXcgPSBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yb3dBY3Rpb25zUmF3LnB1c2gocmVzdG9yZUFjdGlvbik7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuZmlsdGVycykge1xyXG4gICAgICAgIHRoaXMuZmlsdGVycyA9IFtdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5yZXN0b3JlLmZpbHRlciAhPT0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLmZpbHRlcnMucHVzaCh7XHJcbiAgICAgICAgICBuYW1lOiBTSE9XX0RFTEVURURfRklMVEVSU19LRVksXHJcbiAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5DaGVja2JveCxcclxuICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc3RvcmUuZmlsdGVyTGFiZWwgfHwgJ1Nob3cgRGVsZXRlZCdcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXQgcGFnaW5nXHJcbiAgICogQHBhcmFtIHBhZ2luZ0NvbmZpZ1xyXG4gICAqIEBwYXJhbSBsb2FkTW9yZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaW5pdFBhZ2luZyhwYWdpbmdDb25maWc6IEZzUGFnaW5nIHwgZmFsc2UsIGxvYWRNb3JlOiBGc0xpc3RMb2FkTW9yZUNvbmZpZyB8IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucGFnaW5nLmluaXRXaXRoQ29uZmlnKHBhZ2luZ0NvbmZpZywgbG9hZE1vcmUsICEhdGhpcy5zY3JvbGxhYmxlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNwbGl0IGFjdGlvbnMgYnkgY2F0ZWdvcmllc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgaW5pdEFjdGlvbnMoYWN0aW9ucykge1xyXG4gICAgaWYgKGFjdGlvbnMpIHtcclxuICAgICAgdGhpcy5hY3Rpb25zLnNldEFjdGlvbnMoYWN0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oYXNSb3dBY3Rpb25zID1cclxuICAgICAgKHRoaXMucm93QWN0aW9uc1JhdyAmJiB0aGlzLnJvd0FjdGlvbnNSYXcubGVuZ3RoID4gMClcclxuICAgICAgfHwgKHRoaXMuZ3JvdXBBY3Rpb25zUmF3ICYmIHRoaXMuZ3JvdXBBY3Rpb25zUmF3Lmxlbmd0aCA+IDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U2VsZWN0aW9uKFxyXG4gICAgc2VsZWN0aW9uQ29uZmlnOiBGc0xpc3RTZWxlY3Rpb25Db25maWcsXHJcbiAgICBzZWxlY3Rpb25EaWFsb2c6IFNlbGVjdGlvbkRpYWxvZyxcclxuICApIHtcclxuICAgIGlmIChzZWxlY3Rpb25Db25maWcpIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uQ29udHJvbGxlcihzZWxlY3Rpb25Db25maWcsIHRoaXMudHJhY2tCeSwgc2VsZWN0aW9uRGlhbG9nKTtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0Um93c0NhbGxiYWNrKCgpID0+IHRoaXMuZGF0YUNvbnRyb2xsZXIudmlzaWJsZVJvd3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplRGF0YSgpIHtcclxuICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0QWRkaXRpb25hbENvbmZpZ3Moe1xyXG4gICAgICBzY3JvbGxhYmxlOiAhIXRoaXMuc2Nyb2xsYWJsZSxcclxuICAgICAgbG9hZE1vcmVFbmFibGVkOiB0aGlzLnBhZ2luZy5sb2FkTW9yZUVuYWJsZWRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0R3JvdXBzKGdyb3VwQ29uZmlnOiBGc0xpc3RHcm91cENvbmZpZykge1xyXG4gICAgaWYgKGdyb3VwQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0R3JvdXBDb25maWcoZ3JvdXBDb25maWcpO1xyXG4gICAgICB0aGlzLmdyb3VwQWN0aW9uc1JhdyA9IGdyb3VwQ29uZmlnLmFjdGlvbnM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIoKSB7XHJcbiAgICB0aGlzLmV4dGVybmFsUGFyYW1zID0gbmV3IEV4dGVybmFsUGFyYW1zQ29udHJvbGxlcihcclxuICAgICAgdGhpcy5yb3V0ZXIsXHJcbiAgICAgIHRoaXMucm91dGUsXHJcbiAgICAgIHRoaXMucGVyc2lzdGFuY2UsXHJcbiAgICAgIHRoaXMucGFnaW5nLFxyXG4gICAgICB0aGlzLnNvcnRpbmcsXHJcbiAgICAgIHRoaXMucXVlcnlQYXJhbVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YnNjcmliZSB0byBmZXRjaCQgZXZlbnQgd2l0aCBkZWJvdW5jZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbGlzdGVuRmV0Y2goKSB7XHJcbiAgICBsZXQgZmV0Y2gkID0gdGhpcy5mZXRjaCQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgLy8gU2hvdWxkIHdhaXQgdW50aWwgc2F2ZWQgZmlsdGVycyBub3QgbG9hZGVkXHJcbiAgICBpZiAoISF0aGlzLmZpbHRlcnMgJiYgISF0aGlzLnNhdmVkRmlsdGVycykge1xyXG4gICAgICBmZXRjaCQgPSBjb21iaW5lTGF0ZXN0KFtmZXRjaCQsIHRoaXMuZmlsdGVyc1JlYWR5JF0pXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKFtwYXJhbXNdKSA9PiBwYXJhbXMpLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZmV0Y2gkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGRlYm91bmNlVGltZSg1MCksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24/LmNsb3NlU2VsZWN0aW9uRGlhbG9nKCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgbWFwKChwYXJhbXM6IEZzTGlzdEZldGNoU3Vic2NyaXB0aW9uKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMucGFnaW5nLmhhc09mZnNldFN0cmF0ZWd5ICYmIHBhcmFtcyAmJiBwYXJhbXMubG9hZE9mZnNldFxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZmlsdGVyc1F1ZXJ5LCB0aGlzLnBhZ2luZy5sb2FkRGVsZXRlZE9mZnNldFF1ZXJ5KVxyXG4gICAgICAgICAgICA6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZmlsdGVyc1F1ZXJ5LCB0aGlzLnBhZ2luZy5xdWVyeSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICAgICAgcXVlcnksXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3JkZXI6IGAke3RoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uLm5hbWV9LCR7dGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW4uZGlyZWN0aW9ufWBcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gcXVlcnk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKChxdWVyeSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5sb2FkRm5Db25maWd1cmVkICYmICF0aGlzLmNvbHVtbnMuY29sdW1uc0ZldGNoZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5sb2FkUmVtb3RlQ29sdW1uQ29uZmlncygpXHJcbiAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXBUbyhxdWVyeSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKHF1ZXJ5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHF1ZXJ5KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb2x1bW5zLmNvbmZpZ3VyZWQpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgICBxdWVyeSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMudmlzaWJsZUNvbHVtbnNOYW1lcyxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbb2YocXVlcnkpLCB0aGlzLmZldGNoUmVtb3RlKHF1ZXJ5KV0pO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yLCBzb3VyY2UkKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gc291cmNlJDtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY29tcGxldGVGZXRjaChyZXNwb25zZSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsaXN0ZW5Sb3dzUmVtb3ZlKCkge1xyXG4gICAgdGhpcy5kYXRhQ29udHJvbGxlci5yb3dzUmVtb3ZlZCRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JCksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgocm93czogYW55W10pID0+IHtcclxuICAgICAgICBpZiAodGhpcy5wYWdpbmcuZW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgIGNvbnN0IHJlbW92ZWRDb3VudCA9IHJvd3MubGVuZ3RoO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnBhZ2luZy5oYXNQYWdlU3RyYXRlZ3kpIHtcclxuICAgICAgICAgICAgdGhpcy5ub0RhdGFQYWdpbmF0aW9uVXBkYXRlKHJlbW92ZWRDb3VudCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBGZXRjaCBtb3JlIGlmIGhhcyBzb21ldGhpbmcgZm9yIGZldGNoXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFDb250cm9sbGVyLmhhc0RhdGEgfHwgdGhpcy5wYWdpbmcuaGFzTmV4dFBhZ2UpIHtcclxuICAgICAgICAgICAgICB0aGlzLmRhdGFDb250cm9sbGVyLnNldE9wZXJhdGlvbihGc0xpc3RTdGF0ZS5Mb2FkTW9yZSk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMucGFnaW5nLnJlbW92ZVJvd3MocmVtb3ZlZENvdW50KTtcclxuICAgICAgICAgICAgICB0aGlzLmZldGNoJC5uZXh0KHsgbG9hZE9mZnNldDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLm5vRGF0YVBhZ2luYXRpb25VcGRhdGUocmVtb3ZlZENvdW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gc2VsZWN0aW9uXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZW1vdmVSb3cocm93LmRhdGEpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEluZmluaXR5U2Nyb2xsKCkge1xyXG4gICAgaWYgKHRoaXMuZnNTY3JvbGxJbnN0YW5jZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2Nyb2xsYWJsZSkge1xyXG4gICAgICAvLyBTY3JvbGxhYmxlIHN0YXR1cyBieSBkZWZhdWx0XHJcbiAgICAgIGlmICh0aGlzLnNjcm9sbGFibGUuc3RhdHVzID09PSB2b2lkIDApIHtcclxuICAgICAgICB0aGlzLnNjcm9sbGFibGUuc3RhdHVzID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIHRoaXMuZnNTY3JvbGxcclxuICAgICAgICAuY29tcG9uZW50KHRoaXMuc2Nyb2xsYWJsZS5uYW1lKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JClcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZnNTY3JvbGxJbnN0YW5jZTogRnNTY3JvbGxJbnN0YW5jZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5mc1Njcm9sbEluc3RhbmNlID0gZnNTY3JvbGxJbnN0YW5jZTtcclxuICAgICAgICAgIHRoaXMuX2ZzU2Nyb2xsU3Vic2NyaXB0aW9uID0gZnNTY3JvbGxJbnN0YW5jZVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgc3RhcnRMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gdGhpcy5kYXRhQ29udHJvbGxlci5vcGVyYXRpb247XHJcblxyXG4gICAgICAgICAgICAgIC8vIEluaXRpYWwgbG9hZGluZyBpZiBpbml0aWFsRmV0Y2ggZXF1YWxzIGZhbHNlXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxGZXRjaFxyXG4gICAgICAgICAgICAgICAgJiYgIXRoaXMucGFnaW5nLmluaXRpYWxpemVkXHJcbiAgICAgICAgICAgICAgICAmJiBvcGVyYXRpb24gIT09IEZzTGlzdFN0YXRlLlJlbG9hZFxyXG4gICAgICAgICAgICAgICkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLkxvYWQpO1xyXG4gICAgICAgICAgICAgICAgc3RhcnRMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9PT0gRnNMaXN0U3RhdGUuUmVsb2FkIHx8XHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24gPT09IEZzTGlzdFN0YXRlLkZpbHRlciB8fFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uID09PSBGc0xpc3RTdGF0ZS5Tb3J0XHJcbiAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydExvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wYWdpbmcuaW5pdGlhbGl6ZWQgJiYgdGhpcy5wYWdpbmcuaGFzTmV4dFBhZ2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIExvYWRpbmcgaWYgY29udGVudCBoYXMgYmVlbiBzY3JvbGxlZFxyXG4gICAgICAgICAgICAgICAgc3RhcnRMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLkxvYWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmcuZ29OZXh0KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBpZiAoc3RhcnRMb2FkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoJC5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICBmc1Njcm9sbEluc3RhbmNlLmxvYWRpbmcoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLmRhdGFDb250cm9sbGVyLnJlbW90ZVJvd3NDaGFuZ2UkXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGZzU2Nyb2xsSW5zdGFuY2UubG9hZGVkKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBhbmQgd2F0Y2ggZmlsdGVyIGNoYW5nZXNcclxuICAgKi9cclxuICBwcml2YXRlIGluaXRGaWx0ZXJzKCkge1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyQ29uZmlnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNZXJnZSBzb3J0aW5nIGFuZCBmYWtlIHNvcnRpbmcgY29sc1xyXG4gICAgLy8gRmFrZSBzb3J0aW5nIGNvbHMgaXQncyBjb2xzIHdoaWNoIGRvbid0IHJlcHJlc2VudGVkIGluIHRhYmxlIGNvbHMsIGxpa2UgYWJzdHJhY3QgY29sc1xyXG4gICAgY29uc3Qgc29ydFZhbHVlcyA9XHJcbiAgICAgIFtcclxuICAgICAgICAuLi50aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbnMsXHJcbiAgICAgICAgLi4udGhpcy5zb3J0aW5nLmZha2VTb3J0aW5nQ29sdW1uc1xyXG4gICAgICBdLnJlZHVjZSgoYWNjLCBjb2x1bW4pID0+IHtcclxuXHJcbiAgICAgICAgY29uc3Qgc29ydGluZ0l0ZW0gPSB7XHJcbiAgICAgICAgICBuYW1lOiBjb2x1bW4udGl0bGUsXHJcbiAgICAgICAgICB2YWx1ZTogY29sdW1uLm5hbWUsXHJcbiAgICAgICAgICBkZWZhdWx0OiB0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbiAmJiB0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbi5uYW1lID09PSBjb2x1bW4ubmFtZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGFjYy5wdXNoKHNvcnRpbmdJdGVtKTtcclxuICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICB9LCBbXSk7XHJcblxyXG4gICAgY29uc3Qgc29ydENvbmZpZyA9IHRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uXHJcbiAgICAgID8geyB2YWx1ZTogdGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW4ubmFtZSwgZGlyZWN0aW9uOiB0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbi5kaXJlY3Rpb259XHJcbiAgICAgIDogbnVsbDtcclxuXHJcbiAgICAvLyBDb25maWdcclxuICAgIHRoaXMuZmlsdGVyQ29uZmlnID0ge1xyXG4gICAgICBwZXJzaXN0OiB0aGlzLnBlcnNpc3QsXHJcbiAgICAgIGl0ZW1zOiB0aGlzLmZpbHRlcnMgfHwgW10sXHJcbiAgICAgIHNhdmVkRmlsdGVyczogdGhpcy5zYXZlZEZpbHRlcnMsXHJcbiAgICAgIGlubGluZTogdGhpcy5pbmxpbmVGaWx0ZXJzLFxyXG4gICAgICBhY3Rpb25zOiB0aGlzLmFjdGlvbnMuYWN0aW9ucyxcclxuICAgICAgcXVlcnlQYXJhbTogdGhpcy5xdWVyeVBhcmFtLFxyXG4gICAgICBzb3J0czogc29ydFZhbHVlcyxcclxuICAgICAgc29ydDogc29ydENvbmZpZyxcclxuICAgICAgY2hpcHM6IHRoaXMuY2hpcHMsXHJcbiAgICAgIGluaXQ6IHRoaXMuZmlsdGVySW5pdC5iaW5kKHRoaXMpLFxyXG4gICAgICBjaGFuZ2U6IHRoaXMuZmlsdGVyQ2hhbmdlLmJpbmQodGhpcyksXHJcbiAgICAgIHJlbG9hZDogdGhpcy5yZWxvYWQuYmluZCh0aGlzKSxcclxuICAgICAgc29ydENoYW5nZTogdGhpcy5maWx0ZXJTb3J0LmJpbmQodGhpcyksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgd2hlbiBGaWx0ZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWRcclxuICAgKiBAcGFyYW0gZmlsdGVyc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVySW5pdChmaWx0ZXJzKSB7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJJbml0Q2IpIHtcclxuICAgICAgdGhpcy5maWx0ZXJJbml0Q2IoZmlsdGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzUXVlcnkgPSBmaWx0ZXJzO1xyXG5cclxuICAgIHRoaXMuY2hlY2tSZXN0b3JlRmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsYmFjayB3aGVuIEZpbHRlciBoYXMgYmVlbiBjaGFuZ2VkXHJcbiAgICogQHBhcmFtIGZpbHRlclF1ZXJ5XHJcbiAgICogQHBhcmFtIGZpbHRlclNvcnRcclxuICAgKi9cclxuICBwcml2YXRlIGZpbHRlckNoYW5nZShmaWx0ZXJRdWVyeSwgZmlsdGVyU29ydCkge1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyQ2hhbmdlQ2IpIHtcclxuICAgICAgdGhpcy5maWx0ZXJDaGFuZ2VDYihmaWx0ZXJRdWVyeSwgZmlsdGVyU29ydCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzUXVlcnkgPSBmaWx0ZXJRdWVyeTtcclxuXHJcbiAgICB0aGlzLnJlc3RvcmVNb2RlID0gZmFsc2U7XHJcblxyXG4gICAgLy8gUmVzdG9yZSBvcHRpb25cclxuICAgIHRoaXMuY2hlY2tSZXN0b3JlRmlsdGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucmVzdG9yZSAmJiB0aGlzLnJlc3RvcmUucmVsb2FkKSB7XHJcbiAgICAgIHRoaXMucmVsb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuRmlsdGVyKTtcclxuXHJcbiAgICAvLyBSZXNldCBwYWdpbmcgZm9yIHJlcXVlc3Qgd2l0aCBjb3JyZWN0IG9mZnNldFxyXG4gICAgdGhpcy5wYWdpbmcucmVzZXRQYWdpbmcoKTtcclxuXHJcbiAgICBpZiAodGhpcy5mc1Njcm9sbEluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuY2xlYXJSb3dzKCk7XHJcbiAgICAgIHRoaXMuZnNTY3JvbGxJbnN0YW5jZS5yZWxvYWQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmV0Y2gkLm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tSZXN0b3JlRmlsdGVyKCkge1xyXG4gICAgLy8gUmVzdG9yZSBvcHRpb25cclxuICAgIGlmICh0aGlzLnJlc3RvcmUgJiYgdGhpcy5maWx0ZXJzUXVlcnlbU0hPV19ERUxFVEVEX0ZJTFRFUlNfS0VZXSkge1xyXG4gICAgICBkZWxldGUgdGhpcy5maWx0ZXJzUXVlcnlbU0hPV19ERUxFVEVEX0ZJTFRFUlNfS0VZXTtcclxuXHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5maWx0ZXJzUXVlcnksIHRoaXMucmVzdG9yZS5xdWVyeSk7XHJcblxyXG4gICAgICB0aGlzLnJlc3RvcmVNb2RlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENhbGxiYWNrIHdoZW4gRmlsdGVyIHNvcnQgaGFzIGJlZW4gY2hhbmdlZFxyXG4gIHByaXZhdGUgZmlsdGVyU29ydChmaWx0ZXJRdWVyeSwgZmlsdGVyU29ydCkge1xyXG4gICAgaWYgKGZpbHRlclNvcnQpIHtcclxuICAgICAgdGhpcy5zb3J0aW5nLnNvcnRCeUNvbHVtbldpdGhOYW1lKGZpbHRlclNvcnQudmFsdWUpO1xyXG5cclxuICAgICAgY29uc3Qgc29ydERpcmVjdGlvbiA9IGZpbHRlclNvcnQuZGlyZWN0aW9uID09PSAnYXNjJyA/IFNvcnRpbmdEaXJlY3Rpb24uYXNjIDogU29ydGluZ0RpcmVjdGlvbi5kZXNjO1xyXG4gICAgICB0aGlzLnNvcnRpbmcuc29ydERpcmVjdGlvbihzb3J0RGlyZWN0aW9uKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEZJWE1FIG5lZWQgdG8gYmUgcmVmYWN0b3JlZC4uLlxyXG4gICAgICB0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbiA9IHZvaWQgMDtcclxuICAgICAgdGhpcy5yZWxvYWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcGxldGVGZXRjaChbcXVlcnksIHJlc3BvbnNlXSkge1xyXG5cclxuICAgIGlmICghdGhpcy5wYWdpbmcucGFnZSkge1xyXG4gICAgICB0aGlzLnBhZ2luZy5wYWdlID0gMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzcG9uc2UucGFnaW5nKSB7XHJcbiAgICAgIGNvbnN0IGRpc3BsYXllZCA9IChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpICYmIHJlc3BvbnNlLmRhdGEubGVuZ3RoKSB8fCAwO1xyXG4gICAgICB0aGlzLnBhZ2luZy51cGRhdGVQYWdpbmcoXHJcbiAgICAgICAgcmVzcG9uc2UucGFnaW5nLFxyXG4gICAgICAgIGRpc3BsYXllZCxcclxuICAgICAgICB0aGlzLmRhdGFDb250cm9sbGVyLm9wZXJhdGlvbiA9PT0gRnNMaXN0U3RhdGUuTG9hZE1vcmVcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5wYWdpbmcuZW5hYmxlZCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAnJWMgRnNMaXN0IFdhcm5pbmcgJyxcclxuICAgICAgICAnY29sb3I6IHdoaXRlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZjYzBiJyxcclxuICAgICAgICAnUGFnaW5hdGlvbiBkb2VzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiAnICtcclxuICAgICAgICAnUGFnaW5hdGlvbiBpcyBlbmFibGVkLCBidXQgaHR0cCByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIFwicGFnaW5nXCIgZmllbGQuICcgK1xyXG4gICAgICAgICdZb3UgaGF2ZSB0byBzZXQgXCJwYWdpbmc6IGZhbHNlXCIgaW4gY29uZmlnIG9yIGFkZCBcInBhZ2luZ1wiIGZpZWxkIHRvIHJlc3BvbnNlLidcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLy8gbXVzdCBiZSBiZWZvcmUgc2VsZWN0aW9uLCBiZWNhdXNlIHNlbGV0aW9uIHVzZSByZWNvcmRzXHJcbiAgICB0aGlzLmRhdGFDb250cm9sbGVyLnNldFJvd3NGcm9tUmVzcG9uc2UocmVzcG9uc2UuZGF0YSk7XHJcbiAgICAvLy9cclxuXHJcbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIHBhcmFtc1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XHJcblxyXG4gICAgICBpZiAodGhpcy5wYWdpbmcuZW5hYmxlZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBhZ2VDaGFuZ2VkKHRoaXMuc2Nyb2xsYWJsZSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVmlzaWJsZVJlY29yZHNDb3VudCh0aGlzLnBhZ2luZy5nZXRWaXNpYmxlUmVjb3JkcygpKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVUb3RhbFJlY29yZHNDb3VudCh0aGlzLnBhZ2luZy5yZWNvcmRzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IHJlc3BvbnNlLnBhZ2luZyAmJiByZXNwb25zZS5wYWdpbmcucmVjb3Jkc1xyXG4gICAgICAgICAgfHwgQXJyYXkuaXNBcnJheShyZXNwb25zZS5kYXRhKSAmJiByZXNwb25zZS5kYXRhLmxlbmd0aDtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVmlzaWJsZVJlY29yZHNDb3VudChjb3VudCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVG90YWxSZWNvcmRzQ291bnQoY291bnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZFJvd3NJbnRlcnNlY3Rpb24odGhpcy5kYXRhQ29udHJvbGxlci52aXNpYmxlUm93c0RhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmVtcHR5U3RhdGU/LnZhbGlkYXRlICYmIHRoaXMuZW1wdHlTdGF0ZVRlbXBsYXRlKSB7XHJcbiAgICAgIHRoaXMuZW1wdHlTdGF0ZUVuYWJsZWQgPSB0aGlzLmVtcHR5U3RhdGUudmFsaWRhdGUocXVlcnksIGNsb25lRGVlcChyZXNwb25zZS5kYXRhKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mZXRjaENvbXBsZXRlJC5uZXh0KCk7XHJcbiAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2lsbCBkbyBzb21lIGFjdGlvbnMgaWYgeW91IHJlbW92ZWQgaXRlbSBhbmQgaXRlbSB3YXMgbGFzdCBvbiBoaXMgb3duIHBhZ2VcclxuICAgKlxyXG4gICAqIEV4OiBpZiBsaXN0IGhhcyAzIHBhZ2VzIGFuZCBvbiB0aGlyZCBwYWdlIHlvdSBoYXZlIG9ubHkgb25lIGl0ZW0uIEFuZCB5b3UganVzdCBkZWxldGVkIHRoaXMgaXRlbS5cclxuICAgKiBZb3UgbXVzdCBnbyB0byBzZWNvbmQgcGFnZSwgYnV0IGlmIGl0IHdhcyBsYXN0IHBhZ2UgYW5kIHlvdSBjYW4ndCBnbyBiYWNrIC0+IGp1c3QgcmVsb2FkXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZGVsZXRlZENvdW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBub0RhdGFQYWdpbmF0aW9uVXBkYXRlKGRlbGV0ZWRDb3VudCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGFDb250cm9sbGVyLmhhc0RhdGEpIHtcclxuICAgICAgaWYgKHRoaXMucGFnaW5nLnBhZ2UgPiAxKSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmcuZ29Ub1BhZ2UodGhpcy5wYWdpbmcucGFnZSAtIDEgfHwgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucGFnaW5nLnJlY29yZHMgLT0gZGVsZXRlZENvdW50O1xyXG4gICAgdGhpcy5wYWdpbmcudXBkYXRlUGFnaW5hdGlvbigpO1xyXG5cclxuICAgIGlmICh0aGlzLmRhdGFDb250cm9sbGVyLmhhc0RhdGEgJiYgdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVmlzaWJsZVJlY29yZHNDb3VudCh0aGlzLmRhdGFDb250cm9sbGVyLnZpc2libGVSb3dzQ291bnQpO1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVUb3RhbFJlY29yZHNDb3VudCh0aGlzLnBhZ2luZy5yZWNvcmRzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRlbXBvcmFyeSBzb2x1dGlvbiwgd2lsbCBkbyBhdXRvIHN1YnNjcmliZSBpZiB3YXMgcmV0dXJuZWQgT2JzZXJ2YWJsZS5cclxuICAgKlxyXG4gICAqIFRPRE86IE1PVkUgVEhJUyBQRUFDRSBPRiBDT0RFIFRPIFNQRUNJQUwgUExBQ0VcclxuICAgKlxyXG4gICAqIEBwYXJhbSByZXN0b3JlQ2xpY2tDYWxsYmFja1xyXG4gICAqIEBwYXJhbSByb3dcclxuICAgKi9cclxuICBwcml2YXRlIHJlc3RvcmVDbGljayhyZXN0b3JlQ2xpY2tDYWxsYmFjaywgcm93KSB7XHJcbiAgICBjb25zdCByZXN0b3JlQ2xpY2tSZXN1bHQgPSByZXN0b3JlQ2xpY2tDYWxsYmFjayhyb3cpO1xyXG5cclxuICAgIGlmIChyZXN0b3JlQ2xpY2tSZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XHJcbiAgICAgIHJlc3RvcmVDbGlja1Jlc3VsdFxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpLFxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6ICgpID0+IHRoaXMucmVsb2FkKCksXHJcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge30sXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
|
1
|
+
import { __decorate, __extends, __metadata, __read, __spread } from "tslib";
|
|
2
|
+
import { ItemType } from '@firestitch/filter';
|
|
3
|
+
import { Alias, Model } from 'tsmodels';
|
|
4
|
+
import { BehaviorSubject, combineLatest, from, Observable, of, Subject } from 'rxjs';
|
|
5
|
+
import { catchError, debounceTime, map, mapTo, switchMap, take, takeUntil, tap, } from 'rxjs/operators';
|
|
6
|
+
import { cloneDeep } from 'lodash-es';
|
|
7
|
+
import { SortingDirection } from '../models/column.model';
|
|
8
|
+
import { StyleConfig } from '../models/styleConfig.model';
|
|
9
|
+
import { RowAction } from '../models/row-action.model';
|
|
10
|
+
import { ColumnsController } from './columns-controller';
|
|
11
|
+
import { PageChangeType } from '../enums/page-change-type.enum';
|
|
12
|
+
import { ActionsController } from './index';
|
|
13
|
+
import { DataController } from './data-controller';
|
|
14
|
+
import { PaginationController } from './pagination-controller';
|
|
15
|
+
import { SelectionController } from './selection-controller';
|
|
16
|
+
import { SortingController } from './sorting-controller';
|
|
17
|
+
import { FsListState } from '../enums/state.enum';
|
|
18
|
+
import { ExternalParamsController } from './external-params-controller';
|
|
19
|
+
var SHOW_DELETED_FILTERS_KEY = '$$_show_deleted_$$';
|
|
20
|
+
var List = /** @class */ (function (_super) {
|
|
21
|
+
__extends(List, _super);
|
|
22
|
+
function List(el, config, fsScroll, selectionDialog, router, route, persistance, inDialog) {
|
|
23
|
+
if (config === void 0) { config = {}; }
|
|
24
|
+
var _this = _super.call(this) || this;
|
|
25
|
+
_this.el = el;
|
|
26
|
+
_this.config = config;
|
|
27
|
+
_this.fsScroll = fsScroll;
|
|
28
|
+
_this.selectionDialog = selectionDialog;
|
|
29
|
+
_this.router = router;
|
|
30
|
+
_this.route = route;
|
|
31
|
+
_this.persistance = persistance;
|
|
32
|
+
_this.inDialog = inDialog;
|
|
33
|
+
_this.filters = [];
|
|
34
|
+
_this.scrollable = false;
|
|
35
|
+
// @Alias('rows') private _rows: any;
|
|
36
|
+
_this.initialized$ = new BehaviorSubject(false);
|
|
37
|
+
_this.loading$ = new BehaviorSubject(false);
|
|
38
|
+
_this.paging = new PaginationController();
|
|
39
|
+
_this.columns = new ColumnsController();
|
|
40
|
+
_this.actions = new ActionsController();
|
|
41
|
+
_this.dataController = new DataController();
|
|
42
|
+
_this.sorting = new SortingController();
|
|
43
|
+
_this.filterConfig = null;
|
|
44
|
+
_this.fetch$ = new Subject();
|
|
45
|
+
_this.fetchComplete$ = new Subject();
|
|
46
|
+
_this.filtersReady$ = new Subject();
|
|
47
|
+
_this.status = true;
|
|
48
|
+
_this.chips = false;
|
|
49
|
+
_this.filterInput = true;
|
|
50
|
+
_this.queryParam = false;
|
|
51
|
+
_this.restoreMode = false;
|
|
52
|
+
_this.initialFetch = true;
|
|
53
|
+
// Empty state
|
|
54
|
+
_this.emptyStateEnabled = false;
|
|
55
|
+
_this.onDestroy$ = new Subject();
|
|
56
|
+
_this._fromJSON(config);
|
|
57
|
+
_this.initialize(config);
|
|
58
|
+
_this._headerConfig = new StyleConfig(config.header);
|
|
59
|
+
_this._groupCellConfig = new StyleConfig(config.cell);
|
|
60
|
+
_this._cellConfig = new StyleConfig(config.cell);
|
|
61
|
+
_this._footerConfig = new StyleConfig(config.footer);
|
|
62
|
+
_this.initialized$.next(true);
|
|
63
|
+
_this.subscribe();
|
|
64
|
+
if (_this.initialFetch) {
|
|
65
|
+
_this.dataController.setOperation(FsListState.Load);
|
|
66
|
+
_this.fetch$.next();
|
|
67
|
+
}
|
|
68
|
+
return _this;
|
|
69
|
+
}
|
|
70
|
+
Object.defineProperty(List.prototype, "hasSavedFilters", {
|
|
71
|
+
get: function () {
|
|
72
|
+
return !!this.filterConfig.savedFilters;
|
|
73
|
+
},
|
|
74
|
+
enumerable: true,
|
|
75
|
+
configurable: true
|
|
76
|
+
});
|
|
77
|
+
List.prototype.fetchRemote = function (query) {
|
|
78
|
+
var options = {
|
|
79
|
+
state: this.dataController.operation,
|
|
80
|
+
};
|
|
81
|
+
var result = this.fetchFn(query, options);
|
|
82
|
+
return result instanceof Promise ? from(result) : result;
|
|
83
|
+
};
|
|
84
|
+
// public loadLocal() {
|
|
85
|
+
// this.paging.updatePagingManual(this._rows);
|
|
86
|
+
// const from = (this.paging.page - 1) * this.paging.limit;
|
|
87
|
+
// const to = (this.paging.page === 1) ? this.paging.limit : this.paging.limit * this.paging.page;
|
|
88
|
+
// const sliceOfRows = this._rows.slice(from, to);
|
|
89
|
+
// this.data$.next(sliceOfRows);
|
|
90
|
+
// }
|
|
91
|
+
/**
|
|
92
|
+
* Transform templates for using
|
|
93
|
+
* @param templates
|
|
94
|
+
*/
|
|
95
|
+
List.prototype.tranformTemplatesToColumns = function (templates) {
|
|
96
|
+
var _this = this;
|
|
97
|
+
var defaultConfigs = {
|
|
98
|
+
header: this._headerConfig,
|
|
99
|
+
groupCell: this._groupCellConfig,
|
|
100
|
+
cell: this._cellConfig,
|
|
101
|
+
footer: this._footerConfig,
|
|
102
|
+
};
|
|
103
|
+
this.columns.setDefaults(defaultConfigs);
|
|
104
|
+
this.columns.initializeColumns(templates);
|
|
105
|
+
// Set sortBy default column
|
|
106
|
+
this.sorting.clearSortableColumns();
|
|
107
|
+
this.columns.columns
|
|
108
|
+
.filter(function (column) { return column.sortable && column.show; })
|
|
109
|
+
.forEach(function (column) {
|
|
110
|
+
_this.sorting.addSortableColumn(column);
|
|
111
|
+
});
|
|
112
|
+
// Default sort by
|
|
113
|
+
var externalSorting = this.externalParams.externalSorting;
|
|
114
|
+
var initialSortConfig = externalSorting || this.config.sort;
|
|
115
|
+
this.sorting.initialSortBy(initialSortConfig);
|
|
116
|
+
if (externalSorting && !this.sorting.isDefined) {
|
|
117
|
+
this.externalParams.clearSortingParams();
|
|
118
|
+
console.warn('Not able to restore persisted sorting params.', externalSorting);
|
|
119
|
+
}
|
|
120
|
+
this.initFilters();
|
|
121
|
+
this.initInfinityScroll();
|
|
122
|
+
};
|
|
123
|
+
List.prototype.reload = function () {
|
|
124
|
+
this.loading$.next(true);
|
|
125
|
+
this.dataController.setOperation(FsListState.Reload);
|
|
126
|
+
if (this.fsScrollInstance) {
|
|
127
|
+
this.paging.resetPaging();
|
|
128
|
+
this.dataController.clearRows();
|
|
129
|
+
this.fsScrollInstance.reload();
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
this.fetch$.next();
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Watch page changes
|
|
137
|
+
*/
|
|
138
|
+
List.prototype.subscribe = function () {
|
|
139
|
+
var _this = this;
|
|
140
|
+
this.paging.pageChanged$
|
|
141
|
+
.pipe(takeUntil(this.onDestroy$))
|
|
142
|
+
.subscribe(function (event) {
|
|
143
|
+
_this.dataController.setOperation(FsListState.PageChange);
|
|
144
|
+
// Remove all rows if limits was changed
|
|
145
|
+
if (event.type === PageChangeType.LimitChanged && _this.paging.hasPageStrategy) {
|
|
146
|
+
_this.dataController.clearRows();
|
|
147
|
+
}
|
|
148
|
+
if (_this.paging.hasOffsetStrategy) {
|
|
149
|
+
_this.paging.updatePagination();
|
|
150
|
+
if (_this.selection) {
|
|
151
|
+
_this.selection.updateVisibleRecordsCount(_this.paging.getVisibleRecords());
|
|
152
|
+
_this.selection.updateTotalRecordsCount(_this.paging.records);
|
|
153
|
+
_this.selection.pageChanged(_this.scrollable);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (!_this.scrollable && !_this.paging.loadMoreEnabled) {
|
|
157
|
+
var contains = [].slice.call(document.querySelectorAll('.cdk-overlay-container')).some(function (overlay) {
|
|
158
|
+
return _this.el.nativeElement.contains(overlay);
|
|
159
|
+
});
|
|
160
|
+
var el_1 = _this.el.nativeElement;
|
|
161
|
+
if (!contains) {
|
|
162
|
+
var rect = _this.el.nativeElement.getBoundingClientRect();
|
|
163
|
+
if ((rect.top + window.pageYOffset) < window.innerHeight) {
|
|
164
|
+
el_1 = document.body;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
_this.fetchComplete$.asObservable()
|
|
168
|
+
.pipe(take(1), takeUntil(_this.onDestroy$))
|
|
169
|
+
.subscribe(function () {
|
|
170
|
+
el_1.scrollIntoView({ behavior: 'smooth' });
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
_this.fetch$.next();
|
|
174
|
+
});
|
|
175
|
+
this.sorting.sortingChanged$
|
|
176
|
+
.pipe(takeUntil(this.onDestroy$))
|
|
177
|
+
.subscribe(function () {
|
|
178
|
+
_this.dataController.setOperation(FsListState.Sort);
|
|
179
|
+
_this.paging.page = 1;
|
|
180
|
+
if (_this.fsScrollInstance) {
|
|
181
|
+
_this.dataController.clearRows();
|
|
182
|
+
_this.fsScrollInstance.reload();
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
_this.fetch$.next();
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
this.listenRowsRemove();
|
|
189
|
+
this.listenFetch();
|
|
190
|
+
};
|
|
191
|
+
List.prototype.getData = function (trackBy) {
|
|
192
|
+
var rowsData = this.dataController
|
|
193
|
+
.visibleRowsData;
|
|
194
|
+
if (trackBy) {
|
|
195
|
+
rowsData = rowsData
|
|
196
|
+
.filter(trackBy);
|
|
197
|
+
}
|
|
198
|
+
return rowsData
|
|
199
|
+
.map(function (data) {
|
|
200
|
+
return cloneDeep(data);
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
List.prototype.hasData = function (trackBy) {
|
|
204
|
+
return this.dataController.visibleRowsData.some(trackBy);
|
|
205
|
+
};
|
|
206
|
+
/**
|
|
207
|
+
* Toggle group mode status
|
|
208
|
+
* @param value
|
|
209
|
+
*/
|
|
210
|
+
List.prototype.groupEnabled = function (value) {
|
|
211
|
+
if (this.dataController.groupEnabled !== value) {
|
|
212
|
+
this.dataController.groupEnabled = value;
|
|
213
|
+
// Commented out because Ray wants to change group status in fetch map pipe
|
|
214
|
+
// and it triggers extra requests
|
|
215
|
+
// this.reload();
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
List.prototype.destroy = function () {
|
|
219
|
+
if (this._fsScrollSubscription) {
|
|
220
|
+
this._fsScrollSubscription.unsubscribe();
|
|
221
|
+
}
|
|
222
|
+
if (this.paging) {
|
|
223
|
+
this.paging.destroy();
|
|
224
|
+
}
|
|
225
|
+
if (this.sorting) {
|
|
226
|
+
this.sorting.destroy();
|
|
227
|
+
}
|
|
228
|
+
if (this.selection) {
|
|
229
|
+
this.selection.destroy();
|
|
230
|
+
}
|
|
231
|
+
if (this.filterConfig) {
|
|
232
|
+
this.filterConfig = null;
|
|
233
|
+
}
|
|
234
|
+
if (this.externalParams) {
|
|
235
|
+
this.externalParams.destroy();
|
|
236
|
+
}
|
|
237
|
+
this.columns.destroy();
|
|
238
|
+
this.onDestroy$.next();
|
|
239
|
+
this.onDestroy$.complete();
|
|
240
|
+
this.dataController.destroy();
|
|
241
|
+
};
|
|
242
|
+
/**
|
|
243
|
+
* Do initialization of table
|
|
244
|
+
* @param config
|
|
245
|
+
*/
|
|
246
|
+
List.prototype.initialize = function (config) {
|
|
247
|
+
this.columns.initConfig(config.column);
|
|
248
|
+
this.initDefaultOptions(config);
|
|
249
|
+
this.initRestore();
|
|
250
|
+
this.initActions(config.actions);
|
|
251
|
+
this.initPaging(config.paging, config.loadMore);
|
|
252
|
+
this.initSelection(config.selection, this.selectionDialog);
|
|
253
|
+
this.initGroups(config.group);
|
|
254
|
+
this.initExternalParamsController();
|
|
255
|
+
this.initializeData();
|
|
256
|
+
};
|
|
257
|
+
/**
|
|
258
|
+
* Just init options by default it it wasn't specified
|
|
259
|
+
* @param config
|
|
260
|
+
*/
|
|
261
|
+
List.prototype.initDefaultOptions = function (config) {
|
|
262
|
+
// We should prevent initial fetch in cases when it will be fetched in any case
|
|
263
|
+
// As ex. scrollable or filter will do fetch in any cases
|
|
264
|
+
if (config.initialFetch === false || config.scrollable) { // TODO fixme after tsmodel version update
|
|
265
|
+
this.initialFetch = false;
|
|
266
|
+
}
|
|
267
|
+
if (config.status === false) {
|
|
268
|
+
this.status = false;
|
|
269
|
+
}
|
|
270
|
+
if (config.chips) {
|
|
271
|
+
this.chips = config.chips;
|
|
272
|
+
}
|
|
273
|
+
if (config.filterInput === false) {
|
|
274
|
+
this.filterInput = false;
|
|
275
|
+
}
|
|
276
|
+
if (this.inDialog) {
|
|
277
|
+
this.queryParam = false;
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
this.queryParam = (config.queryParam === void 0)
|
|
281
|
+
? true
|
|
282
|
+
: config.queryParam;
|
|
283
|
+
}
|
|
284
|
+
if (config.sorts) {
|
|
285
|
+
this.sorting.initFakeColumns(config.sorts);
|
|
286
|
+
}
|
|
287
|
+
if (!config.trackBy) {
|
|
288
|
+
this.trackBy = 'id';
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
/**
|
|
292
|
+
* Init restore row action and append Show Deleted option into filters
|
|
293
|
+
*/
|
|
294
|
+
List.prototype.initRestore = function () {
|
|
295
|
+
var _this = this;
|
|
296
|
+
if (this.restore) {
|
|
297
|
+
var restoreAction = new RowAction({
|
|
298
|
+
label: this.restore.menuLabel || 'Restore',
|
|
299
|
+
menu: true,
|
|
300
|
+
click: function (row) { _this.restoreClick(_this.restore.click, row); },
|
|
301
|
+
restore: true
|
|
302
|
+
});
|
|
303
|
+
if (!this.rowActionsRaw) {
|
|
304
|
+
this.rowActionsRaw = [];
|
|
305
|
+
}
|
|
306
|
+
this.rowActionsRaw.push(restoreAction);
|
|
307
|
+
if (!this.filters) {
|
|
308
|
+
this.filters = [];
|
|
309
|
+
}
|
|
310
|
+
if (this.restore.filter !== false) {
|
|
311
|
+
this.filters.push({
|
|
312
|
+
name: SHOW_DELETED_FILTERS_KEY,
|
|
313
|
+
type: ItemType.Checkbox,
|
|
314
|
+
label: this.restore.filterLabel || 'Show Deleted'
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
/**
|
|
320
|
+
* Init paging
|
|
321
|
+
* @param pagingConfig
|
|
322
|
+
* @param loadMore
|
|
323
|
+
*/
|
|
324
|
+
List.prototype.initPaging = function (pagingConfig, loadMore) {
|
|
325
|
+
this.paging.initWithConfig(pagingConfig, loadMore, !!this.scrollable);
|
|
326
|
+
};
|
|
327
|
+
/**
|
|
328
|
+
* Split actions by categories
|
|
329
|
+
*/
|
|
330
|
+
List.prototype.initActions = function (actions) {
|
|
331
|
+
if (actions) {
|
|
332
|
+
this.actions.setActions(actions);
|
|
333
|
+
}
|
|
334
|
+
this.hasRowActions =
|
|
335
|
+
(this.rowActionsRaw && this.rowActionsRaw.length > 0)
|
|
336
|
+
|| (this.groupActionsRaw && this.groupActionsRaw.length > 0);
|
|
337
|
+
};
|
|
338
|
+
List.prototype.initSelection = function (selectionConfig, selectionDialog) {
|
|
339
|
+
var _this = this;
|
|
340
|
+
if (selectionConfig) {
|
|
341
|
+
this.selection = new SelectionController(selectionConfig, this.trackBy, selectionDialog);
|
|
342
|
+
this.selection.setRowsCallback(function () { return _this.dataController.visibleRows; });
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
List.prototype.initializeData = function () {
|
|
346
|
+
this.dataController.setAdditionalConfigs({
|
|
347
|
+
scrollable: !!this.scrollable,
|
|
348
|
+
loadMoreEnabled: this.paging.loadMoreEnabled
|
|
349
|
+
});
|
|
350
|
+
};
|
|
351
|
+
List.prototype.initGroups = function (groupConfig) {
|
|
352
|
+
if (groupConfig) {
|
|
353
|
+
this.dataController.setGroupConfig(groupConfig);
|
|
354
|
+
this.groupActionsRaw = groupConfig.actions;
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
List.prototype.initExternalParamsController = function () {
|
|
358
|
+
this.externalParams = new ExternalParamsController(this.router, this.route, this.persistance, this.paging, this.sorting, this.queryParam);
|
|
359
|
+
};
|
|
360
|
+
/**
|
|
361
|
+
* Subscribe to fetch$ event with debounce
|
|
362
|
+
*/
|
|
363
|
+
List.prototype.listenFetch = function () {
|
|
364
|
+
var _this = this;
|
|
365
|
+
var fetch$ = this.fetch$.asObservable();
|
|
366
|
+
// Should wait until saved filters not loaded
|
|
367
|
+
if (!!this.filters && !!this.savedFilters) {
|
|
368
|
+
fetch$ = combineLatest([fetch$, this.filtersReady$])
|
|
369
|
+
.pipe(map(function (_a) {
|
|
370
|
+
var _b = __read(_a, 1), params = _b[0];
|
|
371
|
+
return params;
|
|
372
|
+
}));
|
|
373
|
+
}
|
|
374
|
+
fetch$
|
|
375
|
+
.pipe(debounceTime(50), tap(function () {
|
|
376
|
+
_this.loading$.next(true);
|
|
377
|
+
}), tap(function () {
|
|
378
|
+
var _a;
|
|
379
|
+
(_a = _this.selection) === null || _a === void 0 ? void 0 : _a.closeSelectionDialog();
|
|
380
|
+
}), map(function (params) {
|
|
381
|
+
var query = _this.paging.hasOffsetStrategy && params && params.loadOffset
|
|
382
|
+
? Object.assign({}, _this.filtersQuery, _this.paging.loadDeletedOffsetQuery)
|
|
383
|
+
: Object.assign({}, _this.filtersQuery, _this.paging.query);
|
|
384
|
+
if (_this.sorting.sortingColumn) {
|
|
385
|
+
Object.assign(query, {
|
|
386
|
+
order: _this.sorting.sortingColumn.name + "," + _this.sorting.sortingColumn.direction
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
return query;
|
|
390
|
+
}), switchMap(function (query) {
|
|
391
|
+
if (_this.columns.loadFnConfigured && !_this.columns.columnsFetched) {
|
|
392
|
+
return _this.columns.loadRemoteColumnConfigs()
|
|
393
|
+
.pipe(mapTo(query));
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
return of(query);
|
|
397
|
+
}
|
|
398
|
+
}), switchMap(function (query) {
|
|
399
|
+
if (_this.columns.configured) {
|
|
400
|
+
Object.assign(query, {
|
|
401
|
+
columns: _this.columns.visibleColumnsNames,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
return combineLatest([of(query), _this.fetchRemote(query)]);
|
|
405
|
+
}), catchError(function (error, source$) {
|
|
406
|
+
console.error(error);
|
|
407
|
+
return source$;
|
|
408
|
+
}), takeUntil(this.onDestroy$))
|
|
409
|
+
.subscribe(function (response) {
|
|
410
|
+
_this.completeFetch(response);
|
|
411
|
+
});
|
|
412
|
+
};
|
|
413
|
+
List.prototype.listenRowsRemove = function () {
|
|
414
|
+
var _this = this;
|
|
415
|
+
this.dataController.rowsRemoved$
|
|
416
|
+
.pipe(takeUntil(this.onDestroy$))
|
|
417
|
+
.subscribe(function (rows) {
|
|
418
|
+
if (_this.paging.enabled) {
|
|
419
|
+
var removedCount = rows.length;
|
|
420
|
+
if (_this.paging.hasPageStrategy) {
|
|
421
|
+
_this.noDataPaginationUpdate(removedCount);
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
// Fetch more if has something for fetch
|
|
425
|
+
if (_this.dataController.hasData || _this.paging.hasNextPage) {
|
|
426
|
+
_this.dataController.setOperation(FsListState.LoadMore);
|
|
427
|
+
_this.paging.removeRows(removedCount);
|
|
428
|
+
_this.fetch$.next({ loadOffset: true });
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
_this.noDataPaginationUpdate(removedCount);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// Remove from selection
|
|
436
|
+
if (_this.selection) {
|
|
437
|
+
rows.forEach(function (row) {
|
|
438
|
+
_this.selection.removeRow(row.data);
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
};
|
|
443
|
+
List.prototype.initInfinityScroll = function () {
|
|
444
|
+
var _this = this;
|
|
445
|
+
if (this.fsScrollInstance) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
if (this.scrollable) {
|
|
449
|
+
// Scrollable status by default
|
|
450
|
+
if (this.scrollable.status === void 0) {
|
|
451
|
+
this.scrollable.status = true;
|
|
452
|
+
}
|
|
453
|
+
this.fsScroll
|
|
454
|
+
.component(this.scrollable.name)
|
|
455
|
+
.pipe(takeUntil(this.onDestroy$))
|
|
456
|
+
.subscribe(function (fsScrollInstance) {
|
|
457
|
+
_this.fsScrollInstance = fsScrollInstance;
|
|
458
|
+
_this._fsScrollSubscription = fsScrollInstance
|
|
459
|
+
.subscribe(function () {
|
|
460
|
+
var startLoading = false;
|
|
461
|
+
var operation = _this.dataController.operation;
|
|
462
|
+
// Initial loading if initialFetch equals false
|
|
463
|
+
if (!_this.initialFetch
|
|
464
|
+
&& !_this.paging.initialized
|
|
465
|
+
&& operation !== FsListState.Reload) {
|
|
466
|
+
_this.dataController.setOperation(FsListState.Load);
|
|
467
|
+
startLoading = true;
|
|
468
|
+
}
|
|
469
|
+
else if (operation === FsListState.Reload ||
|
|
470
|
+
operation === FsListState.Filter ||
|
|
471
|
+
operation === FsListState.Sort) {
|
|
472
|
+
startLoading = true;
|
|
473
|
+
}
|
|
474
|
+
else if (_this.paging.initialized && _this.paging.hasNextPage) {
|
|
475
|
+
// Loading if content has been scrolled
|
|
476
|
+
startLoading = true;
|
|
477
|
+
_this.dataController.setOperation(FsListState.Load);
|
|
478
|
+
_this.paging.goNext();
|
|
479
|
+
}
|
|
480
|
+
if (startLoading) {
|
|
481
|
+
_this.fetch$.next();
|
|
482
|
+
fsScrollInstance.loading();
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
_this.dataController.remoteRowsChange$
|
|
486
|
+
.pipe(takeUntil(_this.onDestroy$))
|
|
487
|
+
.subscribe(function () {
|
|
488
|
+
fsScrollInstance.loaded();
|
|
489
|
+
});
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
};
|
|
493
|
+
/**
|
|
494
|
+
* Update and watch filter changes
|
|
495
|
+
*/
|
|
496
|
+
List.prototype.initFilters = function () {
|
|
497
|
+
var _this = this;
|
|
498
|
+
if (this.filterConfig) {
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
// Merge sorting and fake sorting cols
|
|
502
|
+
// Fake sorting cols it's cols which don't represented in table cols, like abstract cols
|
|
503
|
+
var sortValues = __spread(this.sorting.sortingColumns, this.sorting.fakeSortingColumns).reduce(function (acc, column) {
|
|
504
|
+
var sortingItem = {
|
|
505
|
+
name: column.title,
|
|
506
|
+
value: column.name,
|
|
507
|
+
default: _this.sorting.sortingColumn && _this.sorting.sortingColumn.name === column.name
|
|
508
|
+
};
|
|
509
|
+
acc.push(sortingItem);
|
|
510
|
+
return acc;
|
|
511
|
+
}, []);
|
|
512
|
+
var sortConfig = this.sorting.sortingColumn
|
|
513
|
+
? { value: this.sorting.sortingColumn.name, direction: this.sorting.sortingColumn.direction }
|
|
514
|
+
: null;
|
|
515
|
+
// Config
|
|
516
|
+
this.filterConfig = {
|
|
517
|
+
persist: this.persist,
|
|
518
|
+
items: this.filters || [],
|
|
519
|
+
savedFilters: this.savedFilters,
|
|
520
|
+
inline: this.inlineFilters,
|
|
521
|
+
actions: this.actions.actions,
|
|
522
|
+
queryParam: this.queryParam,
|
|
523
|
+
sorts: sortValues,
|
|
524
|
+
sort: sortConfig,
|
|
525
|
+
chips: this.chips,
|
|
526
|
+
init: this.filterInit.bind(this),
|
|
527
|
+
change: this.filterChange.bind(this),
|
|
528
|
+
reload: this.reload.bind(this),
|
|
529
|
+
sortChange: this.filterSort.bind(this),
|
|
530
|
+
};
|
|
531
|
+
};
|
|
532
|
+
/**
|
|
533
|
+
* Callback when Filter has been initialized
|
|
534
|
+
* @param filters
|
|
535
|
+
*/
|
|
536
|
+
List.prototype.filterInit = function (filters) {
|
|
537
|
+
if (this.filterInitCb) {
|
|
538
|
+
this.filterInitCb(filters);
|
|
539
|
+
}
|
|
540
|
+
this.filtersQuery = filters;
|
|
541
|
+
this.checkRestoreFilter();
|
|
542
|
+
};
|
|
543
|
+
/**
|
|
544
|
+
* Callback when Filter has been changed
|
|
545
|
+
* @param filterQuery
|
|
546
|
+
* @param filterSort
|
|
547
|
+
*/
|
|
548
|
+
List.prototype.filterChange = function (filterQuery, filterSort) {
|
|
549
|
+
if (this.filterChangeCb) {
|
|
550
|
+
this.filterChangeCb(filterQuery, filterSort);
|
|
551
|
+
}
|
|
552
|
+
this.filtersQuery = filterQuery;
|
|
553
|
+
this.restoreMode = false;
|
|
554
|
+
// Restore option
|
|
555
|
+
this.checkRestoreFilter();
|
|
556
|
+
if (this.restore && this.restore.reload) {
|
|
557
|
+
this.reload();
|
|
558
|
+
}
|
|
559
|
+
this.dataController.setOperation(FsListState.Filter);
|
|
560
|
+
// Reset paging for request with correct offset
|
|
561
|
+
this.paging.resetPaging();
|
|
562
|
+
if (this.fsScrollInstance) {
|
|
563
|
+
this.dataController.clearRows();
|
|
564
|
+
this.fsScrollInstance.reload();
|
|
565
|
+
}
|
|
566
|
+
else {
|
|
567
|
+
this.fetch$.next();
|
|
568
|
+
}
|
|
569
|
+
};
|
|
570
|
+
List.prototype.checkRestoreFilter = function () {
|
|
571
|
+
// Restore option
|
|
572
|
+
if (this.restore && this.filtersQuery[SHOW_DELETED_FILTERS_KEY]) {
|
|
573
|
+
delete this.filtersQuery[SHOW_DELETED_FILTERS_KEY];
|
|
574
|
+
Object.assign(this.filtersQuery, this.restore.query);
|
|
575
|
+
this.restoreMode = true;
|
|
576
|
+
}
|
|
577
|
+
};
|
|
578
|
+
// Callback when Filter sort has been changed
|
|
579
|
+
List.prototype.filterSort = function (filterQuery, filterSort) {
|
|
580
|
+
if (filterSort) {
|
|
581
|
+
this.sorting.sortByColumnWithName(filterSort.value);
|
|
582
|
+
var sortDirection = filterSort.direction === 'asc' ? SortingDirection.asc : SortingDirection.desc;
|
|
583
|
+
this.sorting.sortDirection(sortDirection);
|
|
584
|
+
}
|
|
585
|
+
else {
|
|
586
|
+
// FIXME need to be refactored...
|
|
587
|
+
this.sorting.sortingColumn = void 0;
|
|
588
|
+
this.reload();
|
|
589
|
+
}
|
|
590
|
+
};
|
|
591
|
+
List.prototype.completeFetch = function (_a) {
|
|
592
|
+
var _b = __read(_a, 2), query = _b[0], response = _b[1];
|
|
593
|
+
var _c;
|
|
594
|
+
if (!this.paging.page) {
|
|
595
|
+
this.paging.page = 1;
|
|
596
|
+
}
|
|
597
|
+
if (response.paging) {
|
|
598
|
+
var displayed = (Array.isArray(response.data) && response.data.length) || 0;
|
|
599
|
+
this.paging.updatePaging(response.paging, displayed, this.dataController.operation === FsListState.LoadMore);
|
|
600
|
+
}
|
|
601
|
+
else if (this.paging.enabled) {
|
|
602
|
+
console.log('%c FsList Warning ', 'color: white; background-color: #ffcc0b', 'Pagination does not configured properly. ' +
|
|
603
|
+
'Pagination is enabled, but http response does not contain "paging" field. ' +
|
|
604
|
+
'You have to set "paging: false" in config or add "paging" field to response.');
|
|
605
|
+
}
|
|
606
|
+
/// must be before selection, because seletion use records
|
|
607
|
+
this.dataController.setRowsFromResponse(response.data);
|
|
608
|
+
///
|
|
609
|
+
// Update selection params
|
|
610
|
+
if (this.selection) {
|
|
611
|
+
if (this.paging.enabled) {
|
|
612
|
+
this.selection.pageChanged(this.scrollable);
|
|
613
|
+
this.selection.updateVisibleRecordsCount(this.paging.getVisibleRecords());
|
|
614
|
+
this.selection.updateTotalRecordsCount(this.paging.records);
|
|
615
|
+
}
|
|
616
|
+
else {
|
|
617
|
+
var count = response.paging && response.paging.records
|
|
618
|
+
|| Array.isArray(response.data) && response.data.length;
|
|
619
|
+
this.selection.updateVisibleRecordsCount(count);
|
|
620
|
+
this.selection.updateTotalRecordsCount(count);
|
|
621
|
+
}
|
|
622
|
+
this.selection.selectedRowsIntersection(this.dataController.visibleRowsData);
|
|
623
|
+
}
|
|
624
|
+
if (((_c = this.emptyState) === null || _c === void 0 ? void 0 : _c.validate) && this.emptyStateTemplate) {
|
|
625
|
+
this.emptyStateEnabled = this.emptyState.validate(query, cloneDeep(response.data));
|
|
626
|
+
}
|
|
627
|
+
this.fetchComplete$.next();
|
|
628
|
+
this.loading$.next(false);
|
|
629
|
+
};
|
|
630
|
+
/**
|
|
631
|
+
* Will do some actions if you removed item and item was last on his own page
|
|
632
|
+
*
|
|
633
|
+
* Ex: if list has 3 pages and on third page you have only one item. And you just deleted this item.
|
|
634
|
+
* You must go to second page, but if it was last page and you can't go back -> just reload
|
|
635
|
+
*
|
|
636
|
+
* @param deletedCount
|
|
637
|
+
*/
|
|
638
|
+
List.prototype.noDataPaginationUpdate = function (deletedCount) {
|
|
639
|
+
if (!this.dataController.hasData) {
|
|
640
|
+
if (this.paging.page > 1) {
|
|
641
|
+
this.paging.goToPage(this.paging.page - 1 || 1);
|
|
642
|
+
}
|
|
643
|
+
else {
|
|
644
|
+
this.reload();
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
this.paging.records -= deletedCount;
|
|
648
|
+
this.paging.updatePagination();
|
|
649
|
+
if (this.dataController.hasData && this.selection) {
|
|
650
|
+
this.selection.updateVisibleRecordsCount(this.dataController.visibleRowsCount);
|
|
651
|
+
this.selection.updateTotalRecordsCount(this.paging.records);
|
|
652
|
+
}
|
|
653
|
+
};
|
|
654
|
+
/**
|
|
655
|
+
* Temporary solution, will do auto subscribe if was returned Observable.
|
|
656
|
+
*
|
|
657
|
+
* TODO: MOVE THIS PEACE OF CODE TO SPECIAL PLACE
|
|
658
|
+
*
|
|
659
|
+
* @param restoreClickCallback
|
|
660
|
+
* @param row
|
|
661
|
+
*/
|
|
662
|
+
List.prototype.restoreClick = function (restoreClickCallback, row) {
|
|
663
|
+
var _this = this;
|
|
664
|
+
var restoreClickResult = restoreClickCallback(row);
|
|
665
|
+
if (restoreClickResult instanceof Observable) {
|
|
666
|
+
restoreClickResult
|
|
667
|
+
.pipe(take(1), takeUntil(this.onDestroy$))
|
|
668
|
+
.subscribe({
|
|
669
|
+
next: function () { return _this.reload(); },
|
|
670
|
+
error: function () { },
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
};
|
|
674
|
+
__decorate([
|
|
675
|
+
Alias(),
|
|
676
|
+
__metadata("design:type", String)
|
|
677
|
+
], List.prototype, "heading", void 0);
|
|
678
|
+
__decorate([
|
|
679
|
+
Alias(),
|
|
680
|
+
__metadata("design:type", String)
|
|
681
|
+
], List.prototype, "trackBy", void 0);
|
|
682
|
+
__decorate([
|
|
683
|
+
Alias(),
|
|
684
|
+
__metadata("design:type", String)
|
|
685
|
+
], List.prototype, "subheading", void 0);
|
|
686
|
+
__decorate([
|
|
687
|
+
Alias(),
|
|
688
|
+
__metadata("design:type", Object)
|
|
689
|
+
], List.prototype, "inlineFilters", void 0);
|
|
690
|
+
__decorate([
|
|
691
|
+
Alias('rowActions'),
|
|
692
|
+
__metadata("design:type", Array)
|
|
693
|
+
], List.prototype, "rowActionsRaw", void 0);
|
|
694
|
+
__decorate([
|
|
695
|
+
Alias('rowClass'),
|
|
696
|
+
__metadata("design:type", Object)
|
|
697
|
+
], List.prototype, "rowClass", void 0);
|
|
698
|
+
__decorate([
|
|
699
|
+
Alias(),
|
|
700
|
+
__metadata("design:type", Object)
|
|
701
|
+
], List.prototype, "rowEvents", void 0);
|
|
702
|
+
__decorate([
|
|
703
|
+
Alias(),
|
|
704
|
+
__metadata("design:type", Object)
|
|
705
|
+
], List.prototype, "restore", void 0);
|
|
706
|
+
__decorate([
|
|
707
|
+
Alias(),
|
|
708
|
+
__metadata("design:type", Object)
|
|
709
|
+
], List.prototype, "columnTemplates", void 0);
|
|
710
|
+
__decorate([
|
|
711
|
+
Alias(),
|
|
712
|
+
__metadata("design:type", Boolean)
|
|
713
|
+
], List.prototype, "persist", void 0);
|
|
714
|
+
__decorate([
|
|
715
|
+
Alias(),
|
|
716
|
+
__metadata("design:type", Object)
|
|
717
|
+
], List.prototype, "filters", void 0);
|
|
718
|
+
__decorate([
|
|
719
|
+
Alias('filterInit'),
|
|
720
|
+
__metadata("design:type", Function)
|
|
721
|
+
], List.prototype, "filterInitCb", void 0);
|
|
722
|
+
__decorate([
|
|
723
|
+
Alias('filterChange'),
|
|
724
|
+
__metadata("design:type", Function)
|
|
725
|
+
], List.prototype, "filterChangeCb", void 0);
|
|
726
|
+
__decorate([
|
|
727
|
+
Alias(),
|
|
728
|
+
__metadata("design:type", Object)
|
|
729
|
+
], List.prototype, "savedFilters", void 0);
|
|
730
|
+
__decorate([
|
|
731
|
+
Alias(),
|
|
732
|
+
__metadata("design:type", Object)
|
|
733
|
+
], List.prototype, "scrollable", void 0);
|
|
734
|
+
__decorate([
|
|
735
|
+
Alias(),
|
|
736
|
+
__metadata("design:type", Object)
|
|
737
|
+
], List.prototype, "noResults", void 0);
|
|
738
|
+
__decorate([
|
|
739
|
+
Alias(),
|
|
740
|
+
__metadata("design:type", Object)
|
|
741
|
+
], List.prototype, "emptyState", void 0);
|
|
742
|
+
__decorate([
|
|
743
|
+
Alias('fetch'),
|
|
744
|
+
__metadata("design:type", Function)
|
|
745
|
+
], List.prototype, "fetchFn", void 0);
|
|
746
|
+
return List;
|
|
747
|
+
}(Model));
|
|
748
|
+
export { List };
|
|
749
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvbGlzdC8iLCJzb3VyY2VzIjpbImFwcC9jbGFzc2VzL2xpc3QtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFxRCxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUlqRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV4QyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixJQUFJLEVBQ0osVUFBVSxFQUNWLEVBQUUsRUFDRixPQUFPLEVBRVIsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFlBQVksRUFDWixHQUFHLEVBQ0gsS0FBSyxFQUNMLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFpQjFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlC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QUFSLEtBQUssRUFBRTs7NENBQTJCO0lBQzFCO1FBQVIsS0FBSyxFQUFFOzsrQ0FBMkI7SUFFZDtRQUFwQixLQUFLLENBQUMsWUFBWSxDQUFDOzsrQ0FBNkI7SUFFOUI7UUFBbEIsS0FBSyxDQUFDLFVBQVUsQ0FBQzs7MENBQWlCO0lBQzFCO1FBQVIsS0FBSyxFQUFFOzsyQ0FBdUI7SUFDdEI7UUFBUixLQUFLLEVBQUU7O3lDQUFxQztJQUNwQztRQUFSLEtBQUssRUFBRTs7aURBQTZCO0lBQzVCO1FBQVIsS0FBSyxFQUFFOzt5Q0FBeUI7SUFDeEI7UUFBUixLQUFLLEVBQUU7O3lDQUFxQjtJQUNSO1FBQXBCLEtBQUssQ0FBQyxZQUFZLENBQUM7OzhDQUErQjtJQUM1QjtRQUF0QixLQUFLLENBQUMsY0FBYyxDQUFDOztnREFBaUM7SUFDOUM7UUFBUixLQUFLLEVBQUU7OzhDQUFnRDtJQUMvQztRQUFSLEtBQUssRUFBRTs7NENBQTJEO0lBQzFEO1FBQVIsS0FBSyxFQUFFOzsyQ0FBeUM7SUFDeEM7UUFBUixLQUFLLEVBQUU7OzRDQUEyQztJQUVuQztRQUFmLEtBQUssQ0FBQyxPQUFPLENBQUM7O3lDQUErQjtJQTZ6QmhELFdBQUM7Q0FBQSxBQWwxQkQsQ0FBMEIsS0FBSyxHQWsxQjlCO1NBbDFCWSxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ2hhbmdlRm4sIEZpbHRlckNvbmZpZywgSUZpbHRlclNhdmVkRmlsdGVyc0NvbmZpZywgSXRlbVR5cGUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuaW1wb3J0IHsgRnNTY3JvbGxJbnN0YW5jZSwgRnNTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvc2Nyb2xsJztcbmltcG9ydCB7IFNlbGVjdGlvbkRpYWxvZyB9IGZyb20gJ0BmaXJlc3RpdGNoL3NlbGVjdGlvbic7XG5cbmltcG9ydCB7IEFsaWFzLCBNb2RlbCB9IGZyb20gJ3RzbW9kZWxzJztcblxuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBmcm9tLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY2F0Y2hFcnJvcixcbiAgZGVib3VuY2VUaW1lLFxuICBtYXAsXG4gIG1hcFRvLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2NvbHVtbi5tb2RlbCc7XG5cbi8vIEludGVyZmFjZXNcbmltcG9ydCB7XG4gIEZzTGlzdENvbmZpZyxcbiAgRnNMaXN0RW1wdHlTdGF0ZUNvbmZpZywgRnNMaXN0RmV0Y2hGbiwgRnNMaXN0RmV0Y2hPcHRpb25zLFxuICBGc0xpc3RGZXRjaFN1YnNjcmlwdGlvbixcbiAgRnNMaXN0R3JvdXBDb25maWcsXG4gIEZzTGlzdExvYWRNb3JlQ29uZmlnLFxuICBGc0xpc3ROb1Jlc3VsdHNDb25maWcsXG4gIEZzTGlzdFJlc3RvcmVDb25maWcsXG4gIEZzTGlzdFNjcm9sbGFibGVDb25maWcsXG4gIEZzTGlzdFNlbGVjdGlvbkNvbmZpZyxcbiAgRnNMaXN0VHJhY2tCeUZuLFxuICBGc1BhZ2luZyxcbiAgUGFnZUNoYW5nZVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFN0eWxlQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL3N0eWxlQ29uZmlnLm1vZGVsJztcbmltcG9ydCB7IFJvd0FjdGlvbiB9IGZyb20gJy4uL21vZGVscy9yb3ctYWN0aW9uLm1vZGVsJztcbmltcG9ydCB7IENvbHVtbnNDb250cm9sbGVyIH0gZnJvbSAnLi9jb2x1bW5zLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGFnZUNoYW5nZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9wYWdlLWNoYW5nZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgQWN0aW9uc0NvbnRyb2xsZXIgfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7IERhdGFDb250cm9sbGVyIH0gZnJvbSAnLi9kYXRhLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGFnaW5hdGlvbkNvbnRyb2xsZXIgfSBmcm9tICcuL3BhZ2luYXRpb24tY29udHJvbGxlcic7XG5pbXBvcnQgeyBTZWxlY3Rpb25Db250cm9sbGVyIH0gZnJvbSAnLi9zZWxlY3Rpb24tY29udHJvbGxlcic7XG5pbXBvcnQgeyBTb3J0aW5nQ29udHJvbGxlciB9IGZyb20gJy4vc29ydGluZy1jb250cm9sbGVyJztcblxuaW1wb3J0IHsgRnNMaXN0U3RhdGUgfSBmcm9tICcuLi9lbnVtcy9zdGF0ZS5lbnVtJztcbmltcG9ydCB7IFBlcnNpc3RhbmNlQ29udHJvbGxlciB9IGZyb20gJy4vcGVyc2lzdGFuY2UtY29udHJvbGxlcic7XG5pbXBvcnQgeyBFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIgfSBmcm9tICcuL2V4dGVybmFsLXBhcmFtcy1jb250cm9sbGVyJztcblxuY29uc3QgU0hPV19ERUxFVEVEX0ZJTFRFUlNfS0VZID0gJyQkX3Nob3dfZGVsZXRlZF8kJCc7XG5cblxuZXhwb3J0IGNsYXNzIExpc3QgZXh0ZW5kcyBNb2RlbCB7XG4gIEBBbGlhcygpIHB1YmxpYyBoZWFkaW5nOiBzdHJpbmc7XG4gIEBBbGlhcygpIHB1YmxpYyB0cmFja0J5OiBzdHJpbmc7XG4gIEBBbGlhcygpIHB1YmxpYyBzdWJoZWFkaW5nOiBzdHJpbmc7XG4gIEBBbGlhcygpIHB1YmxpYyBpbmxpbmVGaWx0ZXJzOiBhbnk7XG4gIC8vIEBBbGlhcygnYWN0aW9ucycsIEFjdGlvbikgcHVibGljIGFjdGlvbnM6IEFjdGlvbltdO1xuICBAQWxpYXMoJ3Jvd0FjdGlvbnMnKSBwdWJsaWMgcm93QWN0aW9uc1JhdzogYW55W107XG4gIHB1YmxpYyBncm91cEFjdGlvbnNSYXc6IGFueVtdO1xuICBAQWxpYXMoJ3Jvd0NsYXNzJykgcHVibGljIHJvd0NsYXNzO1xuICBAQWxpYXMoKSBwdWJsaWMgcm93RXZlbnRzOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyByZXN0b3JlOiBGc0xpc3RSZXN0b3JlQ29uZmlnO1xuICBAQWxpYXMoKSBwdWJsaWMgY29sdW1uVGVtcGxhdGVzOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBwZXJzaXN0OiBib29sZWFuO1xuICBAQWxpYXMoKSBwdWJsaWMgZmlsdGVycyA9IFtdO1xuICBAQWxpYXMoJ2ZpbHRlckluaXQnKSBwdWJsaWMgZmlsdGVySW5pdENiOiBDaGFuZ2VGbjtcbiAgQEFsaWFzKCdmaWx0ZXJDaGFuZ2UnKSBwdWJsaWMgZmlsdGVyQ2hhbmdlQ2I6IENoYW5nZUZuO1xuICBAQWxpYXMoKSBwdWJsaWMgc2F2ZWRGaWx0ZXJzOiBJRmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnO1xuICBAQWxpYXMoKSBwdWJsaWMgc2Nyb2xsYWJsZTogRnNMaXN0U2Nyb2xsYWJsZUNvbmZpZyB8IGZhbHNlID0gZmFsc2U7XG4gIEBBbGlhcygpIHB1YmxpYyBub1Jlc3VsdHM6IEZzTGlzdE5vUmVzdWx0c0NvbmZpZztcbiAgQEFsaWFzKCkgcHVibGljIGVtcHR5U3RhdGU6IEZzTGlzdEVtcHR5U3RhdGVDb25maWc7XG4gIC8vIEBBbGlhcygpIHB1YmxpYyBpbml0aWFsRmV0Y2ggPSB0cnVlOyAvL1RPRE8gZml4bWVcbiAgQEFsaWFzKCdmZXRjaCcpIHB1YmxpYyBmZXRjaEZuOiBGc0xpc3RGZXRjaEZuO1xuICAvLyBAQWxpYXMoJ3Jvd3MnKSBwcml2YXRlIF9yb3dzOiBhbnk7XG5cbiAgcHVibGljIGluaXRpYWxpemVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwdWJsaWMgbG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAvLyBwdWJsaWMgb3BlcmF0aW9uOiBPcGVyYXRpb247XG4gIHB1YmxpYyBmaWx0ZXJzUXVlcnk6IGFueTtcblxuICBwdWJsaWMgaGFzUm93QWN0aW9ucztcbiAgcHVibGljIHBhZ2luZyA9IG5ldyBQYWdpbmF0aW9uQ29udHJvbGxlcigpO1xuXG4gIHB1YmxpYyBjb2x1bW5zID0gbmV3IENvbHVtbnNDb250cm9sbGVyKCk7XG4gIHB1YmxpYyBhY3Rpb25zID0gbmV3IEFjdGlvbnNDb250cm9sbGVyKCk7XG4gIHB1YmxpYyBkYXRhQ29udHJvbGxlciA9IG5ldyBEYXRhQ29udHJvbGxlcigpO1xuICBwdWJsaWMgc29ydGluZyA9IG5ldyBTb3J0aW5nQ29udHJvbGxlcigpO1xuICBwdWJsaWMgZXh0ZXJuYWxQYXJhbXM6IEV4dGVybmFsUGFyYW1zQ29udHJvbGxlcjtcbiAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uQ29udHJvbGxlcjtcblxuICBwdWJsaWMgZmlsdGVyQ29uZmlnOiBGaWx0ZXJDb25maWcgPSBudWxsO1xuXG4gIHB1YmxpYyBmZXRjaCQgPSBuZXcgU3ViamVjdDxGc0xpc3RGZXRjaFN1YnNjcmlwdGlvbiB8IHZvaWQ+KCk7XG4gIHB1YmxpYyBmZXRjaENvbXBsZXRlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHB1YmxpYyBmaWx0ZXJzUmVhZHkkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwdWJsaWMgc3RhdHVzID0gdHJ1ZTtcbiAgcHVibGljIGNoaXBzID0gZmFsc2U7XG4gIHB1YmxpYyBmaWx0ZXJJbnB1dCA9IHRydWU7XG4gIHB1YmxpYyBxdWVyeVBhcmFtID0gZmFsc2U7XG4gIHB1YmxpYyByZXN0b3JlTW9kZSA9IGZhbHNlO1xuXG4gIHB1YmxpYyBpbml0aWFsRmV0Y2ggPSB0cnVlO1xuXG4gIC8vIEVtcHR5IHN0YXRlXG4gIHB1YmxpYyBlbXB0eVN0YXRlRW5hYmxlZCA9IGZhbHNlO1xuICBwdWJsaWMgZW1wdHlTdGF0ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHB1YmxpYyBmc1Njcm9sbEluc3RhbmNlOiBGc1Njcm9sbEluc3RhbmNlO1xuXG4gIHB1YmxpYyBvbkRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkZXJDb25maWc6IFN0eWxlQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ncm91cENlbGxDb25maWc6IFN0eWxlQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jZWxsQ29uZmlnOiBTdHlsZUNvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBfZm9vdGVyQ29uZmlnOiBTdHlsZUNvbmZpZztcblxuICBwcml2YXRlIF9mc1Njcm9sbFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjb25maWc6IEZzTGlzdENvbmZpZyA9IHt9LFxuICAgIHByaXZhdGUgZnNTY3JvbGw6IEZzU2Nyb2xsU2VydmljZSxcbiAgICBwcml2YXRlIHNlbGVjdGlvbkRpYWxvZzogU2VsZWN0aW9uRGlhbG9nLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBwZXJzaXN0YW5jZTogUGVyc2lzdGFuY2VDb250cm9sbGVyLFxuICAgIHByaXZhdGUgaW5EaWFsb2c6IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZnJvbUpTT04oY29uZmlnKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZShjb25maWcpO1xuXG4gICAgdGhpcy5faGVhZGVyQ29uZmlnID0gbmV3IFN0eWxlQ29uZmlnKGNvbmZpZy5oZWFkZXIpO1xuICAgIHRoaXMuX2dyb3VwQ2VsbENvbmZpZyA9IG5ldyBTdHlsZUNvbmZpZyhjb25maWcuY2VsbCk7XG4gICAgdGhpcy5fY2VsbENvbmZpZyA9IG5ldyBTdHlsZUNvbmZpZyhjb25maWcuY2VsbCk7XG4gICAgdGhpcy5fZm9vdGVyQ29uZmlnID0gbmV3IFN0eWxlQ29uZmlnKGNvbmZpZy5mb290ZXIpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplZCQubmV4dCh0cnVlKTtcblxuICAgIHRoaXMuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAodGhpcy5pbml0aWFsRmV0Y2gpIHtcbiAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLkxvYWQpO1xuICAgICAgdGhpcy5mZXRjaCQubmV4dCgpO1xuICAgIH1cblxuICB9XG5cbiAgcHVibGljIGdldCBoYXNTYXZlZEZpbHRlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5maWx0ZXJDb25maWcuc2F2ZWRGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIGZldGNoUmVtb3RlKHF1ZXJ5KSB7XG4gICAgY29uc3Qgb3B0aW9uczogRnNMaXN0RmV0Y2hPcHRpb25zID0ge1xuICAgICAgc3RhdGU6IHRoaXMuZGF0YUNvbnRyb2xsZXIub3BlcmF0aW9uLFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHRoaXMuZmV0Y2hGbihxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gcmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSA/IGZyb20ocmVzdWx0KSA6IHJlc3VsdDtcbiAgfVxuXG4gIC8vIHB1YmxpYyBsb2FkTG9jYWwoKSB7XG4gIC8vICAgdGhpcy5wYWdpbmcudXBkYXRlUGFnaW5nTWFudWFsKHRoaXMuX3Jvd3MpO1xuICAvLyAgIGNvbnN0IGZyb20gPSAodGhpcy5wYWdpbmcucGFnZSAtIDEpICogdGhpcy5wYWdpbmcubGltaXQ7XG4gIC8vICAgY29uc3QgdG8gPSAodGhpcy5wYWdpbmcucGFnZSA9PT0gMSkgPyB0aGlzLnBhZ2luZy5saW1pdCA6IHRoaXMucGFnaW5nLmxpbWl0ICogdGhpcy5wYWdpbmcucGFnZTtcbiAgLy8gICBjb25zdCBzbGljZU9mUm93cyA9IHRoaXMuX3Jvd3Muc2xpY2UoZnJvbSwgdG8pO1xuICAvLyAgIHRoaXMuZGF0YSQubmV4dChzbGljZU9mUm93cyk7XG4gIC8vIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtIHRlbXBsYXRlcyBmb3IgdXNpbmdcbiAgICogQHBhcmFtIHRlbXBsYXRlc1xuICAgKi9cbiAgcHVibGljIHRyYW5mb3JtVGVtcGxhdGVzVG9Db2x1bW5zKHRlbXBsYXRlcykge1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWdzID0ge1xuICAgICAgaGVhZGVyOiB0aGlzLl9oZWFkZXJDb25maWcsXG4gICAgICBncm91cENlbGw6IHRoaXMuX2dyb3VwQ2VsbENvbmZpZyxcbiAgICAgIGNlbGw6IHRoaXMuX2NlbGxDb25maWcsXG4gICAgICBmb290ZXI6IHRoaXMuX2Zvb3RlckNvbmZpZyxcbiAgICB9O1xuXG4gICAgdGhpcy5jb2x1bW5zLnNldERlZmF1bHRzKGRlZmF1bHRDb25maWdzKTtcbiAgICB0aGlzLmNvbHVtbnMuaW5pdGlhbGl6ZUNvbHVtbnModGVtcGxhdGVzKTtcblxuICAgIC8vIFNldCBzb3J0QnkgZGVmYXVsdCBjb2x1bW5cbiAgICB0aGlzLnNvcnRpbmcuY2xlYXJTb3J0YWJsZUNvbHVtbnMoKTtcbiAgICB0aGlzLmNvbHVtbnMuY29sdW1uc1xuICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uc29ydGFibGUgJiYgY29sdW1uLnNob3cpXG4gICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgIHRoaXMuc29ydGluZy5hZGRTb3J0YWJsZUNvbHVtbihjb2x1bW4pO1xuICAgICAgfSk7XG5cbiAgICAvLyBEZWZhdWx0IHNvcnQgYnlcbiAgICBjb25zdCBleHRlcm5hbFNvcnRpbmcgPSB0aGlzLmV4dGVybmFsUGFyYW1zLmV4dGVybmFsU29ydGluZztcbiAgICBjb25zdCBpbml0aWFsU29ydENvbmZpZyA9IGV4dGVybmFsU29ydGluZyB8fCB0aGlzLmNvbmZpZy5zb3J0O1xuICAgIHRoaXMuc29ydGluZy5pbml0aWFsU29ydEJ5KGluaXRpYWxTb3J0Q29uZmlnKTtcblxuICAgIGlmIChleHRlcm5hbFNvcnRpbmcgJiYgIXRoaXMuc29ydGluZy5pc0RlZmluZWQpIHtcbiAgICAgIHRoaXMuZXh0ZXJuYWxQYXJhbXMuY2xlYXJTb3J0aW5nUGFyYW1zKCk7XG5cbiAgICAgIGNvbnNvbGUud2FybignTm90IGFibGUgdG8gcmVzdG9yZSBwZXJzaXN0ZWQgc29ydGluZyBwYXJhbXMuJywgZXh0ZXJuYWxTb3J0aW5nKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRGaWx0ZXJzKCk7XG4gICAgdGhpcy5pbml0SW5maW5pdHlTY3JvbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQoKSB7XG4gICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xuXG4gICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuUmVsb2FkKTtcblxuICAgIGlmICh0aGlzLmZzU2Nyb2xsSW5zdGFuY2UpIHtcbiAgICAgIHRoaXMucGFnaW5nLnJlc2V0UGFnaW5nKCk7XG4gICAgICB0aGlzLmRhdGFDb250cm9sbGVyLmNsZWFyUm93cygpO1xuICAgICAgdGhpcy5mc1Njcm9sbEluc3RhbmNlLnJlbG9hZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZldGNoJC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoIHBhZ2UgY2hhbmdlc1xuICAgKi9cbiAgcHVibGljIHN1YnNjcmliZSgpIHtcbiAgICB0aGlzLnBhZ2luZy5wYWdlQ2hhbmdlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBQYWdlQ2hhbmdlKSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLlBhZ2VDaGFuZ2UpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBhbGwgcm93cyBpZiBsaW1pdHMgd2FzIGNoYW5nZWRcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFBhZ2VDaGFuZ2VUeXBlLkxpbWl0Q2hhbmdlZCAmJiB0aGlzLnBhZ2luZy5oYXNQYWdlU3RyYXRlZ3kpIHtcbiAgICAgICAgICB0aGlzLmRhdGFDb250cm9sbGVyLmNsZWFyUm93cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFnaW5nLmhhc09mZnNldFN0cmF0ZWd5KSB7XG4gICAgICAgICAgdGhpcy5wYWdpbmcudXBkYXRlUGFnaW5hdGlvbigpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVWaXNpYmxlUmVjb3Jkc0NvdW50KHRoaXMucGFnaW5nLmdldFZpc2libGVSZWNvcmRzKCkpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVG90YWxSZWNvcmRzQ291bnQodGhpcy5wYWdpbmcucmVjb3Jkcyk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wYWdlQ2hhbmdlZCh0aGlzLnNjcm9sbGFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxhYmxlICYmICF0aGlzLnBhZ2luZy5sb2FkTW9yZUVuYWJsZWQpIHtcblxuICAgICAgICAgIGNvbnN0IGNvbnRhaW5zID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2RrLW92ZXJsYXktY29udGFpbmVyJykpLnNvbWUob3ZlcmxheSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKG92ZXJsYXkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbGV0IGVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgaWYgKCFjb250YWlucykge1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGlmICgocmVjdC50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQpIDwgd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICAgICAgICAgIGVsID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmZldGNoQ29tcGxldGUkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JClcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmV0Y2gkLm5leHQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zb3J0aW5nLnNvcnRpbmdDaGFuZ2VkJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLlNvcnQpO1xuICAgICAgICB0aGlzLnBhZ2luZy5wYWdlID0gMTtcblxuICAgICAgICBpZiAodGhpcy5mc1Njcm9sbEluc3RhbmNlKSB7XG4gICAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5jbGVhclJvd3MoKTtcbiAgICAgICAgICB0aGlzLmZzU2Nyb2xsSW5zdGFuY2UucmVsb2FkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mZXRjaCQubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIHRoaXMubGlzdGVuUm93c1JlbW92ZSgpO1xuICAgIHRoaXMubGlzdGVuRmV0Y2goKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhKHRyYWNrQnk/OiBGc0xpc3RUcmFja0J5Rm4pIHtcbiAgICBsZXQgcm93c0RhdGEgPSB0aGlzLmRhdGFDb250cm9sbGVyXG4gICAgICAudmlzaWJsZVJvd3NEYXRhO1xuXG4gICAgaWYgKHRyYWNrQnkpIHtcbiAgICAgIHJvd3NEYXRhID0gcm93c0RhdGFcbiAgICAgICAgLmZpbHRlcih0cmFja0J5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93c0RhdGFcbiAgICAgIC5tYXAoKGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGNsb25lRGVlcChkYXRhKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGhhc0RhdGEodHJhY2tCeTogRnNMaXN0VHJhY2tCeUZuKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YUNvbnRyb2xsZXIudmlzaWJsZVJvd3NEYXRhLnNvbWUodHJhY2tCeSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIGdyb3VwIG1vZGUgc3RhdHVzXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGdyb3VwRW5hYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmRhdGFDb250cm9sbGVyLmdyb3VwRW5hYmxlZCAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuZ3JvdXBFbmFibGVkID0gdmFsdWU7XG5cbiAgICAgIC8vIENvbW1lbnRlZCBvdXQgYmVjYXVzZSBSYXkgd2FudHMgdG8gY2hhbmdlIGdyb3VwIHN0YXR1cyBpbiBmZXRjaCBtYXAgcGlwZVxuICAgICAgLy8gYW5kIGl0IHRyaWdnZXJzIGV4dHJhIHJlcXVlc3RzXG4gICAgICAvLyB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl9mc1Njcm9sbFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fZnNTY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYWdpbmcpIHtcbiAgICAgIHRoaXMucGFnaW5nLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0aW5nKSB7XG4gICAgICB0aGlzLnNvcnRpbmcuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZpbHRlckNvbmZpZykge1xuICAgICAgdGhpcy5maWx0ZXJDb25maWcgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4dGVybmFsUGFyYW1zKSB7XG4gICAgICB0aGlzLmV4dGVybmFsUGFyYW1zLmRlc3Ryb3koKVxuICAgIH1cblxuICAgIHRoaXMuY29sdW1ucy5kZXN0cm95KCk7XG5cbiAgICB0aGlzLm9uRGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95JC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5kYXRhQ29udHJvbGxlci5kZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogRG8gaW5pdGlhbGl6YXRpb24gb2YgdGFibGVcbiAgICogQHBhcmFtIGNvbmZpZ1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplKGNvbmZpZzogRnNMaXN0Q29uZmlnKSB7XG4gICAgdGhpcy5jb2x1bW5zLmluaXRDb25maWcoY29uZmlnLmNvbHVtbik7XG4gICAgdGhpcy5pbml0RGVmYXVsdE9wdGlvbnMoY29uZmlnKTtcbiAgICB0aGlzLmluaXRSZXN0b3JlKCk7XG4gICAgdGhpcy5pbml0QWN0aW9ucyhjb25maWcuYWN0aW9ucyk7XG4gICAgdGhpcy5pbml0UGFnaW5nKGNvbmZpZy5wYWdpbmcsIGNvbmZpZy5sb2FkTW9yZSk7XG4gICAgdGhpcy5pbml0U2VsZWN0aW9uKGNvbmZpZy5zZWxlY3Rpb24sIHRoaXMuc2VsZWN0aW9uRGlhbG9nKTtcbiAgICB0aGlzLmluaXRHcm91cHMoY29uZmlnLmdyb3VwKTtcbiAgICB0aGlzLmluaXRFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIoKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZURhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKdXN0IGluaXQgb3B0aW9ucyBieSBkZWZhdWx0IGl0IGl0IHdhc24ndCBzcGVjaWZpZWRcbiAgICogQHBhcmFtIGNvbmZpZ1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0RGVmYXVsdE9wdGlvbnMoY29uZmlnKSB7XG4gICAgLy8gV2Ugc2hvdWxkIHByZXZlbnQgaW5pdGlhbCBmZXRjaCBpbiBjYXNlcyB3aGVuIGl0IHdpbGwgYmUgZmV0Y2hlZCBpbiBhbnkgY2FzZVxuICAgIC8vIEFzIGV4LiBzY3JvbGxhYmxlIG9yIGZpbHRlciB3aWxsIGRvIGZldGNoIGluIGFueSBjYXNlc1xuICAgIGlmIChjb25maWcuaW5pdGlhbEZldGNoID09PSBmYWxzZSB8fCBjb25maWcuc2Nyb2xsYWJsZSkgeyAvLyBUT0RPIGZpeG1lIGFmdGVyIHRzbW9kZWwgdmVyc2lvbiB1cGRhdGVcbiAgICAgIHRoaXMuaW5pdGlhbEZldGNoID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcuc3RhdHVzID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5zdGF0dXMgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5jaGlwcykge1xuICAgICAgdGhpcy5jaGlwcyA9IGNvbmZpZy5jaGlwcztcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5maWx0ZXJJbnB1dCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZmlsdGVySW5wdXQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbkRpYWxvZykge1xuICAgICAgdGhpcy5xdWVyeVBhcmFtID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucXVlcnlQYXJhbSA9IChjb25maWcucXVlcnlQYXJhbSA9PT0gdm9pZCAwKVxuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBjb25maWcucXVlcnlQYXJhbTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnNvcnRzKSB7XG4gICAgICB0aGlzLnNvcnRpbmcuaW5pdEZha2VDb2x1bW5zKGNvbmZpZy5zb3J0cyk7XG4gICAgfVxuICAgIGlmICghY29uZmlnLnRyYWNrQnkpIHtcbiAgICAgIHRoaXMudHJhY2tCeSA9ICdpZCc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXQgcmVzdG9yZSByb3cgYWN0aW9uIGFuZCBhcHBlbmQgU2hvdyBEZWxldGVkIG9wdGlvbiBpbnRvIGZpbHRlcnNcbiAgICovXG4gIHByaXZhdGUgaW5pdFJlc3RvcmUoKSB7XG4gICAgaWYgKHRoaXMucmVzdG9yZSkge1xuICAgICAgY29uc3QgcmVzdG9yZUFjdGlvbiA9IG5ldyBSb3dBY3Rpb24oe1xuICAgICAgICBsYWJlbDogdGhpcy5yZXN0b3JlLm1lbnVMYWJlbCB8fCAnUmVzdG9yZScsXG4gICAgICAgIG1lbnU6IHRydWUsXG4gICAgICAgIGNsaWNrOiAocm93KSA9PiB7IHRoaXMucmVzdG9yZUNsaWNrKHRoaXMucmVzdG9yZS5jbGljaywgcm93KSB9LCAvLyBUT0RPIGZpeCBtZSwgbW92ZSB0byBzcGVjaWFsIGZpbGVcbiAgICAgICAgcmVzdG9yZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghdGhpcy5yb3dBY3Rpb25zUmF3KSB7XG4gICAgICAgIHRoaXMucm93QWN0aW9uc1JhdyA9IFtdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJvd0FjdGlvbnNSYXcucHVzaChyZXN0b3JlQWN0aW9uKTtcblxuICAgICAgaWYgKCF0aGlzLmZpbHRlcnMpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJzID0gW107XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnJlc3RvcmUuZmlsdGVyICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLmZpbHRlcnMucHVzaCh7XG4gICAgICAgICAgbmFtZTogU0hPV19ERUxFVEVEX0ZJTFRFUlNfS0VZLFxuICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLkNoZWNrYm94LFxuICAgICAgICAgIGxhYmVsOiB0aGlzLnJlc3RvcmUuZmlsdGVyTGFiZWwgfHwgJ1Nob3cgRGVsZXRlZCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogSW5pdCBwYWdpbmdcbiAgICogQHBhcmFtIHBhZ2luZ0NvbmZpZ1xuICAgKiBAcGFyYW0gbG9hZE1vcmVcbiAgICovXG4gIHByaXZhdGUgaW5pdFBhZ2luZyhwYWdpbmdDb25maWc6IEZzUGFnaW5nIHwgZmFsc2UsIGxvYWRNb3JlOiBGc0xpc3RMb2FkTW9yZUNvbmZpZyB8IGJvb2xlYW4pIHtcbiAgICB0aGlzLnBhZ2luZy5pbml0V2l0aENvbmZpZyhwYWdpbmdDb25maWcsIGxvYWRNb3JlLCAhIXRoaXMuc2Nyb2xsYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXQgYWN0aW9ucyBieSBjYXRlZ29yaWVzXG4gICAqL1xuICBwcml2YXRlIGluaXRBY3Rpb25zKGFjdGlvbnMpIHtcbiAgICBpZiAoYWN0aW9ucykge1xuICAgICAgdGhpcy5hY3Rpb25zLnNldEFjdGlvbnMoYWN0aW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy5oYXNSb3dBY3Rpb25zID1cbiAgICAgICh0aGlzLnJvd0FjdGlvbnNSYXcgJiYgdGhpcy5yb3dBY3Rpb25zUmF3Lmxlbmd0aCA+IDApXG4gICAgICB8fCAodGhpcy5ncm91cEFjdGlvbnNSYXcgJiYgdGhpcy5ncm91cEFjdGlvbnNSYXcubGVuZ3RoID4gMCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTZWxlY3Rpb24oXG4gICAgc2VsZWN0aW9uQ29uZmlnOiBGc0xpc3RTZWxlY3Rpb25Db25maWcsXG4gICAgc2VsZWN0aW9uRGlhbG9nOiBTZWxlY3Rpb25EaWFsb2csXG4gICkge1xuICAgIGlmIChzZWxlY3Rpb25Db25maWcpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbkNvbnRyb2xsZXIoc2VsZWN0aW9uQ29uZmlnLCB0aGlzLnRyYWNrQnksIHNlbGVjdGlvbkRpYWxvZyk7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZXRSb3dzQ2FsbGJhY2soKCkgPT4gdGhpcy5kYXRhQ29udHJvbGxlci52aXNpYmxlUm93cyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRGF0YSgpIHtcbiAgICB0aGlzLmRhdGFDb250cm9sbGVyLnNldEFkZGl0aW9uYWxDb25maWdzKHtcbiAgICAgIHNjcm9sbGFibGU6ICEhdGhpcy5zY3JvbGxhYmxlLFxuICAgICAgbG9hZE1vcmVFbmFibGVkOiB0aGlzLnBhZ2luZy5sb2FkTW9yZUVuYWJsZWRcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEdyb3Vwcyhncm91cENvbmZpZzogRnNMaXN0R3JvdXBDb25maWcpIHtcbiAgICBpZiAoZ3JvdXBDb25maWcpIHtcbiAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0R3JvdXBDb25maWcoZ3JvdXBDb25maWcpO1xuICAgICAgdGhpcy5ncm91cEFjdGlvbnNSYXcgPSBncm91cENvbmZpZy5hY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdEV4dGVybmFsUGFyYW1zQ29udHJvbGxlcigpIHtcbiAgICB0aGlzLmV4dGVybmFsUGFyYW1zID0gbmV3IEV4dGVybmFsUGFyYW1zQ29udHJvbGxlcihcbiAgICAgIHRoaXMucm91dGVyLFxuICAgICAgdGhpcy5yb3V0ZSxcbiAgICAgIHRoaXMucGVyc2lzdGFuY2UsXG4gICAgICB0aGlzLnBhZ2luZyxcbiAgICAgIHRoaXMuc29ydGluZyxcbiAgICAgIHRoaXMucXVlcnlQYXJhbVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGZldGNoJCBldmVudCB3aXRoIGRlYm91bmNlXG4gICAqL1xuICBwcml2YXRlIGxpc3RlbkZldGNoKCkge1xuICAgIGxldCBmZXRjaCQgPSB0aGlzLmZldGNoJC5hc09ic2VydmFibGUoKTtcblxuICAgIC8vIFNob3VsZCB3YWl0IHVudGlsIHNhdmVkIGZpbHRlcnMgbm90IGxvYWRlZFxuICAgIGlmICghIXRoaXMuZmlsdGVycyAmJiAhIXRoaXMuc2F2ZWRGaWx0ZXJzKSB7XG4gICAgICBmZXRjaCQgPSBjb21iaW5lTGF0ZXN0KFtmZXRjaCQsIHRoaXMuZmlsdGVyc1JlYWR5JF0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgoW3BhcmFtc10pID0+IHBhcmFtcyksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZmV0Y2gkXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uPy5jbG9zZVNlbGVjdGlvbkRpYWxvZygpO1xuICAgICAgICB9KSxcbiAgICAgICAgbWFwKChwYXJhbXM6IEZzTGlzdEZldGNoU3Vic2NyaXB0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLnBhZ2luZy5oYXNPZmZzZXRTdHJhdGVneSAmJiBwYXJhbXMgJiYgcGFyYW1zLmxvYWRPZmZzZXRcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5maWx0ZXJzUXVlcnksIHRoaXMucGFnaW5nLmxvYWREZWxldGVkT2Zmc2V0UXVlcnkpXG4gICAgICAgICAgICA6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZmlsdGVyc1F1ZXJ5LCB0aGlzLnBhZ2luZy5xdWVyeSk7XG5cbiAgICAgICAgICBpZiAodGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW4pIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3JkZXI6IGAke3RoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uLm5hbWV9LCR7dGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW4uZGlyZWN0aW9ufWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBxdWVyeTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgocXVlcnkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jb2x1bW5zLmxvYWRGbkNvbmZpZ3VyZWQgJiYgIXRoaXMuY29sdW1ucy5jb2x1bW5zRmV0Y2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5sb2FkUmVtb3RlQ29sdW1uQ29uZmlncygpXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcFRvKHF1ZXJ5KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb2YocXVlcnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgocXVlcnkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jb2x1bW5zLmNvbmZpZ3VyZWQpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29sdW1uczogdGhpcy5jb2x1bW5zLnZpc2libGVDb2x1bW5zTmFtZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbb2YocXVlcnkpLCB0aGlzLmZldGNoUmVtb3RlKHF1ZXJ5KV0pO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IsIHNvdXJjZSQpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgIHJldHVybiBzb3VyY2UkO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBsZXRlRmV0Y2gocmVzcG9uc2UpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlblJvd3NSZW1vdmUoKSB7XG4gICAgdGhpcy5kYXRhQ29udHJvbGxlci5yb3dzUmVtb3ZlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJvd3M6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luZy5lbmFibGVkKSB7XG5cbiAgICAgICAgICBjb25zdCByZW1vdmVkQ291bnQgPSByb3dzLmxlbmd0aDtcblxuICAgICAgICAgIGlmICh0aGlzLnBhZ2luZy5oYXNQYWdlU3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIHRoaXMubm9EYXRhUGFnaW5hdGlvblVwZGF0ZShyZW1vdmVkQ291bnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGZXRjaCBtb3JlIGlmIGhhcyBzb21ldGhpbmcgZm9yIGZldGNoXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhQ29udHJvbGxlci5oYXNEYXRhIHx8IHRoaXMucGFnaW5nLmhhc05leHRQYWdlKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLkxvYWRNb3JlKTtcblxuICAgICAgICAgICAgICB0aGlzLnBhZ2luZy5yZW1vdmVSb3dzKHJlbW92ZWRDb3VudCk7XG4gICAgICAgICAgICAgIHRoaXMuZmV0Y2gkLm5leHQoeyBsb2FkT2Zmc2V0OiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5ub0RhdGFQYWdpbmF0aW9uVXBkYXRlKHJlbW92ZWRDb3VudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gc2VsZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgIHJvd3MuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZW1vdmVSb3cocm93LmRhdGEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEluZmluaXR5U2Nyb2xsKCkge1xuICAgIGlmICh0aGlzLmZzU2Nyb2xsSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY3JvbGxhYmxlKSB7XG4gICAgICAvLyBTY3JvbGxhYmxlIHN0YXR1cyBieSBkZWZhdWx0XG4gICAgICBpZiAodGhpcy5zY3JvbGxhYmxlLnN0YXR1cyA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsYWJsZS5zdGF0dXMgPSB0cnVlO1xuICAgICAgfVxuXG5cbiAgICAgIHRoaXMuZnNTY3JvbGxcbiAgICAgICAgLmNvbXBvbmVudCh0aGlzLnNjcm9sbGFibGUubmFtZSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChmc1Njcm9sbEluc3RhbmNlOiBGc1Njcm9sbEluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5mc1Njcm9sbEluc3RhbmNlID0gZnNTY3JvbGxJbnN0YW5jZTtcbiAgICAgICAgICB0aGlzLl9mc1Njcm9sbFN1YnNjcmlwdGlvbiA9IGZzU2Nyb2xsSW5zdGFuY2VcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBsZXQgc3RhcnRMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZGF0YUNvbnRyb2xsZXIub3BlcmF0aW9uO1xuXG4gICAgICAgICAgICAgIC8vIEluaXRpYWwgbG9hZGluZyBpZiBpbml0aWFsRmV0Y2ggZXF1YWxzIGZhbHNlXG4gICAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsRmV0Y2hcbiAgICAgICAgICAgICAgICAmJiAhdGhpcy5wYWdpbmcuaW5pdGlhbGl6ZWRcbiAgICAgICAgICAgICAgICAmJiBvcGVyYXRpb24gIT09IEZzTGlzdFN0YXRlLlJlbG9hZFxuICAgICAgICAgICAgICApIHtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLkxvYWQpO1xuICAgICAgICAgICAgICAgIHN0YXJ0TG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24gPT09IEZzTGlzdFN0YXRlLlJlbG9hZCB8fFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9PT0gRnNMaXN0U3RhdGUuRmlsdGVyIHx8XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uID09PSBGc0xpc3RTdGF0ZS5Tb3J0XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHN0YXJ0TG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wYWdpbmcuaW5pdGlhbGl6ZWQgJiYgdGhpcy5wYWdpbmcuaGFzTmV4dFBhZ2UpIHtcbiAgICAgICAgICAgICAgICAvLyBMb2FkaW5nIGlmIGNvbnRlbnQgaGFzIGJlZW4gc2Nyb2xsZWRcbiAgICAgICAgICAgICAgICBzdGFydExvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLkxvYWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5nLmdvTmV4dCgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHN0YXJ0TG9hZGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2gkLm5leHQoKTtcbiAgICAgICAgICAgICAgICBmc1Njcm9sbEluc3RhbmNlLmxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5yZW1vdGVSb3dzQ2hhbmdlJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGZzU2Nyb2xsSW5zdGFuY2UubG9hZGVkKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW5kIHdhdGNoIGZpbHRlciBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIGluaXRGaWx0ZXJzKCkge1xuICAgIGlmICh0aGlzLmZpbHRlckNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHNvcnRpbmcgYW5kIGZha2Ugc29ydGluZyBjb2xzXG4gICAgLy8gRmFrZSBzb3J0aW5nIGNvbHMgaXQncyBjb2xzIHdoaWNoIGRvbid0IHJlcHJlc2VudGVkIGluIHRhYmxlIGNvbHMsIGxpa2UgYWJzdHJhY3QgY29sc1xuICAgIGNvbnN0IHNvcnRWYWx1ZXMgPVxuICAgICAgW1xuICAgICAgICAuLi50aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbnMsXG4gICAgICAgIC4uLnRoaXMuc29ydGluZy5mYWtlU29ydGluZ0NvbHVtbnNcbiAgICAgIF0ucmVkdWNlKChhY2MsIGNvbHVtbikgPT4ge1xuXG4gICAgICAgIGNvbnN0IHNvcnRpbmdJdGVtID0ge1xuICAgICAgICAgIG5hbWU6IGNvbHVtbi50aXRsZSxcbiAgICAgICAgICB2YWx1ZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgZGVmYXVsdDogdGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW4gJiYgdGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW4ubmFtZSA9PT0gY29sdW1uLm5hbWVcbiAgICAgICAgfTtcblxuICAgICAgICBhY2MucHVzaChzb3J0aW5nSXRlbSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSk7XG5cbiAgICBjb25zdCBzb3J0Q29uZmlnID0gdGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW5cbiAgICAgID8geyB2YWx1ZTogdGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW4ubmFtZSwgZGlyZWN0aW9uOiB0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbi5kaXJlY3Rpb259XG4gICAgICA6IG51bGw7XG5cbiAgICAvLyBDb25maWdcbiAgICB0aGlzLmZpbHRlckNvbmZpZyA9IHtcbiAgICAgIHBlcnNpc3Q6IHRoaXMucGVyc2lzdCxcbiAgICAgIGl0ZW1zOiB0aGlzLmZpbHRlcnMgfHwgW10sXG4gICAgICBzYXZlZEZpbHRlcnM6IHRoaXMuc2F2ZWRGaWx0ZXJzLFxuICAgICAgaW5saW5lOiB0aGlzLmlubGluZUZpbHRlcnMsXG4gICAgICBhY3Rpb25zOiB0aGlzLmFjdGlvbnMuYWN0aW9ucyxcbiAgICAgIHF1ZXJ5UGFyYW06IHRoaXMucXVlcnlQYXJhbSxcbiAgICAgIHNvcnRzOiBzb3J0VmFsdWVzLFxuICAgICAgc29ydDogc29ydENvbmZpZyxcbiAgICAgIGNoaXBzOiB0aGlzLmNoaXBzLFxuICAgICAgaW5pdDogdGhpcy5maWx0ZXJJbml0LmJpbmQodGhpcyksXG4gICAgICBjaGFuZ2U6IHRoaXMuZmlsdGVyQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgICByZWxvYWQ6IHRoaXMucmVsb2FkLmJpbmQodGhpcyksXG4gICAgICBzb3J0Q2hhbmdlOiB0aGlzLmZpbHRlclNvcnQuYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHdoZW4gRmlsdGVyIGhhcyBiZWVuIGluaXRpYWxpemVkXG4gICAqIEBwYXJhbSBmaWx0ZXJzXG4gICAqL1xuICBwcml2YXRlIGZpbHRlckluaXQoZmlsdGVycykge1xuICAgIGlmICh0aGlzLmZpbHRlckluaXRDYikge1xuICAgICAgdGhpcy5maWx0ZXJJbml0Q2IoZmlsdGVycyk7XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJzUXVlcnkgPSBmaWx0ZXJzO1xuXG4gICAgdGhpcy5jaGVja1Jlc3RvcmVGaWx0ZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIEZpbHRlciBoYXMgYmVlbiBjaGFuZ2VkXG4gICAqIEBwYXJhbSBmaWx0ZXJRdWVyeVxuICAgKiBAcGFyYW0gZmlsdGVyU29ydFxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJDaGFuZ2UoZmlsdGVyUXVlcnksIGZpbHRlclNvcnQpIHtcbiAgICBpZiAodGhpcy5maWx0ZXJDaGFuZ2VDYikge1xuICAgICAgdGhpcy5maWx0ZXJDaGFuZ2VDYihmaWx0ZXJRdWVyeSwgZmlsdGVyU29ydCk7XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJzUXVlcnkgPSBmaWx0ZXJRdWVyeTtcblxuICAgIHRoaXMucmVzdG9yZU1vZGUgPSBmYWxzZTtcblxuICAgIC8vIFJlc3RvcmUgb3B0aW9uXG4gICAgdGhpcy5jaGVja1Jlc3RvcmVGaWx0ZXIoKTtcblxuICAgIGlmICh0aGlzLnJlc3RvcmUgJiYgdGhpcy5yZXN0b3JlLnJlbG9hZCkge1xuICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFDb250cm9sbGVyLnNldE9wZXJhdGlvbihGc0xpc3RTdGF0ZS5GaWx0ZXIpO1xuXG4gICAgLy8gUmVzZXQgcGFnaW5nIGZvciByZXF1ZXN0IHdpdGggY29ycmVjdCBvZmZzZXRcbiAgICB0aGlzLnBhZ2luZy5yZXNldFBhZ2luZygpO1xuXG4gICAgaWYgKHRoaXMuZnNTY3JvbGxJbnN0YW5jZSkge1xuICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5jbGVhclJvd3MoKTtcbiAgICAgIHRoaXMuZnNTY3JvbGxJbnN0YW5jZS5yZWxvYWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mZXRjaCQubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tSZXN0b3JlRmlsdGVyKCkge1xuICAgIC8vIFJlc3RvcmUgb3B0aW9uXG4gICAgaWYgKHRoaXMucmVzdG9yZSAmJiB0aGlzLmZpbHRlcnNRdWVyeVtTSE9XX0RFTEVURURfRklMVEVSU19LRVldKSB7XG4gICAgICBkZWxldGUgdGhpcy5maWx0ZXJzUXVlcnlbU0hPV19ERUxFVEVEX0ZJTFRFUlNfS0VZXTtcblxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmZpbHRlcnNRdWVyeSwgdGhpcy5yZXN0b3JlLnF1ZXJ5KTtcblxuICAgICAgdGhpcy5yZXN0b3JlTW9kZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FsbGJhY2sgd2hlbiBGaWx0ZXIgc29ydCBoYXMgYmVlbiBjaGFuZ2VkXG4gIHByaXZhdGUgZmlsdGVyU29ydChmaWx0ZXJRdWVyeSwgZmlsdGVyU29ydCkge1xuICAgIGlmIChmaWx0ZXJTb3J0KSB7XG4gICAgICB0aGlzLnNvcnRpbmcuc29ydEJ5Q29sdW1uV2l0aE5hbWUoZmlsdGVyU29ydC52YWx1ZSk7XG5cbiAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb24gPSBmaWx0ZXJTb3J0LmRpcmVjdGlvbiA9PT0gJ2FzYycgPyBTb3J0aW5nRGlyZWN0aW9uLmFzYyA6IFNvcnRpbmdEaXJlY3Rpb24uZGVzYztcbiAgICAgIHRoaXMuc29ydGluZy5zb3J0RGlyZWN0aW9uKHNvcnREaXJlY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGSVhNRSBuZWVkIHRvIGJlIHJlZmFjdG9yZWQuLi5cbiAgICAgIHRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uID0gdm9pZCAwO1xuICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbXBsZXRlRmV0Y2goW3F1ZXJ5LCByZXNwb25zZV0pIHtcblxuICAgIGlmICghdGhpcy5wYWdpbmcucGFnZSkge1xuICAgICAgdGhpcy5wYWdpbmcucGFnZSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLnBhZ2luZykge1xuICAgICAgY29uc3QgZGlzcGxheWVkID0gKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZGF0YSkgJiYgcmVzcG9uc2UuZGF0YS5sZW5ndGgpIHx8IDA7XG4gICAgICB0aGlzLnBhZ2luZy51cGRhdGVQYWdpbmcoXG4gICAgICAgIHJlc3BvbnNlLnBhZ2luZyxcbiAgICAgICAgZGlzcGxheWVkLFxuICAgICAgICB0aGlzLmRhdGFDb250cm9sbGVyLm9wZXJhdGlvbiA9PT0gRnNMaXN0U3RhdGUuTG9hZE1vcmVcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBhZ2luZy5lbmFibGVkKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJyVjIEZzTGlzdCBXYXJuaW5nICcsXG4gICAgICAgICdjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6ICNmZmNjMGInLFxuICAgICAgICAnUGFnaW5hdGlvbiBkb2VzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiAnICtcbiAgICAgICAgJ1BhZ2luYXRpb24gaXMgZW5hYmxlZCwgYnV0IGh0dHAgcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBcInBhZ2luZ1wiIGZpZWxkLiAnICtcbiAgICAgICAgJ1lvdSBoYXZlIHRvIHNldCBcInBhZ2luZzogZmFsc2VcIiBpbiBjb25maWcgb3IgYWRkIFwicGFnaW5nXCIgZmllbGQgdG8gcmVzcG9uc2UuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLy8gbXVzdCBiZSBiZWZvcmUgc2VsZWN0aW9uLCBiZWNhdXNlIHNlbGV0aW9uIHVzZSByZWNvcmRzXG4gICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRSb3dzRnJvbVJlc3BvbnNlKHJlc3BvbnNlLmRhdGEpO1xuICAgIC8vL1xuXG4gICAgLy8gVXBkYXRlIHNlbGVjdGlvbiBwYXJhbXNcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcblxuICAgICAgaWYgKHRoaXMucGFnaW5nLmVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGFnZUNoYW5nZWQodGhpcy5zY3JvbGxhYmxlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVmlzaWJsZVJlY29yZHNDb3VudCh0aGlzLnBhZ2luZy5nZXRWaXNpYmxlUmVjb3JkcygpKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVG90YWxSZWNvcmRzQ291bnQodGhpcy5wYWdpbmcucmVjb3Jkcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb3VudCA9IHJlc3BvbnNlLnBhZ2luZyAmJiByZXNwb25zZS5wYWdpbmcucmVjb3Jkc1xuICAgICAgICAgIHx8IEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZGF0YSkgJiYgcmVzcG9uc2UuZGF0YS5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVmlzaWJsZVJlY29yZHNDb3VudChjb3VudCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnVwZGF0ZVRvdGFsUmVjb3Jkc0NvdW50KGNvdW50KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRSb3dzSW50ZXJzZWN0aW9uKHRoaXMuZGF0YUNvbnRyb2xsZXIudmlzaWJsZVJvd3NEYXRhKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbXB0eVN0YXRlPy52YWxpZGF0ZSAmJiB0aGlzLmVtcHR5U3RhdGVUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5lbXB0eVN0YXRlRW5hYmxlZCA9IHRoaXMuZW1wdHlTdGF0ZS52YWxpZGF0ZShxdWVyeSwgY2xvbmVEZWVwKHJlc3BvbnNlLmRhdGEpKTtcbiAgICB9XG5cbiAgICB0aGlzLmZldGNoQ29tcGxldGUkLm5leHQoKTtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpbGwgZG8gc29tZSBhY3Rpb25zIGlmIHlvdSByZW1vdmVkIGl0ZW0gYW5kIGl0ZW0gd2FzIGxhc3Qgb24gaGlzIG93biBwYWdlXG4gICAqXG4gICAqIEV4OiBpZiBsaXN0IGhhcyAzIHBhZ2VzIGFuZCBvbiB0aGlyZCBwYWdlIHlvdSBoYXZlIG9ubHkgb25lIGl0ZW0uIEFuZCB5b3UganVzdCBkZWxldGVkIHRoaXMgaXRlbS5cbiAgICogWW91IG11c3QgZ28gdG8gc2Vjb25kIHBhZ2UsIGJ1dCBpZiBpdCB3YXMgbGFzdCBwYWdlIGFuZCB5b3UgY2FuJ3QgZ28gYmFjayAtPiBqdXN0IHJlbG9hZFxuICAgKlxuICAgKiBAcGFyYW0gZGVsZXRlZENvdW50XG4gICAqL1xuICBwcml2YXRlIG5vRGF0YVBhZ2luYXRpb25VcGRhdGUoZGVsZXRlZENvdW50KSB7XG4gICAgaWYgKCF0aGlzLmRhdGFDb250cm9sbGVyLmhhc0RhdGEpIHtcbiAgICAgIGlmICh0aGlzLnBhZ2luZy5wYWdlID4gMSkge1xuICAgICAgICB0aGlzLnBhZ2luZy5nb1RvUGFnZSh0aGlzLnBhZ2luZy5wYWdlIC0gMSB8fCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wYWdpbmcucmVjb3JkcyAtPSBkZWxldGVkQ291bnQ7XG4gICAgdGhpcy5wYWdpbmcudXBkYXRlUGFnaW5hdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuZGF0YUNvbnRyb2xsZXIuaGFzRGF0YSAmJiB0aGlzLnNlbGVjdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVmlzaWJsZVJlY29yZHNDb3VudCh0aGlzLmRhdGFDb250cm9sbGVyLnZpc2libGVSb3dzQ291bnQpO1xuICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVG90YWxSZWNvcmRzQ291bnQodGhpcy5wYWdpbmcucmVjb3Jkcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRlbXBvcmFyeSBzb2x1dGlvbiwgd2lsbCBkbyBhdXRvIHN1YnNjcmliZSBpZiB3YXMgcmV0dXJuZWQgT2JzZXJ2YWJsZS5cbiAgICpcbiAgICogVE9ETzogTU9WRSBUSElTIFBFQUNFIE9GIENPREUgVE8gU1BFQ0lBTCBQTEFDRVxuICAgKlxuICAgKiBAcGFyYW0gcmVzdG9yZUNsaWNrQ2FsbGJhY2tcbiAgICogQHBhcmFtIHJvd1xuICAgKi9cbiAgcHJpdmF0ZSByZXN0b3JlQ2xpY2socmVzdG9yZUNsaWNrQ2FsbGJhY2ssIHJvdykge1xuICAgIGNvbnN0IHJlc3RvcmVDbGlja1Jlc3VsdCA9IHJlc3RvcmVDbGlja0NhbGxiYWNrKHJvdyk7XG5cbiAgICBpZiAocmVzdG9yZUNsaWNrUmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmVzdG9yZUNsaWNrUmVzdWx0XG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKCkgPT4gdGhpcy5yZWxvYWQoKSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge30sXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iXX0=
|