@sumaris-net/ngx-components 1.23.17 → 1.23.18

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.
@@ -75,7 +75,8 @@ export class EntitiesTableDataSource extends TableDataSource {
75
75
  */
76
76
  close() {
77
77
  if (!this._stopWatchSubject.closed) {
78
- console.debug('[table-datasource] Closing...');
78
+ if (this._debug)
79
+ console.debug('[entities-table-datasource] Closing...');
79
80
  this._stopWatchSubject.next();
80
81
  this._stopWatchSubject.complete();
81
82
  this._stopWatchSubject.unsubscribe();
@@ -90,10 +91,10 @@ export class EntitiesTableDataSource extends TableDataSource {
90
91
  return this.dataService.watchAll(offset, size, sortBy, sortDirection, filter, this.serviceOptions)
91
92
  .pipe(catchError(err => this.handleError(err, 'ERROR.LOAD_DATA_ERROR')), map((res) => {
92
93
  if (this._saving) {
93
- console.info(`[table-datasource] Received ${this._entityName} data (from service), but still saving: skip`);
94
+ console.info(`[entities-table-datasource] Received ${this._entityName} data (from service), but still saving: skip`);
94
95
  }
95
96
  else if (this.hasSomeEditingRow()) {
96
- console.warn(`[table-datasource] Received ${this._entityName} data, while some row still editing: skip; Please check save() implementation in the table!`);
97
+ console.warn(`[entities-table-datasource] Received ${this._entityName} data, while some row still editing: skip; Please check save() implementation in the table!`);
97
98
  }
98
99
  else {
99
100
  this.updateDatasource((res.data || []));
@@ -111,22 +112,22 @@ export class EntitiesTableDataSource extends TableDataSource {
111
112
  // Avoid to update dataSourceSubject, when not need
112
113
  if ((_a = this.datasourceSubject.observers) === null || _a === void 0 ? void 0 : _a.length) {
113
114
  if (!this.config.suppressErrors)
114
- console.warn('[table-datasource] Update datasource subject. Please prefer using \'rowsSubject\' instead of \'datasourceSubject\'');
115
+ console.warn('[entities-table-datasource] Update datasource subject. Please prefer using \'rowsSubject\' instead of \'datasourceSubject\'');
115
116
  super.updateDatasourceFromRows(rows);
116
117
  }
117
118
  else {
118
- console.debug('[table-datasource] Skipping datasourceSubject update (not used yet).');
119
+ console.debug('[entities-table-datasource] Skipping datasourceSubject update (not used yet).');
119
120
  }
120
121
  }
121
122
  save() {
122
123
  return __awaiter(this, void 0, void 0, function* () {
123
124
  if (this.config.readOnly) {
124
- console.error('[table-datasource] Enable to save, because config.readOnly=true');
125
+ console.error('[entities-table-datasource] Enable to save, because config.readOnly=true');
125
126
  return false;
126
127
  }
127
128
  // Saving twice (should never occur)
128
129
  if (this._saving) {
129
- console.warn(`[table-datasource] Trying to save ${this._entityName} rows twice. Skip`);
130
+ console.warn(`[entities-table-datasource] Trying to save ${this._entityName} rows twice. Skip`);
130
131
  return false;
131
132
  }
132
133
  this._saving = true;
@@ -134,7 +135,7 @@ export class EntitiesTableDataSource extends TableDataSource {
134
135
  const onlyDirtyRows = this.config.saveOnlyDirtyRows;
135
136
  try {
136
137
  if (this._debug)
137
- console.debug(`[table-datasource] Saving ${this._entityName} rows... {onlyDirtyRows: ${onlyDirtyRows}}`);
138
+ console.debug(`[entities-table-datasource] Saving ${this._entityName} rows... {onlyDirtyRows: ${onlyDirtyRows}}`);
138
139
  // Get all rows
139
140
  const rows = this.getRows();
140
141
  // Finish editing all rows
@@ -143,7 +144,7 @@ export class EntitiesTableDataSource extends TableDataSource {
143
144
  if (invalidRows.length) {
144
145
  // log errors
145
146
  if (this._debug)
146
- invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._entityName} row #${row.id}`));
147
+ invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[entities-table-datasource] ${this._entityName} row #${row.id}`));
147
148
  // Stop with an error
148
149
  throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
149
150
  }
@@ -171,21 +172,21 @@ export class EntitiesTableDataSource extends TableDataSource {
171
172
  // If no data to save: exit
172
173
  if (onlyDirtyRows && !dataToSave.length) {
173
174
  if (this._debug)
174
- console.debug(`[table-datasource] No ${this._entityName} data to save. Skip`);
175
+ console.debug(`[entities-table-datasource] No ${this._entityName} data to save. Skip`);
175
176
  return false;
176
177
  }
177
178
  if (this._debug)
178
- console.debug(`[table-datasource] Asking service to save this ${this._entityName} data:`, dataToSave);
179
+ console.debug(`[entities-table-datasource] Asking service to save this ${this._entityName} data:`, dataToSave);
179
180
  yield this.dataService.saveAll(dataToSave, this.serviceOptions);
180
181
  if (this._debug)
181
- console.debug(`[table-datasource] Saving ${this._entityName} data [OK]`);
182
+ console.debug(`[entities-table-datasource] Saving ${this._entityName} data [OK]`);
182
183
  // 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)
183
184
  this.updateDatasource(data, { emitEvent: false });
184
185
  return true;
185
186
  }
186
187
  catch (error) {
187
188
  if (this._debug)
188
- console.error('[table-datasource] Error while saving: ' + error && error.message || error);
189
+ console.error('[entities-table-datasource] Error while saving: ' + error && error.message || error);
189
190
  throw error;
190
191
  }
191
192
  finally {
@@ -196,7 +197,7 @@ export class EntitiesTableDataSource extends TableDataSource {
196
197
  }
197
198
  updateDatasource(data, opts) {
198
199
  if (this._debug)
199
- console.debug(`[table-datasource] Updating datasource with data:`, data);
200
+ console.debug(`[entities-table-datasource] Updating datasource with data:`, data);
200
201
  super.updateDatasource(data, opts);
201
202
  if (!opts || opts.emitEvent !== false) {
202
203
  this.markAsLoaded();
@@ -208,7 +209,8 @@ export class EntitiesTableDataSource extends TableDataSource {
208
209
  return super.connect(collectionViewer);
209
210
  }
210
211
  disconnect(collectionViewer) {
211
- console.debug('[table-datasource] Disconnecting...');
212
+ if (this._debug)
213
+ console.debug('[entities-table-datasource] Disconnecting...');
212
214
  super.disconnect(collectionViewer);
213
215
  this.close();
214
216
  }
@@ -222,7 +224,7 @@ export class EntitiesTableDataSource extends TableDataSource {
222
224
  if (!super.confirmCreate(row))
223
225
  return false;
224
226
  if (row.editing && row.validator) {
225
- console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
227
+ console.warn('[entities-table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
226
228
  row.validator.disable({ onlySelf: true, emitEvent: false });
227
229
  }
228
230
  return true;
@@ -231,7 +233,7 @@ export class EntitiesTableDataSource extends TableDataSource {
231
233
  if (!super.confirmEdit(row))
232
234
  return false;
233
235
  if (row.editing && row.validator) {
234
- console.warn('[table-datasource] Row still has {editing: true} after confirmEdit()! Force editing to false');
236
+ console.warn('[entities-table-datasource] Row still has {editing: true} after confirmEdit()! Force editing to false');
235
237
  row.validator.disable({ onlySelf: true, emitEvent: false });
236
238
  }
237
239
  return true;
@@ -240,19 +242,19 @@ export class EntitiesTableDataSource extends TableDataSource {
240
242
  if (!super.startEdit(row))
241
243
  return false;
242
244
  if (!row.editing && row.validator) {
243
- console.warn('[table-datasource] Row still has {editing: false} after startEdit()! Force editing');
245
+ console.warn('[entities-table-datasource] Row still has {editing: false} after startEdit()! Force editing');
244
246
  row.validator.enable({ onlySelf: true, emitEvent: false });
245
247
  }
246
248
  }
247
249
  handleError(error, message) {
248
250
  const errorMsg = error && error.message || error;
249
- console.error(`[table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
251
+ console.error(`[entities-table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
250
252
  this.markAsLoaded();
251
253
  throw new Error(message || errorMsg);
252
254
  }
253
255
  handleServiceError(error) {
254
256
  const errorMsg = error && error.message || error;
255
- console.error(`[table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
257
+ console.error(`[entities-table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
256
258
  this.markAsLoaded();
257
259
  throw error;
258
260
  }
@@ -263,7 +265,7 @@ export class EntitiesTableDataSource extends TableDataSource {
263
265
  }
264
266
  const row = this.getRow(id);
265
267
  if (!row) {
266
- console.error(`[table-datasource] Row to delete with id=${id} not found`);
268
+ console.error(`[entities-table-datasource] Row to delete with id=${id} not found`);
267
269
  return;
268
270
  }
269
271
  this.markAsLoading();
@@ -294,7 +296,7 @@ export class EntitiesTableDataSource extends TableDataSource {
294
296
  // In this case, apply missing deletion using the super.delete() function
295
297
  const rowNotDeleted = this.getRows().filter(row => rows.includes(row));
296
298
  if (isNotEmptyArray(rowNotDeleted)) {
297
- console.warn(`[table-datasource] Force deletion of ${rowNotDeleted.length} rows! Please check that data service update the cache, after deletion`);
299
+ console.warn(`[entities-table-datasource] Force deletion of ${rowNotDeleted.length} rows! Please check that data service update the cache, after deletion`);
298
300
  rowNotDeleted
299
301
  // Start at the end
300
302
  .sort((a, b) => a.id > b.id ? -1 : 1)
@@ -400,4 +402,4 @@ EntitiesTableDataSource.ctorParameters = () => [
400
402
  { type: undefined },
401
403
  { type: undefined }
402
404
  ];
403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS9lbnRpdGllcy10YWJsZS1kYXRhc291cmNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFpQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxlQUFlLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTFELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUFDLFNBQVMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUtuRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQVEsWUFBWSxFQUFFLGVBQWUsRUFBWSxTQUFTLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQXlCOUQsV0FBVztBQUVYLGtFQUFrRTtBQUNsRSxNQUFNLE9BQU8sdUJBU1QsU0FBUSxlQUF3QjtJQXFEbEM7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLFFBQW9CLEVBQ0osV0FBdUMsRUFDdkQsZ0JBQW9CLEVBQ3BCLE9BQVc7UUFDckIsS0FBSyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLGtCQUNsQyw0QkFBNEIsRUFBRSxLQUFLLEVBQ25DLFFBQVEsRUFBRSxLQUFLLEVBQ2YsaUJBQWlCLEVBQUUsS0FBSyxJQUNyQixPQUFPLEVBQ1YsQ0FBQztRQVJ1QixnQkFBVyxHQUFY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QUMsS0FBSyxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDOzs7WUF4YkYsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VGFibGVEYXRhU291cmNlLCBUYWJsZUVsZW1lbnQsIFZhbGlkYXRvclNlcnZpY2V9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0VudGl0eSwgSUVudGl0eX0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7RXJyb3JDb2Rlc30gZnJvbSAnLi4vc2VydmljZXMvZXJyb3JzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBtYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NvcnREaXJlY3Rpb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHtDb2xsZWN0aW9uVmlld2VyfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtUYWJsZURhdGFTb3VyY2VDb25maWd9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZS9zcmMvYXBwL25neC1tYXRlcmlhbC10YWJsZS90YWJsZS1kYXRhLXNvdXJjZSc7XG5pbXBvcnQge0VudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucywgRmV0Y2hNb3JlRm4sIElFbnRpdGllc1NlcnZpY2UsIExvYWRSZXN1bHR9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge2ZpcnN0RmFsc2VQcm9taXNlfSBmcm9tICcuLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHtCZWFucywgaXNFbXB0eUFycmF5LCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsLCByZW1vdmVFbmR9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtBcHBUYWJsZVV0aWxzfSBmcm9tICcuL3RhYmxlLnV0aWxzJztcbmltcG9ydCB7ZW52aXJvbm1lbnR9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZUNvbmZpZzxcbiAgVCBleHRlbmRzIEVudGl0eTxULCBJRD4sXG4gIElEID0gbnVtYmVyLFxuICBXTyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyA9IEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyxcbiAgU08gPSBhbnlcbiAgPiBleHRlbmRzIFRhYmxlRGF0YVNvdXJjZUNvbmZpZyB7XG5cbiAgb25Sb3dDcmVhdGVkPzogKHJvdzogVGFibGVFbGVtZW50PFQ+KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgc2F2ZU9ubHlEaXJ0eVJvd3M/OiBib29sZWFuO1xuICByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBkYXRhU2VydmljZU9wdGlvbnM/OiBXTyAmIFNPOyAvLyBPcHRpb25zIHBhc3NlZCB0byB0aGUgZGF0YVNlcnZpY2Uud2F0Y2hBbGwoKSBhbmQgZGF0YVNlcnZpY2Uuc2F2ZUFsbCgpXG5cbiAgd2F0Y2hBbGxPcHRpb25zPzogV087IC8vIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBkYXRhU2VydmljZS5zYXZlQWxsKClcbiAgc2F2ZUFsbE9wdGlvbnM/OiBTTzsgLy8gT3B0aW9ucyBwYXNzZWQgdG8gdGhlIGRhdGFTZXJ2aWNlLnNhdmVBbGwoKVxuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLy8gQGR5bmFtaWNcbkBEaXJlY3RpdmUoKVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgRW50aXRpZXNUYWJsZURhdGFTb3VyY2U8XG4gIFQgZXh0ZW5kcyBJRW50aXR5PFQsIElEPixcbiAgRiA9IGFueSxcbiAgSUQgPSBudW1iZXIsXG4gIFdPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zLFxuICBTTyA9IGFueSxcbiAgViBleHRlbmRzIFZhbGlkYXRvclNlcnZpY2UgPSBWYWxpZGF0b3JTZXJ2aWNlLFxuICBDIGV4dGVuZHMgRW50aXRpZXNUYWJsZURhdGFTb3VyY2VDb25maWc8VCwgSUQsIFdPLCBTTz4gPSBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZUNvbmZpZzxULCBJRCwgV08sIFNPPixcbiAgPlxuICAgIGV4dGVuZHMgVGFibGVEYXRhU291cmNlPFQsIFYsIEM+XG4gICAgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2VudGl0eU5hbWU6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgX2RlYnVnID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfY3JlYXRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zYXZpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9mZXRjaE1vcmVGbjogRmV0Y2hNb3JlRm48TG9hZFJlc3VsdDxUPj4gPSBudWxsO1xuXG4gIHByb3RlY3RlZCBfc3RvcFdhdGNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHVuZGVmaW5lZCk7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB3YXRjaEFsbE9wdGlvbnMgb3Igc2F2ZUFsbE9wdGlvbnNcbiAgICovXG4gIGdldCBzZXJ2aWNlT3B0aW9ucygpOiBXTyAmIFNPIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YVNlcnZpY2VPcHRpb25zXG4gICAgICB8fCB7Li4udGhpcy53YXRjaEFsbE9wdGlvbnMsIC4uLnRoaXMuc2F2ZUFsbE9wdGlvbnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB3YXRjaEFsbE9wdGlvbnMgb3Igc2F2ZUFsbE9wdGlvbnNcbiAgICovXG4gIHNldCBzZXJ2aWNlT3B0aW9ucyh2YWx1ZTogV08gJiBTTykgIHtcbiAgICBjb25zb2xlLndhcm4oJ2RhdGFTb3VyY2Uuc2VydmljZU9wdGlvbnMgaXMgZGVwcmVjYXRlZCEgUGxlYXNlIHVzZSBcXCd3YXRjaEFsbE9wdGlvbnNcXCcgb3IgXFwnc2F2ZUFsbE9wdGlvbnNcXCcgaW5zdGVhZCcpO1xuICAgIHRoaXMuY29uZmlnLmRhdGFTZXJ2aWNlT3B0aW9ucyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHdhdGNoQWxsT3B0aW9ucygpOiBXTyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLndhdGNoQWxsT3B0aW9ucztcbiAgfVxuXG4gIHNldCB3YXRjaEFsbE9wdGlvbnModmFsdWU6IFdPKSAge1xuICAgIHRoaXMuY29uZmlnLndhdGNoQWxsT3B0aW9ucyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHNhdmVBbGxPcHRpb25zKCk6IFNPIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc2F2ZUFsbE9wdGlvbnM7XG4gIH1cblxuICBzZXQgc2F2ZUFsbE9wdGlvbnModmFsdWU6IFNPKSAge1xuICAgIHRoaXMuY29uZmlnLnNhdmVBbGxPcHRpb25zID0gdmFsdWU7XG4gIH1cblxuICBnZXQgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlID09PSBmYWxzZTsgLy8gU2hvdWxkIGJlIGZhbHNlIHdoZW4gdW5kZWZpbmVkIChpbml0aWFsIHN0YXRlKVxuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUgIT09IGZhbHNlOyAvLyBTaG91bGQgYmUgdHJ1ZSB3aGVuIHVuZGVmaW5lZCAoaW5pdGlhbCBzdGF0ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFRhYmxlRGF0YVNvdXJjZSBpbnN0YW5jZSwgdGhhdCBjYW4gYmUgdXNlZCBhcyBkYXRhc291cmNlIG9mIGBAYW5ndWxhci9jZGtgIGRhdGEtdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhU2VydmljZSBBIHNlcnZpY2UgdG8gbG9hZCBhbmQgc2F2ZSBkYXRhXG4gICAqIEBwYXJhbSBkYXRhVHlwZSBUeXBlIG9mIGRhdGEgY29udGFpbmVkIGJ5IHRoZSBUYWJsZS4gSWYgbm90IHNwZWNpZmllZCwgdGhlbiBgZGF0YWAgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIGVudmlyb25tZW50XG4gICAqIEBwYXJhbSB2YWxpZGF0b3JTZXJ2aWNlIFNlcnZpY2UgdGhhdCBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBGb3JtR3JvdXAgdXNlZCB0byB2YWxpZGF0ZSByb3cgZmllbGRzLlxuICAgKiBAcGFyYW0gY29uZmlnIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGFibGUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkYXRhVHlwZTogbmV3KCkgPT4gVCxcbiAgICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IGRhdGFTZXJ2aWNlOiBJRW50aXRpZXNTZXJ2aWNlPFQsIEYsIFdPPixcbiAgICAgICAgICAgICAgdmFsaWRhdG9yU2VydmljZT86IFYsXG4gICAgICAgICAgICAgIG9wdGlvbnM/OiBDKSB7XG4gICAgc3VwZXIoW10sIGRhdGFUeXBlLCB2YWxpZGF0b3JTZXJ2aWNlLCB7XG4gICAgICBrZWVwT3JpZ2luYWxEYXRhQWZ0ZXJDb25maXJtOiBmYWxzZSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHNhdmVPbmx5RGlydHlSb3dzOiBmYWxzZSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcblxuICAgIHRoaXMuX2VudGl0eU5hbWUgPSByZW1vdmVFbmQoKG5ldyBkYXRhVHlwZSgpKS5fX3R5cGVuYW1lIHx8ICdVbmtub3duVk8nLCAnVk8nKTtcbiAgICB0aGlzLl9kZWJ1ZyA9IG9wdGlvbnM/LnN1cHByZXNzRXJyb3JzID09PSBmYWxzZSAmJiAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZGlzY29ubmVjdFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBkaXNjb25uZWN0XG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX3N0b3BXYXRjaFN1YmplY3QuY2xvc2VkKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbdGFibGUtZGF0YXNvdXJjZV0gQ2xvc2luZy4uLicpXG4gICAgICB0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0Lm5leHQoKTtcbiAgICAgIHRoaXMuX3N0b3BXYXRjaFN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgIHRoaXMuX3N0b3BXYXRjaFN1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QuY29tcGxldGUoKTtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICB3YXRjaEFsbChvZmZzZXQ6IG51bWJlcixcbiAgICAgICAgICAgc2l6ZTogbnVtYmVyLFxuICAgICAgICAgICBzb3J0Qnk/OiBzdHJpbmcsXG4gICAgICAgICAgIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uLFxuICAgICAgICAgICBmaWx0ZXI/OiBQYXJ0aWFsPEY+KTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PFQ+PiB7XG5cbiAgICB0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0Lm5leHQoKTtcbiAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IG51bGw7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS53YXRjaEFsbChvZmZzZXQsIHNpemUsIHNvcnRCeSwgc29ydERpcmVjdGlvbiwgZmlsdGVyLCB0aGlzLnNlcnZpY2VPcHRpb25zIGFzIFdPKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCAnRVJST1IuTE9BRF9EQVRBX0VSUk9SJykpLFxuICAgICAgICBtYXAoKHJlczogTG9hZFJlc3VsdDxUPikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9zYXZpbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgW3RhYmxlLWRhdGFzb3VyY2VdIFJlY2VpdmVkICR7dGhpcy5fZW50aXR5TmFtZX0gZGF0YSAoZnJvbSBzZXJ2aWNlKSwgYnV0IHN0aWxsIHNhdmluZzogc2tpcGApO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNTb21lRWRpdGluZ1JvdygpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFt0YWJsZS1kYXRhc291cmNlXSBSZWNlaXZlZCAke3RoaXMuX2VudGl0eU5hbWV9IGRhdGEsIHdoaWxlIHNvbWUgcm93IHN0aWxsIGVkaXRpbmc6IHNraXA7IFBsZWFzZSBjaGVjayBzYXZlKCkgaW1wbGVtZW50YXRpb24gaW4gdGhlIHRhYmxlIWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGFzb3VyY2UoKHJlcy5kYXRhIHx8IFtdKSBhcyBUW10pO1xuICAgICAgICAgICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSByZXMuZmV0Y2hNb3JlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KSxcbiAgICAgICAgLy8gU3RvcCB0aGlzIHBpcGUgbmV4dCB0aW1lIHdlIGNhbGwgd2F0Y2hBbGwoKVxuICAgICAgICB0YWtlVW50aWwodGhpcy5fc3RvcFdhdGNoU3ViamVjdClcbiAgICAgICAgLy8g4pqgIE5vdGljZTogRG9uJ3QgcHV0IGFueSBvcGVyYXRvciBhZnRlciB0YWtlVW50aWwgdG8gYXZvaWQgcG90ZW50aWFsIHN1YnNjcmlwdGlvbiBsZWFrc1xuICAgICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVEYXRhc291cmNlRnJvbVJvd3Mocm93czogVGFibGVFbGVtZW50PFQ+W10pIHtcbiAgICAvLyBBdm9pZCB0byB1cGRhdGUgZGF0YVNvdXJjZVN1YmplY3QsIHdoZW4gbm90IG5lZWRcbiAgICBpZiAodGhpcy5kYXRhc291cmNlU3ViamVjdC5vYnNlcnZlcnM/Lmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0Vycm9ycykgY29uc29sZS53YXJuKCdbdGFibGUtZGF0YXNvdXJjZV0gVXBkYXRlIGRhdGFzb3VyY2Ugc3ViamVjdC4gUGxlYXNlIHByZWZlciB1c2luZyBcXCdyb3dzU3ViamVjdFxcJyBpbnN0ZWFkIG9mIFxcJ2RhdGFzb3VyY2VTdWJqZWN0XFwnJyk7XG4gICAgICBzdXBlci51cGRhdGVEYXRhc291cmNlRnJvbVJvd3Mocm93cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW3RhYmxlLWRhdGFzb3VyY2VdIFNraXBwaW5nIGRhdGFzb3VyY2VTdWJqZWN0IHVwZGF0ZSAobm90IHVzZWQgeWV0KS4nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmNvbmZpZy5yZWFkT25seSkge1xuICAgICAgY29uc29sZS5lcnJvcignW3RhYmxlLWRhdGFzb3VyY2VdIEVuYWJsZSB0byBzYXZlLCBiZWNhdXNlIGNvbmZpZy5yZWFkT25seT10cnVlJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFNhdmluZyB0d2ljZSAoc2hvdWxkIG5ldmVyIG9jY3VyKVxuICAgIGlmICh0aGlzLl9zYXZpbmcpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3RhYmxlLWRhdGFzb3VyY2VdIFRyeWluZyB0byBzYXZlICR7dGhpcy5fZW50aXR5TmFtZX0gcm93cyB0d2ljZS4gU2tpcGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX3NhdmluZyA9IHRydWU7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICBjb25zdCBvbmx5RGlydHlSb3dzID0gdGhpcy5jb25maWcuc2F2ZU9ubHlEaXJ0eVJvd3M7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGUtZGF0YXNvdXJjZV0gU2F2aW5nICR7dGhpcy5fZW50aXR5TmFtZX0gcm93cy4uLiB7b25seURpcnR5Um93czogJHtvbmx5RGlydHlSb3dzfX1gKTtcblxuICAgICAgLy8gR2V0IGFsbCByb3dzXG4gICAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzKCk7XG5cbiAgICAgIC8vIEZpbmlzaCBlZGl0aW5nIGFsbCByb3dzXG4gICAgICBjb25zdCBpbnZhbGlkUm93cyA9IHJvd3MuZmlsdGVyKHJvdyA9PiByb3cuZWRpdGluZyAmJiAhcm93LmNvbmZpcm1FZGl0Q3JlYXRlKCkpO1xuXG4gICAgICAvLyBDYW5ub3QgZmluaXNoIHNvbWUgcm93czogZXJyb3JcbiAgICAgIGlmIChpbnZhbGlkUm93cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gbG9nIGVycm9yc1xuICAgICAgICBpZiAodGhpcy5fZGVidWcpIGludmFsaWRSb3dzLmZvckVhY2gocm93ID0+IEFwcFRhYmxlVXRpbHMubG9nUm93RXJyb3JzKHJvdywgYFt0YWJsZS1kYXRhc291cmNlXSAke3RoaXMuX2VudGl0eU5hbWV9IHJvdyAjJHtyb3cuaWR9YCkpO1xuICAgICAgICAvLyBTdG9wIHdpdGggYW4gZXJyb3JcbiAgICAgICAgdGhyb3cge2NvZGU6IEVycm9yQ29kZXMuVEFCTEVfSU5WQUxJRF9ST1dfRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5UQUJMRV9JTlZBTElEX1JPV19FUlJPUid9O1xuICAgICAgfVxuXG4gICAgICBsZXQgZGF0YTogVFtdO1xuICAgICAgbGV0IGRhdGFUb1NhdmU6IFRbXTtcblxuICAgICAgaWYgKHRoaXMudmFsaWRhdG9yU2VydmljZSkge1xuICAgICAgICBkYXRhVG9TYXZlID0gW107XG4gICAgICAgIGRhdGEgPSByb3dzLm1hcChyb3cgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRhID0gbmV3IHRoaXMuZGF0YUNvbnN0cnVjdG9yKCkgYXMgVDtcbiAgICAgICAgICBjdXJyZW50RGF0YS5mcm9tT2JqZWN0KHJvdy5jdXJyZW50RGF0YSk7XG4gICAgICAgICAgLy8gRmlsdGVyIHRvIGtlZXAgb25seSBkaXJ0eSByb3dcbiAgICAgICAgICBpZiAob25seURpcnR5Um93cyAmJiByb3cudmFsaWRhdG9yLmRpcnR5KSBkYXRhVG9TYXZlLnB1c2goY3VycmVudERhdGEpO1xuICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0YTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghb25seURpcnR5Um93cykgZGF0YVRvU2F2ZSA9IGRhdGE7XG4gICAgICB9XG4gICAgICAvLyBPciB1c2UgdGhlIGN1cnJlbnQgZGF0YSB3aXRob3V0IGNvbnZlcnNpb24gKHdoZW4gbm8gdmFsaWRhdG9yIHNlcnZpY2UgdXNlZClcbiAgICAgIGVsc2Uge1xuICAgICAgICBkYXRhID0gcm93cy5tYXAocm93ID0+IHJvdy5jdXJyZW50RGF0YSk7XG4gICAgICAgIC8vIHNhdmUgYWxsIGRhdGEsIGFzIHdlIGRvbid0IGhhdmUgYW55IGRpcnR5IG1hcmtlclxuICAgICAgICBkYXRhVG9TYXZlID0gZGF0YTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gZGF0YSB0byBzYXZlOiBleGl0XG4gICAgICBpZiAob25seURpcnR5Um93cyAmJiAhZGF0YVRvU2F2ZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGUtZGF0YXNvdXJjZV0gTm8gJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhIHRvIHNhdmUuIFNraXBgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBBc2tpbmcgc2VydmljZSB0byBzYXZlIHRoaXMgJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhOmAsIGRhdGFUb1NhdmUpO1xuICAgICAgYXdhaXQgdGhpcy5kYXRhU2VydmljZS5zYXZlQWxsKGRhdGFUb1NhdmUsIHRoaXMuc2VydmljZU9wdGlvbnMpO1xuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBTYXZpbmcgJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhIFtPS11gKTtcblxuICAgICAgLy8gTFAgMjMvMDMvMjAyMTogdXBkYXRlIGRhdGFzb3VyY2UgaXMgbmVjZXNzYXJ5IGJ1dCBjYW4gYmUgY2hhbmdlZCB0byBhIHJlZmV0Y2goKSBvbiBRdWVyeVJlZiAobXVzdCBiZSBjcmVhdGVkIGFuZCByZWdpc3RlcmVkIGluIEdyYXBocWxTZXJ2aWNlLndhdGNoUXVlcnkpXG4gICAgICB0aGlzLnVwZGF0ZURhdGFzb3VyY2UoZGF0YSwge2VtaXRFdmVudDogZmFsc2V9KTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5lcnJvcignW3RhYmxlLWRhdGFzb3VyY2VdIEVycm9yIHdoaWxlIHNhdmluZzogJyArIGVycm9yICYmIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3NhdmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVEYXRhc291cmNlKGRhdGE6IFRbXSwgb3B0cz86IHsgZW1pdEV2ZW50OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZS1kYXRhc291cmNlXSBVcGRhdGluZyBkYXRhc291cmNlIHdpdGggZGF0YTpgLCBkYXRhKTtcblxuICAgIHN1cGVyLnVwZGF0ZURhdGFzb3VyY2UoZGF0YSwgb3B0cyk7XG5cbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmlld2VyOiBDb2xsZWN0aW9uVmlld2VyO1xuXG4gIGNvbm5lY3QoY29sbGVjdGlvblZpZXdlcjogQ29sbGVjdGlvblZpZXdlcik6IE9ic2VydmFibGU8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+IHtcbiAgICAvLyBERUJVRyBjb25zb2xlLmRlYnVnKFwiW2VudGl0aWVzLWRhdGFzb3VyY2VdIGNvbm5lY3RcIik7XG4gICAgdGhpcy52aWV3ZXIgPSBjb2xsZWN0aW9uVmlld2VyO1xuICAgIHJldHVybiBzdXBlci5jb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXIpO1xuICB9XG5cbiAgZGlzY29ubmVjdChjb2xsZWN0aW9uVmlld2VyPzogQ29sbGVjdGlvblZpZXdlcikge1xuICAgIGNvbnNvbGUuZGVidWcoJ1t0YWJsZS1kYXRhc291cmNlXSBEaXNjb25uZWN0aW5nLi4uJylcbiAgICBzdXBlci5kaXNjb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXIpO1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIHdhaXRJZGxlKGRlYm91bmNlVGltZU1zPzogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gZmlyc3RGYWxzZVByb21pc2UodGhpcy5sb2FkaW5nU3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKGRlYm91bmNlVGltZU1zIHx8IDEwMCkgLy8gaWYgbm90IHN0YXJ0ZWQgeWV0LCB3YWl0XG4gICAgICApKTtcbiAgfVxuXG4gIGNvbmZpcm1DcmVhdGUocm93OiBUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICBpZiAoIXN1cGVyLmNvbmZpcm1DcmVhdGUocm93KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyb3cuZWRpdGluZyAmJiByb3cudmFsaWRhdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t0YWJsZS1kYXRhc291cmNlXSBSb3cgc3RpbGwgaGFzIHtlZGl0aW5nOiB0cnVlfSBhZnRlciBjb25maXJtQ3JlYXRlKCkhIEZvcmNlIGVkaXRpbmcgdG8gZmFsc2UnKTtcbiAgICAgIHJvdy52YWxpZGF0b3IuZGlzYWJsZSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25maXJtRWRpdChyb3c6IFRhYmxlRWxlbWVudDxUPik6IGJvb2xlYW4ge1xuICAgIGlmICghc3VwZXIuY29uZmlybUVkaXQocm93KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyb3cuZWRpdGluZyAmJiByb3cudmFsaWRhdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t0YWJsZS1kYXRhc291cmNlXSBSb3cgc3RpbGwgaGFzIHtlZGl0aW5nOiB0cnVlfSBhZnRlciBjb25maXJtRWRpdCgpISBGb3JjZSBlZGl0aW5nIHRvIGZhbHNlJyk7XG4gICAgICByb3cudmFsaWRhdG9yLmRpc2FibGUoe29ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhcnRFZGl0KHJvdzogVGFibGVFbGVtZW50PFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdXBlci5zdGFydEVkaXQocm93KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghcm93LmVkaXRpbmcgJiYgcm93LnZhbGlkYXRvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbdGFibGUtZGF0YXNvdXJjZV0gUm93IHN0aWxsIGhhcyB7ZWRpdGluZzogZmFsc2V9IGFmdGVyIHN0YXJ0RWRpdCgpISBGb3JjZSBlZGl0aW5nJyk7XG4gICAgICByb3cudmFsaWRhdG9yLmVuYWJsZSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVFcnJvcihlcnJvcjogYW55LCBtZXNzYWdlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBlcnJvck1zZyA9IGVycm9yICYmIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3I7XG4gICAgY29uc29sZS5lcnJvcihgW3RhYmxlLWRhdGFzb3VyY2VdIFNlcnZpY2UgJHt0aGlzLl9lbnRpdHlOYW1lfSBzZW50IGVycm9yOiAke2Vycm9yTXNnfWAsIGVycm9yKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlIHx8IGVycm9yTXNnKTtcbiAgfVxuXG4gIGhhbmRsZVNlcnZpY2VFcnJvcihlcnJvcjogYW55KSB7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvciAmJiBlcnJvci5tZXNzYWdlIHx8IGVycm9yO1xuICAgIGNvbnNvbGUuZXJyb3IoYFt0YWJsZS1kYXRhc291cmNlXSBTZXJ2aWNlICR7dGhpcy5fZW50aXR5TmFtZX0gc2VudCBlcnJvcjogJHtlcnJvck1zZ31gLCBlcnJvcik7XG4gICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGRlbGV0ZShpZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgbmV3IHJvdzogbm90IG5lZWQgdG8gcHJvcGFnYXRlIHRvIHRoZSBkYXRhU2VydmljZVxuICAgIGlmIChpZCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBzdXBlci5kZWxldGUoaWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93KGlkKTtcbiAgICBpZiAoIXJvdykge1xuICAgICAgY29uc29sZS5lcnJvcihgW3RhYmxlLWRhdGFzb3VyY2VdIFJvdyB0byBkZWxldGUgd2l0aCBpZD0ke2lkfSBub3QgZm91bmRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIHRoaXMuZGF0YVNlcnZpY2UuZGVsZXRlQWxsKFtyb3cuY3VycmVudERhdGFdLCB0aGlzLnNlcnZpY2VPcHRpb25zKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZVNlcnZpY2VFcnJvcihlcnIpKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgcm93IGhhcyBiZWVuIGRlbGV0ZWQgKGJlY2F1c2UgR3JhcFFIbCBjYWNoZSByZW1vdmUgY2FuIGZhaWxlZClcbiAgICAgICAgICBjb25zdCBwcmVzZW50ID0gdGhpcy5nZXRSb3coaWQpID09PSByb3c7XG4gICAgICAgICAgaWYgKHByZXNlbnQpIHN1cGVyLmRlbGV0ZShpZCk7XG5cbiAgICAgICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgICAgICB9LCAzMDApO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVBbGwocm93czogVGFibGVFbGVtZW50PFQ+W10pOiBQcm9taXNlPGFueT4ge1xuXG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREYXRhRnJvbVJvd3Mocm93cyk7XG5cbiAgICB0cnkge1xuXG4gICAgICAvLyBDYWxsIHNlcnZpY2UgZGVsZXRpb25cbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNlcnZpY2UuZGVsZXRlQWxsKGRhdGEsIHRoaXMuc2VydmljZU9wdGlvbnMpO1xuXG4gICAgICAvLyBXb3JrYXJvdW5kLCB0byBiZSBzdXJlIGFsbCByb3dzIGhhdmUgYmVlbiBkZWxldGVkXG4gICAgICAvLyBTb21ldGltZSwgdGhlIHNlcnZpY2UgbWlzcyBkZWxldGlvbiwgb3IgR3JhcGhRbCBjYWNoZSByZW1vdmUgZmFpbGVkLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCBhcHBseSBtaXNzaW5nIGRlbGV0aW9uIHVzaW5nIHRoZSBzdXBlci5kZWxldGUoKSBmdW5jdGlvblxuICAgICAgY29uc3Qgcm93Tm90RGVsZXRlZCA9IHRoaXMuZ2V0Um93cygpLmZpbHRlcihyb3cgPT4gcm93cy5pbmNsdWRlcyhyb3cpKTtcbiAgICAgIGlmIChpc05vdEVtcHR5QXJyYXkocm93Tm90RGVsZXRlZCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbdGFibGUtZGF0YXNvdXJjZV0gRm9yY2UgZGVsZXRpb24gb2YgJHtyb3dOb3REZWxldGVkLmxlbmd0aH0gcm93cyEgUGxlYXNlIGNoZWNrIHRoYXQgZGF0YSBzZXJ2aWNlIHVwZGF0ZSB0aGUgY2FjaGUsIGFmdGVyIGRlbGV0aW9uYCk7XG4gICAgICAgIHJvd05vdERlbGV0ZWRcbiAgICAgICAgICAvLyBTdGFydCBhdCB0aGUgZW5kXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaWQgPiBiLmlkID8gLTEgOiAxKVxuICAgICAgICAgIC5mb3JFYWNoKHIgPT4gc3VwZXIuZGVsZXRlKHIuaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgLy8gSGFuZGxlIHNlcnZpY2UgZXJyb3JcbiAgICAgIHRoaXMuaGFuZGxlU2VydmljZUVycm9yKGVycik7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICBnZXRSb3coaWQ6IG51bWJlcik6IFRhYmxlRWxlbWVudDxUPiB7XG4gICAgcmV0dXJuIHN1cGVyLmdldFJvdyhpZCk7XG4gIH1cblxuICBnZXRSb3dzKCk6IFRhYmxlRWxlbWVudDxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzU3ViamVjdC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgaGFzU29tZUVkaXRpbmdSb3coKSB7XG4gICAgcmV0dXJuICh0aGlzLnJvd3NTdWJqZWN0LnZhbHVlIHx8IFtdKS5zb21lKHJvdyA9PiByb3cuZWRpdGluZyk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVOZXcoaW5zZXJ0QXQ/OiBudW1iZXIsIG9wdGlvbnMgPSB7ZWRpdGluZzogdHJ1ZX0pOiBQcm9taXNlPFRhYmxlRWxlbWVudDxUPnx1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5fY3JlYXRpbmcpIHJldHVybjsgLy8gQXZvaWQgbXVsdGlwbGUgY2FsbCAoc2hvdWxkIG5ldmVyIG9jY3VyKVxuXG4gICAgdGhpcy5fY3JlYXRpbmcgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHN1cGVyLmNyZWF0ZU5ldyhpbnNlcnRBdCwgb3B0aW9ucyk7XG4gICAgICBpZiAoIXJvdykgcmV0dXJuO1xuXG4gICAgICBpZiAodGhpcy5jb25maWc/Lm9uUm93Q3JlYXRlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlnLm9uUm93Q3JlYXRlZChyb3cpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpICB7XG4gICAgICAgICAgLy8gTG9nLCB0aGVuIGNvbnRpbnVlXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb3c7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgdGhpcy5fY3JlYXRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXREYXRhKCk6IFRbXSB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0Um93cygpO1xuICAgIHJldHVybiB0aGlzLmdldERhdGFGcm9tUm93cyhyb3dzKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTW9yZShvcHRzPzogeyBlbWl0RXZlbnQ6IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5fZmV0Y2hNb3JlRm4pIHJldHVybiBmYWxzZTsgLy8gQXZvaWQgbXVsdGlwbGUgY2FsbFxuICAgIGlmICh0aGlzLmhhc1NvbWVFZGl0aW5nUm93KCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ2Fubm90IGZldGNoIG1vcmUgJHt0aGlzLl9lbnRpdHlOYW1lfSBiZWNhdXNlIHNvbWUgcm93KSBzdGlsbCBlZGl0aW5nYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUuZGVidWcoYFdpbGwgZmV0Y2hpbmcgbW9yZSByb3cocykgc3RpbGwuLi5gKTtcblxuICAgIC8vIEZvcmdldCB0aGUgZmV0Y2hNb3JlIGZ1bmN0aW9uLCB0byBhdm9pZCBtdWx0aXBsZSBjYWxsXG4gICAgY29uc3QgZmV0Y2hNb3JlRm4gPSB0aGlzLl9mZXRjaE1vcmVGbjtcbiAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IG51bGw7XG5cbiAgICAvLyBGZXRjaCBuZXh0IHBhZ2VcbiAgICBjb25zdCByZXM6IExvYWRSZXN1bHQ8VD4gPSBhd2FpdCBmZXRjaE1vcmVGbigpO1xuXG4gICAgLy8gU2tpcCBpZiBlbXB0eSAobm8gbW9yZSBkYXRhKVxuICAgIGlmIChpc0VtcHR5QXJyYXkocmVzPy5kYXRhKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBkYXRhIHNvdXJjZVxuICAgIHN1cGVyLnVwZGF0ZURhdGFzb3VyY2UoKHRoaXMuY3VycmVudERhdGEgfHwgW10pLmNvbmNhdCguLi5yZXMuZGF0YSksIG9wdHMpO1xuXG4gICAgLy8gUmVtZW1iZXIgZmV0Y2hNb3JlXG4gICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSByZXMuZmV0Y2hNb3JlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZCAtLSAqL1xuXG4gIG1hcmtBc0xvYWRpbmcoKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBtYXJrQXNMb2FkZWQoKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuIl19
405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS9lbnRpdGllcy10YWJsZS1kYXRhc291cmNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFpQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxlQUFlLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTFELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUFDLFNBQVMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUtuRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQVEsWUFBWSxFQUFFLGVBQWUsRUFBWSxTQUFTLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQXlCOUQsV0FBVztBQUVYLGtFQUFrRTtBQUNsRSxNQUFNLE9BQU8sdUJBU1QsU0FBUSxlQUF3QjtJQXFEbEM7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLFFBQW9CLEVBQ0osV0FBdUMsRUFDdkQsZ0JBQW9CLEVBQ3BCLE9BQVc7UUFDckIsS0FBSyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLGtCQUNsQyw0QkFBNEIsRUFBRSxLQUFLLEVBQ25DLFFBQVEsRUFBRSxLQUFLLEVBQ2YsaUJBQWlCLEVBQUUsS0FBSyxJQUNyQixPQUFPLEVBQ1YsQ0FBQztRQVJ1QixnQkFBVyxHQUFY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QUssS0FBSyxLQUFLLEVBQUU7WUFDdkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDOzs7WUF4YkYsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VGFibGVEYXRhU291cmNlLCBUYWJsZUVsZW1lbnQsIFZhbGlkYXRvclNlcnZpY2V9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0VudGl0eSwgSUVudGl0eX0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7RXJyb3JDb2Rlc30gZnJvbSAnLi4vc2VydmljZXMvZXJyb3JzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBtYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NvcnREaXJlY3Rpb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHtDb2xsZWN0aW9uVmlld2VyfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtUYWJsZURhdGFTb3VyY2VDb25maWd9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZS9zcmMvYXBwL25neC1tYXRlcmlhbC10YWJsZS90YWJsZS1kYXRhLXNvdXJjZSc7XG5pbXBvcnQge0VudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucywgRmV0Y2hNb3JlRm4sIElFbnRpdGllc1NlcnZpY2UsIExvYWRSZXN1bHR9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge2ZpcnN0RmFsc2VQcm9taXNlfSBmcm9tICcuLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHtCZWFucywgaXNFbXB0eUFycmF5LCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsLCByZW1vdmVFbmR9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtBcHBUYWJsZVV0aWxzfSBmcm9tICcuL3RhYmxlLnV0aWxzJztcbmltcG9ydCB7ZW52aXJvbm1lbnR9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZUNvbmZpZzxcbiAgVCBleHRlbmRzIEVudGl0eTxULCBJRD4sXG4gIElEID0gbnVtYmVyLFxuICBXTyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyA9IEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyxcbiAgU08gPSBhbnlcbiAgPiBleHRlbmRzIFRhYmxlRGF0YVNvdXJjZUNvbmZpZyB7XG5cbiAgb25Sb3dDcmVhdGVkPzogKHJvdzogVGFibGVFbGVtZW50PFQ+KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgc2F2ZU9ubHlEaXJ0eVJvd3M/OiBib29sZWFuO1xuICByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBkYXRhU2VydmljZU9wdGlvbnM/OiBXTyAmIFNPOyAvLyBPcHRpb25zIHBhc3NlZCB0byB0aGUgZGF0YVNlcnZpY2Uud2F0Y2hBbGwoKSBhbmQgZGF0YVNlcnZpY2Uuc2F2ZUFsbCgpXG5cbiAgd2F0Y2hBbGxPcHRpb25zPzogV087IC8vIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBkYXRhU2VydmljZS5zYXZlQWxsKClcbiAgc2F2ZUFsbE9wdGlvbnM/OiBTTzsgLy8gT3B0aW9ucyBwYXNzZWQgdG8gdGhlIGRhdGFTZXJ2aWNlLnNhdmVBbGwoKVxuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLy8gQGR5bmFtaWNcbkBEaXJlY3RpdmUoKVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgRW50aXRpZXNUYWJsZURhdGFTb3VyY2U8XG4gIFQgZXh0ZW5kcyBJRW50aXR5PFQsIElEPixcbiAgRiA9IGFueSxcbiAgSUQgPSBudW1iZXIsXG4gIFdPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zLFxuICBTTyA9IGFueSxcbiAgViBleHRlbmRzIFZhbGlkYXRvclNlcnZpY2UgPSBWYWxpZGF0b3JTZXJ2aWNlLFxuICBDIGV4dGVuZHMgRW50aXRpZXNUYWJsZURhdGFTb3VyY2VDb25maWc8VCwgSUQsIFdPLCBTTz4gPSBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZUNvbmZpZzxULCBJRCwgV08sIFNPPixcbiAgPlxuICAgIGV4dGVuZHMgVGFibGVEYXRhU291cmNlPFQsIFYsIEM+XG4gICAgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2VudGl0eU5hbWU6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgX2RlYnVnID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfY3JlYXRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zYXZpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9mZXRjaE1vcmVGbjogRmV0Y2hNb3JlRm48TG9hZFJlc3VsdDxUPj4gPSBudWxsO1xuXG4gIHByb3RlY3RlZCBfc3RvcFdhdGNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHVuZGVmaW5lZCk7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB3YXRjaEFsbE9wdGlvbnMgb3Igc2F2ZUFsbE9wdGlvbnNcbiAgICovXG4gIGdldCBzZXJ2aWNlT3B0aW9ucygpOiBXTyAmIFNPIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YVNlcnZpY2VPcHRpb25zXG4gICAgICB8fCB7Li4udGhpcy53YXRjaEFsbE9wdGlvbnMsIC4uLnRoaXMuc2F2ZUFsbE9wdGlvbnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB3YXRjaEFsbE9wdGlvbnMgb3Igc2F2ZUFsbE9wdGlvbnNcbiAgICovXG4gIHNldCBzZXJ2aWNlT3B0aW9ucyh2YWx1ZTogV08gJiBTTykgIHtcbiAgICBjb25zb2xlLndhcm4oJ2RhdGFTb3VyY2Uuc2VydmljZU9wdGlvbnMgaXMgZGVwcmVjYXRlZCEgUGxlYXNlIHVzZSBcXCd3YXRjaEFsbE9wdGlvbnNcXCcgb3IgXFwnc2F2ZUFsbE9wdGlvbnNcXCcgaW5zdGVhZCcpO1xuICAgIHRoaXMuY29uZmlnLmRhdGFTZXJ2aWNlT3B0aW9ucyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHdhdGNoQWxsT3B0aW9ucygpOiBXTyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLndhdGNoQWxsT3B0aW9ucztcbiAgfVxuXG4gIHNldCB3YXRjaEFsbE9wdGlvbnModmFsdWU6IFdPKSAge1xuICAgIHRoaXMuY29uZmlnLndhdGNoQWxsT3B0aW9ucyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHNhdmVBbGxPcHRpb25zKCk6IFNPIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc2F2ZUFsbE9wdGlvbnM7XG4gIH1cblxuICBzZXQgc2F2ZUFsbE9wdGlvbnModmFsdWU6IFNPKSAge1xuICAgIHRoaXMuY29uZmlnLnNhdmVBbGxPcHRpb25zID0gdmFsdWU7XG4gIH1cblxuICBnZXQgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlID09PSBmYWxzZTsgLy8gU2hvdWxkIGJlIGZhbHNlIHdoZW4gdW5kZWZpbmVkIChpbml0aWFsIHN0YXRlKVxuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUgIT09IGZhbHNlOyAvLyBTaG91bGQgYmUgdHJ1ZSB3aGVuIHVuZGVmaW5lZCAoaW5pdGlhbCBzdGF0ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFRhYmxlRGF0YVNvdXJjZSBpbnN0YW5jZSwgdGhhdCBjYW4gYmUgdXNlZCBhcyBkYXRhc291cmNlIG9mIGBAYW5ndWxhci9jZGtgIGRhdGEtdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhU2VydmljZSBBIHNlcnZpY2UgdG8gbG9hZCBhbmQgc2F2ZSBkYXRhXG4gICAqIEBwYXJhbSBkYXRhVHlwZSBUeXBlIG9mIGRhdGEgY29udGFpbmVkIGJ5IHRoZSBUYWJsZS4gSWYgbm90IHNwZWNpZmllZCwgdGhlbiBgZGF0YWAgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIGVudmlyb25tZW50XG4gICAqIEBwYXJhbSB2YWxpZGF0b3JTZXJ2aWNlIFNlcnZpY2UgdGhhdCBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBGb3JtR3JvdXAgdXNlZCB0byB2YWxpZGF0ZSByb3cgZmllbGRzLlxuICAgKiBAcGFyYW0gY29uZmlnIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGFibGUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkYXRhVHlwZTogbmV3KCkgPT4gVCxcbiAgICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IGRhdGFTZXJ2aWNlOiBJRW50aXRpZXNTZXJ2aWNlPFQsIEYsIFdPPixcbiAgICAgICAgICAgICAgdmFsaWRhdG9yU2VydmljZT86IFYsXG4gICAgICAgICAgICAgIG9wdGlvbnM/OiBDKSB7XG4gICAgc3VwZXIoW10sIGRhdGFUeXBlLCB2YWxpZGF0b3JTZXJ2aWNlLCB7XG4gICAgICBrZWVwT3JpZ2luYWxEYXRhQWZ0ZXJDb25maXJtOiBmYWxzZSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHNhdmVPbmx5RGlydHlSb3dzOiBmYWxzZSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcblxuICAgIHRoaXMuX2VudGl0eU5hbWUgPSByZW1vdmVFbmQoKG5ldyBkYXRhVHlwZSgpKS5fX3R5cGVuYW1lIHx8ICdVbmtub3duVk8nLCAnVk8nKTtcbiAgICB0aGlzLl9kZWJ1ZyA9IG9wdGlvbnM/LnN1cHByZXNzRXJyb3JzID09PSBmYWxzZSAmJiAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZGlzY29ubmVjdFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBkaXNjb25uZWN0XG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX3N0b3BXYXRjaFN1YmplY3QuY2xvc2VkKSB7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1tlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBDbG9zaW5nLi4uJyk7XG4gICAgICB0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0Lm5leHQoKTtcbiAgICAgIHRoaXMuX3N0b3BXYXRjaFN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgIHRoaXMuX3N0b3BXYXRjaFN1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QuY29tcGxldGUoKTtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICB3YXRjaEFsbChvZmZzZXQ6IG51bWJlcixcbiAgICAgICAgICAgc2l6ZTogbnVtYmVyLFxuICAgICAgICAgICBzb3J0Qnk/OiBzdHJpbmcsXG4gICAgICAgICAgIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uLFxuICAgICAgICAgICBmaWx0ZXI/OiBQYXJ0aWFsPEY+KTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PFQ+PiB7XG5cbiAgICB0aGlzLl9zdG9wV2F0Y2hTdWJqZWN0Lm5leHQoKTtcbiAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IG51bGw7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS53YXRjaEFsbChvZmZzZXQsIHNpemUsIHNvcnRCeSwgc29ydERpcmVjdGlvbiwgZmlsdGVyLCB0aGlzLnNlcnZpY2VPcHRpb25zIGFzIFdPKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCAnRVJST1IuTE9BRF9EQVRBX0VSUk9SJykpLFxuICAgICAgICBtYXAoKHJlczogTG9hZFJlc3VsdDxUPikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9zYXZpbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFJlY2VpdmVkICR7dGhpcy5fZW50aXR5TmFtZX0gZGF0YSAoZnJvbSBzZXJ2aWNlKSwgYnV0IHN0aWxsIHNhdmluZzogc2tpcGApO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNTb21lRWRpdGluZ1JvdygpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBSZWNlaXZlZCAke3RoaXMuX2VudGl0eU5hbWV9IGRhdGEsIHdoaWxlIHNvbWUgcm93IHN0aWxsIGVkaXRpbmc6IHNraXA7IFBsZWFzZSBjaGVjayBzYXZlKCkgaW1wbGVtZW50YXRpb24gaW4gdGhlIHRhYmxlIWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGFzb3VyY2UoKHJlcy5kYXRhIHx8IFtdKSBhcyBUW10pO1xuICAgICAgICAgICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSByZXMuZmV0Y2hNb3JlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KSxcbiAgICAgICAgLy8gU3RvcCB0aGlzIHBpcGUgbmV4dCB0aW1lIHdlIGNhbGwgd2F0Y2hBbGwoKVxuICAgICAgICB0YWtlVW50aWwodGhpcy5fc3RvcFdhdGNoU3ViamVjdClcbiAgICAgICAgLy8g4pqgIE5vdGljZTogRG9uJ3QgcHV0IGFueSBvcGVyYXRvciBhZnRlciB0YWtlVW50aWwgdG8gYXZvaWQgcG90ZW50aWFsIHN1YnNjcmlwdGlvbiBsZWFrc1xuICAgICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVEYXRhc291cmNlRnJvbVJvd3Mocm93czogVGFibGVFbGVtZW50PFQ+W10pIHtcbiAgICAvLyBBdm9pZCB0byB1cGRhdGUgZGF0YVNvdXJjZVN1YmplY3QsIHdoZW4gbm90IG5lZWRcbiAgICBpZiAodGhpcy5kYXRhc291cmNlU3ViamVjdC5vYnNlcnZlcnM/Lmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0Vycm9ycykgY29uc29sZS53YXJuKCdbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gVXBkYXRlIGRhdGFzb3VyY2Ugc3ViamVjdC4gUGxlYXNlIHByZWZlciB1c2luZyBcXCdyb3dzU3ViamVjdFxcJyBpbnN0ZWFkIG9mIFxcJ2RhdGFzb3VyY2VTdWJqZWN0XFwnJyk7XG4gICAgICBzdXBlci51cGRhdGVEYXRhc291cmNlRnJvbVJvd3Mocm93cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFNraXBwaW5nIGRhdGFzb3VyY2VTdWJqZWN0IHVwZGF0ZSAobm90IHVzZWQgeWV0KS4nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmNvbmZpZy5yZWFkT25seSkge1xuICAgICAgY29uc29sZS5lcnJvcignW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIEVuYWJsZSB0byBzYXZlLCBiZWNhdXNlIGNvbmZpZy5yZWFkT25seT10cnVlJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFNhdmluZyB0d2ljZSAoc2hvdWxkIG5ldmVyIG9jY3VyKVxuICAgIGlmICh0aGlzLl9zYXZpbmcpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFRyeWluZyB0byBzYXZlICR7dGhpcy5fZW50aXR5TmFtZX0gcm93cyB0d2ljZS4gU2tpcGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX3NhdmluZyA9IHRydWU7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICBjb25zdCBvbmx5RGlydHlSb3dzID0gdGhpcy5jb25maWcuc2F2ZU9ubHlEaXJ0eVJvd3M7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gU2F2aW5nICR7dGhpcy5fZW50aXR5TmFtZX0gcm93cy4uLiB7b25seURpcnR5Um93czogJHtvbmx5RGlydHlSb3dzfX1gKTtcblxuICAgICAgLy8gR2V0IGFsbCByb3dzXG4gICAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzKCk7XG5cbiAgICAgIC8vIEZpbmlzaCBlZGl0aW5nIGFsbCByb3dzXG4gICAgICBjb25zdCBpbnZhbGlkUm93cyA9IHJvd3MuZmlsdGVyKHJvdyA9PiByb3cuZWRpdGluZyAmJiAhcm93LmNvbmZpcm1FZGl0Q3JlYXRlKCkpO1xuXG4gICAgICAvLyBDYW5ub3QgZmluaXNoIHNvbWUgcm93czogZXJyb3JcbiAgICAgIGlmIChpbnZhbGlkUm93cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gbG9nIGVycm9yc1xuICAgICAgICBpZiAodGhpcy5fZGVidWcpIGludmFsaWRSb3dzLmZvckVhY2gocm93ID0+IEFwcFRhYmxlVXRpbHMubG9nUm93RXJyb3JzKHJvdywgYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSAke3RoaXMuX2VudGl0eU5hbWV9IHJvdyAjJHtyb3cuaWR9YCkpO1xuICAgICAgICAvLyBTdG9wIHdpdGggYW4gZXJyb3JcbiAgICAgICAgdGhyb3cge2NvZGU6IEVycm9yQ29kZXMuVEFCTEVfSU5WQUxJRF9ST1dfRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5UQUJMRV9JTlZBTElEX1JPV19FUlJPUid9O1xuICAgICAgfVxuXG4gICAgICBsZXQgZGF0YTogVFtdO1xuICAgICAgbGV0IGRhdGFUb1NhdmU6IFRbXTtcblxuICAgICAgaWYgKHRoaXMudmFsaWRhdG9yU2VydmljZSkge1xuICAgICAgICBkYXRhVG9TYXZlID0gW107XG4gICAgICAgIGRhdGEgPSByb3dzLm1hcChyb3cgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRhID0gbmV3IHRoaXMuZGF0YUNvbnN0cnVjdG9yKCkgYXMgVDtcbiAgICAgICAgICBjdXJyZW50RGF0YS5mcm9tT2JqZWN0KHJvdy5jdXJyZW50RGF0YSk7XG4gICAgICAgICAgLy8gRmlsdGVyIHRvIGtlZXAgb25seSBkaXJ0eSByb3dcbiAgICAgICAgICBpZiAob25seURpcnR5Um93cyAmJiByb3cudmFsaWRhdG9yLmRpcnR5KSBkYXRhVG9TYXZlLnB1c2goY3VycmVudERhdGEpO1xuICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0YTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghb25seURpcnR5Um93cykgZGF0YVRvU2F2ZSA9IGRhdGE7XG4gICAgICB9XG4gICAgICAvLyBPciB1c2UgdGhlIGN1cnJlbnQgZGF0YSB3aXRob3V0IGNvbnZlcnNpb24gKHdoZW4gbm8gdmFsaWRhdG9yIHNlcnZpY2UgdXNlZClcbiAgICAgIGVsc2Uge1xuICAgICAgICBkYXRhID0gcm93cy5tYXAocm93ID0+IHJvdy5jdXJyZW50RGF0YSk7XG4gICAgICAgIC8vIHNhdmUgYWxsIGRhdGEsIGFzIHdlIGRvbid0IGhhdmUgYW55IGRpcnR5IG1hcmtlclxuICAgICAgICBkYXRhVG9TYXZlID0gZGF0YTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gZGF0YSB0byBzYXZlOiBleGl0XG4gICAgICBpZiAob25seURpcnR5Um93cyAmJiAhZGF0YVRvU2F2ZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gTm8gJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhIHRvIHNhdmUuIFNraXBgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBBc2tpbmcgc2VydmljZSB0byBzYXZlIHRoaXMgJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhOmAsIGRhdGFUb1NhdmUpO1xuICAgICAgYXdhaXQgdGhpcy5kYXRhU2VydmljZS5zYXZlQWxsKGRhdGFUb1NhdmUsIHRoaXMuc2VydmljZU9wdGlvbnMpO1xuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBTYXZpbmcgJHt0aGlzLl9lbnRpdHlOYW1lfSBkYXRhIFtPS11gKTtcblxuICAgICAgLy8gTFAgMjMvMDMvMjAyMTogdXBkYXRlIGRhdGFzb3VyY2UgaXMgbmVjZXNzYXJ5IGJ1dCBjYW4gYmUgY2hhbmdlZCB0byBhIHJlZmV0Y2goKSBvbiBRdWVyeVJlZiAobXVzdCBiZSBjcmVhdGVkIGFuZCByZWdpc3RlcmVkIGluIEdyYXBocWxTZXJ2aWNlLndhdGNoUXVlcnkpXG4gICAgICB0aGlzLnVwZGF0ZURhdGFzb3VyY2UoZGF0YSwge2VtaXRFdmVudDogZmFsc2V9KTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5lcnJvcignW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIEVycm9yIHdoaWxlIHNhdmluZzogJyArIGVycm9yICYmIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3NhdmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVEYXRhc291cmNlKGRhdGE6IFRbXSwgb3B0cz86IHsgZW1pdEV2ZW50OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBVcGRhdGluZyBkYXRhc291cmNlIHdpdGggZGF0YTpgLCBkYXRhKTtcblxuICAgIHN1cGVyLnVwZGF0ZURhdGFzb3VyY2UoZGF0YSwgb3B0cyk7XG5cbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmlld2VyOiBDb2xsZWN0aW9uVmlld2VyO1xuXG4gIGNvbm5lY3QoY29sbGVjdGlvblZpZXdlcjogQ29sbGVjdGlvblZpZXdlcik6IE9ic2VydmFibGU8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+IHtcbiAgICAvLyBERUJVRyBjb25zb2xlLmRlYnVnKFwiW2VudGl0aWVzLWRhdGFzb3VyY2VdIGNvbm5lY3RcIik7XG4gICAgdGhpcy52aWV3ZXIgPSBjb2xsZWN0aW9uVmlld2VyO1xuICAgIHJldHVybiBzdXBlci5jb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXIpO1xuICB9XG5cbiAgZGlzY29ubmVjdChjb2xsZWN0aW9uVmlld2VyPzogQ29sbGVjdGlvblZpZXdlcikge1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIERpc2Nvbm5lY3RpbmcuLi4nKVxuICAgIHN1cGVyLmRpc2Nvbm5lY3QoY29sbGVjdGlvblZpZXdlcik7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgd2FpdElkbGUoZGVib3VuY2VUaW1lTXM/OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBmaXJzdEZhbHNlUHJvbWlzZSh0aGlzLmxvYWRpbmdTdWJqZWN0XG4gICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoZGVib3VuY2VUaW1lTXMgfHwgMTAwKSAvLyBpZiBub3Qgc3RhcnRlZCB5ZXQsIHdhaXRcbiAgICAgICkpO1xuICB9XG5cbiAgY29uZmlybUNyZWF0ZShyb3c6IFRhYmxlRWxlbWVudDxUPikge1xuICAgIGlmICghc3VwZXIuY29uZmlybUNyZWF0ZShyb3cpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHJvdy5lZGl0aW5nICYmIHJvdy52YWxpZGF0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFJvdyBzdGlsbCBoYXMge2VkaXRpbmc6IHRydWV9IGFmdGVyIGNvbmZpcm1DcmVhdGUoKSEgRm9yY2UgZWRpdGluZyB0byBmYWxzZScpO1xuICAgICAgcm93LnZhbGlkYXRvci5kaXNhYmxlKHtvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbmZpcm1FZGl0KHJvdzogVGFibGVFbGVtZW50PFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdXBlci5jb25maXJtRWRpdChyb3cpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHJvdy5lZGl0aW5nICYmIHJvdy52YWxpZGF0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFJvdyBzdGlsbCBoYXMge2VkaXRpbmc6IHRydWV9IGFmdGVyIGNvbmZpcm1FZGl0KCkhIEZvcmNlIGVkaXRpbmcgdG8gZmFsc2UnKTtcbiAgICAgIHJvdy52YWxpZGF0b3IuZGlzYWJsZSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGFydEVkaXQocm93OiBUYWJsZUVsZW1lbnQ8VD4pOiBib29sZWFuIHtcbiAgICBpZiAoIXN1cGVyLnN0YXJ0RWRpdChyb3cpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFyb3cuZWRpdGluZyAmJiByb3cudmFsaWRhdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBSb3cgc3RpbGwgaGFzIHtlZGl0aW5nOiBmYWxzZX0gYWZ0ZXIgc3RhcnRFZGl0KCkhIEZvcmNlIGVkaXRpbmcnKTtcbiAgICAgIHJvdy52YWxpZGF0b3IuZW5hYmxlKHtvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUVycm9yKGVycm9yOiBhbnksIG1lc3NhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGVycm9yTXNnID0gZXJyb3IgJiYgZXJyb3IubWVzc2FnZSB8fCBlcnJvcjtcbiAgICBjb25zb2xlLmVycm9yKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gU2VydmljZSAke3RoaXMuX2VudGl0eU5hbWV9IHNlbnQgZXJyb3I6ICR7ZXJyb3JNc2d9YCwgZXJyb3IpO1xuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UgfHwgZXJyb3JNc2cpO1xuICB9XG5cbiAgaGFuZGxlU2VydmljZUVycm9yKGVycm9yOiBhbnkpIHtcbiAgICBjb25zdCBlcnJvck1zZyA9IGVycm9yICYmIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3I7XG4gICAgY29uc29sZS5lcnJvcihgW2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2VdIFNlcnZpY2UgJHt0aGlzLl9lbnRpdHlOYW1lfSBzZW50IGVycm9yOiAke2Vycm9yTXNnfWAsIGVycm9yKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgZGVsZXRlKGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBJZiBuZXcgcm93OiBub3QgbmVlZCB0byBwcm9wYWdhdGUgdG8gdGhlIGRhdGFTZXJ2aWNlXG4gICAgaWYgKGlkID09PSAtMSkge1xuICAgICAgcmV0dXJuIHN1cGVyLmRlbGV0ZShpZCk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93ID0gdGhpcy5nZXRSb3coaWQpO1xuICAgIGlmICghcm93KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZV0gUm93IHRvIGRlbGV0ZSB3aXRoIGlkPSR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgdGhpcy5kYXRhU2VydmljZS5kZWxldGVBbGwoW3Jvdy5jdXJyZW50RGF0YV0sIHRoaXMuc2VydmljZU9wdGlvbnMpXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlU2VydmljZUVycm9yKGVycikpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIG1ha2Ugc3VyZSByb3cgaGFzIGJlZW4gZGVsZXRlZCAoYmVjYXVzZSBHcmFwUUhsIGNhY2hlIHJlbW92ZSBjYW4gZmFpbGVkKVxuICAgICAgICAgIGNvbnN0IHByZXNlbnQgPSB0aGlzLmdldFJvdyhpZCkgPT09IHJvdztcbiAgICAgICAgICBpZiAocHJlc2VudCkgc3VwZXIuZGVsZXRlKGlkKTtcblxuICAgICAgICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgICAgIH0sIDMwMCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbChyb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSk6IFByb21pc2U8YW55PiB7XG5cbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFGcm9tUm93cyhyb3dzKTtcblxuICAgIHRyeSB7XG5cbiAgICAgIC8vIENhbGwgc2VydmljZSBkZWxldGlvblxuICAgICAgYXdhaXQgdGhpcy5kYXRhU2VydmljZS5kZWxldGVBbGwoZGF0YSwgdGhpcy5zZXJ2aWNlT3B0aW9ucyk7XG5cbiAgICAgIC8vIFdvcmthcm91bmQsIHRvIGJlIHN1cmUgYWxsIHJvd3MgaGF2ZSBiZWVuIGRlbGV0ZWRcbiAgICAgIC8vIFNvbWV0aW1lLCB0aGUgc2VydmljZSBtaXNzIGRlbGV0aW9uLCBvciBHcmFwaFFsIGNhY2hlIHJlbW92ZSBmYWlsZWQuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UsIGFwcGx5IG1pc3NpbmcgZGVsZXRpb24gdXNpbmcgdGhlIHN1cGVyLmRlbGV0ZSgpIGZ1bmN0aW9uXG4gICAgICBjb25zdCByb3dOb3REZWxldGVkID0gdGhpcy5nZXRSb3dzKCkuZmlsdGVyKHJvdyA9PiByb3dzLmluY2x1ZGVzKHJvdykpO1xuICAgICAgaWYgKGlzTm90RW1wdHlBcnJheShyb3dOb3REZWxldGVkKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtlbnRpdGllcy10YWJsZS1kYXRhc291cmNlXSBGb3JjZSBkZWxldGlvbiBvZiAke3Jvd05vdERlbGV0ZWQubGVuZ3RofSByb3dzISBQbGVhc2UgY2hlY2sgdGhhdCBkYXRhIHNlcnZpY2UgdXBkYXRlIHRoZSBjYWNoZSwgYWZ0ZXIgZGVsZXRpb25gKTtcbiAgICAgICAgcm93Tm90RGVsZXRlZFxuICAgICAgICAgIC8vIFN0YXJ0IGF0IHRoZSBlbmRcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pZCA+IGIuaWQgPyAtMSA6IDEpXG4gICAgICAgICAgLmZvckVhY2gociA9PiBzdXBlci5kZWxldGUoci5pZCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBIYW5kbGUgc2VydmljZSBlcnJvclxuICAgICAgdGhpcy5oYW5kbGVTZXJ2aWNlRXJyb3IoZXJyKTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFJvdyhpZDogbnVtYmVyKTogVGFibGVFbGVtZW50PFQ+IHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0Um93KGlkKTtcbiAgfVxuXG4gIGdldFJvd3MoKTogVGFibGVFbGVtZW50PFQ+W10ge1xuICAgIHJldHVybiB0aGlzLnJvd3NTdWJqZWN0LmdldFZhbHVlKCk7XG4gIH1cblxuICBoYXNTb21lRWRpdGluZ1JvdygpIHtcbiAgICByZXR1cm4gKHRoaXMucm93c1N1YmplY3QudmFsdWUgfHwgW10pLnNvbWUocm93ID0+IHJvdy5lZGl0aW5nKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU5ldyhpbnNlcnRBdD86IG51bWJlciwgb3B0aW9ucyA9IHtlZGl0aW5nOiB0cnVlfSk6IFByb21pc2U8VGFibGVFbGVtZW50PFQ+fHVuZGVmaW5lZD4ge1xuICAgIGlmICh0aGlzLl9jcmVhdGluZykgcmV0dXJuOyAvLyBBdm9pZCBtdWx0aXBsZSBjYWxsIChzaG91bGQgbmV2ZXIgb2NjdXIpXG5cbiAgICB0aGlzLl9jcmVhdGluZyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm93ID0gYXdhaXQgc3VwZXIuY3JlYXRlTmV3KGluc2VydEF0LCBvcHRpb25zKTtcbiAgICAgIGlmICghcm93KSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZz8ub25Sb3dDcmVhdGVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25maWcub25Sb3dDcmVhdGVkKHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikgIHtcbiAgICAgICAgICAvLyBMb2csIHRoZW4gY29udGludWVcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJvdztcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICB0aGlzLl9jcmVhdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldERhdGEoKTogVFtdIHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXRSb3dzKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGF0YUZyb21Sb3dzKHJvd3MpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hNb3JlKG9wdHM/OiB7IGVtaXRFdmVudDogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLl9mZXRjaE1vcmVGbikgcmV0dXJuIGZhbHNlOyAvLyBBdm9pZCBtdWx0aXBsZSBjYWxsXG4gICAgaWYgKHRoaXMuaGFzU29tZUVkaXRpbmdSb3coKSkge1xuICAgICAgY29uc29sZS53YXJuKGBDYW5ub3QgZmV0Y2ggbW9yZSAke3RoaXMuX2VudGl0eU5hbWV9IGJlY2F1c2Ugc29tZSByb3cpIHN0aWxsIGVkaXRpbmdgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5kZWJ1ZyhgV2lsbCBmZXRjaGluZyBtb3JlIHJvdyhzKSBzdGlsbC4uLmApO1xuXG4gICAgLy8gRm9yZ2V0IHRoZSBmZXRjaE1vcmUgZnVuY3Rpb24sIHRvIGF2b2lkIG11bHRpcGxlIGNhbGxcbiAgICBjb25zdCBmZXRjaE1vcmVGbiA9IHRoaXMuX2ZldGNoTW9yZUZuO1xuICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gbnVsbDtcblxuICAgIC8vIEZldGNoIG5leHQgcGFnZVxuICAgIGNvbnN0IHJlczogTG9hZFJlc3VsdDxUPiA9IGF3YWl0IGZldGNoTW9yZUZuKCk7XG5cbiAgICAvLyBTa2lwIGlmIGVtcHR5IChubyBtb3JlIGRhdGEpXG4gICAgaWYgKGlzRW1wdHlBcnJheShyZXM/LmRhdGEpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRhdGEgc291cmNlXG4gICAgc3VwZXIudXBkYXRlRGF0YXNvdXJjZSgodGhpcy5jdXJyZW50RGF0YSB8fCBbXSkuY29uY2F0KC4uLnJlcy5kYXRhKSwgb3B0cyk7XG5cbiAgICAvLyBSZW1lbWJlciBmZXRjaE1vcmVcbiAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IHJlcy5mZXRjaE1vcmU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kIC0tICovXG5cbiAgbWFya0FzTG9hZGluZygpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc0xvYWRlZCgpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -22573,7 +22573,8 @@ class EntitiesTableDataSource extends TableDataSource {
22573
22573
  */
22574
22574
  close() {
22575
22575
  if (!this._stopWatchSubject.closed) {
22576
- console.debug('[table-datasource] Closing...');
22576
+ if (this._debug)
22577
+ console.debug('[entities-table-datasource] Closing...');
22577
22578
  this._stopWatchSubject.next();
22578
22579
  this._stopWatchSubject.complete();
22579
22580
  this._stopWatchSubject.unsubscribe();
@@ -22588,10 +22589,10 @@ class EntitiesTableDataSource extends TableDataSource {
22588
22589
  return this.dataService.watchAll(offset, size, sortBy, sortDirection, filter, this.serviceOptions)
22589
22590
  .pipe(catchError(err => this.handleError(err, 'ERROR.LOAD_DATA_ERROR')), map((res) => {
22590
22591
  if (this._saving) {
22591
- console.info(`[table-datasource] Received ${this._entityName} data (from service), but still saving: skip`);
22592
+ console.info(`[entities-table-datasource] Received ${this._entityName} data (from service), but still saving: skip`);
22592
22593
  }
22593
22594
  else if (this.hasSomeEditingRow()) {
22594
- console.warn(`[table-datasource] Received ${this._entityName} data, while some row still editing: skip; Please check save() implementation in the table!`);
22595
+ console.warn(`[entities-table-datasource] Received ${this._entityName} data, while some row still editing: skip; Please check save() implementation in the table!`);
22595
22596
  }
22596
22597
  else {
22597
22598
  this.updateDatasource((res.data || []));
@@ -22609,22 +22610,22 @@ class EntitiesTableDataSource extends TableDataSource {
22609
22610
  // Avoid to update dataSourceSubject, when not need
22610
22611
  if ((_a = this.datasourceSubject.observers) === null || _a === void 0 ? void 0 : _a.length) {
22611
22612
  if (!this.config.suppressErrors)
22612
- console.warn('[table-datasource] Update datasource subject. Please prefer using \'rowsSubject\' instead of \'datasourceSubject\'');
22613
+ console.warn('[entities-table-datasource] Update datasource subject. Please prefer using \'rowsSubject\' instead of \'datasourceSubject\'');
22613
22614
  super.updateDatasourceFromRows(rows);
22614
22615
  }
22615
22616
  else {
22616
- console.debug('[table-datasource] Skipping datasourceSubject update (not used yet).');
22617
+ console.debug('[entities-table-datasource] Skipping datasourceSubject update (not used yet).');
22617
22618
  }
22618
22619
  }
22619
22620
  save() {
22620
22621
  return __awaiter(this, void 0, void 0, function* () {
22621
22622
  if (this.config.readOnly) {
22622
- console.error('[table-datasource] Enable to save, because config.readOnly=true');
22623
+ console.error('[entities-table-datasource] Enable to save, because config.readOnly=true');
22623
22624
  return false;
22624
22625
  }
22625
22626
  // Saving twice (should never occur)
22626
22627
  if (this._saving) {
22627
- console.warn(`[table-datasource] Trying to save ${this._entityName} rows twice. Skip`);
22628
+ console.warn(`[entities-table-datasource] Trying to save ${this._entityName} rows twice. Skip`);
22628
22629
  return false;
22629
22630
  }
22630
22631
  this._saving = true;
@@ -22632,7 +22633,7 @@ class EntitiesTableDataSource extends TableDataSource {
22632
22633
  const onlyDirtyRows = this.config.saveOnlyDirtyRows;
22633
22634
  try {
22634
22635
  if (this._debug)
22635
- console.debug(`[table-datasource] Saving ${this._entityName} rows... {onlyDirtyRows: ${onlyDirtyRows}}`);
22636
+ console.debug(`[entities-table-datasource] Saving ${this._entityName} rows... {onlyDirtyRows: ${onlyDirtyRows}}`);
22636
22637
  // Get all rows
22637
22638
  const rows = this.getRows();
22638
22639
  // Finish editing all rows
@@ -22641,7 +22642,7 @@ class EntitiesTableDataSource extends TableDataSource {
22641
22642
  if (invalidRows.length) {
22642
22643
  // log errors
22643
22644
  if (this._debug)
22644
- invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[table-datasource] ${this._entityName} row #${row.id}`));
22645
+ invalidRows.forEach(row => AppTableUtils.logRowErrors(row, `[entities-table-datasource] ${this._entityName} row #${row.id}`));
22645
22646
  // Stop with an error
22646
22647
  throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
22647
22648
  }
@@ -22669,21 +22670,21 @@ class EntitiesTableDataSource extends TableDataSource {
22669
22670
  // If no data to save: exit
22670
22671
  if (onlyDirtyRows && !dataToSave.length) {
22671
22672
  if (this._debug)
22672
- console.debug(`[table-datasource] No ${this._entityName} data to save. Skip`);
22673
+ console.debug(`[entities-table-datasource] No ${this._entityName} data to save. Skip`);
22673
22674
  return false;
22674
22675
  }
22675
22676
  if (this._debug)
22676
- console.debug(`[table-datasource] Asking service to save this ${this._entityName} data:`, dataToSave);
22677
+ console.debug(`[entities-table-datasource] Asking service to save this ${this._entityName} data:`, dataToSave);
22677
22678
  yield this.dataService.saveAll(dataToSave, this.serviceOptions);
22678
22679
  if (this._debug)
22679
- console.debug(`[table-datasource] Saving ${this._entityName} data [OK]`);
22680
+ console.debug(`[entities-table-datasource] Saving ${this._entityName} data [OK]`);
22680
22681
  // 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)
22681
22682
  this.updateDatasource(data, { emitEvent: false });
22682
22683
  return true;
22683
22684
  }
22684
22685
  catch (error) {
22685
22686
  if (this._debug)
22686
- console.error('[table-datasource] Error while saving: ' + error && error.message || error);
22687
+ console.error('[entities-table-datasource] Error while saving: ' + error && error.message || error);
22687
22688
  throw error;
22688
22689
  }
22689
22690
  finally {
@@ -22694,7 +22695,7 @@ class EntitiesTableDataSource extends TableDataSource {
22694
22695
  }
22695
22696
  updateDatasource(data, opts) {
22696
22697
  if (this._debug)
22697
- console.debug(`[table-datasource] Updating datasource with data:`, data);
22698
+ console.debug(`[entities-table-datasource] Updating datasource with data:`, data);
22698
22699
  super.updateDatasource(data, opts);
22699
22700
  if (!opts || opts.emitEvent !== false) {
22700
22701
  this.markAsLoaded();
@@ -22706,7 +22707,8 @@ class EntitiesTableDataSource extends TableDataSource {
22706
22707
  return super.connect(collectionViewer);
22707
22708
  }
22708
22709
  disconnect(collectionViewer) {
22709
- console.debug('[table-datasource] Disconnecting...');
22710
+ if (this._debug)
22711
+ console.debug('[entities-table-datasource] Disconnecting...');
22710
22712
  super.disconnect(collectionViewer);
22711
22713
  this.close();
22712
22714
  }
@@ -22720,7 +22722,7 @@ class EntitiesTableDataSource extends TableDataSource {
22720
22722
  if (!super.confirmCreate(row))
22721
22723
  return false;
22722
22724
  if (row.editing && row.validator) {
22723
- console.warn('[table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
22725
+ console.warn('[entities-table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');
22724
22726
  row.validator.disable({ onlySelf: true, emitEvent: false });
22725
22727
  }
22726
22728
  return true;
@@ -22729,7 +22731,7 @@ class EntitiesTableDataSource extends TableDataSource {
22729
22731
  if (!super.confirmEdit(row))
22730
22732
  return false;
22731
22733
  if (row.editing && row.validator) {
22732
- console.warn('[table-datasource] Row still has {editing: true} after confirmEdit()! Force editing to false');
22734
+ console.warn('[entities-table-datasource] Row still has {editing: true} after confirmEdit()! Force editing to false');
22733
22735
  row.validator.disable({ onlySelf: true, emitEvent: false });
22734
22736
  }
22735
22737
  return true;
@@ -22738,19 +22740,19 @@ class EntitiesTableDataSource extends TableDataSource {
22738
22740
  if (!super.startEdit(row))
22739
22741
  return false;
22740
22742
  if (!row.editing && row.validator) {
22741
- console.warn('[table-datasource] Row still has {editing: false} after startEdit()! Force editing');
22743
+ console.warn('[entities-table-datasource] Row still has {editing: false} after startEdit()! Force editing');
22742
22744
  row.validator.enable({ onlySelf: true, emitEvent: false });
22743
22745
  }
22744
22746
  }
22745
22747
  handleError(error, message) {
22746
22748
  const errorMsg = error && error.message || error;
22747
- console.error(`[table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
22749
+ console.error(`[entities-table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
22748
22750
  this.markAsLoaded();
22749
22751
  throw new Error(message || errorMsg);
22750
22752
  }
22751
22753
  handleServiceError(error) {
22752
22754
  const errorMsg = error && error.message || error;
22753
- console.error(`[table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
22755
+ console.error(`[entities-table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);
22754
22756
  this.markAsLoaded();
22755
22757
  throw error;
22756
22758
  }
@@ -22761,7 +22763,7 @@ class EntitiesTableDataSource extends TableDataSource {
22761
22763
  }
22762
22764
  const row = this.getRow(id);
22763
22765
  if (!row) {
22764
- console.error(`[table-datasource] Row to delete with id=${id} not found`);
22766
+ console.error(`[entities-table-datasource] Row to delete with id=${id} not found`);
22765
22767
  return;
22766
22768
  }
22767
22769
  this.markAsLoading();
@@ -22792,7 +22794,7 @@ class EntitiesTableDataSource extends TableDataSource {
22792
22794
  // In this case, apply missing deletion using the super.delete() function
22793
22795
  const rowNotDeleted = this.getRows().filter(row => rows.includes(row));
22794
22796
  if (isNotEmptyArray(rowNotDeleted)) {
22795
- console.warn(`[table-datasource] Force deletion of ${rowNotDeleted.length} rows! Please check that data service update the cache, after deletion`);
22797
+ console.warn(`[entities-table-datasource] Force deletion of ${rowNotDeleted.length} rows! Please check that data service update the cache, after deletion`);
22796
22798
  rowNotDeleted
22797
22799
  // Start at the end
22798
22800
  .sort((a, b) => a.id > b.id ? -1 : 1)