@wavemaker/app-ng-runtime 11.14.1-18.6421 → 11.14.1-18.6428

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/components/base/bundles/index.umd.js +17 -81
  2. package/components/base/esm2022/pipes/custom-pipes.mjs +10 -10
  3. package/components/base/esm2022/utils/widget-utils.mjs +3 -3
  4. package/components/base/esm2022/widgets/common/base/base.component.mjs +6 -61
  5. package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +3 -7
  6. package/components/base/esm2022/widgets/framework/property-change-handler.mjs +2 -7
  7. package/components/base/fesm2022/index.mjs +18 -82
  8. package/components/base/fesm2022/index.mjs.map +1 -1
  9. package/components/base/pipes/custom-pipes.d.ts +5 -5
  10. package/components/basic/label/bundles/index.umd.js +1 -9
  11. package/components/basic/label/esm2022/label.directive.mjs +2 -10
  12. package/components/basic/label/fesm2022/index.mjs +1 -9
  13. package/components/basic/label/fesm2022/index.mjs.map +1 -1
  14. package/components/chart/bundles/index.umd.js +2 -2
  15. package/components/chart/esm2022/chart.utils.mjs +3 -3
  16. package/components/chart/fesm2022/index.mjs +2 -2
  17. package/components/chart/fesm2022/index.mjs.map +1 -1
  18. package/components/containers/wizard/bundles/index.umd.js +2 -21
  19. package/components/containers/wizard/esm2022/wizard-step/wizard-step.component.mjs +1 -3
  20. package/components/containers/wizard/esm2022/wizard.component.mjs +3 -20
  21. package/components/containers/wizard/fesm2022/index.mjs +2 -21
  22. package/components/containers/wizard/fesm2022/index.mjs.map +1 -1
  23. package/components/containers/wizard/wizard-step/wizard-step.component.d.ts +0 -2
  24. package/components/data/pagination/bundles/index.umd.js +0 -4
  25. package/components/data/pagination/esm2022/pagination.component.mjs +1 -5
  26. package/components/data/pagination/fesm2022/index.mjs +0 -4
  27. package/components/data/pagination/fesm2022/index.mjs.map +1 -1
  28. package/components/data/table/bundles/index.umd.js +14 -370
  29. package/components/data/table/esm2022/table-action/table-action.directive.mjs +1 -8
  30. package/components/data/table/esm2022/table-column/table-column.directive.mjs +3 -107
  31. package/components/data/table/esm2022/table-column-group/table-column-group.directive.mjs +1 -9
  32. package/components/data/table/esm2022/table-cud.directive.mjs +2 -8
  33. package/components/data/table/esm2022/table-filter.directive.mjs +2 -12
  34. package/components/data/table/esm2022/table-row/table-row.directive.mjs +1 -8
  35. package/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +1 -8
  36. package/components/data/table/esm2022/table.component.mjs +12 -219
  37. package/components/data/table/fesm2022/index.mjs +15 -371
  38. package/components/data/table/fesm2022/index.mjs.map +1 -1
  39. package/components/data/table/table-action/table-action.directive.d.ts +2 -3
  40. package/components/data/table/table-column/table-column.directive.d.ts +2 -3
  41. package/components/data/table/table-column-group/table-column-group.directive.d.ts +2 -3
  42. package/components/data/table/table-cud.directive.d.ts +1 -3
  43. package/components/data/table/table-filter.directive.d.ts +1 -3
  44. package/components/data/table/table-row/table-row.directive.d.ts +2 -3
  45. package/components/data/table/table-row-action/table-row-action.directive.d.ts +2 -3
  46. package/components/data/table/table.component.d.ts +2 -6
  47. package/components/navigation/menu/bundles/index.umd.js +0 -5
  48. package/components/navigation/menu/esm2022/menu.component.mjs +1 -6
  49. package/components/navigation/menu/fesm2022/index.mjs +0 -5
  50. package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  51. package/components/navigation/popover/bundles/index.umd.js +6 -6
  52. package/components/navigation/popover/esm2022/popover.component.mjs +4 -4
  53. package/components/navigation/popover/fesm2022/index.mjs +3 -3
  54. package/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  55. package/components/navigation/popover/popover.component.d.ts +0 -6
  56. package/core/bundles/index.umd.js +15 -120
  57. package/core/esm2022/public_api.mjs +2 -2
  58. package/core/esm2022/utils/utils.mjs +2 -6
  59. package/core/esm2022/utils/watcher.mjs +15 -118
  60. package/core/fesm2022/index.mjs +15 -124
  61. package/core/fesm2022/index.mjs.map +1 -1
  62. package/core/public_api.d.ts +1 -1
  63. package/core/utils/utils.d.ts +0 -1
  64. package/npm-shrinkwrap.json +2 -2
  65. package/package-lock.json +2 -2
  66. package/package.json +1 -1
  67. package/runtime/base/bundles/index.umd.js +2 -3
  68. package/runtime/base/esm2022/components/base-page.component.mjs +1 -2
  69. package/runtime/base/esm2022/services/pipe-provider.service.mjs +4 -4
  70. package/runtime/base/fesm2022/index.mjs +2 -3
  71. package/runtime/base/fesm2022/index.mjs.map +1 -1
  72. package/runtime/dynamic/bundles/index.umd.js +0 -4
  73. package/runtime/dynamic/esm2022/app/app.config.mjs +2 -6
  74. package/runtime/dynamic/fesm2022/index.mjs +1 -5
  75. package/runtime/dynamic/fesm2022/index.mjs.map +1 -1
  76. package/scripts/datatable/datatable.js +15 -103
@@ -1,6 +1,7 @@
1
1
  import { IDGenerator } from './id-generator';
2
2
  import { $parseExpr } from './expression-parser';
3
3
  import { findValueOf } from './utils';
4
+ import { clone, flatten, isArray, isEqual, isObject } from "lodash-es";
4
5
  const registry = new Map();
5
6
  const watchIdGenerator = new IDGenerator('watch-id-');
6
7
  export const FIRST_TIME_WATCH = {};
@@ -20,17 +21,17 @@ export const muteWatchers = () => {
20
21
  };
21
22
  export const unMuteWatchers = () => {
22
23
  muted = false;
23
- $invokeWatchers(true);
24
+ triggerWatchers();
24
25
  };
25
26
  const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
26
27
  let data = newVal, formattedData;
27
- if (_.isArray(data)) {
28
+ if (isArray(data)) {
28
29
  formattedData = data.map(function (datum) {
29
30
  return findValueOf(datum, restExpr);
30
31
  });
31
32
  // If resulting structure is an array of array, flatten it
32
- if (_.isArray(formattedData[0])) {
33
- formattedData = _.flatten(formattedData);
33
+ if (isArray(formattedData[0])) {
34
+ formattedData = flatten(formattedData);
34
35
  }
35
36
  listenerFn(formattedData, oldVal);
36
37
  }
@@ -81,7 +82,6 @@ const triggerWatchers = (ignoreMuted) => {
81
82
  if (muted && !ignoreMuted) {
82
83
  return;
83
84
  }
84
- log(".......................triggerWatchers.................................");
85
85
  const limit = 5;
86
86
  let pass = 1;
87
87
  let changeDetected;
@@ -101,12 +101,13 @@ const triggerWatchers = (ignoreMuted) => {
101
101
  catch (e) {
102
102
  console.warn(`error in executing expression: '${watchInfo.expr}'`);
103
103
  }
104
- if (!_.isEqual(nv, ov)) {
104
+ if (!isEqual(nv, ov)) {
105
105
  changeDetected = true;
106
106
  changedByWatch = true;
107
107
  watchInfo.last = nv;
108
- if (_.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
109
- watchInfo.last = _.clone(nv);
108
+ // @ts-ignore
109
+ if (isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
110
+ watchInfo.last = clone(nv);
110
111
  }
111
112
  listener(nv, ov);
112
113
  resetChangeFromWatch();
@@ -126,121 +127,22 @@ export const isChangeFromWatch = () => changedByWatch;
126
127
  export const resetChangeFromWatch = () => changedByWatch = false;
127
128
  window.watchRegistry = registry;
128
129
  let skipWatchers;
129
- let scheduled = false, rerunRequested = false, isRunning = false, consecutiveReruns = 0;
130
- const MAX_PASSES = 5, DEBOUNCE_TIME = 200, MAX_CONSECUTIVE_RERUNS = 3;
131
- window.__WM_DEBUG_WATCHERS__ = false;
132
- export const $invokeWatchers = (force = false, ignoreMuted = false) => {
133
- if (force) {
134
- triggerWatchers(ignoreMuted);
135
- }
136
- else {
137
- scheduleExecution(ignoreMuted);
138
- }
139
- };
140
- function scheduleExecution(ignoreMuted) {
141
- if (scheduled) {
142
- rerunRequested = true;
143
- return;
144
- }
145
- scheduled = true;
146
- // Reset consecutive rerun counter when scheduling from outside
147
- // (not from within executeWatchers rerun logic)
148
- if (!isRunning) {
149
- consecutiveReruns = 0;
150
- }
151
- debouncedExecute(ignoreMuted);
152
- }
153
- const debouncedExecute = debounce((ignoreMuted) => {
154
- scheduled = false;
155
- executeWatchers(ignoreMuted);
156
- }, DEBOUNCE_TIME);
157
- function executeWatchers(ignoreMuted) {
158
- if (isRunning) {
159
- rerunRequested = true;
160
- return;
161
- }
162
- isRunning = true;
163
- let actuallyChanged = false;
164
- ngZone.runOutsideAngular(() => {
165
- let pass = 1;
166
- let changeDetected;
167
- do {
168
- changeDetected = false;
169
- log(`-------executeWatchers (run #${consecutiveReruns + 1})--------- `);
170
- registry.forEach(watchInfo => {
171
- if (watchInfo.isMuted && watchInfo.isMuted()) {
172
- return;
173
- }
174
- const fn = watchInfo.fn;
175
- const listener = watchInfo.listener;
176
- const ov = watchInfo.last;
177
- let nv;
178
- try {
179
- nv = fn();
180
- }
181
- catch (e) {
182
- console.warn(`error in executing expression: '${watchInfo.expr}'`);
183
- }
184
- if (!_.isEqual(nv, ov)) {
185
- changeDetected = true;
186
- actuallyChanged = true;
187
- changedByWatch = true;
188
- watchInfo.last = nv;
189
- if (_.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
190
- watchInfo.last = _.clone(nv);
191
- }
192
- listener(nv, ov);
193
- resetChangeFromWatch();
194
- }
195
- });
196
- pass++;
197
- } while (changeDetected && pass < MAX_PASSES);
198
- });
199
- isRunning = false;
200
- // Trigger Angular change detection if watchers actually changed values
201
- if (actuallyChanged) {
202
- ngZone.run(() => {
203
- log(`-------DONE (changes detected)--------- `);
204
- });
205
- }
206
- else {
207
- log(`-------DONE (no changes)--------- `);
208
- }
209
- // 🔥 collapse ALL mid-run triggers into ONE rerun
210
- // BUT limit consecutive reruns to prevent infinite loops
211
- if (rerunRequested) {
212
- rerunRequested = false;
213
- if (consecutiveReruns < MAX_CONSECUTIVE_RERUNS) {
214
- consecutiveReruns++;
215
- log(`[Watcher] Scheduling rerun #${consecutiveReruns} (requested during execution)`);
216
- scheduleExecution(ignoreMuted);
217
- }
218
- else {
219
- consecutiveReruns = 0;
220
- log(`[Watcher] ⚠️ Stopped infinite loop! Max consecutive reruns (${MAX_CONSECUTIVE_RERUNS}) reached. This usually means watcher listeners are triggering more change detection.`);
221
- }
222
- }
223
- else {
224
- // No rerun requested - reset counter
225
- consecutiveReruns = 0;
226
- }
227
- }
228
130
  const debouncedTriggerWatchers = debounce(() => {
229
131
  skipWatchers = true;
230
- ngZone.runOutsideAngular(() => triggerWatchers());
132
+ ngZone.run(() => triggerWatchers());
231
133
  }, 100);
232
- /*export const $invokeWatchers = (force?: boolean, ignoreMuted?: boolean) => {
134
+ export const $invokeWatchers = (force, ignoreMuted) => {
233
135
  if (force) {
234
136
  triggerWatchers(ignoreMuted);
235
- } else {
236
-
137
+ }
138
+ else {
237
139
  if (skipWatchers) {
238
140
  skipWatchers = false;
239
141
  return;
240
142
  }
241
143
  debouncedTriggerWatchers();
242
144
  }
243
- };*/
145
+ };
244
146
  export const $appDigest = (() => {
245
147
  let queued = false;
246
148
  return (force) => {
@@ -265,9 +167,4 @@ export const $appDigest = (() => {
265
167
  }
266
168
  };
267
169
  })();
268
- function log(message) {
269
- if (window.__WM_DEBUG_WATCHERS__) {
270
- console.log(message);
271
- }
272
- }
273
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBSXRDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7QUFFeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV0RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDO0FBRTdELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLE1BQU0sQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQVksRUFBRSxPQUFlLEVBQUUsRUFBRSxFQUFFO0lBQ3hELElBQUksT0FBTyxDQUFDO0lBQ1osT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxPQUFPLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEdBQUcsRUFBRTtJQUM3QixLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLEVBQUU7SUFDL0IsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNkLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFO0lBQzNELElBQUksSUFBSSxHQUFHLE1BQU0sRUFDYixhQUFhLENBQUM7SUFFbEIsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEIsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLO1lBQ3BDLE9BQU8sV0FBVyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5QixhQUFhLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEVBQUU7SUFDeEQsZ0NBQWdDO0lBQ2hDLDBEQUEwRDtJQUMxRCxJQUFJLEtBQUssR0FBRyxVQUFVLEVBQ2xCLEVBQUUsR0FBa0IsTUFBTSxFQUMxQixFQUFFLEdBQWtCLEtBQUssQ0FBQztJQUM5QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDaEIsT0FBTztZQUNILE1BQU0sRUFBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDcEMsVUFBVSxFQUFHLFFBQVE7U0FDeEIsQ0FBQztJQUNOLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsMkVBQTJFO0lBQzNFLElBQUksS0FBSyxHQUFhLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQ3RDLEtBQUssR0FBYSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUN2RCxRQUFRLEdBQVUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQ3hDLGVBQWUsR0FBRyxRQUFRLENBQUM7SUFFL0IsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNYLGVBQWUsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELE9BQU87UUFDSCxNQUFNLEVBQU8sS0FBSztRQUNsQixVQUFVLEVBQUcsZUFBZTtLQUMvQixDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxVQUFVLEdBQUcsS0FBSyxFQUFFLFNBQVcsRUFBRSxFQUFFLE9BQXVCLEVBQUUsRUFBRTtJQUMzSixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5QixJQUFJLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbEcsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDdEIsUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDbEMsQ0FBQztJQUNELE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU1QixRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtRQUNyQixFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUNsQyxRQUFRO1FBQ1IsSUFBSTtRQUNKLElBQUksRUFBRSxnQkFBZ0I7UUFDdEIsVUFBVTtRQUNWLE9BQU8sRUFBRSxPQUFPO0tBQ25CLENBQUMsQ0FBQztJQUVILE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFFbEUsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBRTNCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztBQUUxQyxJQUFJLE1BQU0sQ0FBQztBQUVYLE1BQU0sZUFBZSxHQUFHLENBQUMsV0FBcUIsRUFBRSxFQUFFO0lBRTlDLElBQUksS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEIsT0FBTztJQUNYLENBQUM7SUFDRCxHQUFHLENBQUMseUVBQXlFLENBQUMsQ0FBQztJQUMvRSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDaEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxjQUFjLENBQUM7SUFFbkIsR0FBRyxDQUFDO1FBQ0EsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUN2QixRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3pCLElBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDMUMsT0FBTztZQUNYLENBQUM7WUFDRCxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7WUFDcEMsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUMxQixJQUFJLEVBQUUsQ0FBQztZQUVQLElBQUksQ0FBQztnQkFDRCxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDZCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN2RSxDQUFDO1lBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUVwQixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxhQUFhLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQ3hFLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDakMsQ0FBQztnQkFDRCxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQixvQkFBb0IsRUFBRSxDQUFDO1lBQzNCLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksRUFBRSxDQUFDO0lBRVgsQ0FBQyxRQUFRLGNBQWMsSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFO0lBRXpDLElBQUksY0FBYyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzlFLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsRUFBRTtJQUMzQixNQUFNLEdBQUcsR0FBRyxDQUFBO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBRTNELE1BQU8sQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO0FBRXZDLElBQUksWUFBWSxDQUFDO0FBRWpCLElBQUksU0FBUyxHQUFHLEtBQUssRUFDakIsY0FBYyxHQUFHLEtBQUssRUFDdEIsU0FBUyxHQUFHLEtBQUssRUFDakIsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBRTFCLE1BQU0sVUFBVSxHQUFHLENBQUMsRUFDaEIsYUFBYSxHQUFHLEdBQUcsRUFDbkIsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBRTlCLE1BQWMsQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7QUFFOUMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQzNCLEtBQUssR0FBRyxLQUFLLEVBQ2IsV0FBVyxHQUFHLEtBQUssRUFDZixFQUFFO0lBQ04sSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNSLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqQyxDQUFDO1NBQU0sQ0FBQztRQUNKLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixTQUFTLGlCQUFpQixDQUFDLFdBQW9CO0lBQzNDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDWixjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLE9BQU87SUFDWCxDQUFDO0lBRUQsU0FBUyxHQUFHLElBQUksQ0FBQztJQUVqQiwrREFBK0Q7SUFDL0QsZ0RBQWdEO0lBQ2hELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNiLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVELE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLENBQUMsV0FBb0IsRUFBRSxFQUFFO0lBQ3ZELFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUVsQixTQUFTLGVBQWUsQ0FBQyxXQUFvQjtJQUN6QyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ1osY0FBYyxHQUFHLElBQUksQ0FBQztRQUN0QixPQUFPO0lBQ1gsQ0FBQztJQUVELFNBQVMsR0FBRyxJQUFJLENBQUM7SUFFakIsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRTVCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7UUFDMUIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsSUFBSSxjQUF1QixDQUFDO1FBRTVCLEdBQUcsQ0FBQztZQUNBLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDdkIsR0FBRyxDQUFDLGdDQUFnQyxpQkFBaUIsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXhFLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3pCLElBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztvQkFDMUMsT0FBTztnQkFDWCxDQUFDO2dCQUNELE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7Z0JBQ3BDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLElBQUksRUFBRSxDQUFDO2dCQUVQLElBQUksQ0FBQztvQkFDRCxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQ2QsQ0FBQztnQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNULE9BQU8sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUN2RSxDQUFDO2dCQUVELElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUNyQixjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUN0QixlQUFlLEdBQUcsSUFBSSxDQUFDO29CQUN2QixjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUN0QixTQUFTLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFFcEIsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsYUFBYSxLQUFLLEtBQUssRUFBRSxDQUFDO3dCQUN4RSxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2pDLENBQUM7b0JBQ0QsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDakIsb0JBQW9CLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxFQUFFLENBQUM7UUFDWCxDQUFDLFFBQVEsY0FBYyxJQUFJLElBQUksR0FBRyxVQUFVLEVBQUU7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRWxCLHVFQUF1RTtJQUN2RSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1osR0FBRyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO1NBQU0sQ0FBQztRQUNKLEdBQUcsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQseURBQXlEO0lBQ3pELElBQUksY0FBYyxFQUFFLENBQUM7UUFDakIsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUV2QixJQUFJLGlCQUFpQixHQUFHLHNCQUFzQixFQUFFLENBQUM7WUFDN0MsaUJBQWlCLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMsK0JBQStCLGlCQUFpQiwrQkFBK0IsQ0FBQyxDQUFDO1lBQ3JGLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ0osaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQywrREFBK0Qsc0JBQXNCLHVGQUF1RixDQUFDLENBQUM7UUFDdEwsQ0FBQztJQUNMLENBQUM7U0FBTSxDQUFDO1FBQ0oscUNBQXFDO1FBQ3JDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sd0JBQXdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtJQUMzQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUVSOzs7Ozs7Ozs7OztJQVdJO0FBRUosTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxFQUFFO0lBQzVCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNuQixPQUFPLENBQUMsS0FBZSxFQUFFLEVBQUU7UUFDdkIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1YsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ25CLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDVCxPQUFPO1lBQ1gsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNoQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNuQixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMLFNBQVMsR0FBRyxDQUFDLE9BQWU7SUFDeEIsSUFBSyxNQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURHZW5lcmF0b3IgfSBmcm9tICcuL2lkLWdlbmVyYXRvcic7XG5cbmltcG9ydCB7ICRwYXJzZUV4cHIgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyJztcbmltcG9ydCB7IGZpbmRWYWx1ZU9mIH0gZnJvbSAnLi91dGlscyc7XG5cbmRlY2xhcmUgY29uc3QgXztcblxuY29uc3QgcmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuXG5jb25zdCB3YXRjaElkR2VuZXJhdG9yID0gbmV3IElER2VuZXJhdG9yKCd3YXRjaC1pZC0nKTtcblxuZXhwb3J0IGNvbnN0IEZJUlNUX1RJTUVfV0FUQ0ggPSB7fTtcblxuT2JqZWN0LmZyZWV6ZShGSVJTVF9USU1FX1dBVENIKTtcblxuZXhwb3J0IGNvbnN0IGlzRmlyc3RUaW1lQ2hhbmdlID0gdiA9PiB2ID09PSBGSVJTVF9USU1FX1dBVENIO1xuXG5sZXQgbXV0ZWQgPSBmYWxzZTtcbmxldCBhcHBSZWY7XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IChmbjogRnVuY3Rpb24sIHdhaXQ6IG51bWJlciA9IDUwKSA9PiB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgIHdpbmRvd1snX196b25lX3N5bWJvbF9fY2xlYXJUaW1lb3V0J10odGltZW91dCk7XG4gICAgICAgIHRpbWVvdXQgPSB3aW5kb3dbJ19fem9uZV9zeW1ib2xfX3NldFRpbWVvdXQnXSgoKSA9PiBmbiguLi5hcmdzKSwgd2FpdCk7XG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBtdXRlV2F0Y2hlcnMgPSAoKSA9PiB7XG4gICAgbXV0ZWQgPSB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IHVuTXV0ZVdhdGNoZXJzID0gKCkgPT4ge1xuICAgIG11dGVkID0gZmFsc2U7XG4gICAgJGludm9rZVdhdGNoZXJzKHRydWUpO1xufTtcblxuY29uc3QgYXJyYXlDb25zdW1lciA9IChsaXN0ZW5lckZuLCByZXN0RXhwciwgbmV3VmFsLCBvbGRWYWwpID0+IHtcbiAgICBsZXQgZGF0YSA9IG5ld1ZhbCxcbiAgICAgICAgZm9ybWF0dGVkRGF0YTtcblxuICAgIGlmIChfLmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgZm9ybWF0dGVkRGF0YSA9IGRhdGEubWFwKGZ1bmN0aW9uIChkYXR1bSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmRWYWx1ZU9mKGRhdHVtLCByZXN0RXhwcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHJlc3VsdGluZyBzdHJ1Y3R1cmUgaXMgYW4gYXJyYXkgb2YgYXJyYXksIGZsYXR0ZW4gaXRcbiAgICAgICAgaWYgKF8uaXNBcnJheShmb3JtYXR0ZWREYXRhWzBdKSkge1xuICAgICAgICAgICAgZm9ybWF0dGVkRGF0YSA9IF8uZmxhdHRlbihmb3JtYXR0ZWREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3RlbmVyRm4oZm9ybWF0dGVkRGF0YSwgb2xkVmFsKTtcbiAgICB9XG59O1xuXG5jb25zdCBnZXRVcGRhdGVkV2F0Y0luZm8gPSAoZXhwciwgYWNjZXB0c0FycmF5LCBsaXN0ZW5lcikgPT4ge1xuICAgIC8vIGxpc3RlbmVyIGRvZXNuJ3QgYWNjZXB0IGFycmF5XG4gICAgLy8gcmVwbGFjZSBhbGwgYFskaV1gIHdpdGggYFswXWAgYW5kIHJldHVybiB0aGUgZXhwcmVzc2lvblxuICAgIGxldCByZWdleCA9IC9cXFtcXCRpXFxdL2csXG4gICAgICAgICRJICAgICAgICAgICAgICAgID0gJ1skaV0nLFxuICAgICAgICAkMCAgICAgICAgICAgICAgICA9ICdbMF0nO1xuICAgIGlmICghYWNjZXB0c0FycmF5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnZXhwcicgICAgIDogZXhwci5yZXBsYWNlKHJlZ2V4LCAkMCksXG4gICAgICAgICAgICAnbGlzdGVuZXInIDogbGlzdGVuZXJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBsaXN0ZW5lciBhY2NlcHRzIGFycmF5XG4gICAgLy8gcmVwbGFjZSBhbGwgZXhjZXB0IHRoZSBsYXN0IGBbJGldYCB3aXRoIGBbMF1gIGFuZCByZXR1cm4gdGhlIGV4cHJlc3Npb24uXG4gICAgdmFyIGluZGV4ICAgICAgICAgICA9IGV4cHIubGFzdEluZGV4T2YoJEkpLFxuICAgICAgICBfZXhwciAgICAgICAgICAgPSBleHByLnN1YnN0cigwLCBpbmRleCkucmVwbGFjZSgkSSwgJDApLFxuICAgICAgICByZXN0RXhwciAgICAgICAgPSBleHByLnN1YnN0cihpbmRleCArIDUpLFxuICAgICAgICBhcnJheUNvbnN1bWVyRm4gPSBsaXN0ZW5lcjtcblxuICAgIGlmIChyZXN0RXhwcikge1xuICAgICAgICBhcnJheUNvbnN1bWVyRm4gPSBhcnJheUNvbnN1bWVyLmJpbmQodW5kZWZpbmVkLCBsaXN0ZW5lciwgcmVzdEV4cHIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgICdleHByJyAgICAgOiBfZXhwcixcbiAgICAgICAgJ2xpc3RlbmVyJyA6IGFycmF5Q29uc3VtZXJGblxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgJHdhdGNoID0gKGV4cHIsICRzY29wZSwgJGxvY2FscywgbGlzdGVuZXIsIGlkZW50aWZpZXIgPSB3YXRjaElkR2VuZXJhdG9yLm5leHRVaWQoKSwgZG9Ob3RDbG9uZSA9IGZhbHNlLCBjb25maWc6YW55PXt9LCBpc011dGVkPzogKCkgPT4gYm9vbGVhbikgPT4ge1xuICAgIGlmIChleHByLmluZGV4T2YoJ1skaV0nKSAhPT0gLTEpIHtcbiAgICAgICAgbGV0IHdhdGNoSW5mbyA9IGdldFVwZGF0ZWRXYXRjSW5mbyhleHByLCBjb25maWcgJiYgKGNvbmZpZy5hcnJheVR5cGUgfHwgY29uZmlnLmlzTGlzdCksIGxpc3RlbmVyKTtcbiAgICAgICAgZXhwciA9IHdhdGNoSW5mby5leHByO1xuICAgICAgICBsaXN0ZW5lciA9IHdhdGNoSW5mby5saXN0ZW5lcjtcbiAgICB9XG4gICAgY29uc3QgZm4gPSAkcGFyc2VFeHByKGV4cHIpO1xuXG4gICAgcmVnaXN0cnkuc2V0KGlkZW50aWZpZXIsIHtcbiAgICAgICAgZm46IGZuLmJpbmQoZXhwciwgJHNjb3BlLCAkbG9jYWxzKSxcbiAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgIGV4cHIsXG4gICAgICAgIGxhc3Q6IEZJUlNUX1RJTUVfV0FUQ0gsXG4gICAgICAgIGRvTm90Q2xvbmUsXG4gICAgICAgIGlzTXV0ZWQ6IGlzTXV0ZWRcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiAkdW53YXRjaChpZGVudGlmaWVyKTtcbn07XG5cbmV4cG9ydCBjb25zdCAkdW53YXRjaCA9IGlkZW50aWZpZXIgPT4gcmVnaXN0cnkuZGVsZXRlKGlkZW50aWZpZXIpO1xuXG5sZXQgY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcblxuY29uc3QgJFJBRiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbmxldCBuZ1pvbmU7XG5cbmNvbnN0IHRyaWdnZXJXYXRjaGVycyA9IChpZ25vcmVNdXRlZD86IGJvb2xlYW4pID0+IHtcblxuICAgIGlmIChtdXRlZCAmJiAhaWdub3JlTXV0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2coXCIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLnRyaWdnZXJXYXRjaGVycy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlwiKTtcbiAgICBjb25zdCBsaW1pdCA9IDU7XG4gICAgbGV0IHBhc3MgPSAxO1xuICAgIGxldCBjaGFuZ2VEZXRlY3RlZDtcblxuICAgIGRvIHtcbiAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmVnaXN0cnkuZm9yRWFjaCh3YXRjaEluZm8gPT4ge1xuICAgICAgICAgICAgaWYod2F0Y2hJbmZvLmlzTXV0ZWQgJiYgd2F0Y2hJbmZvLmlzTXV0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZuID0gd2F0Y2hJbmZvLmZuO1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgICAgICAgICBjb25zdCBvdiA9IHdhdGNoSW5mby5sYXN0O1xuICAgICAgICAgICAgbGV0IG52O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG52ID0gZm4oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYGVycm9yIGluIGV4ZWN1dGluZyBleHByZXNzaW9uOiAnJHt3YXRjaEluZm8uZXhwcn0nYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghXy5pc0VxdWFsKG52LCBvdikpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2hhbmdlZEJ5V2F0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIHdhdGNoSW5mby5sYXN0ID0gbnY7XG5cbiAgICAgICAgICAgICAgICBpZiAoXy5pc09iamVjdChudikgJiYgIXdhdGNoSW5mby5kb05vdENsb25lICYmIG52Ll9fY2xvbmVhYmxlX18gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhdGNoSW5mby5sYXN0ID0gXy5jbG9uZShudik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxpc3RlbmVyKG52LCBvdik7XG4gICAgICAgICAgICAgICAgcmVzZXRDaGFuZ2VGcm9tV2F0Y2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhc3MrKztcblxuICAgIH0gd2hpbGUgKGNoYW5nZURldGVjdGVkICYmIHBhc3MgPCBsaW1pdCk7XG5cbiAgICBpZiAoY2hhbmdlRGV0ZWN0ZWQgJiYgcGFzcyA9PT0gbGltaXQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBOdW1iZXIgb2Ygd2F0Y2ggY3ljbGVzIGdvbmUgYWJvdmUgc2V0IGxpbWl0IG9mOiAke2xpbWl0fSBgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Tmdab25lID0gem9uZSA9PiBuZ1pvbmUgPSB6b25lO1xuXG5leHBvcnQgY29uc3Qgc2V0QXBwUmVmID0gcmVmID0+IHtcbiAgICBhcHBSZWYgPSByZWZcbn07XG5cbmV4cG9ydCBjb25zdCBpc0NoYW5nZUZyb21XYXRjaCA9ICgpID0+IGNoYW5nZWRCeVdhdGNoO1xuZXhwb3J0IGNvbnN0IHJlc2V0Q2hhbmdlRnJvbVdhdGNoID0gKCkgPT4gY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcblxuKDxhbnk+d2luZG93KS53YXRjaFJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG5cbmxldCBza2lwV2F0Y2hlcnM7XG5cbmxldCBzY2hlZHVsZWQgPSBmYWxzZSxcbiAgICByZXJ1blJlcXVlc3RlZCA9IGZhbHNlLFxuICAgIGlzUnVubmluZyA9IGZhbHNlLFxuICAgIGNvbnNlY3V0aXZlUmVydW5zID0gMDtcblxuY29uc3QgTUFYX1BBU1NFUyA9IDUsXG4gICAgREVCT1VOQ0VfVElNRSA9IDIwMCxcbiAgICBNQVhfQ09OU0VDVVRJVkVfUkVSVU5TID0gMztcblxuKHdpbmRvdyBhcyBhbnkpLl9fV01fREVCVUdfV0FUQ0hFUlNfXyA9IGZhbHNlO1xuXG5leHBvcnQgY29uc3QgJGludm9rZVdhdGNoZXJzID0gKFxuICAgIGZvcmNlID0gZmFsc2UsXG4gICAgaWdub3JlTXV0ZWQgPSBmYWxzZVxuKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICAgIHRyaWdnZXJXYXRjaGVycyhpZ25vcmVNdXRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZWR1bGVFeGVjdXRpb24oaWdub3JlTXV0ZWQpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRXhlY3V0aW9uKGlnbm9yZU11dGVkOiBib29sZWFuKSB7XG4gICAgaWYgKHNjaGVkdWxlZCkge1xuICAgICAgICByZXJ1blJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzY2hlZHVsZWQgPSB0cnVlO1xuXG4gICAgLy8gUmVzZXQgY29uc2VjdXRpdmUgcmVydW4gY291bnRlciB3aGVuIHNjaGVkdWxpbmcgZnJvbSBvdXRzaWRlXG4gICAgLy8gKG5vdCBmcm9tIHdpdGhpbiBleGVjdXRlV2F0Y2hlcnMgcmVydW4gbG9naWMpXG4gICAgaWYgKCFpc1J1bm5pbmcpIHtcbiAgICAgICAgY29uc2VjdXRpdmVSZXJ1bnMgPSAwO1xuICAgIH1cblxuICAgIGRlYm91bmNlZEV4ZWN1dGUoaWdub3JlTXV0ZWQpO1xufVxuXG5jb25zdCBkZWJvdW5jZWRFeGVjdXRlID0gZGVib3VuY2UoKGlnbm9yZU11dGVkOiBib29sZWFuKSA9PiB7XG4gICAgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgZXhlY3V0ZVdhdGNoZXJzKGlnbm9yZU11dGVkKTtcbn0sIERFQk9VTkNFX1RJTUUpO1xuXG5mdW5jdGlvbiBleGVjdXRlV2F0Y2hlcnMoaWdub3JlTXV0ZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoaXNSdW5uaW5nKSB7XG4gICAgICAgIHJlcnVuUmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlzUnVubmluZyA9IHRydWU7XG5cbiAgICBsZXQgYWN0dWFsbHlDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICBsZXQgcGFzcyA9IDE7XG4gICAgICAgIGxldCBjaGFuZ2VEZXRlY3RlZDogYm9vbGVhbjtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbG9nKGAtLS0tLS0tZXhlY3V0ZVdhdGNoZXJzIChydW4gIyR7Y29uc2VjdXRpdmVSZXJ1bnMgKyAxfSktLS0tLS0tLS0gYCk7XG5cbiAgICAgICAgICAgIHJlZ2lzdHJ5LmZvckVhY2god2F0Y2hJbmZvID0+IHtcbiAgICAgICAgICAgICAgICBpZih3YXRjaEluZm8uaXNNdXRlZCAmJiB3YXRjaEluZm8uaXNNdXRlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZm4gPSB3YXRjaEluZm8uZm47XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3YgPSB3YXRjaEluZm8ubGFzdDtcbiAgICAgICAgICAgICAgICBsZXQgbnY7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBudiA9IGZuKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYGVycm9yIGluIGV4ZWN1dGluZyBleHByZXNzaW9uOiAnJHt3YXRjaEluZm8uZXhwcn0nYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFfLmlzRXF1YWwobnYsIG92KSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5Q2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRCeVdhdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgd2F0Y2hJbmZvLmxhc3QgPSBudjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXy5pc09iamVjdChudikgJiYgIXdhdGNoSW5mby5kb05vdENsb25lICYmIG52Ll9fY2xvbmVhYmxlX18gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXRjaEluZm8ubGFzdCA9IF8uY2xvbmUobnYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKG52LCBvdik7XG4gICAgICAgICAgICAgICAgICAgIHJlc2V0Q2hhbmdlRnJvbVdhdGNoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHBhc3MrKztcbiAgICAgICAgfSB3aGlsZSAoY2hhbmdlRGV0ZWN0ZWQgJiYgcGFzcyA8IE1BWF9QQVNTRVMpO1xuICAgIH0pO1xuXG4gICAgaXNSdW5uaW5nID0gZmFsc2U7XG5cbiAgICAvLyBUcmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBpZiB3YXRjaGVycyBhY3R1YWxseSBjaGFuZ2VkIHZhbHVlc1xuICAgIGlmIChhY3R1YWxseUNoYW5nZWQpIHtcbiAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBsb2coYC0tLS0tLS1ET05FIChjaGFuZ2VzIGRldGVjdGVkKS0tLS0tLS0tLSBgKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKGAtLS0tLS0tRE9ORSAobm8gY2hhbmdlcyktLS0tLS0tLS0gYCk7XG4gICAgfVxuXG4gICAgLy8g8J+UpSBjb2xsYXBzZSBBTEwgbWlkLXJ1biB0cmlnZ2VycyBpbnRvIE9ORSByZXJ1blxuICAgIC8vIEJVVCBsaW1pdCBjb25zZWN1dGl2ZSByZXJ1bnMgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wc1xuICAgIGlmIChyZXJ1blJlcXVlc3RlZCkge1xuICAgICAgICByZXJ1blJlcXVlc3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChjb25zZWN1dGl2ZVJlcnVucyA8IE1BWF9DT05TRUNVVElWRV9SRVJVTlMpIHtcbiAgICAgICAgICAgIGNvbnNlY3V0aXZlUmVydW5zKys7XG4gICAgICAgICAgICBsb2coYFtXYXRjaGVyXSBTY2hlZHVsaW5nIHJlcnVuICMke2NvbnNlY3V0aXZlUmVydW5zfSAocmVxdWVzdGVkIGR1cmluZyBleGVjdXRpb24pYCk7XG4gICAgICAgICAgICBzY2hlZHVsZUV4ZWN1dGlvbihpZ25vcmVNdXRlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zZWN1dGl2ZVJlcnVucyA9IDA7XG4gICAgICAgICAgICBsb2coYFtXYXRjaGVyXSDimqDvuI8gU3RvcHBlZCBpbmZpbml0ZSBsb29wISBNYXggY29uc2VjdXRpdmUgcmVydW5zICgke01BWF9DT05TRUNVVElWRV9SRVJVTlN9KSByZWFjaGVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgd2F0Y2hlciBsaXN0ZW5lcnMgYXJlIHRyaWdnZXJpbmcgbW9yZSBjaGFuZ2UgZGV0ZWN0aW9uLmApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gcmVydW4gcmVxdWVzdGVkIC0gcmVzZXQgY291bnRlclxuICAgICAgICBjb25zZWN1dGl2ZVJlcnVucyA9IDA7XG4gICAgfVxufVxuXG5jb25zdCBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgc2tpcFdhdGNoZXJzID0gdHJ1ZTtcbiAgICBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdHJpZ2dlcldhdGNoZXJzKCkpO1xufSwgMTAwKTtcblxuLypleHBvcnQgY29uc3QgJGludm9rZVdhdGNoZXJzID0gKGZvcmNlPzogYm9vbGVhbiwgaWdub3JlTXV0ZWQ/OiBib29sZWFuKSA9PiB7XG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICAgIHRyaWdnZXJXYXRjaGVycyhpZ25vcmVNdXRlZCk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgICBpZiAoc2tpcFdhdGNoZXJzKSB7XG4gICAgICAgICAgICBza2lwV2F0Y2hlcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMoKTtcbiAgICB9XG59OyovXG5cbmV4cG9ydCBjb25zdCAkYXBwRGlnZXN0ID0gKCgpID0+IHtcbiAgICBsZXQgcXVldWVkID0gZmFsc2U7XG4gICAgcmV0dXJuIChmb3JjZT86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFhcHBSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICBxdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgJFJBRigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5cbmZ1bmN0aW9uIGxvZyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fV01fREVCVUdfV0FUQ0hFUlNfXykge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICB9XG59XG4iXX0=
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRXJFLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7QUFFeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV0RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDO0FBRTdELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLE1BQU0sQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQVksRUFBRSxPQUFlLEVBQUUsRUFBRSxFQUFFO0lBQ3hELElBQUksT0FBTyxDQUFDO0lBQ1osT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxPQUFPLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVB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QUNELElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULE9BQU87WUFDWCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDZCxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2hDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURHZW5lcmF0b3IgfSBmcm9tICcuL2lkLWdlbmVyYXRvcic7XG5cbmltcG9ydCB7ICRwYXJzZUV4cHIgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyJztcbmltcG9ydCB7IGZpbmRWYWx1ZU9mIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge2Nsb25lLCBmbGF0dGVuLCBpc0FycmF5LCBpc0VxdWFsLCBpc09iamVjdH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5jb25zdCByZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG5cbmNvbnN0IHdhdGNoSWRHZW5lcmF0b3IgPSBuZXcgSURHZW5lcmF0b3IoJ3dhdGNoLWlkLScpO1xuXG5leHBvcnQgY29uc3QgRklSU1RfVElNRV9XQVRDSCA9IHt9O1xuXG5PYmplY3QuZnJlZXplKEZJUlNUX1RJTUVfV0FUQ0gpO1xuXG5leHBvcnQgY29uc3QgaXNGaXJzdFRpbWVDaGFuZ2UgPSB2ID0+IHYgPT09IEZJUlNUX1RJTUVfV0FUQ0g7XG5cbmxldCBtdXRlZCA9IGZhbHNlO1xubGV0IGFwcFJlZjtcblxuZXhwb3J0IGNvbnN0IGRlYm91bmNlID0gKGZuOiBGdW5jdGlvbiwgd2FpdDogbnVtYmVyID0gNTApID0+IHtcbiAgICBsZXQgdGltZW91dDtcbiAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgd2luZG93WydfX3pvbmVfc3ltYm9sX19jbGVhclRpbWVvdXQnXSh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHdpbmRvd1snX196b25lX3N5bWJvbF9fc2V0VGltZW91dCddKCgpID0+IGZuKC4uLmFyZ3MpLCB3YWl0KTtcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG11dGVXYXRjaGVycyA9ICgpID0+IHtcbiAgICBtdXRlZCA9IHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdW5NdXRlV2F0Y2hlcnMgPSAoKSA9PiB7XG4gICAgbXV0ZWQgPSBmYWxzZTtcbiAgICB0cmlnZ2VyV2F0Y2hlcnMoKTtcbn07XG5cbmNvbnN0IGFycmF5Q29uc3VtZXIgPSAobGlzdGVuZXJGbiwgcmVzdEV4cHIsIG5ld1ZhbCwgb2xkVmFsKSA9PiB7XG4gICAgbGV0IGRhdGEgPSBuZXdWYWwsXG4gICAgICAgIGZvcm1hdHRlZERhdGE7XG5cbiAgICBpZiAoaXNBcnJheShkYXRhKSkge1xuICAgICAgICBmb3JtYXR0ZWREYXRhID0gZGF0YS5tYXAoZnVuY3Rpb24gKGRhdHVtKSB7XG4gICAgICAgICAgICByZXR1cm4gZmluZFZhbHVlT2YoZGF0dW0sIHJlc3RFeHByKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSWYgcmVzdWx0aW5nIHN0cnVjdHVyZSBpcyBhbiBhcnJheSBvZiBhcnJheSwgZmxhdHRlbiBpdFxuICAgICAgICBpZiAoaXNBcnJheShmb3JtYXR0ZWREYXRhWzBdKSkge1xuICAgICAgICAgICAgZm9ybWF0dGVkRGF0YSA9IGZsYXR0ZW4oZm9ybWF0dGVkRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0ZW5lckZuKGZvcm1hdHRlZERhdGEsIG9sZFZhbCk7XG4gICAgfVxufTtcblxuY29uc3QgZ2V0VXBkYXRlZFdhdGNJbmZvID0gKGV4cHIsIGFjY2VwdHNBcnJheSwgbGlzdGVuZXIpID0+IHtcbiAgICAvLyBsaXN0ZW5lciBkb2Vzbid0IGFjY2VwdCBhcnJheVxuICAgIC8vIHJlcGxhY2UgYWxsIGBbJGldYCB3aXRoIGBbMF1gIGFuZCByZXR1cm4gdGhlIGV4cHJlc3Npb25cbiAgICBsZXQgcmVnZXggPSAvXFxbXFwkaVxcXS9nLFxuICAgICAgICAkSSAgICAgICAgICAgICAgICA9ICdbJGldJyxcbiAgICAgICAgJDAgICAgICAgICAgICAgICAgPSAnWzBdJztcbiAgICBpZiAoIWFjY2VwdHNBcnJheSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ2V4cHInICAgICA6IGV4cHIucmVwbGFjZShyZWdleCwgJDApLFxuICAgICAgICAgICAgJ2xpc3RlbmVyJyA6IGxpc3RlbmVyXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gbGlzdGVuZXIgYWNjZXB0cyBhcnJheVxuICAgIC8vIHJlcGxhY2UgYWxsIGV4Y2VwdCB0aGUgbGFzdCBgWyRpXWAgd2l0aCBgWzBdYCBhbmQgcmV0dXJuIHRoZSBleHByZXNzaW9uLlxuICAgIHZhciBpbmRleCAgICAgICAgICAgPSBleHByLmxhc3RJbmRleE9mKCRJKSxcbiAgICAgICAgX2V4cHIgICAgICAgICAgID0gZXhwci5zdWJzdHIoMCwgaW5kZXgpLnJlcGxhY2UoJEksICQwKSxcbiAgICAgICAgcmVzdEV4cHIgICAgICAgID0gZXhwci5zdWJzdHIoaW5kZXggKyA1KSxcbiAgICAgICAgYXJyYXlDb25zdW1lckZuID0gbGlzdGVuZXI7XG5cbiAgICBpZiAocmVzdEV4cHIpIHtcbiAgICAgICAgYXJyYXlDb25zdW1lckZuID0gYXJyYXlDb25zdW1lci5iaW5kKHVuZGVmaW5lZCwgbGlzdGVuZXIsIHJlc3RFeHByKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAnZXhwcicgICAgIDogX2V4cHIsXG4gICAgICAgICdsaXN0ZW5lcicgOiBhcnJheUNvbnN1bWVyRm5cbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0ICR3YXRjaCA9IChleHByLCAkc2NvcGUsICRsb2NhbHMsIGxpc3RlbmVyLCBpZGVudGlmaWVyID0gd2F0Y2hJZEdlbmVyYXRvci5uZXh0VWlkKCksIGRvTm90Q2xvbmUgPSBmYWxzZSwgY29uZmlnOmFueT17fSwgaXNNdXRlZD86ICgpID0+IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoZXhwci5pbmRleE9mKCdbJGldJykgIT09IC0xKSB7XG4gICAgICAgIGxldCB3YXRjaEluZm8gPSBnZXRVcGRhdGVkV2F0Y0luZm8oZXhwciwgY29uZmlnICYmIChjb25maWcuYXJyYXlUeXBlIHx8IGNvbmZpZy5pc0xpc3QpLCBsaXN0ZW5lcik7XG4gICAgICAgIGV4cHIgPSB3YXRjaEluZm8uZXhwcjtcbiAgICAgICAgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgfVxuICAgIGNvbnN0IGZuID0gJHBhcnNlRXhwcihleHByKTtcblxuICAgIHJlZ2lzdHJ5LnNldChpZGVudGlmaWVyLCB7XG4gICAgICAgIGZuOiBmbi5iaW5kKGV4cHIsICRzY29wZSwgJGxvY2FscyksXG4gICAgICAgIGxpc3RlbmVyLFxuICAgICAgICBleHByLFxuICAgICAgICBsYXN0OiBGSVJTVF9USU1FX1dBVENILFxuICAgICAgICBkb05vdENsb25lLFxuICAgICAgICBpc011dGVkOiBpc011dGVkXG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4gJHVud2F0Y2goaWRlbnRpZmllcik7XG59O1xuXG5leHBvcnQgY29uc3QgJHVud2F0Y2ggPSBpZGVudGlmaWVyID0+IHJlZ2lzdHJ5LmRlbGV0ZShpZGVudGlmaWVyKTtcblxubGV0IGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5cbmNvbnN0ICRSQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG5sZXQgbmdab25lO1xuXG5jb25zdCB0cmlnZ2VyV2F0Y2hlcnMgPSAoaWdub3JlTXV0ZWQ/OiBib29sZWFuKSA9PiB7XG5cbiAgICBpZiAobXV0ZWQgJiYgIWlnbm9yZU11dGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaW1pdCA9IDU7XG4gICAgbGV0IHBhc3MgPSAxO1xuICAgIGxldCBjaGFuZ2VEZXRlY3RlZDtcblxuICAgIGRvIHtcbiAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmVnaXN0cnkuZm9yRWFjaCh3YXRjaEluZm8gPT4ge1xuICAgICAgICAgICAgaWYod2F0Y2hJbmZvLmlzTXV0ZWQgJiYgd2F0Y2hJbmZvLmlzTXV0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZuID0gd2F0Y2hJbmZvLmZuO1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgICAgICAgICBjb25zdCBvdiA9IHdhdGNoSW5mby5sYXN0O1xuICAgICAgICAgICAgbGV0IG52O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG52ID0gZm4oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYGVycm9yIGluIGV4ZWN1dGluZyBleHByZXNzaW9uOiAnJHt3YXRjaEluZm8uZXhwcn0nYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXNFcXVhbChudiwgb3YpKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNoYW5nZWRCeVdhdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3YXRjaEluZm8ubGFzdCA9IG52O1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChudikgJiYgIXdhdGNoSW5mby5kb05vdENsb25lICYmIG52Ll9fY2xvbmVhYmxlX18gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhdGNoSW5mby5sYXN0ID0gY2xvbmUobnYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaXN0ZW5lcihudiwgb3YpO1xuICAgICAgICAgICAgICAgIHJlc2V0Q2hhbmdlRnJvbVdhdGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBwYXNzKys7XG5cbiAgICB9IHdoaWxlIChjaGFuZ2VEZXRlY3RlZCAmJiBwYXNzIDwgbGltaXQpO1xuXG4gICAgaWYgKGNoYW5nZURldGVjdGVkICYmIHBhc3MgPT09IGxpbWl0KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgTnVtYmVyIG9mIHdhdGNoIGN5Y2xlcyBnb25lIGFib3ZlIHNldCBsaW1pdCBvZjogJHtsaW1pdH0gYCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldE5nWm9uZSA9IHpvbmUgPT4gbmdab25lID0gem9uZTtcblxuZXhwb3J0IGNvbnN0IHNldEFwcFJlZiA9IHJlZiA9PiB7XG4gICAgYXBwUmVmID0gcmVmXG59O1xuXG5leHBvcnQgY29uc3QgaXNDaGFuZ2VGcm9tV2F0Y2ggPSAoKSA9PiBjaGFuZ2VkQnlXYXRjaDtcbmV4cG9ydCBjb25zdCByZXNldENoYW5nZUZyb21XYXRjaCA9ICgpID0+IGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5cbig8YW55PndpbmRvdykud2F0Y2hSZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuXG5sZXQgc2tpcFdhdGNoZXJzO1xuXG5jb25zdCBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgc2tpcFdhdGNoZXJzID0gdHJ1ZTtcbiAgICBuZ1pvbmUucnVuKCgpID0+IHRyaWdnZXJXYXRjaGVycygpKTtcbn0sIDEwMCk7XG5cbmV4cG9ydCBjb25zdCAkaW52b2tlV2F0Y2hlcnMgPSAoZm9yY2U/OiBib29sZWFuLCBpZ25vcmVNdXRlZD86IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgdHJpZ2dlcldhdGNoZXJzKGlnbm9yZU11dGVkKTtcbiAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmIChza2lwV2F0Y2hlcnMpIHtcbiAgICAgICAgICAgIHNraXBXYXRjaGVycyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlYm91bmNlZFRyaWdnZXJXYXRjaGVycygpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCAkYXBwRGlnZXN0ID0gKCgpID0+IHtcbiAgICBsZXQgcXVldWVkID0gZmFsc2U7XG4gICAgcmV0dXJuIChmb3JjZT86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFhcHBSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICBxdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgJFJBRigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import { Attribute, ImplicitReceiver, PropertyRead, LiteralPrimitive, LiteralArray, LiteralMap, PropertyWrite, KeyedRead, PrefixNot, Unary, Binary, Conditional, Call, Chain, BindingPipe, Parser, Lexer } from '@angular/compiler';
2
- import { isArray, startsWith, includes, get, camelCase, split, map, attempt, isError, isFunction, isDate, isString, cloneDeep, identity, intersection, omit, isEqual, keys, toLower, replace as replace$1, forEach, trim, isEqualWith, every, indexOf, isNumber, filter, isUndefined, isNull, noop as noop$2, toUpper, assign, clone, isObject as isObject$1, merge, isEmpty, debounce as debounce$1, isNil } from 'lodash-es';
2
+ import { isArray, startsWith, includes, get, flatten, isEqual, isObject as isObject$1, clone, camelCase, split, map, attempt, isError, isFunction, isDate, isString, cloneDeep, identity, intersection, omit, keys, toLower, replace as replace$1, forEach, trim, isEqualWith, every, indexOf, isNumber, filter, isUndefined, isNull, noop as noop$2, toUpper, assign, merge, isEmpty, debounce as debounce$1, isNil } from 'lodash-es';
3
3
  import { Subject } from 'rxjs';
4
4
  import X2JS from 'x2js';
5
5
  import * as momentLib from 'moment-timezone/moment-timezone';
@@ -2192,17 +2192,17 @@ const muteWatchers = () => {
2192
2192
  };
2193
2193
  const unMuteWatchers = () => {
2194
2194
  muted = false;
2195
- $invokeWatchers(true);
2195
+ triggerWatchers();
2196
2196
  };
2197
2197
  const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
2198
2198
  let data = newVal, formattedData;
2199
- if (_.isArray(data)) {
2199
+ if (isArray(data)) {
2200
2200
  formattedData = data.map(function (datum) {
2201
2201
  return findValueOf(datum, restExpr);
2202
2202
  });
2203
2203
  // If resulting structure is an array of array, flatten it
2204
- if (_.isArray(formattedData[0])) {
2205
- formattedData = _.flatten(formattedData);
2204
+ if (isArray(formattedData[0])) {
2205
+ formattedData = flatten(formattedData);
2206
2206
  }
2207
2207
  listenerFn(formattedData, oldVal);
2208
2208
  }
@@ -2253,7 +2253,6 @@ const triggerWatchers = (ignoreMuted) => {
2253
2253
  if (muted && !ignoreMuted) {
2254
2254
  return;
2255
2255
  }
2256
- log(".......................triggerWatchers.................................");
2257
2256
  const limit = 5;
2258
2257
  let pass = 1;
2259
2258
  let changeDetected;
@@ -2273,12 +2272,13 @@ const triggerWatchers = (ignoreMuted) => {
2273
2272
  catch (e) {
2274
2273
  console.warn(`error in executing expression: '${watchInfo.expr}'`);
2275
2274
  }
2276
- if (!_.isEqual(nv, ov)) {
2275
+ if (!isEqual(nv, ov)) {
2277
2276
  changeDetected = true;
2278
2277
  changedByWatch = true;
2279
2278
  watchInfo.last = nv;
2280
- if (_.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
2281
- watchInfo.last = _.clone(nv);
2279
+ // @ts-ignore
2280
+ if (isObject$1(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
2281
+ watchInfo.last = clone(nv);
2282
2282
  }
2283
2283
  listener(nv, ov);
2284
2284
  resetChangeFromWatch();
@@ -2298,121 +2298,22 @@ const isChangeFromWatch = () => changedByWatch;
2298
2298
  const resetChangeFromWatch = () => changedByWatch = false;
2299
2299
  window.watchRegistry = registry;
2300
2300
  let skipWatchers;
2301
- let scheduled = false, rerunRequested = false, isRunning = false, consecutiveReruns = 0;
2302
- const MAX_PASSES = 5, DEBOUNCE_TIME = 200, MAX_CONSECUTIVE_RERUNS = 3;
2303
- window.__WM_DEBUG_WATCHERS__ = false;
2304
- const $invokeWatchers = (force = false, ignoreMuted = false) => {
2305
- if (force) {
2306
- triggerWatchers(ignoreMuted);
2307
- }
2308
- else {
2309
- scheduleExecution(ignoreMuted);
2310
- }
2311
- };
2312
- function scheduleExecution(ignoreMuted) {
2313
- if (scheduled) {
2314
- rerunRequested = true;
2315
- return;
2316
- }
2317
- scheduled = true;
2318
- // Reset consecutive rerun counter when scheduling from outside
2319
- // (not from within executeWatchers rerun logic)
2320
- if (!isRunning) {
2321
- consecutiveReruns = 0;
2322
- }
2323
- debouncedExecute(ignoreMuted);
2324
- }
2325
- const debouncedExecute = debounce((ignoreMuted) => {
2326
- scheduled = false;
2327
- executeWatchers(ignoreMuted);
2328
- }, DEBOUNCE_TIME);
2329
- function executeWatchers(ignoreMuted) {
2330
- if (isRunning) {
2331
- rerunRequested = true;
2332
- return;
2333
- }
2334
- isRunning = true;
2335
- let actuallyChanged = false;
2336
- ngZone.runOutsideAngular(() => {
2337
- let pass = 1;
2338
- let changeDetected;
2339
- do {
2340
- changeDetected = false;
2341
- log(`-------executeWatchers (run #${consecutiveReruns + 1})--------- `);
2342
- registry.forEach(watchInfo => {
2343
- if (watchInfo.isMuted && watchInfo.isMuted()) {
2344
- return;
2345
- }
2346
- const fn = watchInfo.fn;
2347
- const listener = watchInfo.listener;
2348
- const ov = watchInfo.last;
2349
- let nv;
2350
- try {
2351
- nv = fn();
2352
- }
2353
- catch (e) {
2354
- console.warn(`error in executing expression: '${watchInfo.expr}'`);
2355
- }
2356
- if (!_.isEqual(nv, ov)) {
2357
- changeDetected = true;
2358
- actuallyChanged = true;
2359
- changedByWatch = true;
2360
- watchInfo.last = nv;
2361
- if (_.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
2362
- watchInfo.last = _.clone(nv);
2363
- }
2364
- listener(nv, ov);
2365
- resetChangeFromWatch();
2366
- }
2367
- });
2368
- pass++;
2369
- } while (changeDetected && pass < MAX_PASSES);
2370
- });
2371
- isRunning = false;
2372
- // Trigger Angular change detection if watchers actually changed values
2373
- if (actuallyChanged) {
2374
- ngZone.run(() => {
2375
- log(`-------DONE (changes detected)--------- `);
2376
- });
2377
- }
2378
- else {
2379
- log(`-------DONE (no changes)--------- `);
2380
- }
2381
- // 🔥 collapse ALL mid-run triggers into ONE rerun
2382
- // BUT limit consecutive reruns to prevent infinite loops
2383
- if (rerunRequested) {
2384
- rerunRequested = false;
2385
- if (consecutiveReruns < MAX_CONSECUTIVE_RERUNS) {
2386
- consecutiveReruns++;
2387
- log(`[Watcher] Scheduling rerun #${consecutiveReruns} (requested during execution)`);
2388
- scheduleExecution(ignoreMuted);
2389
- }
2390
- else {
2391
- consecutiveReruns = 0;
2392
- log(`[Watcher] ⚠️ Stopped infinite loop! Max consecutive reruns (${MAX_CONSECUTIVE_RERUNS}) reached. This usually means watcher listeners are triggering more change detection.`);
2393
- }
2394
- }
2395
- else {
2396
- // No rerun requested - reset counter
2397
- consecutiveReruns = 0;
2398
- }
2399
- }
2400
2301
  const debouncedTriggerWatchers = debounce(() => {
2401
2302
  skipWatchers = true;
2402
- ngZone.runOutsideAngular(() => triggerWatchers());
2303
+ ngZone.run(() => triggerWatchers());
2403
2304
  }, 100);
2404
- /*export const $invokeWatchers = (force?: boolean, ignoreMuted?: boolean) => {
2305
+ const $invokeWatchers = (force, ignoreMuted) => {
2405
2306
  if (force) {
2406
2307
  triggerWatchers(ignoreMuted);
2407
- } else {
2408
-
2308
+ }
2309
+ else {
2409
2310
  if (skipWatchers) {
2410
2311
  skipWatchers = false;
2411
2312
  return;
2412
2313
  }
2413
2314
  debouncedTriggerWatchers();
2414
2315
  }
2415
- };*/
2316
+ };
2416
2317
  const $appDigest = (() => {
2417
2318
  let queued = false;
2418
2319
  return (force) => {
@@ -2437,11 +2338,6 @@ const $appDigest = (() => {
2437
2338
  }
2438
2339
  };
2439
2340
  })();
2440
- function log(message) {
2441
- if (window.__WM_DEBUG_WATCHERS__) {
2442
- console.log(message);
2443
- }
2444
- }
2445
2341
 
2446
2342
  var ComponentType;
2447
2343
  (function (ComponentType) {
@@ -2544,7 +2440,6 @@ const REGEX = {
2544
2440
  MIN_PAGE_RESOURCE_PATH: /.*(page.min.html)$/,
2545
2441
  VALID_EMAIL: /^[a-zA-Z][\w.+]+@[a-zA-Z_]+?\.[a-zA-Z.]{1,4}[a-zA-Z]$/,
2546
2442
  VALID_WEB_URL: /^(http[s]?:\/\/)(www\.){0,1}[a-zA-Z0-9=:?\/\.\-]+(\.[a-zA-Z]{2,5}[\.]{0,1})?/,
2547
- VALID_IMAGE_URL: /^(https?|blob|data|file|ftp):/i,
2548
2443
  VALID_WEBSOCKET_URL: /^(ws[s]?:\/\/)(www\.){0,1}[a-zA-Z0-9=:?\/\.\-]+(\.[a-zA-Z]{2,5}[\.]{0,1})?/,
2549
2444
  VALID_RELATIVE_URL: /^(?!www\.|(?:http|ftp)s?:\/\/|[A-Za-z]:\\|\/\/).*/,
2550
2445
  REPLACE_PATTERN: /\$\{([^\}]+)\}/g,
@@ -2778,9 +2673,6 @@ const isVideoFile = (fileName) => {
2778
2673
  const isValidWebURL = (url) => {
2779
2674
  return (REGEX.VALID_WEB_URL).test(url);
2780
2675
  };
2781
- const isValidImageUrl = (url) => {
2782
- return (REGEX.VALID_IMAGE_URL).test(url?.trim());
2783
- };
2784
2676
  /*This function returns the url to the resource after checking the validity of url*/
2785
2677
  const getResourceURL = (urlString) => {
2786
2678
  if (isValidWebURL(urlString)) {
@@ -4046,7 +3938,6 @@ var Utils = /*#__PURE__*/Object.freeze({
4046
3938
  isPageable: isPageable,
4047
3939
  isSafari: isSafari,
4048
3940
  isTablet: isTablet,
4049
- isValidImageUrl: isValidImageUrl,
4050
3941
  isValidWebURL: isValidWebURL,
4051
3942
  isVideoFile: isVideoFile,
4052
3943
  loadScript: loadScript,
@@ -5286,5 +5177,5 @@ class LRUCache {
5286
5177
  * Generated bundle index. Do not edit.
5287
5178
  */
5288
5179
 
5289
- export { $appDigest, $invokeWatchers, $parseEvent, $parseExpr, $unwatch, $watch, AbstractDialogService, AbstractHttpService, AbstractI18nService, AbstractNavigationService, AbstractSpinnerService, AbstractToasterService, App, AppConstants, AppDefaults, CURRENCY_INFO, ComponentType, ConstantService, CustomIconsLoaderService, CustomPipeManager, CustomWidgetRefProvider, DEFAULT_FORMATS, DataSource, DataType, DynamicComponentRefProvider, EventNotifier, FIRST_TIME_WATCH, FieldTypeService, FieldWidgetService, FormWidgetType, IDGenerator, IDataSource, LRUCache, MatchMode, PaginationService, PartialRefProvider, ScriptLoaderService, ScriptStore, StatePersistence, UserDefinedExecutionContext, UtilsService, VALIDATOR, Viewport, _WM_APP_PROJECT, addClass, addEventListenerOnElement, addForIdAttributes, adjustContainerPosition, adjustContainerRightEdges, appendNode, appendScriptToHead, checkIsCustomPipeExpression, closePopover, convertToBlob, createCSSRule, createElement, deHyphenate, debounce, defer, detectChanges, encodeUrl, encodeUrlParams, executePromiseChain, extendProto, extractCurrentItemExpr, extractType, fetchContent, findParent, findRootContainer, findValueOf, generateGUId, getAbortableDefer, getAndroidVersion, getAppSetting, getBlob, getClonedObject, getDatasourceFromExpr, getDateObj, getDisplayDateTimeFormat, getEvaluatedExprValue, getFiles, getFnByExpr, getFnForBindExpr, getFnForEventExpr, getFormWidgetTemplate, getFormattedDate, getMomentLocaleObject, getNativeDateObject, getNavClass, getNgModelAttr, getPreviewProperties, getRequiredFormWidget, getResourceURL, getRouteNameFromLink, getRowActionAttrs, getSessionStorageItem, getSheetPositionClass, getUrlParams, getValidDateObject, getValidJSON, getWebkitTraslationMatrix, getWmProjectProperties, hasOffsetStr, initCaps, insertAfter, insertBefore, isAndroid, isAndroidTablet, isAppleProduct, isAudioFile, isChangeFromWatch, isDataSourceEqual, isDateTimeType, isDefined, isElementInViewport, isEmptyObject, isEqualWithFields, isFirstTimeChange, isIE, isImageFile, isInsecureContentRequest, isIos, isIpad, isIphone, isIpod, isKitkatDevice, isLargeTabletLandscape, isLargeTabletPortrait, isMobile, isNumberType, isObject, isPageable, isSafari, isValidImageUrl, isValidWebURL, isVideoFile, loadScript, loadScripts, loadStyleSheet, loadStyleSheets, muteWatchers, noop, openLink, periodSeparate, prettifyLabel, prettifyLabels, processFilterExpBindNode, registerFnByExpr, removeAttr, removeClass, removeExtraSlashes, removeNode, replace, replaceAt, resetChangeFromWatch, retryIfFails, scrollToElement, setAppRef, setAttr, setCSS, setCSSFromObj, setHtml, setListClass, setNgZone, setPipeProvider, setPreviewProperties, setProperty, setSessionStorageItem, setTranslation3dPosition, setWmProjectProperties, spaceSeparate, stringStartsWith, switchClass, toBoolean, toDimension, toPromise, toggleClass, transformFileURI, triggerFn, triggerItemAction, unMuteWatchers, updateTemplateAttrs, validateAccessRoles, validateDataSourceCtx, xmlToJson };
5180
+ export { $appDigest, $invokeWatchers, $parseEvent, $parseExpr, $unwatch, $watch, AbstractDialogService, AbstractHttpService, AbstractI18nService, AbstractNavigationService, AbstractSpinnerService, AbstractToasterService, App, AppConstants, AppDefaults, CURRENCY_INFO, ComponentType, ConstantService, CustomIconsLoaderService, CustomPipeManager, CustomWidgetRefProvider, DEFAULT_FORMATS, DataSource, DataType, DynamicComponentRefProvider, EventNotifier, FIRST_TIME_WATCH, FieldTypeService, FieldWidgetService, FormWidgetType, IDGenerator, IDataSource, LRUCache, MatchMode, PaginationService, PartialRefProvider, ScriptLoaderService, ScriptStore, StatePersistence, UserDefinedExecutionContext, UtilsService, VALIDATOR, Viewport, _WM_APP_PROJECT, addClass, addEventListenerOnElement, addForIdAttributes, adjustContainerPosition, adjustContainerRightEdges, appendNode, appendScriptToHead, checkIsCustomPipeExpression, closePopover, convertToBlob, createCSSRule, createElement, deHyphenate, debounce, defer, detectChanges, encodeUrl, encodeUrlParams, executePromiseChain, extendProto, extractCurrentItemExpr, extractType, fetchContent, findParent, findRootContainer, findValueOf, generateGUId, getAbortableDefer, getAndroidVersion, getAppSetting, getBlob, getClonedObject, getDatasourceFromExpr, getDateObj, getDisplayDateTimeFormat, getEvaluatedExprValue, getFiles, getFnByExpr, getFnForBindExpr, getFnForEventExpr, getFormWidgetTemplate, getFormattedDate, getMomentLocaleObject, getNativeDateObject, getNavClass, getNgModelAttr, getPreviewProperties, getRequiredFormWidget, getResourceURL, getRouteNameFromLink, getRowActionAttrs, getSessionStorageItem, getSheetPositionClass, getUrlParams, getValidDateObject, getValidJSON, getWebkitTraslationMatrix, getWmProjectProperties, hasOffsetStr, initCaps, insertAfter, insertBefore, isAndroid, isAndroidTablet, isAppleProduct, isAudioFile, isChangeFromWatch, isDataSourceEqual, isDateTimeType, isDefined, isElementInViewport, isEmptyObject, isEqualWithFields, isFirstTimeChange, isIE, isImageFile, isInsecureContentRequest, isIos, isIpad, isIphone, isIpod, isKitkatDevice, isLargeTabletLandscape, isLargeTabletPortrait, isMobile, isNumberType, isObject, isPageable, isSafari, isValidWebURL, isVideoFile, loadScript, loadScripts, loadStyleSheet, loadStyleSheets, muteWatchers, noop, openLink, periodSeparate, prettifyLabel, prettifyLabels, processFilterExpBindNode, registerFnByExpr, removeAttr, removeClass, removeExtraSlashes, removeNode, replace, replaceAt, resetChangeFromWatch, retryIfFails, scrollToElement, setAppRef, setAttr, setCSS, setCSSFromObj, setHtml, setListClass, setNgZone, setPipeProvider, setPreviewProperties, setProperty, setSessionStorageItem, setTranslation3dPosition, setWmProjectProperties, spaceSeparate, stringStartsWith, switchClass, toBoolean, toDimension, toPromise, toggleClass, transformFileURI, triggerFn, triggerItemAction, unMuteWatchers, updateTemplateAttrs, validateAccessRoles, validateDataSourceCtx, xmlToJson };
5290
5181
  //# sourceMappingURL=index.mjs.map