@wavemaker/app-ng-runtime 11.14.1-3.6306 → 11.14.1-8.6337

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 (31) hide show
  1. package/components/base/bundles/index.umd.js +7 -8
  2. package/components/base/esm2022/pipes/custom-pipes.mjs +1 -1
  3. package/components/base/esm2022/widgets/common/base/base.component.mjs +8 -9
  4. package/components/base/fesm2022/index.mjs +7 -8
  5. package/components/base/fesm2022/index.mjs.map +1 -1
  6. package/components/data/pagination/bundles/index.umd.js +4 -0
  7. package/components/data/pagination/esm2022/pagination.component.mjs +5 -1
  8. package/components/data/pagination/fesm2022/index.mjs +4 -0
  9. package/components/data/pagination/fesm2022/index.mjs.map +1 -1
  10. package/components/data/table/bundles/index.umd.js +8 -2
  11. package/components/data/table/esm2022/table-cud.directive.mjs +2 -2
  12. package/components/data/table/esm2022/table-filter.directive.mjs +8 -2
  13. package/components/data/table/fesm2022/index.mjs +8 -2
  14. package/components/data/table/fesm2022/index.mjs.map +1 -1
  15. package/core/bundles/index.umd.js +76 -7
  16. package/core/esm2022/utils/watcher.mjs +77 -8
  17. package/core/fesm2022/index.mjs +76 -7
  18. package/core/fesm2022/index.mjs.map +1 -1
  19. package/core/utils/watcher.d.ts +2 -0
  20. package/npm-shrinkwrap.json +2 -2
  21. package/package-lock.json +2 -2
  22. package/package.json +1 -1
  23. package/runtime/base/bundles/index.umd.js +5 -20
  24. package/runtime/base/esm2022/components/app-component/app.component.mjs +2 -5
  25. package/runtime/base/esm2022/components/base-page.component.mjs +2 -5
  26. package/runtime/base/esm2022/components/base-partial.component.mjs +2 -5
  27. package/runtime/base/esm2022/components/base-prefab.component.mjs +2 -5
  28. package/runtime/base/esm2022/components/base-spa-page.component.mjs +2 -5
  29. package/runtime/base/fesm2022/index.mjs +5 -20
  30. package/runtime/base/fesm2022/index.mjs.map +1 -1
  31. package/scripts/datatable/datatable.js +15 -0
@@ -2207,6 +2207,70 @@
2207
2207
  let skipWatchers = false;
2208
2208
  let ngZone;
2209
2209
  let appRef;
2210
+ /********************************************************************
2211
+ * CLEANUP SCHEDULER WITH:
2212
+ * - Significant watcher delta trigger (+/-)
2213
+ * - UI stabilization delay (1–2 seconds)
2214
+ * - Cooldown to prevent repeated scheduling
2215
+ ********************************************************************/
2216
+ const CLEANUP_TRIGGER_DELTA = 300; // watcher change threshold
2217
+ const CLEANUP_DELAY = 1500; // delay before running cleanup
2218
+ const CLEANUP_COOLDOWN = 4000; // prevent re-scheduling for 4s
2219
+ let lastWatcherCount = 0;
2220
+ let scheduledCleanup = null;
2221
+ let lastScheduledTime = 0;
2222
+ function getWatcherCount() {
2223
+ let count = 0;
2224
+ registry.forEach(bucket => count += bucket.size);
2225
+ return count;
2226
+ }
2227
+ const cleanupStaleWatchers = () => {
2228
+ // console.log(".........Cleaning up stale watchers...registry.size....", registry.size);
2229
+ let removed = 0;
2230
+ registry.forEach((bucket, widgetId) => {
2231
+ if (!document.querySelector(`[widget-id="${widgetId}"]`)) {
2232
+ for (const key in bucket) {
2233
+ if (bucket.hasOwnProperty(key) && key !== "scopeType" && key !== "scopeName" && typeof bucket[key] !== "function") {
2234
+ let watchInfo = bucket[key];
2235
+ if (watchInfo && watchInfo.destroyFn) {
2236
+ watchInfo.destroyFn();
2237
+ }
2238
+ }
2239
+ }
2240
+ removed++;
2241
+ registry.delete(widgetId);
2242
+ return;
2243
+ }
2244
+ });
2245
+ return removed;
2246
+ };
2247
+ const scheduleThresholdCleanup = () => {
2248
+ const now = performance.now();
2249
+ let lastTriggerPeriod = now - lastScheduledTime;
2250
+ // If a cleanup was scheduled recently, skip scheduling
2251
+ if (lastTriggerPeriod < CLEANUP_COOLDOWN) {
2252
+ return;
2253
+ }
2254
+ const current = getWatcherCount();
2255
+ const delta = Math.abs(current - lastWatcherCount); // significant + or -
2256
+ // If change not large enough, skip scheduling
2257
+ if (delta <= CLEANUP_TRIGGER_DELTA) {
2258
+ lastWatcherCount = current;
2259
+ return;
2260
+ }
2261
+ // Prevent re-scheduling: set timestamp early
2262
+ lastScheduledTime = now;
2263
+ // Clear previous scheduled cleanup (if any)
2264
+ if (scheduledCleanup) {
2265
+ clearTimeout(scheduledCleanup);
2266
+ }
2267
+ // Schedule cleanup after UI stabilizes (delay prevents aggressive cleanup)
2268
+ scheduledCleanup = setTimeout(() => {
2269
+ cleanupStaleWatchers();
2270
+ scheduledCleanup = null;
2271
+ }, CLEANUP_DELAY);
2272
+ lastWatcherCount = current;
2273
+ };
2210
2274
  // Utility functions
2211
2275
  const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
2212
2276
  const debounce = (fn, wait = DEBOUNCE_WAIT) => {
@@ -2270,7 +2334,7 @@
2270
2334
  }
2271
2335
  const lastIndex = expr.lastIndexOf(ARRAY_INDEX_PLACEHOLDER);
2272
2336
  const baseExpr = expr.substring(0, lastIndex).replace(ARRAY_INDEX_PLACEHOLDER, ARRAY_INDEX_ZERO);
2273
- const restExpr = expr.substring(lastIndex + ARRAY_INDEX_PLACEHOLDER.length);
2337
+ const restExpr = expr.substring(lastIndex + 5);
2274
2338
  const arrayConsumerFn = restExpr
2275
2339
  ? arrayConsumer.bind(undefined, listener, restExpr)
2276
2340
  : listener;
@@ -2293,9 +2357,9 @@
2293
2357
  }
2294
2358
  const trimmedExpr = expr.trim();
2295
2359
  // Expressions that always evaluate to localization strings
2296
- if (trimmedExpr.includes('appLocale')) {
2297
- return true;
2298
- }
2360
+ // if (trimmedExpr.includes('appLocale')) {
2361
+ // return true;
2362
+ // }
2299
2363
  // Hard-coded static expression names
2300
2364
  if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
2301
2365
  return true;
@@ -2368,6 +2432,7 @@
2368
2432
  const fn = $parseExpr(expr);
2369
2433
  const scopeType = getScopeType($scope);
2370
2434
  const scopeName = getScopeName($scope, scopeType);
2435
+ const destroyFn = () => $unwatch(identifier);
2371
2436
  const watchInfo = {
2372
2437
  fn: fn.bind(null, $scope, $locals),
2373
2438
  listener,
@@ -2376,7 +2441,8 @@
2376
2441
  doNotClone,
2377
2442
  isMuted,
2378
2443
  scopeType,
2379
- scopeName
2444
+ scopeName,
2445
+ destroyFn
2380
2446
  };
2381
2447
  // Store in registry
2382
2448
  const widgetId = getWidgetId(identifier);
@@ -2391,7 +2457,7 @@
2391
2457
  else {
2392
2458
  registry.set(identifier, watchInfo);
2393
2459
  }
2394
- return () => $unwatch(identifier);
2460
+ return destroyFn;
2395
2461
  };
2396
2462
  /**
2397
2463
  * Unwatches a single identifier
@@ -2401,6 +2467,7 @@
2401
2467
  if (widgetId) {
2402
2468
  const propertyName = getPropertyName(identifier);
2403
2469
  const widgetGroup = registry.get(widgetId);
2470
+ //@ts-ignore
2404
2471
  if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
2405
2472
  const watchInfo = widgetGroup[propertyName];
2406
2473
  if (watchInfo) {
@@ -2541,6 +2608,8 @@
2541
2608
  });
2542
2609
  pass++;
2543
2610
  } while (changeDetected && pass < MAX_WATCH_CYCLES);
2611
+ // Schedule cleanup after watchers are triggered
2612
+ scheduleThresholdCleanup();
2544
2613
  if (changeDetected && pass === MAX_WATCH_CYCLES) {
2545
2614
  console.warn(`Watch cycles exceeded limit of ${MAX_WATCH_CYCLES}`);
2546
2615
  }
@@ -2597,7 +2666,7 @@
2597
2666
  };
2598
2667
  })();
2599
2668
  // Export registry for debugging
2600
- // (window as any).watchRegistry = registry;
2669
+ window.watchRegistry = registry;
2601
2670
 
2602
2671
  exports.ComponentType = void 0;
2603
2672
  (function (ComponentType) {
@@ -18,6 +18,70 @@ let changedByWatch = false;
18
18
  let skipWatchers = false;
19
19
  let ngZone;
20
20
  let appRef;
21
+ /********************************************************************
22
+ * CLEANUP SCHEDULER WITH:
23
+ * - Significant watcher delta trigger (+/-)
24
+ * - UI stabilization delay (1–2 seconds)
25
+ * - Cooldown to prevent repeated scheduling
26
+ ********************************************************************/
27
+ const CLEANUP_TRIGGER_DELTA = 300; // watcher change threshold
28
+ const CLEANUP_DELAY = 1500; // delay before running cleanup
29
+ const CLEANUP_COOLDOWN = 4000; // prevent re-scheduling for 4s
30
+ let lastWatcherCount = 0;
31
+ let scheduledCleanup = null;
32
+ let lastScheduledTime = 0;
33
+ function getWatcherCount() {
34
+ let count = 0;
35
+ registry.forEach(bucket => count += bucket.size);
36
+ return count;
37
+ }
38
+ export const cleanupStaleWatchers = () => {
39
+ // console.log(".........Cleaning up stale watchers...registry.size....", registry.size);
40
+ let removed = 0;
41
+ registry.forEach((bucket, widgetId) => {
42
+ if (!document.querySelector(`[widget-id="${widgetId}"]`)) {
43
+ for (const key in bucket) {
44
+ if (bucket.hasOwnProperty(key) && key !== "scopeType" && key !== "scopeName" && typeof bucket[key] !== "function") {
45
+ let watchInfo = bucket[key];
46
+ if (watchInfo && watchInfo.destroyFn) {
47
+ watchInfo.destroyFn();
48
+ }
49
+ }
50
+ }
51
+ removed++;
52
+ registry.delete(widgetId);
53
+ return;
54
+ }
55
+ });
56
+ return removed;
57
+ };
58
+ export const scheduleThresholdCleanup = () => {
59
+ const now = performance.now();
60
+ let lastTriggerPeriod = now - lastScheduledTime;
61
+ // If a cleanup was scheduled recently, skip scheduling
62
+ if (lastTriggerPeriod < CLEANUP_COOLDOWN) {
63
+ return;
64
+ }
65
+ const current = getWatcherCount();
66
+ const delta = Math.abs(current - lastWatcherCount); // significant + or -
67
+ // If change not large enough, skip scheduling
68
+ if (delta <= CLEANUP_TRIGGER_DELTA) {
69
+ lastWatcherCount = current;
70
+ return;
71
+ }
72
+ // Prevent re-scheduling: set timestamp early
73
+ lastScheduledTime = now;
74
+ // Clear previous scheduled cleanup (if any)
75
+ if (scheduledCleanup) {
76
+ clearTimeout(scheduledCleanup);
77
+ }
78
+ // Schedule cleanup after UI stabilizes (delay prevents aggressive cleanup)
79
+ scheduledCleanup = setTimeout(() => {
80
+ cleanupStaleWatchers();
81
+ scheduledCleanup = null;
82
+ }, CLEANUP_DELAY);
83
+ lastWatcherCount = current;
84
+ };
21
85
  // Utility functions
22
86
  export const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
23
87
  export const debounce = (fn, wait = DEBOUNCE_WAIT) => {
@@ -81,7 +145,7 @@ const getUpdatedWatchInfo = (expr, acceptsArray, listener) => {
81
145
  }
82
146
  const lastIndex = expr.lastIndexOf(ARRAY_INDEX_PLACEHOLDER);
83
147
  const baseExpr = expr.substring(0, lastIndex).replace(ARRAY_INDEX_PLACEHOLDER, ARRAY_INDEX_ZERO);
84
- const restExpr = expr.substring(lastIndex + ARRAY_INDEX_PLACEHOLDER.length);
148
+ const restExpr = expr.substring(lastIndex + 5);
85
149
  const arrayConsumerFn = restExpr
86
150
  ? arrayConsumer.bind(undefined, listener, restExpr)
87
151
  : listener;
@@ -104,9 +168,9 @@ const isStaticExpression = (expr) => {
104
168
  }
105
169
  const trimmedExpr = expr.trim();
106
170
  // Expressions that always evaluate to localization strings
107
- if (trimmedExpr.includes('appLocale')) {
108
- return true;
109
- }
171
+ // if (trimmedExpr.includes('appLocale')) {
172
+ // return true;
173
+ // }
110
174
  // Hard-coded static expression names
111
175
  if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
112
176
  return true;
@@ -179,6 +243,7 @@ export const $watch = (expr, $scope, $locals, listener, identifier = watchIdGene
179
243
  const fn = $parseExpr(expr);
180
244
  const scopeType = getScopeType($scope);
181
245
  const scopeName = getScopeName($scope, scopeType);
246
+ const destroyFn = () => $unwatch(identifier);
182
247
  const watchInfo = {
183
248
  fn: fn.bind(null, $scope, $locals),
184
249
  listener,
@@ -187,7 +252,8 @@ export const $watch = (expr, $scope, $locals, listener, identifier = watchIdGene
187
252
  doNotClone,
188
253
  isMuted,
189
254
  scopeType,
190
- scopeName
255
+ scopeName,
256
+ destroyFn
191
257
  };
192
258
  // Store in registry
193
259
  const widgetId = getWidgetId(identifier);
@@ -202,7 +268,7 @@ export const $watch = (expr, $scope, $locals, listener, identifier = watchIdGene
202
268
  else {
203
269
  registry.set(identifier, watchInfo);
204
270
  }
205
- return () => $unwatch(identifier);
271
+ return destroyFn;
206
272
  };
207
273
  /**
208
274
  * Unwatches a single identifier
@@ -212,6 +278,7 @@ export const $unwatch = (identifier) => {
212
278
  if (widgetId) {
213
279
  const propertyName = getPropertyName(identifier);
214
280
  const widgetGroup = registry.get(widgetId);
281
+ //@ts-ignore
215
282
  if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
216
283
  const watchInfo = widgetGroup[propertyName];
217
284
  if (watchInfo) {
@@ -352,6 +419,8 @@ const triggerWatchers = (ignoreMuted = false) => {
352
419
  });
353
420
  pass++;
354
421
  } while (changeDetected && pass < MAX_WATCH_CYCLES);
422
+ // Schedule cleanup after watchers are triggered
423
+ scheduleThresholdCleanup();
355
424
  if (changeDetected && pass === MAX_WATCH_CYCLES) {
356
425
  console.warn(`Watch cycles exceeded limit of ${MAX_WATCH_CYCLES}`);
357
426
  }
@@ -408,5 +477,5 @@ export const $appDigest = (() => {
408
477
  };
409
478
  })();
410
479
  // Export registry for debugging
411
- // (window as any).watchRegistry = registry;
412
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXZFLFlBQVk7QUFDWixNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztBQUMxQyxNQUFNLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0FBQ3BELE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUUzQixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQXFCbEQsUUFBUTtBQUNSLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFDM0IsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLElBQUksTUFBVyxDQUFDO0FBQ2hCLElBQUksTUFBVyxDQUFDO0FBRWhCLG9CQUFvQjtBQUNwQixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FB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RyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDaEMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsT0FBTztZQUNYLENBQUM7WUFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFFTCxnQ0FBZ0M7QUFDaEMsNENBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURHZW5lcmF0b3IgfSBmcm9tICcuL2lkLWdlbmVyYXRvcic7XG5pbXBvcnQgeyAkcGFyc2VFeHByIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlcic7XG5pbXBvcnQgeyBmaW5kVmFsdWVPZiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgY2xvbmUsIGZsYXR0ZW4sIGlzQXJyYXksIGlzRXF1YWwsIGlzT2JqZWN0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG4vLyBDb25zdGFudHNcbmNvbnN0IFdJREdFVF9JRF9SRUdFWCA9IC9eKHdpZGdldC1bXl9dKykvO1xuY29uc3QgV0lER0VUX1BST1BFUlRZX1JFR0VYID0gL153aWRnZXQtW15fXStfKC4rKSQvO1xuY29uc3QgQVJSQVlfSU5ERVhfUExBQ0VIT0xERVIgPSAnWyRpXSc7XG5jb25zdCBBUlJBWV9JTkRFWF9aRVJPID0gJ1swXSc7XG5jb25zdCBERUJPVU5DRV9XQUlUID0gMTAwO1xuY29uc3QgTUFYX1dBVENIX0NZQ0xFUyA9IDU7XG5cbmNvbnN0IHJlZ2lzdHJ5ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbmNvbnN0IHdhdGNoSWRHZW5lcmF0b3IgPSBuZXcgSURHZW5lcmF0b3IoJ3dhdGNoLWlkLScpO1xuXG5leHBvcnQgY29uc3QgRklSU1RfVElNRV9XQVRDSCA9IE9iamVjdC5mcmVlemUoe30pO1xuXG4vLyBUeXBlIGRlZmluaXRpb25zXG5pbnRlcmZhY2UgV2F0Y2hJbmZvIHtcbiAgICBmbjogKCkgPT4gYW55O1xuICAgIGxpc3RlbmVyOiAobmV3VmFsOiBhbnksIG9sZFZhbDogYW55KSA9PiB2b2lkO1xuICAgIGV4cHI6IHN0cmluZztcbiAgICBsYXN0OiBhbnk7XG4gICAgZG9Ob3RDbG9uZTogYm9vbGVhbjtcbiAgICBpc011dGVkPzogKCkgPT4gYm9vbGVhbjtcbiAgICBzY29wZVR5cGU6IFNjb3BlVHlwZSB8IG51bGw7XG4gICAgc2NvcGVOYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuXG50eXBlIFNjb3BlVHlwZSA9ICdQYWdlJyB8ICdQcmVmYWInIHwgJ1BhcnRpYWwnIHwgJ0FwcCc7XG5cbmludGVyZmFjZSBXYXRjaENvbmZpZyB7XG4gICAgYXJyYXlUeXBlPzogYm9vbGVhbjtcbiAgICBpc0xpc3Q/OiBib29sZWFuO1xufVxuXG4vLyBTdGF0ZVxubGV0IG11dGVkID0gZmFsc2U7XG5sZXQgY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcbmxldCBza2lwV2F0Y2hlcnMgPSBmYWxzZTtcbmxldCBuZ1pvbmU6IGFueTtcbmxldCBhcHBSZWY6IGFueTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbnNcbmV4cG9ydCBjb25zdCBpc0ZpcnN0VGltZUNoYW5nZSA9ICh2OiBhbnkpOiBib29sZWFuID0+IHYgPT09IEZJUlNUX1RJTUVfV0FUQ0g7XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IChmbjogRnVuY3Rpb24sIHdhaXQ6IG51bWJlciA9IERFQk9VTkNFX1dBSVQpID0+IHtcbiAgICBsZXQgdGltZW91dDogYW55O1xuICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgd2luZG93WydfX3pvbmVfc3ltYm9sX19jbGVhclRpbWVvdXQnXSh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHdpbmRvd1snX196b25lX3N5bWJvbF9fc2V0VGltZW91dCddKCgpID0+IGZuKC4uLmFyZ3MpLCB3YWl0KTtcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG11dGVXYXRjaGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBtdXRlZCA9IHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdW5NdXRlV2F0Y2hlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgbXV0ZWQgPSBmYWxzZTtcbiAgICB0cmlnZ2VyV2F0Y2hlcnMoKTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgd2lkZ2V0IElEIGZyb20gaWRlbnRpZmllciAoZS5nLiwgXCJ3aWRnZXQtaWQyM19ldmVudHNvdXJjZVwiIC0+IFwid2lkZ2V0LWlkMjNcIilcbiAqL1xuY29uc3QgZ2V0V2lkZ2V0SWQgPSAoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgaWYgKCFpZGVudGlmaWVyIHx8IHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBpZGVudGlmaWVyLm1hdGNoKFdJREdFVF9JRF9SRUdFWCk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBwcm9wZXJ0eSBuYW1lIGZyb20gaWRlbnRpZmllciAoZS5nLiwgXCJ3aWRnZXQtaWQyM19ldmVudHNvdXJjZVwiIC0+IFwiZXZlbnRzb3VyY2VcIilcbiAqL1xuY29uc3QgZ2V0UHJvcGVydHlOYW1lID0gKGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgaWYgKCFpZGVudGlmaWVyIHx8IHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBpZGVudGlmaWVyLm1hdGNoKFdJREdFVF9QUk9QRVJUWV9SRUdFWCk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBpZGVudGlmaWVyO1xufTtcblxuLyoqXG4gKiBBcnJheSBjb25zdW1lciB3cmFwcGVyIGZvciBhcnJheS1iYXNlZCBleHByZXNzaW9uc1xuICovXG5jb25zdCBhcnJheUNvbnN1bWVyID0gKGxpc3RlbmVyRm46IGFueSwgcmVzdEV4cHI6IHN0cmluZywgbmV3VmFsOiBhbnksIG9sZFZhbDogYW55KTogdm9pZCA9PiB7XG4gICAgaWYgKCFpc0FycmF5KG5ld1ZhbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmb3JtYXR0ZWREYXRhID0gbmV3VmFsLm1hcChkYXR1bSA9PiBmaW5kVmFsdWVPZihkYXR1bSwgcmVzdEV4cHIpKTtcblxuICAgIC8vIEZsYXR0ZW4gaWYgcmVzdWx0IGlzIGFycmF5IG9mIGFycmF5c1xuICAgIGlmIChpc0FycmF5KGZvcm1hdHRlZERhdGFbMF0pKSB7XG4gICAgICAgIGZvcm1hdHRlZERhdGEgPSBmbGF0dGVuKGZvcm1hdHRlZERhdGEpO1xuICAgIH1cblxuICAgIGxpc3RlbmVyRm4oZm9ybWF0dGVkRGF0YSwgb2xkVmFsKTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyB3YXRjaCBpbmZvIGZvciBhcnJheSBleHByZXNzaW9uc1xuICovXG5jb25zdCBnZXRVcGRhdGVkV2F0Y2hJbmZvID0gKGV4cHI6IHN0cmluZywgYWNjZXB0c0FycmF5OiBib29sZWFuLCBsaXN0ZW5lcjogYW55KSA9PiB7XG4gICAgY29uc3QgcmVnZXggPSAvXFxbXFwkaVxcXS9nO1xuXG4gICAgaWYgKCFhY2NlcHRzQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4cHI6IGV4cHIucmVwbGFjZShyZWdleCwgQVJSQVlfSU5ERVhfWkVSTyksXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RJbmRleCA9IGV4cHIubGFzdEluZGV4T2YoQVJSQVlfSU5ERVhfUExBQ0VIT0xERVIpO1xuICAgIGNvbnN0IGJhc2VFeHByID0gZXhwci5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KS5yZXBsYWNlKEFSUkFZX0lOREVYX1BMQUNFSE9MREVSLCBBUlJBWV9JTkRFWF9aRVJPKTtcbiAgICBjb25zdCByZXN0RXhwciA9IGV4cHIuc3Vic3RyaW5nKGxhc3RJbmRleCArIEFSUkFZX0lOREVYX1BMQUNFSE9MREVSLmxlbmd0aCk7XG5cbiAgICBjb25zdCBhcnJheUNvbnN1bWVyRm4gPSByZXN0RXhwclxuICAgICAgICA/IGFycmF5Q29uc3VtZXIuYmluZCh1bmRlZmluZWQsIGxpc3RlbmVyLCByZXN0RXhwcilcbiAgICAgICAgOiBsaXN0ZW5lcjtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGV4cHI6IGJhc2VFeHByLFxuICAgICAgICBsaXN0ZW5lcjogYXJyYXlDb25zdW1lckZuXG4gICAgfTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhbiBleHByZXNzaW9uIGlzIHN0YXRpYyAoZG9lc24ndCBuZWVkIHRvIGJlIHdhdGNoZWQpXG4gKi9cbmNvbnN0IFNUQVRJQ19FWFBSRVNTSU9OX05BTUVTID0gW1xuICAgIFwicm93LmdldFByb3BlcnR5KCdpbnZlc3RtZW50JylcIixcbiAgICBcInJvdy5nZXRQcm9wZXJ0eSgnZmFjdHNoZWV0TGluaycpXCIsXG4gICAgXCJyb3cuZ2V0UHJvcGVydHkoJ2lzUmViYWxhbmNlRWxpZ2libGUnKVwiXG5dO1xuXG5jb25zdCBpc1N0YXRpY0V4cHJlc3Npb24gPSAoZXhwcjogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHR5cGVvZiBleHByICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdHJpbW1lZEV4cHIgPSBleHByLnRyaW0oKTtcblxuICAgIC8vIEV4cHJlc3Npb25zIHRoYXQgYWx3YXlzIGV2YWx1YXRlIHRvIGxvY2FsaXphdGlvbiBzdHJpbmdzXG4gICAgaWYgKHRyaW1tZWRFeHByLmluY2x1ZGVzKCdhcHBMb2NhbGUnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBIYXJkLWNvZGVkIHN0YXRpYyBleHByZXNzaW9uIG5hbWVzXG4gICAgaWYgKFNUQVRJQ19FWFBSRVNTSU9OX05BTUVTLmluY2x1ZGVzKHRyaW1tZWRFeHByKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIHNjb3BlIHR5cGUgZnJvbSB0aGUgc2NvcGUgb2JqZWN0XG4gKi9cbmNvbnN0IGdldFNjb3BlVHlwZSA9ICgkc2NvcGU6IGFueSk6IFNjb3BlVHlwZSB8IG51bGwgPT4ge1xuICAgIGlmICghJHNjb3BlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICgkc2NvcGUucGFnZU5hbWUpIHJldHVybiAnUGFnZSc7XG4gICAgaWYgKCRzY29wZS5wcmVmYWJOYW1lKSByZXR1cm4gJ1ByZWZhYic7XG4gICAgaWYgKCRzY29wZS5wYXJ0aWFsTmFtZSkgcmV0dXJuICdQYXJ0aWFsJztcblxuICAgIC8vIENoZWNrIGZvciBBcHAgc2NvcGVcbiAgICBpZiAoJHNjb3BlLlZhcmlhYmxlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICRzY29wZS5BY3Rpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgISRzY29wZS5wYWdlTmFtZSAmJlxuICAgICAgICAhJHNjb3BlLnByZWZhYk5hbWUgJiZcbiAgICAgICAgISRzY29wZS5wYXJ0aWFsTmFtZSkge1xuICAgICAgICByZXR1cm4gJ0FwcCc7XG4gICAgfVxuXG4gICAgaWYgKCRzY29wZS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ0FwcFJlZicpIHtcbiAgICAgICAgcmV0dXJuICdBcHAnO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBHZXRzIHNjb3BlIG5hbWUgYmFzZWQgb24gc2NvcGUgdHlwZVxuICovXG5jb25zdCBnZXRTY29wZU5hbWUgPSAoJHNjb3BlOiBhbnksIHNjb3BlVHlwZTogU2NvcGVUeXBlIHwgbnVsbCk6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgIGlmICghc2NvcGVUeXBlIHx8ICEkc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChzY29wZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnUHJlZmFiJzogcmV0dXJuICRzY29wZS5wcmVmYWJOYW1lIHx8IG51bGw7XG4gICAgICAgIGNhc2UgJ1BhcnRpYWwnOiByZXR1cm4gJHNjb3BlLnBhcnRpYWxOYW1lIHx8IG51bGw7XG4gICAgICAgIGNhc2UgJ1BhZ2UnOiByZXR1cm4gJHNjb3BlLnBhZ2VOYW1lIHx8IG51bGw7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbn07XG5cbi8qKlxuICogTWFpbiB3YXRjaCBmdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgJHdhdGNoID0gKFxuICAgIGV4cHI6IHN0cmluZyxcbiAgICAkc2NvcGU6IGFueSxcbiAgICAkbG9jYWxzOiBhbnksXG4gICAgbGlzdGVuZXI6IGFueSxcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcgPSB3YXRjaElkR2VuZXJhdG9yLm5leHRVaWQoKSxcbiAgICBkb05vdENsb25lOiBib29sZWFuID0gZmFsc2UsXG4gICAgY29uZmlnOiBXYXRjaENvbmZpZyA9IHt9LFxuICAgIGlzTXV0ZWQ/OiAoKSA9PiBib29sZWFuXG4pID0+IHtcbiAgICAvLyBIYW5kbGUgYXJyYXkgZXhwcmVzc2lvbnNcbiAgICBpZiAoZXhwci5pbmNsdWRlcyhBUlJBWV9JTkRFWF9QTEFDRUhPTERFUikpIHtcbiAgICAgICAgY29uc3Qgd2F0Y2hJbmZvID0gZ2V0VXBkYXRlZFdhdGNoSW5mbyhleHByLCBjb25maWcuYXJyYXlUeXBlIHx8IGNvbmZpZy5pc0xpc3QgfHwgZmFsc2UsIGxpc3RlbmVyKTtcbiAgICAgICAgZXhwciA9IHdhdGNoSW5mby5leHByO1xuICAgICAgICBsaXN0ZW5lciA9IHdhdGNoSW5mby5saXN0ZW5lcjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3RhdGljIGV4cHJlc3Npb25zXG4gICAgaWYgKGlzU3RhdGljRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZm4gPSAkcGFyc2VFeHByKGV4cHIpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGljVmFsdWUgPSBmbigkc2NvcGUsICRsb2NhbHMpO1xuICAgICAgICAgICAgbGlzdGVuZXIoc3RhdGljVmFsdWUsIEZJUlNUX1RJTUVfV0FUQ0gpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEVycm9yIGV2YWx1YXRpbmcgc3RhdGljIGV4cHJlc3Npb24gJyR7ZXhwcn0nOmAsIGUpO1xuICAgICAgICAgICAgbGlzdGVuZXIodW5kZWZpbmVkLCBGSVJTVF9USU1FX1dBVENIKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4geyB9OyAvLyBOby1vcCB1bnN1YnNjcmliZVxuICAgIH1cblxuICAgIGNvbnN0IGZuID0gJHBhcnNlRXhwcihleHByKTtcbiAgICBjb25zdCBzY29wZVR5cGUgPSBnZXRTY29wZVR5cGUoJHNjb3BlKTtcbiAgICBjb25zdCBzY29wZU5hbWUgPSBnZXRTY29wZU5hbWUoJHNjb3BlLCBzY29wZVR5cGUpO1xuXG4gICAgY29uc3Qgd2F0Y2hJbmZvOiBXYXRjaEluZm8gPSB7XG4gICAgICAgIGZuOiBmbi5iaW5kKG51bGwsICRzY29wZSwgJGxvY2FscyksXG4gICAgICAgIGxpc3RlbmVyLFxuICAgICAgICBleHByLFxuICAgICAgICBsYXN0OiBGSVJTVF9USU1FX1dBVENILFxuICAgICAgICBkb05vdENsb25lLFxuICAgICAgICBpc011dGVkLFxuICAgICAgICBzY29wZVR5cGUsXG4gICAgICAgIHNjb3BlTmFtZVxuICAgIH07XG5cbiAgICAvLyBTdG9yZSBpbiByZWdpc3RyeVxuICAgIGNvbnN0IHdpZGdldElkID0gZ2V0V2lkZ2V0SWQoaWRlbnRpZmllcik7XG5cbiAgICBpZiAod2lkZ2V0SWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlOYW1lKGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoIXJlZ2lzdHJ5Lmhhcyh3aWRnZXRJZCkpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5LnNldCh3aWRnZXRJZCwge30pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpZGdldEdyb3VwID0gcmVnaXN0cnkuZ2V0KHdpZGdldElkKTtcbiAgICAgICAgd2lkZ2V0R3JvdXBbcHJvcGVydHlOYW1lXSA9IHdhdGNoSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZWdpc3RyeS5zZXQoaWRlbnRpZmllciwgd2F0Y2hJbmZvKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4gJHVud2F0Y2goaWRlbnRpZmllcik7XG59O1xuXG4vKipcbiAqIFVud2F0Y2hlcyBhIHNpbmdsZSBpZGVudGlmaWVyXG4gKi9cbmV4cG9ydCBjb25zdCAkdW53YXRjaCA9IChpZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCB3aWRnZXRJZCA9IGdldFdpZGdldElkKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKHdpZGdldElkKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IGdldFByb3BlcnR5TmFtZShpZGVudGlmaWVyKTtcbiAgICAgICAgY29uc3Qgd2lkZ2V0R3JvdXAgPSByZWdpc3RyeS5nZXQod2lkZ2V0SWQpO1xuXG4gICAgICAgIGlmICh3aWRnZXRHcm91cCAmJiB0eXBlb2Ygd2lkZ2V0R3JvdXAgPT09ICdvYmplY3QnICYmICF3aWRnZXRHcm91cC5mbikge1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hJbmZvID0gd2lkZ2V0R3JvdXBbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIGlmICh3YXRjaEluZm8pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgd2lkZ2V0R3JvdXBbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBlbXB0eSB3aWRnZXQgZ3JvdXBzXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHdpZGdldEdyb3VwKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkuZGVsZXRlKHdpZGdldElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBkaXJlY3QgbG9va3VwXG4gICAgaWYgKHJlZ2lzdHJ5LmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgICByZWdpc3RyeS5kZWxldGUoaWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogVW53YXRjaGVzIGFsbCB3YXRjaGVycyBmb3IgYSBzcGVjaWZpYyB3aWRnZXQgSURcbiAqL1xuZXhwb3J0IGNvbnN0ICR1bndhdGNoQWxsID0gKHdpZGdldElkOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIGlmICghd2lkZ2V0SWQgfHwgdHlwZW9mIHdpZGdldElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCB3aWRnZXRHcm91cCA9IHJlZ2lzdHJ5LmdldCh3aWRnZXRJZCk7XG5cbiAgICBpZiAod2lkZ2V0R3JvdXAgJiYgdHlwZW9mIHdpZGdldEdyb3VwID09PSAnb2JqZWN0JyAmJiAhd2lkZ2V0R3JvdXAuZm4pIHtcbiAgICAgICAgY29uc3QgY291bnQgPSBPYmplY3Qua2V5cyh3aWRnZXRHcm91cCkubGVuZ3RoO1xuICAgICAgICByZWdpc3RyeS5kZWxldGUod2lkZ2V0SWQpO1xuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IGZpbmQgYWxsIGlkZW50aWZpZXJzIHN0YXJ0aW5nIHdpdGggdGhpcyB3aWRnZXQgSURcbiAgICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcbiAgICBjb25zdCBpZGVudGlmaWVyc1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcmVnaXN0cnkuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCh3aWRnZXRJZCArICdfJykpIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXJzVG9SZW1vdmUucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLmZvckVhY2goaWRlbnRpZmllciA9PiB7XG4gICAgICAgIGlmICgkdW53YXRjaChpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZW1vdmVkQ291bnQ7XG59O1xuXG4vKipcbiAqIFVud2F0Y2hlcyBhbGwgd2F0Y2hlcnMgZm9yIGEgc3BlY2lmaWMgc2NvcGUgKFBhZ2UsIFByZWZhYiwgUGFydGlhbCwgb3IgQXBwKVxuICogTm93IHdvcmtzIGRpcmVjdGx5IHdpdGggdGhlIG1haW4gcmVnaXN0cnkgaW5zdGVhZCBvZiBzZXBhcmF0ZSBzY29wZWQgcmVnaXN0cmllc1xuICovXG5leHBvcnQgY29uc3QgJHVud2F0Y2hBbGxCeVNjb3BlID0gKHNjb3BlVHlwZTogU2NvcGVUeXBlLCBzY29wZU5hbWU/OiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIGlmICghc2NvcGVUeXBlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGxldCByZW1vdmVkQ291bnQgPSAwO1xuICAgIGNvbnN0IGlkZW50aWZpZXJzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XG5cbiAgICByZWdpc3RyeS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBncm91cGVkIHN0cnVjdHVyZSAod2lkZ2V0IGdyb3VwcylcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXZhbHVlLmZuKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW3Byb3BlcnR5TmFtZSwgd2F0Y2hJbmZvXTogW3N0cmluZywgYW55XSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh3YXRjaEluZm8/LnNjb3BlVHlwZSA9PT0gc2NvcGVUeXBlICYmXG4gICAgICAgICAgICAgICAgICAgICghc2NvcGVOYW1lIHx8IHdhdGNoSW5mby5zY29wZU5hbWUgPT09IHNjb3BlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnNUb1JlbW92ZS5wdXNoKGAke2tleX1fJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEaXJlY3Qgd2F0Y2hJbmZvXG4gICAgICAgICAgICBjb25zdCB3YXRjaEluZm8gPSB2YWx1ZSBhcyBXYXRjaEluZm87XG4gICAgICAgICAgICBpZiAod2F0Y2hJbmZvPy5zY29wZVR5cGUgPT09IHNjb3BlVHlwZSAmJlxuICAgICAgICAgICAgICAgICghc2NvcGVOYW1lIHx8IHdhdGNoSW5mby5zY29wZU5hbWUgPT09IHNjb3BlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVW53YXRjaCBhbGwgY29sbGVjdGVkIGlkZW50aWZpZXJzXG4gICAgaWRlbnRpZmllcnNUb1JlbW92ZS5mb3JFYWNoKGlkZW50aWZpZXIgPT4ge1xuICAgICAgICBpZiAoJHVud2F0Y2goaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVtb3ZlZENvdW50O1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBzaW5nbGUgd2F0Y2ggaW5mbyBkdXJpbmcgdHJpZ2dlciBjeWNsZVxuICovXG5jb25zdCBwcm9jZXNzV2F0Y2hJbmZvID0gKHdhdGNoSW5mbzogV2F0Y2hJbmZvKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCF3YXRjaEluZm8/LmZuIHx8ICh3YXRjaEluZm8uaXNNdXRlZD8uKCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgbmV3VmFsdWU6IGFueTtcbiAgICB0cnkge1xuICAgICAgICBuZXdWYWx1ZSA9IHdhdGNoSW5mby5mbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBFcnJvciBleGVjdXRpbmcgZXhwcmVzc2lvbjogJyR7d2F0Y2hJbmZvLmV4cHJ9J2AsIGUpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGlzRXF1YWwobmV3VmFsdWUsIHdhdGNoSW5mby5sYXN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIGRldGVjdGVkXG4gICAgY2hhbmdlZEJ5V2F0Y2ggPSB0cnVlO1xuICAgIHdhdGNoSW5mby5sYXN0ID0gaXNPYmplY3QobmV3VmFsdWUpICYmICF3YXRjaEluZm8uZG9Ob3RDbG9uZVxuICAgICAgICA/IGNsb25lKG5ld1ZhbHVlKVxuICAgICAgICA6IG5ld1ZhbHVlO1xuXG4gICAgd2F0Y2hJbmZvLmxpc3RlbmVyKG5ld1ZhbHVlLCB3YXRjaEluZm8ubGFzdCA9PT0gbmV3VmFsdWUgPyBGSVJTVF9USU1FX1dBVENIIDogd2F0Y2hJbmZvLmxhc3QpO1xuICAgIGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlcnMgYWxsIHdhdGNoZXJzXG4gKi9cbmNvbnN0IHRyaWdnZXJXYXRjaGVycyA9IChpZ25vcmVNdXRlZDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCA9PiB7XG4gICAgaWYgKG11dGVkICYmICFpZ25vcmVNdXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBhc3MgPSAxO1xuICAgIGxldCBjaGFuZ2VEZXRlY3RlZDogYm9vbGVhbjtcblxuICAgIGRvIHtcbiAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSBmYWxzZTtcblxuICAgICAgICByZWdpc3RyeS5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGdyb3VwZWQgc3RydWN0dXJlXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhdmFsdWUuZm4pIHtcbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKHZhbHVlKS5mb3JFYWNoKCh3YXRjaEluZm86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc1dhdGNoSW5mbyh3YXRjaEluZm8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRGlyZWN0IHdhdGNoSW5mb1xuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzV2F0Y2hJbmZvKHZhbHVlIGFzIFdhdGNoSW5mbykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcGFzcysrO1xuICAgIH0gd2hpbGUgKGNoYW5nZURldGVjdGVkICYmIHBhc3MgPCBNQVhfV0FUQ0hfQ1lDTEVTKTtcblxuICAgIGlmIChjaGFuZ2VEZXRlY3RlZCAmJiBwYXNzID09PSBNQVhfV0FUQ0hfQ1lDTEVTKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgV2F0Y2ggY3ljbGVzIGV4Y2VlZGVkIGxpbWl0IG9mICR7TUFYX1dBVENIX0NZQ0xFU31gKTtcbiAgICB9XG59O1xuXG4vLyBBbmd1bGFyIHpvbmUgaW50ZWdyYXRpb25cbmV4cG9ydCBjb25zdCBzZXROZ1pvbmUgPSAoem9uZTogYW55KTogdm9pZCA9PiB7XG4gICAgbmdab25lID0gem9uZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRBcHBSZWYgPSAocmVmOiBhbnkpOiB2b2lkID0+IHtcbiAgICBhcHBSZWYgPSByZWY7XG59O1xuXG5leHBvcnQgY29uc3QgaXNDaGFuZ2VGcm9tV2F0Y2ggPSAoKTogYm9vbGVhbiA9PiBjaGFuZ2VkQnlXYXRjaDtcbmV4cG9ydCBjb25zdCByZXNldENoYW5nZUZyb21XYXRjaCA9ICgpOiB2b2lkID0+IHtcbiAgICBjaGFuZ2VkQnlXYXRjaCA9IGZhbHNlO1xufTtcblxuLy8gRGVib3VuY2VkIHRyaWdnZXJcbmNvbnN0IGRlYm91bmNlZFRyaWdnZXJXYXRjaGVycyA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBza2lwV2F0Y2hlcnMgPSB0cnVlO1xuICAgIG5nWm9uZS5ydW4oKCkgPT4gdHJpZ2dlcldhdGNoZXJzKCkpO1xufSwgREVCT1VOQ0VfV0FJVCk7XG5cbmV4cG9ydCBjb25zdCAkaW52b2tlV2F0Y2hlcnMgPSAoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSwgaWdub3JlTXV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3JjZSkge1xuICAgICAgICB0cmlnZ2VyV2F0Y2hlcnMoaWdub3JlTXV0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChza2lwV2F0Y2hlcnMpIHtcbiAgICAgICAgICAgIHNraXBXYXRjaGVycyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlYm91bmNlZFRyaWdnZXJXYXRjaGVycygpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCAkYXBwRGlnZXN0ID0gKCgpID0+IHtcbiAgICBsZXQgcXVldWVkID0gZmFsc2U7XG4gICAgY29uc3QgJFJBRiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbiAgICByZXR1cm4gKGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCFhcHBSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgbmdab25lLnJ1bigoKSA9PiBhcHBSZWYudGljaygpKTtcbiAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHF1ZXVlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICAkUkFGKCgpID0+IHtcbiAgICAgICAgICAgICAgICBuZ1pvbmUucnVuKCgpID0+IGFwcFJlZi50aWNrKCkpO1xuICAgICAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxuLy8gRXhwb3J0IHJlZ2lzdHJ5IGZvciBkZWJ1Z2dpbmdcbi8vICh3aW5kb3cgYXMgYW55KS53YXRjaFJlZ2lzdHJ5ID0gcmVnaXN0cnk7Il19
480
+ window.watchRegistry = registry;
481
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXZFLFlBQVk7QUFDWixNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztBQUMxQyxNQUFNLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0FBQ3BELE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUUzQixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQXNCbEQsUUFBUTtBQUNSLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFDM0IsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLElBQUksTUFBVyxDQUFDO0FBQ2hCLElBQUksTUFBVyxDQUFDO0FBRWhCOzs7OztzRUFLc0U7QUFDdEUsTUFBTSxxQkFBcUIsR0FBRyxHQUFH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QUUsQ0FBQztZQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDaEMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsT0FBTztZQUNYLENBQUM7WUFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFFTCxnQ0FBZ0M7QUFDL0IsTUFBYyxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJREdlbmVyYXRvciB9IGZyb20gJy4vaWQtZ2VuZXJhdG9yJztcbmltcG9ydCB7ICRwYXJzZUV4cHIgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyJztcbmltcG9ydCB7IGZpbmRWYWx1ZU9mIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBjbG9uZSwgZmxhdHRlbiwgaXNBcnJheSwgaXNFcXVhbCwgaXNPYmplY3QgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5cbi8vIENvbnN0YW50c1xuY29uc3QgV0lER0VUX0lEX1JFR0VYID0gL14od2lkZ2V0LVteX10rKS87XG5jb25zdCBXSURHRVRfUFJPUEVSVFlfUkVHRVggPSAvXndpZGdldC1bXl9dK18oLispJC87XG5jb25zdCBBUlJBWV9JTkRFWF9QTEFDRUhPTERFUiA9ICdbJGldJztcbmNvbnN0IEFSUkFZX0lOREVYX1pFUk8gPSAnWzBdJztcbmNvbnN0IERFQk9VTkNFX1dBSVQgPSAxMDA7XG5jb25zdCBNQVhfV0FUQ0hfQ1lDTEVTID0gNTtcblxuY29uc3QgcmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuY29uc3Qgd2F0Y2hJZEdlbmVyYXRvciA9IG5ldyBJREdlbmVyYXRvcignd2F0Y2gtaWQtJyk7XG5cbmV4cG9ydCBjb25zdCBGSVJTVF9USU1FX1dBVENIID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG5cbi8vIFR5cGUgZGVmaW5pdGlvbnNcbmludGVyZmFjZSBXYXRjaEluZm8ge1xuICAgIGZuOiAoKSA9PiBhbnk7XG4gICAgbGlzdGVuZXI6IChuZXdWYWw6IGFueSwgb2xkVmFsOiBhbnkpID0+IHZvaWQ7XG4gICAgZXhwcjogc3RyaW5nO1xuICAgIGxhc3Q6IGFueTtcbiAgICBkb05vdENsb25lOiBib29sZWFuO1xuICAgIGlzTXV0ZWQ/OiAoKSA9PiBib29sZWFuO1xuICAgIHNjb3BlVHlwZTogU2NvcGVUeXBlIHwgbnVsbDtcbiAgICBzY29wZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgZGVzdHJveUZuPzogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBTY29wZVR5cGUgPSAnUGFnZScgfCAnUHJlZmFiJyB8ICdQYXJ0aWFsJyB8ICdBcHAnO1xuXG5pbnRlcmZhY2UgV2F0Y2hDb25maWcge1xuICAgIGFycmF5VHlwZT86IGJvb2xlYW47XG4gICAgaXNMaXN0PzogYm9vbGVhbjtcbn1cblxuLy8gU3RhdGVcbmxldCBtdXRlZCA9IGZhbHNlO1xubGV0IGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5sZXQgc2tpcFdhdGNoZXJzID0gZmFsc2U7XG5sZXQgbmdab25lOiBhbnk7XG5sZXQgYXBwUmVmOiBhbnk7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogQ0xFQU5VUCBTQ0hFRFVMRVIgV0lUSDpcbiAqICAtIFNpZ25pZmljYW50IHdhdGNoZXIgZGVsdGEgdHJpZ2dlciAoKy8tKVxuICogIC0gVUkgc3RhYmlsaXphdGlvbiBkZWxheSAoMeKAkzIgc2Vjb25kcylcbiAqICAtIENvb2xkb3duIHRvIHByZXZlbnQgcmVwZWF0ZWQgc2NoZWR1bGluZ1xuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuY29uc3QgQ0xFQU5VUF9UUklHR0VSX0RFTFRBID0gMzAwOyAgIC8vIHdhdGNoZXIgY2hhbmdlIHRocmVzaG9sZFxuY29uc3QgQ0xFQU5VUF9ERUxBWSA9IDE1MDA7ICAgICAgICAgIC8vIGRlbGF5IGJlZm9yZSBydW5uaW5nIGNsZWFudXBcbmNvbnN0IENMRUFOVVBfQ09PTERPV04gPSA0MDAwOyAgICAgICAvLyBwcmV2ZW50IHJlLXNjaGVkdWxpbmcgZm9yIDRzXG5cbmxldCBsYXN0V2F0Y2hlckNvdW50ID0gMDtcbmxldCBzY2hlZHVsZWRDbGVhbnVwOiBhbnkgPSBudWxsO1xubGV0IGxhc3RTY2hlZHVsZWRUaW1lID0gMDtcblxuZnVuY3Rpb24gZ2V0V2F0Y2hlckNvdW50KCk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICByZWdpc3RyeS5mb3JFYWNoKGJ1Y2tldCA9PiBjb3VudCArPSBidWNrZXQuc2l6ZSk7XG4gICAgcmV0dXJuIGNvdW50O1xufVxuXG5leHBvcnQgY29uc3QgY2xlYW51cFN0YWxlV2F0Y2hlcnMgPSAoKTogbnVtYmVyID0+IHtcbiAgICAvLyBjb25zb2xlLmxvZyhcIi4uLi4uLi4uLkNsZWFuaW5nIHVwIHN0YWxlIHdhdGNoZXJzLi4ucmVnaXN0cnkuc2l6ZS4uLi5cIiwgcmVnaXN0cnkuc2l6ZSk7XG4gICAgbGV0IHJlbW92ZWQgPSAwO1xuXG4gICAgcmVnaXN0cnkuZm9yRWFjaCgoYnVja2V0LCB3aWRnZXRJZCkgPT4ge1xuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFt3aWRnZXQtaWQ9XCIke3dpZGdldElkfVwiXWApKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBidWNrZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnVja2V0Lmhhc093blByb3BlcnR5KGtleSkgJiYga2V5ICE9PSBcInNjb3BlVHlwZVwiICYmIGtleSAhPT0gXCJzY29wZU5hbWVcIiAmJiB0eXBlb2YgYnVja2V0W2tleV0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2F0Y2hJbmZvID0gYnVja2V0W2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YXRjaEluZm8gJiYgd2F0Y2hJbmZvLmRlc3Ryb3lGbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hJbmZvLmRlc3Ryb3lGbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVtb3ZlZCsrO1xuICAgICAgICAgICAgcmVnaXN0cnkuZGVsZXRlKHdpZGdldElkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZW1vdmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IHNjaGVkdWxlVGhyZXNob2xkQ2xlYW51cCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBsZXQgbGFzdFRyaWdnZXJQZXJpb2QgPSBub3cgLSBsYXN0U2NoZWR1bGVkVGltZTtcbiAgICAvLyBJZiBhIGNsZWFudXAgd2FzIHNjaGVkdWxlZCByZWNlbnRseSwgc2tpcCBzY2hlZHVsaW5nXG4gICAgaWYgKGxhc3RUcmlnZ2VyUGVyaW9kIDwgQ0xFQU5VUF9DT09MRE9XTikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IGdldFdhdGNoZXJDb3VudCgpO1xuICAgIGNvbnN0IGRlbHRhID0gTWF0aC5hYnMoY3VycmVudCAtIGxhc3RXYXRjaGVyQ291bnQpOyAgLy8gc2lnbmlmaWNhbnQgKyBvciAtXG5cbiAgICAvLyBJZiBjaGFuZ2Ugbm90IGxhcmdlIGVub3VnaCwgc2tpcCBzY2hlZHVsaW5nXG4gICAgaWYgKGRlbHRhIDw9IENMRUFOVVBfVFJJR0dFUl9ERUxUQSkge1xuICAgICAgICBsYXN0V2F0Y2hlckNvdW50ID0gY3VycmVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgcmUtc2NoZWR1bGluZzogc2V0IHRpbWVzdGFtcCBlYXJseVxuICAgIGxhc3RTY2hlZHVsZWRUaW1lID0gbm93O1xuXG4gICAgLy8gQ2xlYXIgcHJldmlvdXMgc2NoZWR1bGVkIGNsZWFudXAgKGlmIGFueSlcbiAgICBpZiAoc2NoZWR1bGVkQ2xlYW51cCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoc2NoZWR1bGVkQ2xlYW51cCk7XG4gICAgfVxuXG4gICAgLy8gU2NoZWR1bGUgY2xlYW51cCBhZnRlciBVSSBzdGFiaWxpemVzIChkZWxheSBwcmV2ZW50cyBhZ2dyZXNzaXZlIGNsZWFudXApXG4gICAgc2NoZWR1bGVkQ2xlYW51cCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjbGVhbnVwU3RhbGVXYXRjaGVycygpO1xuICAgICAgICBzY2hlZHVsZWRDbGVhbnVwID0gbnVsbDtcbiAgICB9LCBDTEVBTlVQX0RFTEFZKTtcblxuICAgIGxhc3RXYXRjaGVyQ291bnQgPSBjdXJyZW50O1xufTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbnNcbmV4cG9ydCBjb25zdCBpc0ZpcnN0VGltZUNoYW5nZSA9ICh2OiBhbnkpOiBib29sZWFuID0+IHYgPT09IEZJUlNUX1RJTUVfV0FUQ0g7XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IChmbjogRnVuY3Rpb24sIHdhaXQ6IG51bWJlciA9IERFQk9VTkNFX1dBSVQpID0+IHtcbiAgICBsZXQgdGltZW91dDogYW55O1xuICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgd2luZG93WydfX3pvbmVfc3ltYm9sX19jbGVhclRpbWVvdXQnXSh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHdpbmRvd1snX196b25lX3N5bWJvbF9fc2V0VGltZW91dCddKCgpID0+IGZuKC4uLmFyZ3MpLCB3YWl0KTtcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG11dGVXYXRjaGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBtdXRlZCA9IHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdW5NdXRlV2F0Y2hlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgbXV0ZWQgPSBmYWxzZTtcbiAgICB0cmlnZ2VyV2F0Y2hlcnMoKTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgd2lkZ2V0IElEIGZyb20gaWRlbnRpZmllciAoZS5nLiwgXCJ3aWRnZXQtaWQyM19ldmVudHNvdXJjZVwiIC0+IFwid2lkZ2V0LWlkMjNcIilcbiAqL1xuY29uc3QgZ2V0V2lkZ2V0SWQgPSAoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgaWYgKCFpZGVudGlmaWVyIHx8IHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBpZGVudGlmaWVyLm1hdGNoKFdJREdFVF9JRF9SRUdFWCk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBwcm9wZXJ0eSBuYW1lIGZyb20gaWRlbnRpZmllciAoZS5nLiwgXCJ3aWRnZXQtaWQyM19ldmVudHNvdXJjZVwiIC0+IFwiZXZlbnRzb3VyY2VcIilcbiAqL1xuY29uc3QgZ2V0UHJvcGVydHlOYW1lID0gKGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgaWYgKCFpZGVudGlmaWVyIHx8IHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBpZGVudGlmaWVyLm1hdGNoKFdJREdFVF9QUk9QRVJUWV9SRUdFWCk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBpZGVudGlmaWVyO1xufTtcblxuLyoqXG4gKiBBcnJheSBjb25zdW1lciB3cmFwcGVyIGZvciBhcnJheS1iYXNlZCBleHByZXNzaW9uc1xuICovXG5jb25zdCBhcnJheUNvbnN1bWVyID0gKGxpc3RlbmVyRm46IGFueSwgcmVzdEV4cHI6IHN0cmluZywgbmV3VmFsOiBhbnksIG9sZFZhbDogYW55KTogdm9pZCA9PiB7XG4gICAgaWYgKCFpc0FycmF5KG5ld1ZhbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmb3JtYXR0ZWREYXRhID0gbmV3VmFsLm1hcChkYXR1bSA9PiBmaW5kVmFsdWVPZihkYXR1bSwgcmVzdEV4cHIpKTtcblxuICAgIC8vIEZsYXR0ZW4gaWYgcmVzdWx0IGlzIGFycmF5IG9mIGFycmF5c1xuICAgIGlmIChpc0FycmF5KGZvcm1hdHRlZERhdGFbMF0pKSB7XG4gICAgICAgIGZvcm1hdHRlZERhdGEgPSBmbGF0dGVuKGZvcm1hdHRlZERhdGEpO1xuICAgIH1cblxuICAgIGxpc3RlbmVyRm4oZm9ybWF0dGVkRGF0YSwgb2xkVmFsKTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyB3YXRjaCBpbmZvIGZvciBhcnJheSBleHByZXNzaW9uc1xuICovXG5jb25zdCBnZXRVcGRhdGVkV2F0Y2hJbmZvID0gKGV4cHI6IHN0cmluZywgYWNjZXB0c0FycmF5OiBib29sZWFuLCBsaXN0ZW5lcjogYW55KSA9PiB7XG4gICAgY29uc3QgcmVnZXggPSAvXFxbXFwkaVxcXS9nO1xuXG4gICAgaWYgKCFhY2NlcHRzQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4cHI6IGV4cHIucmVwbGFjZShyZWdleCwgQVJSQVlfSU5ERVhfWkVSTyksXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RJbmRleCA9IGV4cHIubGFzdEluZGV4T2YoQVJSQVlfSU5ERVhfUExBQ0VIT0xERVIpO1xuICAgIGNvbnN0IGJhc2VFeHByID0gZXhwci5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KS5yZXBsYWNlKEFSUkFZX0lOREVYX1BMQUNFSE9MREVSLCBBUlJBWV9JTkRFWF9aRVJPKTtcbiAgICBjb25zdCByZXN0RXhwciA9IGV4cHIuc3Vic3RyaW5nKGxhc3RJbmRleCArIDUpO1xuXG4gICAgY29uc3QgYXJyYXlDb25zdW1lckZuID0gcmVzdEV4cHJcbiAgICAgICAgPyBhcnJheUNvbnN1bWVyLmJpbmQodW5kZWZpbmVkLCBsaXN0ZW5lciwgcmVzdEV4cHIpXG4gICAgICAgIDogbGlzdGVuZXI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBleHByOiBiYXNlRXhwcixcbiAgICAgICAgbGlzdGVuZXI6IGFycmF5Q29uc3VtZXJGblxuICAgIH07XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYW4gZXhwcmVzc2lvbiBpcyBzdGF0aWMgKGRvZXNuJ3QgbmVlZCB0byBiZSB3YXRjaGVkKVxuICovXG5jb25zdCBTVEFUSUNfRVhQUkVTU0lPTl9OQU1FUyA9IFtcbiAgICBcInJvdy5nZXRQcm9wZXJ0eSgnaW52ZXN0bWVudCcpXCIsXG4gICAgXCJyb3cuZ2V0UHJvcGVydHkoJ2ZhY3RzaGVldExpbmsnKVwiLFxuICAgIFwicm93LmdldFByb3BlcnR5KCdpc1JlYmFsYW5jZUVsaWdpYmxlJylcIlxuXTtcblxuY29uc3QgaXNTdGF0aWNFeHByZXNzaW9uID0gKGV4cHI6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh0eXBlb2YgZXhwciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWRFeHByID0gZXhwci50cmltKCk7XG5cbiAgICAvLyBFeHByZXNzaW9ucyB0aGF0IGFsd2F5cyBldmFsdWF0ZSB0byBsb2NhbGl6YXRpb24gc3RyaW5nc1xuICAgIC8vIGlmICh0cmltbWVkRXhwci5pbmNsdWRlcygnYXBwTG9jYWxlJykpIHtcbiAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gfVxuXG4gICAgLy8gSGFyZC1jb2RlZCBzdGF0aWMgZXhwcmVzc2lvbiBuYW1lc1xuICAgIGlmIChTVEFUSUNfRVhQUkVTU0lPTl9OQU1FUy5pbmNsdWRlcyh0cmltbWVkRXhwcikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzY29wZSB0eXBlIGZyb20gdGhlIHNjb3BlIG9iamVjdFxuICovXG5jb25zdCBnZXRTY29wZVR5cGUgPSAoJHNjb3BlOiBhbnkpOiBTY29wZVR5cGUgfCBudWxsID0+IHtcbiAgICBpZiAoISRzY29wZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoJHNjb3BlLnBhZ2VOYW1lKSByZXR1cm4gJ1BhZ2UnO1xuICAgIGlmICgkc2NvcGUucHJlZmFiTmFtZSkgcmV0dXJuICdQcmVmYWInO1xuICAgIGlmICgkc2NvcGUucGFydGlhbE5hbWUpIHJldHVybiAnUGFydGlhbCc7XG5cbiAgICAvLyBDaGVjayBmb3IgQXBwIHNjb3BlXG4gICAgaWYgKCRzY29wZS5WYXJpYWJsZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAkc2NvcGUuQWN0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICEkc2NvcGUucGFnZU5hbWUgJiZcbiAgICAgICAgISRzY29wZS5wcmVmYWJOYW1lICYmXG4gICAgICAgICEkc2NvcGUucGFydGlhbE5hbWUpIHtcbiAgICAgICAgcmV0dXJuICdBcHAnO1xuICAgIH1cblxuICAgIGlmICgkc2NvcGUuY29uc3RydWN0b3I/Lm5hbWUgPT09ICdBcHBSZWYnKSB7XG4gICAgICAgIHJldHVybiAnQXBwJztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogR2V0cyBzY29wZSBuYW1lIGJhc2VkIG9uIHNjb3BlIHR5cGVcbiAqL1xuY29uc3QgZ2V0U2NvcGVOYW1lID0gKCRzY29wZTogYW55LCBzY29wZVR5cGU6IFNjb3BlVHlwZSB8IG51bGwpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICBpZiAoIXNjb3BlVHlwZSB8fCAhJHNjb3BlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc2NvcGVUeXBlKSB7XG4gICAgICAgIGNhc2UgJ1ByZWZhYic6IHJldHVybiAkc2NvcGUucHJlZmFiTmFtZSB8fCBudWxsO1xuICAgICAgICBjYXNlICdQYXJ0aWFsJzogcmV0dXJuICRzY29wZS5wYXJ0aWFsTmFtZSB8fCBudWxsO1xuICAgICAgICBjYXNlICdQYWdlJzogcmV0dXJuICRzY29wZS5wYWdlTmFtZSB8fCBudWxsO1xuICAgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiAgICB9XG59O1xuXG4vKipcbiAqIE1haW4gd2F0Y2ggZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0ICR3YXRjaCA9IChcbiAgICBleHByOiBzdHJpbmcsXG4gICAgJHNjb3BlOiBhbnksXG4gICAgJGxvY2FsczogYW55LFxuICAgIGxpc3RlbmVyOiBhbnksXG4gICAgaWRlbnRpZmllcjogc3RyaW5nID0gd2F0Y2hJZEdlbmVyYXRvci5uZXh0VWlkKCksXG4gICAgZG9Ob3RDbG9uZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGNvbmZpZzogV2F0Y2hDb25maWcgPSB7fSxcbiAgICBpc011dGVkPzogKCkgPT4gYm9vbGVhblxuKSA9PiB7XG4gICAgLy8gSGFuZGxlIGFycmF5IGV4cHJlc3Npb25zXG4gICAgaWYgKGV4cHIuaW5jbHVkZXMoQVJSQVlfSU5ERVhfUExBQ0VIT0xERVIpKSB7XG4gICAgICAgIGNvbnN0IHdhdGNoSW5mbyA9IGdldFVwZGF0ZWRXYXRjaEluZm8oZXhwciwgY29uZmlnLmFycmF5VHlwZSB8fCBjb25maWcuaXNMaXN0IHx8IGZhbHNlLCBsaXN0ZW5lcik7XG4gICAgICAgIGV4cHIgPSB3YXRjaEluZm8uZXhwcjtcbiAgICAgICAgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHN0YXRpYyBleHByZXNzaW9uc1xuICAgIGlmIChpc1N0YXRpY0V4cHJlc3Npb24oZXhwcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZuID0gJHBhcnNlRXhwcihleHByKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRpY1ZhbHVlID0gZm4oJHNjb3BlLCAkbG9jYWxzKTtcbiAgICAgICAgICAgIGxpc3RlbmVyKHN0YXRpY1ZhbHVlLCBGSVJTVF9USU1FX1dBVENIKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBFcnJvciBldmFsdWF0aW5nIHN0YXRpYyBleHByZXNzaW9uICcke2V4cHJ9JzpgLCBlKTtcbiAgICAgICAgICAgIGxpc3RlbmVyKHVuZGVmaW5lZCwgRklSU1RfVElNRV9XQVRDSCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IHsgfTsgLy8gTm8tb3AgdW5zdWJzY3JpYmVcbiAgICB9XG5cbiAgICBjb25zdCBmbiA9ICRwYXJzZUV4cHIoZXhwcik7XG4gICAgY29uc3Qgc2NvcGVUeXBlID0gZ2V0U2NvcGVUeXBlKCRzY29wZSk7XG4gICAgY29uc3Qgc2NvcGVOYW1lID0gZ2V0U2NvcGVOYW1lKCRzY29wZSwgc2NvcGVUeXBlKTtcblxuICAgIGNvbnN0IGRlc3Ryb3lGbiA9ICgpID0+ICR1bndhdGNoKGlkZW50aWZpZXIpO1xuICAgIGNvbnN0IHdhdGNoSW5mbzogV2F0Y2hJbmZvID0ge1xuICAgICAgICBmbjogZm4uYmluZChudWxsLCAkc2NvcGUsICRsb2NhbHMpLFxuICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgZXhwcixcbiAgICAgICAgbGFzdDogRklSU1RfVElNRV9XQVRDSCxcbiAgICAgICAgZG9Ob3RDbG9uZSxcbiAgICAgICAgaXNNdXRlZCxcbiAgICAgICAgc2NvcGVUeXBlLFxuICAgICAgICBzY29wZU5hbWUsXG4gICAgICAgIGRlc3Ryb3lGblxuICAgIH07XG5cbiAgICAvLyBTdG9yZSBpbiByZWdpc3RyeVxuICAgIGNvbnN0IHdpZGdldElkID0gZ2V0V2lkZ2V0SWQoaWRlbnRpZmllcik7XG5cbiAgICBpZiAod2lkZ2V0SWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlOYW1lKGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoIXJlZ2lzdHJ5Lmhhcyh3aWRnZXRJZCkpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5LnNldCh3aWRnZXRJZCwge30pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpZGdldEdyb3VwID0gcmVnaXN0cnkuZ2V0KHdpZGdldElkKTtcbiAgICAgICAgd2lkZ2V0R3JvdXBbcHJvcGVydHlOYW1lXSA9IHdhdGNoSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZWdpc3RyeS5zZXQoaWRlbnRpZmllciwgd2F0Y2hJbmZvKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVzdHJveUZuO1xufTtcblxuLyoqXG4gKiBVbndhdGNoZXMgYSBzaW5nbGUgaWRlbnRpZmllclxuICovXG5leHBvcnQgY29uc3QgJHVud2F0Y2ggPSAoaWRlbnRpZmllcjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3Qgd2lkZ2V0SWQgPSBnZXRXaWRnZXRJZChpZGVudGlmaWVyKTtcblxuICAgIGlmICh3aWRnZXRJZCkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUoaWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IHdpZGdldEdyb3VwID0gcmVnaXN0cnkuZ2V0KHdpZGdldElkKTtcblxuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgaWYgKHdpZGdldEdyb3VwICYmIHR5cGVvZiB3aWRnZXRHcm91cCA9PT0gJ29iamVjdCcgJiYgIXdpZGdldEdyb3VwLmZuKSB7XG4gICAgICAgICAgICBjb25zdCB3YXRjaEluZm8gPSB3aWRnZXRHcm91cFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKHdhdGNoSW5mbykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB3aWRnZXRHcm91cFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIGVtcHR5IHdpZGdldCBncm91cHNcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMod2lkZ2V0R3JvdXApLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWdpc3RyeS5kZWxldGUod2lkZ2V0SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIGRpcmVjdCBsb29rdXBcbiAgICBpZiAocmVnaXN0cnkuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgIHJlZ2lzdHJ5LmRlbGV0ZShpZGVudGlmaWVyKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBVbndhdGNoZXMgYWxsIHdhdGNoZXJzIGZvciBhIHNwZWNpZmljIHdpZGdldCBJRFxuICovXG5leHBvcnQgY29uc3QgJHVud2F0Y2hBbGwgPSAod2lkZ2V0SWQ6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gICAgaWYgKCF3aWRnZXRJZCB8fCB0eXBlb2Ygd2lkZ2V0SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZGdldEdyb3VwID0gcmVnaXN0cnkuZ2V0KHdpZGdldElkKTtcblxuICAgIGlmICh3aWRnZXRHcm91cCAmJiB0eXBlb2Ygd2lkZ2V0R3JvdXAgPT09ICdvYmplY3QnICYmICF3aWRnZXRHcm91cC5mbikge1xuICAgICAgICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKHdpZGdldEdyb3VwKS5sZW5ndGg7XG4gICAgICAgIHJlZ2lzdHJ5LmRlbGV0ZSh3aWRnZXRJZCk7XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogZmluZCBhbGwgaWRlbnRpZmllcnMgc3RhcnRpbmcgd2l0aCB0aGlzIHdpZGdldCBJRFxuICAgIGxldCByZW1vdmVkQ291bnQgPSAwO1xuICAgIGNvbnN0IGlkZW50aWZpZXJzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XG5cbiAgICByZWdpc3RyeS5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHdpZGdldElkICsgJ18nKSkge1xuICAgICAgICAgICAgaWRlbnRpZmllcnNUb1JlbW92ZS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlkZW50aWZpZXJzVG9SZW1vdmUuZm9yRWFjaChpZGVudGlmaWVyID0+IHtcbiAgICAgICAgaWYgKCR1bndhdGNoKGlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlbW92ZWRDb3VudDtcbn07XG5cbi8qKlxuICogVW53YXRjaGVzIGFsbCB3YXRjaGVycyBmb3IgYSBzcGVjaWZpYyBzY29wZSAoUGFnZSwgUHJlZmFiLCBQYXJ0aWFsLCBvciBBcHApXG4gKiBOb3cgd29ya3MgZGlyZWN0bHkgd2l0aCB0aGUgbWFpbiByZWdpc3RyeSBpbnN0ZWFkIG9mIHNlcGFyYXRlIHNjb3BlZCByZWdpc3RyaWVzXG4gKi9cbmV4cG9ydCBjb25zdCAkdW53YXRjaEFsbEJ5U2NvcGUgPSAoc2NvcGVUeXBlOiBTY29wZVR5cGUsIHNjb3BlTmFtZT86IHN0cmluZyk6IG51bWJlciA9PiB7XG4gICAgaWYgKCFzY29wZVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgbGV0IHJlbW92ZWRDb3VudCA9IDA7XG4gICAgY29uc3QgaWRlbnRpZmllcnNUb1JlbW92ZTogc3RyaW5nW10gPSBbXTtcblxuICAgIHJlZ2lzdHJ5LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgLy8gSGFuZGxlIGdyb3VwZWQgc3RydWN0dXJlICh3aWRnZXQgZ3JvdXBzKVxuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhdmFsdWUuZm4pIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChbcHJvcGVydHlOYW1lLCB3YXRjaEluZm9dOiBbc3RyaW5nLCBhbnldKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHdhdGNoSW5mbz8uc2NvcGVUeXBlID09PSBzY29wZVR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFzY29wZU5hbWUgfHwgd2F0Y2hJbmZvLnNjb3BlTmFtZSA9PT0gc2NvcGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLnB1c2goYCR7a2V5fV8ke3Byb3BlcnR5TmFtZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERpcmVjdCB3YXRjaEluZm9cbiAgICAgICAgICAgIGNvbnN0IHdhdGNoSW5mbyA9IHZhbHVlIGFzIFdhdGNoSW5mbztcbiAgICAgICAgICAgIGlmICh3YXRjaEluZm8/LnNjb3BlVHlwZSA9PT0gc2NvcGVUeXBlICYmXG4gICAgICAgICAgICAgICAgKCFzY29wZU5hbWUgfHwgd2F0Y2hJbmZvLnNjb3BlTmFtZSA9PT0gc2NvcGVOYW1lKSkge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJzVG9SZW1vdmUucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVbndhdGNoIGFsbCBjb2xsZWN0ZWQgaWRlbnRpZmllcnNcbiAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLmZvckVhY2goaWRlbnRpZmllciA9PiB7XG4gICAgICAgIGlmICgkdW53YXRjaChpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZW1vdmVkQ291bnQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBhIHNpbmdsZSB3YXRjaCBpbmZvIGR1cmluZyB0cmlnZ2VyIGN5Y2xlXG4gKi9cbmNvbnN0IHByb2Nlc3NXYXRjaEluZm8gPSAod2F0Y2hJbmZvOiBXYXRjaEluZm8pOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXdhdGNoSW5mbz8uZm4gfHwgKHdhdGNoSW5mby5pc011dGVkPy4oKSA/PyBmYWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBuZXdWYWx1ZTogYW55O1xuICAgIHRyeSB7XG4gICAgICAgIG5ld1ZhbHVlID0gd2F0Y2hJbmZvLmZuKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYEVycm9yIGV4ZWN1dGluZyBleHByZXNzaW9uOiAnJHt3YXRjaEluZm8uZXhwcn0nYCwgZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoaXNFcXVhbChuZXdWYWx1ZSwgd2F0Y2hJbmZvLmxhc3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgZGV0ZWN0ZWRcbiAgICBjaGFuZ2VkQnlXYXRjaCA9IHRydWU7XG4gICAgd2F0Y2hJbmZvLmxhc3QgPSBpc09iamVjdChuZXdWYWx1ZSkgJiYgIXdhdGNoSW5mby5kb05vdENsb25lXG4gICAgICAgID8gY2xvbmUobmV3VmFsdWUpXG4gICAgICAgIDogbmV3VmFsdWU7XG5cbiAgICB3YXRjaEluZm8ubGlzdGVuZXIobmV3VmFsdWUsIHdhdGNoSW5mby5sYXN0ID09PSBuZXdWYWx1ZSA/IEZJUlNUX1RJTUVfV0FUQ0ggOiB3YXRjaEluZm8ubGFzdCk7XG4gICAgY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VycyBhbGwgd2F0Y2hlcnNcbiAqL1xuY29uc3QgdHJpZ2dlcldhdGNoZXJzID0gKGlnbm9yZU11dGVkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkID0+IHtcbiAgICBpZiAobXV0ZWQgJiYgIWlnbm9yZU11dGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcGFzcyA9IDE7XG4gICAgbGV0IGNoYW5nZURldGVjdGVkOiBib29sZWFuO1xuXG4gICAgZG8ge1xuICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIHJlZ2lzdHJ5LmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgZ3JvdXBlZCBzdHJ1Y3R1cmVcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICF2YWx1ZS5mbikge1xuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXModmFsdWUpLmZvckVhY2goKHdhdGNoSW5mbzogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzV2F0Y2hJbmZvKHdhdGNoSW5mbykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3Qgd2F0Y2hJbmZvXG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NXYXRjaEluZm8odmFsdWUgYXMgV2F0Y2hJbmZvKSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBwYXNzKys7XG4gICAgfSB3aGlsZSAoY2hhbmdlRGV0ZWN0ZWQgJiYgcGFzcyA8IE1BWF9XQVRDSF9DWUNMRVMpO1xuXG4gICAgLy8gU2NoZWR1bGUgY2xlYW51cCBhZnRlciB3YXRjaGVycyBhcmUgdHJpZ2dlcmVkXG4gICAgc2NoZWR1bGVUaHJlc2hvbGRDbGVhbnVwKCk7XG5cbiAgICBpZiAoY2hhbmdlRGV0ZWN0ZWQgJiYgcGFzcyA9PT0gTUFYX1dBVENIX0NZQ0xFUykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFdhdGNoIGN5Y2xlcyBleGNlZWRlZCBsaW1pdCBvZiAke01BWF9XQVRDSF9DWUNMRVN9YCk7XG4gICAgfVxufTtcblxuLy8gQW5ndWxhciB6b25lIGludGVncmF0aW9uXG5leHBvcnQgY29uc3Qgc2V0Tmdab25lID0gKHpvbmU6IGFueSk6IHZvaWQgPT4ge1xuICAgIG5nWm9uZSA9IHpvbmU7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0QXBwUmVmID0gKHJlZjogYW55KTogdm9pZCA9PiB7XG4gICAgYXBwUmVmID0gcmVmO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQ2hhbmdlRnJvbVdhdGNoID0gKCk6IGJvb2xlYW4gPT4gY2hhbmdlZEJ5V2F0Y2g7XG5leHBvcnQgY29uc3QgcmVzZXRDaGFuZ2VGcm9tV2F0Y2ggPSAoKTogdm9pZCA9PiB7XG4gICAgY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcbn07XG5cbi8vIERlYm91bmNlZCB0cmlnZ2VyXG5jb25zdCBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgc2tpcFdhdGNoZXJzID0gdHJ1ZTtcbiAgICBuZ1pvbmUucnVuKCgpID0+IHRyaWdnZXJXYXRjaGVycygpKTtcbn0sIERFQk9VTkNFX1dBSVQpO1xuXG5leHBvcnQgY29uc3QgJGludm9rZVdhdGNoZXJzID0gKGZvcmNlOiBib29sZWFuID0gZmFsc2UsIGlnbm9yZU11dGVkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkID0+IHtcbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgdHJpZ2dlcldhdGNoZXJzKGlnbm9yZU11dGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc2tpcFdhdGNoZXJzKSB7XG4gICAgICAgICAgICBza2lwV2F0Y2hlcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMoKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgJGFwcERpZ2VzdCA9ICgoKSA9PiB7XG4gICAgbGV0IHF1ZXVlZCA9IGZhbHNlO1xuICAgIGNvbnN0ICRSQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG4gICAgcmV0dXJuIChmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghYXBwUmVmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICBxdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZWQgPSB0cnVlO1xuICAgICAgICAgICAgJFJBRigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbmdab25lLnJ1bigoKSA9PiBhcHBSZWYudGljaygpKTtcbiAgICAgICAgICAgICAgICBxdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5cbi8vIEV4cG9ydCByZWdpc3RyeSBmb3IgZGVidWdnaW5nXG4od2luZG93IGFzIGFueSkud2F0Y2hSZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuIl19
@@ -2189,6 +2189,70 @@ let changedByWatch = false;
2189
2189
  let skipWatchers = false;
2190
2190
  let ngZone;
2191
2191
  let appRef;
2192
+ /********************************************************************
2193
+ * CLEANUP SCHEDULER WITH:
2194
+ * - Significant watcher delta trigger (+/-)
2195
+ * - UI stabilization delay (1–2 seconds)
2196
+ * - Cooldown to prevent repeated scheduling
2197
+ ********************************************************************/
2198
+ const CLEANUP_TRIGGER_DELTA = 300; // watcher change threshold
2199
+ const CLEANUP_DELAY = 1500; // delay before running cleanup
2200
+ const CLEANUP_COOLDOWN = 4000; // prevent re-scheduling for 4s
2201
+ let lastWatcherCount = 0;
2202
+ let scheduledCleanup = null;
2203
+ let lastScheduledTime = 0;
2204
+ function getWatcherCount() {
2205
+ let count = 0;
2206
+ registry.forEach(bucket => count += bucket.size);
2207
+ return count;
2208
+ }
2209
+ const cleanupStaleWatchers = () => {
2210
+ // console.log(".........Cleaning up stale watchers...registry.size....", registry.size);
2211
+ let removed = 0;
2212
+ registry.forEach((bucket, widgetId) => {
2213
+ if (!document.querySelector(`[widget-id="${widgetId}"]`)) {
2214
+ for (const key in bucket) {
2215
+ if (bucket.hasOwnProperty(key) && key !== "scopeType" && key !== "scopeName" && typeof bucket[key] !== "function") {
2216
+ let watchInfo = bucket[key];
2217
+ if (watchInfo && watchInfo.destroyFn) {
2218
+ watchInfo.destroyFn();
2219
+ }
2220
+ }
2221
+ }
2222
+ removed++;
2223
+ registry.delete(widgetId);
2224
+ return;
2225
+ }
2226
+ });
2227
+ return removed;
2228
+ };
2229
+ const scheduleThresholdCleanup = () => {
2230
+ const now = performance.now();
2231
+ let lastTriggerPeriod = now - lastScheduledTime;
2232
+ // If a cleanup was scheduled recently, skip scheduling
2233
+ if (lastTriggerPeriod < CLEANUP_COOLDOWN) {
2234
+ return;
2235
+ }
2236
+ const current = getWatcherCount();
2237
+ const delta = Math.abs(current - lastWatcherCount); // significant + or -
2238
+ // If change not large enough, skip scheduling
2239
+ if (delta <= CLEANUP_TRIGGER_DELTA) {
2240
+ lastWatcherCount = current;
2241
+ return;
2242
+ }
2243
+ // Prevent re-scheduling: set timestamp early
2244
+ lastScheduledTime = now;
2245
+ // Clear previous scheduled cleanup (if any)
2246
+ if (scheduledCleanup) {
2247
+ clearTimeout(scheduledCleanup);
2248
+ }
2249
+ // Schedule cleanup after UI stabilizes (delay prevents aggressive cleanup)
2250
+ scheduledCleanup = setTimeout(() => {
2251
+ cleanupStaleWatchers();
2252
+ scheduledCleanup = null;
2253
+ }, CLEANUP_DELAY);
2254
+ lastWatcherCount = current;
2255
+ };
2192
2256
  // Utility functions
2193
2257
  const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
2194
2258
  const debounce = (fn, wait = DEBOUNCE_WAIT) => {
@@ -2252,7 +2316,7 @@ const getUpdatedWatchInfo = (expr, acceptsArray, listener) => {
2252
2316
  }
2253
2317
  const lastIndex = expr.lastIndexOf(ARRAY_INDEX_PLACEHOLDER);
2254
2318
  const baseExpr = expr.substring(0, lastIndex).replace(ARRAY_INDEX_PLACEHOLDER, ARRAY_INDEX_ZERO);
2255
- const restExpr = expr.substring(lastIndex + ARRAY_INDEX_PLACEHOLDER.length);
2319
+ const restExpr = expr.substring(lastIndex + 5);
2256
2320
  const arrayConsumerFn = restExpr
2257
2321
  ? arrayConsumer.bind(undefined, listener, restExpr)
2258
2322
  : listener;
@@ -2275,9 +2339,9 @@ const isStaticExpression = (expr) => {
2275
2339
  }
2276
2340
  const trimmedExpr = expr.trim();
2277
2341
  // Expressions that always evaluate to localization strings
2278
- if (trimmedExpr.includes('appLocale')) {
2279
- return true;
2280
- }
2342
+ // if (trimmedExpr.includes('appLocale')) {
2343
+ // return true;
2344
+ // }
2281
2345
  // Hard-coded static expression names
2282
2346
  if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
2283
2347
  return true;
@@ -2350,6 +2414,7 @@ const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.n
2350
2414
  const fn = $parseExpr(expr);
2351
2415
  const scopeType = getScopeType($scope);
2352
2416
  const scopeName = getScopeName($scope, scopeType);
2417
+ const destroyFn = () => $unwatch(identifier);
2353
2418
  const watchInfo = {
2354
2419
  fn: fn.bind(null, $scope, $locals),
2355
2420
  listener,
@@ -2358,7 +2423,8 @@ const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.n
2358
2423
  doNotClone,
2359
2424
  isMuted,
2360
2425
  scopeType,
2361
- scopeName
2426
+ scopeName,
2427
+ destroyFn
2362
2428
  };
2363
2429
  // Store in registry
2364
2430
  const widgetId = getWidgetId(identifier);
@@ -2373,7 +2439,7 @@ const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.n
2373
2439
  else {
2374
2440
  registry.set(identifier, watchInfo);
2375
2441
  }
2376
- return () => $unwatch(identifier);
2442
+ return destroyFn;
2377
2443
  };
2378
2444
  /**
2379
2445
  * Unwatches a single identifier
@@ -2383,6 +2449,7 @@ const $unwatch = (identifier) => {
2383
2449
  if (widgetId) {
2384
2450
  const propertyName = getPropertyName(identifier);
2385
2451
  const widgetGroup = registry.get(widgetId);
2452
+ //@ts-ignore
2386
2453
  if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
2387
2454
  const watchInfo = widgetGroup[propertyName];
2388
2455
  if (watchInfo) {
@@ -2523,6 +2590,8 @@ const triggerWatchers = (ignoreMuted = false) => {
2523
2590
  });
2524
2591
  pass++;
2525
2592
  } while (changeDetected && pass < MAX_WATCH_CYCLES);
2593
+ // Schedule cleanup after watchers are triggered
2594
+ scheduleThresholdCleanup();
2526
2595
  if (changeDetected && pass === MAX_WATCH_CYCLES) {
2527
2596
  console.warn(`Watch cycles exceeded limit of ${MAX_WATCH_CYCLES}`);
2528
2597
  }
@@ -2579,7 +2648,7 @@ const $appDigest = (() => {
2579
2648
  };
2580
2649
  })();
2581
2650
  // Export registry for debugging
2582
- // (window as any).watchRegistry = registry;
2651
+ window.watchRegistry = registry;
2583
2652
 
2584
2653
  var ComponentType;
2585
2654
  (function (ComponentType) {