@universis/ngx-tables 0.6.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.
Files changed (103) hide show
  1. package/LICENSE +163 -0
  2. package/README.md +121 -0
  3. package/bundles/universis-ngx-tables.umd.js +4591 -0
  4. package/bundles/universis-ngx-tables.umd.js.map +1 -0
  5. package/bundles/universis-ngx-tables.umd.min.js +2 -0
  6. package/bundles/universis-ngx-tables.umd.min.js.map +1 -0
  7. package/esm2015/lib/components/add-items/add-items.component.js +142 -0
  8. package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +120 -0
  9. package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +53 -0
  10. package/esm2015/lib/components/advanced-list/advanced-list.component.js +173 -0
  11. package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +175 -0
  12. package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +134 -0
  13. package/esm2015/lib/components/advanced-select/advanced-select.component.js +51 -0
  14. package/esm2015/lib/components/advanced-select/advanced-select.service.js +40 -0
  15. package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +37 -0
  16. package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +44 -0
  17. package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +23 -0
  18. package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +519 -0
  19. package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +109 -0
  20. package/esm2015/lib/components/advanced-table/advanced-table.component.js +1007 -0
  21. package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +16 -0
  22. package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +271 -0
  23. package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +2 -0
  24. package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +379 -0
  25. package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +52 -0
  26. package/esm2015/lib/directives/advanced-table-editor.directive.js +157 -0
  27. package/esm2015/lib/directives/btnexp.directive.js +225 -0
  28. package/esm2015/lib/i18n/tables.el.js +104 -0
  29. package/esm2015/lib/i18n/tables.en.js +103 -0
  30. package/esm2015/lib/pipes/advanced-aggregator.pipe.js +35 -0
  31. package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +46 -0
  32. package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +117 -0
  33. package/esm2015/lib/tables.activated-table.service.js +36 -0
  34. package/esm2015/lib/tables.module.js +134 -0
  35. package/esm2015/public_api.js +22 -0
  36. package/esm2015/universis-ngx-tables.js +14 -0
  37. package/esm5/lib/components/add-items/add-items.component.js +153 -0
  38. package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +169 -0
  39. package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +56 -0
  40. package/esm5/lib/components/advanced-list/advanced-list.component.js +185 -0
  41. package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +179 -0
  42. package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +137 -0
  43. package/esm5/lib/components/advanced-select/advanced-select.component.js +56 -0
  44. package/esm5/lib/components/advanced-select/advanced-select.service.js +43 -0
  45. package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +50 -0
  46. package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +48 -0
  47. package/esm5/lib/components/advanced-table/advanced-table-search-base.js +29 -0
  48. package/esm5/lib/components/advanced-table/advanced-table-search.component.js +556 -0
  49. package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +115 -0
  50. package/esm5/lib/components/advanced-table/advanced-table.component.js +1035 -0
  51. package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +16 -0
  52. package/esm5/lib/components/advanced-table/advanced-table.formatters.js +313 -0
  53. package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +2 -0
  54. package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +295 -0
  55. package/esm5/lib/components/table-simple-header/table-simple-header.component.js +58 -0
  56. package/esm5/lib/directives/advanced-table-editor.directive.js +175 -0
  57. package/esm5/lib/directives/btnexp.directive.js +253 -0
  58. package/esm5/lib/i18n/tables.el.js +104 -0
  59. package/esm5/lib/i18n/tables.en.js +103 -0
  60. package/esm5/lib/pipes/advanced-aggregator.pipe.js +39 -0
  61. package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +49 -0
  62. package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +130 -0
  63. package/esm5/lib/tables.activated-table.service.js +43 -0
  64. package/esm5/lib/tables.module.js +139 -0
  65. package/esm5/public_api.js +22 -0
  66. package/esm5/universis-ngx-tables.js +14 -0
  67. package/fesm2015/universis-ngx-tables.js +4127 -0
  68. package/fesm2015/universis-ngx-tables.js.map +1 -0
  69. package/fesm5/universis-ngx-tables.js +4313 -0
  70. package/fesm5/universis-ngx-tables.js.map +1 -0
  71. package/lib/advanced-aggregator.d.ts +124 -0
  72. package/lib/components/add-items/add-items.component.d.ts +44 -0
  73. package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +45 -0
  74. package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +25 -0
  75. package/lib/components/advanced-list/advanced-list.component.d.ts +42 -0
  76. package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +42 -0
  77. package/lib/components/advanced-search-form/advanced-search-form.component.d.ts +27 -0
  78. package/lib/components/advanced-select/advanced-select.component.d.ts +14 -0
  79. package/lib/components/advanced-select/advanced-select.service.d.ts +9 -0
  80. package/lib/components/advanced-table/advanced-filter-value-provider.service.d.ts +8 -0
  81. package/lib/components/advanced-table/advanced-table-resolvers.d.ts +12 -0
  82. package/lib/components/advanced-table/advanced-table-search-base.d.ts +7 -0
  83. package/lib/components/advanced-table/advanced-table-search.component.d.ts +80 -0
  84. package/lib/components/advanced-table/advanced-table-settings.component.d.ts +35 -0
  85. package/lib/components/advanced-table/advanced-table.component.d.ts +142 -0
  86. package/lib/components/advanced-table/advanced-table.formatters.d.ts +62 -0
  87. package/lib/components/advanced-table/advanced-table.formatters.interface.d.ts +15 -0
  88. package/lib/components/advanced-table/advanced-table.interfaces.d.ts +27 -0
  89. package/lib/components/advanced-table-modal/advanced-table-modal-base.component.d.ts +82 -0
  90. package/lib/components/table-simple-header/table-simple-header.component.d.ts +14 -0
  91. package/lib/directives/advanced-table-editor.directive.d.ts +25 -0
  92. package/lib/directives/btnexp.directive.d.ts +68 -0
  93. package/lib/i18n/tables.el.d.ts +102 -0
  94. package/lib/i18n/tables.en.d.ts +101 -0
  95. package/lib/pipes/advanced-aggregator.pipe.d.ts +21 -0
  96. package/lib/pipes/advansed-aggregator-list-title-parse.pipe.d.ts +21 -0
  97. package/lib/services/advanced-aggregator/advanced-aggregator.service.d.ts +32 -0
  98. package/lib/tables.activated-table.service.d.ts +9 -0
  99. package/lib/tables.module.d.ts +7 -0
  100. package/package.json +51 -0
  101. package/public_api.d.ts +18 -0
  102. package/universis-ngx-tables.d.ts +12 -0
  103. package/universis-ngx-tables.metadata.json +1 -0
@@ -0,0 +1,556 @@
1
+ import * as tslib_1 from "tslib";
2
+ import { Component, Input, Output, ViewChild, ViewEncapsulation, EventEmitter } from '@angular/core';
3
+ import { AdvancedTableComponent } from './advanced-table.component';
4
+ import { ActivatedRoute, Router } from '@angular/router';
5
+ import { AngularDataContext } from '@themost/angular';
6
+ import { DatePipe } from '@angular/common';
7
+ import { UserStorageService, ModalService, DIALOG_BUTTONS } from '@universis/common';
8
+ import { BsModalService } from 'ngx-bootstrap/modal';
9
+ import { TranslateService } from '@ngx-translate/core';
10
+ import { AdvancedFilterValueProvider } from './advanced-filter-value-provider.service';
11
+ import { AdvancedTableSearchBaseComponent } from './advanced-table-search-base';
12
+ import { TemplatePipe } from '@universis/common';
13
+ import { TextUtils } from '@themost/client';
14
+ var AdvancedTableSearchComponent = /** @class */ (function (_super) {
15
+ tslib_1.__extends(AdvancedTableSearchComponent, _super);
16
+ function AdvancedTableSearchComponent(_context, _activatedRoute, datePipe, _modalService, _userStorage, _translate, _advancedSearchValueProvider, _template, _router, _modal) {
17
+ var _this = _super.call(this) || this;
18
+ _this._context = _context;
19
+ _this._activatedRoute = _activatedRoute;
20
+ _this.datePipe = datePipe;
21
+ _this._modalService = _modalService;
22
+ _this._userStorage = _userStorage;
23
+ _this._translate = _translate;
24
+ _this._advancedSearchValueProvider = _advancedSearchValueProvider;
25
+ _this._template = _template;
26
+ _this._router = _router;
27
+ _this._modal = _modal;
28
+ _this.collapsed = true;
29
+ _this.allowSave = true;
30
+ _this.showMore = true;
31
+ _this.mergeQueryParams = true;
32
+ _this.viewChange = new EventEmitter();
33
+ _this.userSearchList = [];
34
+ _this.selectedList = null;
35
+ return _this;
36
+ }
37
+ Object.defineProperty(AdvancedTableSearchComponent.prototype, "text", {
38
+ get: function () {
39
+ if (this.searchText) {
40
+ return this.searchText.nativeElement.value;
41
+ }
42
+ },
43
+ set: function (value) {
44
+ if (this.searchText) {
45
+ this.searchText.nativeElement.value = value;
46
+ }
47
+ },
48
+ enumerable: true,
49
+ configurable: true
50
+ });
51
+ AdvancedTableSearchComponent.prototype.ngOnInit = function () {
52
+ var _this = this;
53
+ this.configChangesSubscription = this.table.configChanges.subscribe(function (config) {
54
+ if (config == null) {
55
+ return;
56
+ }
57
+ // load user searches
58
+ _this.loadUserSearchList().then(function () {
59
+ // if search component merges query params
60
+ // (uses queryParams to apply filter)
61
+ if (_this.mergeQueryParams) {
62
+ _this.queryParamSubscription = _this._activatedRoute.queryParams.subscribe(function (queryParams) {
63
+ _this.applyQueryParams(queryParams);
64
+ });
65
+ }
66
+ });
67
+ });
68
+ };
69
+ /**
70
+ * Applies query given by the queryParams of the activated route
71
+ * @param queryParams
72
+ */
73
+ AdvancedTableSearchComponent.prototype.applyQueryParams = function (queryParams) {
74
+ var _this = this;
75
+ this.filter = {};
76
+ if (Object.prototype.hasOwnProperty.call(queryParams, 'q')) {
77
+ // set collapsed
78
+ this.collapsed = true;
79
+ // search text
80
+ this.text = queryParams.q;
81
+ return this.table.search(this.text);
82
+ }
83
+ else {
84
+ this.text = '';
85
+ }
86
+ var filterParams = Object.assign({}, queryParams);
87
+ if (Object.prototype.hasOwnProperty.call(queryParams, 's')) {
88
+ // set collapsed
89
+ this.collapsed = false;
90
+ // find user search by name
91
+ if (this.userSearchList) {
92
+ this.selectedList = this.userSearchList.find(function (item) {
93
+ return item.name === queryParams.s;
94
+ });
95
+ if (this.selectedList) {
96
+ filterParams = this.selectedList.filter;
97
+ }
98
+ }
99
+ }
100
+ else {
101
+ this.selectedList = null;
102
+ }
103
+ Object.keys(filterParams).filter(function (key) {
104
+ // search criteria
105
+ if (_this.table && _this.table.config && _this.table.config.criteria) {
106
+ return _this.table.config.criteria.find(function (item) {
107
+ return item.name === key;
108
+ });
109
+ }
110
+ }).forEach(function (key) {
111
+ var value = filterParams[key];
112
+ if (TextUtils.isNumber(value)) {
113
+ value = parseFloat(filterParams[key]);
114
+ }
115
+ if (_this.filter[key] !== value) {
116
+ // set value
117
+ Object.defineProperty(_this.filter, key, {
118
+ configurable: true,
119
+ enumerable: true,
120
+ writable: true,
121
+ value: value
122
+ });
123
+ }
124
+ if (_this.filter[key] != null) {
125
+ _this.collapsed = false;
126
+ }
127
+ });
128
+ // call filterChange event to apply change to advanced search children
129
+ this.filterChange.emit(this.filter);
130
+ // apply query
131
+ this.getQuery().then(function (query) {
132
+ // if table query is null
133
+ if (_this.table.query == null) {
134
+ // set query
135
+ _this.table.query = query;
136
+ }
137
+ else {
138
+ if (query != null) {
139
+ var params = query.getParams();
140
+ // otherwise set filter params
141
+ _this.table.query.setParam('$filter', params.$filter);
142
+ }
143
+ else {
144
+ _this.table.query.setParam('$filter', null);
145
+ }
146
+ }
147
+ // and finally fetch data
148
+ _this.table.fetch(true);
149
+ });
150
+ };
151
+ AdvancedTableSearchComponent.prototype.ngOnDestroy = function () {
152
+ if (this.queryParamSubscription) {
153
+ this.queryParamSubscription.unsubscribe();
154
+ }
155
+ if (this.configChangesSubscription) {
156
+ this.configChangesSubscription.unsubscribe();
157
+ }
158
+ };
159
+ AdvancedTableSearchComponent.prototype.ngAfterViewInit = function () {
160
+ };
161
+ AdvancedTableSearchComponent.prototype.onSearchKeyDown = function (event) {
162
+ if (this.table && event.keyCode === 13) {
163
+ // get search text
164
+ var searchText = event.target.value;
165
+ // merge query params ?
166
+ if (this.mergeQueryParams) {
167
+ var queryParams_1 = {
168
+ q: searchText
169
+ };
170
+ if (this.table.config && this.table.config.criteria) {
171
+ this.table.config.criteria.forEach(function (item) {
172
+ Object.defineProperty(queryParams_1, item.name, {
173
+ configurable: true,
174
+ enumerable: true,
175
+ writable: true,
176
+ value: null
177
+ });
178
+ });
179
+ }
180
+ // try to apply filter by appending query params
181
+ return this._router.navigate([], {
182
+ relativeTo: this._activatedRoute,
183
+ queryParams: queryParams_1,
184
+ queryParamsHandling: 'merge'
185
+ });
186
+ }
187
+ // otherwise do search
188
+ this.table.search(searchText);
189
+ return false;
190
+ }
191
+ };
192
+ AdvancedTableSearchComponent.prototype.transformDate = function (date) {
193
+ date = this.datePipe.transform(date, 'MM/dd/yyyy'); // whatever format you need.
194
+ return date;
195
+ };
196
+ AdvancedTableSearchComponent.prototype.convertToString = function (nameFilter) {
197
+ var name = '';
198
+ if (nameFilter != null) {
199
+ name = nameFilter.toString();
200
+ }
201
+ return name;
202
+ };
203
+ // Load saved criteria searches user has stored before
204
+ AdvancedTableSearchComponent.prototype.loadUserSearchList = function () {
205
+ var _this = this;
206
+ this.storageKey = 'tables/' + this.table.config.model + '/searches';
207
+ return this._userStorage.getItem(this.storageKey).then(function (data) {
208
+ var list = data.value || [];
209
+ // if table configuration has pre-defined searches
210
+ if (_this.table && _this.table.config.searches && _this.table.config.searches.length) {
211
+ // add pre-defined lists
212
+ list.push.apply(list, _this.table.config.searches.map(function (x) {
213
+ x.readOnly = true; // as readonly
214
+ x.name = _this._translate.instant(x.name);
215
+ return x;
216
+ }));
217
+ }
218
+ // set user search list
219
+ _this.userSearchList = list;
220
+ return Promise.resolve();
221
+ }).catch(function (err) {
222
+ // DO NOT THROW ERROR
223
+ // todo: notify component for this error in order to disable some actions
224
+ console.error('An error occurred while getting user search list');
225
+ console.error(err);
226
+ return Promise.resolve();
227
+ });
228
+ };
229
+ AdvancedTableSearchComponent.prototype.onSelectUserSearch = function (event) {
230
+ if (this.selectedList) {
231
+ var listFound = this.searchInListByName(this.selectedList.name);
232
+ if (listFound) {
233
+ if (this.mergeQueryParams) {
234
+ var queryParams_2 = { q: null, s: this.selectedList.name };
235
+ // clear criteria if any
236
+ this.table.config.criteria.forEach(function (item) {
237
+ if (Object.prototype.hasOwnProperty.call(queryParams_2, item.name) === false) {
238
+ // set null value
239
+ Object.defineProperty(queryParams_2, item.name, {
240
+ configurable: true,
241
+ enumerable: true,
242
+ writable: true,
243
+ value: null
244
+ });
245
+ }
246
+ });
247
+ return this._router.navigate([], {
248
+ relativeTo: this._activatedRoute,
249
+ queryParams: queryParams_2,
250
+ queryParamsHandling: 'merge'
251
+ });
252
+ }
253
+ this.selectedList = listFound;
254
+ this.filter = this.selectedList.filter;
255
+ this.filterChange.emit(this.filter);
256
+ return true;
257
+ }
258
+ }
259
+ else {
260
+ return this._router.navigate([], {
261
+ relativeTo: this._activatedRoute,
262
+ queryParams: { s: null },
263
+ queryParamsHandling: 'merge'
264
+ });
265
+ }
266
+ return false;
267
+ };
268
+ AdvancedTableSearchComponent.prototype.searchInListByName = function (name) {
269
+ if (Array.isArray(this.userSearchList)) {
270
+ var listFound = this.userSearchList.find(function (x) { return x.name === name; });
271
+ if (listFound) {
272
+ return listFound;
273
+ }
274
+ else {
275
+ return false;
276
+ }
277
+ }
278
+ };
279
+ // Update list item contents with given content (Search by object name property)
280
+ AdvancedTableSearchComponent.prototype.updateSavedSearchListItemByName = function (name, newItem) {
281
+ var itemInList = this.userSearchList.find(function (x) { return x.name === name; });
282
+ var index = this.userSearchList.indexOf(itemInList);
283
+ this.userSearchList[index] = newItem;
284
+ this.selectedList = this.userSearchList[index];
285
+ };
286
+ // Update list item contents with given content (Search by object)
287
+ AdvancedTableSearchComponent.prototype.updateSavedSearchListItemByObject = function (itemInList, newItem) {
288
+ var index = this.userSearchList.indexOf(itemInList);
289
+ this.userSearchList[index] = newItem;
290
+ this.selectedList = this.userSearchList[index];
291
+ };
292
+ // Delete list item from list
293
+ AdvancedTableSearchComponent.prototype.deleteItemFromSavedSearchListByObject = function (itemInList) {
294
+ this.userSearchList = this.userSearchList.filter(function (item) { return item !== itemInList; });
295
+ this.selectedList = null;
296
+ this.filter = {};
297
+ this.advancedSearch(true);
298
+ this.uploadListOnUserStorage();
299
+ };
300
+ // User chose to save its advanced form search criteria
301
+ AdvancedTableSearchComponent.prototype.saveSearch = function (templateToLoad, newList) {
302
+ if (newList === void 0) { newList = true; }
303
+ if (this.table.config.model) {
304
+ // Set the corresponding key to its list and show a confirmation modal window
305
+ this.storageKey = "tables/" + this.table.config.model + "/searches";
306
+ if (this.filter && Object.keys(this.filter).length) {
307
+ // User wants to save an existing list from the dropdown
308
+ if (!newList && this.selectedList) {
309
+ var newItem = { 'name': this.selectedList.name, 'filter': tslib_1.__assign({}, this.filter) };
310
+ this.updateSavedSearchListItemByObject(this.selectedList, newItem);
311
+ this.uploadListOnUserStorage();
312
+ // User wants to save a new list
313
+ }
314
+ else {
315
+ this.modalRef = this._modalService.show(templateToLoad);
316
+ }
317
+ }
318
+ else {
319
+ // User did not define any criteria
320
+ this._modal.showWarningDialog(this._translate.instant('AdvancedSearch.Modal.Title'), this._translate.instant('AdvancedSearch.Modal.EmptyCriteriaList'), DIALOG_BUTTONS.Ok);
321
+ }
322
+ }
323
+ else {
324
+ this._modal.showWarningDialog(this._translate.instant('AdvancedSearch.Modal.Title'), this._translate.instant('AdvancedSearch.Modal.NoListDefined'), DIALOG_BUTTONS.Ok);
325
+ }
326
+ };
327
+ // User Accepted => Save list and Close modal
328
+ AdvancedTableSearchComponent.prototype.confirmModal = function (saveFormName) {
329
+ // name given and list name is unique
330
+ if (saveFormName && !(this.searchInListByName(saveFormName))) {
331
+ var newInsertedValue = { 'name': saveFormName, 'filter': tslib_1.__assign({}, this.filter) };
332
+ if (this.userSearchList && this.userSearchList.length !== 0) {
333
+ this.userSearchList.push(newInsertedValue);
334
+ this.storageValue = this.userSearchList;
335
+ this.selectedList = newInsertedValue;
336
+ }
337
+ else {
338
+ this.storageValue = [newInsertedValue];
339
+ this.userSearchList = this.storageValue;
340
+ this.selectedList = newInsertedValue;
341
+ }
342
+ this.uploadListOnUserStorage();
343
+ this.modalRef.hide();
344
+ }
345
+ else if (saveFormName && (this.searchInListByName(saveFormName))) {
346
+ // User should insert a different name cause this one is already in use
347
+ alert(this._translate.instant('AdvancedSearch.Modal.TitleOnListAlreadyCreated'));
348
+ }
349
+ else {
350
+ // User did not insert any text
351
+ alert(this._translate.instant('AdvancedSearch.Modal.TitleOnUserError'));
352
+ }
353
+ };
354
+ // User declined => Close modal
355
+ AdvancedTableSearchComponent.prototype.closeModal = function () {
356
+ this.modalRef.hide();
357
+ };
358
+ // Upload user's criteria on User Storage
359
+ AdvancedTableSearchComponent.prototype.uploadListOnUserStorage = function () {
360
+ this._userStorage.setItem(this.storageKey, this.userSearchList.filter(function (x) {
361
+ return !x.readOnly;
362
+ }));
363
+ };
364
+ /**
365
+ * @deprecated This method is going to be deprecated. Use search() method instead.
366
+ * @param {*} event
367
+ */
368
+ AdvancedTableSearchComponent.prototype.asyncAdvancedSearch = function (event) {
369
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
370
+ var query, queryParams_3;
371
+ return tslib_1.__generator(this, function (_a) {
372
+ switch (_a.label) {
373
+ case 0:
374
+ if (!(this.table && this.table.config && Array.isArray(this.table.config.criteria))) return [3 /*break*/, 2];
375
+ return [4 /*yield*/, this.getQuery()];
376
+ case 1:
377
+ query = _a.sent();
378
+ if (this.mergeQueryParams) {
379
+ this.selectedList = null;
380
+ queryParams_3 = Object.assign({ q: null, s: null }, this.filter);
381
+ // enumerate criteria
382
+ this.table.config.criteria.forEach(function (item) {
383
+ if (Object.prototype.hasOwnProperty.call(queryParams_3, item.name) === false) {
384
+ // set null value
385
+ Object.defineProperty(queryParams_3, item.name, {
386
+ configurable: true,
387
+ enumerable: true,
388
+ writable: true,
389
+ value: null
390
+ });
391
+ }
392
+ });
393
+ return [2 /*return*/, this._router.navigate([], {
394
+ relativeTo: this._activatedRoute,
395
+ queryParams: queryParams_3,
396
+ queryParamsHandling: 'merge'
397
+ })];
398
+ }
399
+ if (this.table.query) {
400
+ this.table.query.setParam('$filter', query.getParams()['$filter']);
401
+ }
402
+ else {
403
+ this.table.query = query;
404
+ }
405
+ this.table.fetch();
406
+ _a.label = 2;
407
+ case 2: return [2 /*return*/];
408
+ }
409
+ });
410
+ });
411
+ };
412
+ AdvancedTableSearchComponent.prototype.search = function () {
413
+ return this.asyncAdvancedSearch().then(function () {
414
+ // do nothing
415
+ });
416
+ };
417
+ AdvancedTableSearchComponent.prototype.getQuery = function () {
418
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
419
+ var expressions_1, values_1, query;
420
+ var _this = this;
421
+ return tslib_1.__generator(this, function (_a) {
422
+ switch (_a.label) {
423
+ case 0:
424
+ // on simple search return null
425
+ if (this.collapsed) {
426
+ return [2 /*return*/, null];
427
+ }
428
+ if (!(this.table && this.table.config && Array.isArray(this.table.config.criteria))) return [3 /*break*/, 2];
429
+ expressions_1 = [];
430
+ return [4 /*yield*/, this._advancedSearchValueProvider.getValues()];
431
+ case 1:
432
+ values_1 = _a.sent();
433
+ this.table.config.criteria.forEach(function (x) {
434
+ if (Object.prototype.hasOwnProperty.call(_this.filter, x.name)) {
435
+ var nameFilter = _this.convertToString(_this.filter[x.name]);
436
+ if (nameFilter.includes('GMT')) {
437
+ var newDate = _this.transformDate(_this.filter[x.name]);
438
+ expressions_1.push(_this._template.transform(x.filter, {
439
+ value: newDate
440
+ }));
441
+ }
442
+ else if (_this.filter[x.name] !== 'undefined') {
443
+ expressions_1.push(_this._template.transform(x.filter, Object.assign({
444
+ value: _this.filter[x.name]
445
+ }, values_1)));
446
+ }
447
+ }
448
+ });
449
+ query = void 0;
450
+ if (expressions_1 || expressions_1.length) {
451
+ // create client query
452
+ query = this._context.model(this.table.config.model).asQueryable();
453
+ query.setParam('filter', expressions_1.join(' and '));
454
+ }
455
+ else {
456
+ query = this._context.model(this.table.config.model).asQueryable();
457
+ }
458
+ return [2 /*return*/, query];
459
+ case 2: return [2 /*return*/];
460
+ }
461
+ });
462
+ });
463
+ };
464
+ AdvancedTableSearchComponent.prototype.advancedSearch = function (event) {
465
+ return this.asyncAdvancedSearch(event);
466
+ };
467
+ AdvancedTableSearchComponent.prototype.clear = function () {
468
+ if (this.mergeQueryParams) {
469
+ this.selectedList = null;
470
+ var queryParams_4 = { q: null, s: null };
471
+ // enumerate criteria
472
+ this.table.config.criteria.forEach(function (item) {
473
+ if (Object.prototype.hasOwnProperty.call(queryParams_4, item.name) === false) {
474
+ // set null value
475
+ Object.defineProperty(queryParams_4, item.name, {
476
+ configurable: true,
477
+ enumerable: true,
478
+ writable: true,
479
+ value: null
480
+ });
481
+ }
482
+ });
483
+ return this._router.navigate([], {
484
+ relativeTo: this._activatedRoute,
485
+ queryParams: queryParams_4,
486
+ queryParamsHandling: 'merge'
487
+ });
488
+ }
489
+ else {
490
+ // clear filter
491
+ this.filter = {};
492
+ // clear list
493
+ this.selectedList = null;
494
+ // raise filter change event
495
+ this.filterChange.emit(this.filter);
496
+ }
497
+ };
498
+ Object.defineProperty(AdvancedTableSearchComponent.prototype, "viewState", {
499
+ /**
500
+ * Gets the view state of search control
501
+ */
502
+ get: function () {
503
+ return {
504
+ advancedView: !this.collapsed
505
+ };
506
+ },
507
+ enumerable: true,
508
+ configurable: true
509
+ });
510
+ /**
511
+ * Switches view between simple and advanced search
512
+ */
513
+ AdvancedTableSearchComponent.prototype.toggleView = function () {
514
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
515
+ return tslib_1.__generator(this, function (_a) {
516
+ this.collapsed = !this.collapsed;
517
+ // emit event for view status change
518
+ this.viewChange.emit(this.viewState);
519
+ return [2 /*return*/];
520
+ });
521
+ });
522
+ };
523
+ AdvancedTableSearchComponent.decorators = [
524
+ { type: Component, args: [{
525
+ selector: 'app-advanced-table-search',
526
+ template: "<div class=\"s--list-navbar d-none d-sm-block\">\n\n <div id=\"collapse-header\" [ngClass]=\"{'show':collapsed}\" class=\"collapse multi-collapse\">\n <form class=\"form-inline p-3 col\">\n <div class=\"form-group col-7\" [ngClass]= \"{ 'col-12': !showMore }\">\n <label class=\"pr-3\" for=\"searchText\" [translate]=\"'Tables.Search'\"></label>\n <input (keydown)=\"onSearchKeyDown($event)\" spellcheck=\"false\" type=\"text\" id=\"searchText\" name=\"searchText\"\n class=\"form-control col text-left\" placeholder=\"{{ 'Tables.SearchPlaceholder' | translate }}\" #searchText>\n </div>\n <div *ngIf=\"showMore\" class=\"col-5 text-right text-secondary\" id=\"heading3\">\n <button class=\"d-inline-block btn btn-link collapsed float-right text-secondary text-decoration-none\"\n type=\"button\" (click)=\"toggleView();\">\n <span class=\"d-none d-sm-inline\" [translate]=\"'AdvancedSearch.More'\"></span>\n <i class=\"ml-2 pt-1 fa fa-chevron-down\"></i>\n </button>\n </div>\n </form>\n </div>\n\n <div id=\"collapse3\" [ngClass]=\"{'show':!collapsed}\" class=\"collapse multi-collapse\" aria-labelledby=\"heading3\">\n <div class=\"row\">\n <div class=\"col-sm-12\">\n <div id=\"advanced-form\">\n <ng-content select=\"advanced-search\"></ng-content>\n <hr class=\"mt-0 mb-0\" width=\"97%\">\n <div class=\"row\">\n <div class=\"col-sm-12\">\n <div class=\"form-inline pb-3 pt-3 pr-1 pl-1 col\">\n\n <div class=\"form-group col-4\">\n <div class=\"d-flex flex-row w-100\" *ngIf=\"allowSave\">\n <label class=\"pr-3 d-none\" [translate]=\"'AdvancedSearch.SavedSearches'\"></label>\n <select *ngIf=\"userSearchList\" class=\"custom-select text-secondary flex col-12\" (change)=\"onSelectUserSearch($event)\" [(ngModel)]=\"selectedList\">\n <option [ngValue]=\"null\" [translate]=\"'AdvancedSearch.Choose'\"></option>\n <option *ngFor=\"let item of userSearchList\" [ngValue]=\"item\">{{ item.name }}</option>\n </select>\n <select *ngIf=\"!userSearchList\" class=\"custom-select flex col-6\">\n <option [value]=\"null\" [translate]=\"'AdvancedSearch.Choose'\"></option>\n </select>\n </div>\n </div>\n\n <div class=\"col-3 d-flex flex-row w-100\">\n <div class=\"btn-group\" *ngIf=\"allowSave\" dropdown>\n <button type=\"button\" class=\"btn btn-sm btn-primary\" (click)=\"saveSearch(templateToUse, ( (selectedList && selectedList.readOnly) ? true : false ) )\" [translate]=\"'AdvancedSearch.SaveCurrentSearch'\"></button>\n <button type=\"button\" dropdownToggle class=\"btn btn-sm btn-primary dropdown-toggle dropdown-toggle-split\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\n <span class=\"sr-only\" [translate]=\"'AdvancedSearch.ToggleDropdown'\"></span>\n </button>\n\n <div class=\"dropdown-menu\" *dropdownMenu>\n <a [ngClass]=\"{'disabled': selectedList && selectedList.readOnly}\" class=\"dropdown-item\" (click)=\"saveSearch(templateToUse, false)\" [translate]=\"'AdvancedSearch.Save'\" href=\"javascript:void(0)\"></a>\n <a class=\"dropdown-item\" (click)=\"saveSearch(templateToUse)\" [translate]=\"'AdvancedSearch.SaveAs'\" href=\"javascript:void(0)\"></a>\n <div class=\"dropdown-divider\"></div>\n <a [ngClass]=\"{'disabled': selectedList && selectedList.readOnly}\" class=\"dropdown-item\" (click)=\"deleteItemFromSavedSearchListByObject(selectedList)\" [translate]=\"'AdvancedSearch.Delete'\" href=\"javascript:void(0)\"></a>\n </div>\n </div>\n </div>\n\n <div class=\"col-5 text-right text-secondary\">\n <button type=\"button\" class=\"btn btn-light text-secondary pl-2 pr-2 mr-2\" (click)=\"clear()\">\n <i class=\"fa fa-eraser\"></i>\n </button>\n <button type=\"button\" class=\"btn btn-success pl-4 pr-4 mr-2\" (click)=\"advancedSearch($event);\"\n [translate]=\"'Tables.Search'\"></button>\n <button class=\"d-inline-block btn btn-link collapsed float-right text-secondary text-decoration-none\"\n type=\"button\" (click)=\"toggleView();\">\n <span class=\"d-none d-sm-inline\" [translate]=\"'AdvancedSearch.Less'\"></span>\n <i class=\"ml-2 pt-1 fa fa-chevron-up\"></i>\n </button>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <ng-template #templateToUse>\n <div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\" [translate]=\"'AdvancedSearch.Modal.Title'\"></h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"modalRef.hide()\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body mt-0 mb-0 text-center\">\n <div>\n <p class=\"text-secondary text-left\" [translate]=\"'AdvancedSearch.Modal.Help'\"></p>\n </div>\n <form class=\"p-3 text-center\" #newListForm=\"ngForm\" >\n <div [ngVar]=\"{ name: ( selectedList?.name ? ( selectedList?.name + ' (1)' ) : null ) }\" #model=\"ngVar\">\n <input [(ngModel)]=\"model.value.name\" [required]=\"true\" id=\"newListName\" name=\"newListName\" type=\"text\" class=\"form-control\" placeholder=\"{{ 'AdvancedSearch.Modal.SaveNamePlaceholder' | translate }}\"/>\n <div class=\"btn-group mt-4\">\n <button [disabled]=\"newListForm.invalid\" type=\"button\" class=\"btn btn-primary\" (click)=\"confirmModal(model.value.name)\" [translate]=\"'AdvancedSearch.Modal.Accept'\"></button>\n <button type=\"button\" class=\"btn btn-gray-300 text-white\" (click)=\"closeModal()\" [translate]=\"'AdvancedSearch.Modal.Close'\"></button>\n </div>\n </div>\n </form>\n </div>\n </ng-template>\n\n</div>\n",
527
+ encapsulation: ViewEncapsulation.None
528
+ }] }
529
+ ];
530
+ /** @nocollapse */
531
+ AdvancedTableSearchComponent.ctorParameters = function () { return [
532
+ { type: AngularDataContext },
533
+ { type: ActivatedRoute },
534
+ { type: DatePipe },
535
+ { type: BsModalService },
536
+ { type: UserStorageService },
537
+ { type: TranslateService },
538
+ { type: AdvancedFilterValueProvider },
539
+ { type: TemplatePipe },
540
+ { type: Router },
541
+ { type: ModalService }
542
+ ]; };
543
+ AdvancedTableSearchComponent.propDecorators = {
544
+ table: [{ type: Input }],
545
+ collapsed: [{ type: Input }],
546
+ allowSave: [{ type: Input }],
547
+ showMore: [{ type: Input }],
548
+ mergeQueryParams: [{ type: Input }],
549
+ searchText: [{ type: ViewChild, args: ['searchText',] }],
550
+ viewChange: [{ type: Output, args: ['viewChange',] }]
551
+ };
552
+ return AdvancedTableSearchComponent;
553
+ }(AdvancedTableSearchBaseComponent));
554
+ export { AdvancedTableSearchComponent };
555
+
556
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvbmd4LXRhYmxlcy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2FkdmFuY2VkLXRhYmxlL2FkdmFuY2VkLXRhYmxlLXNlYXJjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUF3QyxNQUFNLGVBQWUsQ0FBQztBQUNsSixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxjQUFjLEVBQWMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVoRixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBTTVDO0lBTWtELHdEQUFnQztJQTZCaEYsc0NBQXVCLFFBQTRCLEVBQzVCLGVBQStCLEVBQy9CLFFBQWtCLEVBQ3BCLGFBQTZCLEVBQzdCLFlBQWdDLEVB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QztZQUNqQixhQUFhO1lBQ2IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsNEJBQTRCO1lBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFLRCxzQkFBVyxtREFBUztRQUhwQjs7V0FFRzthQUNIO1lBQ0UsT0FBTztnQkFDTCxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUzthQUM5QixDQUFDO1FBQ0osQ0FBQzs7O09BQUE7SUFFRDs7T0FFRztJQUNHLGlEQUFVLEdBQWhCOzs7Z0JBQ0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2pDLG9DQUFvQztnQkFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDOzs7O0tBQ3RDOztnQkFwZkYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLGcwTUFBcUQ7b0JBQ3JELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2lCQUN0Qzs7OztnQkFwQlEsa0JBQWtCO2dCQURsQixjQUFjO2dCQUVkLFFBQVE7Z0JBRVIsY0FBYztnQkFEZCxrQkFBa0I7Z0JBRWxCLGdCQUFnQjtnQkFDakIsMkJBQTJCO2dCQUczQixZQUFZO2dCQVRLLE1BQU07Z0JBR0YsWUFBWTs7O3dCQXdCdEMsS0FBSzs0QkFDTCxLQUFLOzRCQUNMLEtBQUs7MkJBQ0wsS0FBSzttQ0FDTCxLQUFLOzZCQUNMLFNBQVMsU0FBQyxZQUFZOzZCQUN0QixNQUFNLFNBQUMsWUFBWTs7SUFxZXRCLG1DQUFDO0NBQUEsQUFyZkQsQ0FNa0QsZ0NBQWdDLEdBK2VqRjtTQS9lWSw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uLCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQsIFRlbXBsYXRlUmVmLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWR2YW5jZWRUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vYWR2YW5jZWQtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQW5ndWxhckRhdGFDb250ZXh0IH0gZnJvbSAnQHRoZW1vc3QvYW5ndWxhcic7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBVc2VyU3RvcmFnZVNlcnZpY2UsIE1vZGFsU2VydmljZSwgRElBTE9HX0JVVFRPTlMgfSBmcm9tICdAdW5pdmVyc2lzL2NvbW1vbic7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSwgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtBZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXJ9IGZyb20gJy4vYWR2YW5jZWQtZmlsdGVyLXZhbHVlLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWR2YW5jZWRUYWJsZVNlYXJjaEJhc2VDb21wb25lbnQgfSBmcm9tICcuL2FkdmFuY2VkLXRhYmxlLXNlYXJjaC1iYXNlJztcbmltcG9ydCB7VGFibGVDb25maWd1cmF0aW9ufSBmcm9tICcuL2FkdmFuY2VkLXRhYmxlLmludGVyZmFjZXMnO1xuaW1wb3J0IHtUZW1wbGF0ZVBpcGV9IGZyb20gJ0B1bml2ZXJzaXMvY29tbW9uJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZm9ya0pvaW4sIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRleHRVdGlscyB9IGZyb20gJ0B0aGVtb3N0L2NsaWVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWR2YW5jZWRTZWFyY2hWaWV3U3RhdHVzIHtcbiAgYWR2YW5jZWRWaWV3OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYWR2YW5jZWQtdGFibGUtc2VhcmNoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLXRhYmxlLXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5cbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFRhYmxlU2VhcmNoQ29tcG9uZW50IGV4dGVuZHMgQWR2YW5jZWRUYWJsZVNlYXJjaEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSAge1xuXG4gIHByaXZhdGUgcXVlcnlQYXJhbVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGNvbmZpZ0NoYW5nZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgQElucHV0KCkgdGFibGU6IEFkdmFuY2VkVGFibGVDb21wb25lbnQ7XG4gIEBJbnB1dCgpIGNvbGxhcHNlZCA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93U2F2ZSA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dNb3JlID0gdHJ1ZTtcbiAgQElucHV0KCkgbWVyZ2VRdWVyeVBhcmFtcyA9IHRydWU7XG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaFRleHQnKSBzZWFyY2hUZXh0OiBhbnk7XG4gIEBPdXRwdXQoJ3ZpZXdDaGFuZ2UnKSB2aWV3Q2hhbmdlOiBFdmVudEVtaXR0ZXI8QWR2YW5jZWRTZWFyY2hWaWV3U3RhdHVzPiA9IG5ldyBFdmVudEVtaXR0ZXI8QWR2YW5jZWRTZWFyY2hWaWV3U3RhdHVzPigpO1xuICBwdWJsaWMgc2V0IHRleHQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgIHRoaXMuc2VhcmNoVGV4dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCB0ZXh0KCkge1xuICAgIGlmICh0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlYXJjaFRleHQubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBtb2RhbFJlZjogQnNNb2RhbFJlZjtcbiAgc3RvcmFnZUtleTogYW55O1xuICBzdG9yYWdlVmFsdWU6IGFueTtcbiAgdXNlclNlYXJjaExpc3Q6IGFueSA9IFtdO1xuICBzZWxlY3RlZExpc3Q6IGFueSA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoIHByb3RlY3RlZCBfY29udGV4dDogQW5ndWxhckRhdGFDb250ZXh0LFxuICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9hY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgICBwcm90ZWN0ZWQgZGF0ZVBpcGU6IERhdGVQaXBlLFxuICAgICAgICAgICAgICAgcHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICAgICAgICAgICAgIHByaXZhdGUgX3VzZXJTdG9yYWdlOiBVc2VyU3RvcmFnZVNlcnZpY2UsXG4gICAgICAgICAgICAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICBwcml2YXRlIF9hZHZhbmNlZFNlYXJjaFZhbHVlUHJvdmlkZXI6IEFkdmFuY2VkRmlsdGVyVmFsdWVQcm92aWRlcixcbiAgICAgICAgICAgICAgIHByaXZhdGUgX3RlbXBsYXRlOiBUZW1wbGF0ZVBpcGUsXG4gICAgICAgICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgICAgICAgIHByaXZhdGUgX21vZGFsOiBNb2RhbFNlcnZpY2UpIHsgc3VwZXIoKTt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWdDaGFuZ2VzU3Vic2NyaXB0aW9uID0gdGhpcy50YWJsZS5jb25maWdDaGFuZ2VzLnN1YnNjcmliZSgoY29uZmlnKSA9PiB7XG4gICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb2FkIHVzZXIgc2VhcmNoZXNcbiAgICAgICAgdGhpcy5sb2FkVXNlclNlYXJjaExpc3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAvLyBpZiBzZWFyY2ggY29tcG9uZW50IG1lcmdlcyBxdWVyeSBwYXJhbXNcbiAgICAgICAgICAvLyAodXNlcyBxdWVyeVBhcmFtcyB0byBhcHBseSBmaWx0ZXIpXG4gICAgICAgICAgaWYgKHRoaXMubWVyZ2VRdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgdGhpcy5xdWVyeVBhcmFtU3Vic2NyaXB0aW9uID0gdGhpcy5fYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChxdWVyeVBhcmFtcykgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFwcGx5UXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgcXVlcnkgZ2l2ZW4gYnkgdGhlIHF1ZXJ5UGFyYW1zIG9mIHRoZSBhY3RpdmF0ZWQgcm91dGVcbiAgICogQHBhcmFtIHF1ZXJ5UGFyYW1zXG4gICAqL1xuICBwcml2YXRlIGFwcGx5UXVlcnlQYXJhbXMocXVlcnlQYXJhbXM6IGFueSkge1xuICAgIHRoaXMuZmlsdGVyID0ge307XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChxdWVyeVBhcmFtcywgJ3EnKSkge1xuICAgICAgLy8gc2V0IGNvbGxhcHNlZFxuICAgICAgdGhpcy5jb2xsYXBzZWQgPSB0cnVlO1xuICAgICAgLy8gc2VhcmNoIHRleHRcbiAgICAgIHRoaXMudGV4dCA9IHF1ZXJ5UGFyYW1zLnE7XG4gICAgICByZXR1cm4gdGhpcy50YWJsZS5zZWFyY2godGhpcy50ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXh0ID0gJyc7XG4gICAgfVxuXG4gICAgbGV0IGZpbHRlclBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIHF1ZXJ5UGFyYW1zKTtcblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocXVlcnlQYXJhbXMsICdzJykpIHtcbiAgICAgIC8vIHNldCBjb2xsYXBzZWRcbiAgICAgIHRoaXMuY29sbGFwc2VkID0gZmFsc2U7XG4gICAgICAvLyBmaW5kIHVzZXIgc2VhcmNoIGJ5IG5hbWVcbiAgICAgIGlmICh0aGlzLnVzZXJTZWFyY2hMaXN0KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMaXN0ID0gdGhpcy51c2VyU2VhcmNoTGlzdC5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZSA9PT0gcXVlcnlQYXJhbXMucztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTGlzdCkge1xuICAgICAgICAgIGZpbHRlclBhcmFtcyA9IHRoaXMuc2VsZWN0ZWRMaXN0LmZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTGlzdCA9IG51bGw7XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMoZmlsdGVyUGFyYW1zKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgICAgLy8gc2VhcmNoIGNyaXRlcmlhXG4gICAgICBpZiAodGhpcy50YWJsZSAmJiB0aGlzLnRhYmxlLmNvbmZpZyAmJiB0aGlzLnRhYmxlLmNvbmZpZy5jcml0ZXJpYSkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZS5jb25maWcuY3JpdGVyaWEuZmluZCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLm5hbWUgPT09IGtleTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBmaWx0ZXJQYXJhbXNba2V5XTtcbiAgICAgIGlmIChUZXh0VXRpbHMuaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdChmaWx0ZXJQYXJhbXNba2V5XSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5maWx0ZXJba2V5XSAhPT0gdmFsdWUpIHtcbiAgICAgICAgLy8gc2V0IHZhbHVlXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLmZpbHRlciwga2V5LCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZmlsdGVyW2tleV0gIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmNvbGxhcHNlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gY2FsbCBmaWx0ZXJDaGFuZ2UgZXZlbnQgdG8gYXBwbHkgY2hhbmdlIHRvIGFkdmFuY2VkIHNlYXJjaCBjaGlsZHJlblxuICAgIHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXIpO1xuICAgIC8vIGFwcGx5IHF1ZXJ5XG4gICAgdGhpcy5nZXRRdWVyeSgpLnRoZW4oKHF1ZXJ5KSA9PiB7XG4gICAgICAvLyBpZiB0YWJsZSBxdWVyeSBpcyBudWxsXG4gICAgICBpZiAodGhpcy50YWJsZS5xdWVyeSA9PSBudWxsKSB7XG4gICAgICAgIC8vIHNldCBxdWVyeVxuICAgICAgICB0aGlzLnRhYmxlLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHF1ZXJ5LmdldFBhcmFtcygpO1xuICAgICAgICAgIC8vIG90aGVyd2lzZSBzZXQgZmlsdGVyIHBhcmFtc1xuICAgICAgICAgIHRoaXMudGFibGUucXVlcnkuc2V0UGFyYW0oJyRmaWx0ZXInLCBwYXJhbXMuJGZpbHRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50YWJsZS5xdWVyeS5zZXRQYXJhbSgnJGZpbHRlcicsIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBhbmQgZmluYWxseSBmZXRjaCBkYXRhXG4gICAgICB0aGlzLnRhYmxlLmZldGNoKHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucXVlcnlQYXJhbVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5xdWVyeVBhcmFtU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZ0NoYW5nZXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY29uZmlnQ2hhbmdlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICB9XG5cbiAgb25TZWFyY2hLZXlEb3duKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy50YWJsZSAmJiBldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgLy8gZ2V0IHNlYXJjaCB0ZXh0XG4gICAgICBjb25zdCBzZWFyY2hUZXh0ID0gKDxIVE1MSW5wdXRFbGVtZW50PmV2ZW50LnRhcmdldCkudmFsdWU7XG4gICAgICAvLyBtZXJnZSBxdWVyeSBwYXJhbXMgP1xuICAgICAgaWYgKHRoaXMubWVyZ2VRdWVyeVBhcmFtcykge1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcbiAgICAgICAgICBxOiBzZWFyY2hUZXh0XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnRhYmxlLmNvbmZpZyAmJiB0aGlzLnRhYmxlLmNvbmZpZy5jcml0ZXJpYSkge1xuICAgICAgICAgIHRoaXMudGFibGUuY29uZmlnLmNyaXRlcmlhLmZvckVhY2goKGl0ZW0pPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHF1ZXJ5UGFyYW1zLCBpdGVtLm5hbWUsIHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0cnkgdG8gYXBwbHkgZmlsdGVyIGJ5IGFwcGVuZGluZyBxdWVyeSBwYXJhbXNcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMuX2FjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyxcbiAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gb3RoZXJ3aXNlIGRvIHNlYXJjaFxuICAgICAgdGhpcy50YWJsZS5zZWFyY2goc2VhcmNoVGV4dCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdHJhbnNmb3JtRGF0ZShkYXRlKSB7XG4gICAgZGF0ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICdNTS9kZC95eXl5Jyk7IC8vIHdoYXRldmVyIGZvcm1hdCB5b3UgbmVlZC5cbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGNvbnZlcnRUb1N0cmluZyhuYW1lRmlsdGVyKSB7XG4gICAgbGV0IG5hbWUgPSAnJztcbiAgICBpZiAobmFtZUZpbHRlciAhPSBudWxsKSB7XG4gICAgICBuYW1lID0gbmFtZUZpbHRlci50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4vLyAgTG9hZCBzYXZlZCBjcml0ZXJpYSBzZWFyY2hlcyB1c2VyIGhhcyBzdG9yZWQgYmVmb3JlXG4gIHByaXZhdGUgbG9hZFVzZXJTZWFyY2hMaXN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcmFnZUtleSA9ICd0YWJsZXMvJyArIHRoaXMudGFibGUuY29uZmlnLm1vZGVsICsgJy9zZWFyY2hlcyc7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJTdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlS2V5KS50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gZGF0YS52YWx1ZSB8fCBbXTtcbiAgICAgIC8vIGlmIHRhYmxlIGNvbmZpZ3VyYXRpb24gaGFzIHByZS1kZWZpbmVkIHNlYXJjaGVzXG4gICAgICBpZiAodGhpcy50YWJsZSAmJiB0aGlzLnRhYmxlLmNvbmZpZy5zZWFyY2hlcyAmJiB0aGlzLnRhYmxlLmNvbmZpZy5zZWFyY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gYWRkIHByZS1kZWZpbmVkIGxpc3RzXG4gICAgICAgIGxpc3QucHVzaC5hcHBseShsaXN0LCB0aGlzLnRhYmxlLmNvbmZpZy5zZWFyY2hlcy5tYXAgKCB4ID0+IHtcbiAgICAgICAgICB4LnJlYWRPbmx5ID0gdHJ1ZTsgLy8gYXMgcmVhZG9ubHlcbiAgICAgICAgICB4Lm5hbWUgPSB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCh4Lm5hbWUpO1xuICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICAvLyBzZXQgdXNlciBzZWFyY2ggbGlzdFxuICAgICAgdGhpcy51c2VyU2VhcmNoTGlzdCA9IGxpc3Q7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgLy8gRE8gTk9UIFRIUk9XIEVSUk9SXG4gICAgICAvLyB0b2RvOiBub3RpZnkgY29tcG9uZW50IGZvciB0aGlzIGVycm9yIGluIG9yZGVyIHRvIGRpc2FibGUgc29tZSBhY3Rpb25zXG4gICAgICBjb25zb2xlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZXR0aW5nIHVzZXIgc2VhcmNoIGxpc3QnKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0VXNlclNlYXJjaChldmVudDogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZExpc3QpIHtcbiAgICAgIGNvbnN0IGxpc3RGb3VuZCA9IHRoaXMuc2VhcmNoSW5MaXN0QnlOYW1lKHRoaXMuc2VsZWN0ZWRMaXN0Lm5hbWUpO1xuICAgICAgaWYgKGxpc3RGb3VuZCkge1xuICAgICAgICBpZiAodGhpcy5tZXJnZVF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7IHE6IG51bGwsIHM6IHRoaXMuc2VsZWN0ZWRMaXN0Lm5hbWUgfTtcbiAgICAgICAgICAvLyBjbGVhciBjcml0ZXJpYSBpZiBhbnlcbiAgICAgICAgICB0aGlzLnRhYmxlLmNvbmZpZy5jcml0ZXJpYS5mb3JFYWNoKChpdGVtKT0+IHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocXVlcnlQYXJhbXMsIGl0ZW0ubmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIC8vIHNldCBudWxsIHZhbHVlXG4gICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxdWVyeVBhcmFtcywgaXRlbS5uYW1lLCB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5fYWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMsXG4gICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZExpc3QgPSBsaXN0Rm91bmQ7XG4gICAgICAgIHRoaXMuZmlsdGVyID0gdGhpcy5zZWxlY3RlZExpc3QuZmlsdGVyO1xuICAgICAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KHRoaXMuZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5fYWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiB7IHM6IG51bGwgfSxcbiAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNlYXJjaEluTGlzdEJ5TmFtZSAobmFtZTogU3RyaW5nKTogYW55IHtcbiAgICBpZiAoIEFycmF5LmlzQXJyYXkodGhpcy51c2VyU2VhcmNoTGlzdCkgKSB7XG4gICAgICBjb25zdCBsaXN0Rm91bmQgPSB0aGlzLnVzZXJTZWFyY2hMaXN0LmZpbmQoIHggPT4geC5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmICggbGlzdEZvdW5kICkge1xuICAgICAgICByZXR1cm4gbGlzdEZvdW5kO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4vLyAgVXBkYXRlIGxpc3QgaXRlbSBjb250ZW50cyB3aXRoIGdpdmVuIGNvbnRlbnQgKFNlYXJjaCBieSBvYmplY3QgbmFtZSBwcm9wZXJ0eSlcbiAgdXBkYXRlU2F2ZWRTZWFyY2hMaXN0SXRlbUJ5TmFtZSAoIG5hbWU6IFN0cmluZywgbmV3SXRlbTogYW55ICkge1xuICAgIGNvbnN0IGl0ZW1Jbkxpc3QgPSB0aGlzLnVzZXJTZWFyY2hMaXN0LmZpbmQoIHggPT4geC5uYW1lID09PSBuYW1lICk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnVzZXJTZWFyY2hMaXN0LmluZGV4T2YoaXRlbUluTGlzdCk7XG4gICAgdGhpcy51c2VyU2VhcmNoTGlzdFtpbmRleF0gPSBuZXdJdGVtO1xuICAgIHRoaXMuc2VsZWN0ZWRMaXN0ID0gdGhpcy51c2VyU2VhcmNoTGlzdFtpbmRleF07XG4gIH1cblxuLy8gIFVwZGF0ZSBsaXN0IGl0ZW0gY29udGVudHMgd2l0aCBnaXZlbiBjb250ZW50IChTZWFyY2ggYnkgb2JqZWN0KVxuICB1cGRhdGVTYXZlZFNlYXJjaExpc3RJdGVtQnlPYmplY3QgKCBpdGVtSW5MaXN0OiBhbnksIG5ld0l0ZW06IGFueSApIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMudXNlclNlYXJjaExpc3QuaW5kZXhPZihpdGVtSW5MaXN0KTtcbiAgICB0aGlzLnVzZXJTZWFyY2hMaXN0W2luZGV4XSA9IG5ld0l0ZW07XG4gICAgdGhpcy5zZWxlY3RlZExpc3QgPSB0aGlzLnVzZXJTZWFyY2hMaXN0W2luZGV4XTtcbiAgfVxuXG4vLyAgRGVsZXRlIGxpc3QgaXRlbSBmcm9tIGxpc3RcbiAgZGVsZXRlSXRlbUZyb21TYXZlZFNlYXJjaExpc3RCeU9iamVjdCAoIGl0ZW1Jbkxpc3Q6IGFueSkge1xuICAgIHRoaXMudXNlclNlYXJjaExpc3QgPSB0aGlzLnVzZXJTZWFyY2hMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IGl0ZW1Jbkxpc3QpO1xuICAgIHRoaXMuc2VsZWN0ZWRMaXN0ID0gbnVsbDtcbiAgICB0aGlzLmZpbHRlciA9IHt9O1xuICAgIHRoaXMuYWR2YW5jZWRTZWFyY2godHJ1ZSk7XG4gICAgdGhpcy51cGxvYWRMaXN0T25Vc2VyU3RvcmFnZSgpO1xuICB9XG5cbi8vICBVc2VyIGNob3NlIHRvIHNhdmUgaXRzIGFkdmFuY2VkIGZvcm0gc2VhcmNoIGNyaXRlcmlhXG4gIHNhdmVTZWFyY2goIHRlbXBsYXRlVG9Mb2FkOiBUZW1wbGF0ZVJlZjxhbnk+LCBuZXdMaXN0OiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmICggdGhpcy50YWJsZS5jb25maWcubW9kZWwgKSB7XG4vLyAgICAgIFNldCB0aGUgY29ycmVzcG9uZGluZyBrZXkgdG8gaXRzIGxpc3QgYW5kIHNob3cgYSBjb25maXJtYXRpb24gbW9kYWwgd2luZG93XG4gICAgICB0aGlzLnN0b3JhZ2VLZXkgPSBgdGFibGVzLyR7dGhpcy50YWJsZS5jb25maWcubW9kZWx9L3NlYXJjaGVzYDtcbiAgICAgIGlmICh0aGlzLmZpbHRlciAmJiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcikubGVuZ3RoKSB7XG4vLyAgICAgIFVzZXIgd2FudHMgdG8gc2F2ZSBhbiBleGlzdGluZyBsaXN0IGZyb20gdGhlIGRyb3Bkb3duXG4gICAgICAgIGlmICggIW5ld0xpc3QgJiYgdGhpcy5zZWxlY3RlZExpc3QgKSB7XG4gICAgICAgICAgY29uc3QgbmV3SXRlbSA9IHsgJ25hbWUnIDogIHRoaXMuc2VsZWN0ZWRMaXN0Lm5hbWUsICdmaWx0ZXInIDogeyAuLi4gdGhpcy5maWx0ZXIgfSB9O1xuICAgICAgICAgIHRoaXMudXBkYXRlU2F2ZWRTZWFyY2hMaXN0SXRlbUJ5T2JqZWN0ICggdGhpcy5zZWxlY3RlZExpc3QsIG5ld0l0ZW0gKTtcbiAgICAgICAgICB0aGlzLnVwbG9hZExpc3RPblVzZXJTdG9yYWdlKCk7XG4vLyAgICAgIFVzZXIgd2FudHMgdG8gc2F2ZSBhIG5ldyBsaXN0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMuX21vZGFsU2VydmljZS5zaG93KHRlbXBsYXRlVG9Mb2FkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbi8vICAgICAgICBVc2VyIGRpZCBub3QgZGVmaW5lIGFueSBjcml0ZXJpYVxuICAgICAgICB0aGlzLl9tb2RhbC5zaG93V2FybmluZ0RpYWxvZyhcbiAgICAgICAgICB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnQWR2YW5jZWRTZWFyY2guTW9kYWwuVGl0bGUnKSxcbiAgICAgICAgICB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnQWR2YW5jZWRTZWFyY2guTW9kYWwuRW1wdHlDcml0ZXJpYUxpc3QnKSxcbiAgICAgICAgICBESUFMT0dfQlVUVE9OUy5Payk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21vZGFsLnNob3dXYXJuaW5nRGlhbG9nKFxuICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdBZHZhbmNlZFNlYXJjaC5Nb2RhbC5UaXRsZScpLFxuICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdBZHZhbmNlZFNlYXJjaC5Nb2RhbC5Ob0xpc3REZWZpbmVkJyksXG4gICAgICAgICAgRElBTE9HX0JVVFRPTlMuT2spO1xuICAgIH1cbiAgfVxuXG4vLyAgVXNlciBBY2NlcHRlZCA9PiBTYXZlIGxpc3QgYW5kIENsb3NlIG1vZGFsXG4gIGNvbmZpcm1Nb2RhbCggc2F2ZUZvcm1OYW1lICk6IHZvaWQge1xuLy8gICAgbmFtZSBnaXZlbiBhbmQgbGlzdCBuYW1lIGlzIHVuaXF1ZVxuICAgIGlmICggc2F2ZUZvcm1OYW1lICYmICEodGhpcy5zZWFyY2hJbkxpc3RCeU5hbWUoc2F2ZUZvcm1OYW1lKSkgKSB7XG4gICAgICBjb25zdCBuZXdJbnNlcnRlZFZhbHVlID0geyAnbmFtZScgOiAgc2F2ZUZvcm1OYW1lLCAnZmlsdGVyJyA6IHsgLi4uIHRoaXMuZmlsdGVyIH0gfTtcbiAgICAgIGlmICggdGhpcy51c2VyU2VhcmNoTGlzdCAmJiB0aGlzLnVzZXJTZWFyY2hMaXN0Lmxlbmd0aCAhPT0gMCApIHtcbiAgICAgICAgdGhpcy51c2VyU2VhcmNoTGlzdC5wdXNoKG5ld0luc2VydGVkVmFsdWUpO1xuICAgICAgICB0aGlzLnN0b3JhZ2VWYWx1ZSA9IHRoaXMudXNlclNlYXJjaExpc3Q7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMaXN0ID0gbmV3SW5zZXJ0ZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZVZhbHVlID0gW25ld0luc2VydGVkVmFsdWVdO1xuICAgICAgICB0aGlzLnVzZXJTZWFyY2hMaXN0ID0gdGhpcy5zdG9yYWdlVmFsdWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMaXN0ID0gbmV3SW5zZXJ0ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBsb2FkTGlzdE9uVXNlclN0b3JhZ2UoKTtcbiAgICAgIHRoaXMubW9kYWxSZWYuaGlkZSgpO1xuICAgIH0gZWxzZSBpZiAoIHNhdmVGb3JtTmFtZSAmJiAodGhpcy5zZWFyY2hJbkxpc3RCeU5hbWUoc2F2ZUZvcm1OYW1lKSkgKSB7XG4vLyAgICAgIFVzZXIgc2hvdWxkIGluc2VydCBhIGRpZmZlcmVudCBuYW1lIGNhdXNlIHRoaXMgb25lIGlzIGFscmVhZHkgaW4gdXNlXG4gICAgICBhbGVydCh0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnQWR2YW5jZWRTZWFyY2guTW9kYWwuVGl0bGVPbkxpc3RBbHJlYWR5Q3JlYXRlZCcpKTtcbiAgICB9IGVsc2Uge1xuLy8gICAgICBVc2VyIGRpZCBub3QgaW5zZXJ0IGFueSB0ZXh0XG4gICAgICBhbGVydCh0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnQWR2YW5jZWRTZWFyY2guTW9kYWwuVGl0bGVPblVzZXJFcnJvcicpKTtcbiAgICB9XG4gIH1cblxuLy8gIFVzZXIgZGVjbGluZWQgPT4gQ2xvc2UgbW9kYWxcbiAgY2xvc2VNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsUmVmLmhpZGUoKTtcbiAgfVxuXG4vLyAgVXBsb2FkIHVzZXIncyBjcml0ZXJpYSBvbiBVc2VyIFN0b3JhZ2VcbiAgdXBsb2FkTGlzdE9uVXNlclN0b3JhZ2UoKSB7XG4gICAgdGhpcy5fdXNlclN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXksIHRoaXMudXNlclNlYXJjaExpc3QuZmlsdGVyKHggPT4ge1xuICAgICAgcmV0dXJuICF4LnJlYWRPbmx5O1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBnb2luZyB0byBiZSBkZXByZWNhdGVkLiBVc2Ugc2VhcmNoKCkgbWV0aG9kIGluc3RlYWQuXG4gICAqIEBwYXJhbSB7Kn0gZXZlbnRcbiAgICovXG4gIGFzeW5jIGFzeW5jQWR2YW5jZWRTZWFyY2goZXZlbnQ/OiBhbnkpIHtcbiAgICBpZiAoIHRoaXMudGFibGUgJiYgdGhpcy50YWJsZS5jb25maWcgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnRhYmxlLmNvbmZpZy5jcml0ZXJpYSkpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gYXdhaXQgdGhpcy5nZXRRdWVyeSgpO1xuICAgICAgaWYgKHRoaXMubWVyZ2VRdWVyeVBhcmFtcykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTGlzdCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gT2JqZWN0LmFzc2lnbih7IHE6IG51bGwsIHM6IG51bGwgfSwgdGhpcy5maWx0ZXIpO1xuICAgICAgICAvLyBlbnVtZXJhdGUgY3JpdGVyaWFcbiAgICAgICAgdGhpcy50YWJsZS5jb25maWcuY3JpdGVyaWEuZm9yRWFjaCgoaXRlbSk9PiB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChxdWVyeVBhcmFtcywgaXRlbS5uYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIHNldCBudWxsIHZhbHVlXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocXVlcnlQYXJhbXMsIGl0ZW0ubmFtZSwge1xuICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMuX2FjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyxcbiAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudGFibGUucXVlcnkpIHtcbiAgICAgICAgdGhpcy50YWJsZS5xdWVyeS5zZXRQYXJhbSgnJGZpbHRlcicsIHF1ZXJ5LmdldFBhcmFtcygpWyckZmlsdGVyJ10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50YWJsZS5xdWVyeSA9IHF1ZXJ5O1xuICAgICAgfVxuICAgICAgdGhpcy50YWJsZS5mZXRjaCgpO1xuICAgIH1cbiAgfVxuXG4gIHNlYXJjaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hc3luY0FkdmFuY2VkU2VhcmNoKCkudGhlbigoKSA9PiB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXRRdWVyeSgpIHtcbiAgICAvLyBvbiBzaW1wbGUgc2VhcmNoIHJldHVybiBudWxsXG4gICAgaWYgKHRoaXMuY29sbGFwc2VkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCB0aGlzLnRhYmxlICYmIHRoaXMudGFibGUuY29uZmlnICYmIEFycmF5LmlzQXJyYXkodGhpcy50YWJsZS5jb25maWcuY3JpdGVyaWEpKSB7XG4gICAgICBjb25zdCBleHByZXNzaW9ucyA9IFtdO1xuICAgICAgY29uc3QgdmFsdWVzID0gYXdhaXQgdGhpcy5fYWR2YW5jZWRTZWFyY2hWYWx1ZVByb3ZpZGVyLmdldFZhbHVlcygpO1xuICAgICAgdGhpcy50YWJsZS5jb25maWcuY3JpdGVyaWEuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZmlsdGVyLCB4Lm5hbWUpKSB7XG4gICAgICAgICAgY29uc3QgbmFtZUZpbHRlciA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMuZmlsdGVyW3gubmFtZV0pO1xuICAgICAgICAgIGlmIChuYW1lRmlsdGVyLmluY2x1ZGVzKCdHTVQnKSkge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMudHJhbnNmb3JtRGF0ZSh0aGlzLmZpbHRlclt4Lm5hbWVdKTtcbiAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2godGhpcy5fdGVtcGxhdGUudHJhbnNmb3JtKHguZmlsdGVyLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBuZXdEYXRlXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpbHRlclt4Lm5hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaCh0aGlzLl90ZW1wbGF0ZS50cmFuc2Zvcm0oeC5maWx0ZXIsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJbeC5uYW1lXVxuICAgICAgICAgICAgfSwgdmFsdWVzKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsZXQgcXVlcnk7XG4gICAgICBpZiAoZXhwcmVzc2lvbnMgfHwgZXhwcmVzc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIGNyZWF0ZSBjbGllbnQgcXVlcnlcbiAgICAgICAgcXVlcnkgPSB0aGlzLl9jb250ZXh0Lm1vZGVsKHRoaXMudGFibGUuY29uZmlnLm1vZGVsKS5hc1F1ZXJ5YWJsZSgpO1xuICAgICAgICBxdWVyeS5zZXRQYXJhbSgnZmlsdGVyJywgZXhwcmVzc2lvbnMuam9pbignIGFuZCAnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeSA9IHRoaXMuX2NvbnRleHQubW9kZWwodGhpcy50YWJsZS5jb25maWcubW9kZWwpLmFzUXVlcnlhYmxlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcXVlcnk7XG4gICAgfVxuICB9XG5cbiAgYWR2YW5jZWRTZWFyY2goZXZlbnQ6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmFzeW5jQWR2YW5jZWRTZWFyY2goZXZlbnQpO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgaWYgKHRoaXMubWVyZ2VRdWVyeVBhcmFtcykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTGlzdCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0geyBxOiBudWxsLCBzOiBudWxsIH07XG4gICAgICAgIC8vIGVudW1lcmF0ZSBjcml0ZXJpYVxuICAgICAgICB0aGlzLnRhYmxlLmNvbmZpZy5jcml0ZXJpYS5mb3JFYWNoKChpdGVtKT0+IHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHF1ZXJ5UGFyYW1zLCBpdGVtLm5hbWUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgLy8gc2V0IG51bGwgdmFsdWVcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShxdWVyeVBhcmFtcywgaXRlbS5uYW1lLCB7XG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5fYWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zLFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZSdcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgLy8gY2xlYXIgZmlsdGVyXG4gICAgICB0aGlzLmZpbHRlciA9IHt9O1xuICAgICAgLy8gY2xlYXIgbGlzdFxuICAgICAgdGhpcy5zZWxlY3RlZExpc3QgPSBudWxsO1xuICAgICAgLy8gcmFpc2UgZmlsdGVyIGNoYW5nZSBldmVudFxuICAgICAgdGhpcy5maWx0ZXJDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpZXcgc3RhdGUgb2Ygc2VhcmNoIGNvbnRyb2xcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlld1N0YXRlKCk6IEFkdmFuY2VkU2VhcmNoVmlld1N0YXR1cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkdmFuY2VkVmlldzogIXRoaXMuY29sbGFwc2VkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2hlcyB2aWV3IGJldHdlZW4gc2ltcGxlIGFuZCBhZHZhbmNlZCBzZWFyY2hcbiAgICovXG4gIGFzeW5jIHRvZ2dsZVZpZXcoKSB7XG4gICAgdGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQ7XG4gICAgLy8gZW1pdCBldmVudCBmb3IgdmlldyBzdGF0dXMgY2hhbmdlXG4gICAgdGhpcy52aWV3Q2hhbmdlLmVtaXQodGhpcy52aWV3U3RhdGUpO1xuICB9XG59XG4iXX0=