@ethlete/query 4.2.2 → 4.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,16 @@
1
- import { inject, isDevMode } from '@angular/core';
1
+ import { NgZone, assertInInjectionContext, inject, isDevMode } from '@angular/core';
2
2
  import { FormGroup } from '@angular/forms';
3
3
  import { ActivatedRoute, Router } from '@angular/router';
4
- import { clone, equal } from '@ethlete/core';
5
- import { BehaviorSubject, combineLatest, concat, debounceTime, distinctUntilChanged, map, pairwise, shareReplay, startWith, take, tap, } from 'rxjs';
4
+ import { ET_PROPERTY_REMOVED, RouterStateService, clone, createDestroy, equal } from '@ethlete/core';
5
+ import { BehaviorSubject, Subject, concat, debounceTime, map, startWith, take, takeUntil, tap, withLatestFrom, } from 'rxjs';
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ export class QueryFormGroup extends FormGroup {
8
+ patchValue(
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ value, options) {
11
+ super.patchValue(value, options);
12
+ }
13
+ }
6
14
  export class QueryField {
7
15
  get control() {
8
16
  return this.data.control;
@@ -15,6 +23,10 @@ export class QueryField {
15
23
  setValue(value, options) {
16
24
  if (this._currentDebounceTimeout !== null) {
17
25
  clearTimeout(this._currentDebounceTimeout);
26
+ this._currentDebounceTimeout = null;
27
+ }
28
+ if (value === this.control.value) {
29
+ return;
18
30
  }
19
31
  if (this.data.debounce && !options?.skipDebounce) {
20
32
  this._currentDebounceTimeout = window.setTimeout(() => {
@@ -48,78 +60,126 @@ export class QueryForm {
48
60
  }
49
61
  constructor(_fields) {
50
62
  this._fields = _fields;
51
- this._router = inject(Router, { optional: true });
52
- this._activatedRoute = inject(ActivatedRoute, { optional: true });
63
+ this._destroy$ = createDestroy();
64
+ this._unobserveTrigger$ = new Subject();
65
+ this._router = inject(Router);
66
+ this._activatedRoute = inject(ActivatedRoute);
53
67
  this._defaultValues = this._extractDefaultValues();
68
+ this._routerStateService = inject(RouterStateService);
69
+ this._zone = inject(NgZone);
70
+ this._isObserving = false;
54
71
  this.form = this._setupFormGroup();
72
+ this._lastFormValue$ = new BehaviorSubject(null);
73
+ this._currentFormValue$ = new BehaviorSubject({
74
+ id: 0,
75
+ data: this._formValue,
76
+ });
55
77
  this._changes$ = new BehaviorSubject({
56
78
  previousValue: null,
57
79
  currentValue: this.form.getRawValue(),
58
80
  });
59
- this.changes$ = this._changes$.asObservable();
81
+ this.changes$ = this._currentFormValue$.pipe(withLatestFrom(this._lastFormValue$)).pipe(map(([currentValueEvent, previousValueEvent]) => {
82
+ return {
83
+ previousValue: previousValueEvent?.data ?? null,
84
+ currentValue: currentValueEvent.data,
85
+ };
86
+ }));
87
+ assertInInjectionContext(QueryForm);
60
88
  }
61
89
  observe(options) {
62
- return combineLatest(Object.values(this._fields).map((field) => field.changes$)).pipe(map(() => this._formValue), distinctUntilChanged((a, b) => equal(a, b)), tap((values) => {
63
- if (options?.syncViaUrlQueryParams !== false) {
64
- this._syncViaUrlQueryParams(values);
90
+ if (this._isObserving) {
91
+ if (isDevMode()) {
92
+ console.warn('QueryForm.observe() was called multiple times. This is not supported.');
65
93
  }
66
- }), pairwise(), startWith([null, this._formValue]), map(([previousValue, currentValue]) => ({ previousValue, currentValue })), tap(({ previousValue, currentValue }) => {
67
- let didResetValues = false;
68
- for (const formFieldKey in this._fields) {
69
- const resets = this._fields[formFieldKey].data.isResetBy;
70
- if (!resets)
94
+ return;
95
+ }
96
+ this._isObserving = true;
97
+ this.setFormValueFromUrlQueryParams({
98
+ queryParams: this._routerStateService.queryParams,
99
+ });
100
+ this.form.valueChanges
101
+ .pipe(startWith(null), tap(() => {
102
+ this._lastFormValue$.next(clone(this._currentFormValue$.value));
103
+ this._currentFormValue$.next({ id: this._currentFormValue$.value.id + 1, data: clone(this._formValue) });
104
+ }), takeUntil(this._destroy$), takeUntil(this._unobserveTrigger$))
105
+ .subscribe();
106
+ this._currentFormValue$
107
+ .pipe(tap((currentValueEvent) => {
108
+ const previousValueEvent = this._lastFormValue$.value;
109
+ const currentValue = currentValueEvent.data;
110
+ if (options?.writeToQueryParams !== false) {
111
+ this._syncViaUrlQueryParams(currentValueEvent.data, options?.replaceUrl);
112
+ }
113
+ const didResetValues = this._handleQueryFormResets(previousValueEvent?.data ?? null, currentValue);
114
+ if (didResetValues) {
115
+ return;
116
+ }
117
+ if (this._currentFormValue$.value.id !== currentValueEvent.id) {
118
+ return;
119
+ }
120
+ this._changes$.next({
121
+ previousValue: previousValueEvent?.data ?? null,
122
+ currentValue: currentValueEvent.data,
123
+ });
124
+ }), takeUntil(this._destroy$), takeUntil(this._unobserveTrigger$))
125
+ .subscribe();
126
+ if (options?.syncOnNavigation !== false) {
127
+ this._routerStateService.queryParamChanges$
128
+ .pipe(takeUntil(this._destroy$), takeUntil(this._unobserveTrigger$), tap((changes) => this.setFormValueFromUrlQueryParams({ queryParams: changes })))
129
+ .subscribe();
130
+ }
131
+ }
132
+ _handleQueryFormResets(previousValue, currentValue) {
133
+ let didResetValues = false;
134
+ for (const formFieldKey in this._fields) {
135
+ const resets = this._fields[formFieldKey].data.isResetBy;
136
+ if (!resets)
137
+ continue;
138
+ const resetConditionKeys = Array.isArray(resets) ? resets : [resets];
139
+ for (const resetConditionKey of resetConditionKeys) {
140
+ if (!(resetConditionKey in this._fields)) {
141
+ if (isDevMode()) {
142
+ console.warn(`The field "${resetConditionKey}" is not defined in the QueryForm. Is it a typo?`, this);
143
+ }
71
144
  continue;
72
- const resetConditionKeys = Array.isArray(resets) ? resets : [resets];
73
- for (const resetConditionKey of resetConditionKeys) {
74
- if (!(resetConditionKey in this._fields)) {
75
- if (isDevMode()) {
76
- console.warn(`The field "${resetConditionKey}" is not defined in the QueryForm. Is it a typo?`, this);
77
- }
145
+ }
146
+ if (previousValue &&
147
+ currentValue &&
148
+ !equal(previousValue[resetConditionKey], currentValue[resetConditionKey])) {
149
+ const defaultValueForKeyToReset = this._defaultValues[formFieldKey];
150
+ const currentValueForKeyToReset = currentValue[formFieldKey];
151
+ if (equal(defaultValueForKeyToReset, currentValueForKeyToReset)) {
78
152
  continue;
79
153
  }
80
- if (previousValue &&
81
- currentValue &&
82
- !equal(previousValue[resetConditionKey], currentValue[resetConditionKey])) {
83
- const defaultValueForKeyToReset = this._defaultValues[formFieldKey];
84
- const currentValueForKeyToReset = currentValue[formFieldKey];
85
- if (equal(defaultValueForKeyToReset, currentValueForKeyToReset)) {
86
- continue;
87
- }
88
- this.form.controls[formFieldKey].setValue(defaultValueForKeyToReset);
89
- didResetValues = true;
90
- break;
91
- }
154
+ this.form.controls[formFieldKey].setValue(defaultValueForKeyToReset);
155
+ didResetValues = true;
156
+ break;
92
157
  }
93
158
  }
94
- if (!didResetValues) {
95
- this._changes$.next({
96
- previousValue,
97
- currentValue,
98
- });
99
- }
100
- }), shareReplay({ bufferSize: 1, refCount: true }), map(() => null));
159
+ }
160
+ return didResetValues;
161
+ }
162
+ unobserve() {
163
+ this._unobserveTrigger$.next(true);
101
164
  }
102
165
  setFormValueFromUrlQueryParams(options) {
103
- if (!this._activatedRoute) {
104
- throw new Error('Cannot set form value from url query params without ActivatedRoute');
105
- }
106
- const queryParams = this._activatedRoute.snapshot.queryParams;
107
166
  for (const [key, field] of Object.entries(this._fields)) {
108
- const value = queryParams[key];
109
- // We only check using == because the value types can be different (e.g. "1" and 1)
110
- if (value === undefined || value == field.control.value) {
167
+ const value = options.queryParams[key];
168
+ const valueDoesNotExist = value === undefined;
169
+ if (valueDoesNotExist)
170
+ continue;
171
+ const valueGotRemoved = value === ET_PROPERTY_REMOVED;
172
+ if (valueGotRemoved) {
173
+ field.setValue(this._getDefaultValue(key), { skipDebounce: options?.skipDebounce ?? true });
111
174
  continue;
112
175
  }
113
176
  const deserializedValue = field.data.queryParamToValueTransformFn?.(value) ?? value;
177
+ const valueIsEqualToCurrent = equal(deserializedValue, field.control.value);
178
+ if (valueIsEqualToCurrent)
179
+ continue;
114
180
  field.setValue(deserializedValue, { skipDebounce: options?.skipDebounce ?? true });
115
181
  }
116
182
  }
117
- updateFormOnUrlQueryParamsChange() {
118
- if (!this._activatedRoute) {
119
- throw new Error('Cannot update form on url query params change without ActivatedRoute');
120
- }
121
- return this._activatedRoute.queryParams.pipe(tap(() => this.setFormValueFromUrlQueryParams()));
122
- }
123
183
  _getDefaultValue(key) {
124
184
  return this._defaultValues[key] ?? null;
125
185
  }
@@ -128,7 +188,7 @@ export class QueryForm {
128
188
  return this._getDefaultValue(key) === normalizedValue;
129
189
  }
130
190
  _setupFormGroup() {
131
- const group = new FormGroup({});
191
+ const group = new QueryFormGroup({});
132
192
  for (const [key, field] of Object.entries(this._fields)) {
133
193
  group.addControl(key, field.control);
134
194
  }
@@ -150,12 +210,13 @@ export class QueryForm {
150
210
  }
151
211
  return defaultValues;
152
212
  }
153
- _syncViaUrlQueryParams(values) {
154
- if (!this._router || !this._activatedRoute) {
155
- return;
156
- }
213
+ _syncViaUrlQueryParams(values, replaceUrl) {
157
214
  const queryParams = { ...clone(this._activatedRoute.snapshot.queryParams) };
158
215
  for (const [key, value] of Object.entries(values)) {
216
+ if (!this._fields[key]) {
217
+ console.warn(`The field "${key}" is not defined in the QueryForm. Is it a typo?`, this);
218
+ continue;
219
+ }
159
220
  if (this._isDefaultValue(key, value) || this._fields[key].data.appendToUrl === false) {
160
221
  delete queryParams[key];
161
222
  }
@@ -165,9 +226,12 @@ export class QueryForm {
165
226
  : value;
166
227
  }
167
228
  }
168
- this._router.navigate([], {
169
- queryParams,
229
+ this._zone.run(() => {
230
+ this._router.navigate([], {
231
+ queryParams,
232
+ replaceUrl,
233
+ });
170
234
  });
171
235
  }
172
236
  }
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9xdWVyeS1mb3JtL3F1ZXJ5LWZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IsTUFBTSxFQUNOLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsR0FBRyxFQUNILFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxFQUNULElBQUksRUFDSixHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFTZCxNQUFNLE9BQU8sVUFBVTtJQUdyQixJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQzNCLENBQUM7SUFJRCxZQUFtQixJQUEwQjtRQUExQixTQUFJLEdBQUosSUFBSSxDQUFzQjtRQVI3QyxhQUFRLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFNbEMsNEJBQXVCLEdBQWtCLElBQUksQ0FBQztJQUVOLENBQUM7SUFFakQsUUFBUSxDQUFDLEtBQWUsRUFBRSxPQUFvQztRQUM1RCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxJQUFJLEVBQUU7WUFDekMsWUFBWSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7WUFDaEQs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RUFBRTtnQkFDcEYsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekI7aUJBQU07Z0JBQ0wsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QjtvQkFDcEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsS0FBSyxDQUFDO29CQUM5RCxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ1g7U0FDRjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUN4QixXQUFXO1NBQ1osQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgY2xvbmUsIGVxdWFsIH0gZnJvbSAnQGV0aGxldGUvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGNvbmNhdCxcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgbWFwLFxuICBwYWlyd2lzZSxcbiAgc2hhcmVSZXBsYXksXG4gIHN0YXJ0V2l0aCxcbiAgdGFrZSxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFF1ZXJ5RmllbGRPcHRpb25zLFxuICBRdWVyeUZvcm1Hcm91cCxcbiAgUXVlcnlGb3JtT2JzZXJ2ZU9wdGlvbnMsXG4gIFF1ZXJ5Rm9ybVZhbHVlLFxuICBRdWVyeUZvcm1WYWx1ZUV2ZW50LFxufSBmcm9tICcuL3F1ZXJ5LWZvcm0udHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlGaWVsZDxUPiB7XG4gIGNoYW5nZXMkID0gdGhpcy5fc2V0dXBDaGFuZ2VzT2JzZXJ2YWJsZSgpO1xuXG4gIGdldCBjb250cm9sKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuY29udHJvbDtcbiAgfVxuXG4gIHByaXZhdGUgX2N1cnJlbnREZWJvdW5jZVRpbWVvdXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBRdWVyeUZpZWxkT3B0aW9uczxUPikge31cblxuICBzZXRWYWx1ZSh2YWx1ZTogVCB8IG51bGwsIG9wdGlvbnM/OiB7IHNraXBEZWJvdW5jZT86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLl9jdXJyZW50RGVib3VuY2VUaW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fY3VycmVudERlYm91bmNlVGltZW91dCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0YS5kZWJvdW5jZSAmJiAhb3B0aW9ucz8uc2tpcERlYm91bmNlKSB7XG4gICAgICB0aGlzLl9jdXJyZW50RGVib3VuY2VUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgfSwgdGhpcy5kYXRhLmRlYm91bmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cENoYW5nZXNPYnNlcnZhYmxlKCkge1xuICAgIGNvbnN0IG9icyA9IHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5jb250cm9sLnZhbHVlKSk7XG5cbiAgICBpZiAoIXRoaXMuZGF0YS5kZWJvdW5jZSkge1xuICAgICAgcmV0dXJuIG9icztcbiAgICB9XG5cbiAgICAvLyBUaGUgaW5pdGlhbCB2YWx1ZSBzaG91bGQgZ2V0IGVtaXR0ZWQgaW1tZWRpYXRlbHlcbiAgICAvLyBjb25jYXQgc3dpdGNoZXMgdG8gdGhlIGRlYm91bmNlZCBvYnNlcnZhYmxlIGFmdGVyIHRoZSBmaXJzdCBvYnNlcnZhYmxlIGlzIGNvbXBsZXRlZFxuICAgIHJldHVybiBjb25jYXQob2JzLnBpcGUodGFrZSgxKSksIHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kYXRhLmRlYm91bmNlKSkpO1xuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgUXVlcnlGb3JtPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBRdWVyeUZpZWxkPGFueT4+PiB7XG4gIHByaXZhdGUgX3JvdXRlciA9IGluamVjdChSb3V0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgX2FjdGl2YXRlZFJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWVzID0gdGhpcy5fZXh0cmFjdERlZmF1bHRWYWx1ZXMoKTtcblxuICBmb3JtID0gdGhpcy5fc2V0dXBGb3JtR3JvdXAoKTtcblxuICBwcml2YXRlIGdldCBfZm9ybVZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKSBhcyBRdWVyeUZvcm1WYWx1ZTxUPjtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5nZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRdWVyeUZvcm1WYWx1ZUV2ZW50PFQ+Pih7XG4gICAgcHJldmlvdXNWYWx1ZTogbnVsbCxcbiAgICBjdXJyZW50VmFsdWU6IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFF1ZXJ5Rm9ybVZhbHVlPFQ+LFxuICB9KTtcblxuICByZWFkb25seSBjaGFuZ2VzJCA9IHRoaXMuX2NoYW5nZXMkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGdldCBjb250cm9scygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmNvbnRyb2xzO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VzJC52YWx1ZS5jdXJyZW50VmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZHM6IFQpIHt9XG5cbiAgb2JzZXJ2ZShvcHRpb25zPzogUXVlcnlGb3JtT2JzZXJ2ZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChPYmplY3QudmFsdWVzKHRoaXMuX2ZpZWxkcykubWFwKChmaWVsZCkgPT4gZmllbGQuY2hhbmdlcyQpKS5waXBlKFxuICAgICAgbWFwKCgpID0+IHRoaXMuX2Zvcm1WYWx1ZSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gZXF1YWwoYSwgYikpLFxuICAgICAgdGFwKCh2YWx1ZXMpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnN5bmNWaWFVcmxRdWVyeVBhcmFtcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICB0aGlzLl9zeW5jVmlhVXJsUXVlcnlQYXJhbXModmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBwYWlyd2lzZSgpLFxuICAgICAgc3RhcnRXaXRoKFtudWxsLCB0aGlzLl9mb3JtVmFsdWVdIGFzIGNvbnN0KSxcbiAgICAgIG1hcCgoW3ByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZV0pID0+ICh7IHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSB9KSksXG4gICAgICB0YXAoKHsgcHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlIH0pID0+IHtcbiAgICAgICAgbGV0IGRpZFJlc2V0VmFsdWVzID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBmb3JtRmllbGRLZXkgaW4gdGhpcy5fZmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgcmVzZXRzID0gdGhpcy5fZmllbGRzW2Zvcm1GaWVsZEtleV0uZGF0YS5pc1Jlc2V0Qnk7XG5cbiAgICAgICAgICBpZiAoIXJlc2V0cykgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCByZXNldENvbmRpdGlvbktleXMgPSBBcnJheS5pc0FycmF5KHJlc2V0cykgPyByZXNldHMgOiBbcmVzZXRzXTtcblxuICAgICAgICAgIGZvciAoY29uc3QgcmVzZXRDb25kaXRpb25LZXkgb2YgcmVzZXRDb25kaXRpb25LZXlzKSB7XG4gICAgICAgICAgICBpZiAoIShyZXNldENvbmRpdGlvbktleSBpbiB0aGlzLl9maWVsZHMpKSB7XG4gICAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgVGhlIGZpZWxkIFwiJHtyZXNldENvbmRpdGlvbktleX1cIiBpcyBub3QgZGVmaW5lZCBpbiB0aGUgUXVlcnlGb3JtLiBJcyBpdCBhIHR5cG8/YCwgdGhpcyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwcmV2aW91c1ZhbHVlICYmXG4gICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSAmJlxuICAgICAgICAgICAgICAhZXF1YWwocHJldmlvdXNWYWx1ZVtyZXNldENvbmRpdGlvbktleV0sIGN1cnJlbnRWYWx1ZVtyZXNldENvbmRpdGlvbktleV0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlRm9yS2V5VG9SZXNldCA9IHRoaXMuX2RlZmF1bHRWYWx1ZXNbZm9ybUZpZWxkS2V5XTtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlRm9yS2V5VG9SZXNldCA9IGN1cnJlbnRWYWx1ZVtmb3JtRmllbGRLZXldO1xuXG4gICAgICAgICAgICAgIGlmIChlcXVhbChkZWZhdWx0VmFsdWVGb3JLZXlUb1Jlc2V0LCBjdXJyZW50VmFsdWVGb3JLZXlUb1Jlc2V0KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2Zvcm1GaWVsZEtleV0uc2V0VmFsdWUoZGVmYXVsdFZhbHVlRm9yS2V5VG9SZXNldCk7XG5cbiAgICAgICAgICAgICAgZGlkUmVzZXRWYWx1ZXMgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGlkUmVzZXRWYWx1ZXMpIHtcbiAgICAgICAgICB0aGlzLl9jaGFuZ2VzJC5uZXh0KHtcbiAgICAgICAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgICAgICAgICBjdXJyZW50VmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KSxcbiAgICAgIG1hcCgoKSA9PiBudWxsKSxcbiAgICApO1xuICB9XG5cbiAgc2V0Rm9ybVZhbHVlRnJvbVVybFF1ZXJ5UGFyYW1zKG9wdGlvbnM/OiB7IHNraXBEZWJvdW5jZT86IGJvb2xlYW4gfSkge1xuICAgIGlmICghdGhpcy5fYWN0aXZhdGVkUm91dGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNldCBmb3JtIHZhbHVlIGZyb20gdXJsIHF1ZXJ5IHBhcmFtcyB3aXRob3V0IEFjdGl2YXRlZFJvdXRlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcztcblxuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2ZpZWxkcykpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcXVlcnlQYXJhbXNba2V5XTtcblxuICAgICAgLy8gV2Ugb25seSBjaGVjayB1c2luZyA9PSBiZWNhdXNlIHRoZSB2YWx1ZSB0eXBlcyBjYW4gYmUgZGlmZmVyZW50IChlLmcuIFwiMVwiIGFuZCAxKVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT0gZmllbGQuY29udHJvbC52YWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVzZXJpYWxpemVkVmFsdWUgPSBmaWVsZC5kYXRhLnF1ZXJ5UGFyYW1Ub1ZhbHVlVHJhbnNmb3JtRm4/Lih2YWx1ZSkgPz8gdmFsdWU7XG5cbiAgICAgIGZpZWxkLnNldFZhbHVlKGRlc2VyaWFsaXplZFZhbHVlLCB7IHNraXBEZWJvdW5jZTogb3B0aW9ucz8uc2tpcERlYm91bmNlID8/IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRm9ybU9uVXJsUXVlcnlQYXJhbXNDaGFuZ2UoKSB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmF0ZWRSb3V0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIGZvcm0gb24gdXJsIHF1ZXJ5IHBhcmFtcyBjaGFuZ2Ugd2l0aG91dCBBY3RpdmF0ZWRSb3V0ZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5xdWVyeVBhcmFtcy5waXBlKHRhcCgoKSA9PiB0aGlzLnNldEZvcm1WYWx1ZUZyb21VcmxRdWVyeVBhcmFtcygpKSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXREZWZhdWx0VmFsdWUoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlc1trZXldID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pc0RlZmF1bHRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgcmV0dXJuIHRoaXMuX2dldERlZmF1bHRWYWx1ZShrZXkpID09PSBub3JtYWxpemVkVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cEZvcm1Hcm91cCgpIHtcbiAgICBjb25zdCBncm91cCA9IG5ldyBGb3JtR3JvdXAoe30gYXMgUXVlcnlGb3JtR3JvdXA8VD4pO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fZmllbGRzKSkge1xuICAgICAgZ3JvdXAuYWRkQ29udHJvbChrZXksIGZpZWxkLmNvbnRyb2wpO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cDtcbiAgfVxuXG4gIHByaXZhdGUgX2V4dHJhY3REZWZhdWx0VmFsdWVzKCkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9maWVsZHMpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLmNvbnRyb2wudmFsdWU7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlc1trZXldID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXM7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jVmlhVXJsUXVlcnlQYXJhbXModmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGlmICghdGhpcy5fcm91dGVyIHx8ICF0aGlzLl9hY3RpdmF0ZWRSb3V0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0geyAuLi5jbG9uZSh0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcykgfTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlcykpIHtcbiAgICAgIGlmICh0aGlzLl9pc0RlZmF1bHRWYWx1ZShrZXksIHZhbHVlKSB8fCB0aGlzLl9maWVsZHNba2V5XS5kYXRhLmFwcGVuZFRvVXJsID09PSBmYWxzZSkge1xuICAgICAgICBkZWxldGUgcXVlcnlQYXJhbXNba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zW2tleV0gPSB0aGlzLl9maWVsZHNba2V5XS5kYXRhLnZhbHVlVG9RdWVyeVBhcmFtVHJhbnNmb3JtRm5cbiAgICAgICAgICA/IHRoaXMuX2ZpZWxkc1trZXldLmRhdGEudmFsdWVUb1F1ZXJ5UGFyYW1UcmFuc2Zvcm1Gbj8uKHZhbHVlKVxuICAgICAgICAgIDogdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICBxdWVyeVBhcmFtcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
237
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9xdWVyeS1mb3JtL3F1ZXJ5LWZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BGLE9BQU8sRUFBbUIsU0FBUyxFQUFVLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUNMLGVBQWUsRUFDZixPQUFPLEVBQ1AsTUFBTSxFQUNOLFlBQVksRUFDWixHQUFHLEVBQ0gsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxFQUNILGNBQWMsR0FDZixNQUFNLE1BQU0sQ0FBQztBQVNkLDhEQUE4RDtBQUM5RCxNQUFNLE9BQU8sY0FBOEUsU0FBUSxTQUFZO0lBQ3BHLFVBQVU7SUFDakIsOERBQThEO0lBQzlELEtBQTJGLEVBQzNGLE9BQXlGO1FBRXpGLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxVQUFVO0lBR3JCLElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDM0IsQ0FBQztJQUlELFlBQW1CLElBQTBCO1FBQTFCLFNBQUksR0FBSixJQUFJLENBQXNCO1FBUjdDLGFBQVEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQU1sQyw0QkFBdUIsR0FBa0IsSUFBSSxDQUFDO0lB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QUMsV0FBVyxLQUFLLEtBQUssRUFBRTtnQkFDcEYsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekI7aUJBQU07Z0JBQ0wsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QjtvQkFDcEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsS0FBSyxDQUFDO29CQUM5RCxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ1g7U0FDRjtRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hCLFdBQVc7Z0JBQ1gsVUFBVTthQUNYLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdab25lLCBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQsIGluamVjdCwgaXNEZXZNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCwgybVWYWx1ZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRVRfUFJPUEVSVFlfUkVNT1ZFRCwgUm91dGVyU3RhdGVTZXJ2aWNlLCBjbG9uZSwgY3JlYXRlRGVzdHJveSwgZXF1YWwgfSBmcm9tICdAZXRobGV0ZS9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgU3ViamVjdCxcbiAgY29uY2F0LFxuICBkZWJvdW5jZVRpbWUsXG4gIG1hcCxcbiAgc3RhcnRXaXRoLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbiAgd2l0aExhdGVzdEZyb20sXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgUXVlcnlGaWVsZE9wdGlvbnMsXG4gIFF1ZXJ5Rm9ybUdyb3VwQ29udHJvbHMsXG4gIFF1ZXJ5Rm9ybU9ic2VydmVPcHRpb25zLFxuICBRdWVyeUZvcm1WYWx1ZSxcbiAgUXVlcnlGb3JtVmFsdWVFdmVudCxcbn0gZnJvbSAnLi9xdWVyeS1mb3JtLnR5cGVzJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBRdWVyeUZvcm1Hcm91cDxUIGV4dGVuZHMgeyBbSyBpbiBrZXlvZiBUXTogQWJzdHJhY3RDb250cm9sPGFueSwgYW55PiB9ID0gYW55PiBleHRlbmRzIEZvcm1Hcm91cDxUPiB7XG4gIG92ZXJyaWRlIHBhdGNoVmFsdWUoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB2YWx1ZTogMCBleHRlbmRzIDEgJiBUID8geyBba2V5OiBzdHJpbmddOiBhbnkgfSA6IFBhcnRpYWw8eyBbSyBpbiBrZXlvZiBUXTogybVWYWx1ZTxUW0tdPiB9PixcbiAgICBvcHRpb25zPzogeyBvbmx5U2VsZj86IGJvb2xlYW4gfCB1bmRlZmluZWQ7IGVtaXRFdmVudD86IGJvb2xlYW4gfCB1bmRlZmluZWQgfSB8IHVuZGVmaW5lZCxcbiAgKTogdm9pZCB7XG4gICAgc3VwZXIucGF0Y2hWYWx1ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5RmllbGQ8VD4ge1xuICBjaGFuZ2VzJCA9IHRoaXMuX3NldHVwQ2hhbmdlc09ic2VydmFibGUoKTtcblxuICBnZXQgY29udHJvbCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmNvbnRyb2w7XG4gIH1cblxuICBwcml2YXRlIF9jdXJyZW50RGVib3VuY2VUaW1lb3V0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGF0YTogUXVlcnlGaWVsZE9wdGlvbnM8VD4pIHt9XG5cbiAgc2V0VmFsdWUodmFsdWU6IFQgfCBudWxsLCBvcHRpb25zPzogeyBza2lwRGVib3VuY2U/OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5fY3VycmVudERlYm91bmNlVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2N1cnJlbnREZWJvdW5jZVRpbWVvdXQpO1xuICAgICAgdGhpcy5fY3VycmVudERlYm91bmNlVGltZW91dCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSB0aGlzLmNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhLmRlYm91bmNlICYmICFvcHRpb25zPy5za2lwRGVib3VuY2UpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnREZWJvdW5jZVRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB9LCB0aGlzLmRhdGEuZGVib3VuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwQ2hhbmdlc09ic2VydmFibGUoKSB7XG4gICAgY29uc3Qgb2JzID0gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmNvbnRyb2wudmFsdWUpKTtcblxuICAgIGlmICghdGhpcy5kYXRhLmRlYm91bmNlKSB7XG4gICAgICByZXR1cm4gb2JzO1xuICAgIH1cblxuICAgIC8vIFRoZSBpbml0aWFsIHZhbHVlIHNob3VsZCBnZXQgZW1pdHRlZCBpbW1lZGlhdGVseVxuICAgIC8vIGNvbmNhdCBzd2l0Y2hlcyB0byB0aGUgZGVib3VuY2VkIG9ic2VydmFibGUgYWZ0ZXIgdGhlIGZpcnN0IG9ic2VydmFibGUgaXMgY29tcGxldGVkXG4gICAgcmV0dXJuIGNvbmNhdChvYnMucGlwZSh0YWtlKDEpKSwgdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRhdGEuZGVib3VuY2UpKSk7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBRdWVyeUZvcm08VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFF1ZXJ5RmllbGQ8YW55Pj4+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBjcmVhdGVEZXN0cm95KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Vub2JzZXJ2ZVRyaWdnZXIkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FjdGl2YXRlZFJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdFZhbHVlcyA9IHRoaXMuX2V4dHJhY3REZWZhdWx0VmFsdWVzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JvdXRlclN0YXRlU2VydmljZSA9IGluamVjdChSb3V0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgcHJpdmF0ZSBfaXNPYnNlcnZpbmcgPSBmYWxzZTtcblxuICByZWFkb25seSBmb3JtID0gdGhpcy5fc2V0dXBGb3JtR3JvdXAoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9sYXN0Rm9ybVZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBpZDogbnVtYmVyOyBkYXRhOiBRdWVyeUZvcm1WYWx1ZTxUPiB9IHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRGb3JtVmFsdWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IGlkOiBudW1iZXI7IGRhdGE6IFF1ZXJ5Rm9ybVZhbHVlPFQ+IH0+KHtcbiAgICBpZDogMCxcbiAgICBkYXRhOiB0aGlzLl9mb3JtVmFsdWUsXG4gIH0pO1xuXG4gIHByaXZhdGUgZ2V0IF9mb3JtVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFF1ZXJ5Rm9ybVZhbHVlPFQ+O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5Rm9ybVZhbHVlRXZlbnQ8VD4+KHtcbiAgICBwcmV2aW91c1ZhbHVlOiBudWxsLFxuICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5mb3JtLmdldFJhd1ZhbHVlKCkgYXMgUXVlcnlGb3JtVmFsdWU8VD4sXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGNoYW5nZXMkID0gdGhpcy5fY3VycmVudEZvcm1WYWx1ZSQucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLl9sYXN0Rm9ybVZhbHVlJCkpLnBpcGUoXG4gICAgbWFwKChbY3VycmVudFZhbHVlRXZlbnQsIHByZXZpb3VzVmFsdWVFdmVudF0pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZXZpb3VzVmFsdWU6IHByZXZpb3VzVmFsdWVFdmVudD8uZGF0YSA/PyBudWxsLFxuICAgICAgICBjdXJyZW50VmFsdWU6IGN1cnJlbnRWYWx1ZUV2ZW50LmRhdGEsXG4gICAgICB9O1xuICAgIH0pLFxuICApO1xuXG4gIGdldCBjb250cm9scygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmNvbnRyb2xzO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VzJC52YWx1ZS5jdXJyZW50VmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZHM6IFQpIHtcbiAgICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQoUXVlcnlGb3JtKTtcbiAgfVxuXG4gIG9ic2VydmUob3B0aW9ucz86IFF1ZXJ5Rm9ybU9ic2VydmVPcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzT2JzZXJ2aW5nKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdRdWVyeUZvcm0ub2JzZXJ2ZSgpIHdhcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9pc09ic2VydmluZyA9IHRydWU7XG5cbiAgICB0aGlzLnNldEZvcm1WYWx1ZUZyb21VcmxRdWVyeVBhcmFtcyh7XG4gICAgICBxdWVyeVBhcmFtczogdGhpcy5fcm91dGVyU3RhdGVTZXJ2aWNlLnF1ZXJ5UGFyYW1zLFxuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9sYXN0Rm9ybVZhbHVlJC5uZXh0KGNsb25lKHRoaXMuX2N1cnJlbnRGb3JtVmFsdWUkLnZhbHVlKSk7XG4gICAgICAgICAgdGhpcy5fY3VycmVudEZvcm1WYWx1ZSQubmV4dCh7IGlkOiB0aGlzLl9jdXJyZW50Rm9ybVZhbHVlJC52YWx1ZS5pZCArIDEsIGRhdGE6IGNsb25lKHRoaXMuX2Zvcm1WYWx1ZSkgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fdW5vYnNlcnZlVHJpZ2dlciQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5fY3VycmVudEZvcm1WYWx1ZSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGN1cnJlbnRWYWx1ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZUV2ZW50ID0gdGhpcy5fbGFzdEZvcm1WYWx1ZSQudmFsdWU7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlRXZlbnQuZGF0YTtcblxuICAgICAgICAgIGlmIChvcHRpb25zPy53cml0ZVRvUXVlcnlQYXJhbXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zeW5jVmlhVXJsUXVlcnlQYXJhbXMoY3VycmVudFZhbHVlRXZlbnQuZGF0YSwgb3B0aW9ucz8ucmVwbGFjZVVybCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZGlkUmVzZXRWYWx1ZXMgPSB0aGlzLl9oYW5kbGVRdWVyeUZvcm1SZXNldHMocHJldmlvdXNWYWx1ZUV2ZW50Py5kYXRhID8/IG51bGwsIGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgICBpZiAoZGlkUmVzZXRWYWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5fY3VycmVudEZvcm1WYWx1ZSQudmFsdWUuaWQgIT09IGN1cnJlbnRWYWx1ZUV2ZW50LmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fY2hhbmdlcyQubmV4dCh7XG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlOiBwcmV2aW91c1ZhbHVlRXZlbnQ/LmRhdGEgPz8gbnVsbCxcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZTogY3VycmVudFZhbHVlRXZlbnQuZGF0YSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl91bm9ic2VydmVUcmlnZ2VyJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAob3B0aW9ucz8uc3luY09uTmF2aWdhdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3JvdXRlclN0YXRlU2VydmljZS5xdWVyeVBhcmFtQ2hhbmdlcyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fdW5vYnNlcnZlVHJpZ2dlciQpLFxuICAgICAgICAgIHRhcCgoY2hhbmdlcykgPT4gdGhpcy5zZXRGb3JtVmFsdWVGcm9tVXJsUXVlcnlQYXJhbXMoeyBxdWVyeVBhcmFtczogY2hhbmdlcyB9KSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVF1ZXJ5Rm9ybVJlc2V0cyhwcmV2aW91c1ZhbHVlOiBRdWVyeUZvcm1WYWx1ZTxUPiB8IG51bGwsIGN1cnJlbnRWYWx1ZTogUXVlcnlGb3JtVmFsdWU8VD4pIHtcbiAgICBsZXQgZGlkUmVzZXRWYWx1ZXMgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgZm9ybUZpZWxkS2V5IGluIHRoaXMuX2ZpZWxkcykge1xuICAgICAgY29uc3QgcmVzZXRzID0gdGhpcy5fZmllbGRzW2Zvcm1GaWVsZEtleV0uZGF0YS5pc1Jlc2V0Qnk7XG5cbiAgICAgIGlmICghcmVzZXRzKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcmVzZXRDb25kaXRpb25LZXlzID0gQXJyYXkuaXNBcnJheShyZXNldHMpID8gcmVzZXRzIDogW3Jlc2V0c107XG5cbiAgICAgIGZvciAoY29uc3QgcmVzZXRDb25kaXRpb25LZXkgb2YgcmVzZXRDb25kaXRpb25LZXlzKSB7XG4gICAgICAgIGlmICghKHJlc2V0Q29uZGl0aW9uS2V5IGluIHRoaXMuX2ZpZWxkcykpIHtcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgVGhlIGZpZWxkIFwiJHtyZXNldENvbmRpdGlvbktleX1cIiBpcyBub3QgZGVmaW5lZCBpbiB0aGUgUXVlcnlGb3JtLiBJcyBpdCBhIHR5cG8/YCwgdGhpcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJldmlvdXNWYWx1ZSAmJlxuICAgICAgICAgIGN1cnJlbnRWYWx1ZSAmJlxuICAgICAgICAgICFlcXVhbChwcmV2aW91c1ZhbHVlW3Jlc2V0Q29uZGl0aW9uS2V5XSwgY3VycmVudFZhbHVlW3Jlc2V0Q29uZGl0aW9uS2V5XSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlRm9yS2V5VG9SZXNldCA9IHRoaXMuX2RlZmF1bHRWYWx1ZXNbZm9ybUZpZWxkS2V5XTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVGb3JLZXlUb1Jlc2V0ID0gY3VycmVudFZhbHVlW2Zvcm1GaWVsZEtleV07XG5cbiAgICAgICAgICBpZiAoZXF1YWwoZGVmYXVsdFZhbHVlRm9yS2V5VG9SZXNldCwgY3VycmVudFZhbHVlRm9yS2V5VG9SZXNldCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tmb3JtRmllbGRLZXldLnNldFZhbHVlKGRlZmF1bHRWYWx1ZUZvcktleVRvUmVzZXQpO1xuXG4gICAgICAgICAgZGlkUmVzZXRWYWx1ZXMgPSB0cnVlO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGlkUmVzZXRWYWx1ZXM7XG4gIH1cblxuICB1bm9ic2VydmUoKSB7XG4gICAgdGhpcy5fdW5vYnNlcnZlVHJpZ2dlciQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHNldEZvcm1WYWx1ZUZyb21VcmxRdWVyeVBhcmFtcyhvcHRpb25zOiB7IHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgc2tpcERlYm91bmNlPzogYm9vbGVhbiB9KSB7XG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fZmllbGRzKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnF1ZXJ5UGFyYW1zW2tleV07XG5cbiAgICAgIGNvbnN0IHZhbHVlRG9lc05vdEV4aXN0ID0gdmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHZhbHVlRG9lc05vdEV4aXN0KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgdmFsdWVHb3RSZW1vdmVkID0gdmFsdWUgPT09IEVUX1BST1BFUlRZX1JFTU9WRUQ7XG5cbiAgICAgIGlmICh2YWx1ZUdvdFJlbW92ZWQpIHtcbiAgICAgICAgZmllbGQuc2V0VmFsdWUodGhpcy5fZ2V0RGVmYXVsdFZhbHVlKGtleSksIHsgc2tpcERlYm91bmNlOiBvcHRpb25zPy5za2lwRGVib3VuY2UgPz8gdHJ1ZSB9KTtcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVzZXJpYWxpemVkVmFsdWUgPSBmaWVsZC5kYXRhLnF1ZXJ5UGFyYW1Ub1ZhbHVlVHJhbnNmb3JtRm4/Lih2YWx1ZSkgPz8gdmFsdWU7XG4gICAgICBjb25zdCB2YWx1ZUlzRXF1YWxUb0N1cnJlbnQgPSBlcXVhbChkZXNlcmlhbGl6ZWRWYWx1ZSwgZmllbGQuY29udHJvbC52YWx1ZSk7XG5cbiAgICAgIGlmICh2YWx1ZUlzRXF1YWxUb0N1cnJlbnQpIGNvbnRpbnVlO1xuXG4gICAgICBmaWVsZC5zZXRWYWx1ZShkZXNlcmlhbGl6ZWRWYWx1ZSwgeyBza2lwRGVib3VuY2U6IG9wdGlvbnM/LnNraXBEZWJvdW5jZSA/PyB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldERlZmF1bHRWYWx1ZShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWVzW2tleV0gPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2lzRGVmYXVsdFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogdmFsdWU7XG5cbiAgICByZXR1cm4gdGhpcy5fZ2V0RGVmYXVsdFZhbHVlKGtleSkgPT09IG5vcm1hbGl6ZWRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwRm9ybUdyb3VwKCkge1xuICAgIGNvbnN0IGdyb3VwID0gbmV3IFF1ZXJ5Rm9ybUdyb3VwKHt9IGFzIFF1ZXJ5Rm9ybUdyb3VwQ29udHJvbHM8VD4pO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fZmllbGRzKSkge1xuICAgICAgZ3JvdXAuYWRkQ29udHJvbChrZXksIGZpZWxkLmNvbnRyb2wpO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cDtcbiAgfVxuXG4gIHByaXZhdGUgX2V4dHJhY3REZWZhdWx0VmFsdWVzKCkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9maWVsZHMpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLmNvbnRyb2wudmFsdWU7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlc1trZXldID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXM7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jVmlhVXJsUXVlcnlQYXJhbXModmFsdWVzOiBRdWVyeUZvcm1WYWx1ZTxUPiwgcmVwbGFjZVVybD86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHsgLi4uY2xvbmUodGhpcy5fYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMpIH07XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZXMpKSB7XG4gICAgICBpZiAoIXRoaXMuX2ZpZWxkc1trZXldKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVGhlIGZpZWxkIFwiJHtrZXl9XCIgaXMgbm90IGRlZmluZWQgaW4gdGhlIFF1ZXJ5Rm9ybS4gSXMgaXQgYSB0eXBvP2AsIHRoaXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2lzRGVmYXVsdFZhbHVlKGtleSwgdmFsdWUpIHx8IHRoaXMuX2ZpZWxkc1trZXldLmRhdGEuYXBwZW5kVG9VcmwgPT09IGZhbHNlKSB7XG4gICAgICAgIGRlbGV0ZSBxdWVyeVBhcmFtc1trZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnlQYXJhbXNba2V5XSA9IHRoaXMuX2ZpZWxkc1trZXldLmRhdGEudmFsdWVUb1F1ZXJ5UGFyYW1UcmFuc2Zvcm1GblxuICAgICAgICAgID8gdGhpcy5fZmllbGRzW2tleV0uZGF0YS52YWx1ZVRvUXVlcnlQYXJhbVRyYW5zZm9ybUZuPy4odmFsdWUpXG4gICAgICAgICAgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgICAgcXVlcnlQYXJhbXMsXG4gICAgICAgIHJlcGxhY2VVcmwsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZm9ybS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9xdWVyeS1mb3JtL3F1ZXJ5LWZvcm0udHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUXVlcnlGaWVsZCB9IGZyb20gJy4vcXVlcnktZm9ybSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlGaWVsZE9wdGlvbnM8VCA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIERlYm91bmNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgZGVib3VuY2U/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIGNvbnRyb2w6IEZvcm1Db250cm9sPFQgfCBudWxsPjtcblxuICAvKipcbiAgICogQXBwZW5kIHRoZSBmaWVsZCdzIHZhbHVlIHRvIHRoZSB1cmwuXG4gICAqXG4gICAqIFRoZSBmaWVsZCB3b250IGJlIGFwcGVuZGVkIHRvIHRoZSB1cmwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTpcbiAgICogLSBJdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiAtIEl0IGlzIGFuIGVtcHR5IHN0cmluZ1xuICAgKiAtIEl0IGlzIGBudWxsYFxuICAgKiAtIEl0IGlzIGB1bmRlZmluZWRgXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGFwcGVuZFRvVXJsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVzZXQgdGhlIGZpZWxkJ3MgdmFsdWUgdG8gdGhlIGRlZmF1bHQgdmFsdWUgaWYgb25lIG9yIG1vcmUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZHMgYXJlIGNoYW5nZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEdpdmVuIHRoaXMgZmllbGQgaXMgYSBgcGFnZWAgZmllbGQsIHRoZSBmaWVsZCB3aWxsIGJlIHJlc2V0IGlmIHRoZSBgbGltaXRgLCBgcXVlcnlgIG9yIGBzZWFyY2hgIGZpZWxkcyBhcmUgY2hhbmdlZC5cbiAgICogWydsaW1pdCcsICdxdWVyeScsICdzZWFyY2gnXVxuICAgKi9cbiAgaXNSZXNldEJ5Pzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSB0aGUgdmFsdWUgZ290dGVuIGZyb20gdGhlIHVybCBxdWVyeSBwYXJhbXMgdG8gYSB2YWx1ZSByZXF1aXJlZCBieSB0aGUgZmllbGQuXG4gICAqIEUuZy4gZm9yIGEgbnVtYmVyIGZpZWxkLCB0aGUgdmFsdWUgZnJvbSB0aGUgdXJsIHF1ZXJ5IHBhcmFtcyBpcyBhIHN0cmluZywgYnV0IHRoZSBmaWVsZCByZXF1aXJlcyBhIG51bWJlci5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBjb21tb24gdHJhbnNmb3JtYXRpb25zIGFyZSBhbHJlYWR5IGltcGxlbWVudGVkOlxuICAgKiAtIGB0cmFuc2Zvcm1Ub1N0cmluZ2BcbiAgICogLSBgdHJhbnNmb3JtVG9TdHJpbmdBcnJheWBcbiAgICogLSBgdHJhbnNmb3JtVG9OdW1iZXJgXG4gICAqIC0gYHRyYW5zZm9ybVRvTnVtYmVyQXJyYXlgXG4gICAqIC0gYHRyYW5zZm9ybVRvQm9vbGVhbmBcbiAgICogLSBgdHJhbnNmb3JtVG9Cb29sZWFuQXJyYXlgXG4gICAqIC0gYHRyYW5zZm9ybVRvRGF0ZWAgKGV4cGVjdHMgYSBzdHJpbmcgaW4gdGhlIGRlZmF1bHQganMgZm9ybWF0KVxuICAgKiAtIGB0cmFuc2Zvcm1Ub0RhdGVBcnJheWAgKGV4cGVjdHMgc3RyaW5ncyBpbiB0aGUgZGVmYXVsdCBqcyBmb3JtYXQpXG4gICAqIC0gYHRyYW5zZm9ybVRvU29ydGAgKGV4cGVjdHMgYSBzdHJpbmcgaW4gdGhlIGZvcm1hdCBgZmllbGQ6ZGlyZWN0aW9uYClcbiAgICovXG4gIHF1ZXJ5UGFyYW1Ub1ZhbHVlVHJhbnNmb3JtRm4/OiAodmFsOiB1bmtub3duKSA9PiBUIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCB0byBhIHZhbHVlIHRoYXQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSB1cmwgcXVlcnkgcGFyYW1zLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGNvbW1vbiB0cmFuc2Zvcm1hdGlvbnMgYXJlIGFscmVhZHkgaW1wbGVtZW50ZWQ6XG4gICAqIC0gYHRyYW5zZm9ybVRvU29ydFF1ZXJ5UGFyYW1gIChyZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIGBmaWVsZGAgYW5kIGBkaXJlY3Rpb25gIHByb3BlcnRpZXMpXG4gICAqL1xuICB2YWx1ZVRvUXVlcnlQYXJhbVRyYW5zZm9ybUZuPzogKHZhbDogVCB8IG51bGwpID0+IHVua25vd247XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBRdWVyeUZvcm1Hcm91cDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgUXVlcnlGaWVsZDxhbnk+Pj4gPSB7XG4gIFtQcm9wZXJ0eSBpbiBrZXlvZiBUXTogVFtQcm9wZXJ0eV1bJ2NvbnRyb2wnXTtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBRdWVyeUZvcm1WYWx1ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgUXVlcnlGaWVsZDxhbnk+Pj4gPSB7XG4gIFtQcm9wZXJ0eSBpbiBrZXlvZiBUXTogVFtQcm9wZXJ0eV1bJ2NvbnRyb2wnXVsndmFsdWUnXTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlGb3JtT2JzZXJ2ZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZm9ybSB2YWx1ZSBzaG91bGQgYmUgc3luY2VkIHRvIHRoZSB1cmwgcXVlcnkgcGFyYW1zLlxuICAgKi9cbiAgc3luY1ZpYVVybFF1ZXJ5UGFyYW1zPzogYm9vbGVhbjtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlGb3JtVmFsdWVFdmVudDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgUXVlcnlGaWVsZDxhbnk+Pj4ge1xuICBwcmV2aW91c1ZhbHVlOiBRdWVyeUZvcm1WYWx1ZTxUPiB8IG51bGw7XG4gIGN1cnJlbnRWYWx1ZTogUXVlcnlGb3JtVmFsdWU8VD47XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZm9ybS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9xdWVyeS1mb3JtL3F1ZXJ5LWZvcm0udHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUXVlcnlGaWVsZCB9IGZyb20gJy4vcXVlcnktZm9ybSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlGaWVsZE9wdGlvbnM8VCA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIERlYm91bmNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgZGVib3VuY2U/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgZm9yIHRoZSBmaWVsZC5cbiAgICovXG4gIGNvbnRyb2w6IEZvcm1Db250cm9sPFQgfCBudWxsPjtcblxuICAvKipcbiAgICogQXBwZW5kIHRoZSBmaWVsZCdzIHZhbHVlIHRvIHRoZSB1cmwuXG4gICAqXG4gICAqIFRoZSBmaWVsZCB3b250IGJlIGFwcGVuZGVkIHRvIHRoZSB1cmwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTpcbiAgICogLSBJdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiAtIEl0IGlzIGFuIGVtcHR5IHN0cmluZ1xuICAgKiAtIEl0IGlzIGBudWxsYFxuICAgKiAtIEl0IGlzIGB1bmRlZmluZWRgXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGFwcGVuZFRvVXJsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVzZXQgdGhlIGZpZWxkJ3MgdmFsdWUgdG8gdGhlIGRlZmF1bHQgdmFsdWUgaWYgb25lIG9yIG1vcmUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZHMgYXJlIGNoYW5nZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEdpdmVuIHRoaXMgZmllbGQgaXMgYSBgcGFnZWAgZmllbGQsIHRoZSBmaWVsZCB3aWxsIGJlIHJlc2V0IGlmIHRoZSBgbGltaXRgLCBgcXVlcnlgIG9yIGBzZWFyY2hgIGZpZWxkcyBhcmUgY2hhbmdlZC5cbiAgICogWydsaW1pdCcsICdxdWVyeScsICdzZWFyY2gnXVxuICAgKi9cbiAgaXNSZXNldEJ5Pzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSB0aGUgdmFsdWUgZ290dGVuIGZyb20gdGhlIHVybCBxdWVyeSBwYXJhbXMgdG8gYSB2YWx1ZSByZXF1aXJlZCBieSB0aGUgZmllbGQuXG4gICAqIEUuZy4gZm9yIGEgbnVtYmVyIGZpZWxkLCB0aGUgdmFsdWUgZnJvbSB0aGUgdXJsIHF1ZXJ5IHBhcmFtcyBpcyBhIHN0cmluZywgYnV0IHRoZSBmaWVsZCByZXF1aXJlcyBhIG51bWJlci5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBjb21tb24gdHJhbnNmb3JtYXRpb25zIGFyZSBhbHJlYWR5IGltcGxlbWVudGVkOlxuICAgKiAtIGB0cmFuc2Zvcm1Ub1N0cmluZ2BcbiAgICogLSBgdHJhbnNmb3JtVG9TdHJpbmdBcnJheWBcbiAgICogLSBgdHJhbnNmb3JtVG9OdW1iZXJgXG4gICAqIC0gYHRyYW5zZm9ybVRvTnVtYmVyQXJyYXlgXG4gICAqIC0gYHRyYW5zZm9ybVRvQm9vbGVhbmBcbiAgICogLSBgdHJhbnNmb3JtVG9Cb29sZWFuQXJyYXlgXG4gICAqIC0gYHRyYW5zZm9ybVRvRGF0ZWAgKGV4cGVjdHMgYSBzdHJpbmcgaW4gdGhlIGRlZmF1bHQganMgZm9ybWF0KVxuICAgKiAtIGB0cmFuc2Zvcm1Ub0RhdGVBcnJheWAgKGV4cGVjdHMgc3RyaW5ncyBpbiB0aGUgZGVmYXVsdCBqcyBmb3JtYXQpXG4gICAqIC0gYHRyYW5zZm9ybVRvU29ydGAgKGV4cGVjdHMgYSBzdHJpbmcgaW4gdGhlIGZvcm1hdCBgZmllbGQ6ZGlyZWN0aW9uYClcbiAgICovXG4gIHF1ZXJ5UGFyYW1Ub1ZhbHVlVHJhbnNmb3JtRm4/OiAodmFsOiB1bmtub3duKSA9PiBUIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCB0byBhIHZhbHVlIHRoYXQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSB1cmwgcXVlcnkgcGFyYW1zLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGNvbW1vbiB0cmFuc2Zvcm1hdGlvbnMgYXJlIGFscmVhZHkgaW1wbGVtZW50ZWQ6XG4gICAqIC0gYHRyYW5zZm9ybVRvU29ydFF1ZXJ5UGFyYW1gIChyZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIGBmaWVsZGAgYW5kIGBkaXJlY3Rpb25gIHByb3BlcnRpZXMpXG4gICAqL1xuICB2YWx1ZVRvUXVlcnlQYXJhbVRyYW5zZm9ybUZuPzogKHZhbDogVCB8IG51bGwpID0+IHVua25vd247XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBRdWVyeUZvcm1Hcm91cENvbnRyb2xzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBRdWVyeUZpZWxkPGFueT4+PiA9IHtcbiAgW1Byb3BlcnR5IGluIGtleW9mIFRdOiBUW1Byb3BlcnR5XVsnY29udHJvbCddO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFF1ZXJ5Rm9ybVZhbHVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBRdWVyeUZpZWxkPGFueT4+PiA9IHtcbiAgW1Byb3BlcnR5IGluIGtleW9mIFRdOiBUW1Byb3BlcnR5XVsnY29udHJvbCddWyd2YWx1ZSddO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUZvcm1PYnNlcnZlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb3JtIHZhbHVlIHNob3VsZCBiZSBzeW5jZWQgdG8gdGhlIHVybCBxdWVyeSBwYXJhbXMuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHdyaXRlVG9RdWVyeVBhcmFtcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZvcm0gdmFsdWUgc2hvdWxkIGJlIHVwZGF0ZWQgd2hlbiB0aGUgdXJsIHF1ZXJ5IHBhcmFtcyBjaGFuZ2UuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHN5bmNPbk5hdmlnYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgbmF2aWdhdGlvbiB3aWxsIG5vdCBjcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGJyb3dzZXIncyBoaXN0b3J5LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVwbGFjZVVybD86IGJvb2xlYW47XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Rm9ybVZhbHVlRXZlbnQ8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFF1ZXJ5RmllbGQ8YW55Pj4+IHtcbiAgcHJldmlvdXNWYWx1ZTogUXVlcnlGb3JtVmFsdWU8VD4gfCBudWxsO1xuICBjdXJyZW50VmFsdWU6IFF1ZXJ5Rm9ybVZhbHVlPFQ+O1xufVxuIl19
@@ -1,8 +1,8 @@
1
1
  import * as i1 from '@ethlete/core';
2
- import { BehaviorSubjectWithSubscriberCount, getCookie, setCookie, deleteCookie, createDestroy, DelayableDirective, equal, clone } from '@ethlete/core';
3
- import { Observable, filter, takeWhile, switchMap, of, tap, BehaviorSubject, shareReplay, Subject, takeUntil, interval, skip, map, timer, combineLatest, withLatestFrom, fromEvent, startWith, debounceTime, take, concat, distinctUntilChanged, pairwise } from 'rxjs';
2
+ import { BehaviorSubjectWithSubscriberCount, getCookie, setCookie, deleteCookie, createDestroy, DelayableDirective, RouterStateService, clone, equal, ET_PROPERTY_REMOVED } from '@ethlete/core';
3
+ import { Observable, filter, takeWhile, switchMap, of, tap, BehaviorSubject, shareReplay, Subject, takeUntil, interval, skip, map, timer, combineLatest, withLatestFrom, fromEvent, startWith, debounceTime, take, concat } from 'rxjs';
4
4
  import * as i0 from '@angular/core';
5
- import { isDevMode, Directive, Input, InjectionToken, inject, ChangeDetectorRef, ViewContainerRef, TemplateRef, ErrorHandler, ElementRef } from '@angular/core';
5
+ import { isDevMode, Directive, Input, InjectionToken, inject, ChangeDetectorRef, ViewContainerRef, TemplateRef, ErrorHandler, ElementRef, NgZone, assertInInjectionContext } from '@angular/core';
6
6
  import { FormGroup } from '@angular/forms';
7
7
  import { Router, ActivatedRoute } from '@angular/router';
8
8
 
@@ -1992,6 +1992,14 @@ const buildGqlCacheKey = (config, args) => {
1992
1992
  return `${queryFirst50Chars}...${queryMiddle25Chars}...${queryLast50Chars}...${vars}`;
1993
1993
  };
1994
1994
 
1995
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1996
+ class QueryFormGroup extends FormGroup {
1997
+ patchValue(
1998
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1999
+ value, options) {
2000
+ super.patchValue(value, options);
2001
+ }
2002
+ }
1995
2003
  class QueryField {
1996
2004
  get control() {
1997
2005
  return this.data.control;
@@ -2004,6 +2012,10 @@ class QueryField {
2004
2012
  setValue(value, options) {
2005
2013
  if (this._currentDebounceTimeout !== null) {
2006
2014
  clearTimeout(this._currentDebounceTimeout);
2015
+ this._currentDebounceTimeout = null;
2016
+ }
2017
+ if (value === this.control.value) {
2018
+ return;
2007
2019
  }
2008
2020
  if (this.data.debounce && !options?.skipDebounce) {
2009
2021
  this._currentDebounceTimeout = window.setTimeout(() => {
@@ -2037,78 +2049,126 @@ class QueryForm {
2037
2049
  }
2038
2050
  constructor(_fields) {
2039
2051
  this._fields = _fields;
2040
- this._router = inject(Router, { optional: true });
2041
- this._activatedRoute = inject(ActivatedRoute, { optional: true });
2052
+ this._destroy$ = createDestroy();
2053
+ this._unobserveTrigger$ = new Subject();
2054
+ this._router = inject(Router);
2055
+ this._activatedRoute = inject(ActivatedRoute);
2042
2056
  this._defaultValues = this._extractDefaultValues();
2057
+ this._routerStateService = inject(RouterStateService);
2058
+ this._zone = inject(NgZone);
2059
+ this._isObserving = false;
2043
2060
  this.form = this._setupFormGroup();
2061
+ this._lastFormValue$ = new BehaviorSubject(null);
2062
+ this._currentFormValue$ = new BehaviorSubject({
2063
+ id: 0,
2064
+ data: this._formValue,
2065
+ });
2044
2066
  this._changes$ = new BehaviorSubject({
2045
2067
  previousValue: null,
2046
2068
  currentValue: this.form.getRawValue(),
2047
2069
  });
2048
- this.changes$ = this._changes$.asObservable();
2070
+ this.changes$ = this._currentFormValue$.pipe(withLatestFrom(this._lastFormValue$)).pipe(map(([currentValueEvent, previousValueEvent]) => {
2071
+ return {
2072
+ previousValue: previousValueEvent?.data ?? null,
2073
+ currentValue: currentValueEvent.data,
2074
+ };
2075
+ }));
2076
+ assertInInjectionContext(QueryForm);
2049
2077
  }
2050
2078
  observe(options) {
2051
- return combineLatest(Object.values(this._fields).map((field) => field.changes$)).pipe(map(() => this._formValue), distinctUntilChanged((a, b) => equal(a, b)), tap((values) => {
2052
- if (options?.syncViaUrlQueryParams !== false) {
2053
- this._syncViaUrlQueryParams(values);
2054
- }
2055
- }), pairwise(), startWith([null, this._formValue]), map(([previousValue, currentValue]) => ({ previousValue, currentValue })), tap(({ previousValue, currentValue }) => {
2056
- let didResetValues = false;
2057
- for (const formFieldKey in this._fields) {
2058
- const resets = this._fields[formFieldKey].data.isResetBy;
2059
- if (!resets)
2079
+ if (this._isObserving) {
2080
+ if (isDevMode()) {
2081
+ console.warn('QueryForm.observe() was called multiple times. This is not supported.');
2082
+ }
2083
+ return;
2084
+ }
2085
+ this._isObserving = true;
2086
+ this.setFormValueFromUrlQueryParams({
2087
+ queryParams: this._routerStateService.queryParams,
2088
+ });
2089
+ this.form.valueChanges
2090
+ .pipe(startWith(null), tap(() => {
2091
+ this._lastFormValue$.next(clone(this._currentFormValue$.value));
2092
+ this._currentFormValue$.next({ id: this._currentFormValue$.value.id + 1, data: clone(this._formValue) });
2093
+ }), takeUntil(this._destroy$), takeUntil(this._unobserveTrigger$))
2094
+ .subscribe();
2095
+ this._currentFormValue$
2096
+ .pipe(tap((currentValueEvent) => {
2097
+ const previousValueEvent = this._lastFormValue$.value;
2098
+ const currentValue = currentValueEvent.data;
2099
+ if (options?.writeToQueryParams !== false) {
2100
+ this._syncViaUrlQueryParams(currentValueEvent.data, options?.replaceUrl);
2101
+ }
2102
+ const didResetValues = this._handleQueryFormResets(previousValueEvent?.data ?? null, currentValue);
2103
+ if (didResetValues) {
2104
+ return;
2105
+ }
2106
+ if (this._currentFormValue$.value.id !== currentValueEvent.id) {
2107
+ return;
2108
+ }
2109
+ this._changes$.next({
2110
+ previousValue: previousValueEvent?.data ?? null,
2111
+ currentValue: currentValueEvent.data,
2112
+ });
2113
+ }), takeUntil(this._destroy$), takeUntil(this._unobserveTrigger$))
2114
+ .subscribe();
2115
+ if (options?.syncOnNavigation !== false) {
2116
+ this._routerStateService.queryParamChanges$
2117
+ .pipe(takeUntil(this._destroy$), takeUntil(this._unobserveTrigger$), tap((changes) => this.setFormValueFromUrlQueryParams({ queryParams: changes })))
2118
+ .subscribe();
2119
+ }
2120
+ }
2121
+ _handleQueryFormResets(previousValue, currentValue) {
2122
+ let didResetValues = false;
2123
+ for (const formFieldKey in this._fields) {
2124
+ const resets = this._fields[formFieldKey].data.isResetBy;
2125
+ if (!resets)
2126
+ continue;
2127
+ const resetConditionKeys = Array.isArray(resets) ? resets : [resets];
2128
+ for (const resetConditionKey of resetConditionKeys) {
2129
+ if (!(resetConditionKey in this._fields)) {
2130
+ if (isDevMode()) {
2131
+ console.warn(`The field "${resetConditionKey}" is not defined in the QueryForm. Is it a typo?`, this);
2132
+ }
2060
2133
  continue;
2061
- const resetConditionKeys = Array.isArray(resets) ? resets : [resets];
2062
- for (const resetConditionKey of resetConditionKeys) {
2063
- if (!(resetConditionKey in this._fields)) {
2064
- if (isDevMode()) {
2065
- console.warn(`The field "${resetConditionKey}" is not defined in the QueryForm. Is it a typo?`, this);
2066
- }
2134
+ }
2135
+ if (previousValue &&
2136
+ currentValue &&
2137
+ !equal(previousValue[resetConditionKey], currentValue[resetConditionKey])) {
2138
+ const defaultValueForKeyToReset = this._defaultValues[formFieldKey];
2139
+ const currentValueForKeyToReset = currentValue[formFieldKey];
2140
+ if (equal(defaultValueForKeyToReset, currentValueForKeyToReset)) {
2067
2141
  continue;
2068
2142
  }
2069
- if (previousValue &&
2070
- currentValue &&
2071
- !equal(previousValue[resetConditionKey], currentValue[resetConditionKey])) {
2072
- const defaultValueForKeyToReset = this._defaultValues[formFieldKey];
2073
- const currentValueForKeyToReset = currentValue[formFieldKey];
2074
- if (equal(defaultValueForKeyToReset, currentValueForKeyToReset)) {
2075
- continue;
2076
- }
2077
- this.form.controls[formFieldKey].setValue(defaultValueForKeyToReset);
2078
- didResetValues = true;
2079
- break;
2080
- }
2143
+ this.form.controls[formFieldKey].setValue(defaultValueForKeyToReset);
2144
+ didResetValues = true;
2145
+ break;
2081
2146
  }
2082
2147
  }
2083
- if (!didResetValues) {
2084
- this._changes$.next({
2085
- previousValue,
2086
- currentValue,
2087
- });
2088
- }
2089
- }), shareReplay({ bufferSize: 1, refCount: true }), map(() => null));
2148
+ }
2149
+ return didResetValues;
2150
+ }
2151
+ unobserve() {
2152
+ this._unobserveTrigger$.next(true);
2090
2153
  }
2091
2154
  setFormValueFromUrlQueryParams(options) {
2092
- if (!this._activatedRoute) {
2093
- throw new Error('Cannot set form value from url query params without ActivatedRoute');
2094
- }
2095
- const queryParams = this._activatedRoute.snapshot.queryParams;
2096
2155
  for (const [key, field] of Object.entries(this._fields)) {
2097
- const value = queryParams[key];
2098
- // We only check using == because the value types can be different (e.g. "1" and 1)
2099
- if (value === undefined || value == field.control.value) {
2156
+ const value = options.queryParams[key];
2157
+ const valueDoesNotExist = value === undefined;
2158
+ if (valueDoesNotExist)
2159
+ continue;
2160
+ const valueGotRemoved = value === ET_PROPERTY_REMOVED;
2161
+ if (valueGotRemoved) {
2162
+ field.setValue(this._getDefaultValue(key), { skipDebounce: options?.skipDebounce ?? true });
2100
2163
  continue;
2101
2164
  }
2102
2165
  const deserializedValue = field.data.queryParamToValueTransformFn?.(value) ?? value;
2166
+ const valueIsEqualToCurrent = equal(deserializedValue, field.control.value);
2167
+ if (valueIsEqualToCurrent)
2168
+ continue;
2103
2169
  field.setValue(deserializedValue, { skipDebounce: options?.skipDebounce ?? true });
2104
2170
  }
2105
2171
  }
2106
- updateFormOnUrlQueryParamsChange() {
2107
- if (!this._activatedRoute) {
2108
- throw new Error('Cannot update form on url query params change without ActivatedRoute');
2109
- }
2110
- return this._activatedRoute.queryParams.pipe(tap(() => this.setFormValueFromUrlQueryParams()));
2111
- }
2112
2172
  _getDefaultValue(key) {
2113
2173
  return this._defaultValues[key] ?? null;
2114
2174
  }
@@ -2117,7 +2177,7 @@ class QueryForm {
2117
2177
  return this._getDefaultValue(key) === normalizedValue;
2118
2178
  }
2119
2179
  _setupFormGroup() {
2120
- const group = new FormGroup({});
2180
+ const group = new QueryFormGroup({});
2121
2181
  for (const [key, field] of Object.entries(this._fields)) {
2122
2182
  group.addControl(key, field.control);
2123
2183
  }
@@ -2139,12 +2199,13 @@ class QueryForm {
2139
2199
  }
2140
2200
  return defaultValues;
2141
2201
  }
2142
- _syncViaUrlQueryParams(values) {
2143
- if (!this._router || !this._activatedRoute) {
2144
- return;
2145
- }
2202
+ _syncViaUrlQueryParams(values, replaceUrl) {
2146
2203
  const queryParams = { ...clone(this._activatedRoute.snapshot.queryParams) };
2147
2204
  for (const [key, value] of Object.entries(values)) {
2205
+ if (!this._fields[key]) {
2206
+ console.warn(`The field "${key}" is not defined in the QueryForm. Is it a typo?`, this);
2207
+ continue;
2208
+ }
2148
2209
  if (this._isDefaultValue(key, value) || this._fields[key].data.appendToUrl === false) {
2149
2210
  delete queryParams[key];
2150
2211
  }
@@ -2154,8 +2215,11 @@ class QueryForm {
2154
2215
  : value;
2155
2216
  }
2156
2217
  }
2157
- this._router.navigate([], {
2158
- queryParams,
2218
+ this._zone.run(() => {
2219
+ this._router.navigate([], {
2220
+ queryParams,
2221
+ replaceUrl,
2222
+ });
2159
2223
  });
2160
2224
  }
2161
2225
  }
@@ -2283,5 +2347,5 @@ const def = () => null;
2283
2347
  * Generated bundle index. Do not edit.
2284
2348
  */
2285
2349
 
2286
- export { BasicAuthProvider, BearerAuthProvider, CustomHeaderAuthProvider, EntityStore, INFINITY_QUERY_TOKEN, InfinityQuery, InfinityQueryDirective, InfinityQueryTriggerDirective, Query, QueryClient, QueryCreator, QueryDirective, QueryError, QueryField, QueryForm, QueryStore, buildErrorMessage, buildGqlCacheKey, buildQueryArrayString, buildQueryObjectString, buildQueryString, buildRoute, buildTimestampFromSeconds, castQueryCreatorTypes, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, createInfinityQueryConfig, createQueryCollection, decryptBearer, deepFreeze, def, detectContentTypeHeader, extractExpiresInSeconds, extractQuery, filterFailure, filterInvalidParams, filterNull, filterQueryStates, filterSuccess, forEachHeader, getDefaultHeaders, getResponseUrl, gql, hasHeader, ignoreAutoRefresh, invalidBaseRouteError, invalidBodyError, invalidRouteError, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isCustomHeaderAuthProvider, isGqlQueryConfig, isParamValid, isQuery, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, isSymfonyError, isSymfonyPagerfantaOutOfRangeError, mapToPaginated, mergeHeaders, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, pathParamsMissingInRouteFunctionError, queryStateAlreadyHasKeyError, queryStateCannotTransformError, queryStateDoesNotContainKeyError, request, resetPageOnError, serializeBody, shouldCacheQuery, shouldRetryRequest, skipPaginationPageParamCalculator, switchQueryCollectionState, switchQueryState, takeUntilResponse, transformGql, transformMethod, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray };
2350
+ export { BasicAuthProvider, BearerAuthProvider, CustomHeaderAuthProvider, EntityStore, INFINITY_QUERY_TOKEN, InfinityQuery, InfinityQueryDirective, InfinityQueryTriggerDirective, Query, QueryClient, QueryCreator, QueryDirective, QueryError, QueryField, QueryForm, QueryFormGroup, QueryStore, buildErrorMessage, buildGqlCacheKey, buildQueryArrayString, buildQueryObjectString, buildQueryString, buildRoute, buildTimestampFromSeconds, castQueryCreatorTypes, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, createInfinityQueryConfig, createQueryCollection, decryptBearer, deepFreeze, def, detectContentTypeHeader, extractExpiresInSeconds, extractQuery, filterFailure, filterInvalidParams, filterNull, filterQueryStates, filterSuccess, forEachHeader, getDefaultHeaders, getResponseUrl, gql, hasHeader, ignoreAutoRefresh, invalidBaseRouteError, invalidBodyError, invalidRouteError, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isCustomHeaderAuthProvider, isGqlQueryConfig, isParamValid, isQuery, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, isSymfonyError, isSymfonyPagerfantaOutOfRangeError, mapToPaginated, mergeHeaders, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, pathParamsMissingInRouteFunctionError, queryStateAlreadyHasKeyError, queryStateCannotTransformError, queryStateDoesNotContainKeyError, request, resetPageOnError, serializeBody, shouldCacheQuery, shouldRetryRequest, skipPaginationPageParamCalculator, switchQueryCollectionState, switchQueryState, takeUntilResponse, transformGql, transformMethod, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray };
2287
2351
  //# sourceMappingURL=ethlete-query.mjs.map