@wavemaker/app-ng-runtime 11.14.1-6.6324 → 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 (50) hide show
  1. package/components/base/bundles/index.umd.js +74 -7
  2. package/components/base/esm2022/pipes/custom-pipes.mjs +1 -1
  3. package/components/base/esm2022/widgets/common/base/base.component.mjs +67 -7
  4. package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +4 -2
  5. package/components/base/esm2022/widgets/framework/property-change-handler.mjs +7 -2
  6. package/components/base/fesm2022/index.mjs +75 -8
  7. package/components/base/fesm2022/index.mjs.map +1 -1
  8. package/components/basic/label/bundles/index.umd.js +9 -1
  9. package/components/basic/label/esm2022/label.directive.mjs +10 -2
  10. package/components/basic/label/fesm2022/index.mjs +9 -1
  11. package/components/basic/label/fesm2022/index.mjs.map +1 -1
  12. package/components/data/pagination/bundles/index.umd.js +4 -0
  13. package/components/data/pagination/esm2022/pagination.component.mjs +5 -1
  14. package/components/data/pagination/fesm2022/index.mjs +4 -0
  15. package/components/data/pagination/fesm2022/index.mjs.map +1 -1
  16. package/components/data/table/bundles/index.umd.js +226 -13
  17. package/components/data/table/esm2022/table-cud.directive.mjs +2 -2
  18. package/components/data/table/esm2022/table-filter.directive.mjs +8 -2
  19. package/components/data/table/esm2022/table.component.mjs +219 -12
  20. package/components/data/table/fesm2022/index.mjs +226 -13
  21. package/components/data/table/fesm2022/index.mjs.map +1 -1
  22. package/components/data/table/table.component.d.ts +6 -2
  23. package/components/navigation/menu/bundles/index.umd.js +5 -0
  24. package/components/navigation/menu/esm2022/menu.component.mjs +6 -1
  25. package/components/navigation/menu/fesm2022/index.mjs +5 -0
  26. package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  27. package/components/navigation/popover/bundles/index.umd.js +6 -6
  28. package/components/navigation/popover/esm2022/popover.component.mjs +4 -4
  29. package/components/navigation/popover/fesm2022/index.mjs +3 -3
  30. package/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  31. package/components/navigation/popover/popover.component.d.ts +6 -0
  32. package/core/bundles/index.umd.js +395 -82
  33. package/core/esm2022/public_api.mjs +2 -2
  34. package/core/esm2022/utils/watcher.mjs +392 -81
  35. package/core/fesm2022/index.mjs +395 -84
  36. package/core/fesm2022/index.mjs.map +1 -1
  37. package/core/public_api.d.ts +1 -1
  38. package/core/utils/watcher.d.ts +28 -5
  39. package/npm-shrinkwrap.json +2 -2
  40. package/package-lock.json +2 -2
  41. package/package.json +1 -1
  42. package/runtime/base/bundles/index.umd.js +20 -0
  43. package/runtime/base/esm2022/components/app-component/app.component.mjs +4 -2
  44. package/runtime/base/esm2022/components/base-page.component.mjs +6 -2
  45. package/runtime/base/esm2022/components/base-partial.component.mjs +7 -2
  46. package/runtime/base/esm2022/components/base-prefab.component.mjs +7 -2
  47. package/runtime/base/esm2022/components/base-spa-page.component.mjs +6 -2
  48. package/runtime/base/fesm2022/index.mjs +21 -1
  49. package/runtime/base/fesm2022/index.mjs.map +1 -1
  50. package/scripts/datatable/datatable.js +34 -2
@@ -1450,11 +1450,11 @@
1450
1450
  }
1451
1451
  };
1452
1452
 
1453
- const $RAF$1 = window.requestAnimationFrame;
1453
+ const $RAF = window.requestAnimationFrame;
1454
1454
  const $RAFQueue = [];
1455
1455
  const invokeLater = fn => {
1456
1456
  if (!$RAFQueue.length) {
1457
- $RAF$1(() => {
1457
+ $RAF(() => {
1458
1458
  $RAFQueue.forEach(f => f());
1459
1459
  $RAFQueue.length = 0;
1460
1460
  });
@@ -2191,14 +2191,89 @@
2191
2191
  return fnExecutor(expr, ExpressionType.Action);
2192
2192
  };
2193
2193
 
2194
+ // Constants
2195
+ const WIDGET_ID_REGEX = /^(widget-[^_]+)/;
2196
+ const WIDGET_PROPERTY_REGEX = /^widget-[^_]+_(.+)$/;
2197
+ const ARRAY_INDEX_PLACEHOLDER = '[$i]';
2198
+ const ARRAY_INDEX_ZERO = '[0]';
2199
+ const DEBOUNCE_WAIT = 100;
2200
+ const MAX_WATCH_CYCLES = 5;
2194
2201
  const registry = new Map();
2195
2202
  const watchIdGenerator = new IDGenerator('watch-id-');
2196
- const FIRST_TIME_WATCH = {};
2197
- Object.freeze(FIRST_TIME_WATCH);
2198
- const isFirstTimeChange = v => v === FIRST_TIME_WATCH;
2203
+ const FIRST_TIME_WATCH = Object.freeze({});
2204
+ // State
2199
2205
  let muted = false;
2206
+ let changedByWatch = false;
2207
+ let skipWatchers = false;
2208
+ let ngZone;
2200
2209
  let appRef;
2201
- const debounce = (fn, wait = 50) => {
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
+ };
2274
+ // Utility functions
2275
+ const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
2276
+ const debounce = (fn, wait = DEBOUNCE_WAIT) => {
2202
2277
  let timeout;
2203
2278
  return (...args) => {
2204
2279
  window['__zone_symbol__clearTimeout'](timeout);
@@ -2212,115 +2287,350 @@
2212
2287
  muted = false;
2213
2288
  triggerWatchers();
2214
2289
  };
2290
+ /**
2291
+ * Extracts widget ID from identifier (e.g., "widget-id23_eventsource" -> "widget-id23")
2292
+ */
2293
+ const getWidgetId = (identifier) => {
2294
+ if (!identifier || typeof identifier !== 'string') {
2295
+ return null;
2296
+ }
2297
+ const match = identifier.match(WIDGET_ID_REGEX);
2298
+ return match ? match[1] : null;
2299
+ };
2300
+ /**
2301
+ * Extracts property name from identifier (e.g., "widget-id23_eventsource" -> "eventsource")
2302
+ */
2303
+ const getPropertyName = (identifier) => {
2304
+ if (!identifier || typeof identifier !== 'string') {
2305
+ return identifier;
2306
+ }
2307
+ const match = identifier.match(WIDGET_PROPERTY_REGEX);
2308
+ return match ? match[1] : identifier;
2309
+ };
2310
+ /**
2311
+ * Array consumer wrapper for array-based expressions
2312
+ */
2215
2313
  const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
2216
- let data = newVal, formattedData;
2217
- if (lodashEs.isArray(data)) {
2218
- formattedData = data.map(function (datum) {
2219
- return findValueOf(datum, restExpr);
2220
- });
2221
- // If resulting structure is an array of array, flatten it
2222
- if (lodashEs.isArray(formattedData[0])) {
2223
- formattedData = lodashEs.flatten(formattedData);
2224
- }
2225
- listenerFn(formattedData, oldVal);
2314
+ if (!lodashEs.isArray(newVal)) {
2315
+ return;
2316
+ }
2317
+ let formattedData = newVal.map(datum => findValueOf(datum, restExpr));
2318
+ // Flatten if result is array of arrays
2319
+ if (lodashEs.isArray(formattedData[0])) {
2320
+ formattedData = lodashEs.flatten(formattedData);
2226
2321
  }
2322
+ listenerFn(formattedData, oldVal);
2227
2323
  };
2228
- const getUpdatedWatcInfo = (expr, acceptsArray, listener) => {
2229
- // listener doesn't accept array
2230
- // replace all `[$i]` with `[0]` and return the expression
2231
- let regex = /\[\$i\]/g, $I = '[$i]', $0 = '[0]';
2324
+ /**
2325
+ * Updates watch info for array expressions
2326
+ */
2327
+ const getUpdatedWatchInfo = (expr, acceptsArray, listener) => {
2328
+ const regex = /\[\$i\]/g;
2232
2329
  if (!acceptsArray) {
2233
2330
  return {
2234
- 'expr': expr.replace(regex, $0),
2235
- 'listener': listener
2331
+ expr: expr.replace(regex, ARRAY_INDEX_ZERO),
2332
+ listener
2236
2333
  };
2237
2334
  }
2238
- // listener accepts array
2239
- // replace all except the last `[$i]` with `[0]` and return the expression.
2240
- var index = expr.lastIndexOf($I), _expr = expr.substr(0, index).replace($I, $0), restExpr = expr.substr(index + 5), arrayConsumerFn = listener;
2241
- if (restExpr) {
2242
- arrayConsumerFn = arrayConsumer.bind(undefined, listener, restExpr);
2243
- }
2335
+ const lastIndex = expr.lastIndexOf(ARRAY_INDEX_PLACEHOLDER);
2336
+ const baseExpr = expr.substring(0, lastIndex).replace(ARRAY_INDEX_PLACEHOLDER, ARRAY_INDEX_ZERO);
2337
+ const restExpr = expr.substring(lastIndex + 5);
2338
+ const arrayConsumerFn = restExpr
2339
+ ? arrayConsumer.bind(undefined, listener, restExpr)
2340
+ : listener;
2244
2341
  return {
2245
- 'expr': _expr,
2246
- 'listener': arrayConsumerFn
2342
+ expr: baseExpr,
2343
+ listener: arrayConsumerFn
2247
2344
  };
2248
2345
  };
2346
+ /**
2347
+ * Determines if an expression is static (doesn't need to be watched)
2348
+ */
2349
+ const STATIC_EXPRESSION_NAMES = [
2350
+ "row.getProperty('investment')",
2351
+ "row.getProperty('factsheetLink')",
2352
+ "row.getProperty('isRebalanceEligible')"
2353
+ ];
2354
+ const isStaticExpression = (expr) => {
2355
+ if (typeof expr !== 'string') {
2356
+ return false;
2357
+ }
2358
+ const trimmedExpr = expr.trim();
2359
+ // Expressions that always evaluate to localization strings
2360
+ // if (trimmedExpr.includes('appLocale')) {
2361
+ // return true;
2362
+ // }
2363
+ // Hard-coded static expression names
2364
+ if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
2365
+ return true;
2366
+ }
2367
+ return false;
2368
+ };
2369
+ /**
2370
+ * Gets the scope type from the scope object
2371
+ */
2372
+ const getScopeType = ($scope) => {
2373
+ if (!$scope) {
2374
+ return null;
2375
+ }
2376
+ if ($scope.pageName)
2377
+ return 'Page';
2378
+ if ($scope.prefabName)
2379
+ return 'Prefab';
2380
+ if ($scope.partialName)
2381
+ return 'Partial';
2382
+ // Check for App scope
2383
+ if ($scope.Variables !== undefined &&
2384
+ $scope.Actions !== undefined &&
2385
+ !$scope.pageName &&
2386
+ !$scope.prefabName &&
2387
+ !$scope.partialName) {
2388
+ return 'App';
2389
+ }
2390
+ if ($scope.constructor?.name === 'AppRef') {
2391
+ return 'App';
2392
+ }
2393
+ return null;
2394
+ };
2395
+ /**
2396
+ * Gets scope name based on scope type
2397
+ */
2398
+ const getScopeName = ($scope, scopeType) => {
2399
+ if (!scopeType || !$scope) {
2400
+ return null;
2401
+ }
2402
+ switch (scopeType) {
2403
+ case 'Prefab': return $scope.prefabName || null;
2404
+ case 'Partial': return $scope.partialName || null;
2405
+ case 'Page': return $scope.pageName || null;
2406
+ default: return null;
2407
+ }
2408
+ };
2409
+ /**
2410
+ * Main watch function
2411
+ */
2249
2412
  const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.nextUid(), doNotClone = false, config = {}, isMuted) => {
2250
- if (expr.indexOf('[$i]') !== -1) {
2251
- let watchInfo = getUpdatedWatcInfo(expr, config && (config.arrayType || config.isList), listener);
2413
+ // Handle array expressions
2414
+ if (expr.includes(ARRAY_INDEX_PLACEHOLDER)) {
2415
+ const watchInfo = getUpdatedWatchInfo(expr, config.arrayType || config.isList || false, listener);
2252
2416
  expr = watchInfo.expr;
2253
2417
  listener = watchInfo.listener;
2254
2418
  }
2419
+ // Handle static expressions
2420
+ if (isStaticExpression(expr)) {
2421
+ try {
2422
+ const fn = $parseExpr(expr);
2423
+ const staticValue = fn($scope, $locals);
2424
+ listener(staticValue, FIRST_TIME_WATCH);
2425
+ }
2426
+ catch (e) {
2427
+ console.warn(`Error evaluating static expression '${expr}':`, e);
2428
+ listener(undefined, FIRST_TIME_WATCH);
2429
+ }
2430
+ return () => { }; // No-op unsubscribe
2431
+ }
2255
2432
  const fn = $parseExpr(expr);
2256
- registry.set(identifier, {
2257
- fn: fn.bind(expr, $scope, $locals),
2433
+ const scopeType = getScopeType($scope);
2434
+ const scopeName = getScopeName($scope, scopeType);
2435
+ const destroyFn = () => $unwatch(identifier);
2436
+ const watchInfo = {
2437
+ fn: fn.bind(null, $scope, $locals),
2258
2438
  listener,
2259
2439
  expr,
2260
2440
  last: FIRST_TIME_WATCH,
2261
2441
  doNotClone,
2262
- isMuted: isMuted
2442
+ isMuted,
2443
+ scopeType,
2444
+ scopeName,
2445
+ destroyFn
2446
+ };
2447
+ // Store in registry
2448
+ const widgetId = getWidgetId(identifier);
2449
+ if (widgetId) {
2450
+ const propertyName = getPropertyName(identifier);
2451
+ if (!registry.has(widgetId)) {
2452
+ registry.set(widgetId, {});
2453
+ }
2454
+ const widgetGroup = registry.get(widgetId);
2455
+ widgetGroup[propertyName] = watchInfo;
2456
+ }
2457
+ else {
2458
+ registry.set(identifier, watchInfo);
2459
+ }
2460
+ return destroyFn;
2461
+ };
2462
+ /**
2463
+ * Unwatches a single identifier
2464
+ */
2465
+ const $unwatch = (identifier) => {
2466
+ const widgetId = getWidgetId(identifier);
2467
+ if (widgetId) {
2468
+ const propertyName = getPropertyName(identifier);
2469
+ const widgetGroup = registry.get(widgetId);
2470
+ //@ts-ignore
2471
+ if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
2472
+ const watchInfo = widgetGroup[propertyName];
2473
+ if (watchInfo) {
2474
+ delete widgetGroup[propertyName];
2475
+ // Clean up empty widget groups
2476
+ if (Object.keys(widgetGroup).length === 0) {
2477
+ registry.delete(widgetId);
2478
+ }
2479
+ return true;
2480
+ }
2481
+ }
2482
+ }
2483
+ // Fallback to direct lookup
2484
+ if (registry.has(identifier)) {
2485
+ registry.delete(identifier);
2486
+ return true;
2487
+ }
2488
+ return false;
2489
+ };
2490
+ /**
2491
+ * Unwatches all watchers for a specific widget ID
2492
+ */
2493
+ const $unwatchAll = (widgetId) => {
2494
+ if (!widgetId || typeof widgetId !== 'string') {
2495
+ return 0;
2496
+ }
2497
+ const widgetGroup = registry.get(widgetId);
2498
+ if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
2499
+ const count = Object.keys(widgetGroup).length;
2500
+ registry.delete(widgetId);
2501
+ return count;
2502
+ }
2503
+ // Fallback: find all identifiers starting with this widget ID
2504
+ let removedCount = 0;
2505
+ const identifiersToRemove = [];
2506
+ registry.forEach((_, key) => {
2507
+ if (key.startsWith(widgetId + '_')) {
2508
+ identifiersToRemove.push(key);
2509
+ }
2263
2510
  });
2264
- return () => $unwatch(identifier);
2511
+ identifiersToRemove.forEach(identifier => {
2512
+ if ($unwatch(identifier)) {
2513
+ removedCount++;
2514
+ }
2515
+ });
2516
+ return removedCount;
2265
2517
  };
2266
- const $unwatch = identifier => registry.delete(identifier);
2267
- let changedByWatch = false;
2268
- const $RAF = window.requestAnimationFrame;
2269
- let ngZone;
2270
- const triggerWatchers = (ignoreMuted) => {
2518
+ /**
2519
+ * Unwatches all watchers for a specific scope (Page, Prefab, Partial, or App)
2520
+ * Now works directly with the main registry instead of separate scoped registries
2521
+ */
2522
+ const $unwatchAllByScope = (scopeType, scopeName) => {
2523
+ if (!scopeType) {
2524
+ return 0;
2525
+ }
2526
+ let removedCount = 0;
2527
+ const identifiersToRemove = [];
2528
+ registry.forEach((value, key) => {
2529
+ // Handle grouped structure (widget groups)
2530
+ if (value && typeof value === 'object' && !value.fn) {
2531
+ Object.entries(value).forEach(([propertyName, watchInfo]) => {
2532
+ if (watchInfo?.scopeType === scopeType &&
2533
+ (!scopeName || watchInfo.scopeName === scopeName)) {
2534
+ identifiersToRemove.push(`${key}_${propertyName}`);
2535
+ }
2536
+ });
2537
+ }
2538
+ else {
2539
+ // Direct watchInfo
2540
+ const watchInfo = value;
2541
+ if (watchInfo?.scopeType === scopeType &&
2542
+ (!scopeName || watchInfo.scopeName === scopeName)) {
2543
+ identifiersToRemove.push(key);
2544
+ }
2545
+ }
2546
+ });
2547
+ // Unwatch all collected identifiers
2548
+ identifiersToRemove.forEach(identifier => {
2549
+ if ($unwatch(identifier)) {
2550
+ removedCount++;
2551
+ }
2552
+ });
2553
+ return removedCount;
2554
+ };
2555
+ /**
2556
+ * Processes a single watch info during trigger cycle
2557
+ */
2558
+ const processWatchInfo = (watchInfo) => {
2559
+ if (!watchInfo?.fn || (watchInfo.isMuted?.() ?? false)) {
2560
+ return false;
2561
+ }
2562
+ let newValue;
2563
+ try {
2564
+ newValue = watchInfo.fn();
2565
+ }
2566
+ catch (e) {
2567
+ console.warn(`Error executing expression: '${watchInfo.expr}'`, e);
2568
+ return false;
2569
+ }
2570
+ if (lodashEs.isEqual(newValue, watchInfo.last)) {
2571
+ return false;
2572
+ }
2573
+ // Change detected
2574
+ changedByWatch = true;
2575
+ watchInfo.last = lodashEs.isObject(newValue) && !watchInfo.doNotClone
2576
+ ? lodashEs.clone(newValue)
2577
+ : newValue;
2578
+ watchInfo.listener(newValue, watchInfo.last === newValue ? FIRST_TIME_WATCH : watchInfo.last);
2579
+ changedByWatch = false;
2580
+ return true;
2581
+ };
2582
+ /**
2583
+ * Triggers all watchers
2584
+ */
2585
+ const triggerWatchers = (ignoreMuted = false) => {
2271
2586
  if (muted && !ignoreMuted) {
2272
2587
  return;
2273
2588
  }
2274
- const limit = 5;
2275
2589
  let pass = 1;
2276
2590
  let changeDetected;
2277
2591
  do {
2278
2592
  changeDetected = false;
2279
- registry.forEach(watchInfo => {
2280
- if (watchInfo.isMuted && watchInfo.isMuted()) {
2281
- return;
2282
- }
2283
- const fn = watchInfo.fn;
2284
- const listener = watchInfo.listener;
2285
- const ov = watchInfo.last;
2286
- let nv;
2287
- try {
2288
- nv = fn();
2289
- }
2290
- catch (e) {
2291
- console.warn(`error in executing expression: '${watchInfo.expr}'`);
2593
+ registry.forEach((value) => {
2594
+ // Handle grouped structure
2595
+ if (value && typeof value === 'object' && !value.fn) {
2596
+ Object.values(value).forEach((watchInfo) => {
2597
+ if (processWatchInfo(watchInfo)) {
2598
+ changeDetected = true;
2599
+ }
2600
+ });
2292
2601
  }
2293
- if (!lodashEs.isEqual(nv, ov)) {
2294
- changeDetected = true;
2295
- changedByWatch = true;
2296
- watchInfo.last = nv;
2297
- // @ts-ignore
2298
- if (lodashEs.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
2299
- watchInfo.last = lodashEs.clone(nv);
2602
+ else {
2603
+ // Direct watchInfo
2604
+ if (processWatchInfo(value)) {
2605
+ changeDetected = true;
2300
2606
  }
2301
- listener(nv, ov);
2302
- resetChangeFromWatch();
2303
2607
  }
2304
2608
  });
2305
2609
  pass++;
2306
- } while (changeDetected && pass < limit);
2307
- if (changeDetected && pass === limit) {
2308
- console.warn(`Number of watch cycles gone above set limit of: ${limit} `);
2610
+ } while (changeDetected && pass < MAX_WATCH_CYCLES);
2611
+ // Schedule cleanup after watchers are triggered
2612
+ scheduleThresholdCleanup();
2613
+ if (changeDetected && pass === MAX_WATCH_CYCLES) {
2614
+ console.warn(`Watch cycles exceeded limit of ${MAX_WATCH_CYCLES}`);
2309
2615
  }
2310
2616
  };
2311
- const setNgZone = zone => ngZone = zone;
2312
- const setAppRef = ref => {
2617
+ // Angular zone integration
2618
+ const setNgZone = (zone) => {
2619
+ ngZone = zone;
2620
+ };
2621
+ const setAppRef = (ref) => {
2313
2622
  appRef = ref;
2314
2623
  };
2315
2624
  const isChangeFromWatch = () => changedByWatch;
2316
- const resetChangeFromWatch = () => changedByWatch = false;
2317
- window.watchRegistry = registry;
2318
- let skipWatchers;
2625
+ const resetChangeFromWatch = () => {
2626
+ changedByWatch = false;
2627
+ };
2628
+ // Debounced trigger
2319
2629
  const debouncedTriggerWatchers = debounce(() => {
2320
2630
  skipWatchers = true;
2321
2631
  ngZone.run(() => triggerWatchers());
2322
- }, 100);
2323
- const $invokeWatchers = (force, ignoreMuted) => {
2632
+ }, DEBOUNCE_WAIT);
2633
+ const $invokeWatchers = (force = false, ignoreMuted = false) => {
2324
2634
  if (force) {
2325
2635
  triggerWatchers(ignoreMuted);
2326
2636
  }
@@ -2334,7 +2644,8 @@
2334
2644
  };
2335
2645
  const $appDigest = (() => {
2336
2646
  let queued = false;
2337
- return (force) => {
2647
+ const $RAF = window.requestAnimationFrame;
2648
+ return (force = false) => {
2338
2649
  if (!appRef) {
2339
2650
  return;
2340
2651
  }
@@ -2346,16 +2657,16 @@
2346
2657
  if (queued) {
2347
2658
  return;
2348
2659
  }
2349
- else {
2350
- queued = true;
2351
- $RAF(() => {
2352
- ngZone.run(() => appRef.tick());
2353
- queued = false;
2354
- });
2355
- }
2660
+ queued = true;
2661
+ $RAF(() => {
2662
+ ngZone.run(() => appRef.tick());
2663
+ queued = false;
2664
+ });
2356
2665
  }
2357
2666
  };
2358
2667
  })();
2668
+ // Export registry for debugging
2669
+ window.watchRegistry = registry;
2359
2670
 
2360
2671
  exports.ComponentType = void 0;
2361
2672
  (function (ComponentType) {
@@ -5164,6 +5475,8 @@
5164
5475
  exports.$parseEvent = $parseEvent;
5165
5476
  exports.$parseExpr = $parseExpr;
5166
5477
  exports.$unwatch = $unwatch;
5478
+ exports.$unwatchAll = $unwatchAll;
5479
+ exports.$unwatchAllByScope = $unwatchAllByScope;
5167
5480
  exports.$watch = $watch;
5168
5481
  exports.AbstractDialogService = AbstractDialogService;
5169
5482
  exports.AbstractHttpService = AbstractHttpService;
@@ -8,7 +8,7 @@ export * from './enums/enums';
8
8
  export * from './utils/event-notifier';
9
9
  export { $parseExpr, $parseEvent, registerFnByExpr, setPipeProvider, getFnByExpr, getFnForBindExpr, getFnForEventExpr } from './utils/expression-parser';
10
10
  export { isDefined, isObject, toBoolean, isIE, isAndroid, isAndroidTablet, isIphone, isIpod, isIpad, isIos, isSafari, isLargeTabletLandscape, isLargeTabletPortrait, isMobile, getAndroidVersion, isKitkatDevice, encodeUrl, encodeUrlParams, initCaps, spaceSeparate, replaceAt, periodSeparate, prettifyLabel, deHyphenate, prettifyLabels, isInsecureContentRequest, stringStartsWith, getEvaluatedExprValue, isImageFile, isAudioFile, isVideoFile, isValidImageUrl, isValidWebURL, getResourceURL, triggerFn, hasOffsetStr, getFormattedDate, getDateObj, addEventListenerOnElement, getClonedObject, getFiles, generateGUId, validateAccessRoles, getValidJSON, xmlToJson, findValueOf, extractType, isNumberType, isEmptyObject, scrollToElement, isElementInViewport, isPageable, replace, isDateTimeType, getValidDateObject, getNativeDateObject, getBlob, isEqualWithFields, loadStyleSheet, loadStyleSheets, loadScript, loadScripts, _WM_APP_PROJECT, setSessionStorageItem, getSessionStorageItem, noop, convertToBlob, AppConstants, openLink, fetchContent, toPromise, retryIfFails, getAbortableDefer, createCSSRule, getUrlParams, getMomentLocaleObject, getRouteNameFromLink, isAppleProduct, defer, executePromiseChain, isDataSourceEqual, validateDataSourceCtx, processFilterExpBindNode, extendProto, removeExtraSlashes, getDisplayDateTimeFormat, addForIdAttributes, adjustContainerPosition, adjustContainerRightEdges, setTranslation3dPosition, getWebkitTraslationMatrix, closePopover, detectChanges, triggerItemAction, getDatasourceFromExpr, extractCurrentItemExpr, findRootContainer, VALIDATOR, transformFileURI, appendScriptToHead, getAppSetting, setListClass, findParent, getNavClass, getSheetPositionClass } from './utils/utils';
11
- export { FIRST_TIME_WATCH, isFirstTimeChange, debounce, muteWatchers, unMuteWatchers, $watch, $unwatch, setNgZone, setAppRef, isChangeFromWatch, resetChangeFromWatch, $invokeWatchers, $appDigest } from './utils/watcher';
11
+ export { FIRST_TIME_WATCH, isFirstTimeChange, debounce, muteWatchers, unMuteWatchers, $watch, $unwatch, $unwatchAll, $unwatchAllByScope, setNgZone, setAppRef, isChangeFromWatch, resetChangeFromWatch, $invokeWatchers, $appDigest } from './utils/watcher';
12
12
  export * from './utils/id-generator';
13
13
  export * from './types/types';
14
14
  export { Viewport } from './services/viewport.service';
@@ -23,4 +23,4 @@ export { StatePersistence } from './services/state-persistence.service';
23
23
  export { PaginationService } from './services/pagination.service';
24
24
  export * from './utils/wm-project-properties';
25
25
  export * from './utils/lru-cache';
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsT0FBTyxFQUNILFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLFdBQVcsRUFDWCxXQUFXLEVBQ1gsTUFBTSxFQUNOLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsYUFBYSxFQUNiLFdBQVcsRUFDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFFSCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDcEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBRUgsU0FBUyxFQUNULFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixhQUFhLEVBQ2IsY0FBYyxFQUNkLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLFlBQVksRUFDWixTQUFTLEVBQ1QsV0FBVyxFQUNYLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLE9BQU8sRUFDUCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osYUFBYSxFQUNiLFlBQVksRUFDWixRQUFRLEVBQ1IsWUFBWSxFQUNaLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsS0FBSyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLFlBQVksRUFDWixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxxQkFBcUIsRUFDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFlBQVksRUFDWixjQUFjLEVBQ2QsTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixFQUNqQixvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLFVBQVUsRUFDYixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxlQUFlLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBaUIsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgY29yZVxuICovXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2J1aWxkLXV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzL2N1cnJlbmN5LWNvbnN0YW50cyc7XG5leHBvcnQge1xuICAgIGFwcGVuZE5vZGUsXG4gICAgaW5zZXJ0QmVmb3JlLFxuICAgIGluc2VydEFmdGVyLFxuICAgIHJlbW92ZU5vZGUsXG4gICAgcmVtb3ZlQ2xhc3MsXG4gICAgYWRkQ2xhc3MsXG4gICAgc3dpdGNoQ2xhc3MsXG4gICAgdG9nZ2xlQ2xhc3MsXG4gICAgc2V0Q1NTLFxuICAgIHNldENTU0Zyb21PYmosXG4gICAgc2V0UHJvcGVydHksXG4gICAgc2V0QXR0cixcbiAgICBzZXRIdG1sLFxuICAgIHJlbW92ZUF0dHIsXG4gICAgY3JlYXRlRWxlbWVudCxcbiAgICB0b0RpbWVuc2lvblxufSBmcm9tICcuL3V0aWxzL2RvbSc7XG5leHBvcnQgKiBmcm9tICcuL2VudW1zL2VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvZXZlbnQtbm90aWZpZXInO1xuZXhwb3J0IHtcbiAgICBQYXJzZUV4cHJSZXN1bHQsXG4gICAgJHBhcnNlRXhwcixcbiAgICAkcGFyc2VFdmVudCxcbiAgICByZWdpc3RlckZuQnlFeHByLFxuICAgIHNldFBpcGVQcm92aWRlcixcbiAgICBnZXRGbkJ5RXhwcixcbiAgICBnZXRGbkZvckJpbmRFeHByLFxuICAgIGdldEZuRm9yRXZlbnRFeHByXG59IGZyb20gJy4vdXRpbHMvZXhwcmVzc2lvbi1wYXJzZXInO1xuZXhwb3J0IHtcbiAgICBFVkVOVF9MSUZFLFxuICAgIGlzRGVmaW5lZCxcbiAgICBpc09iamVjdCxcbiAgICB0b0Jvb2xlYW4sXG4gICAgaXNJRSxcbiAgICBpc0FuZHJvaWQsXG4gICAgaXNBbmRyb2lkVGFibGV0LFxuICAgIGlzSXBob25lLFxuICAgIGlzSXBvZCxcbiAgICBpc0lwYWQsXG4gICAgaXNJb3MsXG4gICAgaXNTYWZhcmksXG4gICAgaXNMYXJnZVRhYmxldExhbmRzY2FwZSxcbiAgICBpc0xhcmdlVGFibGV0UG9ydHJhaXQsXG4gICAgaXNNb2JpbGUsXG4gICAgZ2V0QW5kcm9pZFZlcnNpb24sXG4gICAgaXNLaXRrYXREZXZpY2UsXG4gICAgZW5jb2RlVXJsLFxuICAgIGVuY29kZVVybFBhcmFtcyxcbiAgICBpbml0Q2FwcyxcbiAgICBzcGFjZVNlcGFyYXRlLFxuICAgIHJlcGxhY2VBdCxcbiAgICBwZXJpb2RTZXBhcmF0ZSxcbiAgICBwcmV0dGlmeUxhYmVsLFxuICAgIGRlSHlwaGVuYXRlLFxuICAgIHByZXR0aWZ5TGFiZWxzLFxuICAgIGlzSW5zZWN1cmVDb250ZW50UmVxdWVzdCxcbiAgICBzdHJpbmdTdGFydHNXaXRoLFxuICAgIGdldEV2YWx1YXRlZEV4cHJWYWx1ZSxcbiAgICBpc0ltYWdlRmlsZSxcbiAgICBpc0F1ZGlvRmlsZSxcbiAgICBpc1ZpZGVvRmlsZSxcbiAgICBpc1ZhbGlkSW1hZ2VVcmwsXG4gICAgaXNWYWxpZFdlYlVSTCxcbiAgICBnZXRSZXNvdXJjZVVSTCxcbiAgICB0cmlnZ2VyRm4sXG4gICAgaGFzT2Zmc2V0U3RyLFxuICAgIGdldEZvcm1hdHRlZERhdGUsXG4gICAgZ2V0RGF0ZU9iaixcbiAgICBhZGRFdmVudExpc3RlbmVyT25FbGVtZW50LFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBnZXRGaWxlcyxcbiAgICBnZW5lcmF0ZUdVSWQsXG4gICAgdmFsaWRhdGVBY2Nlc3NSb2xlcyxcbiAgICBnZXRWYWxpZEpTT04sXG4gICAgeG1sVG9Kc29uLFxuICAgIGZpbmRWYWx1ZU9mLFxuICAgIGV4dHJhY3RUeXBlLFxuICAgIGlzTnVtYmVyVHlwZSxcbiAgICBpc0VtcHR5T2JqZWN0LFxuICAgIHNjcm9sbFRvRWxlbWVudCxcbiAgICBpc0VsZW1lbnRJblZpZXdwb3J0LFxuICAgIGlzUGFnZWFibGUsXG4gICAgcmVwbGFjZSxcbiAgICBpc0RhdGVUaW1lVHlwZSxcbiAgICBnZXRWYWxpZERhdGVPYmplY3QsXG4gICAgZ2V0TmF0aXZlRGF0ZU9iamVjdCxcbiAgICBnZXRCbG9iLFxuICAgIGlzRXF1YWxXaXRoRmllbGRzLFxuICAgIGxvYWRTdHlsZVNoZWV0LFxuICAgIGxvYWRTdHlsZVNoZWV0cyxcbiAgICBsb2FkU2NyaXB0LFxuICAgIGxvYWRTY3JpcHRzLFxuICAgIF9XTV9BUFBfUFJPSkVDVCxcbiAgICBzZXRTZXNzaW9uU3RvcmFnZUl0ZW0sXG4gICAgZ2V0U2Vzc2lvblN0b3JhZ2VJdGVtLFxuICAgIG5vb3AsXG4gICAgY29udmVydFRvQmxvYixcbiAgICBBcHBDb25zdGFudHMsXG4gICAgb3BlbkxpbmssXG4gICAgZmV0Y2hDb250ZW50LFxuICAgIHRvUHJvbWlzZSxcbiAgICByZXRyeUlmRmFpbHMsXG4gICAgZ2V0QWJvcnRhYmxlRGVmZXIsXG4gICAgY3JlYXRlQ1NTUnVsZSxcbiAgICBnZXRVcmxQYXJhbXMsXG4gICAgZ2V0TW9tZW50TG9jYWxlT2JqZWN0LFxuICAgIGdldFJvdXRlTmFtZUZyb21MaW5rLFxuICAgIGlzQXBwbGVQcm9kdWN0LFxuICAgIGRlZmVyLFxuICAgIGV4ZWN1dGVQcm9taXNlQ2hhaW4sXG4gICAgaXNEYXRhU291cmNlRXF1YWwsXG4gICAgdmFsaWRhdGVEYXRhU291cmNlQ3R4LFxuICAgIHByb2Nlc3NGaWx0ZXJFeHBCaW5kTm9kZSxcbiAgICBleHRlbmRQcm90byxcbiAgICByZW1vdmVFeHRyYVNsYXNoZXMsXG4gICAgZ2V0RGlzcGxheURhdGVUaW1lRm9ybWF0LFxuICAgIGFkZEZvcklkQXR0cmlidXRlcyxcbiAgICBhZGp1c3RDb250YWluZXJQb3NpdGlvbixcbiAgICBhZGp1c3RDb250YWluZXJSaWdodEVkZ2VzLFxuICAgIHNldFRyYW5zbGF0aW9uM2RQb3NpdGlvbixcbiAgICBnZXRXZWJraXRUcmFzbGF0aW9uTWF0cml4LFxuICAgIGNsb3NlUG9wb3ZlcixcbiAgICBkZXRlY3RDaGFuZ2VzLFxuICAgIHRyaWdnZXJJdGVtQWN0aW9uLFxuICAgIGdldERhdGFzb3VyY2VGcm9tRXhwcixcbiAgICBleHRyYWN0Q3VycmVudEl0ZW1FeHByLFxuICAgIGZpbmRSb290Q29udGFpbmVyLFxuICAgIFZBTElEQVRPUixcbiAgICB0cmFuc2Zvcm1GaWxlVVJJLFxuICAgIGFwcGVuZFNjcmlwdFRvSGVhZCxcbiAgICBnZXRBcHBTZXR0aW5nLFxuICAgIHNldExpc3RDbGFzcyxcbiAgICBmaW5kUGFyZW50LFxuICAgIGdldE5hdkNsYXNzLFxuICAgIGdldFNoZWV0UG9zaXRpb25DbGFzc1xufSBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmV4cG9ydCB7XG4gICAgRklSU1RfVElNRV9XQVRDSCxcbiAgICBpc0ZpcnN0VGltZUNoYW5nZSxcbiAgICBkZWJvdW5jZSxcbiAgICBtdXRlV2F0Y2hlcnMsXG4gICAgdW5NdXRlV2F0Y2hlcnMsXG4gICAgJHdhdGNoLFxuICAgICR1bndhdGNoLFxuICAgIHNldE5nWm9uZSxcbiAgICBzZXRBcHBSZWYsXG4gICAgaXNDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgcmVzZXRDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgICRhcHBEaWdlc3Rcbn0gZnJvbSAnLi91dGlscy93YXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvaWQtZ2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0IHsgVmlld3BvcnQsIFZpZXdwb3J0RXZlbnQgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jb25zdGFudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXR5cGUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXdpZGdldC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXNlci1jdXN0b20tcGlwZS1tYW5hZ2VyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jdXN0b20taWNvbnMtbG9hZGVyLnNlcnZpY2UnO1xuZXhwb3J0IHsgU3RhdGVQZXJzaXN0ZW5jZSB9IGZyb20gJy4vc2VydmljZXMvc3RhdGUtcGVyc2lzdGVuY2Uuc2VydmljZSc7XG5leHBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcGFnaW5hdGlvbi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvd20tcHJvamVjdC1wcm9wZXJ0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvbHJ1LWNhY2hlJztcbiJdfQ==
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsT0FBTyxFQUNILFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLFdBQVcsRUFDWCxXQUFXLEVBQ1gsTUFBTSxFQUNOLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsYUFBYSxFQUNiLFdBQVcsRUFDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFFSCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDcEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBRUgsU0FBUyxFQUNULFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixhQUFhLEVBQ2IsY0FBYyxFQUNkLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLFlBQVksRUFDWixTQUFTLEVBQ1QsV0FBVyxFQUNYLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLE9BQU8sRUFDUCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osYUFBYSxFQUNiLFlBQVksRUFDWixRQUFRLEVBQ1IsWUFBWSxFQUNaLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsS0FBSyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLFlBQVksRUFDWixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxxQkFBcUIsRUFDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFlBQVksRUFDWixjQUFjLEVBQ2QsTUFBTSxFQUNOLFFBQVEsRUFDUixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsVUFBVSxFQUNiLE1BQU0saUJBQWlCLENBQUM7QUFDekIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixPQUFPLEVBQUUsUUFBUSxFQUFpQixNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBjb3JlXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvYnVpbGQtdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMvY3VycmVuY3ktY29uc3RhbnRzJztcbmV4cG9ydCB7XG4gICAgYXBwZW5kTm9kZSxcbiAgICBpbnNlcnRCZWZvcmUsXG4gICAgaW5zZXJ0QWZ0ZXIsXG4gICAgcmVtb3ZlTm9kZSxcbiAgICByZW1vdmVDbGFzcyxcbiAgICBhZGRDbGFzcyxcbiAgICBzd2l0Y2hDbGFzcyxcbiAgICB0b2dnbGVDbGFzcyxcbiAgICBzZXRDU1MsXG4gICAgc2V0Q1NTRnJvbU9iaixcbiAgICBzZXRQcm9wZXJ0eSxcbiAgICBzZXRBdHRyLFxuICAgIHNldEh0bWwsXG4gICAgcmVtb3ZlQXR0cixcbiAgICBjcmVhdGVFbGVtZW50LFxuICAgIHRvRGltZW5zaW9uXG59IGZyb20gJy4vdXRpbHMvZG9tJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMvZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9ldmVudC1ub3RpZmllcic7XG5leHBvcnQge1xuICAgIFBhcnNlRXhwclJlc3VsdCxcbiAgICAkcGFyc2VFeHByLFxuICAgICRwYXJzZUV2ZW50LFxuICAgIHJlZ2lzdGVyRm5CeUV4cHIsXG4gICAgc2V0UGlwZVByb3ZpZGVyLFxuICAgIGdldEZuQnlFeHByLFxuICAgIGdldEZuRm9yQmluZEV4cHIsXG4gICAgZ2V0Rm5Gb3JFdmVudEV4cHJcbn0gZnJvbSAnLi91dGlscy9leHByZXNzaW9uLXBhcnNlcic7XG5leHBvcnQge1xuICAgIEVWRU5UX0xJRkUsXG4gICAgaXNEZWZpbmVkLFxuICAgIGlzT2JqZWN0LFxuICAgIHRvQm9vbGVhbixcbiAgICBpc0lFLFxuICAgIGlzQW5kcm9pZCxcbiAgICBpc0FuZHJvaWRUYWJsZXQsXG4gICAgaXNJcGhvbmUsXG4gICAgaXNJcG9kLFxuICAgIGlzSXBhZCxcbiAgICBpc0lvcyxcbiAgICBpc1NhZmFyaSxcbiAgICBpc0xhcmdlVGFibGV0TGFuZHNjYXBlLFxuICAgIGlzTGFyZ2VUYWJsZXRQb3J0cmFpdCxcbiAgICBpc01vYmlsZSxcbiAgICBnZXRBbmRyb2lkVmVyc2lvbixcbiAgICBpc0tpdGthdERldmljZSxcbiAgICBlbmNvZGVVcmwsXG4gICAgZW5jb2RlVXJsUGFyYW1zLFxuICAgIGluaXRDYXBzLFxuICAgIHNwYWNlU2VwYXJhdGUsXG4gICAgcmVwbGFjZUF0LFxuICAgIHBlcmlvZFNlcGFyYXRlLFxuICAgIHByZXR0aWZ5TGFiZWwsXG4gICAgZGVIeXBoZW5hdGUsXG4gICAgcHJldHRpZnlMYWJlbHMsXG4gICAgaXNJbnNlY3VyZUNvbnRlbnRSZXF1ZXN0LFxuICAgIHN0cmluZ1N0YXJ0c1dpdGgsXG4gICAgZ2V0RXZhbHVhdGVkRXhwclZhbHVlLFxuICAgIGlzSW1hZ2VGaWxlLFxuICAgIGlzQXVkaW9GaWxlLFxuICAgIGlzVmlkZW9GaWxlLFxuICAgIGlzVmFsaWRJbWFnZVVybCxcbiAgICBpc1ZhbGlkV2ViVVJMLFxuICAgIGdldFJlc291cmNlVVJMLFxuICAgIHRyaWdnZXJGbixcbiAgICBoYXNPZmZzZXRTdHIsXG4gICAgZ2V0Rm9ybWF0dGVkRGF0ZSxcbiAgICBnZXREYXRlT2JqLFxuICAgIGFkZEV2ZW50TGlzdGVuZXJPbkVsZW1lbnQsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIGdldEZpbGVzLFxuICAgIGdlbmVyYXRlR1VJZCxcbiAgICB2YWxpZGF0ZUFjY2Vzc1JvbGVzLFxuICAgIGdldFZhbGlkSlNPTixcbiAgICB4bWxUb0pzb24sXG4gICAgZmluZFZhbHVlT2YsXG4gICAgZXh0cmFjdFR5cGUsXG4gICAgaXNOdW1iZXJUeXBlLFxuICAgIGlzRW1wdHlPYmplY3QsXG4gICAgc2Nyb2xsVG9FbGVtZW50LFxuICAgIGlzRWxlbWVudEluVmlld3BvcnQsXG4gICAgaXNQYWdlYWJsZSxcbiAgICByZXBsYWNlLFxuICAgIGlzRGF0ZVRpbWVUeXBlLFxuICAgIGdldFZhbGlkRGF0ZU9iamVjdCxcbiAgICBnZXROYXRpdmVEYXRlT2JqZWN0LFxuICAgIGdldEJsb2IsXG4gICAgaXNFcXVhbFdpdGhGaWVsZHMsXG4gICAgbG9hZFN0eWxlU2hlZXQsXG4gICAgbG9hZFN0eWxlU2hlZXRzLFxuICAgIGxvYWRTY3JpcHQsXG4gICAgbG9hZFNjcmlwdHMsXG4gICAgX1dNX0FQUF9QUk9KRUNULFxuICAgIHNldFNlc3Npb25TdG9yYWdlSXRlbSxcbiAgICBnZXRTZXNzaW9uU3RvcmFnZUl0ZW0sXG4gICAgbm9vcCxcbiAgICBjb252ZXJ0VG9CbG9iLFxuICAgIEFwcENvbnN0YW50cyxcbiAgICBvcGVuTGluayxcbiAgICBmZXRjaENvbnRlbnQsXG4gICAgdG9Qcm9taXNlLFxuICAgIHJldHJ5SWZGYWlscyxcbiAgICBnZXRBYm9ydGFibGVEZWZlcixcbiAgICBjcmVhdGVDU1NSdWxlLFxuICAgIGdldFVybFBhcmFtcyxcbiAgICBnZXRNb21lbnRMb2NhbGVPYmplY3QsXG4gICAgZ2V0Um91dGVOYW1lRnJvbUxpbmssXG4gICAgaXNBcHBsZVByb2R1Y3QsXG4gICAgZGVmZXIsXG4gICAgZXhlY3V0ZVByb21pc2VDaGFpbixcbiAgICBpc0RhdGFTb3VyY2VFcXVhbCxcbiAgICB2YWxpZGF0ZURhdGFTb3VyY2VDdHgsXG4gICAgcHJvY2Vzc0ZpbHRlckV4cEJpbmROb2RlLFxuICAgIGV4dGVuZFByb3RvLFxuICAgIHJlbW92ZUV4dHJhU2xhc2hlcyxcbiAgICBnZXREaXNwbGF5RGF0ZVRpbWVGb3JtYXQsXG4gICAgYWRkRm9ySWRBdHRyaWJ1dGVzLFxuICAgIGFkanVzdENvbnRhaW5lclBvc2l0aW9uLFxuICAgIGFkanVzdENvbnRhaW5lclJpZ2h0RWRnZXMsXG4gICAgc2V0VHJhbnNsYXRpb24zZFBvc2l0aW9uLFxuICAgIGdldFdlYmtpdFRyYXNsYXRpb25NYXRyaXgsXG4gICAgY2xvc2VQb3BvdmVyLFxuICAgIGRldGVjdENoYW5nZXMsXG4gICAgdHJpZ2dlckl0ZW1BY3Rpb24sXG4gICAgZ2V0RGF0YXNvdXJjZUZyb21FeHByLFxuICAgIGV4dHJhY3RDdXJyZW50SXRlbUV4cHIsXG4gICAgZmluZFJvb3RDb250YWluZXIsXG4gICAgVkFMSURBVE9SLFxuICAgIHRyYW5zZm9ybUZpbGVVUkksXG4gICAgYXBwZW5kU2NyaXB0VG9IZWFkLFxuICAgIGdldEFwcFNldHRpbmcsXG4gICAgc2V0TGlzdENsYXNzLFxuICAgIGZpbmRQYXJlbnQsXG4gICAgZ2V0TmF2Q2xhc3MsXG4gICAgZ2V0U2hlZXRQb3NpdGlvbkNsYXNzXG59IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuZXhwb3J0IHtcbiAgICBGSVJTVF9USU1FX1dBVENILFxuICAgIGlzRmlyc3RUaW1lQ2hhbmdlLFxuICAgIGRlYm91bmNlLFxuICAgIG11dGVXYXRjaGVycyxcbiAgICB1bk11dGVXYXRjaGVycyxcbiAgICAkd2F0Y2gsXG4gICAgJHVud2F0Y2gsXG4gICAgJHVud2F0Y2hBbGwsXG4gICAgJHVud2F0Y2hBbGxCeVNjb3BlLFxuICAgIHNldE5nWm9uZSxcbiAgICBzZXRBcHBSZWYsXG4gICAgaXNDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgcmVzZXRDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgICRhcHBEaWdlc3Rcbn0gZnJvbSAnLi91dGlscy93YXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvaWQtZ2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0IHsgVmlld3BvcnQsIFZpZXdwb3J0RXZlbnQgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jb25zdGFudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXR5cGUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXdpZGdldC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXNlci1jdXN0b20tcGlwZS1tYW5hZ2VyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jdXN0b20taWNvbnMtbG9hZGVyLnNlcnZpY2UnO1xuZXhwb3J0IHsgU3RhdGVQZXJzaXN0ZW5jZSB9IGZyb20gJy4vc2VydmljZXMvc3RhdGUtcGVyc2lzdGVuY2Uuc2VydmljZSc7XG5leHBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcGFnaW5hdGlvbi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvd20tcHJvamVjdC1wcm9wZXJ0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvbHJ1LWNhY2hlJztcbiJdfQ==