@sumaris-net/ngx-components 1.22.12 → 1.23.0-rc3

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.
@@ -1,14 +1,12 @@
1
1
  import { __awaiter } from "tslib";
2
- import { TableDataSource, ValidatorService } from '@e-is/ngx-material-table';
2
+ import { TableDataSource } from '@e-is/ngx-material-table';
3
3
  import { BehaviorSubject, Subject } from 'rxjs';
4
4
  import { ErrorCodes } from '../services/errors';
5
5
  import { catchError, debounceTime, map, takeUntil } from 'rxjs/operators';
6
6
  import { Directive } from '@angular/core';
7
- import { firstFalsePromise, firstNotNilPromise } from '../../shared/observables';
8
- import { isNotEmptyArray, isNotNil, removeEnd, toBoolean } from '../../shared/functions';
7
+ import { firstFalsePromise } from '../../shared/observables';
8
+ import { Beans, isEmptyArray, isNotEmptyArray, removeEnd, toBoolean } from '../../shared/functions';
9
9
  import { AppTableUtils } from './table.utils';
10
- export class AppTableDataSourceOptions {
11
- }
12
10
  // @dynamic
13
11
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
14
12
  export class EntitiesTableDataSource extends TableDataSource {
@@ -21,30 +19,22 @@ export class EntitiesTableDataSource extends TableDataSource {
21
19
  * @param validatorService Service that create instances of the FormGroup used to validate row fields.
22
20
  * @param config Additional configuration for table.
23
21
  */
24
- constructor(dataType, dataService, validatorService, config) {
25
- super([], dataType, validatorService, config);
22
+ constructor(dataType, dataService, validatorService, options) {
23
+ super([], dataType, validatorService, Object.assign({ dataServiceOptions: {}, debug: (options === null || options === void 0 ? void 0 : options.suppressErrors) === false, keepOriginalDataAfterConfirm: false }, options));
26
24
  this.dataService = dataService;
27
25
  this._creating = false;
28
26
  this._saving = false;
29
- this._useValidator = false;
30
27
  this._stopWatching$ = new Subject();
31
28
  this._editingRowCount = 0;
32
29
  this._fetchMoreFn = null;
33
30
  this.loadingSubject = new BehaviorSubject(undefined);
34
- this._options = Object.assign({ dataServiceOptions: {}, debug: config && config.suppressErrors === false, keepOriginalDataAfterConfirm: false }, config);
35
- this._useValidator = isNotNil(validatorService);
36
- this._logTypeName = removeEnd((new dataType()).__typename || 'UnknownVO', 'VO');
37
- // For DEV ONLY
38
- this._debug = this._options.debug === true;
31
+ this._entityName = removeEnd((new dataType()).__typename || 'UnknownVO', 'VO');
39
32
  }
40
33
  get serviceOptions() {
41
- return this._options.dataServiceOptions;
34
+ return this.config.dataServiceOptions;
42
35
  }
43
36
  set serviceOptions(value) {
44
- this._options.dataServiceOptions = value;
45
- }
46
- get options() {
47
- return this._options;
37
+ this.config.dataServiceOptions = value;
48
38
  }
49
39
  get loaded() {
50
40
  return this.loadingSubject.value === false; // Should be false when undefined (initial state)
@@ -67,10 +57,10 @@ export class EntitiesTableDataSource extends TableDataSource {
67
57
  return this.dataService.watchAll(offset, size, sortBy, sortDirection, filter, this.serviceOptions)
68
58
  .pipe(catchError(err => this.handleError(err, 'ERROR.LOAD_DATA_ERROR')), map((res) => {
69
59
  if (this._saving) {
70
- console.info(`[table-datasource] Received ${this._logTypeName} data (from service), but still saving: skip`);
60
+ console.info(`[table-datasource] Received ${this._entityName} data (from service), but still saving: skip`);
71
61
  }
72
62
  else if (this._editingRowCount > 0) {
73
- console.warn(`[table-datasource] Received ${this._logTypeName} data, while ${this._editingRowCount} rows still editing: skip; Please check save() implementation in the table!`);
63
+ console.warn(`[table-datasource] Received ${this._entityName} data, while ${this._editingRowCount} rows still editing: skip; Please check save() implementation in the table!`);
74
64
  }
75
65
  else {
76
66
  this.updateDatasource((res.data || []));
@@ -83,6 +73,18 @@ export class EntitiesTableDataSource extends TableDataSource {
83
73
  // ⚠ Notice: Don't put any operator after takeUntil to avoid potential subscription leaks
84
74
  );
85
75
  }
76
+ updateDatasourceFromRows(rows) {
77
+ var _a;
78
+ // Avoid to update dataSourceSubject, when not need
79
+ if ((_a = this.datasourceSubject.observers) === null || _a === void 0 ? void 0 : _a.length) {
80
+ if (!this.config.suppressErrors)
81
+ console.warn('[table-datasource] Update datasource subject. Please prefer using \'rowsSubject\' instead of \'datasourceSubject\'');
82
+ super.updateDatasourceFromRows(rows);
83
+ }
84
+ else {
85
+ console.debug('[table-datasource] Skipping datasourceSubject update (not used yet).');
86
+ }
87
+ }
86
88
  save() {
87
89
  return __awaiter(this, void 0, void 0, function* () {
88
90
  if (toBoolean(this.serviceOptions.readOnly, false)) {
@@ -91,31 +93,31 @@ export class EntitiesTableDataSource extends TableDataSource {
91
93
  }
92
94
  // Saving twice (should never occur)
93
95
  if (this._saving) {
94
- console.warn(`[table-datasource] Trying to save ${this._logTypeName} rows twice. Skip`);
96
+ console.warn(`[table-datasource] Trying to save ${this._entityName} rows twice. Skip`);
95
97
  return false;
96
98
  }
97
99
  this._saving = true;
98
100
  this.markAsLoading();
99
101
  const onlyDirtyRows = toBoolean(this.serviceOptions.saveOnlyDirtyRows, false);
100
102
  try {
101
- if (this._debug)
102
- console.debug(`[table-datasource] Saving ${this._logTypeName} rows... {onlyDirty: ${onlyDirtyRows}}`);
103
+ if (this.config.debug)
104
+ console.debug(`[table-datasource] Saving ${this._entityName} rows... {onlyDirty: ${onlyDirtyRows}}`);
103
105
  // Get all rows
104
- const rows = yield this.getRows();
106
+ const rows = this.getRows();
105
107
  // Finish editing all rows
106
108
  const invalidRows = rows.filter(row => row.editing && !row.confirmEditCreate());
107
109
  // Cannot finish some rows: error
108
110
  if (invalidRows.length) {
109
111
  // log errors
110
- if (this._debug)
111
- invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._logTypeName} row #${row.id}`));
112
+ if (this.config.debug)
113
+ invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._entityName} row #${row.id}`));
112
114
  // Stop with an error
113
115
  throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
114
116
  }
115
117
  this._editingRowCount = 0;
116
118
  let data;
117
119
  let dataToSave;
118
- if (this._useValidator) {
120
+ if (this.validatorService) {
119
121
  dataToSave = [];
120
122
  data = rows.map(row => {
121
123
  const currentData = new this.dataConstructor();
@@ -136,21 +138,21 @@ export class EntitiesTableDataSource extends TableDataSource {
136
138
  }
137
139
  // If no data to save: exit
138
140
  if (onlyDirtyRows && !dataToSave.length) {
139
- if (this._debug)
140
- console.debug(`[table-datasource] No ${this._logTypeName} data to save. Skip`);
141
+ if (this.config.debug)
142
+ console.debug(`[table-datasource] No ${this._entityName} data to save. Skip`);
141
143
  return false;
142
144
  }
143
- if (this._debug)
144
- console.debug(`[table-datasource] Asking service to save this ${this._logTypeName} data:`, dataToSave);
145
+ if (this.config.debug)
146
+ console.debug(`[table-datasource] Asking service to save this ${this._entityName} data:`, dataToSave);
145
147
  yield this.dataService.saveAll(dataToSave, this.serviceOptions);
146
- if (this._debug)
147
- console.debug(`[table-datasource] Saving ${this._logTypeName} data [OK]`);
148
+ if (this.config.debug)
149
+ console.debug(`[table-datasource] Saving ${this._entityName} data [OK]`);
148
150
  // LP 23/03/2021: update datasource is necessary but can be changed to a refetch() on QueryRef (must be created and registered in GraphqlService.watchQuery)
149
151
  this.updateDatasource(data, { emitEvent: false });
150
152
  return true;
151
153
  }
152
154
  catch (error) {
153
- if (this._debug)
155
+ if (this.config.debug)
154
156
  console.error('[table-datasource] Error while saving: ' + error && error.message || error);
155
157
  throw error;
156
158
  }
@@ -161,17 +163,13 @@ export class EntitiesTableDataSource extends TableDataSource {
161
163
  });
162
164
  }
163
165
  updateDatasource(data, opts) {
164
- if (this._debug)
166
+ if (this.config.debug)
165
167
  console.debug(`[table-datasource] Updating datasource with data:`, data);
166
168
  super.updateDatasource(data, opts);
167
169
  if (!opts || opts.emitEvent !== false) {
168
170
  this.markAsLoaded();
169
171
  }
170
172
  }
171
- // Overwrite default signature
172
- createNew(insertAt) {
173
- this.asyncCreateNew(insertAt);
174
- }
175
173
  connect(collectionViewer) {
176
174
  // DEBUG console.debug("[entities-datasource] connect");
177
175
  return super.connect(collectionViewer);
@@ -193,38 +191,37 @@ export class EntitiesTableDataSource extends TableDataSource {
193
191
  console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
194
192
  row.validator.disable({ onlySelf: true, emitEvent: false });
195
193
  }
194
+ this._editingRowCount--;
196
195
  return true;
197
196
  }
198
197
  confirmEdit(row) {
199
198
  if (!super.confirmEdit(row))
200
199
  return false;
201
200
  if (row.editing && row.validator) {
202
- console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
201
+ console.warn('[table-datasource] Row still has {editing: true} after confirmEdit()! Force editing to false');
203
202
  row.validator.disable({ onlySelf: true, emitEvent: false });
204
203
  }
204
+ this._editingRowCount--;
205
205
  return true;
206
206
  }
207
207
  startEdit(row) {
208
- if (this._debug)
209
- console.debug('[table-datasource] Start to edit row', row);
210
- row.startEdit();
208
+ if (!super.startEdit(row))
209
+ return false;
210
+ if (!row.editing && row.validator) {
211
+ console.warn('[table-datasource] Row still has {editing: false} after startEdit()! Force editing');
212
+ row.validator.enable({ onlySelf: true, emitEvent: false });
213
+ }
211
214
  this._editingRowCount++;
212
215
  }
213
- cancelOrDelete(row) {
214
- if (this._debug)
215
- console.debug('[table-datasource] Cancelling or deleting row', row);
216
- row.cancelOrDelete();
217
- this._editingRowCount--;
218
- }
219
216
  handleError(error, message) {
220
217
  const errorMsg = error && error.message || error;
221
- console.error(`[table-datasource] Service ${this._logTypeName} sent error: ${errorMsg}`, error);
218
+ console.error(`[table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
222
219
  this.markAsLoaded();
223
220
  throw new Error(message || errorMsg);
224
221
  }
225
- handleErrorPromise(error) {
222
+ handleServiceError(error) {
226
223
  const errorMsg = error && error.message || error;
227
- console.error(`[table-datasource] Service ${this._logTypeName} sent error: ${errorMsg}`, error);
224
+ console.error(`[table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
228
225
  this.markAsLoaded();
229
226
  throw error;
230
227
  }
@@ -238,9 +235,11 @@ export class EntitiesTableDataSource extends TableDataSource {
238
235
  console.error(`[table-datasource] Row to delete with id=${id} not found`);
239
236
  return;
240
237
  }
238
+ if (row.editing)
239
+ this._editingRowCount--;
241
240
  this.loadingSubject.next(true);
242
241
  this.dataService.deleteAll([row.currentData], this.serviceOptions)
243
- .catch(err => this.handleErrorPromise(err))
242
+ .catch(err => this.handleServiceError(err))
244
243
  .then(() => {
245
244
  setTimeout(() => {
246
245
  // make sure row has been deleted (because GrapQHl cache remove can failed)
@@ -252,66 +251,77 @@ export class EntitiesTableDataSource extends TableDataSource {
252
251
  });
253
252
  }
254
253
  deleteAll(rows) {
255
- this.markAsLoading();
256
- const data = rows.map(r => r.currentData);
257
- const rowsById = rows.reduce((res, row) => {
258
- res[row.id] = row;
259
- return res;
260
- }, {});
261
- const self = this;
262
- const selfDelete = super.delete;
263
- return this.dataService.deleteAll(data, this.serviceOptions)
264
- .catch(err => this.handleErrorPromise(err))
265
- .then(() => {
266
- // Workaround, to be sure all rows has been deleted
267
- // Sometimes, the service miss deletion, or GrapQHl cache remove failed
268
- const rowNotDeleted = Object.getOwnPropertyNames(rowsById).reduce((res, id) => {
269
- const row = rowsById[id];
270
- const present = self.getRow(+id) === row;
271
- return present ? res.concat(row) : res;
272
- }, []).sort((a, b) => a.id > b.id ? -1 : 1);
273
- // Apply missing deletion
274
- if (isNotEmptyArray(rowNotDeleted)) {
275
- console.warn(`[table-datasource] Force deletion of ${rowNotDeleted.length} rows (Is service applying deletion to observable ?)`);
276
- rowNotDeleted.forEach(r => selfDelete.call(self, r.id));
254
+ const _super = Object.create(null, {
255
+ delete: { get: () => super.delete }
256
+ });
257
+ return __awaiter(this, void 0, void 0, function* () {
258
+ this.markAsLoading();
259
+ const data = this.getDataFromRows(rows);
260
+ const rowsById = Beans.collectById(rows);
261
+ try {
262
+ // Call service deletion
263
+ yield this.dataService.deleteAll(data, this.serviceOptions);
264
+ // Workaround, to be sure all rows have been deleted
265
+ // Sometimes, the service miss deletion, or GrapQHl cache remove failed
266
+ const rowNotDeleted = this.getRows().map(row => rows.find(r => r === row));
267
+ // Apply missing deletion
268
+ if (isNotEmptyArray(rowNotDeleted)) {
269
+ console.warn(`[table-datasource] Force deletion of ${rowNotDeleted.length} rows (Is service update the cache ?)`);
270
+ rowNotDeleted
271
+ // Start from the end
272
+ .sort((a, b) => a.id > b.id ? -1 : 1)
273
+ .forEach(r => _super.delete.call(this, r.id));
274
+ }
275
+ }
276
+ catch (err) {
277
+ // Handle sservice error
278
+ this.handleServiceError(err);
279
+ }
280
+ finally {
281
+ this.loadingSubject.next(false);
277
282
  }
278
- this.loadingSubject.next(false);
279
283
  });
280
284
  }
285
+ getRow(id) {
286
+ return super.getRow(id);
287
+ }
281
288
  getRows() {
282
- return firstNotNilPromise(this.connect(null));
289
+ return this.rowsSubject.getValue();
283
290
  }
284
- asyncCreateNew(insertAt) {
291
+ createNew(insertAt, options = { editing: true }) {
285
292
  const _super = Object.create(null, {
286
293
  createNew: { get: () => super.createNew }
287
294
  });
295
+ var _a;
288
296
  return __awaiter(this, void 0, void 0, function* () {
289
297
  if (this._creating)
290
298
  return; // Avoid multiple call (should never occur)
291
299
  this._creating = true;
292
- _super.createNew.call(this, insertAt);
293
- const row = this.getRow(-1);
294
- if (row && this._options && this._options.onRowCreated) {
295
- const res = this._options.onRowCreated(row);
296
- // If async function, wait the end before ending
297
- if (res instanceof Promise) {
300
+ try {
301
+ const row = yield _super.createNew.call(this, insertAt, options);
302
+ if (!row)
303
+ return;
304
+ if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.onRowCreated) {
298
305
  try {
299
- yield res;
306
+ yield this.config.onRowCreated(row);
300
307
  }
301
308
  catch (err) {
309
+ // Log, then continue
302
310
  console.error(err && err.message || err, err);
303
311
  }
304
312
  }
313
+ if (row.editing)
314
+ this._editingRowCount++;
315
+ return row;
316
+ }
317
+ finally {
318
+ this._creating = false;
305
319
  }
306
- this._editingRowCount++;
307
- this._creating = false;
308
320
  });
309
321
  }
310
322
  getData() {
311
- return __awaiter(this, void 0, void 0, function* () {
312
- const rows = yield this.getRows();
313
- return this.getDataFromRows(rows);
314
- });
323
+ const rows = this.getRows();
324
+ return this.getDataFromRows(rows);
315
325
  }
316
326
  fetchMore(opts) {
317
327
  const _super = Object.create(null, {
@@ -321,20 +331,20 @@ export class EntitiesTableDataSource extends TableDataSource {
321
331
  if (!this._fetchMoreFn)
322
332
  return false; // Avoid multiple call
323
333
  if (this._editingRowCount > 0) {
324
- console.warn('Cannot fetch more because still editing row');
334
+ console.warn(`Cannot fetch more ${this._entityName} because ${this._editingRowCount} row(s) still editing`);
325
335
  return;
326
336
  }
337
+ console.debug(`Will fetching more row(s) still...`);
327
338
  // Forget the fetchMore function, to avoid multiple call
328
339
  const fetchMoreFn = this._fetchMoreFn;
329
340
  this._fetchMoreFn = null;
330
341
  // Fetch next page
331
342
  const res = yield fetchMoreFn();
332
343
  // Skip if empty (no more data)
333
- if (isNotEmptyArray(res === null || res === void 0 ? void 0 : res.data))
344
+ if (isEmptyArray(res === null || res === void 0 ? void 0 : res.data))
334
345
  return false;
335
346
  // Update the data source
336
- const existingData = yield this.getData();
337
- _super.updateDatasource.call(this, existingData.concat(...res.data), opts);
347
+ _super.updateDatasource.call(this, (this.currentData || []).concat(...res.data), opts);
338
348
  // Remember fetchMore
339
349
  this._fetchMoreFn = res.fetchMore;
340
350
  return true;
@@ -358,7 +368,7 @@ EntitiesTableDataSource.decorators = [
358
368
  EntitiesTableDataSource.ctorParameters = () => [
359
369
  { type: Function },
360
370
  { type: undefined },
361
- { type: ValidatorService },
362
- { type: AppTableDataSourceOptions }
371
+ { type: undefined },
372
+ { type: undefined }
363
373
  ];
364
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS9lbnRpdGllcy10YWJsZS1kYXRhc291cmNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFnQixnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxlQUFlLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTFELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUFDLFNBQVMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUtuRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRSxPQUFPLEVBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVE1QyxNQUFNLE9BQU8seUJBQXlCO0NBV3JDO0FBRUQsV0FBVztBQUVYLGtFQUFrRTtBQUNsRSxNQUFNLE9BQU8sdUJBS1QsU0FBUSxlQUFrQjtJQW9DNUI7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLFFBQW9CLEVBQ0osV0FBc0MsRUFDdEQsZ0JBQW1DLEVBQ25DLE1BQTRDO1FBQ3RELEtBQUssQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBSHBCLGdCQUFXLEdBQVgsV0FBVyxDQUEyQjtRQXZDeEQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixZQUFP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VGFibGVEYXRhU291cmNlLCBUYWJsZUVsZW1lbnQsIFZhbGlkYXRvclNlcnZpY2V9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0VudGl0eSwgSUVudGl0eX0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7RXJyb3JDb2Rlc30gZnJvbSAnLi4vc2VydmljZXMvZXJyb3JzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBtYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NvcnREaXJlY3Rpb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHtDb2xsZWN0aW9uVmlld2VyfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtUYWJsZURhdGFTb3VyY2VPcHRpb25zfSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUvc3JjL2FwcC9uZ3gtbWF0ZXJpYWwtdGFibGUvdGFibGUtZGF0YS1zb3VyY2UnO1xuaW1wb3J0IHtFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnMsIEZldGNoTW9yZUZuLCBJRW50aXRpZXNTZXJ2aWNlLCBMb2FkUmVzdWx0fSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtmaXJzdEZhbHNlUHJvbWlzZSwgZmlyc3ROb3ROaWxQcm9taXNlfSBmcm9tICcuLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHtpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsLCByZW1vdmVFbmQsIHRvQm9vbGVhbn0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0FwcFRhYmxlVXRpbHN9IGZyb20gJy4vdGFibGUudXRpbHMnO1xuXG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBBcHBUYWJsZURhdGFTZXJ2aWNlT3B0aW9uczxPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zPiBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgc2F2ZU9ubHlEaXJ0eVJvd3M/OiBib29sZWFuO1xuICByZWFkT25seT86IGJvb2xlYW47XG59XG5leHBvcnQgY2xhc3MgQXBwVGFibGVEYXRhU291cmNlT3B0aW9uczxcbiAgVCBleHRlbmRzIEVudGl0eTxULCBJRD4sXG4gIElEID0gbnVtYmVyLFxuICBPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zPiBpbXBsZW1lbnRzIFRhYmxlRGF0YVNvdXJjZU9wdGlvbnMge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIHByZXBlbmROZXdFbGVtZW50cz86IGJvb2xlYW47XG4gIHN1cHByZXNzRXJyb3JzPzogYm9vbGVhbjtcbiAga2VlcE9yaWdpbmFsRGF0YUFmdGVyQ29uZmlybT86IGJvb2xlYW47XG4gIG9uUm93Q3JlYXRlZD86IChyb3c6IFRhYmxlRWxlbWVudDxUPikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gIGRhdGFTZXJ2aWNlT3B0aW9ucz86IEFwcFRhYmxlRGF0YVNlcnZpY2VPcHRpb25zPE8+O1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8vIEBkeW5hbWljXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIEVudGl0aWVzVGFibGVEYXRhU291cmNlPFxuICBUIGV4dGVuZHMgSUVudGl0eTxULCBJRD4sXG4gIEYgPSBhbnksXG4gIElEID0gbnVtYmVyLFxuICBPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zPlxuICAgIGV4dGVuZHMgVGFibGVEYXRhU291cmNlPFQ+XG4gICAgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvZ1R5cGVOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IEFwcFRhYmxlRGF0YVNvdXJjZU9wdGlvbnM8VCwgSUQsIE8+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBfZGVidWc6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBfY3JlYXRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zYXZpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF91c2VWYWxpZGF0b3IgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zdG9wV2F0Y2hpbmckID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICBwcm90ZWN0ZWQgX2VkaXRpbmdSb3dDb3VudCA9IDA7XG4gIHByb3RlY3RlZCBfZmV0Y2hNb3JlRm46IEZldGNoTW9yZUZuPExvYWRSZXN1bHQ8VD4+ID0gbnVsbDtcblxuICBsb2FkaW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odW5kZWZpbmVkKTtcblxuICBnZXQgc2VydmljZU9wdGlvbnMoKTogQXBwVGFibGVEYXRhU2VydmljZU9wdGlvbnM8Tz4ge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zLmRhdGFTZXJ2aWNlT3B0aW9ucztcbiAgfVxuXG4gIHNldCBzZXJ2aWNlT3B0aW9ucyh2YWx1ZTogQXBwVGFibGVEYXRhU2VydmljZU9wdGlvbnM8Tz4pICB7XG4gICAgdGhpcy5fb3B0aW9ucy5kYXRhU2VydmljZU9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBvcHRpb25zKCk6IEFwcFRhYmxlRGF0YVNvdXJjZU9wdGlvbnM8VCwgSUQsIE8+IHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgfVxuXG4gIGdldCBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUgPT09IGZhbHNlOyAvLyBTaG91bGQgYmUgZmFsc2Ugd2hlbiB1bmRlZmluZWQgKGluaXRpYWwgc3RhdGUpXG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSAhPT0gZmFsc2U7IC8vIFNob3VsZCBiZSB0cnVlIHdoZW4gdW5kZWZpbmVkIChpbml0aWFsIHN0YXRlKVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgVGFibGVEYXRhU291cmNlIGluc3RhbmNlLCB0aGF0IGNhbiBiZSB1c2VkIGFzIGRhdGFzb3VyY2Ugb2YgYEBhbmd1bGFyL2Nka2AgZGF0YS10YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGFTZXJ2aWNlIEEgc2VydmljZSB0byBsb2FkIGFuZCBzYXZlIGRhdGFcbiAgICogQHBhcmFtIGRhdGFUeXBlIFR5cGUgb2YgZGF0YSBjb250YWluZWQgYnkgdGhlIFRhYmxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIGBkYXRhYCB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkLlxuICAgKiBAcGFyYW0gZW52aXJvbm1lbnRcbiAgICogQHBhcmFtIHZhbGlkYXRvclNlcnZpY2UgU2VydmljZSB0aGF0IGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhlIEZvcm1Hcm91cCB1c2VkIHRvIHZhbGlkYXRlIHJvdyBmaWVsZHMuXG4gICAqIEBwYXJhbSBjb25maWcgQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0YWJsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRhdGFUeXBlOiBuZXcoKSA9PiBULFxuICAgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZGF0YVNlcnZpY2U6IElFbnRpdGllc1NlcnZpY2U8VCwgRiwgTz4sXG4gICAgICAgICAgICAgIHZhbGlkYXRvclNlcnZpY2U/OiBWYWxpZGF0b3JTZXJ2aWNlLFxuICAgICAgICAgICAgICBjb25maWc/OiBBcHBUYWJsZURhdGFTb3VyY2VPcHRpb25zPFQsIElELCBPPikge1xuICAgIHN1cGVyKFtdLCBkYXRhVHlwZSwgdmFsaWRhdG9yU2VydmljZSwgY29uZmlnKTtcbiAgICB0aGlzLl9vcHRpb25zID0ge1xuICAgICAgZGF0YVNlcnZpY2VPcHRpb25zOiB7fSxcbiAgICAgIGRlYnVnOiBjb25maWcgJiYgY29uZmlnLnN1cHByZXNzRXJyb3JzID09PSBmYWxzZSxcbiAgICAgIGtlZXBPcmlnaW5hbERhdGFBZnRlckNvbmZpcm06IGZhbHNlLFxuICAgICAgLi4uY29uZmlnXG4gICAgfTtcbiAgICB0aGlzLl91c2VWYWxpZGF0b3IgPSBpc05vdE5pbCh2YWxpZGF0b3JTZXJ2aWNlKTtcblxuICAgIHRoaXMuX2xvZ1R5cGVOYW1lID0gcmVtb3ZlRW5kKChuZXcgZGF0YVR5cGUoKSkuX190eXBlbmFtZSB8fCAnVW5rbm93blZPJywgJ1ZPJyk7XG5cbiAgICAvLyBGb3IgREVWIE9OTFlcbiAgICB0aGlzLl9kZWJ1ZyA9IHRoaXMuX29wdGlvbnMuZGVidWcgPT09IHRydWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdG9wV2F0Y2hpbmckLm5leHQoKTtcbiAgICB0aGlzLl9zdG9wV2F0Y2hpbmckLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fc3RvcFdhdGNoaW5nJC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QuY29tcGxldGUoKTtcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3YXRjaEFsbChvZmZzZXQ6IG51bWJlcixcbiAgICAgICAgICAgc2l6ZTogbnVtYmVyLFxuICAgICAgICAgICBzb3J0Qnk/OiBzdHJpbmcsXG4gICAgICAgICAgIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uLFxuICAgICAgICAgICBmaWx0ZXI/OiBQYXJ0aWFsPEY+KTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PFQ+PiB7XG5cbiAgICB0aGlzLl9zdG9wV2F0Y2hpbmckLm5leHQoKTtcbiAgICB0aGlzLl9lZGl0aW5nUm93Q291bnQgPSAwO1xuICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gbnVsbDtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLndhdGNoQWxsKG9mZnNldCwgc2l6ZSwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uLCBmaWx0ZXIsIHRoaXMuc2VydmljZU9wdGlvbnMgYXMgTylcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgJ0VSUk9SLkxPQURfREFUQV9FUlJPUicpKSxcbiAgICAgICAgbWFwKChyZXM6IExvYWRSZXN1bHQ8VD4pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fc2F2aW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYFt0YWJsZS1kYXRhc291cmNlXSBSZWNlaXZlZCAke3RoaXMuX2xvZ1R5cGVOYW1lfSBkYXRhIChmcm9tIHNlcnZpY2UpLCBidXQgc3RpbGwgc2F2aW5nOiBza2lwYCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9lZGl0aW5nUm93Q291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFt0YWJsZS1kYXRhc291cmNlXSBSZWNlaXZlZCAke3RoaXMuX2xvZ1R5cGVOYW1lfSBkYXRhLCB3aGlsZSAke3RoaXMuX2VkaXRpbmdSb3dDb3VudH0gcm93cyBzdGlsbCBlZGl0aW5nOiBza2lwOyBQbGVhc2UgY2hlY2sgc2F2ZSgpIGltcGxlbWVudGF0aW9uIGluIHRoZSB0YWJsZSFgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhc291cmNlKChyZXMuZGF0YSB8fCBbXSkgYXMgVFtdKTtcbiAgICAgICAgICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzLmZldGNoTW9yZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSksXG4gICAgICAgIC8vIFN0b3AgdGhpcyBwaXBlIG5leHQgdGltZSB3ZSBjYWxsIHdhdGNoQWxsKClcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX3N0b3BXYXRjaGluZyQpXG4gICAgICAgIC8vIOKaoCBOb3RpY2U6IERvbid0IHB1dCBhbnkgb3BlcmF0b3IgYWZ0ZXIgdGFrZVVudGlsIHRvIGF2b2lkIHBvdGVudGlhbCBzdWJzY3JpcHRpb24gbGVha3NcbiAgICAgICk7XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0b0Jvb2xlYW4odGhpcy5zZXJ2aWNlT3B0aW9ucy5yZWFkT25seSwgZmFsc2UpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbdGFibGUtZGF0YXNvdXJjZV0gRW5hYmxlIHRvIHNhdmUsIGJlY2F1c2Ugc2VydmljZU9wdGlvbnMucmVhZE9ubHk9dHJ1ZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBTYXZpbmcgdHdpY2UgKHNob3VsZCBuZXZlciBvY2N1cilcbiAgICBpZiAodGhpcy5fc2F2aW5nKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFt0YWJsZS1kYXRhc291cmNlXSBUcnlpbmcgdG8gc2F2ZSAke3RoaXMuX2xvZ1R5cGVOYW1lfSByb3dzIHR3aWNlLiBTa2lwYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fc2F2aW5nID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIGNvbnN0IG9ubHlEaXJ0eVJvd3MgPSB0b0Jvb2xlYW4odGhpcy5zZXJ2aWNlT3B0aW9ucy5zYXZlT25seURpcnR5Um93cywgZmFsc2UpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3RhYmxlLWRhdGFzb3VyY2VdIFNhdmluZyAke3RoaXMuX2xvZ1R5cGVOYW1lfSByb3dzLi4uIHtvbmx5RGlydHk6ICR7b25seURpcnR5Um93c319YCk7XG5cbiAgICAgIC8vIEdldCBhbGwgcm93c1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0Um93cygpO1xuXG4gICAgICAvLyBGaW5pc2ggZWRpdGluZyBhbGwgcm93c1xuICAgICAgY29uc3QgaW52YWxpZFJvd3MgPSByb3dzLmZpbHRlcihyb3cgPT4gcm93LmVkaXRpbmcgJiYgIXJvdy5jb25maXJtRWRpdENyZWF0ZSgpKTtcblxuICAgICAgLy8gQ2Fubm90IGZpbmlzaCBzb21lIHJvd3M6IGVycm9yXG4gICAgICBpZiAoaW52YWxpZFJvd3MubGVuZ3RoKSB7XG4gICAgICAgIC8vIGxvZyBlcnJvcnNcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnKSBpbnZhbGlkUm93cy5mb3JFYWNoKHJvdyA9PiBBcHBUYWJsZVV0aWxzLmxvZ1Jvd0Vycm9ycyhyb3csIGBbdGFibGUtZGF0YXNvdXJjZV0gJHt0aGlzLl9sb2dUeXBlTmFtZX0gcm93ICMke3Jvdy5pZH1gKSk7XG4gICAgICAgIC8vIFN0b3Agd2l0aCBhbiBlcnJvclxuICAgICAgICB0aHJvdyB7Y29kZTogRXJyb3JDb2Rlcy5UQUJMRV9JTlZBTElEX1JPV19FUlJPUiwgbWVzc2FnZTogJ0VSUk9SLlRBQkxFX0lOVkFMSURfUk9XX0VSUk9SJ307XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VkaXRpbmdSb3dDb3VudCA9IDA7XG5cbiAgICAgIGxldCBkYXRhOiBUW107XG4gICAgICBsZXQgZGF0YVRvU2F2ZTogVFtdO1xuXG4gICAgICBpZiAodGhpcy5fdXNlVmFsaWRhdG9yKSB7XG4gICAgICAgIGRhdGFUb1NhdmUgPSBbXTtcbiAgICAgICAgZGF0YSA9IHJvd3MubWFwKHJvdyA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudERhdGEgPSBuZXcgdGhpcy5kYXRhQ29uc3RydWN0b3IoKSBhcyBUO1xuICAgICAgICAgIGN1cnJlbnREYXRhLmZyb21PYmplY3Qocm93LmN1cnJlbnREYXRhKTtcbiAgICAgICAgICAvLyBGaWx0ZXIgdG8ga2VlcCBvbmx5IGRpcnR5IHJvd1xuICAgICAgICAgIGlmIChvbmx5RGlydHlSb3dzICYmIHJvdy52YWxpZGF0b3IuZGlydHkpIGRhdGFUb1NhdmUucHVzaChjdXJyZW50RGF0YSk7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRhO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFvbmx5RGlydHlSb3dzKSBkYXRhVG9TYXZlID0gZGF0YTtcbiAgICAgIH1cbiAgICAgIC8vIE9yIHVzZSB0aGUgY3VycmVudCBkYXRhIHdpdGhvdXQgY29udmVyc2lvbiAod2hlbiBubyB2YWxpZGF0b3Igc2VydmljZSB1c2VkKVxuICAgICAgZWxzZSB7XG4gICAgICAgIGRhdGEgPSByb3dzLm1hcChyb3cgPT4gcm93LmN1cnJlbnREYXRhKTtcbiAgICAgICAgLy8gc2F2ZSBhbGwgZGF0YSwgYXMgd2UgZG9uJ3QgaGF2ZSBhbnkgZGlydHkgbWFya2VyXG4gICAgICAgIGRhdGFUb1NhdmUgPSBkYXRhO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBkYXRhIHRvIHNhdmU6IGV4aXRcbiAgICAgIGlmIChvbmx5RGlydHlSb3dzICYmICFkYXRhVG9TYXZlLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBObyAke3RoaXMuX2xvZ1R5cGVOYW1lfSBkYXRhIHRvIHNhdmUuIFNraXBgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBBc2tpbmcgc2VydmljZSB0byBzYXZlIHRoaXMgJHt0aGlzLl9sb2dUeXBlTmFtZX0gZGF0YTpgLCBkYXRhVG9TYXZlKTtcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNlcnZpY2Uuc2F2ZUFsbChkYXRhVG9TYXZlLCB0aGlzLnNlcnZpY2VPcHRpb25zKTtcblxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGUtZGF0YXNvdXJjZV0gU2F2aW5nICR7dGhpcy5fbG9nVHlwZU5hbWV9IGRhdGEgW09LXWApO1xuXG4gICAgICAvLyBMUCAyMy8wMy8yMDIxOiB1cGRhdGUgZGF0YXNvdXJjZSBpcyBuZWNlc3NhcnkgYnV0IGNhbiBiZSBjaGFuZ2VkIHRvIGEgcmVmZXRjaCgpIG9uIFF1ZXJ5UmVmIChtdXN0IGJlIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQgaW4gR3JhcGhxbFNlcnZpY2Uud2F0Y2hRdWVyeSlcbiAgICAgIHRoaXMudXBkYXRlRGF0YXNvdXJjZShkYXRhLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmVycm9yKCdbdGFibGUtZGF0YXNvdXJjZV0gRXJyb3Igd2hpbGUgc2F2aW5nOiAnICsgZXJyb3IgJiYgZXJyb3IubWVzc2FnZSB8fCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fc2F2aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZURhdGFzb3VyY2UoZGF0YTogVFtdLCBvcHRzPzogeyBlbWl0RXZlbnQ6IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3RhYmxlLWRhdGFzb3VyY2VdIFVwZGF0aW5nIGRhdGFzb3VyY2Ugd2l0aCBkYXRhOmAsIGRhdGEpO1xuXG4gICAgc3VwZXIudXBkYXRlRGF0YXNvdXJjZShkYXRhLCBvcHRzKTtcblxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gT3ZlcndyaXRlIGRlZmF1bHQgc2lnbmF0dXJlXG4gIGNyZWF0ZU5ldyhpbnNlcnRBdD86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYXN5bmNDcmVhdGVOZXcoaW5zZXJ0QXQpO1xuICB9XG5cbiAgY29ubmVjdChjb2xsZWN0aW9uVmlld2VyOiBDb2xsZWN0aW9uVmlld2VyKTogT2JzZXJ2YWJsZTxUYWJsZUVsZW1lbnQ8VD5bXSB8IFJlYWRvbmx5QXJyYXk8VGFibGVFbGVtZW50PFQ+Pj4ge1xuICAgIC8vIERFQlVHIGNvbnNvbGUuZGVidWcoXCJbZW50aXRpZXMtZGF0YXNvdXJjZV0gY29ubmVjdFwiKTtcbiAgICByZXR1cm4gc3VwZXIuY29ubmVjdChjb2xsZWN0aW9uVmlld2VyKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoY29sbGVjdGlvblZpZXdlcj86IENvbGxlY3Rpb25WaWV3ZXIpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXIpO1xuICAgIHRoaXMuX3N0b3BXYXRjaGluZyQubmV4dCgpO1xuICB9XG5cbiAgd2FpdElkbGUoZGVib3VuY2VUaW1lTXM/OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBmaXJzdEZhbHNlUHJvbWlzZSh0aGlzLmxvYWRpbmdTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoZGVib3VuY2VUaW1lTXMgfHwgMTAwKSAvLyBpZiBub3Qgc3RhcnRlZCB5ZXQsIHdhaXRcbiAgICAgICkpO1xuICB9XG5cbiAgY29uZmlybUNyZWF0ZShyb3c6IFRhYmxlRWxlbWVudDxUPikge1xuICAgIGlmICghc3VwZXIuY29uZmlybUNyZWF0ZShyb3cpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHJvdy5lZGl0aW5nICYmIHJvdy52YWxpZGF0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3RhYmxlLWRhdGFzb3VyY2VdIFJvdyBzdGlsbCBoYXMge2VkaXRpbmc6IHRydWV9IGFmdGVyIGNvbmZpcm1DcmVhdGUoKSEgRm9yY2UgZWRpdGluZyB0byBmYWxzZScpO1xuICAgICAgcm93LnZhbGlkYXRvci5kaXNhYmxlKHtvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbmZpcm1FZGl0KHJvdzogVGFibGVFbGVtZW50PFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdXBlci5jb25maXJtRWRpdChyb3cpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHJvdy5lZGl0aW5nICYmIHJvdy52YWxpZGF0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3RhYmxlLWRhdGFzb3VyY2VdIFJvdyBzdGlsbCBoYXMge2VkaXRpbmc6IHRydWV9IGFmdGVyIGNvbmZpcm1DcmVhdGUoKSEgRm9yY2UgZWRpdGluZyB0byBmYWxzZScpO1xuICAgICAgcm93LnZhbGlkYXRvci5kaXNhYmxlKHtvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN0YXJ0RWRpdChyb3c6IFRhYmxlRWxlbWVudDxUPikge1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlLWRhdGFzb3VyY2VdIFN0YXJ0IHRvIGVkaXQgcm93Jywgcm93KTtcbiAgICByb3cuc3RhcnRFZGl0KCk7XG4gICAgdGhpcy5fZWRpdGluZ1Jvd0NvdW50Kys7XG4gIH1cblxuICBjYW5jZWxPckRlbGV0ZShyb3c6IFRhYmxlRWxlbWVudDxUPikge1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlLWRhdGFzb3VyY2VdIENhbmNlbGxpbmcgb3IgZGVsZXRpbmcgcm93Jywgcm93KTtcbiAgICByb3cuY2FuY2VsT3JEZWxldGUoKTtcbiAgICB0aGlzLl9lZGl0aW5nUm93Q291bnQtLTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yKGVycm9yOiBhbnksIG1lc3NhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGVycm9yTXNnID0gZXJyb3IgJiYgZXJyb3IubWVzc2FnZSB8fCBlcnJvcjtcbiAgICBjb25zb2xlLmVycm9yKGBbdGFibGUtZGF0YXNvdXJjZV0gU2VydmljZSAke3RoaXMuX2xvZ1R5cGVOYW1lfSBzZW50IGVycm9yOiAke2Vycm9yTXNnfWAsIGVycm9yKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlIHx8IGVycm9yTXNnKTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yUHJvbWlzZShlcnJvcjogYW55KSB7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvciAmJiBlcnJvci5tZXNzYWdlIHx8IGVycm9yO1xuICAgIGNvbnNvbGUuZXJyb3IoYFt0YWJsZS1kYXRhc291cmNlXSBTZXJ2aWNlICR7dGhpcy5fbG9nVHlwZU5hbWV9IHNlbnQgZXJyb3I6ICR7ZXJyb3JNc2d9YCwgZXJyb3IpO1xuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBkZWxldGUoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIElmIG5ldyByb3c6IG5vdCBuZWVkIHRvIHByb3BhZ2F0ZSB0byB0aGUgZGF0YVNlcnZpY2VcbiAgICBpZiAoaWQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZGVsZXRlKGlkKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3cgPSB0aGlzLmdldFJvdyhpZCk7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt0YWJsZS1kYXRhc291cmNlXSBSb3cgdG8gZGVsZXRlIHdpdGggaWQ9JHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xuXG4gICAgdGhpcy5kYXRhU2VydmljZS5kZWxldGVBbGwoW3Jvdy5jdXJyZW50RGF0YV0sIHRoaXMuc2VydmljZU9wdGlvbnMpXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3JQcm9taXNlKGVycikpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIG1ha2Ugc3VyZSByb3cgaGFzIGJlZW4gZGVsZXRlZCAoYmVjYXVzZSBHcmFwUUhsIGNhY2hlIHJlbW92ZSBjYW4gZmFpbGVkKVxuICAgICAgICAgIGNvbnN0IHByZXNlbnQgPSB0aGlzLmdldFJvdyhpZCkgPT09IHJvdztcbiAgICAgICAgICBpZiAocHJlc2VudCkgc3VwZXIuZGVsZXRlKGlkKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICB9LCAzMDApO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlQWxsKHJvd3M6IFRhYmxlRWxlbWVudDxUPltdKTogUHJvbWlzZTxhbnk+IHtcblxuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgY29uc3QgZGF0YSA9IHJvd3MubWFwKHIgPT4gci5jdXJyZW50RGF0YSk7XG4gICAgY29uc3Qgcm93c0J5SWQgPSByb3dzLnJlZHVjZSgocmVzLCByb3cpID0+IHtcbiAgICAgIHJlc1tyb3cuaWRdID0gcm93O1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCB7fSk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgc2VsZkRlbGV0ZSA9IHN1cGVyLmRlbGV0ZTtcblxuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmRlbGV0ZUFsbChkYXRhLCB0aGlzLnNlcnZpY2VPcHRpb25zKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yUHJvbWlzZShlcnIpKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyBXb3JrYXJvdW5kLCB0byBiZSBzdXJlIGFsbCByb3dzIGhhcyBiZWVuIGRlbGV0ZWRcbiAgICAgICAgLy8gU29tZXRpbWVzLCB0aGUgc2VydmljZSBtaXNzIGRlbGV0aW9uLCBvciBHcmFwUUhsIGNhY2hlIHJlbW92ZSBmYWlsZWRcbiAgICAgICAgY29uc3Qgcm93Tm90RGVsZXRlZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHJvd3NCeUlkKS5yZWR1Y2UoKHJlcywgaWQpID0+IHtcbiAgICAgICAgICBjb25zdCByb3cgPSByb3dzQnlJZFtpZF07XG4gICAgICAgICAgY29uc3QgcHJlc2VudCA9IHNlbGYuZ2V0Um93KCtpZCkgPT09IHJvdztcbiAgICAgICAgICByZXR1cm4gcHJlc2VudCA/IHJlcy5jb25jYXQocm93KSA6IHJlcztcbiAgICAgICAgfSwgW10pLnNvcnQoKGEsIGIpID0+IGEuaWQgPiBiLmlkID8gLTEgOiAxKTtcbiAgICAgICAgLy8gQXBwbHkgbWlzc2luZyBkZWxldGlvblxuICAgICAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHJvd05vdERlbGV0ZWQpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdGFibGUtZGF0YXNvdXJjZV0gRm9yY2UgZGVsZXRpb24gb2YgJHtyb3dOb3REZWxldGVkLmxlbmd0aH0gcm93cyAoSXMgc2VydmljZSBhcHBseWluZyBkZWxldGlvbiB0byBvYnNlcnZhYmxlID8pYCk7XG4gICAgICAgICAgcm93Tm90RGVsZXRlZC5mb3JFYWNoKHIgPT4gc2VsZkRlbGV0ZS5jYWxsKHNlbGYsIHIuaWQpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93cygpOiBQcm9taXNlPFRhYmxlRWxlbWVudDxUPltdPiB7XG4gICAgcmV0dXJuIGZpcnN0Tm90TmlsUHJvbWlzZSh0aGlzLmNvbm5lY3QobnVsbCkpIGFzIFByb21pc2U8VGFibGVFbGVtZW50PFQ+W10+O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFzeW5jQ3JlYXRlTmV3KGluc2VydEF0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2NyZWF0aW5nKSByZXR1cm47IC8vIEF2b2lkIG11bHRpcGxlIGNhbGwgKHNob3VsZCBuZXZlciBvY2N1cilcblxuICAgIHRoaXMuX2NyZWF0aW5nID0gdHJ1ZTtcblxuICAgIHN1cGVyLmNyZWF0ZU5ldyhpbnNlcnRBdCk7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5nZXRSb3coLTEpO1xuXG4gICAgaWYgKHJvdyAmJiB0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25Sb3dDcmVhdGVkKSB7XG4gICAgICBjb25zdCByZXMgPSB0aGlzLl9vcHRpb25zLm9uUm93Q3JlYXRlZChyb3cpO1xuICAgICAgLy8gSWYgYXN5bmMgZnVuY3Rpb24sIHdhaXQgdGhlIGVuZCBiZWZvcmUgZW5kaW5nXG4gICAgICBpZiAocmVzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSAge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2VkaXRpbmdSb3dDb3VudCsrO1xuICAgIHRoaXMuX2NyZWF0aW5nID0gZmFsc2U7XG4gIH1cblxuICBhc3luYyBnZXREYXRhKCk6IFByb21pc2U8VFtdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0Um93cygpO1xuICAgIHJldHVybiB0aGlzLmdldERhdGFGcm9tUm93cyhyb3dzKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTW9yZShvcHRzPzogeyBlbWl0RXZlbnQ6IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5fZmV0Y2hNb3JlRm4pIHJldHVybiBmYWxzZTsgLy8gQXZvaWQgbXVsdGlwbGUgY2FsbFxuICAgIGlmICh0aGlzLl9lZGl0aW5nUm93Q291bnQgPiAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Nhbm5vdCBmZXRjaCBtb3JlIGJlY2F1c2Ugc3RpbGwgZWRpdGluZyByb3cnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3JnZXQgdGhlIGZldGNoTW9yZSBmdW5jdGlvbiwgdG8gYXZvaWQgbXVsdGlwbGUgY2FsbFxuICAgIGNvbnN0IGZldGNoTW9yZUZuID0gdGhpcy5fZmV0Y2hNb3JlRm47XG4gICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSBudWxsO1xuXG4gICAgLy8gRmV0Y2ggbmV4dCBwYWdlXG4gICAgY29uc3QgcmVzOiBMb2FkUmVzdWx0PFQ+ID0gYXdhaXQgZmV0Y2hNb3JlRm4oKTtcblxuICAgIC8vIFNraXAgaWYgZW1wdHkgKG5vIG1vcmUgZGF0YSlcbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHJlcz8uZGF0YSkpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZGF0YSBzb3VyY2VcbiAgICBjb25zdCBleGlzdGluZ0RhdGEgPSBhd2FpdCB0aGlzLmdldERhdGEoKTtcbiAgICBzdXBlci51cGRhdGVEYXRhc291cmNlKGV4aXN0aW5nRGF0YS5jb25jYXQoLi4ucmVzLmRhdGEpLCBvcHRzKTtcblxuICAgIC8vIFJlbWVtYmVyIGZldGNoTW9yZVxuICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzLmZldGNoTW9yZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2QgLS0gKi9cblxuICBtYXJrQXNMb2FkaW5nKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzTG9hZGVkKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS9lbnRpdGllcy10YWJsZS1kYXRhc291cmNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFpQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxlQUFlLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTFELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUFDLFNBQVMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUtuRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xHLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFrQjVDLFdBQVc7QUFFWCxrRUFBa0U7QUFDbEUsTUFBTSxPQUFPLHVCQU9ULFNBQVEsZUFBd0I7SUE2QmxDOzs7Ozs7OztPQVFHO0lBQ0gsWUFBWSxRQUFvQixFQUNKLFdBQXVDLEVBQ3ZELGdCQUFvQixFQUNwQixPQUFXO1FBQ3JCLEtBQUssQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixrQkFDbEMsa0JBQWtCLEVBQUUsRUFBRSxFQUN0QixLQUFLLEVBQUUsQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsY0FBYyxNQUFLLEtBQUssRUFDeEMsNEJBQTRCLEVBQUUsS0FBSyxJQUNoQyxPQUFPLEVB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Q3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBRXpCLGtCQUFrQjtZQUNsQixNQUFNLEdBQUcsR0FBa0IsTUFBTSxXQUFXLEVBQUUsQ0FBQztZQUUvQywrQkFBK0I7WUFDL0IsSUFBSSxZQUFZLENBQUMsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLElBQUksQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUUxQyx5QkFBeUI7WUFDekIsT0FBTSxnQkFBZ0IsWUFBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRTtZQUUzRSxxQkFBcUI7WUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztLQUFBO0lBRUQsNEJBQTRCO0lBRTVCLGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRTtZQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7WUFDdkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDOzs7WUFwWkYsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VGFibGVEYXRhU291cmNlLCBUYWJsZUVsZW1lbnQsIFZhbGlkYXRvclNlcnZpY2V9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0VudGl0eSwgSUVudGl0eX0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7RXJyb3JDb2Rlc30gZnJvbSAnLi4vc2VydmljZXMvZXJyb3JzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBtYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NvcnREaXJlY3Rpb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHtDb2xsZWN0aW9uVmlld2VyfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtUYWJsZURhdGFTb3VyY2VDb25maWd9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZS9zcmMvYXBwL25neC1tYXRlcmlhbC10YWJsZS90YWJsZS1kYXRhLXNvdXJjZSc7XG5pbXBvcnQge0VudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucywgRmV0Y2hNb3JlRm4sIElFbnRpdGllc1NlcnZpY2UsIExvYWRSZXN1bHR9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge2ZpcnN0RmFsc2VQcm9taXNlfSBmcm9tICcuLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHtCZWFucywgaXNFbXB0eUFycmF5LCBpc05vdEVtcHR5QXJyYXksIHJlbW92ZUVuZCwgdG9Cb29sZWFufSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7QXBwVGFibGVVdGlsc30gZnJvbSAnLi90YWJsZS51dGlscyc7XG5cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEVudGl0aWVzVGFibGVTZXJ2aWNlT3B0aW9ucyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgc2F2ZU9ubHlEaXJ0eVJvd3M/OiBib29sZWFuO1xuICByZWFkT25seT86IGJvb2xlYW47XG59XG5leHBvcnQgaW50ZXJmYWNlIEVudGl0aWVzVGFibGVEYXRhU291cmNlQ29uZmlnPFxuICBUIGV4dGVuZHMgRW50aXR5PFQsIElEPixcbiAgSUQgPSBudW1iZXIsXG4gIFdPIGV4dGVuZHMgRW50aXRpZXNUYWJsZVNlcnZpY2VPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zPiBleHRlbmRzIFRhYmxlRGF0YVNvdXJjZUNvbmZpZyB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgb25Sb3dDcmVhdGVkPzogKHJvdzogVGFibGVFbGVtZW50PFQ+KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgZGF0YVNlcnZpY2VPcHRpb25zPzogV087XG4gIGRlYnVnPzogYm9vbGVhbjtcbn1cblxuLy8gQGR5bmFtaWNcbkBEaXJlY3RpdmUoKVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgRW50aXRpZXNUYWJsZURhdGFTb3VyY2U8XG4gIFQgZXh0ZW5kcyBJRW50aXR5PFQsIElEPixcbiAgRiA9IGFueSxcbiAgSUQgPSBudW1iZXIsXG4gIFdPIGV4dGVuZHMgRW50aXRpZXNUYWJsZVNlcnZpY2VPcHRpb25zID0gRW50aXRpZXNUYWJsZVNlcnZpY2VPcHRpb25zLFxuICBWIGV4dGVuZHMgVmFsaWRhdG9yU2VydmljZSA9IFZhbGlkYXRvclNlcnZpY2UsXG4gIEMgZXh0ZW5kcyBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZUNvbmZpZzxULCBJRCwgV08+ID0gRW50aXRpZXNUYWJsZURhdGFTb3VyY2VDb25maWc8VCwgSUQsIFdPPj5cbiAgICBleHRlbmRzIFRhYmxlRGF0YVNvdXJjZTxULCBWLCBDPlxuICAgIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9lbnRpdHlOYW1lOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIF9jcmVhdGluZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX3NhdmluZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX3N0b3BXYXRjaGluZyQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIHByb3RlY3RlZCBfZWRpdGluZ1Jvd0NvdW50ID0gMDtcbiAgcHJvdGVjdGVkIF9mZXRjaE1vcmVGbjogRmV0Y2hNb3JlRm48TG9hZFJlc3VsdDxUPj4gPSBudWxsO1xuXG4gIGxvYWRpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih1bmRlZmluZWQpO1xuXG4gIGdldCBzZXJ2aWNlT3B0aW9ucygpOiBXTyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFTZXJ2aWNlT3B0aW9ucztcbiAgfVxuXG4gIHNldCBzZXJ2aWNlT3B0aW9ucyh2YWx1ZTogV08pICB7XG4gICAgdGhpcy5jb25maWcuZGF0YVNlcnZpY2VPcHRpb25zID0gdmFsdWU7XG4gIH1cblxuICBnZXQgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlID09PSBmYWxzZTsgLy8gU2hvdWxkIGJlIGZhbHNlIHdoZW4gdW5kZWZpbmVkIChpbml0aWFsIHN0YXRlKVxuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUgIT09IGZhbHNlOyAvLyBTaG91bGQgYmUgdHJ1ZSB3aGVuIHVuZGVmaW5lZCAoaW5pdGlhbCBzdGF0ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFRhYmxlRGF0YVNvdXJjZSBpbnN0YW5jZSwgdGhhdCBjYW4gYmUgdXNlZCBhcyBkYXRhc291cmNlIG9mIGBAYW5ndWxhci9jZGtgIGRhdGEtdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhU2VydmljZSBBIHNlcnZpY2UgdG8gbG9hZCBhbmQgc2F2ZSBkYXRhXG4gICAqIEBwYXJhbSBkYXRhVHlwZSBUeXBlIG9mIGRhdGEgY29udGFpbmVkIGJ5IHRoZSBUYWJsZS4gSWYgbm90IHNwZWNpZmllZCwgdGhlbiBgZGF0YWAgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIGVudmlyb25tZW50XG4gICAqIEBwYXJhbSB2YWxpZGF0b3JTZXJ2aWNlIFNlcnZpY2UgdGhhdCBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBGb3JtR3JvdXAgdXNlZCB0byB2YWxpZGF0ZSByb3cgZmllbGRzLlxuICAgKiBAcGFyYW0gY29uZmlnIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGFibGUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkYXRhVHlwZTogbmV3KCkgPT4gVCxcbiAgICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IGRhdGFTZXJ2aWNlOiBJRW50aXRpZXNTZXJ2aWNlPFQsIEYsIFdPPixcbiAgICAgICAgICAgICAgdmFsaWRhdG9yU2VydmljZT86IFYsXG4gICAgICAgICAgICAgIG9wdGlvbnM/OiBDKSB7XG4gICAgc3VwZXIoW10sIGRhdGFUeXBlLCB2YWxpZGF0b3JTZXJ2aWNlLCB7XG4gICAgICBkYXRhU2VydmljZU9wdGlvbnM6IHt9LFxuICAgICAgZGVidWc6IG9wdGlvbnM/LnN1cHByZXNzRXJyb3JzID09PSBmYWxzZSxcbiAgICAgIGtlZXBPcmlnaW5hbERhdGFBZnRlckNvbmZpcm06IGZhbHNlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pO1xuXG4gICAgdGhpcy5fZW50aXR5TmFtZSA9IHJlbW92ZUVuZCgobmV3IGRhdGFUeXBlKCkpLl9fdHlwZW5hbWUgfHwgJ1Vua25vd25WTycsICdWTycpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3RvcFdhdGNoaW5nJC5uZXh0KCk7XG4gICAgdGhpcy5fc3RvcFdhdGNoaW5nJC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3N0b3BXYXRjaGluZyQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgd2F0Y2hBbGwob2Zmc2V0OiBudW1iZXIsXG4gICAgICAgICAgIHNpemU6IG51bWJlcixcbiAgICAgICAgICAgc29ydEJ5Pzogc3RyaW5nLFxuICAgICAgICAgICBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbixcbiAgICAgICAgICAgZmlsdGVyPzogUGFydGlhbDxGPik6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj4ge1xuXG4gICAgdGhpcy5fc3RvcFdhdGNoaW5nJC5uZXh0KCk7XG4gICAgdGhpcy5fZWRpdGluZ1Jvd0NvdW50ID0gMDtcbiAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IG51bGw7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS53YXRjaEFsbChvZmZzZXQsIHNpemUsIHNvcnRCeSwgc29ydERpcmVjdGlvbiwgZmlsdGVyLCB0aGlzLnNlcnZpY2VPcHRpb25zIGFzIFdPKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCAnRVJST1IuTE9BRF9EQVRBX0VSUk9SJykpLFxuICAgICAgICBtYXAoKHJlczogTG9hZFJlc3VsdDxUPikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9zYXZpbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgW3RhYmxlLWRhdGFzb3VyY2VdIFJlY2VpdmVkICR7dGhpcy5fZW50aXR5TmFtZX0gZGF0YSAoZnJvbSBzZXJ2aWNlKSwgYnV0IHN0aWxsIHNhdmluZzogc2tpcGApO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZWRpdGluZ1Jvd0NvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbdGFibGUtZGF0YXNvdXJjZV0gUmVjZWl2ZWQgJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhLCB3aGlsZSAke3RoaXMuX2VkaXRpbmdSb3dDb3VudH0gcm93cyBzdGlsbCBlZGl0aW5nOiBza2lwOyBQbGVhc2UgY2hlY2sgc2F2ZSgpIGltcGxlbWVudGF0aW9uIGluIHRoZSB0YWJsZSFgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhc291cmNlKChyZXMuZGF0YSB8fCBbXSkgYXMgVFtdKTtcbiAgICAgICAgICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzLmZldGNoTW9yZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSksXG4gICAgICAgIC8vIFN0b3AgdGhpcyBwaXBlIG5leHQgdGltZSB3ZSBjYWxsIHdhdGNoQWxsKClcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX3N0b3BXYXRjaGluZyQpXG4gICAgICAgIC8vIOKaoCBOb3RpY2U6IERvbid0IHB1dCBhbnkgb3BlcmF0b3IgYWZ0ZXIgdGFrZVVudGlsIHRvIGF2b2lkIHBvdGVudGlhbCBzdWJzY3JpcHRpb24gbGVha3NcbiAgICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlRGF0YXNvdXJjZUZyb21Sb3dzKHJvd3M6IFRhYmxlRWxlbWVudDxUPltdKSB7XG4gICAgLy8gQXZvaWQgdG8gdXBkYXRlIGRhdGFTb3VyY2VTdWJqZWN0LCB3aGVuIG5vdCBuZWVkXG4gICAgaWYgKHRoaXMuZGF0YXNvdXJjZVN1YmplY3Qub2JzZXJ2ZXJzPy5sZW5ndGgpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcuc3VwcHJlc3NFcnJvcnMpIGNvbnNvbGUud2FybignW3RhYmxlLWRhdGFzb3VyY2VdIFVwZGF0ZSBkYXRhc291cmNlIHN1YmplY3QuIFBsZWFzZSBwcmVmZXIgdXNpbmcgXFwncm93c1N1YmplY3RcXCcgaW5zdGVhZCBvZiBcXCdkYXRhc291cmNlU3ViamVjdFxcJycpO1xuICAgICAgc3VwZXIudXBkYXRlRGF0YXNvdXJjZUZyb21Sb3dzKHJvd3MpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1t0YWJsZS1kYXRhc291cmNlXSBTa2lwcGluZyBkYXRhc291cmNlU3ViamVjdCB1cGRhdGUgKG5vdCB1c2VkIHlldCkuJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodG9Cb29sZWFuKHRoaXMuc2VydmljZU9wdGlvbnMucmVhZE9ubHksIGZhbHNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignW3RhYmxlLWRhdGFzb3VyY2VdIEVuYWJsZSB0byBzYXZlLCBiZWNhdXNlIHNlcnZpY2VPcHRpb25zLnJlYWRPbmx5PXRydWUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gU2F2aW5nIHR3aWNlIChzaG91bGQgbmV2ZXIgb2NjdXIpXG4gICAgaWYgKHRoaXMuX3NhdmluZykge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFibGUtZGF0YXNvdXJjZV0gVHJ5aW5nIHRvIHNhdmUgJHt0aGlzLl9lbnRpdHlOYW1lfSByb3dzIHR3aWNlLiBTa2lwYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fc2F2aW5nID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIGNvbnN0IG9ubHlEaXJ0eVJvd3MgPSB0b0Jvb2xlYW4odGhpcy5zZXJ2aWNlT3B0aW9ucy5zYXZlT25seURpcnR5Um93cywgZmFsc2UpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3RhYmxlLWRhdGFzb3VyY2VdIFNhdmluZyAke3RoaXMuX2VudGl0eU5hbWV9IHJvd3MuLi4ge29ubHlEaXJ0eTogJHtvbmx5RGlydHlSb3dzfX1gKTtcblxuICAgICAgLy8gR2V0IGFsbCByb3dzXG4gICAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzKCk7XG5cbiAgICAgIC8vIEZpbmlzaCBlZGl0aW5nIGFsbCByb3dzXG4gICAgICBjb25zdCBpbnZhbGlkUm93cyA9IHJvd3MuZmlsdGVyKHJvdyA9PiByb3cuZWRpdGluZyAmJiAhcm93LmNvbmZpcm1FZGl0Q3JlYXRlKCkpO1xuXG4gICAgICAvLyBDYW5ub3QgZmluaXNoIHNvbWUgcm93czogZXJyb3JcbiAgICAgIGlmIChpbnZhbGlkUm93cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gbG9nIGVycm9yc1xuICAgICAgICBpZiAodGhpcy5jb25maWcuZGVidWcpIGludmFsaWRSb3dzLmZvckVhY2gocm93ID0+IEFwcFRhYmxlVXRpbHMubG9nUm93RXJyb3JzKHJvdywgYFt0YWJsZS1kYXRhc291cmNlXSAke3RoaXMuX2VudGl0eU5hbWV9IHJvdyAjJHtyb3cuaWR9YCkpO1xuICAgICAgICAvLyBTdG9wIHdpdGggYW4gZXJyb3JcbiAgICAgICAgdGhyb3cge2NvZGU6IEVycm9yQ29kZXMuVEFCTEVfSU5WQUxJRF9ST1dfRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5UQUJMRV9JTlZBTElEX1JPV19FUlJPUid9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lZGl0aW5nUm93Q291bnQgPSAwO1xuXG4gICAgICBsZXQgZGF0YTogVFtdO1xuICAgICAgbGV0IGRhdGFUb1NhdmU6IFRbXTtcblxuICAgICAgaWYgKHRoaXMudmFsaWRhdG9yU2VydmljZSkge1xuICAgICAgICBkYXRhVG9TYXZlID0gW107XG4gICAgICAgIGRhdGEgPSByb3dzLm1hcChyb3cgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRhID0gbmV3IHRoaXMuZGF0YUNvbnN0cnVjdG9yKCkgYXMgVDtcbiAgICAgICAgICBjdXJyZW50RGF0YS5mcm9tT2JqZWN0KHJvdy5jdXJyZW50RGF0YSk7XG4gICAgICAgICAgLy8gRmlsdGVyIHRvIGtlZXAgb25seSBkaXJ0eSByb3dcbiAgICAgICAgICBpZiAob25seURpcnR5Um93cyAmJiByb3cudmFsaWRhdG9yLmRpcnR5KSBkYXRhVG9TYXZlLnB1c2goY3VycmVudERhdGEpO1xuICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0YTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghb25seURpcnR5Um93cykgZGF0YVRvU2F2ZSA9IGRhdGE7XG4gICAgICB9XG4gICAgICAvLyBPciB1c2UgdGhlIGN1cnJlbnQgZGF0YSB3aXRob3V0IGNvbnZlcnNpb24gKHdoZW4gbm8gdmFsaWRhdG9yIHNlcnZpY2UgdXNlZClcbiAgICAgIGVsc2Uge1xuICAgICAgICBkYXRhID0gcm93cy5tYXAocm93ID0+IHJvdy5jdXJyZW50RGF0YSk7XG4gICAgICAgIC8vIHNhdmUgYWxsIGRhdGEsIGFzIHdlIGRvbid0IGhhdmUgYW55IGRpcnR5IG1hcmtlclxuICAgICAgICBkYXRhVG9TYXZlID0gZGF0YTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gZGF0YSB0byBzYXZlOiBleGl0XG4gICAgICBpZiAob25seURpcnR5Um93cyAmJiAhZGF0YVRvU2F2ZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGUtZGF0YXNvdXJjZV0gTm8gJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhIHRvIHNhdmUuIFNraXBgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25maWcuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBBc2tpbmcgc2VydmljZSB0byBzYXZlIHRoaXMgJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhOmAsIGRhdGFUb1NhdmUpO1xuICAgICAgYXdhaXQgdGhpcy5kYXRhU2VydmljZS5zYXZlQWxsKGRhdGFUb1NhdmUsIHRoaXMuc2VydmljZU9wdGlvbnMpO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBTYXZpbmcgJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhIFtPS11gKTtcblxuICAgICAgLy8gTFAgMjMvMDMvMjAyMTogdXBkYXRlIGRhdGFzb3VyY2UgaXMgbmVjZXNzYXJ5IGJ1dCBjYW4gYmUgY2hhbmdlZCB0byBhIHJlZmV0Y2goKSBvbiBRdWVyeVJlZiAobXVzdCBiZSBjcmVhdGVkIGFuZCByZWdpc3RlcmVkIGluIEdyYXBocWxTZXJ2aWNlLndhdGNoUXVlcnkpXG4gICAgICB0aGlzLnVwZGF0ZURhdGFzb3VyY2UoZGF0YSwge2VtaXRFdmVudDogZmFsc2V9KTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWJ1ZykgY29uc29sZS5lcnJvcignW3RhYmxlLWRhdGFzb3VyY2VdIEVycm9yIHdoaWxlIHNhdmluZzogJyArIGVycm9yICYmIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3NhdmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVEYXRhc291cmNlKGRhdGE6IFRbXSwgb3B0cz86IHsgZW1pdEV2ZW50OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBVcGRhdGluZyBkYXRhc291cmNlIHdpdGggZGF0YTpgLCBkYXRhKTtcblxuICAgIHN1cGVyLnVwZGF0ZURhdGFzb3VyY2UoZGF0YSwgb3B0cyk7XG5cbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3QoY29sbGVjdGlvblZpZXdlcjogQ29sbGVjdGlvblZpZXdlcik6IE9ic2VydmFibGU8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+IHtcbiAgICAvLyBERUJVRyBjb25zb2xlLmRlYnVnKFwiW2VudGl0aWVzLWRhdGFzb3VyY2VdIGNvbm5lY3RcIik7XG4gICAgcmV0dXJuIHN1cGVyLmNvbm5lY3QoY29sbGVjdGlvblZpZXdlcik7XG4gIH1cblxuICBkaXNjb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXI/OiBDb2xsZWN0aW9uVmlld2VyKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdChjb2xsZWN0aW9uVmlld2VyKTtcbiAgICB0aGlzLl9zdG9wV2F0Y2hpbmckLm5leHQoKTtcbiAgfVxuXG4gIHdhaXRJZGxlKGRlYm91bmNlVGltZU1zPzogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gZmlyc3RGYWxzZVByb21pc2UodGhpcy5sb2FkaW5nU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKGRlYm91bmNlVGltZU1zIHx8IDEwMCkgLy8gaWYgbm90IHN0YXJ0ZWQgeWV0LCB3YWl0XG4gICAgICApKTtcbiAgfVxuXG4gIGNvbmZpcm1DcmVhdGUocm93OiBUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICBpZiAoIXN1cGVyLmNvbmZpcm1DcmVhdGUocm93KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyb3cuZWRpdGluZyAmJiByb3cudmFsaWRhdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t0YWJsZS1kYXRhc291cmNlXSBSb3cgc3RpbGwgaGFzIHtlZGl0aW5nOiB0cnVlfSBhZnRlciBjb25maXJtQ3JlYXRlKCkhIEZvcmNlIGVkaXRpbmcgdG8gZmFsc2UnKTtcbiAgICAgIHJvdy52YWxpZGF0b3IuZGlzYWJsZSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgdGhpcy5fZWRpdGluZ1Jvd0NvdW50LS07XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25maXJtRWRpdChyb3c6IFRhYmxlRWxlbWVudDxUPik6IGJvb2xlYW4ge1xuICAgIGlmICghc3VwZXIuY29uZmlybUVkaXQocm93KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyb3cuZWRpdGluZyAmJiByb3cudmFsaWRhdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t0YWJsZS1kYXRhc291cmNlXSBSb3cgc3RpbGwgaGFzIHtlZGl0aW5nOiB0cnVlfSBhZnRlciBjb25maXJtRWRpdCgpISBGb3JjZSBlZGl0aW5nIHRvIGZhbHNlJyk7XG4gICAgICByb3cudmFsaWRhdG9yLmRpc2FibGUoe29ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfVxuICAgIHRoaXMuX2VkaXRpbmdSb3dDb3VudC0tO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhcnRFZGl0KHJvdzogVGFibGVFbGVtZW50PFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdXBlci5zdGFydEVkaXQocm93KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghcm93LmVkaXRpbmcgJiYgcm93LnZhbGlkYXRvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbdGFibGUtZGF0YXNvdXJjZV0gUm93IHN0aWxsIGhhcyB7ZWRpdGluZzogZmFsc2V9IGFmdGVyIHN0YXJ0RWRpdCgpISBGb3JjZSBlZGl0aW5nJyk7XG4gICAgICByb3cudmFsaWRhdG9yLmVuYWJsZSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgdGhpcy5fZWRpdGluZ1Jvd0NvdW50Kys7XG4gIH1cblxuICBoYW5kbGVFcnJvcihlcnJvcjogYW55LCBtZXNzYWdlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBlcnJvck1zZyA9IGVycm9yICYmIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3I7XG4gICAgY29uc29sZS5lcnJvcihgW3RhYmxlLWRhdGFzb3VyY2VdIFNlcnZpY2UgJHt0aGlzLl9lbnRpdHlOYW1lfSBzZW50IGVycm9yOiAke2Vycm9yTXNnfWAsIGVycm9yKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlIHx8IGVycm9yTXNnKTtcbiAgfVxuXG4gIGhhbmRsZVNlcnZpY2VFcnJvcihlcnJvcjogYW55KSB7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvciAmJiBlcnJvci5tZXNzYWdlIHx8IGVycm9yO1xuICAgIGNvbnNvbGUuZXJyb3IoYFt0YWJsZS1kYXRhc291cmNlXSBTZXJ2aWNlICR7dGhpcy5fZW50aXR5TmFtZX0gc2VudCBlcnJvcjogJHtlcnJvck1zZ31gLCBlcnJvcik7XG4gICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGRlbGV0ZShpZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgbmV3IHJvdzogbm90IG5lZWQgdG8gcHJvcGFnYXRlIHRvIHRoZSBkYXRhU2VydmljZVxuICAgIGlmIChpZCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBzdXBlci5kZWxldGUoaWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93KGlkKTtcbiAgICBpZiAoIXJvdykge1xuICAgICAgY29uc29sZS5lcnJvcihgW3RhYmxlLWRhdGFzb3VyY2VdIFJvdyB0byBkZWxldGUgd2l0aCBpZD0ke2lkfSBub3QgZm91bmRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocm93LmVkaXRpbmcpIHRoaXMuX2VkaXRpbmdSb3dDb3VudC0tO1xuXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xuXG4gICAgdGhpcy5kYXRhU2VydmljZS5kZWxldGVBbGwoW3Jvdy5jdXJyZW50RGF0YV0sIHRoaXMuc2VydmljZU9wdGlvbnMpXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlU2VydmljZUVycm9yKGVycikpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIG1ha2Ugc3VyZSByb3cgaGFzIGJlZW4gZGVsZXRlZCAoYmVjYXVzZSBHcmFwUUhsIGNhY2hlIHJlbW92ZSBjYW4gZmFpbGVkKVxuICAgICAgICAgIGNvbnN0IHByZXNlbnQgPSB0aGlzLmdldFJvdyhpZCkgPT09IHJvdztcbiAgICAgICAgICBpZiAocHJlc2VudCkgc3VwZXIuZGVsZXRlKGlkKTtcblxuICAgICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgIH0sIDMwMCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbChyb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSk6IFByb21pc2U8YW55PiB7XG5cbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFGcm9tUm93cyhyb3dzKTtcbiAgICBjb25zdCByb3dzQnlJZCA9IEJlYW5zLmNvbGxlY3RCeUlkKHJvd3MpO1xuXG4gICAgdHJ5IHtcblxuICAgICAgLy8gQ2FsbCBzZXJ2aWNlIGRlbGV0aW9uXG4gICAgICBhd2FpdCB0aGlzLmRhdGFTZXJ2aWNlLmRlbGV0ZUFsbChkYXRhLCB0aGlzLnNlcnZpY2VPcHRpb25zKTtcblxuICAgICAgLy8gV29ya2Fyb3VuZCwgdG8gYmUgc3VyZSBhbGwgcm93cyBoYXZlIGJlZW4gZGVsZXRlZFxuICAgICAgLy8gU29tZXRpbWVzLCB0aGUgc2VydmljZSBtaXNzIGRlbGV0aW9uLCBvciBHcmFwUUhsIGNhY2hlIHJlbW92ZSBmYWlsZWRcbiAgICAgIGNvbnN0IHJvd05vdERlbGV0ZWQgPSB0aGlzLmdldFJvd3MoKS5tYXAocm93ID0+IHJvd3MuZmluZChyID0+IHIgPT09IHJvdykpO1xuXG4gICAgICAvLyBBcHBseSBtaXNzaW5nIGRlbGV0aW9uXG4gICAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHJvd05vdERlbGV0ZWQpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW3RhYmxlLWRhdGFzb3VyY2VdIEZvcmNlIGRlbGV0aW9uIG9mICR7cm93Tm90RGVsZXRlZC5sZW5ndGh9IHJvd3MgKElzIHNlcnZpY2UgdXBkYXRlIHRoZSBjYWNoZSA/KWApO1xuICAgICAgICByb3dOb3REZWxldGVkXG4gICAgICAgICAgLy8gU3RhcnQgZnJvbSB0aGUgZW5kXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaWQgPiBiLmlkID8gLTEgOiAxKVxuICAgICAgICAgIC5mb3JFYWNoKHIgPT4gc3VwZXIuZGVsZXRlKHIuaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgLy8gSGFuZGxlIHNzZXJ2aWNlIGVycm9yXG4gICAgICB0aGlzLmhhbmRsZVNlcnZpY2VFcnJvcihlcnIpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Um93KGlkOiBudW1iZXIpOiBUYWJsZUVsZW1lbnQ8VD4ge1xuICAgIHJldHVybiBzdXBlci5nZXRSb3coaWQpO1xuICB9XG5cbiAgZ2V0Um93cygpOiBUYWJsZUVsZW1lbnQ8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMucm93c1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU5ldyhpbnNlcnRBdD86IG51bWJlciwgb3B0aW9ucyA9IHtlZGl0aW5nOiB0cnVlfSk6IFByb21pc2U8VGFibGVFbGVtZW50PFQ+fHVuZGVmaW5lZD4ge1xuICAgIGlmICh0aGlzLl9jcmVhdGluZykgcmV0dXJuOyAvLyBBdm9pZCBtdWx0aXBsZSBjYWxsIChzaG91bGQgbmV2ZXIgb2NjdXIpXG5cbiAgICB0aGlzLl9jcmVhdGluZyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm93ID0gYXdhaXQgc3VwZXIuY3JlYXRlTmV3KGluc2VydEF0LCBvcHRpb25zKTtcbiAgICAgIGlmICghcm93KSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZz8ub25Sb3dDcmVhdGVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25maWcub25Sb3dDcmVhdGVkKHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikgIHtcbiAgICAgICAgICAvLyBMb2csIHRoZW4gY29udGludWVcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJvdy5lZGl0aW5nKSB0aGlzLl9lZGl0aW5nUm93Q291bnQrKztcblxuICAgICAgcmV0dXJuIHJvdztcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICB0aGlzLl9jcmVhdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldERhdGEoKTogVFtdIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGF0YUZyb21Sb3dzKHJvd3MpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hNb3JlKG9wdHM/OiB7IGVtaXRFdmVudDogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLl9mZXRjaE1vcmVGbikgcmV0dXJuIGZhbHNlOyAvLyBBdm9pZCBtdWx0aXBsZSBjYWxsXG4gICAgaWYgKHRoaXMuX2VkaXRpbmdSb3dDb3VudCA+IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ2Fubm90IGZldGNoIG1vcmUgJHt0aGlzLl9lbnRpdHlOYW1lfSBiZWNhdXNlICR7dGhpcy5fZWRpdGluZ1Jvd0NvdW50fSByb3cocykgc3RpbGwgZWRpdGluZ2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmRlYnVnKGBXaWxsIGZldGNoaW5nIG1vcmUgcm93KHMpIHN0aWxsLi4uYCk7XG5cbiAgICAvLyBGb3JnZXQgdGhlIGZldGNoTW9yZSBmdW5jdGlvbiwgdG8gYXZvaWQgbXVsdGlwbGUgY2FsbFxuICAgIGNvbnN0IGZldGNoTW9yZUZuID0gdGhpcy5fZmV0Y2hNb3JlRm47XG4gICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSBudWxsO1xuXG4gICAgLy8gRmV0Y2ggbmV4dCBwYWdlXG4gICAgY29uc3QgcmVzOiBMb2FkUmVzdWx0PFQ+ID0gYXdhaXQgZmV0Y2hNb3JlRm4oKTtcblxuICAgIC8vIFNraXAgaWYgZW1wdHkgKG5vIG1vcmUgZGF0YSlcbiAgICBpZiAoaXNFbXB0eUFycmF5KHJlcz8uZGF0YSkpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZGF0YSBzb3VyY2VcbiAgICBzdXBlci51cGRhdGVEYXRhc291cmNlKCh0aGlzLmN1cnJlbnREYXRhIHx8IFtdKS5jb25jYXQoLi4ucmVzLmRhdGEpLCBvcHRzKTtcblxuICAgIC8vIFJlbWVtYmVyIGZldGNoTW9yZVxuICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzLmZldGNoTW9yZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2QgLS0gKi9cblxuICBtYXJrQXNMb2FkaW5nKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzTG9hZGVkKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  import { Directive, Injector, Input } from '@angular/core';
2
2
  import { ValidatorService } from '@e-is/ngx-material-table';
3
- import { AppTableDataSourceOptions, EntitiesTableDataSource } from './entities-table-datasource.class';
3
+ import { EntitiesTableDataSource } from './entities-table-datasource.class';
4
4
  import { AppTable } from './table.class';
5
5
  import { InMemoryEntitiesService } from '../../shared/services/memory-entity-service.class';
6
6
  // @dynamic
@@ -49,11 +49,11 @@ AppInMemoryTable.ctorParameters = () => [
49
49
  { type: Function },
50
50
  { type: InMemoryEntitiesService },
51
51
  { type: ValidatorService },
52
- { type: AppTableDataSourceOptions },
52
+ { type: undefined },
53
53
  { type: undefined }
54
54
  ];
55
55
  AppInMemoryTable.propDecorators = {
56
56
  canEdit: [{ type: Input }],
57
57
  canDelete: [{ type: Input }]
58
58
  };
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LXRhYmxlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3RhYmxlL21lbW9yeS10YWJsZS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFDLHlCQUF5QixFQUFFLHVCQUF1QixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDckcsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV2QyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtREFBbUQsQ0FBQztBQUUxRixXQUFXO0FBRVgsa0VBQWtFO0FBQ2xFLE1BQU0sT0FBZ0IsZ0JBSWxCLFNBQVEsUUFBa0I7SUFhNUIsWUFDRSxRQUFrQixFQUNSLE9BQWlCLEVBQ2pCLFFBQXFCLEVBQ3JCLGlCQUFvRCxFQUNwRCxnQkFBa0MsRUFDNUMsT0FBMEMsRUFDMUMsTUFBVTtRQUVWLEtBQUssQ0FBQyxRQUFRLEVBQ1osT0FBTyxFQUNQLElBQUksdUJBQXVCLENBQVcsUUFBUSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxFQUM3RixNQUFNLENBQUMsQ0FBQztRQVZBLFlBQU8sR0FBUCxPQUFPLENBQVU7UUFDakIsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUNyQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1DO1FBQ3BELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFoQnJDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQXdCekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQywwQkFBMEI7SUFDbkQsQ0FBQztJQXZCRCxJQUFJLEtBQUssQ0FBQyxJQUFTO1FBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQztJQUN0QyxDQUFDO0lBbUJELFFBQVE7UUFDTixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFVLEVBQUUsSUFBOEI7UUFDakQsdUJBQXVCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRTtZQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUVTLE1BQU0sQ0FBQyxFQUFLLEVBQUUsRUFBSztRQUMzQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7OztZQXRERixTQUFTOzs7WUFSUyxRQUFROzs7WUFLbkIsdUJBQXVCO1lBSnZCLGdCQUFnQjtZQUNoQix5QkFBeUI7Ozs7c0JBYzlCLEtBQUs7d0JBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlLCBJbmplY3RvciwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtWYWxpZGF0b3JTZXJ2aWNlfSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUnO1xuaW1wb3J0IHtBcHBUYWJsZURhdGFTb3VyY2VPcHRpb25zLCBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZX0gZnJvbSAnLi9lbnRpdGllcy10YWJsZS1kYXRhc291cmNlLmNsYXNzJztcbmltcG9ydCB7QXBwVGFibGV9IGZyb20gJy4vdGFibGUuY2xhc3MnO1xuaW1wb3J0IHtJRW50aXR5fSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHtJbk1lbW9yeUVudGl0aWVzU2VydmljZX0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL21lbW9yeS1lbnRpdHktc2VydmljZS5jbGFzcyc7XG5cbi8vIEBkeW5hbWljXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFwcEluTWVtb3J5VGFibGU8XG4gIFQgZXh0ZW5kcyBJRW50aXR5PFQsIElEPixcbiAgRiA9IGFueSxcbiAgSUQgPSBudW1iZXJcbiAgPiBleHRlbmRzIEFwcFRhYmxlPFQsIEYsIElEPiB7XG5cbiAgQElucHV0KCkgY2FuRWRpdCA9IGZhbHNlO1xuICBASW5wdXQoKSBjYW5EZWxldGUgPSBmYWxzZTtcblxuICBzZXQgdmFsdWUoZGF0YTogVFtdKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShkYXRhKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLm1lbW9yeURhdGFTZXJ2aWNlLnZhbHVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgY29sdW1uczogc3RyaW5nW10sXG4gICAgcHJvdGVjdGVkIGRhdGFUeXBlOiBuZXcgKCkgPT4gVCxcbiAgICBwcm90ZWN0ZWQgbWVtb3J5RGF0YVNlcnZpY2U6IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlPFQsIEYsIElEPixcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdG9yU2VydmljZTogVmFsaWRhdG9yU2VydmljZSxcbiAgICBvcHRpb25zPzogQXBwVGFibGVEYXRhU291cmNlT3B0aW9uczxULCBJRD4sXG4gICAgZmlsdGVyPzogRlxuICApIHtcbiAgICBzdXBlcihpbmplY3RvcixcbiAgICAgIGNvbHVtbnMsXG4gICAgICBuZXcgRW50aXRpZXNUYWJsZURhdGFTb3VyY2U8VCwgRiwgSUQ+KGRhdGFUeXBlLCBtZW1vcnlEYXRhU2VydmljZSwgdmFsaWRhdG9yU2VydmljZSwgb3B0aW9ucyksXG4gICAgICBmaWx0ZXIpO1xuXG4gICAgdGhpcy5hdXRvTG9hZCA9IGZhbHNlOyAvLyB3YWl0aW5nIHZhbHVlIHRvIGJlIHNldFxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgfVxuXG4gIHNldFZhbHVlKHZhbHVlOiBUW10sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIC8vIFJlc2V0IHByZXZpb3VzIGVycm9yXG4gICAgaWYgKHRoaXMuZXJyb3IpIHtcbiAgICAgIHRoaXMuc2V0RXJyb3IobnVsbCk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICB0aGlzLm1lbW9yeURhdGFTZXJ2aWNlLnZhbHVlID0gdmFsdWU7XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vblJlZnJlc2guZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlcXVhbHModDE6IFQsIHQyOiBUKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWVtb3J5RGF0YVNlcnZpY2UuZXF1YWxzKHQxLCB0Mik7XG4gIH1cbn1cblxuIl19
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LXRhYmxlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3RhYmxlL21lbW9yeS10YWJsZS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFnQyx1QkFBdUIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pHLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFdkMsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFFMUYsV0FBVztBQUVYLGtFQUFrRTtBQUNsRSxNQUFNLE9BQWdCLGdCQUlsQixTQUFRLFFBQWtCO0lBYTVCLFlBQ0UsUUFBa0IsRUFDUixPQUFpQixFQUNqQixRQUFxQixFQUNyQixpQkFBb0QsRUFDcEQsZ0JBQWtDLEVBQzVDLE9BQThDLEVBQzlDLE1BQVU7UUFFVixLQUFLLENBQUMsUUFBUSxFQUNaLE9BQU8sRUFDUCxJQUFJLHVCQUF1QixDQUFXLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsRUFDN0YsTUFBTSxDQUFDLENBQUM7UUFWQSxZQUFPLEdBQVAsT0FBTyxDQUFVO1FBQ2pCLGFBQVEsR0FBUixRQUFRLENBQWE7UUFDckIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQztRQUNwRCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBaEJyQyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUF3QnpCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsMEJBQTBCO0lBQ25ELENBQUM7SUF2QkQsSUFBSSxLQUFLLENBQUMsSUFBUztRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7SUFDdEMsQ0FBQztJQW1CRCxRQUFRO1FBQ04sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBVSxFQUFFLElBQThCO1FBQ2pELHVCQUF1QjtRQUN2QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUU7WUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFUyxNQUFNLENBQUMsRUFBSyxFQUFFLEVBQUs7UUFDM0IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDOzs7WUF0REYsU0FBUzs7O1lBUlMsUUFBUTs7O1lBS25CLHVCQUF1QjtZQUp2QixnQkFBZ0I7Ozs7O3NCQWVyQixLQUFLO3dCQUNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgSW5qZWN0b3IsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VmFsaWRhdG9yU2VydmljZX0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7RW50aXRpZXNUYWJsZURhdGFTb3VyY2VDb25maWcsIEVudGl0aWVzVGFibGVEYXRhU291cmNlfSBmcm9tICcuL2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2UuY2xhc3MnO1xuaW1wb3J0IHtBcHBUYWJsZX0gZnJvbSAnLi90YWJsZS5jbGFzcyc7XG5pbXBvcnQge0lFbnRpdHl9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQge0luTWVtb3J5RW50aXRpZXNTZXJ2aWNlfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzJztcblxuLy8gQGR5bmFtaWNcbkBEaXJlY3RpdmUoKVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXBwSW5NZW1vcnlUYWJsZTxcbiAgVCBleHRlbmRzIElFbnRpdHk8VCwgSUQ+LFxuICBGID0gYW55LFxuICBJRCA9IG51bWJlclxuICA+IGV4dGVuZHMgQXBwVGFibGU8VCwgRiwgSUQ+IHtcblxuICBASW5wdXQoKSBjYW5FZGl0ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNhbkRlbGV0ZSA9IGZhbHNlO1xuXG4gIHNldCB2YWx1ZShkYXRhOiBUW10pIHtcbiAgICB0aGlzLnNldFZhbHVlKGRhdGEpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMubWVtb3J5RGF0YVNlcnZpY2UudmFsdWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgICBwcm90ZWN0ZWQgZGF0YVR5cGU6IG5ldyAoKSA9PiBULFxuICAgIHByb3RlY3RlZCBtZW1vcnlEYXRhU2VydmljZTogSW5NZW1vcnlFbnRpdGllc1NlcnZpY2U8VCwgRiwgSUQ+LFxuICAgIHByb3RlY3RlZCB2YWxpZGF0b3JTZXJ2aWNlOiBWYWxpZGF0b3JTZXJ2aWNlLFxuICAgIG9wdGlvbnM/OiBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZUNvbmZpZzxULCBJRD4sXG4gICAgZmlsdGVyPzogRlxuICApIHtcbiAgICBzdXBlcihpbmplY3RvcixcbiAgICAgIGNvbHVtbnMsXG4gICAgICBuZXcgRW50aXRpZXNUYWJsZURhdGFTb3VyY2U8VCwgRiwgSUQ+KGRhdGFUeXBlLCBtZW1vcnlEYXRhU2VydmljZSwgdmFsaWRhdG9yU2VydmljZSwgb3B0aW9ucyksXG4gICAgICBmaWx0ZXIpO1xuXG4gICAgdGhpcy5hdXRvTG9hZCA9IGZhbHNlOyAvLyB3YWl0aW5nIHZhbHVlIHRvIGJlIHNldFxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgfVxuXG4gIHNldFZhbHVlKHZhbHVlOiBUW10sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIC8vIFJlc2V0IHByZXZpb3VzIGVycm9yXG4gICAgaWYgKHRoaXMuZXJyb3IpIHtcbiAgICAgIHRoaXMuc2V0RXJyb3IobnVsbCk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICB0aGlzLm1lbW9yeURhdGFTZXJ2aWNlLnZhbHVlID0gdmFsdWU7XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vblJlZnJlc2guZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlcXVhbHModDE6IFQsIHQyOiBUKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWVtb3J5RGF0YVNlcnZpY2UuZXF1YWxzKHQxLCB0Mik7XG4gIH1cbn1cblxuIl19