@universis/ngx-tables 0.8.5 → 15.0.2

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 (163) hide show
  1. package/esm2020/lib/actions/table.actions.mjs +27 -0
  2. package/esm2020/lib/advanced-aggregator.mjs +2 -0
  3. package/esm2020/lib/components/add-items/add-items.component.mjs +138 -0
  4. package/esm2020/lib/components/advanced-aggregator/advanced-aggregator.component.mjs +126 -0
  5. package/esm2020/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.mjs +53 -0
  6. package/esm2020/lib/components/advanced-list/advanced-list.component.mjs +184 -0
  7. package/esm2020/lib/components/advanced-row-action/advanced-row-action.component.mjs +178 -0
  8. package/esm2020/lib/components/advanced-search-form/advanced-search-form.component.mjs +154 -0
  9. package/esm2020/lib/components/advanced-select/advanced-select.component.mjs +42 -0
  10. package/esm2020/lib/components/advanced-select/advanced-select.service.mjs +38 -0
  11. package/esm2020/lib/components/advanced-table/advanced-filter-value-provider.service.mjs +31 -0
  12. package/esm2020/lib/components/advanced-table/advanced-table-resolvers.mjs +40 -0
  13. package/esm2020/lib/components/advanced-table/advanced-table-search-base.mjs +31 -0
  14. package/esm2020/lib/components/advanced-table/advanced-table-search.component.mjs +525 -0
  15. package/esm2020/lib/components/advanced-table/advanced-table-settings.component.mjs +108 -0
  16. package/esm2020/lib/components/advanced-table/advanced-table.component.mjs +1599 -0
  17. package/esm2020/lib/components/advanced-table/advanced-table.formatters.interface.mjs +17 -0
  18. package/esm2020/lib/components/advanced-table/advanced-table.formatters.mjs +429 -0
  19. package/esm2020/lib/components/advanced-table/advanced-table.interfaces.mjs +2 -0
  20. package/esm2020/lib/components/advanced-table-modal/advanced-table-modal-base.component.mjs +420 -0
  21. package/esm2020/lib/components/column-selector/column-selector.component.mjs +205 -0
  22. package/esm2020/lib/components/column-selector/column-selector.service.mjs +45 -0
  23. package/esm2020/lib/components/table-simple-header/table-simple-header.component.mjs +52 -0
  24. package/esm2020/lib/directives/advance-search-state.directive.mjs +111 -0
  25. package/esm2020/lib/directives/advance-table-state.directive.mjs +63 -0
  26. package/esm2020/lib/directives/advanced-search-router-state.directive.mjs +64 -0
  27. package/esm2020/lib/directives/advanced-table-editor.directive.mjs +154 -0
  28. package/esm2020/lib/directives/btnexp.directive.mjs +222 -0
  29. package/esm2020/lib/i18n/tables.el.mjs +129 -0
  30. package/esm2020/lib/i18n/tables.en.mjs +128 -0
  31. package/esm2020/lib/pipes/advanced-aggregator.pipe.mjs +38 -0
  32. package/esm2020/lib/pipes/advansed-aggregator-list-title-parse.pipe.mjs +45 -0
  33. package/esm2020/lib/reducers/index.mjs +37 -0
  34. package/esm2020/lib/services/advanced-aggregator/advanced-aggregator.service.mjs +119 -0
  35. package/esm2020/lib/tables.activated-table.service.mjs +46 -0
  36. package/esm2020/lib/tables.module.mjs +218 -0
  37. package/esm2020/public_api.mjs +37 -0
  38. package/esm2020/universis-ngx-tables.mjs +5 -0
  39. package/fesm2015/{universis-ngx-tables.js → universis-ngx-tables.mjs} +2927 -2729
  40. package/fesm2015/universis-ngx-tables.mjs.map +1 -0
  41. package/fesm2020/universis-ngx-tables.mjs +5609 -0
  42. package/fesm2020/universis-ngx-tables.mjs.map +1 -0
  43. package/index.d.ts +5 -0
  44. package/lib/actions/table.actions.d.ts +4 -4
  45. package/lib/components/add-items/add-items.component.d.ts +14 -21
  46. package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +15 -9
  47. package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +4 -1
  48. package/lib/components/advanced-list/advanced-list.component.d.ts +17 -14
  49. package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +20 -23
  50. package/lib/components/advanced-search-form/advanced-search-form.component.d.ts +7 -4
  51. package/lib/components/advanced-select/advanced-select.component.d.ts +3 -1
  52. package/lib/components/advanced-select/advanced-select.service.d.ts +3 -0
  53. package/lib/components/advanced-table/advanced-filter-value-provider.service.d.ts +3 -0
  54. package/lib/components/advanced-table/advanced-table-resolvers.d.ts +5 -0
  55. package/lib/components/advanced-table/advanced-table-search-base.d.ts +6 -2
  56. package/lib/components/advanced-table/advanced-table-search.component.d.ts +11 -7
  57. package/lib/components/advanced-table/advanced-table-settings.component.d.ts +8 -6
  58. package/lib/components/advanced-table/advanced-table.component.d.ts +33 -25
  59. package/lib/components/advanced-table/advanced-table.formatters.d.ts +11 -11
  60. package/lib/components/advanced-table-modal/advanced-table-modal-base.component.d.ts +15 -12
  61. package/lib/components/column-selector/column-selector.component.d.ts +9 -6
  62. package/lib/components/column-selector/column-selector.service.d.ts +3 -0
  63. package/lib/components/table-simple-header/table-simple-header.component.d.ts +8 -3
  64. package/lib/directives/advance-search-state.directive.d.ts +6 -3
  65. package/lib/directives/advance-table-state.directive.d.ts +4 -1
  66. package/lib/directives/advanced-search-router-state.directive.d.ts +9 -6
  67. package/lib/directives/advanced-table-editor.directive.d.ts +4 -1
  68. package/lib/directives/btnexp.directive.d.ts +12 -9
  69. package/lib/i18n/tables.el.d.ts +107 -107
  70. package/lib/i18n/tables.en.d.ts +106 -106
  71. package/lib/pipes/advanced-aggregator.pipe.d.ts +7 -4
  72. package/lib/pipes/advansed-aggregator-list-title-parse.pipe.d.ts +9 -6
  73. package/lib/reducers/index.d.ts +5 -3
  74. package/lib/services/advanced-aggregator/advanced-aggregator.service.d.ts +11 -8
  75. package/lib/tables.activated-table.service.d.ts +10 -6
  76. package/lib/tables.module.d.ts +36 -0
  77. package/package.json +44 -36
  78. package/public_api.d.ts +3 -0
  79. package/bundles/universis-ngx-tables.umd.js +0 -6101
  80. package/bundles/universis-ngx-tables.umd.js.map +0 -1
  81. package/bundles/universis-ngx-tables.umd.min.js +0 -2
  82. package/bundles/universis-ngx-tables.umd.min.js.map +0 -1
  83. package/esm2015/lib/actions/table.actions.js +0 -28
  84. package/esm2015/lib/advanced-aggregator.js +0 -2
  85. package/esm2015/lib/components/add-items/add-items.component.js +0 -142
  86. package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -120
  87. package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -53
  88. package/esm2015/lib/components/advanced-list/advanced-list.component.js +0 -173
  89. package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +0 -184
  90. package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +0 -142
  91. package/esm2015/lib/components/advanced-select/advanced-select.component.js +0 -65
  92. package/esm2015/lib/components/advanced-select/advanced-select.service.js +0 -40
  93. package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -37
  94. package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +0 -44
  95. package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +0 -28
  96. package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +0 -526
  97. package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +0 -109
  98. package/esm2015/lib/components/advanced-table/advanced-table.component.js +0 -1523
  99. package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -18
  100. package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +0 -429
  101. package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +0 -2
  102. package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -397
  103. package/esm2015/lib/components/column-selector/column-selector.component.js +0 -202
  104. package/esm2015/lib/components/column-selector/column-selector.service.js +0 -47
  105. package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +0 -52
  106. package/esm2015/lib/directives/advance-search-state.directive.js +0 -108
  107. package/esm2015/lib/directives/advance-table-state.directive.js +0 -63
  108. package/esm2015/lib/directives/advanced-search-router-state.directive.js +0 -63
  109. package/esm2015/lib/directives/advanced-table-editor.directive.js +0 -156
  110. package/esm2015/lib/directives/btnexp.directive.js +0 -229
  111. package/esm2015/lib/i18n/tables.el.js +0 -130
  112. package/esm2015/lib/i18n/tables.en.js +0 -129
  113. package/esm2015/lib/pipes/advanced-aggregator.pipe.js +0 -35
  114. package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -46
  115. package/esm2015/lib/reducers/index.js +0 -32
  116. package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -120
  117. package/esm2015/lib/tables.activated-table.service.js +0 -50
  118. package/esm2015/lib/tables.module.js +0 -149
  119. package/esm2015/public_api.js +0 -33
  120. package/esm2015/universis-ngx-tables.js +0 -9
  121. package/esm5/lib/actions/table.actions.js +0 -34
  122. package/esm5/lib/advanced-aggregator.js +0 -2
  123. package/esm5/lib/components/add-items/add-items.component.js +0 -153
  124. package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -169
  125. package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -56
  126. package/esm5/lib/components/advanced-list/advanced-list.component.js +0 -185
  127. package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +0 -188
  128. package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +0 -145
  129. package/esm5/lib/components/advanced-select/advanced-select.component.js +0 -71
  130. package/esm5/lib/components/advanced-select/advanced-select.service.js +0 -43
  131. package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -50
  132. package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +0 -48
  133. package/esm5/lib/components/advanced-table/advanced-table-search-base.js +0 -34
  134. package/esm5/lib/components/advanced-table/advanced-table-search.component.js +0 -563
  135. package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +0 -115
  136. package/esm5/lib/components/advanced-table/advanced-table.component.js +0 -1548
  137. package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -18
  138. package/esm5/lib/components/advanced-table/advanced-table.formatters.js +0 -480
  139. package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +0 -2
  140. package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -314
  141. package/esm5/lib/components/column-selector/column-selector.component.js +0 -270
  142. package/esm5/lib/components/column-selector/column-selector.service.js +0 -50
  143. package/esm5/lib/components/table-simple-header/table-simple-header.component.js +0 -58
  144. package/esm5/lib/directives/advance-search-state.directive.js +0 -116
  145. package/esm5/lib/directives/advance-table-state.directive.js +0 -65
  146. package/esm5/lib/directives/advanced-search-router-state.directive.js +0 -71
  147. package/esm5/lib/directives/advanced-table-editor.directive.js +0 -196
  148. package/esm5/lib/directives/btnexp.directive.js +0 -257
  149. package/esm5/lib/i18n/tables.el.js +0 -130
  150. package/esm5/lib/i18n/tables.en.js +0 -129
  151. package/esm5/lib/pipes/advanced-aggregator.pipe.js +0 -39
  152. package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -49
  153. package/esm5/lib/reducers/index.js +0 -34
  154. package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -134
  155. package/esm5/lib/tables.activated-table.service.js +0 -57
  156. package/esm5/lib/tables.module.js +0 -154
  157. package/esm5/public_api.js +0 -33
  158. package/esm5/universis-ngx-tables.js +0 -9
  159. package/fesm2015/universis-ngx-tables.js.map +0 -1
  160. package/fesm5/universis-ngx-tables.js +0 -5737
  161. package/fesm5/universis-ngx-tables.js.map +0 -1
  162. package/universis-ngx-tables.d.ts +0 -8
  163. package/universis-ngx-tables.metadata.json +0 -1
@@ -1,1548 +0,0 @@
1
- import * as tslib_1 from "tslib";
2
- import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, InjectionToken, Injector, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
3
- import { AngularDataContext } from '@themost/angular';
4
- import { TranslatePipe, TranslateService } from '@ngx-translate/core';
5
- import { ActivatedRoute } from '@angular/router';
6
- import { AdvancedColumnFormatter } from './advanced-table.formatters';
7
- import { ClientDataQueryable } from '@themost/client';
8
- import { AdvancedFilterValueProvider } from './advanced-filter-value-provider.service';
9
- import { BehaviorSubject } from 'rxjs';
10
- import { TemplatePipe, LoadingService, ConfigurationService, ModalService, DIALOG_BUTTONS, ErrorService, ExportSpreadsheetService } from '@universis/common';
11
- // important note: use this import to avoid Cannot call a namespace ('jquery') error
12
- import * as jQuery_ from 'jquery';
13
- import 'datatables.net';
14
- import { template } from 'lodash';
15
- import 'datatables.net-scroller';
16
- import 'datatables.net-colreorder';
17
- import 'datatables.net-buttons';
18
- import { HttpClient } from '@angular/common/http';
19
- import { ColumnSelectorService } from '../column-selector/column-selector.service';
20
- import { MAX_EXPORT_ITEMS } from '../../directives/btnexp.directive';
21
- // restore jquery import to avoid Cannot call a namespace ('jquery') error
22
- var jQuery = jQuery_;
23
- var DataTablesApi = jQuery.fn.dataTable.Api;
24
- DataTablesApi.register('processing()', function (show) {
25
- return this.iterator('table', function (ctx) {
26
- ctx.oApi._fnProcessingDisplay(ctx, show);
27
- });
28
- });
29
- var ɵ0 = [];
30
- var EMPTY_DATASET = {
31
- recordsTotal: 0,
32
- recordsFiltered: 0,
33
- data: ɵ0,
34
- };
35
- var TableTranslationChangeDetector = /** @class */ (function (_super) {
36
- tslib_1.__extends(TableTranslationChangeDetector, _super);
37
- function TableTranslationChangeDetector() {
38
- return _super !== null && _super.apply(this, arguments) || this;
39
- }
40
- TableTranslationChangeDetector.prototype.checkNoChanges = function () {
41
- };
42
- TableTranslationChangeDetector.prototype.detach = function () {
43
- };
44
- TableTranslationChangeDetector.prototype.detectChanges = function () {
45
- };
46
- TableTranslationChangeDetector.prototype.markForCheck = function () {
47
- };
48
- TableTranslationChangeDetector.prototype.reattach = function () {
49
- };
50
- return TableTranslationChangeDetector;
51
- }(ChangeDetectorRef));
52
- export var COLUMN_FORMATTERS = new InjectionToken('column.formatters');
53
- var ExportLimitExceededError = /** @class */ (function (_super) {
54
- tslib_1.__extends(ExportLimitExceededError, _super);
55
- function ExportLimitExceededError(message) {
56
- var _this = _super.call(this, message) || this;
57
- _this.name = 'ExportLimitExceededError';
58
- return _this;
59
- }
60
- return ExportLimitExceededError;
61
- }(RangeError));
62
- export { ExportLimitExceededError };
63
- var ColumnFormatter = /** @class */ (function (_super) {
64
- tslib_1.__extends(ColumnFormatter, _super);
65
- function ColumnFormatter(injector) {
66
- var _this = _super.call(this) || this;
67
- _this.injector = injector;
68
- return _this;
69
- }
70
- ColumnFormatter.prototype.render = function (data, type, row, meta) {
71
- //
72
- };
73
- return ColumnFormatter;
74
- }(AdvancedColumnFormatter));
75
- function forceCast(input) {
76
- return input;
77
- }
78
- var AdvancedTableConfiguration = /** @class */ (function () {
79
- function AdvancedTableConfiguration() {
80
- }
81
- AdvancedTableConfiguration.cast = function (input, clone) {
82
- if (clone) {
83
- return forceCast(JSON.parse(JSON.stringify(input)));
84
- }
85
- return forceCast(input);
86
- };
87
- return AdvancedTableConfiguration;
88
- }());
89
- export { AdvancedTableConfiguration };
90
- function getRandomIdentifier() {
91
- return (Number(String(Math.random()).slice(2))).toString(36);
92
- }
93
- var AdvancedTableComponent = /** @class */ (function () {
94
- function AdvancedTableComponent(_context, _columnFormatters, _activatedRoute, _translateService, _injector, _advancedFilterValueProvider, _element, _template, _loading, _http, _columnSelector, _configuration, _exportSpreadsheet, _modalService, _errorService) {
95
- var _this = this;
96
- this._context = _context;
97
- this._columnFormatters = _columnFormatters;
98
- this._activatedRoute = _activatedRoute;
99
- this._translateService = _translateService;
100
- this._injector = _injector;
101
- this._advancedFilterValueProvider = _advancedFilterValueProvider;
102
- this._element = _element;
103
- this._template = _template;
104
- this._loading = _loading;
105
- this._http = _http;
106
- this._columnSelector = _columnSelector;
107
- this._configuration = _configuration;
108
- this._exportSpreadsheet = _exportSpreadsheet;
109
- this._modalService = _modalService;
110
- this._errorService = _errorService;
111
- this._firstLoad = true;
112
- this._showFooter = false;
113
- this._showHeader = true;
114
- this._showPaging = false;
115
- this._id = getRandomIdentifier();
116
- this.smartSelect = false;
117
- this.configChanges = new BehaviorSubject(null);
118
- this.height = 800;
119
- this.showActions = true;
120
- this.autoLoad = true;
121
- this.load = new EventEmitter();
122
- this.init = new EventEmitter();
123
- this.reload = new EventEmitter();
124
- this.select = new EventEmitter();
125
- this.draw = new EventEmitter();
126
- this.page = new EventEmitter();
127
- this.order = new EventEmitter();
128
- this.scroll = new EventEmitter();
129
- this.selectedItems = new EventEmitter();
130
- this.loading = new EventEmitter();
131
- this.scrollable = true;
132
- this.serverSide = true;
133
- this.lengthMenu = [50, 100, 200, 500];
134
- this.paging = true;
135
- this.pageLength = 25;
136
- this.columnOrdering = false;
137
- this.stateSave = false;
138
- this.scrollY = 800;
139
- this.scrollX = true;
140
- /**
141
- * Enables row selection. The defaulr value is false
142
- */
143
- this.selectable = false;
144
- /**
145
- * Enables or disable multiple selection. The default values is true.
146
- */
147
- this.multipleSelect = true;
148
- /**
149
- * Enables custom selection and hides select column. The default value is false
150
- */
151
- this.customSelect = false;
152
- this.selected = [];
153
- this.unselected = [];
154
- this._lastQueryTotalItems = 0;
155
- // initialize translate pipe
156
- this.translator = new TranslatePipe(this._translateService, new TableTranslationChangeDetector());
157
- jQuery.fn.dataTable.ext.classes.sPageButton = 'btn';
158
- jQuery.fn.dataTable.ext.classes.sPageButtonActive = 'btn btn-light';
159
- this.reloadSubscription = this.reload.subscribe(function (data) {
160
- _this.fetch();
161
- });
162
- }
163
- Object.defineProperty(AdvancedTableComponent.prototype, "config", {
164
- get: function () {
165
- return this._config;
166
- },
167
- /**
168
- * Gets or sets table configuration
169
- */
170
- set: function (value) {
171
- this._config = value;
172
- // raise subscription
173
- this.configChanges.next(this._config);
174
- },
175
- enumerable: true,
176
- configurable: true
177
- });
178
- Object.defineProperty(AdvancedTableComponent.prototype, "lastQueryTotalItems", {
179
- get: function () {
180
- return this._lastQueryTotalItems;
181
- },
182
- enumerable: true,
183
- configurable: true
184
- });
185
- Object.defineProperty(AdvancedTableComponent.prototype, "showFooter", {
186
- get: function () {
187
- return this._showFooter;
188
- },
189
- /**
190
- * Indicates whether table footer will be visible or not
191
- */
192
- set: function (value) {
193
- this._showFooter = value;
194
- // show or hide footer
195
- if (this._element && this._element.nativeElement) {
196
- var element = this._element.nativeElement
197
- .querySelector('.dataTables_info');
198
- if (element == null) {
199
- return;
200
- }
201
- if (value) {
202
- element.classList.remove('d-none');
203
- }
204
- else {
205
- element.classList.add('d-none');
206
- }
207
- }
208
- },
209
- enumerable: true,
210
- configurable: true
211
- });
212
- Object.defineProperty(AdvancedTableComponent.prototype, "showHeader", {
213
- get: function () {
214
- return this._showHeader;
215
- },
216
- /**
217
- * Indicates whether table footer will be visible or not
218
- */
219
- set: function (value) {
220
- this._showHeader = value;
221
- // show or hide footer
222
- if (this._element && this._element.nativeElement) {
223
- var element = this._element.nativeElement
224
- .querySelector('.dataTable>thead');
225
- if (element == null) {
226
- return;
227
- }
228
- var dataTable = this._element.nativeElement.querySelector('.dataTable');
229
- if (value) {
230
- element.classList.remove('d-none');
231
- // add top margin
232
- dataTable.classList.remove('mt-2');
233
- }
234
- else {
235
- element.classList.add('d-none');
236
- // remove top margin
237
- dataTable.classList.add('mt-2');
238
- }
239
- }
240
- },
241
- enumerable: true,
242
- configurable: true
243
- });
244
- Object.defineProperty(AdvancedTableComponent.prototype, "showPaging", {
245
- get: function () {
246
- return this._showPaging;
247
- },
248
- /**
249
- * Indicates whether paging information will be visible or not
250
- */
251
- set: function (value) {
252
- this._showPaging = value;
253
- // show or hide footer
254
- if (this._element && this._element.nativeElement) {
255
- var element = this._element.nativeElement
256
- .querySelector('.dataTables_paginate');
257
- if (element == null) {
258
- return;
259
- }
260
- if (value) {
261
- jQuery(element).show();
262
- }
263
- else {
264
- jQuery(element).hide();
265
- }
266
- }
267
- },
268
- enumerable: true,
269
- configurable: true
270
- });
271
- Object.defineProperty(AdvancedTableComponent.prototype, "query", {
272
- get: function () {
273
- return this._query;
274
- },
275
- /**
276
- * Gets or sets an active query for this table
277
- */
278
- set: function (value) {
279
- this._query = value;
280
- },
281
- enumerable: true,
282
- configurable: true
283
- });
284
- // simple search
285
- AdvancedTableComponent.prototype.search = function (searchText) {
286
- var _this = this;
287
- this.query = this.query || this._context.model(this.config.model).asQueryable();
288
- if (this.serverSide) {
289
- if (searchText && this.config.searchExpression) {
290
- // validate search text in double quotes
291
- if (/^"(.*?)"$/.test(searchText)) {
292
- this.query.setParam('$filter', this._template.transform(this.config.searchExpression, {
293
- text: searchText.replace(/^"|"$/g, ''),
294
- }));
295
- }
296
- else {
297
- // try to split words
298
- var words = searchText.split(' ');
299
- // join words to a single filter
300
- var filter = words.map(function (word) {
301
- return _this._template.transform(_this.config.searchExpression, {
302
- text: word,
303
- });
304
- }).join(' and ');
305
- // set filter
306
- this.query.setParam('$filter', filter);
307
- }
308
- }
309
- else {
310
- // clear filter
311
- this.query.setParam('$filter', null);
312
- }
313
- this._firstLoad = false;
314
- this.dataTable.draw();
315
- }
316
- else {
317
- // ensure empty table layout
318
- this.resetEmptyTable();
319
- // search locally
320
- this.dataTable.search(searchText.trim()).draw();
321
- // get indexes of filtered rows
322
- var indexes = Array.from(this.dataTable.context[0].aiDisplay);
323
- // set recordsFiltered
324
- var recordsFiltered = indexes.length;
325
- // set recordsTotal
326
- var recordsTotal = indexes.length;
327
- // retrieve data from indexes
328
- var rows_1 = Array.from(this.dataTable.rows().data());
329
- var data = indexes.map(function (index) { return rows_1[index]; });
330
- // emit results to load output
331
- this.load.emit({
332
- data: data,
333
- recordsFiltered: recordsFiltered,
334
- recordsTotal: recordsTotal
335
- });
336
- }
337
- };
338
- AdvancedTableComponent.prototype.fetch = function (clearSelected) {
339
- // if data table is null
340
- if (this.dataTable == null) {
341
- // initialize data table
342
- return this.ngOnInit();
343
- }
344
- // clear selection if parameter is not declared or it's true
345
- if (clearSelected == null || clearSelected === true) {
346
- // set smart select to false
347
- this.smartSelect = false;
348
- // clear selected items
349
- if (this.selected.length) {
350
- this.selected.splice(0, this.selected.length);
351
- }
352
- // clear unselected items
353
- if (this.unselected.length) {
354
- this.unselected.splice(0, this.unselected.length);
355
- }
356
- }
357
- // otherwise load data only
358
- this.dataTable.draw();
359
- };
360
- AdvancedTableComponent.prototype.destroy = function () {
361
- if (this.dataTable) {
362
- this.dataTable.destroy();
363
- this._firstLoad = true;
364
- jQuery(this.table.nativeElement).empty();
365
- this.dataTable = null;
366
- // clear selected items
367
- if (this.selected.length) {
368
- this.selected.splice(0, this.selected.length);
369
- }
370
- // clear unselected items
371
- if (this.unselected.length) {
372
- this.unselected.splice(0, this.unselected.length);
373
- }
374
- // set smart select to false
375
- this.smartSelect = false;
376
- }
377
- };
378
- /**
379
- * Selects the specified data row
380
- */
381
- AdvancedTableComponent.prototype.selectRow = function (row, silent) {
382
- if (row) {
383
- // get row
384
- var rowNode_1 = row.node();
385
- // if multiple select is false
386
- if (this.multipleSelect === false) {
387
- if (this.customSelect === false) {
388
- // enumerate row
389
- this.dataTable.rows().nodes().each(function (node) {
390
- if (node !== rowNode_1) {
391
- jQuery(node).find(':checkbox').prop('checked', false);
392
- }
393
- });
394
- }
395
- else {
396
- this.dataTable.rows('.selected').nodes().each(function (node) {
397
- if (node !== rowNode_1) {
398
- jQuery(node).removeClass('selected');
399
- }
400
- });
401
- }
402
- // clear selected
403
- this.selected.splice(0, this.selected.length);
404
- }
405
- // if custom select mode is off
406
- if (this.customSelect === false) {
407
- jQuery(rowNode_1).find(':checkbox').prop('checked', true);
408
- }
409
- else {
410
- // otherwise add class
411
- jQuery(row.node()).addClass('selected');
412
- }
413
- // get row data
414
- var key_1 = this.config.columns[0].property || this.config.columns[0].name;
415
- var data_1 = row.data();
416
- // search selected items
417
- var findIndex = this.selected.findIndex(function (x) {
418
- return x[key_1] === data_1[key_1];
419
- });
420
- if (findIndex >= 0) {
421
- // remove previously selected row
422
- this.selected.splice(findIndex, 1);
423
- }
424
- this.selected.push(data_1);
425
- // validate unselected data
426
- findIndex = this.unselected.findIndex(function (x) {
427
- return x[key_1] === data_1[key_1];
428
- });
429
- if (findIndex >= 0) {
430
- // remove previously selected row
431
- this.unselected.splice(findIndex, 1);
432
- }
433
- if (silent) {
434
- return;
435
- }
436
- this.selectedItems.emit(this.selected);
437
- }
438
- };
439
- /**
440
- * Unselects the specified data row if it's selected
441
- */
442
- AdvancedTableComponent.prototype.unSelectRow = function (row, silent) {
443
- if (row) {
444
- // if custom select mode is off
445
- if (this.customSelect === false) {
446
- jQuery(row.node()).find(':checkbox').prop('checked', false);
447
- }
448
- else {
449
- // otherwise add class
450
- jQuery(row.node()).removeClass('selected');
451
- }
452
- // get first column key
453
- var key_2 = this.config.columns[0].property || this.config.columns[0].name;
454
- var data = row.data();
455
- var id_1 = data[key_2];
456
- var findIndex = this.selected.findIndex(function (x) {
457
- return x[key_2] === id_1;
458
- });
459
- if (findIndex >= 0) {
460
- this.selected.splice(findIndex, 1);
461
- if (this.smartSelect) {
462
- // add this row to unselected rows
463
- findIndex = this.unselected.findIndex(function (x) {
464
- return x[key_2] === id_1;
465
- });
466
- if (findIndex < 0) {
467
- this.unselected.push(data);
468
- }
469
- }
470
- if (silent) {
471
- return;
472
- }
473
- this.selectedItems.emit(this.selected);
474
- }
475
- }
476
- };
477
- AdvancedTableComponent.prototype.selectAny = function () {
478
- var _this = this;
479
- if (this.dataTable && this.selectable) {
480
- // set smart select flag
481
- this.smartSelect = true;
482
- // select any row
483
- this.dataTable.rows().every(function (index) {
484
- var row = _this.dataTable.row(index);
485
- _this.selectRow(row, true);
486
- });
487
- // emit selection event
488
- this.selectedItems.emit(this.selected);
489
- }
490
- };
491
- AdvancedTableComponent.prototype.selectNone = function () {
492
- var _this = this;
493
- if (this.dataTable && this.selectable) {
494
- // set smart select flag
495
- this.smartSelect = false;
496
- this.unselected.splice(0, this.unselected.length);
497
- // select any row
498
- this.dataTable.rows().every(function (index) {
499
- var row = _this.dataTable.row(index);
500
- _this.unSelectRow(row, true);
501
- });
502
- this.selected.splice(0, this.selected.length);
503
- // emit selection event
504
- this.selectedItems.emit(this.selected);
505
- }
506
- };
507
- AdvancedTableComponent.prototype.toggleSelectRow = function (row) {
508
- if (row) {
509
- var data = row.data();
510
- // get first column key
511
- var key_3 = this.config.columns[0].property || this.config.columns[0].name;
512
- // get id
513
- var id_2 = data[key_3];
514
- // find if row is selected
515
- var findIndex = this.selected.find(function (x) {
516
- return x[key_3] === id_2;
517
- });
518
- // if row is selected
519
- if (findIndex >= 0) {
520
- // unselect
521
- this.unSelectRow(row);
522
- }
523
- else {
524
- this.selectRow(row);
525
- }
526
- }
527
- };
528
- // noinspection JSMethodCanBeStatic
529
- /**
530
- * Datatables column renderer for select checkbox
531
- * @param data
532
- * @param type
533
- * @param row
534
- * @param meta
535
- * @private
536
- */
537
- AdvancedTableComponent.prototype._renderSelect = function (data, type, row, meta) {
538
- // get column
539
- var column = meta.settings.aoColumns[meta.col];
540
- if (typeof column.selectTemplate !== 'function') {
541
- Object.assign(column, {
542
- selectTemplate: template("<input class=\"checkbox checkbox-theme s-row\" type=\"checkbox\"\n id=\"s-" + this._id + "-${meta.row}\" data-id=\"${data}\" /><label for=\"s-" + this._id + "-${meta.row}\">&nbsp;</label>\n "),
543
- });
544
- }
545
- // render template
546
- return column.selectTemplate({
547
- meta: meta,
548
- data: data,
549
- });
550
- };
551
- AdvancedTableComponent.prototype.ngOnInit = function () {
552
- var _this = this;
553
- var self = this;
554
- if (this.dataTable) {
555
- this.destroy();
556
- }
557
- if (this.config) {
558
- this.loading.emit({
559
- target: this
560
- });
561
- // parse properties
562
- if (Object.prototype.hasOwnProperty.call(this.config, 'selectable')) {
563
- this.selectable = this.config.selectable;
564
- }
565
- if (Object.prototype.hasOwnProperty.call(this.config, 'multipleSelect')) {
566
- this.multipleSelect = this.config.multipleSelect;
567
- }
568
- // prepare configuration for columns
569
- var tableColumns_1 = this.config.columns
570
- // filter action link column
571
- .filter(function (column) {
572
- if (column.formatter && column.formatter === 'ActionLinkFormatter' && _this.showActions === false) {
573
- return false;
574
- }
575
- return true;
576
- }).map(function (column) {
577
- // convert column to advance table column
578
- return Object.assign(new ColumnFormatter(_this._injector), column);
579
- }).map(function (column) {
580
- var columnDefinition = {
581
- data: column.property || column.name,
582
- defaultContent: column.hasOwnProperty('defaultContent') ? column.defaultContent : '',
583
- title: _this.translator.transform(column.title),
584
- sortable: column.hasOwnProperty('sortable') ? column.sortable : true,
585
- visible: column.hasOwnProperty('hidden') ? !column.hidden : true,
586
- name: column.name,
587
- };
588
- if (column.className) {
589
- Object.assign(columnDefinition, {
590
- className: column.className,
591
- });
592
- }
593
- else {
594
- Object.assign(columnDefinition, {
595
- className: '',
596
- });
597
- }
598
- if (column.formatters) {
599
- Object.assign(columnDefinition, {
600
- render: function (data, type, row, meta) {
601
- var result = data;
602
- column.formatters.forEach(function (columnFormatter) {
603
- var formatter = self._columnFormatters[columnFormatter.formatter];
604
- if (formatter && typeof formatter.render === 'function') {
605
- column.formatString = columnFormatter.formatString;
606
- column.formatOptions = columnFormatter.formatOptions;
607
- }
608
- result = formatter.render.bind(column)(result, type, row, meta);
609
- });
610
- delete column.formatString;
611
- delete column.formatOptions;
612
- return result;
613
- },
614
- });
615
- // check if column formatters export createdCell event
616
- var items_1 = column.formatters.filter(function (columnFormatter) {
617
- return typeof columnFormatter.afterRender === 'function';
618
- });
619
- if (items_1.length > 0) {
620
- Object.assign(columnDefinition, {
621
- createdCell: function (cell, cellData, rowData, rowIndex, colIndex) {
622
- items_1.forEach(function (columnFormatter) {
623
- var formatter = self._columnFormatters[columnFormatter.formatter];
624
- if (formatter && typeof formatter.afterRender === 'function') {
625
- formatter.afterRender.bind(column)(cell, cellData, rowData, rowIndex, colIndex);
626
- }
627
- });
628
- },
629
- });
630
- }
631
- }
632
- if (column.formatter) {
633
- var formatter = self._columnFormatters[column.formatter];
634
- if (formatter && typeof formatter.render === 'function') {
635
- Object.assign(columnDefinition, {
636
- render: formatter.render.bind(column),
637
- });
638
- }
639
- if (formatter && typeof formatter.afterRender === 'function') {
640
- Object.assign(columnDefinition, {
641
- render: formatter.render.bind(column),
642
- });
643
- Object.assign(columnDefinition, {
644
- createdCell: formatter.afterRender.bind(column),
645
- });
646
- }
647
- }
648
- return columnDefinition;
649
- });
650
- // get table element
651
- var tableElement_1 = jQuery(this.table.nativeElement);
652
- jQuery(window).on('resize', function () {
653
- setTimeout(function () {
654
- if (_this.dataTable) {
655
- _this.dataTable.columns.adjust();
656
- }
657
- }, 1);
658
- });
659
- // tslint:disable-next-line: no-shadowed-variable
660
- tableElement_1.on('processing.dt', function (event, settings, processing) {
661
- if (processing) {
662
- // clear empty table element
663
- tableElement_1.find('.dataTables_empty').html('');
664
- setTimeout(function () {
665
- tableElement_1.addClass('processing');
666
- }, 0);
667
- }
668
- else {
669
- setTimeout(function () {
670
- tableElement_1.removeClass('processing');
671
- }, 0);
672
- }
673
- });
674
- var drawIndex_1 = 1;
675
- tableElement_1.on('order.dt', function (event) {
676
- if (_this.dataTable) {
677
- var order = _this.dataTable.order();
678
- var columns = tableColumns_1;
679
- if (order && order.length) {
680
- _this.order.emit(order);
681
- }
682
- }
683
- }).on('draw.dt', function (event) {
684
- _this.draw.emit();
685
- if (_this.dataTable) {
686
- var info = _this.dataTable.page.info();
687
- _this.page.emit(info);
688
- if (drawIndex_1 > 1) {
689
- return;
690
- }
691
- try {
692
- drawIndex_1++;
693
- setTimeout(function () { _this.dataTable.columns.adjust(); }, 1);
694
- }
695
- catch (err) {
696
- console.error('ERROR', 'An error occurred while adjusting table columns');
697
- console.error(err);
698
- }
699
- }
700
- });
701
- // allow selection
702
- if (this.selectable) {
703
- // get first column (as row primary key)
704
- // todo::allow row primary key configuration
705
- var firstColumn = this.config.columns[0];
706
- // add select column
707
- var selectColumnDefinition = {
708
- className: 'text-center pl-4 pr-0',
709
- data: firstColumn.property || firstColumn.name,
710
- defaultContent: '',
711
- title: '',
712
- sortable: false,
713
- visible: !this.customSelect,
714
- name: firstColumn.name,
715
- };
716
- // assign renderer
717
- Object.assign(selectColumnDefinition, {
718
- render: this._renderSelect.bind(this),
719
- });
720
- // and finally add column
721
- tableColumns_1.unshift(selectColumnDefinition);
722
- // user interface additions
723
- // handle page change event (a trick for firing draw.dt events)
724
- tableElement_1
725
- // handle draw events
726
- .on('draw.dt', function () {
727
- if (_this.customSelect) {
728
- // enable row selection event
729
- tableElement_1.find('tbody').on('click', 'tr', function () {
730
- // select row
731
- var row = self.dataTable.row(this);
732
- // add row
733
- self.select.emit(row);
734
- });
735
- }
736
- var elements = tableElement_1.find('input.s-row');
737
- elements.off('click').on('click', _this.onSelectionChange.bind(_this));
738
- // make selection on current page
739
- var key = _this.config.columns[0].property;
740
- if (_this.selected.length > 0) {
741
- // enumerate selected items
742
- _this.selected.forEach(function (item) {
743
- // find row identifier
744
- var id = item[key];
745
- // if identifier is defined
746
- if (id != null) {
747
- // try to find check element with this identifier in attribute data-id
748
- tableElement_1.find("input[data-id='" + id + "']").prop('checked', true);
749
- }
750
- });
751
- }
752
- if (_this.smartSelect) {
753
- // select rows that are not selected
754
- // and do not included in unselected collection
755
- tableElement_1.find('input[data-id]').each(function (index, element) {
756
- // get data id
757
- if (_this.unselected.findIndex(function (x) {
758
- // tslint:disable-next-line:triple-equals
759
- return x[key] == jQuery(element).attr('data-id');
760
- }) < 0) {
761
- _this.selectRow(_this.dataTable.row(index));
762
- }
763
- });
764
- }
765
- else if (_this.selected.length === 0) {
766
- tableElement_1.find('input[data-id]').prop('checked', false);
767
- }
768
- });
769
- }
770
- // initialize data table
771
- var settings = {
772
- // set length menu
773
- lengthMenu: [5, 10, 50, 100, 200, 500],
774
- // hide length menu
775
- lengthChange: false,
776
- // enable search but hide search box (css)
777
- searching: true,
778
- // enable data processing
779
- processing: true,
780
- // enable getting server side data
781
- serverSide: this.serverSide,
782
- // enumerate table columns
783
- columns: tableColumns_1,
784
- colReorder: this.columnOrdering,
785
- order: [],
786
- // set scroll x
787
- scrollX: this.scrollX,
788
- dom: 'Bfrtip',
789
- autoWidth: false,
790
- buttons: [
791
- {
792
- extend: 'excel',
793
- filename: this.config.title,
794
- className: 'd-none',
795
- exportOptions: {
796
- columns: 'th:not(:first-child)',
797
- },
798
- },
799
- ],
800
- // define server data callback
801
- fnServerData: function (sSource, aoData, fnCallback, oSettings) {
802
- // if method is invoked for the first time
803
- if (self._firstLoad) {
804
- // disabled first load flag
805
- self._firstLoad = false;
806
- // if auto load is disabled
807
- if (self.autoLoad === false) {
808
- var emptyDataSet = {
809
- recordsTotal: 0,
810
- recordsFiltered: 0,
811
- data: [],
812
- };
813
- self._lastQueryTotalItems = 0;
814
- // emit empty data
815
- self.load.emit(emptyDataSet);
816
- // return empty data
817
- return fnCallback(emptyDataSet);
818
- }
819
- }
820
- // reset error
821
- self.toggleError();
822
- // get activated route params
823
- var queryParams = self._activatedRoute.snapshot.queryParams;
824
- // get columns
825
- var columns = aoData[1].value;
826
- // get order expression
827
- var order = aoData[2].value;
828
- // get skip records param
829
- var skip = aoData[3].value;
830
- // get page size param
831
- var top = aoData[4].value;
832
- // get search value
833
- var search = aoData[5].value;
834
- // get data queryable
835
- var q = self._query instanceof ClientDataQueryable ? self._query : self._context.model(self.config.model).asQueryable();
836
- // apply paging params
837
- if (top) {
838
- q.take(top).skip(skip);
839
- }
840
- // apply order params
841
- if (order && order.length) {
842
- // get order query expression
843
- var orderByStr = order.map(function (expr) {
844
- var columnIndex;
845
- if (self.columnOrdering === false) {
846
- columnIndex = expr.column;
847
- }
848
- else {
849
- // get the current column order (from colReorder)
850
- var columnOrder = self.dataTable.colReorder.order();
851
- // and match the dataTable index to the config columns index
852
- // expr.column should always be valid (e.g. in range), but perform a minor validation
853
- if (expr.column >= 0 && expr.column < columnOrder.length) {
854
- columnIndex = columnOrder[expr.column];
855
- }
856
- else {
857
- // use the first column as a fallback (won't happen, just for safety)
858
- columnIndex = 0;
859
- }
860
- }
861
- return tableColumns_1[columnIndex].name + ' ' + expr.dir || 'asc';
862
- }).join(',');
863
- // set order
864
- q.setParam('$orderby', orderByStr);
865
- }
866
- self.stateLoadCallback(null, function (state) {
867
- // configure $select parameter
868
- var select = self.config.columns.filter(function (column) {
869
- if (column.virtual === true) {
870
- return false;
871
- }
872
- if (column.optional === true) {
873
- if (state && state.columns) {
874
- var index = tableColumns_1.findIndex(function (tableColumn) { return tableColumn.name === column.name; });
875
- if (index >= 0) {
876
- return state.columns[index].visible;
877
- }
878
- }
879
- return false;
880
- }
881
- return true;
882
- }).map(function (column) {
883
- if (column.property) {
884
- return column.name + ' as ' + column.property;
885
- }
886
- else {
887
- return column.name;
888
- }
889
- });
890
- q.select.apply(q, select);
891
- // configure $filter
892
- if (queryParams.$filter && queryParams.$filter.length) {
893
- // set route filter
894
- var qParams = q.getParams();
895
- q.setParam('$filter', null);
896
- var expressions = [queryParams.$filter];
897
- if (qParams.$filter) {
898
- expressions.push('(' + qParams.$filter + ')');
899
- }
900
- q.filter(expressions.join(' and '));
901
- }
902
- // check if query parameters contain filter
903
- if (queryParams.$expand && queryParams.$expand.length) {
904
- // set route $expand
905
- q.setParam('$expand', queryParams.$expand);
906
- }
907
- else if (self.config && self.config.defaults && self.config.defaults.expand) {
908
- q.setParam('$expand', self.config.defaults.expand);
909
- }
910
- if (!q.getParams()['$orderby'] && self.config && self.config.defaults && self.config.defaults.orderBy) {
911
- q.setParam('$orderby', self.config.defaults.orderBy);
912
- }
913
- if (self.config && self.config.defaults && self.config.defaults.groupBy) {
914
- q.setParam('$groupby', self.config.defaults.groupBy);
915
- }
916
- // append default filter
917
- if (self.config && self.config.defaults && self.config.defaults.filter) {
918
- return self._advancedFilterValueProvider.asyncBuildFilter(self.config.defaults.filter).then(function (defaultFilterString) {
919
- if (defaultFilterString) {
920
- var qParams = q.getParams();
921
- q.setParam('$filter', null);
922
- var expressions = [defaultFilterString];
923
- if (qParams.$filter) {
924
- expressions.push('(' + qParams.$filter + ')');
925
- }
926
- q.filter(expressions.join(' and '));
927
- }
928
- self.lastQueryParams = q.getParams();
929
- return q.getList().then(function (items) {
930
- var dataSet = {
931
- recordsTotal: items.total,
932
- recordsFiltered: items.total,
933
- data: items.value,
934
- };
935
- self._lastQueryTotalItems = items.total;
936
- if (items.total === 0) {
937
- self.resetEmptyTable();
938
- }
939
- // emit load event
940
- self.load.emit(dataSet);
941
- // return data
942
- return fnCallback(dataSet);
943
- });
944
- }).catch(function (err) {
945
- // log error to console
946
- console.error('TABLES', err);
947
- // show error
948
- self.toggleError(err);
949
- self._lastQueryTotalItems = 0;
950
- // by returning empty dataset
951
- self.load.emit(EMPTY_DATASET);
952
- return fnCallback(EMPTY_DATASET);
953
- });
954
- }
955
- self.lastQueryParams = q.getParams();
956
- q.getList().then(function (items) {
957
- var dataSet = {
958
- recordsTotal: items.total,
959
- recordsFiltered: items.total,
960
- data: items.value,
961
- };
962
- self._lastQueryTotalItems = items.total;
963
- if (items.total === 0) {
964
- self.resetEmptyTable();
965
- }
966
- // emit load event
967
- self.load.emit(dataSet);
968
- // return data
969
- return fnCallback(dataSet);
970
- }).catch(function (err) {
971
- // log error to console
972
- console.error('TABLES', err);
973
- // show error
974
- self.toggleError(err);
975
- // by returning empty dataset
976
- self.load.emit(EMPTY_DATASET);
977
- return fnCallback(EMPTY_DATASET);
978
- });
979
- });
980
- },
981
- language: Object.assign({}, self.translator.transform('Tables.DataTable'), { emptyTable: ' ' }),
982
- };
983
- var stateSettings = {
984
- stateSave: this.stateSave
985
- };
986
- if (this.stateLoadCallback) {
987
- Object.assign(stateSettings, {
988
- stateLoadCallback: this.stateLoadCallback
989
- });
990
- }
991
- if (this.stateSaveCallback) {
992
- Object.assign(stateSettings, {
993
- stateSaveCallback: this.stateSaveCallback
994
- });
995
- }
996
- Object.assign(settings, stateSettings);
997
- if (this.scrollable) {
998
- // set continuous scrolling
999
- Object.assign(settings, {
1000
- scrollY: this.scrollY,
1001
- scrollCollapse: false,
1002
- scroller: {
1003
- loadingIndicator: false,
1004
- displayBuffer: 10,
1005
- },
1006
- });
1007
- }
1008
- else {
1009
- Object.assign(settings, {
1010
- scrollY: this.scrollY,
1011
- paging: this.paging,
1012
- pageLength: this.pageLength,
1013
- });
1014
- }
1015
- if (this.selectable) {
1016
- }
1017
- // handle init.dt event and emit local event
1018
- this.dataTable = tableElement_1.on('init.dt', function (event) {
1019
- var scroller = jQuery(event.target).parent();
1020
- // handle scrolling
1021
- scroller.on('scroll', function (scrollEvent) {
1022
- var target = jQuery(scrollEvent.target);
1023
- var top = target.scrollTop();
1024
- var left = target.scrollLeft();
1025
- if (_this.dataTable) {
1026
- _this.scroll.emit({
1027
- top: top,
1028
- left: left
1029
- });
1030
- }
1031
- });
1032
- }).DataTable(settings);
1033
- this.init.emit();
1034
- // show or hide header
1035
- if (!this.showHeader) {
1036
- this._element.nativeElement
1037
- .querySelector('.dataTable>thead').classList.add('d-none');
1038
- this._element.nativeElement
1039
- .querySelector('.dataTable').classList.add('mt-2');
1040
- }
1041
- // show or hide footer
1042
- if (!this.showFooter) {
1043
- this._element.nativeElement
1044
- .querySelector('.dataTables_info').classList.add('d-none');
1045
- }
1046
- // show or hide pager
1047
- if (this.showPaging) {
1048
- this.showPaging = true;
1049
- }
1050
- }
1051
- };
1052
- AdvancedTableComponent.prototype.scrollTop = function (value) {
1053
- if (this.dataTable) {
1054
- this.dataTable.parent().scrollTop(value);
1055
- }
1056
- };
1057
- AdvancedTableComponent.prototype.scrollLeft = function (value) {
1058
- if (this.dataTable) {
1059
- this.dataTable.parent().scrollLeft(value);
1060
- }
1061
- };
1062
- Object.defineProperty(AdvancedTableComponent.prototype, "lastQuery", {
1063
- get: function () {
1064
- var _this = this;
1065
- if (this.config == null) {
1066
- return null;
1067
- }
1068
- if (this.lastQueryParams == null) {
1069
- return null;
1070
- }
1071
- var q = this._context.model(this.config.model).asQueryable();
1072
- Object.keys(this.lastQueryParams).forEach(function (key) {
1073
- q.setParam(key, _this.lastQueryParams[key]);
1074
- });
1075
- // return query
1076
- return q;
1077
- },
1078
- enumerable: true,
1079
- configurable: true
1080
- });
1081
- /**
1082
- * Fetches and updates a single row
1083
- * @param find - Any object which is being converted to a query
1084
- */
1085
- AdvancedTableComponent.prototype.fetchOne = function (find) {
1086
- var _this = this;
1087
- if (find == null) {
1088
- return;
1089
- }
1090
- if (this.dataTable == null) {
1091
- return;
1092
- }
1093
- if (this.lastQueryParams == null) {
1094
- return;
1095
- }
1096
- // get rows
1097
- var rows = Array.from(this.dataTable.rows().data());
1098
- if (rows && rows.length) {
1099
- // find result
1100
- var findKeys_1 = Object.keys(find);
1101
- if (findKeys_1.length === 0) {
1102
- // do nothing
1103
- return;
1104
- }
1105
- // find row index by searching each property
1106
- var rowIndex_1 = rows.findIndex(function (row) {
1107
- return findKeys_1.map(function (key) {
1108
- return row[key] === find[key];
1109
- }).filter(function (res) {
1110
- return res === false;
1111
- }).length === 0;
1112
- });
1113
- // if row has been found
1114
- if (rowIndex_1 >= 0) {
1115
- var query_1 = this._context.model(this.config.model).asQueryable();
1116
- // select attributes
1117
- query_1.setParam('$select', this.lastQueryParams.$select);
1118
- if (this.lastQueryParams.$expand) {
1119
- // apply expand attributes
1120
- query_1.setParam('$expand', this.lastQueryParams.$expand);
1121
- }
1122
- // apply filter for row
1123
- findKeys_1.forEach(function (key) {
1124
- var column = _this.config.columns.find(function (col) {
1125
- return col.property === key || col.name === key;
1126
- });
1127
- if (column) {
1128
- // get property or name
1129
- var property = column.property || column.name;
1130
- query_1.and(property).equal(find[key]);
1131
- }
1132
- else {
1133
- query_1.and(key).equal(find[key]);
1134
- }
1135
- });
1136
- // and finally get item
1137
- return query_1.getItem().then(function (item) {
1138
- // if item exists
1139
- var row = _this.dataTable.row(rowIndex_1);
1140
- var checked = jQuery(row.node()).find(':checkbox').prop('checked');
1141
- if (item) {
1142
- // redraw row
1143
- row.data(item);
1144
- jQuery(row.node()).find(':checkbox').off('click').on('click', _this.onSelectionChange.bind(_this));
1145
- // if row is already selected
1146
- if (checked) {
1147
- _this.selectRow(row, true);
1148
- }
1149
- }
1150
- return Promise.resolve();
1151
- });
1152
- }
1153
- }
1154
- return Promise.resolve();
1155
- };
1156
- AdvancedTableComponent.prototype.ngOnDestroy = function () {
1157
- if (this.reloadSubscription) {
1158
- this.reloadSubscription.unsubscribe();
1159
- }
1160
- };
1161
- /**
1162
- * Handle selection change
1163
- * @param $event
1164
- */
1165
- AdvancedTableComponent.prototype.onSelectionChange = function ($event) {
1166
- var input = $event.target;
1167
- // get row from id
1168
- var rowIndex = parseInt(/-(\d+)$/g.exec(input.id)[1], 10);
1169
- // get row
1170
- var row = this.dataTable.row(rowIndex).data();
1171
- // get row identifier
1172
- if (row) {
1173
- var key_4 = this.config.columns[0].property;
1174
- var id_3 = row[key_4];
1175
- var findItemIndex = this.selected.findIndex(function (item) {
1176
- return item[key_4] === id_3;
1177
- });
1178
- if (input.checked) {
1179
- if (findItemIndex < 0) {
1180
- // add row to selected rows
1181
- this.selected.push(row);
1182
- this.selectedItems.emit(this.selected);
1183
- }
1184
- }
1185
- else {
1186
- if (findItemIndex >= 0) {
1187
- // remove selected item
1188
- this.selected.splice(findItemIndex, 1);
1189
- if (this.smartSelect) {
1190
- // add row to unselected rows
1191
- findItemIndex = this.unselected.findIndex(function (item) {
1192
- return item[key_4] === id_3;
1193
- });
1194
- if (findItemIndex < 0) {
1195
- this.unselected.push(row);
1196
- this.selectedItems.emit(this.selected);
1197
- }
1198
- }
1199
- }
1200
- }
1201
- }
1202
- };
1203
- AdvancedTableComponent.prototype.resetEmptyTable = function () {
1204
- // this operation is important
1205
- // due to ng data binding
1206
- // empty table template has no translated text during ngOnInit()
1207
- if (this.dataTable && this.dataTable.context[0]) {
1208
- this.dataTable.context[0].oLanguage.sEmptyTable =
1209
- this.dataTable.context[0].oLanguage.sZeroRecords = this.emptyTable.nativeElement.innerHTML;
1210
- }
1211
- };
1212
- AdvancedTableComponent.prototype.toggleError = function (err) {
1213
- if (this.dataTable && this.dataTable.context[0]) {
1214
- var innerMessage = this.errorTemplate.nativeElement.getElementsByTagName('small').item(0);
1215
- if (err) {
1216
- this.lastError = err;
1217
- if (innerMessage) {
1218
- innerMessage.innerHTML = err.error && err.error.message ? err.error.message : err.message;
1219
- }
1220
- this.dataTable.context[0].oLanguage.sEmptyTable =
1221
- this.dataTable.context[0].oLanguage.sZeroRecords = this.errorTemplate.nativeElement.innerHTML;
1222
- }
1223
- else {
1224
- if (innerMessage) {
1225
- innerMessage.innerHTML = '';
1226
- }
1227
- this.dataTable.context[0].oLanguage.sEmptyTable = this.dataTable.context[0].oLanguage.sZeroRecords = '';
1228
- }
1229
- }
1230
- };
1231
- AdvancedTableComponent.prototype.clearEmptyTable = function () {
1232
- if (this.dataTable && this.dataTable.context[0]) {
1233
- this.dataTable.context[0].oLanguage.sEmptyTable = this.dataTable.context[0].oLanguage.sZeroRecords = '';
1234
- }
1235
- };
1236
- AdvancedTableComponent.prototype.export = function () {
1237
- var element = document.querySelector('.dt-buttons .buttons-excel');
1238
- element.click();
1239
- };
1240
- AdvancedTableComponent.prototype.handleColumns = function (columnsToShow) {
1241
- var table = this.dataTable;
1242
- this.config.columns.slice(1).forEach(function (column, i) {
1243
- if (!column.hidden) {
1244
- if (columnsToShow.includes(column.name)) {
1245
- // noinspection TypeScriptValidateJSTypes
1246
- table.column(column.name + ':name').visible(true);
1247
- }
1248
- else {
1249
- // noinspection TypeScriptValidateJSTypes
1250
- table.column(column.name + ':name').visible(false);
1251
- }
1252
- }
1253
- });
1254
- };
1255
- AdvancedTableComponent.prototype.getConfig = function () {
1256
- return this.config;
1257
- };
1258
- AdvancedTableComponent.prototype.ngOnChanges = function (changes) {
1259
- var _this = this;
1260
- if (Object.prototype.hasOwnProperty.call(changes, 'configSrc')) {
1261
- if (changes.configSrc != null) {
1262
- // load table configuration on change
1263
- // tslint:disable-next-line: triple-equals
1264
- if (changes.configSrc.currentValue && (changes.configSrc.currentValue != changes.configSrc.previousValue)) {
1265
- this._http.get(changes.configSrc.currentValue).toPromise().then(function (config) {
1266
- // set configuration
1267
- _this.config = config;
1268
- _this.destroy();
1269
- // fetch and redraw
1270
- _this.fetch();
1271
- }).catch(function (err) {
1272
- console.error('TABLES', 'An error occurred while loading table configuration.');
1273
- console.error(err);
1274
- });
1275
- }
1276
- }
1277
- }
1278
- };
1279
- AdvancedTableComponent.prototype.reset = function (load) {
1280
- this.query = null;
1281
- this.destroy();
1282
- this.autoLoad = !!load;
1283
- this.ngOnInit();
1284
- };
1285
- AdvancedTableComponent.prototype.selectColumns = function () {
1286
- var _this = this;
1287
- // get column order e.g. [0, 4, 1, 2, 3]
1288
- var columnOrder = this.dataTable.colReorder.order();
1289
- // get column definitions
1290
- var columnDefs = this.dataTable.settings().init().columns;
1291
- var columns = columnDefs.map(function (columnDef, i) {
1292
- var key = "column-" + i;
1293
- var title = columnDef.title;
1294
- // get column index
1295
- var index = columnOrder.indexOf(i);
1296
- var visible = _this.dataTable.column(index).visible();
1297
- // set title for select column
1298
- if (i === 0 && _this.selectable) {
1299
- title = '<' + _this._translateService.instant('Tables.SelectColumn') + '>';
1300
- }
1301
- // get column title
1302
- if (title != null && title.length === 0) {
1303
- title = null;
1304
- }
1305
- if (title == null) {
1306
- // try to find column placeholder
1307
- var placeholder = null;
1308
- if (_this.selectable) {
1309
- if (i > 0) {
1310
- placeholder = _this.config.columns[i - 1].placeholder;
1311
- }
1312
- }
1313
- else {
1314
- placeholder = _this.config.columns[i].placeholder;
1315
- }
1316
- if (placeholder != null) {
1317
- title = '<' + _this._translateService.instant(placeholder) + '>';
1318
- }
1319
- }
1320
- if (title == null) {
1321
- title = '<' + _this._translateService.instant('Tables.UnknownColumn') + '>';
1322
- }
1323
- return {
1324
- key: key,
1325
- title: title,
1326
- visible: visible,
1327
- index: index
1328
- };
1329
- });
1330
- this._columnSelector.selectColumns(columns).then(function (event) {
1331
- if (event.result === 'ok') {
1332
- var sorted = event.columns
1333
- .map(function (col) {
1334
- return {
1335
- key: col.key,
1336
- index: col.index
1337
- };
1338
- })
1339
- .sort(function (a, b) { return a.index - b.index; });
1340
- // get column order e.g. [3, 1, 2, 0, 4]
1341
- var indexes = sorted
1342
- .map(function (item) {
1343
- return event.columns.findIndex(function (next) { return item.key === next.key; });
1344
- });
1345
- // reset column visibilty
1346
- for (var index = 0; index < event.columns.length; index++) {
1347
- var element = event.columns[index];
1348
- var colIndex = columnOrder.indexOf(index);
1349
- // set visibilty with redraw (=true)
1350
- _this.dataTable.column(colIndex).visible(element.visible, true);
1351
- }
1352
- // finally apply column order
1353
- _this.dataTable.colReorder.order(indexes, true);
1354
- // simply redraw the table
1355
- _this.dataTable.draw();
1356
- }
1357
- });
1358
- };
1359
- /**
1360
- *
1361
- * @param options to pass an errorHandler callback, if desired
1362
- * @returns void
1363
- */
1364
- AdvancedTableComponent.prototype.exportView = function (options) {
1365
- return tslib_1.__awaiter(this, void 0, void 0, function () {
1366
- var exportSettings, exportLimit, totalDisplayedItems, _a, body, header, previousDataState, targetDataState, _b, body, header, err_1;
1367
- return tslib_1.__generator(this, function (_c) {
1368
- switch (_c.label) {
1369
- case 0:
1370
- _c.trys.push([0, 4, 5, 6]);
1371
- this._loading.showLoading();
1372
- // validate query items and config
1373
- if (!(this._lastQueryTotalItems && this.config)) {
1374
- // do nothing
1375
- return [2 /*return*/];
1376
- }
1377
- exportSettings = this._configuration.settings;
1378
- exportLimit = (exportSettings && exportSettings.tables && exportSettings.tables.exportLimit > 0)
1379
- ? exportSettings.tables.exportLimit : MAX_EXPORT_ITEMS;
1380
- // and validate it
1381
- if (this._lastQueryTotalItems > exportLimit) {
1382
- // call error handler
1383
- // provide a recognizible error type
1384
- if (options && options.errorHandler) {
1385
- options.errorHandler(new ExportLimitExceededError('Export limit exceeded'));
1386
- return [2 /*return*/];
1387
- }
1388
- // or show warning modal and exit
1389
- this._modalService.showWarningDialog(this._translateService.instant('Tables.ExportList'), this._translateService.instant('Tables.ExportLimitExceeded', { dataLength: this._lastQueryTotalItems, exportLimit: exportLimit }), DIALOG_BUTTONS.Ok);
1390
- return [2 /*return*/];
1391
- }
1392
- totalDisplayedItems = Array.from(this.dataTable.context[0].aiDisplay).length;
1393
- if (!(totalDisplayedItems === this._lastQueryTotalItems)) return [3 /*break*/, 1];
1394
- _a = this.getExportableData(), body = _a.body, header = _a.header;
1395
- // and export them to excel
1396
- this._exportSpreadsheet.export(body, this._translateService.instant(this.config.title || 'Tables.ExportResults') + ".xlsx", {
1397
- header: header,
1398
- skipHeader: false
1399
- });
1400
- return [3 /*break*/, 3];
1401
- case 1:
1402
- previousDataState = this.dataTable.rows().data().toArray();
1403
- return [4 /*yield*/, this.lastQuery.take(exportLimit).getItems()];
1404
- case 2:
1405
- targetDataState = _c.sent();
1406
- // change table data on the fly, but do not redraw
1407
- this.dataTable.clear().rows.add(targetDataState);
1408
- _b = this.getExportableData(), body = _b.body, header = _b.header;
1409
- // reset table data
1410
- this.dataTable.clear().rows.add(previousDataState);
1411
- // and export target data to excel
1412
- this._exportSpreadsheet.export(body, this._translateService.instant(this.config.title || 'Tables.ExportResults') + ".xlsx", {
1413
- header: header,
1414
- skipHeader: false
1415
- });
1416
- _c.label = 3;
1417
- case 3:
1418
- // exit
1419
- return [2 /*return*/];
1420
- case 4:
1421
- err_1 = _c.sent();
1422
- // log error
1423
- console.error(err_1);
1424
- // call error handler, if defined
1425
- if (options && options.errorHandler) {
1426
- options.errorHandler(err_1);
1427
- }
1428
- else {
1429
- // use default error service
1430
- this._errorService.showError(err_1, {
1431
- continueLink: '.'
1432
- });
1433
- }
1434
- return [3 /*break*/, 6];
1435
- case 5:
1436
- this._loading.hideLoading();
1437
- return [7 /*endfinally*/];
1438
- case 6: return [2 /*return*/];
1439
- }
1440
- });
1441
- });
1442
- };
1443
- AdvancedTableComponent.prototype.getExportableData = function () {
1444
- var _this = this;
1445
- if (!(this.dataTable && this.dataTable.buttons
1446
- && typeof this.dataTable.buttons.exportData === 'function' && this.config)) {
1447
- return { body: [], header: [] };
1448
- }
1449
- // fetch exportable excel data
1450
- var _a = this.dataTable.buttons.exportData(), body = _a.body, header = _a.header;
1451
- var cleanupIndexes = [];
1452
- // clean up headers
1453
- header = header.filter(function (headerItem, index) {
1454
- // exclude empty headers
1455
- if (headerItem.trim().length === 0) {
1456
- cleanupIndexes.push(index);
1457
- return false;
1458
- }
1459
- // exclude hidden columns
1460
- // note: use the datatable visible() function
1461
- // instead of the hidden config property, to satisfy the column selector
1462
- if (!_this.dataTable.column(index).visible()) {
1463
- cleanupIndexes.push(index);
1464
- return false;
1465
- }
1466
- return true;
1467
- });
1468
- // clean up body
1469
- body = body.map(function (row) {
1470
- return row.filter(function (_, rowIndex) {
1471
- return cleanupIndexes.indexOf(rowIndex) === -1;
1472
- });
1473
- });
1474
- return { body: body, header: header };
1475
- };
1476
- AdvancedTableComponent.decorators = [
1477
- { type: Component, args: [{
1478
- // tslint:disable-next-line: component-selector
1479
- selector: 'app-advanced-table',
1480
- template: "\n <table #table class=\"dataTable\">\n </table>\n <div #emptyTable class=\"d-none\">\n <div>\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-gray-300 border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-dark\" [translate]=\"'Tables.EmptyTableTitle'\"></h4>\n <p class=\"font-lg text-dark\" [translate]=\"'Tables.EmptyTableMessage'\"></p>\n </div>\n </div>\n </div>\n <div #errorTemplate class=\"d-none error-message\">\n <div class=\"text-center\">\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-danger border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-secondary\" [translate]=\"'Tables.DataError.Title'\"></h4>\n <p class=\"font-lg text-secondary mb-1\" [translate]=\"'Tables.DataError.Message'\"></p>\n <p class=\"font-lg text-secondary error-inner-message\">\n <small></small>\n </p>\n </div>\n </div>\n </div>\n ",
1481
- encapsulation: ViewEncapsulation.None,
1482
- styles: ["table.dataTable thead .sorting{background-image:none}table.dataTable thead .sorting_asc{background-position:95% 60%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAAsSAAALEgHS3X78AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAEtJREFUKJFjYBgywAOKMQALFjE/BgaGTCibjYGBYRM+kz0ZGBh2MTAw8DAwMHAxMDBsY2BgCCBGMQzg1IRNMV5NuVAJXIALqmYwAgBBkAlPRCLcLwAAAABJRU5ErkJggg==)}table.dataTable thead .sorting_desc{background-position:95% 60%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAArzAAAK8wHvFRX1AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAFNJREFUKJHVzTEKgDAQRNGHZfBg2sSTeDMLKwXPYuVJbBKQQEyrH6bZ+cPyWWaElz4kR5cOJ1b0FXnBVRYjjmIUsGGqvX6OmnImYk+JLTkzpPyBGwrtCvfBe56nAAAAAElFTkSuQmCC)}table.dataTable thead th{color:#73818e;font-size:.75rem;font-weight:600;padding-top:16px;padding-bottom:4px;border-bottom:none;padding-left:8px}table.dataTable tbody tr:first-child td:first-child{border-radius:6px 0}table.dataTable tbody tr:first-child td:last-child{border-radius:0 6px}table.dataTable tbody tr{border-radius:6px}table.dataTable tbody tr td:first-child{border-left:1px solid #c2cfd6}table.dataTable tbody tr td:last-child{border-right:1px solid #c2cfd6}table.dataTable tbody tr td{padding-top:8px;padding-bottom:8px;border-top:1px solid #c2cfd6}table.dataTable tbody tr:last-child td:first-child{border-radius:0 0 0 6px}table.dataTable tbody tr:last-child td:last-child{border-radius:0 0 6px}table.dataTable tbody tr:last-child td{border-bottom:1px solid #c2cfd6}table.dataTable td.dataTables_empty{border:none!important}table.dataTable .error-inner-message>small{overflow-wrap:break-word}table.dataTable.no-footer{border-bottom:none}.dataTables_paginate .btn.previous{margin-right:8px}.dataTables_paginate .btn.next{margin-left:8px}.dataTables_info,.dataTables_paginate{margin-top:1rem}.dataTables_paginate span .btn{border-radius:1.5rem}.dataTables_filter{display:none}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:0;overflow:auto}.dataTables_paginate{display:none}.dataTable.processing{opacity:15%}.dataTables_wrapper .dataTables_processing{background:0 0;position:absolute;display:inline-block;top:25%;z-index:5;color:#73818e}.text-decoration-line-through{text-decoration:line-through!important}tr.removed .checkbox+label{visibility:hidden}"]
1483
- }] }
1484
- ];
1485
- /** @nocollapse */
1486
- AdvancedTableComponent.ctorParameters = function () { return [
1487
- { type: AngularDataContext },
1488
- { type: undefined, decorators: [{ type: Inject, args: [COLUMN_FORMATTERS,] }] },
1489
- { type: ActivatedRoute },
1490
- { type: TranslateService },
1491
- { type: Injector },
1492
- { type: AdvancedFilterValueProvider },
1493
- { type: ElementRef },
1494
- { type: TemplatePipe },
1495
- { type: LoadingService },
1496
- { type: HttpClient },
1497
- { type: ColumnSelectorService },
1498
- { type: ConfigurationService },
1499
- { type: ExportSpreadsheetService },
1500
- { type: ModalService },
1501
- { type: ErrorService }
1502
- ]; };
1503
- AdvancedTableComponent.propDecorators = {
1504
- table: [{ type: ViewChild, args: ['table',] }],
1505
- emptyTable: [{ type: ViewChild, args: ['emptyTable',] }],
1506
- errorTemplate: [{ type: ViewChild, args: ['errorTemplate',] }],
1507
- loadingTable: [{ type: ViewChild, args: ['loadingTable',] }],
1508
- height: [{ type: Input }],
1509
- showActions: [{ type: Input }],
1510
- autoLoad: [{ type: Input }],
1511
- load: [{ type: Output, args: ['load',] }],
1512
- init: [{ type: Output, args: ['init',] }],
1513
- reload: [{ type: Input, args: ['reload',] }],
1514
- select: [{ type: Output, args: ['select',] }],
1515
- draw: [{ type: Output, args: ['draw',] }],
1516
- page: [{ type: Output, args: ['page',] }],
1517
- order: [{ type: Output, args: ['order',] }],
1518
- scroll: [{ type: Output, args: ['scroll',] }],
1519
- selectedItems: [{ type: Output, args: ['selectedItems',] }],
1520
- loading: [{ type: Output, args: ['loading',] }],
1521
- scrollable: [{ type: Input }],
1522
- serverSide: [{ type: Input }],
1523
- lengthMenu: [{ type: Input }],
1524
- paging: [{ type: Input }],
1525
- pageLength: [{ type: Input }],
1526
- columnOrdering: [{ type: Input }],
1527
- stateSave: [{ type: Input }],
1528
- stateLoadCallback: [{ type: Input }],
1529
- stateSaveCallback: [{ type: Input }],
1530
- scrollY: [{ type: Input }],
1531
- scrollX: [{ type: Input }],
1532
- selectable: [{ type: Input }],
1533
- multipleSelect: [{ type: Input }],
1534
- customSelect: [{ type: Input }],
1535
- selected: [{ type: Input }],
1536
- configSrc: [{ type: Input }],
1537
- config: [{ type: Input, args: ['config',] }],
1538
- showFooter: [{ type: Input, args: ['showFooter',] }],
1539
- showHeader: [{ type: Input, args: ['showHeader',] }],
1540
- showPaging: [{ type: Input, args: ['showPaging',] }],
1541
- query: [{ type: Input, args: ['query',] }]
1542
- };
1543
- return AdvancedTableComponent;
1544
- }());
1545
- export { AdvancedTableComponent };
1546
- export { ɵ0 };
1547
-
1548
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHVuaXZlcnNpcy9uZ3gtdGFibGVzLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYWR2YW5jZWQtdGFibGUvYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQUUsWUFBWSxFQUN4QixNQUFNLEVBQ04sY0FBYyxFQUNkLFFBQVEsRUFDUixLQUFLLEVBQ0csTUFBTSxFQUNkLFNBQVMsRUFDVCxpQkFBaUIsRUFHbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGFBQWEsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUcvQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQWUsZUFBZSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUN4RCxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSx3QkFBd0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWpHLG9GQUFvRjtBQUNwRixPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyx5QkFBeUIsQ0FBQztB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QUMsY0FBYzt5QkFDeEIsS0FBSzs4QkFDTCxLQUFLOzJCQUNMLEtBQUs7dUJBQ0wsTUFBTSxTQUFDLE1BQU07dUJBQ2IsTUFBTSxTQUFDLE1BQU07eUJBQ2IsS0FBSyxTQUFDLFFBQVE7eUJBQ2QsTUFBTSxTQUFDLFFBQVE7dUJBQ2YsTUFBTSxTQUFDLE1BQU07dUJBQ2IsTUFBTSxTQUFDLE1BQU07d0JBQ2IsTUFBTSxTQUFDLE9BQU87eUJBQ2QsTUFBTSxTQUFDLFFBQVE7Z0NBQ2YsTUFBTSxTQUFDLGVBQWU7MEJBQ3RCLE1BQU0sU0FBQyxTQUFTOzZCQU1oQixLQUFLOzZCQUNMLEtBQUs7NkJBQ0wsS0FBSzt5QkFDTCxLQUFLOzZCQUNMLEtBQUs7aUNBQ0wsS0FBSzs0QkFDTCxLQUFLO29DQUNMLEtBQUs7b0NBQ0wsS0FBSzswQkFFTCxLQUFLOzBCQUNMLEtBQUs7NkJBSUwsS0FBSztpQ0FJTCxLQUFLOytCQUlMLEtBQUs7MkJBQ0wsS0FBSzs0QkFLTCxLQUFLO3lCQU1MLEtBQUssU0FBQyxRQUFROzZCQWtCZCxLQUFLLFNBQUMsWUFBWTs2QkF5QmpCLEtBQUssU0FBQyxZQUFZOzZCQThCbkIsS0FBSyxTQUFDLFlBQVk7d0JBeUJsQixLQUFLLFNBQUMsT0FBTzs7SUFndENoQiw2QkFBQztDQUFBLEFBMTVDRCxJQTA1Q0M7U0F2M0NZLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5qZWN0b3IsXG4gIElucHV0LCBPbkRlc3Ryb3ksXG4gIE9uSW5pdCwgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FuZ3VsYXJEYXRhQ29udGV4dH0gZnJvbSAnQHRoZW1vc3QvYW5ndWxhcic7XG5pbXBvcnQge1RyYW5zbGF0ZVBpcGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7VGFibGVDb2x1bW5Db25maWd1cmF0aW9uLCBUYWJsZUNvbmZpZ3VyYXRpb259IGZyb20gJy4vYWR2YW5jZWQtdGFibGUuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0RhdGFTZXJ2aWNlUXVlcnlQYXJhbXN9IGZyb20gJ0B0aGVtb3N0L2NsaWVudCc7XG5pbXBvcnQge0FkdmFuY2VkQ29sdW1uRm9ybWF0dGVyfSBmcm9tICcuL2FkdmFuY2VkLXRhYmxlLmZvcm1hdHRlcnMnO1xuaW1wb3J0IHtDbGllbnREYXRhUXVlcnlhYmxlfSBmcm9tICdAdGhlbW9zdC9jbGllbnQnO1xuaW1wb3J0IHtBZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXJ9IGZyb20gJy4vYWR2YW5jZWQtZmlsdGVyLXZhbHVlLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb24sIEJlaGF2aW9yU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1RlbXBsYXRlUGlwZSwgTG9hZGluZ1NlcnZpY2UsIENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICBNb2RhbFNlcnZpY2UsIERJQUxPR19CVVRUT05TLCBFcnJvclNlcnZpY2UsIEV4cG9ydFNwcmVhZHNoZWV0U2VydmljZX0gZnJvbSAnQHVuaXZlcnNpcy9jb21tb24nO1xuaW1wb3J0IHtJQWR2YW5jZWRUYWJsZUZvcm1hdHRlcnN9IGZyb20gJy4vYWR2YW5jZWQtdGFibGUuZm9ybWF0dGVycy5pbnRlcmZhY2UnO1xuLy8gaW1wb3J0YW50IG5vdGU6IHVzZSB0aGlzIGltcG9ydCB0byBhdm9pZCBDYW5ub3QgY2FsbCBhIG5hbWVzcGFjZSAoJ2pxdWVyeScpIGVycm9yXG5pbXBvcnQgKiBhcyBqUXVlcnlfIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0JztcbmltcG9ydCB7dGVtcGxhdGV9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LXNjcm9sbGVyJztcbmltcG9ydCAnZGF0YXRhYmxlcy5uZXQtY29scmVvcmRlcic7XG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LWJ1dHRvbnMnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENvbHVtblNlbGVjdG9yU2VydmljZSB9IGZyb20gJy4uL2NvbHVtbi1zZWxlY3Rvci9jb2x1bW4tc2VsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBFeHBvcnRMaW1pdENvbmZpZ3VyYXRpb24sIE1BWF9FWFBPUlRfSVRFTVMgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2J0bmV4cC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoJztcblxuLy8gcmVzdG9yZSBqcXVlcnkgaW1wb3J0IHRvIGF2b2lkIENhbm5vdCBjYWxsIGEgbmFtZXNwYWNlICgnanF1ZXJ5JykgZXJyb3JcbmNvbnN0IGpRdWVyeSA9IGpRdWVyeV87XG5leHBvcnQgaW50ZXJmYWNlIEFkdmFuY2VkVGFibGVEYXRhUmVzdWx0IHtcbiAgcmVjb3Jkc1RvdGFsOiBudW1iZXI7XG4gIHJlY29yZHNGaWx0ZXJlZDogbnVtYmVyO1xuICBkYXRhOiBBcnJheTxhbnk+O1xufVxuXG5jb25zdCBEYXRhVGFibGVzQXBpOiBhbnkgPSBqUXVlcnkuZm4uZGF0YVRhYmxlLkFwaTtcbkRhdGFUYWJsZXNBcGkucmVnaXN0ZXIoICdwcm9jZXNzaW5nKCknLCBmdW5jdGlvbiggc2hvdzogYW55ICkge1xuICAgIHJldHVybiB0aGlzLml0ZXJhdG9yKCd0YWJsZScsICggY3R4OiBhbnkgKSA9PiB7XG4gICAgICAgIGN0eC5vQXBpLl9mblByb2Nlc3NpbmdEaXNwbGF5KCBjdHgsIHNob3cgKTtcbiAgICB9ICk7XG59KTtcblxuY29uc3QgRU1QVFlfREFUQVNFVCA9IHtcbiAgcmVjb3Jkc1RvdGFsOiAwLFxuICByZWNvcmRzRmlsdGVyZWQ6IDAsXG4gIGRhdGE6IFtdLFxufTtcblxuY2xhc3MgVGFibGVUcmFuc2xhdGlvbkNoYW5nZURldGVjdG9yIGV4dGVuZHMgQ2hhbmdlRGV0ZWN0b3JSZWYge1xuICBwdWJsaWMgY2hlY2tOb0NoYW5nZXMoKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgZGV0YWNoKCk6IHZvaWQge1xuICB9XG5cbiAgcHVibGljIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgbWFya0ZvckNoZWNrKCk6IHZvaWQge1xuICB9XG5cbiAgcHVibGljIHJlYXR0YWNoKCk6IHZvaWQge1xuICB9XG5cbn1cblxuZXhwb3J0IGxldCBDT0xVTU5fRk9STUFUVEVSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignY29sdW1uLmZvcm1hdHRlcnMnKTtcblxuZXhwb3J0IGNsYXNzIEV4cG9ydExpbWl0RXhjZWVkZWRFcnJvciBleHRlbmRzIFJhbmdlRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnRXhwb3J0TGltaXRFeGNlZWRlZEVycm9yJztcbiAgfVxufVxuXG5jbGFzcyBDb2x1bW5Gb3JtYXR0ZXIgZXh0ZW5kcyBBZHZhbmNlZENvbHVtbkZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGNsYXNzOiBzdHJpbmc7XG4gIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZztcbiAgcHVibGljIGRlZmF1bHRDb250ZW50OiBzdHJpbmc7XG4gIHB1YmxpYyBmb3JtYXRTdHJpbmc6IHN0cmluZztcbiAgcHVibGljIGZvcm1hdHRlcjogc3RyaW5nO1xuICBwdWJsaWMgaGlkZGVuOiBib29sZWFuO1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgb3JkZXI6IHN0cmluZztcbiAgcHVibGljIHByb3BlcnR5OiBzdHJpbmc7XG4gIHB1YmxpYyBzb3J0YWJsZTogYm9vbGVhbjtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG5cbiAgcHVibGljIHJlbmRlcihkYXRhOiBhbnksIHR5cGU6IGFueSwgcm93OiBhbnksIG1ldGE6IGFueSkge1xuICAgIC8vXG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yY2VDYXN0PFQ+KGlucHV0OiBhbnkpOiBUIHtcbiAgcmV0dXJuIGlucHV0O1xufVxuXG5leHBvcnQgY2xhc3MgQWR2YW5jZWRUYWJsZUNvbmZpZ3VyYXRpb24ge1xuICBwdWJsaWMgc3RhdGljIGNhc3QoaW5wdXQ6IGFueSwgY2xvbmU/OiBib29sZWFuKTogVGFibGVDb25maWd1cmF0aW9uIHtcbiAgICBpZiAoY2xvbmUpIHtcbiAgICAgIHJldHVybiBmb3JjZUNhc3Q8VGFibGVDb25maWd1cmF0aW9uPihKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGlucHV0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gZm9yY2VDYXN0PFRhYmxlQ29uZmlndXJhdGlvbj4oaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJhbmRvbUlkZW50aWZpZXIoKSB7XG4gIHJldHVybiAoXG4gICAgTnVtYmVyKFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZSgyKSlcbiAgKS50b1N0cmluZygzNik7XG59XG5cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2FwcC1hZHZhbmNlZC10YWJsZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHRhYmxlICN0YWJsZSBjbGFzcz1cImRhdGFUYWJsZVwiPlxuICAgIDwvdGFibGU+XG4gICAgPGRpdiAjZW1wdHlUYWJsZSBjbGFzcz1cImQtbm9uZVwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jaXJjbGUgYmctZ3JheS0zMDAgYm9yZGVyLWdyYXktMTAwXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgIDxoNCBjbGFzcz1cImZvbnQtM3hsIHRleHQtZGFya1wiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5FbXB0eVRhYmxlVGl0bGUnXCI+PC9oND5cbiAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtbGcgdGV4dC1kYXJrXCIgW3RyYW5zbGF0ZV09XCInVGFibGVzLkVtcHR5VGFibGVNZXNzYWdlJ1wiPjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICNlcnJvclRlbXBsYXRlIGNsYXNzPVwiZC1ub25lIGVycm9yLW1lc3NhZ2VcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNpcmNsZSBiZy1kYW5nZXIgYm9yZGVyLWdyYXktMTAwXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgIDxoNCBjbGFzcz1cImZvbnQtM3hsIHRleHQtc2Vjb25kYXJ5XCIgW3RyYW5zbGF0ZV09XCInVGFibGVzLkRhdGFFcnJvci5UaXRsZSdcIj48L2g0PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1sZyB0ZXh0LXNlY29uZGFyeSBtYi0xXCIgW3RyYW5zbGF0ZV09XCInVGFibGVzLkRhdGFFcnJvci5NZXNzYWdlJ1wiPjwvcD5cbiAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtbGcgdGV4dC1zZWNvbmRhcnkgZXJyb3ItaW5uZXItbWVzc2FnZVwiPlxuICAgICAgICAgICAgPHNtYWxsPjwvc21hbGw+XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdHlsZVVybHM6IFsnLi9hZHZhbmNlZC10YWJsZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgcHJpdmF0ZSBfcXVlcnk6IENsaWVudERhdGFRdWVyeWFibGU7XG4gIHByaXZhdGUgX2NvbmZpZzogVGFibGVDb25maWd1cmF0aW9uO1xuICBwcml2YXRlIF9maXJzdExvYWQgPSB0cnVlO1xuICBwcml2YXRlIF9zaG93Rm9vdGVyID0gZmFsc2U7XG4gIHByaXZhdGUgX3Nob3dIZWFkZXIgPSB0cnVlO1xuICBwcml2YXRlIF9zaG93UGFnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgX2lkID0gZ2V0UmFuZG9tSWRlbnRpZmllcigpO1xuICBwdWJsaWMgc21hcnRTZWxlY3QgPSBmYWxzZTtcbiAgcHVibGljIGNvbmZpZ0NoYW5nZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG5cbiAgQFZpZXdDaGlsZCgndGFibGUnKSBwdWJsaWMgdGFibGU6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2VtcHR5VGFibGUnKSBwdWJsaWMgZW1wdHlUYWJsZTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZXJyb3JUZW1wbGF0ZScpIHB1YmxpYyBlcnJvclRlbXBsYXRlOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdsb2FkaW5nVGFibGUnKSBwdWJsaWMgbG9hZGluZ1RhYmxlOiBFbGVtZW50UmVmO1xuICBASW5wdXQoKSBwdWJsaWMgaGVpZ2h0ID0gODAwO1xuICBASW5wdXQoKSBwdWJsaWMgc2hvd0FjdGlvbnMgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgYXV0b0xvYWQgPSB0cnVlO1xuICBAT3V0cHV0KCdsb2FkJykgcHVibGljIGxvYWQ6IEV2ZW50RW1pdHRlcjxBZHZhbmNlZFRhYmxlRGF0YVJlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFkdmFuY2VkVGFibGVEYXRhUmVzdWx0PigpO1xuICBAT3V0cHV0KCdpbml0JykgcHVibGljIGluaXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBJbnB1dCgncmVsb2FkJykgcHVibGljIHJlbG9hZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgnc2VsZWN0JykgcHVibGljIHNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgnZHJhdycpIHB1YmxpYyBkcmF3OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdwYWdlJykgcHVibGljIHBhZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ29yZGVyJykgcHVibGljIG9yZGVyOiBFdmVudEVtaXR0ZXI8YW55W11bXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdW10+KCk7XG4gIEBPdXRwdXQoJ3Njcm9sbCcpIHB1YmxpYyBzY3JvbGw6IEV2ZW50RW1pdHRlcjx7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgdG9wOiBudW1iZXI7IGxlZnQ6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCdzZWxlY3RlZEl0ZW1zJykgcHVibGljIHNlbGVjdGVkSXRlbXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ2xvYWRpbmcnKSBwdWJsaWMgbG9hZGluZzogRXZlbnRFbWl0dGVyPHtcbiAgICB0YXJnZXQ6IEFkdmFuY2VkVGFibGVDb21wb25lbnRcbiAgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICB0YXJnZXQ6IEFkdmFuY2VkVGFibGVDb21wb25lbnRcbiAgfT4oKTtcblxuICBASW5wdXQoKSBwdWJsaWMgc2Nyb2xsYWJsZSA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXJ2ZXJTaWRlID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGxlbmd0aE1lbnUgPSBbNTAsIDEwMCwgMjAwLCA1MDBdO1xuICBASW5wdXQoKSBwdWJsaWMgcGFnaW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIHBhZ2VMZW5ndGggPSAyNTtcbiAgQElucHV0KCkgcHVibGljIGNvbHVtbk9yZGVyaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBzdGF0ZVNhdmUgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHN0YXRlTG9hZENhbGxiYWNrOiAoc2V0dGluZ3M6IGFueSwgY2FsbGJhY2s6IChzdGF0ZTogYW55KSA9PiB2b2lkKSA9PiB2b2lkO1xuICBASW5wdXQoKSBwdWJsaWMgc3RhdGVTYXZlQ2FsbGJhY2s6IChzZXR0aW5nczogYW55LCBzdGF0ZTogYW55KSA9PiB2b2lkO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBzY3JvbGxZID0gODAwO1xuICBASW5wdXQoKSBwdWJsaWMgc2Nyb2xsWCA9IHRydWU7XG4gIC8qKlxuICAgKiBFbmFibGVzIHJvdyBzZWxlY3Rpb24uIFRoZSBkZWZhdWxyIHZhbHVlIGlzIGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlIG11bHRpcGxlIHNlbGVjdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWVzIGlzIHRydWUuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgbXVsdGlwbGVTZWxlY3QgPSB0cnVlO1xuICAvKipcbiAgICogRW5hYmxlcyBjdXN0b20gc2VsZWN0aW9uIGFuZCBoaWRlcyBzZWxlY3QgY29sdW1uLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21TZWxlY3QgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkID0gW107XG4gIHB1YmxpYyB1bnNlbGVjdGVkID0gW107XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBVUkwgdG8gbG9hZCB0YWJsZSBjb25maWd1cmF0aW9uIGZyb21cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjb25maWdTcmM6IHN0cmluZztcbiAgcHVibGljIGxhc3RFcnJvcjogYW55O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGFibGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQElucHV0KCdjb25maWcnKVxuICBwdWJsaWMgc2V0IGNvbmZpZyh2YWx1ZTogVGFibGVDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5fY29uZmlnID0gdmFsdWU7XG4gICAgLy8gcmFpc2Ugc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5jb25maWdDaGFuZ2VzLm5leHQodGhpcy5fY29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxhc3RRdWVyeVRvdGFsSXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RRdWVyeVRvdGFsSXRlbXM7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGFibGUgZm9vdGVyIHdpbGwgYmUgdmlzaWJsZSBvciBub3RcbiAgICovXG4gIEBJbnB1dCgnc2hvd0Zvb3RlcicpXG4gIHB1YmxpYyBzZXQgc2hvd0Zvb3Rlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dGb290ZXIgPSB2YWx1ZTtcbiAgICAvLyBzaG93IG9yIGhpZGUgZm9vdGVyXG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgJiYgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gKCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlc19pbmZvJyk7XG4gICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNob3dGb290ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dGb290ZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGFibGUgZm9vdGVyIHdpbGwgYmUgdmlzaWJsZSBvciBub3RcbiAgICovXG4gICBASW5wdXQoJ3Nob3dIZWFkZXInKVxuICAgcHVibGljIHNldCBzaG93SGVhZGVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgIHRoaXMuX3Nob3dIZWFkZXIgPSB2YWx1ZTtcbiAgICAgLy8gc2hvdyBvciBoaWRlIGZvb3RlclxuICAgICBpZiAodGhpcy5fZWxlbWVudCAmJiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICBjb25zdCBlbGVtZW50ID0gKCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZT50aGVhZCcpO1xuICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgICB9XG4gICAgICAgY29uc3QgZGF0YVRhYmxlID0gKCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGUnKTtcbiAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XG4gICAgICAgICAvLyBhZGQgdG9wIG1hcmdpblxuICAgICAgICAgZGF0YVRhYmxlLmNsYXNzTGlzdC5yZW1vdmUoJ210LTInKTtcbiAgICAgICB9IGVsc2Uge1xuICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcbiAgICAgICAgIC8vIHJlbW92ZSB0b3AgbWFyZ2luXG4gICAgICAgICBkYXRhVGFibGUuY2xhc3NMaXN0LmFkZCgnbXQtMicpO1xuICAgICAgIH1cbiAgICAgfVxuICAgfVxuXG4gICBwdWJsaWMgZ2V0IHNob3dIZWFkZXIoKSB7XG4gICAgIHJldHVybiB0aGlzLl9zaG93SGVhZGVyO1xuICAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBwYWdpbmcgaW5mb3JtYXRpb24gd2lsbCBiZSB2aXNpYmxlIG9yIG5vdFxuICAgKi9cbiAgQElucHV0KCdzaG93UGFnaW5nJylcbiAgcHVibGljIHNldCBzaG93UGFnaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd1BhZ2luZyA9IHZhbHVlO1xuICAgIC8vIHNob3cgb3IgaGlkZSBmb290ZXJcbiAgICBpZiAodGhpcy5fZWxlbWVudCAmJiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSAoIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudClcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGVzX3BhZ2luYXRlJyk7XG4gICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBqUXVlcnkoZWxlbWVudCkuc2hvdygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgalF1ZXJ5KGVsZW1lbnQpLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNob3dQYWdpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dQYWdpbmc7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGFuIGFjdGl2ZSBxdWVyeSBmb3IgdGhpcyB0YWJsZVxuICAgKi9cbiAgQElucHV0KCdxdWVyeScpXG4gIHB1YmxpYyBzZXQgcXVlcnkodmFsdWU6IENsaWVudERhdGFRdWVyeWFibGUpIHtcbiAgICB0aGlzLl9xdWVyeSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdHJhbnNsYXRvcjogVHJhbnNsYXRlUGlwZTtcbiAgcHVibGljIGRhdGFUYWJsZTogYW55O1xuICBwdWJsaWMgZHRPcHRpb25zOiBhbnk7XG4gIHByaXZhdGUgbGFzdFF1ZXJ5UGFyYW1zOiBEYXRhU2VydmljZVF1ZXJ5UGFyYW1zO1xuICBwcml2YXRlIF9sYXN0UXVlcnlUb3RhbEl0ZW1zID0gMDtcbiAgcHJpdmF0ZSByZWxvYWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb250ZXh0OiBBbmd1bGFyRGF0YUNvbnRleHQsXG4gICAgICAgICAgICAgIEBJbmplY3QoQ09MVU1OX0ZPUk1BVFRFUlMpIHByaXZhdGUgX2NvbHVtbkZvcm1hdHRlcnM6IElBZHZhbmNlZFRhYmxlRm9ybWF0dGVycyxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgICAgICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2FkdmFuY2VkRmlsdGVyVmFsdWVQcm92aWRlcjogQWR2YW5jZWRGaWx0ZXJWYWx1ZVByb3ZpZGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIF90ZW1wbGF0ZTogVGVtcGxhdGVQaXBlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9sb2FkaW5nOiBMb2FkaW5nU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfY29sdW1uU2VsZWN0b3I6IENvbHVtblNlbGVjdG9yU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2V4cG9ydFNwcmVhZHNoZWV0OiBFeHBvcnRTcHJlYWRzaGVldFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX21vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9lcnJvclNlcnZpY2U6IEVycm9yU2VydmljZSkge1xuICAgIC8vIGluaXRpYWxpemUgdHJhbnNsYXRlIHBpcGVcbiAgICB0aGlzLnRyYW5zbGF0b3IgPSBuZXcgVHJhbnNsYXRlUGlwZSh0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLCBuZXcgVGFibGVUcmFuc2xhdGlvbkNoYW5nZURldGVjdG9yKCkpO1xuICAgIGpRdWVyeS5mbi5kYXRhVGFibGUuZXh0LmNsYXNzZXMuc1BhZ2VCdXR0b24gPSAnYnRuJztcbiAgICBqUXVlcnkuZm4uZGF0YVRhYmxlLmV4dC5jbGFzc2VzLnNQYWdlQnV0dG9uQWN0aXZlID0gJ2J0biBidG4tbGlnaHQnO1xuICAgIHRoaXMucmVsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5yZWxvYWQuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmZldGNoKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBzaW1wbGUgc2VhcmNoXG4gIHB1YmxpYyBzZWFyY2goc2VhcmNoVGV4dCkge1xuICAgIHRoaXMucXVlcnkgPSB0aGlzLnF1ZXJ5IHx8IHRoaXMuX2NvbnRleHQubW9kZWwodGhpcy5jb25maWcubW9kZWwpLmFzUXVlcnlhYmxlKCk7XG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZSkge1xuICAgICAgaWYgKHNlYXJjaFRleHQgJiYgdGhpcy5jb25maWcuc2VhcmNoRXhwcmVzc2lvbikge1xuICAgICAgICAvLyB2YWxpZGF0ZSBzZWFyY2ggdGV4dCBpbiBkb3VibGUgcXVvdGVzXG4gICAgICAgIGlmICgvXlwiKC4qPylcIiQvLnRlc3Qoc2VhcmNoVGV4dCkpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5LnNldFBhcmFtKCckZmlsdGVyJyxcbiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlLnRyYW5zZm9ybSh0aGlzLmNvbmZpZy5zZWFyY2hFeHByZXNzaW9uLCB7XG4gICAgICAgICAgICAgIHRleHQ6IHNlYXJjaFRleHQucmVwbGFjZSgvXlwifFwiJC9nLCAnJyksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdHJ5IHRvIHNwbGl0IHdvcmRzXG4gICAgICAgICAgY29uc3Qgd29yZHMgPSBzZWFyY2hUZXh0LnNwbGl0KCcgJyk7XG4gICAgICAgICAgLy8gam9pbiB3b3JkcyB0byBhIHNpbmdsZSBmaWx0ZXJcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB3b3Jkcy5tYXAoKHdvcmQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZS50cmFuc2Zvcm0odGhpcy5jb25maWcuc2VhcmNoRXhwcmVzc2lvbiwge1xuICAgICAgICAgICAgICB0ZXh0OiB3b3JkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkuam9pbignIGFuZCAnKTtcbiAgICAgICAgICAvLyBzZXQgZmlsdGVyXG4gICAgICAgICAgdGhpcy5xdWVyeS5zZXRQYXJhbSgnJGZpbHRlcicsIGZpbHRlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNsZWFyIGZpbHRlclxuICAgICAgICB0aGlzLnF1ZXJ5LnNldFBhcmFtKCckZmlsdGVyJywgbnVsbCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9maXJzdExvYWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmRyYXcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZW5zdXJlIGVtcHR5IHRhYmxlIGxheW91dFxuICAgICAgdGhpcy5yZXNldEVtcHR5VGFibGUoKTtcbiAgICAgIC8vIHNlYXJjaCBsb2NhbGx5XG4gICAgICB0aGlzLmRhdGFUYWJsZS5zZWFyY2goc2VhcmNoVGV4dC50cmltKCkpLmRyYXcoKTtcbiAgICAgIC8vIGdldCBpbmRleGVzIG9mIGZpbHRlcmVkIHJvd3NcbiAgICAgIGNvbnN0IGluZGV4ZXMgPSBBcnJheS5mcm9tKHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0uYWlEaXNwbGF5KTtcbiAgICAgIC8vIHNldCByZWNvcmRzRmlsdGVyZWRcbiAgICAgIGNvbnN0IHJlY29yZHNGaWx0ZXJlZCA9IGluZGV4ZXMubGVuZ3RoO1xuICAgICAgLy8gc2V0IHJlY29yZHNUb3RhbFxuICAgICAgY29uc3QgcmVjb3Jkc1RvdGFsID0gaW5kZXhlcy5sZW5ndGg7XG4gICAgICAvLyByZXRyaWV2ZSBkYXRhIGZyb20gaW5kZXhlc1xuICAgICAgY29uc3Qgcm93cyA9IEFycmF5LmZyb20odGhpcy5kYXRhVGFibGUucm93cygpLmRhdGEoKSk7XG4gICAgICBjb25zdCBkYXRhID0gaW5kZXhlcy5tYXAoaW5kZXggPT4gcm93c1s8bnVtYmVyPmluZGV4XSk7XG4gICAgICAvLyBlbWl0IHJlc3VsdHMgdG8gbG9hZCBvdXRwdXRcbiAgICAgIHRoaXMubG9hZC5lbWl0KHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiByZWNvcmRzRmlsdGVyZWQsXG4gICAgICAgIHJlY29yZHNUb3RhbDogcmVjb3Jkc1RvdGFsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmV0Y2goY2xlYXJTZWxlY3RlZD86IGJvb2xlYW4pIHtcbiAgICAvLyBpZiBkYXRhIHRhYmxlIGlzIG51bGxcbiAgICBpZiAodGhpcy5kYXRhVGFibGUgPT0gbnVsbCkge1xuICAgICAgLy8gaW5pdGlhbGl6ZSBkYXRhIHRhYmxlXG4gICAgICByZXR1cm4gdGhpcy5uZ09uSW5pdCgpO1xuICAgIH1cbiAgICAvLyBjbGVhciBzZWxlY3Rpb24gaWYgcGFyYW1ldGVyIGlzIG5vdCBkZWNsYXJlZCBvciBpdCdzIHRydWVcbiAgICBpZiAoY2xlYXJTZWxlY3RlZCA9PSBudWxsIHx8IGNsZWFyU2VsZWN0ZWQgPT09IHRydWUpIHtcbiAgICAgIC8vIHNldCBzbWFydCBzZWxlY3QgdG8gZmFsc2VcbiAgICAgIHRoaXMuc21hcnRTZWxlY3QgPSBmYWxzZTtcbiAgICAgIC8vIGNsZWFyIHNlbGVjdGVkIGl0ZW1zXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgLy8gY2xlYXIgdW5zZWxlY3RlZCBpdGVtc1xuICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnVuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3RoZXJ3aXNlIGxvYWQgZGF0YSBvbmx5XG4gICAgdGhpcy5kYXRhVGFibGUuZHJhdygpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9maXJzdExvYWQgPSB0cnVlO1xuICAgICAgalF1ZXJ5KHRoaXMudGFibGUubmF0aXZlRWxlbWVudCkuZW1wdHkoKTtcbiAgICAgIHRoaXMuZGF0YVRhYmxlID0gbnVsbDtcbiAgICAgIC8vIGNsZWFyIHNlbGVjdGVkIGl0ZW1zXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgLy8gY2xlYXIgdW5zZWxlY3RlZCBpdGVtc1xuICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnVuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIC8vIHNldCBzbWFydCBzZWxlY3QgdG8gZmFsc2VcbiAgICAgIHRoaXMuc21hcnRTZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIGRhdGEgcm93XG4gICAqL1xuICBwdWJsaWMgc2VsZWN0Um93KHJvdzogYW55LCBzaWxlbnQ/OiBib29sZWFuKSB7XG4gICAgaWYgKHJvdykge1xuICAgICAgLy8gZ2V0IHJvd1xuICAgICAgY29uc3Qgcm93Tm9kZSA9IHJvdy5ub2RlKCk7XG4gICAgICAvLyBpZiBtdWx0aXBsZSBzZWxlY3QgaXMgZmFsc2VcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlU2VsZWN0ID09PSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgLy8gZW51bWVyYXRlIHJvd1xuICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5ub2RlcygpLmVhY2goKG5vZGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUgIT09IHJvd05vZGUpIHtcbiAgICAgICAgICAgICAgalF1ZXJ5KG5vZGUpLmZpbmQoJzpjaGVja2JveCcpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kYXRhVGFibGUucm93cygnLnNlbGVjdGVkJykubm9kZXMoKS5lYWNoKChub2RlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlICE9PSByb3dOb2RlKSB7XG4gICAgICAgICAgICAgIGpRdWVyeShub2RlKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjbGVhciBzZWxlY3RlZFxuICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnNlbGVjdGVkLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICAvLyBpZiBjdXN0b20gc2VsZWN0IG1vZGUgaXMgb2ZmXG4gICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGpRdWVyeShyb3dOb2RlKS5maW5kKCc6Y2hlY2tib3gnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UgYWRkIGNsYXNzXG4gICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgIH1cbiAgICAgIC8vIGdldCByb3cgZGF0YVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLm5hbWU7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIC8vIHNlYXJjaCBzZWxlY3RlZCBpdGVtc1xuICAgICAgbGV0IGZpbmRJbmRleCA9IHRoaXMuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGRhdGFba2V5XTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbmRJbmRleCA+PSAwKSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IHNlbGVjdGVkIHJvd1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZShmaW5kSW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZC5wdXNoKGRhdGEpO1xuICAgICAgLy8gdmFsaWRhdGUgdW5zZWxlY3RlZCBkYXRhXG4gICAgICBmaW5kSW5kZXggPSB0aGlzLnVuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGRhdGFba2V5XTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbmRJbmRleCA+PSAwKSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IHNlbGVjdGVkIHJvd1xuICAgICAgICB0aGlzLnVuc2VsZWN0ZWQuc3BsaWNlKGZpbmRJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnNlbGVjdHMgdGhlIHNwZWNpZmllZCBkYXRhIHJvdyBpZiBpdCdzIHNlbGVjdGVkXG4gICAqL1xuICBwdWJsaWMgdW5TZWxlY3RSb3cocm93OiBhbnksIHNpbGVudD86IGJvb2xlYW4pIHtcbiAgICBpZiAocm93KSB7XG4gICAgICAvLyBpZiBjdXN0b20gc2VsZWN0IG1vZGUgaXMgb2ZmXG4gICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5maW5kKCc6Y2hlY2tib3gnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGFkZCBjbGFzc1xuICAgICAgICBqUXVlcnkocm93Lm5vZGUoKSkucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgICAvLyBnZXQgZmlyc3QgY29sdW1uIGtleVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLm5hbWU7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIGNvbnN0IGlkID0gZGF0YVtrZXldO1xuICAgICAgbGV0IGZpbmRJbmRleCA9IHRoaXMuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGlkO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmluZEluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoZmluZEluZGV4LCAxKTtcbiAgICAgICAgaWYgKHRoaXMuc21hcnRTZWxlY3QpIHtcbiAgICAgICAgICAvLyBhZGQgdGhpcyByb3cgdG8gdW5zZWxlY3RlZCByb3dzXG4gICAgICAgICAgZmluZEluZGV4ID0gdGhpcy51bnNlbGVjdGVkLmZpbmRJbmRleCgoeCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHhba2V5XSA9PT0gaWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGZpbmRJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMudW5zZWxlY3RlZC5wdXNoKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RBbnkoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgLy8gc2V0IHNtYXJ0IHNlbGVjdCBmbGFnXG4gICAgICB0aGlzLnNtYXJ0U2VsZWN0ID0gdHJ1ZTtcbiAgICAgIC8vIHNlbGVjdCBhbnkgcm93XG4gICAgICB0aGlzLmRhdGFUYWJsZS5yb3dzKCkuZXZlcnkoKGluZGV4OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhVGFibGUucm93KCBpbmRleCApO1xuICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3csIHRydWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBlbWl0IHNlbGVjdGlvbiBldmVudFxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdE5vbmUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgLy8gc2V0IHNtYXJ0IHNlbGVjdCBmbGFnXG4gICAgICB0aGlzLnNtYXJ0U2VsZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnVuc2VsZWN0ZWQuc3BsaWNlKDAsIHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgLy8gc2VsZWN0IGFueSByb3dcbiAgICAgIHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5ldmVyeSgoaW5kZXg6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3coIGluZGV4ICk7XG4gICAgICAgIHRoaXMudW5TZWxlY3RSb3cocm93LCB0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgLy8gZW1pdCBzZWxlY3Rpb24gZXZlbnRcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3RSb3cocm93OiBhbnkpIHtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIC8vIGdldCBmaXJzdCBjb2x1bW4ga2V5XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5IHx8IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ubmFtZTtcbiAgICAgIC8vIGdldCBpZFxuICAgICAgY29uc3QgaWQgPSBkYXRhW2tleV07XG4gICAgICAvLyBmaW5kIGlmIHJvdyBpcyBzZWxlY3RlZFxuICAgICAgY29uc3QgZmluZEluZGV4ID0gdGhpcy5zZWxlY3RlZC5maW5kKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGlkO1xuICAgICAgfSk7XG4gICAgICAvLyBpZiByb3cgaXMgc2VsZWN0ZWRcbiAgICAgIGlmIChmaW5kSW5kZXggPj0gMCkge1xuICAgICAgICAvLyB1bnNlbGVjdFxuICAgICAgICB0aGlzLnVuU2VsZWN0Um93KHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3cpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vaW5zcGVjdGlvbiBKU01ldGhvZENhbkJlU3RhdGljXG4gIC8qKlxuICAgKiBEYXRhdGFibGVzIGNvbHVtbiByZW5kZXJlciBmb3Igc2VsZWN0IGNoZWNrYm94XG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHBhcmFtIG1ldGFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX3JlbmRlclNlbGVjdChkYXRhLCB0eXBlLCByb3csIG1ldGEpIHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmICh0eXBlb2YgY29sdW1uLnNlbGVjdFRlbXBsYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbHVtbiwge1xuICAgICAgICBzZWxlY3RUZW1wbGF0ZTogdGVtcGxhdGUoYDxpbnB1dCBjbGFzcz1cImNoZWNrYm94IGNoZWNrYm94LXRoZW1lIHMtcm93XCIgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgaWQ9XCJzLSR7dGhpcy5faWR9LVxcJHttZXRhLnJvd31cIiBkYXRhLWlkPVwiXFwke2RhdGF9XCIgLz48bGFiZWwgZm9yPVwicy0ke3RoaXMuX2lkfS1cXCR7bWV0YS5yb3d9XCI+Jm5ic3A7PC9sYWJlbD5cbiAgICAgICAgYCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gcmVuZGVyIHRlbXBsYXRlXG4gICAgcmV0dXJuIGNvbHVtbi5zZWxlY3RUZW1wbGF0ZSh7XG4gICAgICBtZXRhLFxuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMubG9hZGluZy5lbWl0KHtcbiAgICAgICAgdGFyZ2V0OiB0aGlzXG4gICAgICB9KTtcbiAgICAgIC8vIHBhcnNlIHByb3BlcnRpZXNcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWcsICdzZWxlY3RhYmxlJykpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlID0gdGhpcy5jb25maWcuc2VsZWN0YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWcsICdtdWx0aXBsZVNlbGVjdCcpKSB7XG4gICAgICAgIHRoaXMubXVsdGlwbGVTZWxlY3QgPSB0aGlzLmNvbmZpZy5tdWx0aXBsZVNlbGVjdDtcbiAgICAgIH1cbiAgICAgIC8vIHByZXBhcmUgY29uZmlndXJhdGlvbiBmb3IgY29sdW1uc1xuICAgICAgY29uc3QgdGFibGVDb2x1bW5zID0gdGhpcy5jb25maWcuY29sdW1uc1xuICAgICAgICAvLyBmaWx0ZXIgYWN0aW9uIGxpbmsgY29sdW1uXG4gICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4uZm9ybWF0dGVyICYmIGNvbHVtbi5mb3JtYXR0ZXIgPT09ICdBY3Rpb25MaW5rRm9ybWF0dGVyJyAmJiB0aGlzLnNob3dBY3Rpb25zID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSkubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAvLyBjb252ZXJ0IGNvbHVtbiB0byBhZHZhbmNlIHRhYmxlIGNvbHVtblxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBDb2x1bW5Gb3JtYXR0ZXIodGhpcy5faW5qZWN0b3IpLCBjb2x1bW4pO1xuICAgICAgICB9KS5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbkRlZmluaXRpb24gPSB7XG4gICAgICAgICAgICBkYXRhOiBjb2x1bW4ucHJvcGVydHkgfHwgY29sdW1uLm5hbWUsXG4gICAgICAgICAgICBkZWZhdWx0Q29udGVudDogY29sdW1uLmhhc093blByb3BlcnR5KCdkZWZhdWx0Q29udGVudCcpID8gY29sdW1uLmRlZmF1bHRDb250ZW50IDogJycsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdG9yLnRyYW5zZm9ybShjb2x1bW4udGl0bGUpLFxuICAgICAgICAgICAgc29ydGFibGU6IGNvbHVtbi5oYXNPd25Qcm9wZXJ0eSgnc29ydGFibGUnKSA/IGNvbHVtbi5zb3J0YWJsZSA6IHRydWUsXG4gICAgICAgICAgICB2aXNpYmxlOiBjb2x1bW4uaGFzT3duUHJvcGVydHkoJ2hpZGRlbicpID8gIWNvbHVtbi5oaWRkZW4gOiB0cnVlLFxuICAgICAgICAgICAgbmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChjb2x1bW4uY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjb2x1bW4uY2xhc3NOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICBjbGFzc05hbWU6ICcnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXR0ZXJzKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogc3RyaW5nLCByb3c6IGFueSwgbWV0YTogYW55KSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGRhdGE7XG4gICAgICAgICAgICAgICAgY29sdW1uLmZvcm1hdHRlcnMuZm9yRWFjaCgoY29sdW1uRm9ybWF0dGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBzZWxmLl9jb2x1bW5Gb3JtYXR0ZXJzW2NvbHVtbkZvcm1hdHRlci5mb3JtYXR0ZXJdO1xuICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0U3RyaW5nID0gY29sdW1uRm9ybWF0dGVyLmZvcm1hdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZvcm1hdE9wdGlvbnMgPSBjb2x1bW5Gb3JtYXR0ZXIuZm9ybWF0T3B0aW9ucztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdHRlci5yZW5kZXIuYmluZChjb2x1bW4pKHJlc3VsdCwgdHlwZSwgcm93LCBtZXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZvcm1hdFN0cmluZztcbiAgICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZvcm1hdE9wdGlvbnM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29sdW1uIGZvcm1hdHRlcnMgZXhwb3J0IGNyZWF0ZWRDZWxsIGV2ZW50XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IGNvbHVtbi5mb3JtYXR0ZXJzLmZpbHRlcigoY29sdW1uRm9ybWF0dGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBjb2x1bW5Gb3JtYXR0ZXIuYWZ0ZXJSZW5kZXIgPT09ICdmdW5jdGlvbic7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgIGNyZWF0ZWRDZWxsKGNlbGw6IGFueSwgY2VsbERhdGE6IGFueSwgcm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKChjb2x1bW5Gb3JtYXR0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gc2VsZi5fY29sdW1uRm9ybWF0dGVyc1tjb2x1bW5Gb3JtYXR0ZXIuZm9ybWF0dGVyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLmFmdGVyUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyLmFmdGVyUmVuZGVyLmJpbmQoY29sdW1uKShjZWxsLCBjZWxsRGF0YSwgcm93RGF0YSwgcm93SW5kZXgsIGNvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2x1bW4uZm9ybWF0dGVyKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBzZWxmLl9jb2x1bW5Gb3JtYXR0ZXJzW2NvbHVtbi5mb3JtYXR0ZXJdO1xuICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZvcm1hdHRlci5yZW5kZXIuYmluZChjb2x1bW4pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb3JtYXR0ZXIgJiYgdHlwZW9mIGZvcm1hdHRlci5hZnRlclJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZvcm1hdHRlci5yZW5kZXIuYmluZChjb2x1bW4pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgICAgY3JlYXRlZENlbGw6IGZvcm1hdHRlci5hZnRlclJlbmRlci5iaW5kKGNvbHVtbiksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29sdW1uRGVmaW5pdGlvbjtcbiAgICAgICAgfSk7XG4gICAgICAvLyBnZXQgdGFibGUgZWxlbWVudFxuICAgICAgY29uc3QgdGFibGVFbGVtZW50ID0galF1ZXJ5KHRoaXMudGFibGUubmF0aXZlRWxlbWVudCk7XG4gICAgICBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbHVtbnMuYWRqdXN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxKTtcbiAgICAgIH0pO1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zaGFkb3dlZC12YXJpYWJsZVxuICAgICAgdGFibGVFbGVtZW50Lm9uKCdwcm9jZXNzaW5nLmR0JywgKGV2ZW50LCBzZXR0aW5ncywgcHJvY2Vzc2luZykgPT4ge1xuICAgICAgICBpZiAocHJvY2Vzc2luZykge1xuICAgICAgICAgIC8vIGNsZWFyIGVtcHR5IHRhYmxlIGVsZW1lbnRcbiAgICAgICAgICB0YWJsZUVsZW1lbnQuZmluZCgnLmRhdGFUYWJsZXNfZW1wdHknKS5odG1sKCcnKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRhYmxlRWxlbWVudC5hZGRDbGFzcygncHJvY2Vzc2luZycpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGFibGVFbGVtZW50LnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbGV0IGRyYXdJbmRleCA9IDE7XG4gICAgICB0YWJsZUVsZW1lbnQub24oJ29yZGVyLmR0JywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLmRhdGFUYWJsZS5vcmRlcigpO1xuICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0YWJsZUNvbHVtbnM7XG4gICAgICAgICAgaWYgKG9yZGVyICYmIG9yZGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5vcmRlci5lbWl0KG9yZGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLm9uKCdkcmF3LmR0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZHJhdy5lbWl0KCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgICAgIGNvbnN0IGluZm86IHsgcGFnZTogbnVtYmVyOyBwYWdlczogbnVtYmVyIH0gPSB0aGlzLmRhdGFUYWJsZS5wYWdlLmluZm8oKTtcbiAgICAgICAgICB0aGlzLnBhZ2UuZW1pdChpbmZvKTtcbiAgICAgICAgICBpZiAoZHJhd0luZGV4ID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZHJhd0luZGV4Kys7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHt0aGlzLmRhdGFUYWJsZS5jb2x1bW5zLmFkanVzdCgpOyB9LCAxKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0VSUk9SJywgJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIGFkanVzdGluZyB0YWJsZSBjb2x1bW5zJyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gYWxsb3cgc2VsZWN0aW9uXG4gICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICAgIC8vIGdldCBmaXJzdCBjb2x1bW4gKGFzIHJvdyBwcmltYXJ5IGtleSlcbiAgICAgICAgLy8gdG9kbzo6YWxsb3cgcm93IHByaW1hcnkga2V5IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgY29uc3QgZmlyc3RDb2x1bW4gPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdO1xuICAgICAgICAvLyBhZGQgc2VsZWN0IGNvbHVtblxuICAgICAgICBjb25zdCBzZWxlY3RDb2x1bW5EZWZpbml0aW9uID0ge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ3RleHQtY2VudGVyIHBsLTQgcHItMCcsXG4gICAgICAgICAgZGF0YTogZmlyc3RDb2x1bW4ucHJvcGVydHkgfHwgZmlyc3RDb2x1bW4ubmFtZSxcbiAgICAgICAgICBkZWZhdWx0Q29udGVudDogJycsXG4gICAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2aXNpYmxlOiAhdGhpcy5jdXN0b21TZWxlY3QsXG4gICAgICAgICAgbmFtZTogZmlyc3RDb2x1bW4ubmFtZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gYXNzaWduIHJlbmRlcmVyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2VsZWN0Q29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgIHJlbmRlcjogdGhpcy5fcmVuZGVyU2VsZWN0LmJpbmQodGhpcyksXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhbmQgZmluYWxseSBhZGQgY29sdW1uXG4gICAgICAgIHRhYmxlQ29sdW1ucy51bnNoaWZ0KHNlbGVjdENvbHVtbkRlZmluaXRpb24pO1xuICAgICAgICAvLyB1c2VyIGludGVyZmFjZSBhZGRpdGlvbnNcbiAgICAgICAgLy8gaGFuZGxlIHBhZ2UgY2hhbmdlIGV2ZW50IChhIHRyaWNrIGZvciBmaXJpbmcgZHJhdy5kdCBldmVudHMpXG4gICAgICAgIHRhYmxlRWxlbWVudFxuICAgICAgICAgIC8vIGhhbmRsZSBkcmF3IGV2ZW50c1xuICAgICAgICAgIC5vbignZHJhdy5kdCcsICgpID0+IHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tU2VsZWN0KSB7XG4gICAgICAgICAgICAgIC8vIGVuYWJsZSByb3cgc2VsZWN0aW9uIGV2ZW50XG4gICAgICAgICAgICAgIHRhYmxlRWxlbWVudC5maW5kKCd0Ym9keScpLm9uKCdjbGljaycsICd0cicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIHNlbGVjdCByb3dcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBzZWxmLmRhdGFUYWJsZS5yb3codGhpcyk7XG4gICAgICAgICAgICAgICAgLy8gYWRkIHJvd1xuICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0LmVtaXQocm93KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRhYmxlRWxlbWVudC5maW5kKCdpbnB1dC5zLXJvdycpO1xuICAgICAgICAgICAgZWxlbWVudHMub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAvLyBtYWtlIHNlbGVjdGlvbiBvbiBjdXJyZW50IHBhZ2VcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ucHJvcGVydHk7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIC8vIGVudW1lcmF0ZSBzZWxlY3RlZCBpdGVtc1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBmaW5kIHJvdyBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBpdGVtW2tleV07XG4gICAgICAgICAgICAgICAgLy8gaWYgaWRlbnRpZmllciBpcyBkZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIGNoZWNrIGVsZW1lbnQgd2l0aCB0aGlzIGlkZW50aWZpZXIgaW4gYXR0cmlidXRlIGRhdGEtaWRcbiAgICAgICAgICAgICAgICAgIHRhYmxlRWxlbWVudC5maW5kKGBpbnB1dFtkYXRhLWlkPScke2lkfSddYCkucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zbWFydFNlbGVjdCkge1xuICAgICAgICAgICAgICAvLyBzZWxlY3Qgcm93cyB0aGF0IGFyZSBub3Qgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgLy8gYW5kIGRvIG5vdCBpbmNsdWRlZCBpbiB1bnNlbGVjdGVkIGNvbGxlY3Rpb25cbiAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoJ2lucHV0W2RhdGEtaWRdJykuZWFjaCgoaW5kZXgsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgZGF0YSBpZFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHhba2V5XSA9PSBqUXVlcnkoZWxlbWVudCkuYXR0cignZGF0YS1pZCcpO1xuICAgICAgICAgICAgICAgIH0pIDwgMCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RSb3codGhpcy5kYXRhVGFibGUucm93KGluZGV4KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoJ2lucHV0W2RhdGEtaWRdJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZVxuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgIC8vIHNldCBsZW5ndGggbWVudVxuICAgICAgICBsZW5ndGhNZW51OiBbNSwgMTAsIDUwLCAxMDAsIDIwMCwgNTAwXSxcbiAgICAgICAgLy8gaGlkZSBsZW5ndGggbWVudVxuICAgICAgICBsZW5ndGhDaGFuZ2U6IGZhbHNlLFxuICAgICAgICAvLyBlbmFibGUgc2VhcmNoIGJ1dCBoaWRlIHNlYXJjaCBib3ggKGNzcylcbiAgICAgICAgc2VhcmNoaW5nOiB0cnVlLFxuICAgICAgICAvLyBlbmFibGUgZGF0YSBwcm9jZXNzaW5nXG4gICAgICAgIHByb2Nlc3Npbmc6IHRydWUsXG4gICAgICAgIC8vIGVuYWJsZSBnZXR0aW5nIHNlcnZlciBzaWRlIGRhdGFcbiAgICAgICAgc2VydmVyU2lkZTogdGhpcy5zZXJ2ZXJTaWRlLFxuICAgICAgICAvLyBlbnVtZXJhdGUgdGFibGUgY29sdW1uc1xuICAgICAgICBjb2x1bW5zOiB0YWJsZUNvbHVtbnMsXG4gICAgICAgIGNvbFJlb3JkZXI6ICB0aGlzLmNvbHVtbk9yZGVyaW5nLFxuICAgICAgICBvcmRlcjogW10sXG4gICAgICAgIC8vIHNldCBzY3JvbGwgeFxuICAgICAgICBzY3JvbGxYOiB0aGlzLnNjcm9sbFgsXG4gICAgICAgIGRvbTogJ0JmcnRpcCcsXG4gICAgICAgIGF1dG9XaWR0aDogZmFsc2UsXG4gICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleHRlbmQ6ICdleGNlbCcsXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5jb25maWcudGl0bGUsXG4gICAgICAgICAgICBjbGFzc05hbWU6ICdkLW5vbmUnLFxuICAgICAgICAgICAgZXhwb3J0T3B0aW9uczoge1xuICAgICAgICAgICAgICBjb2x1bW5zOiAndGg6bm90KDpmaXJzdC1jaGlsZCknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICAvLyBkZWZpbmUgc2VydmVyIGRhdGEgY2FsbGJhY2tcbiAgICAgICAgZm5TZXJ2ZXJEYXRhKHNTb3VyY2U6IGFueSwgYW9EYXRhOiBhbnksIGZuQ2FsbGJhY2s6IGFueSwgb1NldHRpbmdzOiBhbnkpIHtcbiAgICAgICAgICAvLyBpZiBtZXRob2QgaXMgaW52b2tlZCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICBpZiAoc2VsZi5fZmlyc3RMb2FkKSB7XG4gICAgICAgICAgICAvLyBkaXNhYmxlZCBmaXJzdCBsb2FkIGZsYWdcbiAgICAgICAgICAgIHNlbGYuX2ZpcnN0TG9hZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gaWYgYXV0byBsb2FkIGlzIGRpc2FibGVkXG4gICAgICAgICAgICBpZiAoc2VsZi5hdXRvTG9hZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW1wdHlEYXRhU2V0ID0ge1xuICAgICAgICAgICAgICAgIHJlY29yZHNUb3RhbDogMCxcbiAgICAgICAgICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IDAsXG4gICAgICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHNlbGYuX2xhc3RRdWVyeVRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgICAgICAvLyBlbWl0IGVtcHR5IGRhdGFcbiAgICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoZW1wdHlEYXRhU2V0KTtcbiAgICAgICAgICAgICAgLy8gcmV0dXJuIGVtcHR5IGRhdGFcbiAgICAgICAgICAgICAgcmV0dXJuIGZuQ2FsbGJhY2soZW1wdHlEYXRhU2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcmVzZXQgZXJyb3JcbiAgICAgICAgICBzZWxmLnRvZ2dsZUVycm9yKCk7XG4gICAgICAgICAgLy8gZ2V0IGFjdGl2YXRlZCByb3V0ZSBwYXJhbXNcbiAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHNlbGYuX2FjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zO1xuICAgICAgICAgIC8vIGdldCBjb2x1bW5zXG4gICAgICAgICAgY29uc3QgY29sdW1ucyA9IGFvRGF0YVsxXS52YWx1ZTtcbiAgICAgICAgICAvLyBnZXQgb3JkZXIgZXhwcmVzc2lvblxuICAgICAgICAgIGNvbnN0IG9yZGVyID0gYW9EYXRhWzJdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBza2lwIHJlY29yZHMgcGFyYW1cbiAgICAgICAgICBjb25zdCBza2lwID0gYW9EYXRhWzNdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBwYWdlIHNpemUgcGFyYW1cbiAgICAgICAgICBjb25zdCB0b3AgPSBhb0RhdGFbNF0udmFsdWU7XG4gICAgICAgICAgLy8gZ2V0IHNlYXJjaCB2YWx1ZVxuICAgICAgICAgIGNvbnN0IHNlYXJjaCA9IGFvRGF0YVs1XS52YWx1ZTtcbiAgICAgICAgICAvLyBnZXQgZGF0YSBxdWVyeWFibGVcbiAgICAgICAgICBjb25zdCBxID0gc2VsZi5fcXVlcnkgaW5zdGFuY2VvZiBDbGllbnREYXRhUXVlcnlhYmxlID8gc2VsZi5fcXVlcnkgOiBzZWxmLl9jb250ZXh0Lm1vZGVsKHNlbGYuY29uZmlnLm1vZGVsKS5hc1F1ZXJ5YWJsZSgpO1xuICAgICAgICAgIC8vIGFwcGx5IHBhZ2luZyBwYXJhbXNcbiAgICAgICAgICBpZiAodG9wKSB7XG4gICAgICAgICAgICBxLnRha2UodG9wKS5za2lwKHNraXApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBhcHBseSBvcmRlciBwYXJhbXNcbiAgICAgICAgICBpZiAob3JkZXIgJiYgb3JkZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBnZXQgb3JkZXIgcXVlcnkgZXhwcmVzc2lvblxuICAgICAgICAgICAgY29uc3Qgb3JkZXJCeVN0ciA9IG9yZGVyLm1hcCgoZXhwcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGxldCBjb2x1bW5JbmRleDogbnVtYmVyO1xuICAgICAgICAgICAgICBpZiAoc2VsZi5jb2x1bW5PcmRlcmluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IGV4cHIuY29sdW1uO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY3VycmVudCBjb2x1bW4gb3JkZXIgKGZyb20gY29sUmVvcmRlcilcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5PcmRlcjogbnVtYmVyW10gPSBzZWxmLmRhdGFUYWJsZS5jb2xSZW9yZGVyLm9yZGVyKCk7XG4gICAgICAgICAgICAgICAgLy8gYW5kIG1hdGNoIHRoZSBkYXRhVGFibGUgaW5kZXggdG8gdGhlIGNvbmZpZyBjb2x1bW5zIGluZGV4XG4gICAgICAgICAgICAgICAgLy8gZXhwci5jb2x1bW4gc2hvdWxkIGFsd2F5cyBiZSB2YWxpZCAoZS5nLiBpbiByYW5nZSksIGJ1dCBwZXJmb3JtIGEgbWlub3IgdmFsaWRhdGlvblxuICAgICAgICAgICAgICAgIGlmIChleHByLmNvbHVtbiA+PSAwICYmIGV4cHIuY29sdW1uIDwgY29sdW1uT3JkZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IGNvbHVtbk9yZGVyW2V4cHIuY29sdW1uXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBmaXJzdCBjb2x1bW4gYXMgYSBmYWxsYmFjayAod29uJ3QgaGFwcGVuLCBqdXN0IGZvciBzYWZldHkpXG4gICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0YWJsZUNvbHVtbnNbY29sdW1uSW5kZXhdLm5hbWUgKyAnICcgKyBleHByLmRpciB8fCAnYXNjJztcbiAgICAgICAgICAgIH0pLmpvaW4oJywnKTtcbiAgICAgICAgICAgIC8vIHNldCBvcmRlclxuICAgICAgICAgICAgcS5zZXRQYXJhbSgnJG9yZGVyYnknLCBvcmRlckJ5U3RyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5zdGF0ZUxvYWRDYWxsYmFjayhudWxsLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSAkc2VsZWN0IHBhcmFtZXRlclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ID0gc2VsZi5jb25maWcuY29sdW1ucy5maWx0ZXIoIChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbi52aXJ0dWFsID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb2x1bW4ub3B0aW9uYWwgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuY29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0YWJsZUNvbHVtbnMuZmluZEluZGV4KCh0YWJsZUNvbHVtbikgPT4gdGFibGVDb2x1bW4ubmFtZSA9PT0gY29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmNvbHVtbnNbaW5kZXhdLnZpc2libGU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb2x1bW4ucHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLm5hbWUgKyAnIGFzICcgKyBjb2x1bW4ucHJvcGVydHk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5uYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHEuc2VsZWN0LmFwcGx5KHEsIHNlbGVjdCk7XG4gICAgICAgICAgICAvLyBjb25maWd1cmUgJGZpbHRlclxuICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLiRmaWx0ZXIgJiYgcXVlcnlQYXJhbXMuJGZpbHRlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgLy8gc2V0IHJvdXRlIGZpbHRlclxuICAgICAgICAgICAgICBjb25zdCBxUGFyYW1zID0gcS5nZXRQYXJhbXMoKTtcbiAgICAgICAgICAgICAgcS5zZXRQYXJhbSgnJGZpbHRlcicsIG51bGwpO1xuICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9ucyA9IFsgcXVlcnlQYXJhbXMuJGZpbHRlciBdO1xuICAgICAgICAgICAgICBpZiAocVBhcmFtcy4kZmlsdGVyKSB7IGV4cHJlc3Npb25zLnB1c2goJygnICsgcVBhcmFtcy4kZmlsdGVyICsgJyknICk7IH1cbiAgICAgICAgICAgICAgcS5maWx0ZXIoZXhwcmVzc2lvbnMuam9pbignIGFuZCAnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBxdWVyeSBwYXJhbWV0ZXJzIGNvbnRhaW4gZmlsdGVyXG4gICAgICAgICAgICBpZiAocXVlcnlQYXJhbXMuJGV4cGFuZCAmJiBxdWVyeVBhcmFtcy4kZXhwYW5kLmxlbmd0aCkge1xuICAgICAgICAgICAgICAvLyBzZXQgcm91dGUgJGV4cGFuZFxuICAgICAgICAgICAgICBxLnNldFBhcmFtKCckZXhwYW5kJywgcXVlcnlQYXJhbXMuJGV4cGFuZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYuY29uZmlnICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzLmV4cGFuZCkge1xuICAgICAgICAgICAgICBxLnNldFBhcmFtKCckZXhwYW5kJywgc2VsZi5jb25maWcuZGVmYXVsdHMuZXhwYW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcS5nZXRQYXJhbXMoKVsnJG9yZGVyYnknXSAmJiBzZWxmLmNvbmZpZyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cy5vcmRlckJ5KSB7XG4gICAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRvcmRlcmJ5Jywgc2VsZi5jb25maWcuZGVmYXVsdHMub3JkZXJCeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VsZi5jb25maWcgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMuZ3JvdXBCeSkge1xuICAgICAgICAgICAgICBxLnNldFBhcmFtKCckZ3JvdXBieScsIHNlbGYuY29uZmlnLmRlZmF1bHRzLmdyb3VwQnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXBwZW5kIGRlZmF1bHQgZmlsdGVyXG4gICAgICAgICAgICBpZiAoc2VsZi5jb25maWcgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMuZmlsdGVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXIuYXN5bmNCdWlsZEZpbHRlcihzZWxmLmNvbmZpZy5kZWZhdWx0cy5maWx0ZXIpLnRoZW4oKGRlZmF1bHRGaWx0ZXJTdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdEZpbHRlclN0cmluZykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcVBhcmFtcyA9IHEuZ2V0UGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgICBxLnNldFBhcmFtKCckZmlsdGVyJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9ucyA9IFsgZGVmYXVsdEZpbHRlclN0cmluZyBdO1xuICAgICAgICAgICAgICAgICAgaWYgKHFQYXJhbXMuJGZpbHRlcikgeyBleHByZXNzaW9ucy5wdXNoKCcoJyArIHFQYXJhbXMuJGZpbHRlciArICcpJyApOyB9XG4gICAgICAgICAgICAgICAgICBxLmZpbHRlcihleHByZXNzaW9ucy5qb2luKCcgYW5kICcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VsZi5sYXN0UXVlcnlQYXJhbXMgPSBxLmdldFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBxLmdldExpc3QoKS50aGVuKChpdGVtcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2V0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHNUb3RhbDogaXRlbXMudG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiBpdGVtcy50b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBpdGVtcy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGFzdFF1ZXJ5VG90YWxJdGVtcyA9IGl0ZW1zLnRvdGFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXMudG90YWwgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc2V0RW1wdHlUYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtaXQgbG9hZCBldmVudFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWQuZW1pdChkYXRhU2V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuQ2FsbGJhY2soZGF0YVNldCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBsb2cgZXJyb3IgdG8gY29uc29sZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RBQkxFUycsIGVycik7XG4gICAgICAgICAgICAgICAgLy8gc2hvdyBlcnJvclxuICAgICAgICAgICAgICAgIHNlbGYudG9nZ2xlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICBzZWxmLl9sYXN0UXVlcnlUb3RhbEl0ZW1zID0gMDtcbiAgICAgICAgICAgICAgICAvLyBieSByZXR1cm5pbmcgZW1wdHkgZGF0YXNldFxuICAgICAgICAgICAgICAgIHNlbGYubG9hZC5lbWl0KEVNUFRZX0RBVEFTRVQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmbkNhbGxiYWNrKEVNUFRZX0RBVEFTRVQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYubGFzdFF1ZXJ5UGFyYW1zID0gcS5nZXRQYXJhbXMoKTtcbiAgICAgICAgICAgIHEuZ2V0TGlzdCgpLnRoZW4oKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXQgPSB7XG4gICAgICAgICAgICAgICAgcmVjb3Jkc1RvdGFsOiBpdGVtcy50b3RhbCxcbiAgICAgICAgICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IGl0ZW1zLnRvdGFsLFxuICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW1zLnZhbHVlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBzZWxmLl9sYXN0UXVlcnlUb3RhbEl0ZW1zID0gaXRlbXMudG90YWw7XG4gICAgICAgICAgICAgIGlmIChpdGVtcy50b3RhbCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHNlbGYucmVzZXRFbXB0eVRhYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZW1pdCBsb2FkIGV2ZW50XG4gICAgICAgICAgICAgIHNlbGYubG9hZC5lbWl0KGRhdGFTZXQpO1xuICAgICAgICAgICAgICAvLyByZXR1cm4gZGF0YVxuICAgICAgICAgICAgICByZXR1cm4gZm5DYWxsYmFjayhkYXRhU2V0KTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgLy8gbG9nIGVycm9yIHRvIGNvbnNvbGVcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVEFCTEVTJywgZXJyKTtcbiAgICAgICAgICAgICAgLy8gc2hvdyBlcnJvclxuICAgICAgICAgICAgICBzZWxmLnRvZ2dsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgIC8vIGJ5IHJldHVybmluZyBlbXB0eSBkYXRhc2V0XG4gICAgICAgICAgICAgIHNlbGYubG9hZC5lbWl0KEVNUFRZX0RBVEFTRVQpO1xuICAgICAgICAgICAgICByZXR1cm4gZm5DYWxsYmFjayhFTVBUWV9EQVRBU0VUKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBsYW5ndWFnZTogT2JqZWN0LmFzc2lnbih7IH0sIHNlbGYudHJhbnNsYXRvci50cmFuc2Zvcm0oJ1RhYmxlcy5EYXRhVGFibGUnKSxcbiAgICAgICAgICB7ZW1wdHlUYWJsZTogJyAnIH0pLFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc3RhdGVTZXR0aW5ncyA9IHtcbiAgICAgICAgc3RhdGVTYXZlOiB0aGlzLnN0YXRlU2F2ZVxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLnN0YXRlTG9hZENhbGxiYWNrKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGVTZXR0aW5ncywge1xuICAgICAgICAgIHN0YXRlTG9hZENhbGxiYWNrOiB0aGlzLnN0YXRlTG9hZENhbGxiYWNrXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhdGVTYXZlQ2FsbGJhY2spIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZVNldHRpbmdzLCB7XG4gICAgICAgICAgc3RhdGVTYXZlQ2FsbGJhY2s6IHRoaXMuc3RhdGVTYXZlQ2FsbGJhY2tcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzLCBzdGF0ZVNldHRpbmdzKTtcblxuICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZSkge1xuICAgICAgICAvLyBzZXQgY29udGludW91cyBzY3JvbGxpbmdcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5ncywge1xuICAgICAgICAgIHNjcm9sbFk6IHRoaXMuc2Nyb2xsWSxcbiAgICAgICAgICBzY3JvbGxDb2xsYXBzZTogZmFsc2UsXG4gICAgICAgICAgc2Nyb2xsZXI6IHtcbiAgICAgICAgICAgIGxvYWRpbmdJbmRpY2F0b3I6IGZhbHNlLFxuICAgICAgICAgICAgZGlzcGxheUJ1ZmZlcjogMTAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzLCB7XG4gICAgICAgICAgc2Nyb2xsWTogdGhpcy5zY3JvbGxZLFxuICAgICAgICAgIHBhZ2luZzogdGhpcy5wYWdpbmcsXG4gICAgICAgICAgcGFnZUxlbmd0aDogdGhpcy5wYWdlTGVuZ3RoLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcblxuICAgICAgfVxuICAgICAgLy8gaGFuZGxlIGluaXQuZHQgZXZlbnQgYW5kIGVtaXQgbG9jYWwgZXZlbnRcbiAgICAgIHRoaXMuZGF0YVRhYmxlID0gdGFibGVFbGVtZW50Lm9uKCdpbml0LmR0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHNjcm9sbGVyID0galF1ZXJ5KGV2ZW50LnRhcmdldCkucGFyZW50KCk7XG4gICAgICAgIC8vIGhhbmRsZSBzY3JvbGxpbmdcbiAgICAgICAgc2Nyb2xsZXIub24oJ3Njcm9sbCcsIChzY3JvbGxFdmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGpRdWVyeShzY3JvbGxFdmVudC50YXJnZXQpO1xuICAgICAgICAgIGNvbnN0IHRvcCA9IHRhcmdldC5zY3JvbGxUb3AoKTtcbiAgICAgICAgICBjb25zdCBsZWZ0ID0gdGFyZ2V0LnNjcm9sbExlZnQoKTtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsLmVtaXQoe1xuICAgICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICAgIGxlZnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KS5EYXRhVGFibGUoc2V0dGluZ3MpO1xuICAgICAgdGhpcy5pbml0LmVtaXQoKTtcbiAgICAgIC8vIHNob3cgb3IgaGlkZSBoZWFkZXJcbiAgICAgIGlmICghdGhpcy5zaG93SGVhZGVyKSB7XG4gICAgICAgICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlPnRoZWFkJykuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlJykuY2xhc3NMaXN0LmFkZCgnbXQtMicpO1xuICAgICAgfVxuXG4gICAgICAvLyBzaG93IG9yIGhpZGUgZm9vdGVyXG4gICAgICBpZiAoIXRoaXMuc2hvd0Zvb3Rlcikge1xuICAgICAgICAoIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudClcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZXNfaW5mbycpLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgfVxuICAgICAgLy8gc2hvdyBvciBoaWRlIHBhZ2VyXG4gICAgICBpZiAodGhpcy5zaG93UGFnaW5nKSB7XG4gICAgICAgIHRoaXMuc2hvd1BhZ2luZyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsVG9wKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLnBhcmVudCgpLnNjcm9sbFRvcCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsTGVmdCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5wYXJlbnQoKS5zY3JvbGxMZWZ0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbGFzdFF1ZXJ5KCk6IENsaWVudERhdGFRdWVyeWFibGUge1xuICAgIGlmICh0aGlzLmNvbmZpZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFzdFF1ZXJ5UGFyYW1zID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBxID0gdGhpcy5fY29udGV4dC5tb2RlbCh0aGlzLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmxhc3RRdWVyeVBhcmFtcykuZm9yRWFjaCggKGtleSkgPT4ge1xuICAgICAgcS5zZXRQYXJhbShrZXksIHRoaXMubGFzdFF1ZXJ5UGFyYW1zW2tleV0pO1xuICAgIH0pO1xuICAgIC8vIHJldHVybiBxdWVyeVxuICAgIHJldHVybiBxO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIHVwZGF0ZXMgYSBzaW5nbGUgcm93XG4gICAqIEBwYXJhbSBmaW5kIC0gQW55IG9iamVjdCB3aGljaCBpcyBiZWluZyBjb252ZXJ0ZWQgdG8gYSBxdWVyeVxuICAgKi9cbiAgcHVibGljIGZldGNoT25lKGZpbmQ6IGFueSkge1xuICAgIGlmIChmaW5kID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlID09IG51bGwpIHtcbiAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYXN0UXVlcnlQYXJhbXMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBnZXQgcm93c1xuICAgIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5kYXRhKCkpO1xuICAgIGlmIChyb3dzICYmIHJvd3MubGVuZ3RoKSB7XG4gICAgICAvLyBmaW5kIHJlc3VsdFxuICAgICAgY29uc3QgZmluZEtleXMgPSBPYmplY3Qua2V5cyhmaW5kKTtcbiAgICAgIGlmIChmaW5kS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBmaW5kIHJvdyBpbmRleCBieSBzZWFyY2hpbmcgZWFjaCBwcm9wZXJ0eVxuICAgICAgY29uc3Qgcm93SW5kZXggPSByb3dzLmZpbmRJbmRleCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpbmRLZXlzLm1hcCggKGtleSkgPT4ge1xuICAgICAgICAgIHJldHVybiByb3dba2V5XSA9PT0gZmluZFtrZXldO1xuICAgICAgICB9KS5maWx0ZXIoIChyZXMpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzID09PSBmYWxzZTtcbiAgICAgICAgfSkubGVuZ3RoID09PSAwO1xuICAgICAgfSk7XG4gICAgICAvLyBpZiByb3cgaGFzIGJlZW4gZm91bmRcbiAgICAgIGlmIChyb3dJbmRleCA+PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5fY29udGV4dC5tb2RlbCh0aGlzLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICAgICAgLy8gc2VsZWN0IGF0dHJpYnV0ZXNcbiAgICAgICAgcXVlcnkuc2V0UGFyYW0oJyRzZWxlY3QnLCB0aGlzLmxhc3RRdWVyeVBhcmFtcy4kc2VsZWN0KTtcbiAgICAgICAgaWYgKHRoaXMubGFzdFF1ZXJ5UGFyYW1zLiRleHBhbmQpIHtcbiAgICAgICAgICAvLyBhcHBseSBleHBhbmQgYXR0cmlidXRlc1xuICAgICAgICAgIHF1ZXJ5LnNldFBhcmFtKCckZXhwYW5kJywgdGhpcy5sYXN0UXVlcnlQYXJhbXMuJGV4cGFuZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXBwbHkgZmlsdGVyIGZvciByb3dcbiAgICAgICAgZmluZEtleXMuZm9yRWFjaCggKGtleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29uZmlnLmNvbHVtbnMuZmluZCggKGNvbCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbC5wcm9wZXJ0eSA9PT0ga2V5IHx8IGNvbC5uYW1lID09PSBrZXk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgLy8gZ2V0IHByb3BlcnR5IG9yIG5hbWVcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gY29sdW1uLnByb3BlcnR5IHx8IGNvbHVtbi5uYW1lO1xuICAgICAgICAgICAgcXVlcnkuYW5kKHByb3BlcnR5KS5lcXVhbChmaW5kW2tleV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWVyeS5hbmQoa2V5KS5lcXVhbChmaW5kW2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFuZCBmaW5hbGx5IGdldCBpdGVtXG4gICAgICAgIHJldHVybiBxdWVyeS5nZXRJdGVtKCkudGhlbiggKGl0ZW0pID0+IHtcbiAgICAgICAgICAvLyBpZiBpdGVtIGV4aXN0c1xuICAgICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZGF0YVRhYmxlLnJvdyhyb3dJbmRleCk7XG4gICAgICAgICAgY29uc3QgY2hlY2tlZCA9IGpRdWVyeShyb3cubm9kZSgpKS5maW5kKCc6Y2hlY2tib3gnKS5wcm9wKCdjaGVja2VkJyk7XG4gICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIC8vIHJlZHJhdyByb3dcbiAgICAgICAgICAgIHJvdy5kYXRhKGl0ZW0pO1xuICAgICAgICAgICAgalF1ZXJ5KHJvdy5ub2RlKCkpLmZpbmQoJzpjaGVja2JveCcpLm9mZignY2xpY2snKS5vbignY2xpY2snLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgLy8gaWYgcm93IGlzIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0Um93KHJvdywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWxvYWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucmVsb2FkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzZWxlY3Rpb24gY2hhbmdlXG4gICAqIEBwYXJhbSAkZXZlbnRcbiAgICovXG4gIHB1YmxpYyBvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dCA9ICAkZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgLy8gZ2V0IHJvdyBmcm9tIGlkXG4gICAgY29uc3Qgcm93SW5kZXggPSBwYXJzZUludCgvLShcXGQrKSQvZy5leGVjKGlucHV0LmlkKVsxXSwgMTApO1xuICAgIC8vIGdldCByb3dcbiAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3cocm93SW5kZXgpLmRhdGEoKTtcbiAgICAvLyBnZXQgcm93IGlkZW50aWZpZXJcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5O1xuICAgICAgY29uc3QgaWQgPSByb3dba2V5XTtcbiAgICAgIGxldCBmaW5kSXRlbUluZGV4ID0gdGhpcy5zZWxlY3RlZC5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW1ba2V5XSA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChpbnB1dC5jaGVja2VkKSB7XG4gICAgICAgIGlmIChmaW5kSXRlbUluZGV4IDwgMCkge1xuICAgICAgICAgIC8vIGFkZCByb3cgdG8gc2VsZWN0ZWQgcm93c1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQucHVzaChyb3cpO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmluZEl0ZW1JbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIGl0ZW1cbiAgICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZShmaW5kSXRlbUluZGV4LCAxKTtcbiAgICAgICAgICBpZiAodGhpcy5zbWFydFNlbGVjdCkge1xuICAgICAgICAgICAgLy8gYWRkIHJvdyB0byB1bnNlbGVjdGVkIHJvd3NcbiAgICAgICAgICAgIGZpbmRJdGVtSW5kZXggPSB0aGlzLnVuc2VsZWN0ZWQuZmluZEluZGV4KChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtW2tleV0gPT09IGlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZmluZEl0ZW1JbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgdGhpcy51bnNlbGVjdGVkLnB1c2gocm93KTtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEVtcHR5VGFibGUoKSB7XG4gICAgLy8gdGhpcyBvcGVyYXRpb24gaXMgaW1wb3J0YW50XG4gICAgLy8gZHVlIHRvIG5nIGRhdGEgYmluZGluZ1xuICAgIC8vIGVtcHR5IHRhYmxlIHRlbXBsYXRlIGhhcyBubyB0cmFuc2xhdGVkIHRleHQgZHVyaW5nIG5nT25Jbml0KClcbiAgICBpZiAodGhpcy5kYXRhVGFibGUgJiYgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXSkge1xuICAgICAgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc0VtcHR5VGFibGUgPVxuICAgICAgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gdGhpcy5lbXB0eVRhYmxlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdG9nZ2xlRXJyb3IoZXJyPzogYW55KSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0pIHtcbiAgICAgIGNvbnN0IGlubmVyTWVzc2FnZSA9ICh0aGlzLmVycm9yVGVtcGxhdGUubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NtYWxsJykuaXRlbSgwKTtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdGhpcy5sYXN0RXJyb3IgPSBlcnI7XG4gICAgICAgIGlmIChpbm5lck1lc3NhZ2UpIHtcbiAgICAgICAgICBpbm5lck1lc3NhZ2UuaW5uZXJIVE1MID0gZXJyLmVycm9yICYmIGVyci5lcnJvci5tZXNzYWdlID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBlcnIubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLm9MYW5ndWFnZS5zRW1wdHlUYWJsZSA9XG4gICAgICB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLm9MYW5ndWFnZS5zWmVyb1JlY29yZHMgPSB0aGlzLmVycm9yVGVtcGxhdGUubmF0aXZlRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5uZXJNZXNzYWdlKSB7XG4gICAgICAgICAgaW5uZXJNZXNzYWdlLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNFbXB0eVRhYmxlID0gdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckVtcHR5VGFibGUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0pIHtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNFbXB0eVRhYmxlID0gdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGV4cG9ydCgpIHtcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kdC1idXR0b25zIC5idXR0b25zLWV4Y2VsJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWxlbWVudC5jbGljaygpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUNvbHVtbnMoY29sdW1uc1RvU2hvdykge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5kYXRhVGFibGU7XG4gICAgdGhpcy5jb25maWcuY29sdW1ucy5zbGljZSgxKS5mb3JFYWNoKChjb2x1bW4sIGkpID0+IHtcbiAgICAgIGlmICghY29sdW1uLmhpZGRlbikge1xuICAgICAgICBpZiAoY29sdW1uc1RvU2hvdy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgICAvLyBub2luc3BlY3Rpb24gVHlwZVNjcmlwdFZhbGlkYXRlSlNUeXBlc1xuICAgICAgICAgIHRhYmxlLmNvbHVtbihjb2x1bW4ubmFtZSArICc6bmFtZScpLnZpc2libGUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIFR5cGVTY3JpcHRWYWxpZGF0ZUpTVHlwZXNcbiAgICAgICAgICB0YWJsZS5jb2x1bW4oY29sdW1uLm5hbWUgKyAnOm5hbWUnKS52aXNpYmxlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2hhbmdlcywgJ2NvbmZpZ1NyYycpKSB7XG4gICAgICBpZiAoY2hhbmdlcy5jb25maWdTcmMgIT0gbnVsbCkge1xuICAgICAgICAvLyBsb2FkIHRhYmxlIGNvbmZpZ3VyYXRpb24gb24gY2hhbmdlXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdHJpcGxlLWVxdWFsc1xuICAgICAgICBpZiAoY2hhbmdlcy5jb25maWdTcmMuY3VycmVudFZhbHVlICYmIChjaGFuZ2VzLmNvbmZpZ1NyYy5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcy5jb25maWdTcmMucHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLl9odHRwLmdldChjaGFuZ2VzLmNvbmZpZ1NyYy5jdXJyZW50VmFsdWUpLnRvUHJvbWlzZSgpLnRoZW4oKGNvbmZpZzogVGFibGVDb25maWd1cmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAvLyBzZXQgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIC8vIGZldGNoIGFuZCByZWRyYXdcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goKTtcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUQUJMRVMnLCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0YWJsZSBjb25maWd1cmF0aW9uLicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0KGxvYWQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeSA9IG51bGw7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5hdXRvTG9hZCA9ICEhbG9hZDtcbiAgICB0aGlzLm5nT25Jbml0KCk7XG4gIH1cblxuICBzZWxlY3RDb2x1bW5zKCkge1xuICAgIC8vIGdldCBjb2x1bW4gb3JkZXIgZS5nLiBbMCwgNCwgMSwgMiwgM11cbiAgICBjb25zdCBjb2x1bW5PcmRlcjogbnVtYmVyW10gPSB0aGlzLmRhdGFUYWJsZS5jb2xSZW9yZGVyLm9yZGVyKCk7XG4gICAgLy8gZ2V0IGNvbHVtbiBkZWZpbml0aW9uc1xuICAgIGNvbnN0IGNvbHVtbkRlZnMgPSB0aGlzLmRhdGFUYWJsZS5zZXR0aW5ncygpLmluaXQoKS5jb2x1bW5zO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBjb2x1bW5EZWZzLm1hcCgoXG4gICAgICBjb2x1bW5EZWY6IHsga2V5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4sXG4gICAgICAgIHNvcnRhYmxlOiBib29sZWFuLCBpbmRleDogbnVtYmVyIH0sIGk6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYGNvbHVtbi0ke2l9YDtcbiAgICAgIGxldCB0aXRsZSA9IGNvbHVtbkRlZi50aXRsZTtcbiAgICAgIC8vIGdldCBjb2x1bW4gaW5kZXhcbiAgICAgIGNvbnN0IGluZGV4ID0gIGNvbHVtbk9yZGVyLmluZGV4T2YoaSk7XG4gICAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5kYXRhVGFibGUuY29sdW1uKGluZGV4KS52aXNpYmxlKCk7XG4gICAgICAvLyBzZXQgdGl0bGUgZm9yIHNlbGVjdCBjb2x1bW5cbiAgICAgIGlmIChpID09PSAwICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgICB0aXRsZSA9ICc8JyArIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnVGFibGVzLlNlbGVjdENvbHVtbicpICsgJz4nO1xuICAgICAgfVxuICAgICAgLy8gZ2V0IGNvbHVtbiB0aXRsZVxuICAgICAgaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRpdGxlID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRyeSB0byBmaW5kIGNvbHVtbiBwbGFjZWhvbGRlclxuICAgICAgICBsZXQgcGxhY2Vob2xkZXIgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IHRoaXMuY29uZmlnLmNvbHVtbnNbaSAtIDFdLnBsYWNlaG9sZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwbGFjZWhvbGRlciA9IHRoaXMuY29uZmlnLmNvbHVtbnNbaV0ucGxhY2Vob2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyICE9IG51bGwpIHtcbiAgICAgICAgICB0aXRsZSA9ICc8JyArIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChwbGFjZWhvbGRlcikgKyAnPic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB7XG4gICAgICAgIHRpdGxlID0gJzwnICsgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuVW5rbm93bkNvbHVtbicpICsgJz4nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgdmlzaWJsZSxcbiAgICAgICAgaW5kZXhcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5fY29sdW1uU2VsZWN0b3Iuc2VsZWN0Q29sdW1ucyhjb2x1bW5zKS50aGVuKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnJlc3VsdCA9PT0gJ29rJykge1xuICAgICAgICBjb25zdCBzb3J0ZWQgPSBldmVudC5jb2x1bW5zXG4gICAgICAgICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBrZXk6IGNvbC5rZXksXG4gICAgICAgICAgICAgIGluZGV4OiBjb2wuaW5kZXhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgICAgICAvLyBnZXQgY29sdW1uIG9yZGVyIGUuZy4gWzMsIDEsIDIsIDAsIDRdXG4gICAgICAgIGNvbnN0IGluZGV4ZXMgPSBzb3J0ZWRcbiAgICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBldmVudC5jb2x1bW5zLmZpbmRJbmRleCgobmV4dCkgPT4gaXRlbS5rZXkgPT09IG5leHQua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHJlc2V0IGNvbHVtbiB2aXNpYmlsdHlcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV2ZW50LmNvbHVtbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LmNvbHVtbnNbaW5kZXhdO1xuICAgICAgICAgIGNvbnN0IGNvbEluZGV4ID0gY29sdW1uT3JkZXIuaW5kZXhPZihpbmRleCk7XG4gICAgICAgICAgLy8gc2V0IHZpc2liaWx0eSB3aXRoIHJlZHJhdyAoPXRydWUpXG4gICAgICAgICAgdGhpcy5kYXRhVGFibGUuY29sdW1uKGNvbEluZGV4KS52aXNpYmxlKGVsZW1lbnQudmlzaWJsZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmluYWxseSBhcHBseSBjb2x1bW4gb3JkZXJcbiAgICAgICAgdGhpcy5kYXRhVGFibGUuY29sUmVvcmRlci5vcmRlcihpbmRleGVzLCB0cnVlKTtcbiAgICAgICAgLy8gc2ltcGx5IHJlZHJhdyB0aGUgdGFibGVcbiAgICAgICAgdGhpcy5kYXRhVGFibGUuZHJhdygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIHRvIHBhc3MgYW4gZXJyb3JIYW5kbGVyIGNhbGxiYWNrLCBpZiBkZXNpcmVkXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleHBvcnRWaWV3KG9wdGlvbnM/OiB7ZXJyb3JIYW5kbGVyPzogKHJlYXNvbj86IGFueSkgPT4gYW55fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9sb2FkaW5nLnNob3dMb2FkaW5nKCk7XG4gICAgICAvLyB2YWxpZGF0ZSBxdWVyeSBpdGVtcyBhbmQgY29uZmlnXG4gICAgICBpZiAoISh0aGlzLl9sYXN0UXVlcnlUb3RhbEl0ZW1zICYmIHRoaXMuY29uZmlnKSkge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGdldCBleHBvcnQgc2V0dGluZ3NcbiAgICAgIGNvbnN0IGV4cG9ydFNldHRpbmdzID0gdGhpcy5fY29uZmlndXJhdGlvbi5zZXR0aW5ncyBhcyBFeHBvcnRMaW1pdENvbmZpZ3VyYXRpb247XG4gICAgICAvLyBhbmQgZXhwb3J0IGxpbWl0XG4gICAgICBjb25zdCBleHBvcnRMaW1pdCA9XG4gICAgICAgIChleHBvcnRTZXR0aW5ncyAmJiBleHBvcnRTZXR0aW5ncy50YWJsZXMgJiYgZXhwb3J0U2V0dGluZ3MudGFibGVzLmV4cG9ydExpbWl0ID4gMClcbiAgICAgICAgPyBleHBvcnRTZXR0aW5ncy50YWJsZXMuZXhwb3J0TGltaXQgOiBNQVhfRVhQT1JUX0lURU1TO1xuICAgICAgLy8gYW5kIHZhbGlkYXRlIGl0XG4gICAgICBpZiAodGhpcy5fbGFzdFF1ZXJ5VG90YWxJdGVtcyA+IGV4cG9ydExpbWl0KSB7XG4gICAgICAgIC8vIGNhbGwgZXJyb3IgaGFuZGxlclxuICAgICAgICAvLyBwcm92aWRlIGEgcmVjb2duaXppYmxlIGVycm9yIHR5cGVcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lcnJvckhhbmRsZXIpIHtcbiAgICAgICAgICBvcHRpb25zLmVycm9ySGFuZGxlcihuZXcgRXhwb3J0TGltaXRFeGNlZWRlZEVycm9yKCdFeHBvcnQgbGltaXQgZXhjZWVkZWQnKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9yIHNob3cgd2FybmluZyBtb2RhbCBhbmQgZXhpdFxuICAgICAgICB0aGlzLl9tb2RhbFNlcnZpY2Uuc2hvd1dhcm5pbmdEaWFsb2codGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuRXhwb3J0TGlzdCcpLFxuICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnVGFibGVzLkV4cG9ydExpbWl0RXhjZWVkZWQnLFxuICAgICAgICAgICAge2RhdGFMZW5ndGg6IHRoaXMuX2xhc3RRdWVyeVRvdGFsSXRlbXMsIGV4cG9ydExpbWl0fSksIERJQUxPR19CVVRUT05TLk9rKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gZ2V0IHRvdGFsIGRpc3BsYXllZCBpdGVtc1xuICAgICAgY29uc3QgdG90YWxEaXNwbGF5ZWRJdGVtcyA9IEFycmF5LmZyb20odGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5haURpc3BsYXkpLmxlbmd0aDtcbiAgICAgIC8vIGlmIHRoZXkgYWxyZWFkeSBzYXRpc2Z5IHRoZSBsYXN0IHF1ZXJ5IHRvdGFsXG4gICAgICBpZiAodG90YWxEaXNwbGF5ZWRJdGVtcyA9PT0gdGhpcy5fbGFzdFF1ZXJ5VG90YWxJdGVtcykge1xuICAgICAgICAvLyBwcmVwYXJlIGV4Y2VsIGRhdGEgaW1tZWRpYXRlbHlcbiAgICAgICAgY29uc3Qge2JvZHksIGhlYWRlcn0gPSB0aGlzLmdldEV4cG9ydGFibGVEYXRhKCk7XG4gICAgICAgIC8vIGFuZCBleHBvcnQgdGhlbSB0byBleGNlbFxuICAgICAgICB0aGlzLl9leHBvcnRTcHJlYWRzaGVldC5leHBvcnQoYm9keSwgYCR7dGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY29uZmlnLnRpdGxlIHx8ICdUYWJsZXMuRXhwb3J0UmVzdWx0cycpfS54bHN4YCwge1xuICAgICAgICAgICAgaGVhZGVyLFxuICAgICAgICAgICAgc2tpcEhlYWRlcjogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCBtb3JlIGRhdGEgbmVlZCB0byBiZSBmZXRjaGVkXG4gICAgICAgIC8vIGhvbGQgcHJldmlvdXMgZGF0YSBzdGF0ZVxuICAgICAgICBjb25zdCBwcmV2aW91c0RhdGFTdGF0ZSA9IHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5kYXRhKCkudG9BcnJheSgpO1xuICAgICAgICAvLyBnZXQgdGFyZ2V0IGRhdGEgc3RhdGUgYnkgZXhlY3V0aW5nIHRoZSBsYXN0IHF1ZXJ5XG4gICAgICAgIC8vIG5vdGU6IHRha2luZyB0aGUgZXhwb3J0TGltaXQgYW1vdW50IG9mIGl0ZW1zIHdpbGwgYWx3YXlzIHNhdGlzZnkgdGhlIHJlc3VsdHMsXG4gICAgICAgIC8vIGJlY2F1c2UgaXQgaGFzIGJlZW4gdmFsaWRhdGVkXG4gICAgICAgIGNvbnN0IHRhcmdldERhdGFTdGF0ZSA9IGF3YWl0IHRoaXMubGFzdFF1ZXJ5LnRha2UoZXhwb3J0TGltaXQpLmdldEl0ZW1zKCk7XG4gICAgICAgIC8vIGNoYW5nZSB0YWJsZSBkYXRhIG9uIHRoZSBmbHksIGJ1dCBkbyBub3QgcmVkcmF3XG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNsZWFyKCkucm93cy5hZGQodGFyZ2V0RGF0YVN0YXRlKTtcbiAgICAgICAgLy8gcHJlcGFyZSBleGNlbCBkYXRhXG4gICAgICAgIGNvbnN0IHtib2R5LCBoZWFkZXJ9ID0gdGhpcy5nZXRFeHBvcnRhYmxlRGF0YSgpO1xuICAgICAgICAvLyByZXNldCB0YWJsZSBkYXRhXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNsZWFyKCkucm93cy5hZGQocHJldmlvdXNEYXRhU3RhdGUpO1xuICAgICAgICAvLyBhbmQgZXhwb3J0IHRhcmdldCBkYXRhIHRvIGV4Y2VsXG4gICAgICAgIHRoaXMuX2V4cG9ydFNwcmVhZHNoZWV0LmV4cG9ydChib2R5LCBgJHt0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5jb25maWcudGl0bGUgfHwgJ1RhYmxlcy5FeHBvcnRSZXN1bHRzJyl9Lnhsc3hgLCB7XG4gICAgICAgICAgICBoZWFkZXIsXG4gICAgICAgICAgICBza2lwSGVhZGVyOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIGV4aXRcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGxvZyBlcnJvclxuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgLy8gY2FsbCBlcnJvciBoYW5kbGVyLCBpZiBkZWZpbmVkXG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVycm9ySGFuZGxlcikge1xuICAgICAgICBvcHRpb25zLmVycm9ySGFuZGxlcihlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlIGRlZmF1bHQgZXJyb3Igc2VydmljZVxuICAgICAgICB0aGlzLl9lcnJvclNlcnZpY2Uuc2hvd0Vycm9yKGVyciwge1xuICAgICAgICAgIGNvbnRpbnVlTGluazogJy4nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9sb2FkaW5nLmhpZGVMb2FkaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEV4cG9ydGFibGVEYXRhKCk6IHtib2R5OiBhbnlbXSwgaGVhZGVyOiBhbnlbXX0ge1xuICAgIGlmICghKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuZGF0YVRhYmxlLmJ1dHRvbnNcbiAgICAgICYmIHR5cGVvZiB0aGlzLmRhdGFUYWJsZS5idXR0b25zLmV4cG9ydERhdGEgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5jb25maWcpKSB7XG4gICAgICByZXR1cm4ge2JvZHk6IFtdLCBoZWFkZXI6IFtdfTtcbiAgICB9XG4gICAgLy8gZmV0Y2ggZXhwb3J0YWJsZSBleGNlbCBkYXRhXG4gICAgbGV0IHtib2R5LCBoZWFkZXJ9ID0gdGhpcy5kYXRhVGFibGUuYnV0dG9ucy5leHBvcnREYXRhKCk7XG4gICAgY29uc3QgY2xlYW51cEluZGV4ZXMgPSBbXTtcbiAgICAvLyBjbGVhbiB1cCBoZWFkZXJzXG4gICAgaGVhZGVyID0gaGVhZGVyLmZpbHRlcigoaGVhZGVySXRlbTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBleGNsdWRlIGVtcHR5IGhlYWRlcnNcbiAgICAgIGlmIChoZWFkZXJJdGVtLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY2xlYW51cEluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIGV4Y2x1ZGUgaGlkZGVuIGNvbHVtbnNcbiAgICAgIC8vIG5vdGU6IHVzZSB0aGUgZGF0YXRhYmxlIHZpc2libGUoKSBmdW5jdGlvblxuICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgaGlkZGVuIGNvbmZpZyBwcm9wZXJ0eSwgdG8gc2F0aXNmeSB0aGUgY29sdW1uIHNlbGVjdG9yXG4gICAgICBpZiAoIXRoaXMuZGF0YVRhYmxlLmNvbHVtbihpbmRleCkudmlzaWJsZSgpKSB7XG4gICAgICAgIGNsZWFudXBJbmRleGVzLnB1c2goaW5kZXgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICAvLyBjbGVhbiB1cCBib2R5XG4gICAgYm9keSA9IGJvZHkubWFwKChyb3c6IGFueSBbXSkgPT4ge1xuICAgICAgcmV0dXJuIHJvdy5maWx0ZXIoKF8sIHJvd0luZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNsZWFudXBJbmRleGVzLmluZGV4T2Yocm93SW5kZXgpID09PSAtMTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7Ym9keSwgaGVhZGVyfTtcbiAgfVxufVxuIl19