@sumaris-net/ngx-components 0.18.11 → 0.18.12

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.
@@ -32,7 +32,6 @@ export class InMemoryEntitiesService extends EntitiesService {
32
32
  // Detect rankOrder on the entity class
33
33
  id: (Object.getOwnPropertyNames(new dataType()).findIndex(key => key === 'rankOrder') !== -1) ? 'rankOrder' : undefined }, options.sortByReplacement);
34
34
  }
35
- // TODO add test see sub-batches.modal.ts onLoadData & _hiddenData
36
35
  set value(data) {
37
36
  this.setValue(data);
38
37
  }
@@ -64,61 +63,67 @@ export class InMemoryEntitiesService extends EntitiesService {
64
63
  }
65
64
  return this._onChange
66
65
  .pipe(filter(isNotNil), mergeMap((_) => __awaiter(this, void 0, void 0, function* () {
67
- this._hiddenData = [];
68
- if (isEmptyArray(this.data)) {
69
- return { data: [], total: 0 };
70
- }
71
- // Apply sort
72
- let data = this._sortFn(this.data || [], sortBy, sortDirection);
73
- if (this._onLoad) {
74
- const promiseOrData = this._onLoad(data);
75
- data = ((promiseOrData instanceof Promise)) ? yield promiseOrData : promiseOrData;
76
- }
77
- // Apply filter (will update hiddenData)
78
- data = this.filter(data, filterData, this._hiddenData);
79
- // Compute the total length
80
- const total = data.length;
81
- // If page size=0 (e.g. only need total)
82
- if (size === 0) {
83
- this._hiddenData.push(...data);
84
- return { data: [], total };
85
- }
86
- // Slice in a page (using offset and size)
87
- if (offset > 0) {
88
- // Offset after the end: no result
89
- if (offset >= data.length) {
90
- this._hiddenData.push(...data);
91
- data = [];
66
+ const excludedDataByFilter = [];
67
+ let excludedDataByPagination;
68
+ try {
69
+ if (isEmptyArray(this.data)) {
70
+ return { data: [], total: 0 };
92
71
  }
93
- else {
94
- const hiddenData = (size > 0 && ((offset + size) < data.length)) ?
95
- // Slice using limit to size
96
- data.slice(0, offset - 1).concat(data.slice(offset + size)) :
97
- // Slice without limit
98
- data.slice(0, offset - 1);
99
- this._hiddenData.push(...hiddenData);
100
- data = (size > 0 && ((offset + size) < data.length)) ?
101
- // Slice using limit to size
102
- data.slice(offset, offset + size) :
103
- // Slice without limit
104
- data.slice(offset);
72
+ // Apply sort
73
+ let data = this._sortFn(this.data || [], sortBy, sortDirection);
74
+ if (this._onLoad) {
75
+ const promiseOrData = this._onLoad(data);
76
+ data = ((promiseOrData instanceof Promise)) ? yield promiseOrData : promiseOrData;
105
77
  }
78
+ // Apply filter (will update hiddenData)
79
+ data = this.filter(data, filterData, excludedDataByFilter);
80
+ // Compute the total length
81
+ const total = data.length;
82
+ // If page size=0 (e.g. only need total)
83
+ if (size === 0) {
84
+ excludedDataByPagination = data;
85
+ return { data: [], total };
86
+ }
87
+ // Slice in a page (using offset and size)
88
+ if (offset > 0) {
89
+ // Offset after the end: no result
90
+ if (offset >= data.length) {
91
+ excludedDataByPagination = data;
92
+ data = [];
93
+ }
94
+ else {
95
+ excludedDataByPagination = (size > 0 && ((offset + size) < data.length)) ?
96
+ // Slice using limit to size
97
+ data.slice(0, offset - 1).concat(data.slice(offset + size)) :
98
+ // Slice without limit
99
+ data.slice(0, offset - 1);
100
+ data = (size > 0 && ((offset + size) < data.length)) ?
101
+ // Slice using limit to size
102
+ data.slice(offset, offset + size) :
103
+ // Slice without limit
104
+ data.slice(offset);
105
+ }
106
+ }
107
+ // Apply a limit
108
+ else if (size > 0) {
109
+ excludedDataByPagination = data.slice(size);
110
+ data = data.slice(0, size);
111
+ }
112
+ // No limit:
113
+ else if (size === -1) {
114
+ // Keep all data
115
+ }
116
+ // /!\ If already observed, then always create a copy of the original array
117
+ // Because datasource will only update if the array changed
118
+ if (data === this.data) {
119
+ data = data.slice(0);
120
+ }
121
+ return { data, total };
106
122
  }
107
- // Apply a limit
108
- else if (size > 0) {
109
- this._hiddenData.push(...data.slice(size));
110
- data = data.slice(0, size);
111
- }
112
- // No limit:
113
- else if (size === -1) {
114
- // Keep all data
115
- }
116
- // /!\ If already observed, then always create a copy of the original array
117
- // Because datasource will only update if the array changed
118
- if (data === this.data) {
119
- data = data.slice(0);
123
+ finally {
124
+ // Remember hidden data
125
+ this._hiddenData = [...excludedDataByFilter, ...excludedDataByPagination];
120
126
  }
121
- return { data, total };
122
127
  })));
123
128
  }
124
129
  saveAll(data, options) {
@@ -141,10 +146,12 @@ export class InMemoryEntitiesService extends EntitiesService {
141
146
  return __awaiter(this, void 0, void 0, function* () {
142
147
  if (!this.data)
143
148
  throw new Error('[memory-service] Could not delete, because value not set');
149
+ if (!this._equalsFn)
150
+ throw new Error(`[memory-service] Could not delete, because no 'options.equals' has been set in the memory service`);
144
151
  // Remove deleted item, from data
145
152
  const updatedData = this.data.filter(entity => {
146
- const shouldRemoved = dataToRemove.findIndex(entityToRemove => this._equalsFn(entityToRemove, entity)) !== -1;
147
- return !shouldRemoved;
153
+ const removed = dataToRemove.findIndex(entityToRemove => this._equalsFn(entityToRemove, entity)) !== -1;
154
+ return !removed;
148
155
  });
149
156
  const deleteCount = this.data.length - updatedData.length;
150
157
  if (deleteCount > 0) {
@@ -202,4 +209,4 @@ InMemoryEntitiesService.ctorParameters = () => [
202
209
  { type: Function },
203
210
  { type: undefined }
204
211
  ];
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRSxPQUFPLEVBQUMsZUFBZSxFQUF1RixNQUFNLHdCQUF3QixDQUFDO0FBRTdJLE9BQU8sRUFBQyxTQUFTLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFdBQVcsRUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQWN2RixXQUFXO0FBRVgsa0VBQWtFO0FBQ2xFLE1BQU0sT0FBTyx1QkFLWCxTQUFRLGVBQXlCO0lBMkJqQyxZQUNZLFFBQW9CLEVBQ3BCLFVBQXNCLEVBQ2hDLE9BQThDO1FBRTlDLEtBQUssRUFBRSxDQUFDO1FBSkUsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBMUJsQyxVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUtHLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQXdCckQsT0FBTyxtQkFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDakIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQ2hCLE9BQU8sQ0FDWCxDQUFDO1FBRUYsSUFBSSxD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bGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaWx0ZXIsIG1hcCwgbWVyZ2VNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7aXNFbXB0eUFycmF5LCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsfSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHtFbnRpdGllc1NlcnZpY2UsIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucywgRmlsdGVyRm4sIEZpbHRlckZuRmFjdG9yeSwgSUVudGl0aWVzU2VydmljZSwgTG9hZFJlc3VsdH0gZnJvbSAnLi9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge1NvcnREaXJlY3Rpb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0VudGl0eVV0aWxzLCBJRW50aXR5fSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQge0VudGl0eUZpbHRlciwgRW50aXR5RmlsdGVyVXRpbHN9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZmlsdGVyLm1vZGVsJztcblxuZXhwb3J0IGludGVyZmFjZSBJbk1lbW9yeUVudGl0aWVzU2VydmljZU9wdGlvbnM8VCwgRj4ge1xuICBvblNvcnQ/OiAoZGF0YTogVFtdLCBzb3J0Qnk/OiBzdHJpbmcsIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uKSA9PiBUW107XG4gIG9uTG9hZD86IChkYXRhOiBUW10pID0+IFRbXSB8IFByb21pc2U8VFtdPjtcbiAgb25TYXZlPzogKGRhdGE6IFRbXSkgPT4gVFtdIHwgUHJvbWlzZTxUW10+O1xuICBlcXVhbHM/OiAoZDE6IFQsIGQyOiBUKSA9PiBib29sZWFuO1xuXG4gIGZpbHRlckZuRmFjdG9yeT86IEZpbHRlckZuRmFjdG9yeTxULCBGPjtcbiAgZmlsdGVyRm4/OiBGaWx0ZXJGbjxUPjtcblxuICBzb3J0QnlSZXBsYWNlbWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8vIEBkeW5hbWljXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlPFxuICBUIGV4dGVuZHMgSUVudGl0eTxULCBJRD4sXG4gIEYgPSBhbnksXG4gIElEID0gbnVtYmVyLFxuICBPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zPlxuICBleHRlbmRzIEVudGl0aWVzU2VydmljZTxULCBGLCBJRD5cbiAgaW1wbGVtZW50cyBJRW50aXRpZXNTZXJ2aWNlPFQsIEYsIE8+LCBPbkRlc3Ryb3kge1xuXG4gIGRlYnVnID0gZmFsc2U7XG4gIGRpcnR5ID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGRhdGE6IFRbXTtcbiAgcHJpdmF0ZSBfaGlkZGVuRGF0YTogVFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc29ydEZuOiAoZGF0YTogVFtdLCBzb3J0Qnk/OiBzdHJpbmcsIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uKSA9PiBUW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uTG9hZDogKGRhdGE6IFRbXSkgPT4gVFtdIHwgUHJvbWlzZTxUW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblNhdmVGbjogKGRhdGE6IFRbXSkgPT4gVFtdIHwgUHJvbWlzZTxUW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9lcXVhbHNGbjogKGQxOiBULCBkMjogVCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyRm5GYWN0b3J5OiBGaWx0ZXJGbkZhY3Rvcnk8VCwgRj47XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NvcnRCeVJlcGxhY2VtZW50OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8vIFRPRE8gYWRkIHRlc3QgIHNlZSBzdWItYmF0Y2hlcy5tb2RhbC50cyBvbkxvYWREYXRhICYgX2hpZGRlbkRhdGFcblxuICBzZXQgdmFsdWUoZGF0YTogVFtdKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShkYXRhKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZGF0YVR5cGU6IG5ldygpID0+IFQsXG4gICAgcHJvdGVjdGVkIGZpbHRlclR5cGU6IG5ldygpID0+IEYsXG4gICAgb3B0aW9ucz86IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlT3B0aW9uczxULCBGPlxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBvblNvcnQ6IHRoaXMuc29ydCxcbiAgICAgIGVxdWFsczogdGhpcy5lcXVhbHMsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIHRoaXMuX3NvcnRGbiA9IG9wdGlvbnMub25Tb3J0O1xuICAgIHRoaXMuX29uTG9hZCA9IG9wdGlvbnMub25Mb2FkO1xuICAgIHRoaXMuX29uU2F2ZUZuID0gb3B0aW9ucy5vblNhdmU7XG4gICAgdGhpcy5fZXF1YWxzRm4gPSBvcHRpb25zLmVxdWFscztcbiAgICB0aGlzLl9maWx0ZXJGbkZhY3RvcnkgPSBvcHRpb25zLmZpbHRlckZuRmFjdG9yeSB8fCAoKGYpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYXNGaWx0ZXIoZikgYXMgRjtcbiAgICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFbnRpdHlGaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlci5hc0ZpbHRlckZuKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fc29ydEJ5UmVwbGFjZW1lbnQgPSB7XG4gICAgICAvLyBEZXRlY3QgcmFua09yZGVyIG9uIHRoZSBlbnRpdHkgY2xhc3NcbiAgICAgIGlkOiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobmV3IGRhdGFUeXBlKCkpLmZpbmRJbmRleChrZXkgPT4ga2V5ID09PSAncmFua09yZGVyJykgIT09IC0xKSA/ICdyYW5rT3JkZXInIDogdW5kZWZpbmVkLFxuICAgICAgLi4ub3B0aW9ucy5zb3J0QnlSZXBsYWNlbWVudFxuICAgIH07XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW21lbW9yeS1kYXRhLXNlcnZpY2VdIERlc3Ryb3lpbmcuLi4nKTtcbiAgICB0aGlzLl9vbkNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX29uQ2hhbmdlLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRWYWx1ZShkYXRhOiBUW10sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmRhdGEgIT09IGRhdGEpIHtcbiAgICAgIHRoaXMuX2hpZGRlbkRhdGEgPSBbXTtcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG5cbiAgICAgIC8vIFNlbmQgdG8gb2JzZXJ2ZXJzXG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlLm5leHQodHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgfVxuXG4gIHdhdGNoQWxsKFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHNpemU6IG51bWJlcixcbiAgICBzb3J0Qnk/OiBzdHJpbmcsXG4gICAgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24sXG4gICAgZmlsdGVyRGF0YT86IEYsXG4gICAgb3B0aW9ucz86IGFueVxuICApOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcblxuICAgIG9mZnNldCA9IG9mZnNldCA+PSAwID8gb2Zmc2V0IDogMDtcbiAgICBzaXplID0gc2l6ZSA+PSAwID8gc2l6ZSA6IC0xO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEpIHtcbiAgICAgIGNvbnNvbGUud2FybignW21lbW9yeS1kYXRhLXNlcnZpY2VdIFdhaXRpbmcgdmFsdWUgdG8gYmUgc2V0Li4uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX29uQ2hhbmdlXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgICAgbWVyZ2VNYXAoYXN5bmMgKF8pID0+IHtcbiAgICAgICAgICB0aGlzLl9oaWRkZW5EYXRhID0gW107XG5cbiAgICAgICAgICBpZiAoaXNFbXB0eUFycmF5KHRoaXMuZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7ZGF0YTogW10sIHRvdGFsOiAwfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBcHBseSBzb3J0XG4gICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLl9zb3J0Rm4odGhpcy5kYXRhIHx8IFtdLCBzb3J0QnksIHNvcnREaXJlY3Rpb24pIDtcblxuICAgICAgICAgIGlmICh0aGlzLl9vbkxvYWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VPckRhdGEgPSB0aGlzLl9vbkxvYWQoZGF0YSk7XG4gICAgICAgICAgICBkYXRhID0gKChwcm9taXNlT3JEYXRhIGluc3RhbmNlb2YgUHJvbWlzZSkpID8gYXdhaXQgcHJvbWlzZU9yRGF0YSA6IHByb21pc2VPckRhdGE7XG4gICAgICAgICAgfVxuXG5cbiAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgKHdpbGwgdXBkYXRlIGhpZGRlbkRhdGEpXG4gICAgICAgICAgZGF0YSA9IHRoaXMuZmlsdGVyKGRhdGEsIGZpbHRlckRhdGEsIHRoaXMuX2hpZGRlbkRhdGEpO1xuXG4gICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgdG90YWwgbGVuZ3RoXG4gICAgICAgICAgY29uc3QgdG90YWwgPSBkYXRhLmxlbmd0aDtcblxuICAgICAgICAgIC8vIElmIHBhZ2Ugc2l6ZT0wIChlLmcuIG9ubHkgbmVlZCB0b3RhbClcbiAgICAgICAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5faGlkZGVuRGF0YS5wdXNoKC4uLmRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHtkYXRhOiBbXSwgdG90YWx9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNsaWNlIGluIGEgcGFnZSAodXNpbmcgb2Zmc2V0IGFuZCBzaXplKVxuICAgICAgICAgIGlmIChvZmZzZXQgPiAwKSB7XG5cbiAgICAgICAgICAgIC8vIE9mZnNldCBhZnRlciB0aGUgZW5kOiBubyByZXN1bHRcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5faGlkZGVuRGF0YS5wdXNoKC4uLmRhdGEpO1xuICAgICAgICAgICAgICBkYXRhID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgaGlkZGVuRGF0YSA9IChzaXplID4gMCAmJiAoKG9mZnNldCArIHNpemUpIDwgZGF0YS5sZW5ndGgpKSA/XG4gICAgICAgICAgICAgICAgLy8gU2xpY2UgdXNpbmcgbGltaXQgdG8gc2l6ZVxuICAgICAgICAgICAgICAgIGRhdGEuc2xpY2UoMCwgb2Zmc2V0IC0xKS5jb25jYXQoZGF0YS5zbGljZShvZmZzZXQgKyBzaXplKSkgOlxuICAgICAgICAgICAgICAgIC8vIFNsaWNlIHdpdGhvdXQgbGltaXRcbiAgICAgICAgICAgICAgICBkYXRhLnNsaWNlKDAsIG9mZnNldC0xKTtcbiAgICAgICAgICAgICAgdGhpcy5faGlkZGVuRGF0YS5wdXNoKC4uLmhpZGRlbkRhdGEpO1xuICAgICAgICAgICAgICBkYXRhID0gKHNpemUgPiAwICYmICgob2Zmc2V0ICsgc2l6ZSkgPCBkYXRhLmxlbmd0aCkpID9cbiAgICAgICAgICAgICAgICAvLyBTbGljZSB1c2luZyBsaW1pdCB0byBzaXplXG4gICAgICAgICAgICAgICAgZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpIDpcbiAgICAgICAgICAgICAgICAvLyBTbGljZSB3aXRob3V0IGxpbWl0XG4gICAgICAgICAgICAgICAgZGF0YS5zbGljZShvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFwcGx5IGEgbGltaXRcbiAgICAgICAgICBlbHNlIGlmIChzaXplID4gMCl7XG4gICAgICAgICAgICB0aGlzLl9oaWRkZW5EYXRhLnB1c2goLi4uZGF0YS5zbGljZShzaXplKSk7XG4gICAgICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgwLCBzaXplKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm8gbGltaXQ6XG4gICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PT0gLTEpe1xuICAgICAgICAgICAgLy8gS2VlcCBhbGwgZGF0YVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIC8hXFwgSWYgYWxyZWFkeSBvYnNlcnZlZCwgdGhlbiBhbHdheXMgY3JlYXRlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgYXJyYXlcbiAgICAgICAgICAvLyBCZWNhdXNlIGRhdGFzb3VyY2Ugd2lsbCBvbmx5IHVwZGF0ZSBpZiB0aGUgYXJyYXkgY2hhbmdlZFxuICAgICAgICAgIGlmIChkYXRhID09PSB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7ZGF0YSwgdG90YWx9O1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVBbGwoZGF0YTogVFtdLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxUW10+IHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgdGhyb3cgbmV3IEVycm9yKCdbbWVtb3J5LXNlcnZpY2VdIENvdWxkIG5vdCBzYXZlLCBiZWNhdXNlIHZhbHVlIG5vdCBzZXQnKTtcblxuICAgIC8vIFJlc3RvcmUgaGlkZGVuIGRhdGFcbiAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHRoaXMuX2hpZGRlbkRhdGEpKVxuICAgICAgZGF0YSA9IGRhdGEuY29uY2F0KHRoaXMuX2hpZGRlbkRhdGEpO1xuXG4gICAgaWYgKHRoaXMuX29uU2F2ZUZuKSB7XG4gICAgICBjb25zdCByZXMgPSB0aGlzLl9vblNhdmVGbihkYXRhKTtcbiAgICAgIGRhdGEgPSAoKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpKSA/IGF3YWl0IHJlcyA6IHJlcztcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cblxuICBhc3luYyBkZWxldGVBbGwoZGF0YVRvUmVtb3ZlOiBUW10sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5kYXRhKSB0aHJvdyBuZXcgRXJyb3IoJ1ttZW1vcnktc2VydmljZV0gQ291bGQgbm90IGRlbGV0ZSwgYmVjYXVzZSB2YWx1ZSBub3Qgc2V0Jyk7XG5cbiAgICAvLyBSZW1vdmUgZGVsZXRlZCBpdGVtLCBmcm9tIGRhdGFcbiAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHRoaXMuZGF0YS5maWx0ZXIoZW50aXR5ID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZFJlbW92ZWQgPSBkYXRhVG9SZW1vdmUuZmluZEluZGV4KGVudGl0eVRvUmVtb3ZlID0+IHRoaXMuX2VxdWFsc0ZuKGVudGl0eVRvUmVtb3ZlLCBlbnRpdHkpKSAhPT0gLTE7XG4gICAgICByZXR1cm4gIXNob3VsZFJlbW92ZWQ7XG4gICAgfSk7XG4gICAgY29uc3QgZGVsZXRlQ291bnQgPSB0aGlzLmRhdGEubGVuZ3RoIC0gdXBkYXRlZERhdGEubGVuZ3RoO1xuICAgIGlmIChkZWxldGVDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuZGF0YSA9IHVwZGF0ZWREYXRhO1xuICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICB0aGlzLl9vbkNoYW5nZS5uZXh0KHRydWUpO1xuICAgIH1cblxuICB9XG5cbiAgc29ydChkYXRhOiBUW10sIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24pOiBUW10ge1xuICAgIC8vIFJlcGxhY2Ugc29ydEJ5LCB1c2luZyB0aGUgcmVwbGFjZW1lbnQgbWFwXG4gICAgc29ydEJ5ID0gc29ydEJ5ICYmIHRoaXMuX3NvcnRCeVJlcGxhY2VtZW50W3NvcnRCeV0gfHwgc29ydEJ5IHx8ICdpZCc7XG5cbiAgICAvLyBFeGVjdXRlIHRoZSBzb3J0XG4gICAgcmV0dXJuIEVudGl0eVV0aWxzLnNvcnQoZGF0YSwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uKTtcbiAgfVxuXG4gIGFzRmlsdGVyKHNvdXJjZTogUGFydGlhbDxGPik6IEYge1xuICAgIHJldHVybiBFbnRpdHlGaWx0ZXJVdGlscy5mcm9tT2JqZWN0KHNvdXJjZSwgdGhpcy5maWx0ZXJUeXBlKTtcbiAgfVxuXG4gIGFkZFNvcnRCeVJlcGxhY2VtZW50KHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZykge1xuICAgIHRoaXMuX3NvcnRCeVJlcGxhY2VtZW50W3NvdXJjZV0gPSB0YXJnZXQ7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBmaWx0ZXIoZGF0YTogVFtdLCBfZmlsdGVyOiBGLCBoaWRkZW5EYXRhOiBUW10pOiBUW10ge1xuXG4gICAgLy8gaWYgZmlsdGVyIGlzIERhdGFGaWx0ZXIgaW5zdGFuY2UsIHVzZSBpdHMgdGVzdCBmdW5jdGlvblxuICAgIGNvbnN0IGZpbHRlckZuID0gdGhpcy5fZmlsdGVyRm5GYWN0b3J5ICYmIHRoaXMuX2ZpbHRlckZuRmFjdG9yeShfZmlsdGVyKTtcbiAgICBpZiAoZmlsdGVyRm4pIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IFtdO1xuXG4gICAgICBkYXRhLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyRm4odmFsdWUpKVxuICAgICAgICAgIGZpbHRlcmVkRGF0YS5wdXNoKHZhbHVlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGhpZGRlbkRhdGEucHVzaCh2YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcbiAgICB9XG5cbiAgICAvLyBkZWZhdWx0LCBubyBmaWx0ZXJcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25uZWN0KCk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj4ge1xuICAgIHJldHVybiB0aGlzLl9vbkNoYW5nZS5waXBlKFxuICAgICAgbWFwKF8gPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhIHx8IFtdO1xuICAgICAgICBjb25zdCB0b3RhbCA9IGRhdGEubGVuZ3RoO1xuICAgICAgICByZXR1cm4ge2RhdGEsIHRvdGFsfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlcXVhbHMoZDE6IFQsIGQyOiBUKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGQxICYmIGQxLmVxdWFscyA/IGQxLmVxdWFscyhkMikgOiBFbnRpdHlVdGlscy5lcXVhbHMoZDEsIGQyLCAnaWQnKTtcbiAgfVxufVxuXG4iXX0=
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRSxPQUFPLEVBQUMsZUFBZSxFQUF1RixNQUFNLHdCQUF3QixDQUFDO0FBRTdJLE9BQU8sRUFBQyxTQUFTLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFdBQVcsRUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQzVFLE9BQU8sRUFBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQWN2RixXQUFXO0FBRVgsa0VBQWtFO0FBQ2xFLE1BQU0sT0FBTyx1QkFLWCxTQUFRLGVBQXlCO0lBMEJqQyxZQUNZLFFBQW9CLEVBQ3BCLFVBQXNCLEVBQ2hDLE9BQThDO1FBRTlDLEtBQUssRUFBRSxDQUFDO1FBSkUsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBekJsQyxVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUtHLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQXVCckQsT0FBTyxtQkFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFDakIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQ2hCLE9BQU8sQ0FDWCxDQUFDO1FBRUYsSUFBSSxD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O1lBeFFGLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwLCBtZXJnZU1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtpc0VtcHR5QXJyYXksIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWx9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0VudGl0aWVzU2VydmljZSwgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zLCBGaWx0ZXJGbiwgRmlsdGVyRm5GYWN0b3J5LCBJRW50aXRpZXNTZXJ2aWNlLCBMb2FkUmVzdWx0fSBmcm9tICcuL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7U29ydERpcmVjdGlvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQge0RpcmVjdGl2ZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RW50aXR5VXRpbHMsIElFbnRpdHl9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7RW50aXR5RmlsdGVyLCBFbnRpdHlGaWx0ZXJVdGlsc30gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9maWx0ZXIubW9kZWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlT3B0aW9uczxULCBGPiB7XG4gIG9uU29ydD86IChkYXRhOiBUW10sIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24pID0+IFRbXTtcbiAgb25Mb2FkPzogKGRhdGE6IFRbXSkgPT4gVFtdIHwgUHJvbWlzZTxUW10+O1xuICBvblNhdmU/OiAoZGF0YTogVFtdKSA9PiBUW10gfCBQcm9taXNlPFRbXT47XG4gIGVxdWFscz86IChkMTogVCwgZDI6IFQpID0+IGJvb2xlYW47XG5cbiAgZmlsdGVyRm5GYWN0b3J5PzogRmlsdGVyRm5GYWN0b3J5PFQsIEY+O1xuICBmaWx0ZXJGbj86IEZpbHRlckZuPFQ+O1xuXG4gIHNvcnRCeVJlcGxhY2VtZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLy8gQGR5bmFtaWNcbkBEaXJlY3RpdmUoKVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2U8XG4gIFQgZXh0ZW5kcyBJRW50aXR5PFQsIElEPixcbiAgRiA9IGFueSxcbiAgSUQgPSBudW1iZXIsXG4gIE8gZXh0ZW5kcyBFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnMgPSBFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnM+XG4gIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlPFQsIEYsIElEPlxuICBpbXBsZW1lbnRzIElFbnRpdGllc1NlcnZpY2U8VCwgRiwgTz4sIE9uRGVzdHJveSB7XG5cbiAgZGVidWcgPSBmYWxzZTtcbiAgZGlydHkgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgZGF0YTogVFtdO1xuICBwcml2YXRlIF9oaWRkZW5EYXRhOiBUW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zb3J0Rm46IChkYXRhOiBUW10sIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24pID0+IFRbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25Mb2FkOiAoZGF0YTogVFtdKSA9PiBUW10gfCBQcm9taXNlPFRbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uU2F2ZUZuOiAoZGF0YTogVFtdKSA9PiBUW10gfCBQcm9taXNlPFRbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2VxdWFsc0ZuOiAoZDE6IFQsIGQyOiBUKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJGbkZhY3Rvcnk6IEZpbHRlckZuRmFjdG9yeTxULCBGPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfc29ydEJ5UmVwbGFjZW1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cblxuICBzZXQgdmFsdWUoZGF0YTogVFtdKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShkYXRhKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZGF0YVR5cGU6IG5ldygpID0+IFQsXG4gICAgcHJvdGVjdGVkIGZpbHRlclR5cGU6IG5ldygpID0+IEYsXG4gICAgb3B0aW9ucz86IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlT3B0aW9uczxULCBGPlxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBvblNvcnQ6IHRoaXMuc29ydCxcbiAgICAgIGVxdWFsczogdGhpcy5lcXVhbHMsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIHRoaXMuX3NvcnRGbiA9IG9wdGlvbnMub25Tb3J0O1xuICAgIHRoaXMuX29uTG9hZCA9IG9wdGlvbnMub25Mb2FkO1xuICAgIHRoaXMuX29uU2F2ZUZuID0gb3B0aW9ucy5vblNhdmU7XG4gICAgdGhpcy5fZXF1YWxzRm4gPSBvcHRpb25zLmVxdWFscztcbiAgICB0aGlzLl9maWx0ZXJGbkZhY3RvcnkgPSBvcHRpb25zLmZpbHRlckZuRmFjdG9yeSB8fCAoKGYpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYXNGaWx0ZXIoZikgYXMgRjtcbiAgICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFbnRpdHlGaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlci5hc0ZpbHRlckZuKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fc29ydEJ5UmVwbGFjZW1lbnQgPSB7XG4gICAgICAvLyBEZXRlY3QgcmFua09yZGVyIG9uIHRoZSBlbnRpdHkgY2xhc3NcbiAgICAgIGlkOiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobmV3IGRhdGFUeXBlKCkpLmZpbmRJbmRleChrZXkgPT4ga2V5ID09PSAncmFua09yZGVyJykgIT09IC0xKSA/ICdyYW5rT3JkZXInIDogdW5kZWZpbmVkLFxuICAgICAgLi4ub3B0aW9ucy5zb3J0QnlSZXBsYWNlbWVudFxuICAgIH07XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW21lbW9yeS1kYXRhLXNlcnZpY2VdIERlc3Ryb3lpbmcuLi4nKTtcbiAgICB0aGlzLl9vbkNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX29uQ2hhbmdlLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRWYWx1ZShkYXRhOiBUW10sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmRhdGEgIT09IGRhdGEpIHtcbiAgICAgIHRoaXMuX2hpZGRlbkRhdGEgPSBbXTtcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG5cbiAgICAgIC8vIFNlbmQgdG8gb2JzZXJ2ZXJzXG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlLm5leHQodHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgfVxuXG4gIHdhdGNoQWxsKFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHNpemU6IG51bWJlcixcbiAgICBzb3J0Qnk/OiBzdHJpbmcsXG4gICAgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24sXG4gICAgZmlsdGVyRGF0YT86IEYsXG4gICAgb3B0aW9ucz86IGFueVxuICApOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+IHtcblxuICAgIG9mZnNldCA9IG9mZnNldCA+PSAwID8gb2Zmc2V0IDogMDtcbiAgICBzaXplID0gc2l6ZSA+PSAwID8gc2l6ZSA6IC0xO1xuXG4gICAgaWYgKCF0aGlzLmRhdGEpIHtcbiAgICAgIGNvbnNvbGUud2FybignW21lbW9yeS1kYXRhLXNlcnZpY2VdIFdhaXRpbmcgdmFsdWUgdG8gYmUgc2V0Li4uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX29uQ2hhbmdlXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgICAgbWVyZ2VNYXAoYXN5bmMgKF8pID0+IHtcbiAgICAgICAgICBjb25zdCBleGNsdWRlZERhdGFCeUZpbHRlcjogVFtdID0gW107XG4gICAgICAgICAgbGV0IGV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbjogVFtdO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc0VtcHR5QXJyYXkodGhpcy5kYXRhKSkge1xuICAgICAgICAgICAgICByZXR1cm4ge2RhdGE6IFtdLCB0b3RhbDogMH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IHNvcnRcbiAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5fc29ydEZuKHRoaXMuZGF0YSB8fCBbXSwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uKSA7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9vbkxvYWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZU9yRGF0YSA9IHRoaXMuX29uTG9hZChkYXRhKTtcbiAgICAgICAgICAgICAgZGF0YSA9ICgocHJvbWlzZU9yRGF0YSBpbnN0YW5jZW9mIFByb21pc2UpKSA/IGF3YWl0IHByb21pc2VPckRhdGEgOiBwcm9taXNlT3JEYXRhO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgKHdpbGwgdXBkYXRlIGhpZGRlbkRhdGEpXG4gICAgICAgICAgICBkYXRhID0gdGhpcy5maWx0ZXIoZGF0YSwgZmlsdGVyRGF0YSwgZXhjbHVkZWREYXRhQnlGaWx0ZXIpO1xuXG4gICAgICAgICAgICAvLyBDb21wdXRlIHRoZSB0b3RhbCBsZW5ndGhcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gZGF0YS5sZW5ndGg7XG5cbiAgICAgICAgICAgIC8vIElmIHBhZ2Ugc2l6ZT0wIChlLmcuIG9ubHkgbmVlZCB0b3RhbClcbiAgICAgICAgICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICAgICAgICAgIGV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbiA9IGRhdGE7XG4gICAgICAgICAgICAgIHJldHVybiB7ZGF0YTogW10sIHRvdGFsfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2xpY2UgaW4gYSBwYWdlICh1c2luZyBvZmZzZXQgYW5kIHNpemUpXG4gICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuXG4gICAgICAgICAgICAgIC8vIE9mZnNldCBhZnRlciB0aGUgZW5kOiBubyByZXN1bHRcbiAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbiA9IGRhdGE7XG4gICAgICAgICAgICAgICAgZGF0YSA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbiA9IChzaXplID4gMCAmJiAoKG9mZnNldCArIHNpemUpIDwgZGF0YS5sZW5ndGgpKSA/XG4gICAgICAgICAgICAgICAgICAvLyBTbGljZSB1c2luZyBsaW1pdCB0byBzaXplXG4gICAgICAgICAgICAgICAgICBkYXRhLnNsaWNlKDAsIG9mZnNldCAtMSkuY29uY2F0KGRhdGEuc2xpY2Uob2Zmc2V0ICsgc2l6ZSkpIDpcbiAgICAgICAgICAgICAgICAgIC8vIFNsaWNlIHdpdGhvdXQgbGltaXRcbiAgICAgICAgICAgICAgICAgIGRhdGEuc2xpY2UoMCwgb2Zmc2V0LTEpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSAoc2l6ZSA+IDAgJiYgKChvZmZzZXQgKyBzaXplKSA8IGRhdGEubGVuZ3RoKSkgP1xuICAgICAgICAgICAgICAgICAgLy8gU2xpY2UgdXNpbmcgbGltaXQgdG8gc2l6ZVxuICAgICAgICAgICAgICAgICAgZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpIDpcbiAgICAgICAgICAgICAgICAgIC8vIFNsaWNlIHdpdGhvdXQgbGltaXRcbiAgICAgICAgICAgICAgICAgIGRhdGEuc2xpY2Uob2Zmc2V0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBcHBseSBhIGxpbWl0XG4gICAgICAgICAgICBlbHNlIGlmIChzaXplID4gMCl7XG4gICAgICAgICAgICAgIGV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbiA9IGRhdGEuc2xpY2Uoc2l6ZSk7XG4gICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKDAsIHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTm8gbGltaXQ6XG4gICAgICAgICAgICBlbHNlIGlmIChzaXplID09PSAtMSl7XG4gICAgICAgICAgICAgIC8vIEtlZXAgYWxsIGRhdGFcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLyFcXCBJZiBhbHJlYWR5IG9ic2VydmVkLCB0aGVuIGFsd2F5cyBjcmVhdGUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBhcnJheVxuICAgICAgICAgICAgLy8gQmVjYXVzZSBkYXRhc291cmNlIHdpbGwgb25seSB1cGRhdGUgaWYgdGhlIGFycmF5IGNoYW5nZWRcbiAgICAgICAgICAgIGlmIChkYXRhID09PSB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7ZGF0YSwgdG90YWx9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vIFJlbWVtYmVyIGhpZGRlbiBkYXRhXG4gICAgICAgICAgICB0aGlzLl9oaWRkZW5EYXRhID0gWy4uLmV4Y2x1ZGVkRGF0YUJ5RmlsdGVyLCAuLi5leGNsdWRlZERhdGFCeVBhZ2luYXRpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBhc3luYyBzYXZlQWxsKGRhdGE6IFRbXSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8VFtdPiB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHRocm93IG5ldyBFcnJvcignW21lbW9yeS1zZXJ2aWNlXSBDb3VsZCBub3Qgc2F2ZSwgYmVjYXVzZSB2YWx1ZSBub3Qgc2V0Jyk7XG5cbiAgICAvLyBSZXN0b3JlIGhpZGRlbiBkYXRhXG4gICAgaWYgKGlzTm90RW1wdHlBcnJheSh0aGlzLl9oaWRkZW5EYXRhKSlcbiAgICAgIGRhdGEgPSBkYXRhLmNvbmNhdCh0aGlzLl9oaWRkZW5EYXRhKTtcblxuICAgIGlmICh0aGlzLl9vblNhdmVGbikge1xuICAgICAgY29uc3QgcmVzID0gdGhpcy5fb25TYXZlRm4oZGF0YSk7XG4gICAgICBkYXRhID0gKChyZXMgaW5zdGFuY2VvZiBQcm9taXNlKSkgPyBhd2FpdCByZXMgOiByZXM7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQWxsKGRhdGFUb1JlbW92ZTogVFtdLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgdGhyb3cgbmV3IEVycm9yKCdbbWVtb3J5LXNlcnZpY2VdIENvdWxkIG5vdCBkZWxldGUsIGJlY2F1c2UgdmFsdWUgbm90IHNldCcpO1xuICAgIGlmICghdGhpcy5fZXF1YWxzRm4pIHRocm93IG5ldyBFcnJvcihgW21lbW9yeS1zZXJ2aWNlXSBDb3VsZCBub3QgZGVsZXRlLCBiZWNhdXNlIG5vICdvcHRpb25zLmVxdWFscycgaGFzIGJlZW4gc2V0IGluIHRoZSBtZW1vcnkgc2VydmljZWApO1xuXG4gICAgLy8gUmVtb3ZlIGRlbGV0ZWQgaXRlbSwgZnJvbSBkYXRhXG4gICAgY29uc3QgdXBkYXRlZERhdGEgPSB0aGlzLmRhdGEuZmlsdGVyKGVudGl0eSA9PiB7XG4gICAgICBjb25zdCByZW1vdmVkID0gZGF0YVRvUmVtb3ZlLmZpbmRJbmRleChlbnRpdHlUb1JlbW92ZSA9PiB0aGlzLl9lcXVhbHNGbihlbnRpdHlUb1JlbW92ZSwgZW50aXR5KSkgIT09IC0xO1xuICAgICAgcmV0dXJuICFyZW1vdmVkO1xuICAgIH0pO1xuICAgIGNvbnN0IGRlbGV0ZUNvdW50ID0gdGhpcy5kYXRhLmxlbmd0aCAtIHVwZGF0ZWREYXRhLmxlbmd0aDtcbiAgICBpZiAoZGVsZXRlQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLmRhdGEgPSB1cGRhdGVkRGF0YTtcbiAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgdGhpcy5fb25DaGFuZ2UubmV4dCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBzb3J0KGRhdGE6IFRbXSwgc29ydEJ5Pzogc3RyaW5nLCBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbik6IFRbXSB7XG4gICAgLy8gUmVwbGFjZSBzb3J0QnksIHVzaW5nIHRoZSByZXBsYWNlbWVudCBtYXBcbiAgICBzb3J0QnkgPSBzb3J0QnkgJiYgdGhpcy5fc29ydEJ5UmVwbGFjZW1lbnRbc29ydEJ5XSB8fCBzb3J0QnkgfHwgJ2lkJztcblxuICAgIC8vIEV4ZWN1dGUgdGhlIHNvcnRcbiAgICByZXR1cm4gRW50aXR5VXRpbHMuc29ydChkYXRhLCBzb3J0QnksIHNvcnREaXJlY3Rpb24pO1xuICB9XG5cbiAgYXNGaWx0ZXIoc291cmNlOiBQYXJ0aWFsPEY+KTogRiB7XG4gICAgcmV0dXJuIEVudGl0eUZpbHRlclV0aWxzLmZyb21PYmplY3Qoc291cmNlLCB0aGlzLmZpbHRlclR5cGUpO1xuICB9XG5cbiAgYWRkU29ydEJ5UmVwbGFjZW1lbnQoc291cmNlOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKSB7XG4gICAgdGhpcy5fc29ydEJ5UmVwbGFjZW1lbnRbc291cmNlXSA9IHRhcmdldDtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGZpbHRlcihkYXRhOiBUW10sIF9maWx0ZXI6IEYsIGhpZGRlbkRhdGE6IFRbXSk6IFRbXSB7XG5cbiAgICAvLyBpZiBmaWx0ZXIgaXMgRGF0YUZpbHRlciBpbnN0YW5jZSwgdXNlIGl0cyB0ZXN0IGZ1bmN0aW9uXG4gICAgY29uc3QgZmlsdGVyRm4gPSB0aGlzLl9maWx0ZXJGbkZhY3RvcnkgJiYgdGhpcy5fZmlsdGVyRm5GYWN0b3J5KF9maWx0ZXIpO1xuICAgIGlmIChmaWx0ZXJGbikge1xuICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gW107XG5cbiAgICAgIGRhdGEuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXJGbih2YWx1ZSkpXG4gICAgICAgICAgZmlsdGVyZWREYXRhLnB1c2godmFsdWUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgaGlkZGVuRGF0YS5wdXNoKHZhbHVlKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZmlsdGVyZWREYXRhO1xuICAgIH1cblxuICAgIC8vIGRlZmF1bHQsIG5vIGZpbHRlclxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbm5lY3QoKTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuX29uQ2hhbmdlLnBpcGUoXG4gICAgICBtYXAoXyA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEgfHwgW107XG4gICAgICAgIGNvbnN0IHRvdGFsID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB7ZGF0YSwgdG90YWx9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVxdWFscyhkMTogVCwgZDI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZDEgJiYgZDEuZXF1YWxzID8gZDEuZXF1YWxzKGQyKSA6IEVudGl0eVV0aWxzLmVxdWFscyhkMSwgZDIsICdpZCcpO1xuICB9XG59XG4iXX0=
@@ -14241,7 +14241,6 @@ class InMemoryEntitiesService extends EntitiesService {
14241
14241
  // Detect rankOrder on the entity class
14242
14242
  id: (Object.getOwnPropertyNames(new dataType()).findIndex(key => key === 'rankOrder') !== -1) ? 'rankOrder' : undefined }, options.sortByReplacement);
14243
14243
  }
14244
- // TODO add test see sub-batches.modal.ts onLoadData & _hiddenData
14245
14244
  set value(data) {
14246
14245
  this.setValue(data);
14247
14246
  }
@@ -14273,61 +14272,67 @@ class InMemoryEntitiesService extends EntitiesService {
14273
14272
  }
14274
14273
  return this._onChange
14275
14274
  .pipe(filter(isNotNil), mergeMap((_) => __awaiter(this, void 0, void 0, function* () {
14276
- this._hiddenData = [];
14277
- if (isEmptyArray(this.data)) {
14278
- return { data: [], total: 0 };
14279
- }
14280
- // Apply sort
14281
- let data = this._sortFn(this.data || [], sortBy, sortDirection);
14282
- if (this._onLoad) {
14283
- const promiseOrData = this._onLoad(data);
14284
- data = ((promiseOrData instanceof Promise)) ? yield promiseOrData : promiseOrData;
14285
- }
14286
- // Apply filter (will update hiddenData)
14287
- data = this.filter(data, filterData, this._hiddenData);
14288
- // Compute the total length
14289
- const total = data.length;
14290
- // If page size=0 (e.g. only need total)
14291
- if (size === 0) {
14292
- this._hiddenData.push(...data);
14293
- return { data: [], total };
14294
- }
14295
- // Slice in a page (using offset and size)
14296
- if (offset > 0) {
14297
- // Offset after the end: no result
14298
- if (offset >= data.length) {
14299
- this._hiddenData.push(...data);
14300
- data = [];
14275
+ const excludedDataByFilter = [];
14276
+ let excludedDataByPagination;
14277
+ try {
14278
+ if (isEmptyArray(this.data)) {
14279
+ return { data: [], total: 0 };
14301
14280
  }
14302
- else {
14303
- const hiddenData = (size > 0 && ((offset + size) < data.length)) ?
14304
- // Slice using limit to size
14305
- data.slice(0, offset - 1).concat(data.slice(offset + size)) :
14306
- // Slice without limit
14307
- data.slice(0, offset - 1);
14308
- this._hiddenData.push(...hiddenData);
14309
- data = (size > 0 && ((offset + size) < data.length)) ?
14310
- // Slice using limit to size
14311
- data.slice(offset, offset + size) :
14312
- // Slice without limit
14313
- data.slice(offset);
14281
+ // Apply sort
14282
+ let data = this._sortFn(this.data || [], sortBy, sortDirection);
14283
+ if (this._onLoad) {
14284
+ const promiseOrData = this._onLoad(data);
14285
+ data = ((promiseOrData instanceof Promise)) ? yield promiseOrData : promiseOrData;
14314
14286
  }
14287
+ // Apply filter (will update hiddenData)
14288
+ data = this.filter(data, filterData, excludedDataByFilter);
14289
+ // Compute the total length
14290
+ const total = data.length;
14291
+ // If page size=0 (e.g. only need total)
14292
+ if (size === 0) {
14293
+ excludedDataByPagination = data;
14294
+ return { data: [], total };
14295
+ }
14296
+ // Slice in a page (using offset and size)
14297
+ if (offset > 0) {
14298
+ // Offset after the end: no result
14299
+ if (offset >= data.length) {
14300
+ excludedDataByPagination = data;
14301
+ data = [];
14302
+ }
14303
+ else {
14304
+ excludedDataByPagination = (size > 0 && ((offset + size) < data.length)) ?
14305
+ // Slice using limit to size
14306
+ data.slice(0, offset - 1).concat(data.slice(offset + size)) :
14307
+ // Slice without limit
14308
+ data.slice(0, offset - 1);
14309
+ data = (size > 0 && ((offset + size) < data.length)) ?
14310
+ // Slice using limit to size
14311
+ data.slice(offset, offset + size) :
14312
+ // Slice without limit
14313
+ data.slice(offset);
14314
+ }
14315
+ }
14316
+ // Apply a limit
14317
+ else if (size > 0) {
14318
+ excludedDataByPagination = data.slice(size);
14319
+ data = data.slice(0, size);
14320
+ }
14321
+ // No limit:
14322
+ else if (size === -1) {
14323
+ // Keep all data
14324
+ }
14325
+ // /!\ If already observed, then always create a copy of the original array
14326
+ // Because datasource will only update if the array changed
14327
+ if (data === this.data) {
14328
+ data = data.slice(0);
14329
+ }
14330
+ return { data, total };
14315
14331
  }
14316
- // Apply a limit
14317
- else if (size > 0) {
14318
- this._hiddenData.push(...data.slice(size));
14319
- data = data.slice(0, size);
14320
- }
14321
- // No limit:
14322
- else if (size === -1) {
14323
- // Keep all data
14324
- }
14325
- // /!\ If already observed, then always create a copy of the original array
14326
- // Because datasource will only update if the array changed
14327
- if (data === this.data) {
14328
- data = data.slice(0);
14332
+ finally {
14333
+ // Remember hidden data
14334
+ this._hiddenData = [...excludedDataByFilter, ...excludedDataByPagination];
14329
14335
  }
14330
- return { data, total };
14331
14336
  })));
14332
14337
  }
14333
14338
  saveAll(data, options) {
@@ -14350,10 +14355,12 @@ class InMemoryEntitiesService extends EntitiesService {
14350
14355
  return __awaiter(this, void 0, void 0, function* () {
14351
14356
  if (!this.data)
14352
14357
  throw new Error('[memory-service] Could not delete, because value not set');
14358
+ if (!this._equalsFn)
14359
+ throw new Error(`[memory-service] Could not delete, because no 'options.equals' has been set in the memory service`);
14353
14360
  // Remove deleted item, from data
14354
14361
  const updatedData = this.data.filter(entity => {
14355
- const shouldRemoved = dataToRemove.findIndex(entityToRemove => this._equalsFn(entityToRemove, entity)) !== -1;
14356
- return !shouldRemoved;
14362
+ const removed = dataToRemove.findIndex(entityToRemove => this._equalsFn(entityToRemove, entity)) !== -1;
14363
+ return !removed;
14357
14364
  });
14358
14365
  const deleteCount = this.data.length - updatedData.length;
14359
14366
  if (deleteCount > 0) {